freedreno/a3xx/compiler: fix RA typo
authorRob Clark <robclark@freedesktop.org>
Sun, 16 Feb 2014 12:41:59 +0000 (07:41 -0500)
committerRob Clark <robclark@freedesktop.org>
Sun, 16 Feb 2014 13:17:23 +0000 (08:17 -0500)
Was supposed to be a '+', otherwise we end up with a negative offset and
choosing registers below the assigned range.

This seems to fix the scheduling mystery "solved" by adding in extra
delay slots.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/ir3_depth.c
src/gallium/drivers/freedreno/a3xx/ir3_ra.c

index 4522578..1715f19 100644 (file)
@@ -69,13 +69,13 @@ int ir3_delayslots(struct ir3_instruction *assigner,
 
        /* assigner must be alu: */
        if (is_flow(consumer) || is_sfu(consumer) || is_tex(consumer)) {
-               return 8;
+               return 6;
        } else if ((consumer->category == 3) &&
                        is_mad(consumer->opc) && (n == 2)) {
                /* special case, 3rd src to cat3 not required on first cycle */
-               return 2;
+               return 1;
        } else {
-               return 5;
+               return 3;
        }
 }
 
index 22c58e6..5bc1e2f 100644 (file)
@@ -306,7 +306,7 @@ static void ra_calc_src_fanin(struct ir3_visitor *v,
 {
        struct ra_calc_visitor *c = ra_calc_visitor(v);
        unsigned srcn = ir3_instr_regno(instr, reg) - 1;
-       c->a.off -= srcn;
+       c->a.off += srcn;
        c->a.num += srcn;
        c->a.num = MAX2(c->a.num, instr->regs_count - 1);
 }