freedreno/ir3: split out regmask
[mesa.git] / src / freedreno / ir3 / disasm-a3xx.c
index 6dd3da04924ba952737ef2c20c9e72b86371bb0c..d6a1c15e09cee1e0657ead8b55512c82f3a48efa 100644 (file)
@@ -147,6 +147,13 @@ static void print_reg(struct disasm_ctx *ctx, reg_t reg, bool full,
                fprintf(ctx->out, "p0.%c", component[reg.comp]);
        } else {
                fprintf(ctx->out, "%s%c%d.%c", full ? "" : "h", type, reg.num, component[reg.comp]);
+               if (0 && full && !c) {
+                       reg_t hr0 = reg;
+                       hr0.iim_val *= 2;
+                       reg_t hr1 = hr0;
+                       hr1.iim_val += 1;
+                       fprintf(ctx->out, " (hr%d.%c,hr%d.%c)", hr0.num, component[hr0.comp], hr1.num, component[hr1.comp]);
+               }
        }
 }
 
@@ -674,7 +681,7 @@ static void print_instr_cat6_a3xx(struct disasm_ctx *ctx, instr_t *instr)
        char sd = 0, ss = 0;  /* dst/src address space */
        bool nodst = false;
        struct reginfo dst, src1, src2, ssbo;
-       int src1off = 0, dstoff = 0;
+       int src1off = 0;
 
        memset(&dst, 0, sizeof(dst));
        memset(&src1, 0, sizeof(src1));
@@ -929,12 +936,6 @@ static void print_instr_cat6_a3xx(struct disasm_ctx *ctx, instr_t *instr)
 
                return;
        }
-       if (cat6->dst_off) {
-               dst.reg = (reg_t)(cat6->c.dst);
-               dstoff  = cat6->c.off;
-       } else {
-               dst.reg = (reg_t)(cat6->d.dst);
-       }
 
        if (cat6->src_off) {
                src1.reg = (reg_t)(cat6->a.src1);
@@ -953,15 +954,23 @@ static void print_instr_cat6_a3xx(struct disasm_ctx *ctx, instr_t *instr)
                if (sd)
                        fprintf(ctx->out, "%c[", sd);
                /* note: dst might actually be a src (ie. address to store to) */
-               print_src(ctx, &dst);
-               if (cat6->dst_off && cat6->g) {
-                       struct reginfo dstoff_reg = {0};
-                       dstoff_reg.reg = (reg_t) cat6->c.off;
-                       dstoff_reg.full  = true;
-                       fprintf(ctx->out, "+");
-                       print_src(ctx, &dstoff_reg);
-               } else if (dstoff)
-                       fprintf(ctx->out, "%+d", dstoff);
+               if (cat6->dst_off) {
+                       dst.reg = (reg_t)(cat6->c.dst);
+                       print_src(ctx, &dst);
+                       if (cat6->g) {
+                               struct reginfo dstoff_reg = {
+                                       .reg = (reg_t) cat6->c.off,
+                                       .full  = true
+                               };
+                               fprintf(ctx->out, "+");
+                               print_src(ctx, &dstoff_reg);
+                       } else if (cat6->c.off || cat6->c.off_high) {
+                               fprintf(ctx->out, "%+d", ((uint32_t)cat6->c.off_high << 8) | cat6->c.off);
+                       }
+               } else {
+                       dst.reg = (reg_t)(cat6->d.dst);
+                       print_src(ctx, &dst);
+               }
                if (sd)
                        fprintf(ctx->out, "]");
                fprintf(ctx->out, ", ");
@@ -1255,6 +1264,9 @@ static const struct opc_info {
        OPC(5, OPC_DSYPP_1,      dsypp.1),
        OPC(5, OPC_RGETPOS,      rgetpos),
        OPC(5, OPC_RGETINFO,     rgetinfo),
+       /* macros are needed here for ir3_print */
+       OPC(5, OPC_DSXPP_MACRO,  dsxpp.macro),
+       OPC(5, OPC_DSYPP_MACRO,  dsypp.macro),
 
 
        /* category 6: */