* diff'ing..
*/
+ repeat = instr_repeat(instr);
+
if (instr->sync)
printf("(sy)");
if (instr->ss && ((instr->opc_cat <= 4) || (instr->opc_cat == 7)))
printf("(ss)");
if (instr->jmp_tgt)
printf("(jp)");
- if (instr->repeat && (instr->opc_cat <= 4)) {
- printf("(rpt%d)", instr->repeat);
- repeat = instr->repeat;
- } else {
- repeat = 0;
- }
+ if (instr_sat(instr))
+ printf("(sat)");
+ if (repeat)
+ printf("(rpt%d)", repeat);
if (instr->ul && ((2 <= instr->opc_cat) && (instr->opc_cat <= 4)))
printf("(ul)");
/* dword1: */
uint32_t dst : 8;
- uint32_t repeat : 3;
+ uint32_t repeat : 2;
+ uint32_t sat : 1;
uint32_t src1_r : 1;
uint32_t ss : 1;
uint32_t ul : 1; /* dunno */
/* dword1: */
uint32_t dst : 8;
- uint32_t repeat : 3;
+ uint32_t repeat : 2;
+ uint32_t sat : 1;
uint32_t src1_r : 1;
uint32_t ss : 1;
uint32_t ul : 1;
/* dword1: */
uint32_t dst : 8;
- uint32_t repeat : 3;
+ uint32_t repeat : 2;
+ uint32_t sat : 1;
uint32_t src_r : 1;
uint32_t ss : 1;
uint32_t ul : 1;
instr_cat7_t cat7;
struct PACKED {
/* dword0: */
- uint64_t pad1 : 40;
- uint32_t repeat : 3; /* cat0-cat4 */
- uint32_t pad2 : 1;
+ uint32_t pad1 : 32;
+
+ /* dword1: */
+ uint32_t pad2 : 12;
uint32_t ss : 1; /* cat1-cat4 (cat0??) and cat7 (?) */
uint32_t ul : 1; /* cat2-cat4 (and cat1 in blob.. which may be bug??) */
uint32_t pad3 : 13;
};
} instr_t;
+static inline uint32_t instr_repeat(instr_t *instr)
+{
+ switch (instr->opc_cat) {
+ case 0: return instr->cat0.repeat;
+ case 1: return instr->cat1.repeat;
+ case 2: return instr->cat2.repeat;
+ case 3: return instr->cat3.repeat;
+ case 4: return instr->cat4.repeat;
+ default: return 0;
+ }
+}
+
+static inline bool instr_sat(instr_t *instr)
+{
+ switch (instr->opc_cat) {
+ case 2: return instr->cat2.sat;
+ case 3: return instr->cat3.sat;
+ case 4: return instr->cat4.sat;
+ default: return false;
+ }
+}
+
static inline uint32_t instr_opc(instr_t *instr)
{
switch (instr->opc_cat) {
cat2->dst = reg(dst, info, instr->repeat,
IR3_REG_R | IR3_REG_EI | IR3_REG_HALF);
cat2->repeat = instr->repeat;
+ cat2->sat = !!(instr->flags & IR3_INSTR_SAT);
cat2->ss = !!(instr->flags & IR3_INSTR_SS);
cat2->ul = !!(instr->flags & IR3_INSTR_UL);
cat2->dst_half = !!((src1->flags ^ dst->flags) & IR3_REG_HALF);
cat3->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF);
cat3->repeat = instr->repeat;
+ cat3->sat = !!(instr->flags & IR3_INSTR_SAT);
cat3->ss = !!(instr->flags & IR3_INSTR_SS);
cat3->ul = !!(instr->flags & IR3_INSTR_UL);
cat3->dst_half = !!((src_flags ^ dst->flags) & IR3_REG_HALF);
cat4->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF);
cat4->repeat = instr->repeat;
+ cat4->sat = !!(instr->flags & IR3_INSTR_SAT);
cat4->ss = !!(instr->flags & IR3_INSTR_SS);
cat4->ul = !!(instr->flags & IR3_INSTR_UL);
cat4->dst_half = !!((src->flags ^ dst->flags) & IR3_REG_HALF);
IR3_INSTR_S = 0x100,
IR3_INSTR_S2EN = 0x200,
IR3_INSTR_G = 0x400,
+ IR3_INSTR_SAT = 0x800,
/* meta-flags, for intermediate stages of IR, ie.
* before register assignment is done:
*/