nv50: don't permanently negate src in emit_ddy
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 26 Nov 2009 16:03:00 +0000 (17:03 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 29 Nov 2009 12:41:47 +0000 (13:41 +0100)
src/gallium/drivers/nv50/nv50_program.c

index 855079f2939cbb0c32797da1839ed914050ae059..f93c864c2a2c574cf45035112c4623aba4882990 100644 (file)
@@ -1440,19 +1440,25 @@ emit_ddx(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src)
 static void
 emit_ddy(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src)
 {
+       struct nv50_reg *r = src;
        struct nv50_program_exec *e = exec(pc);
 
        assert(src->type == P_TEMP);
 
-       if (!(src->mod & NV50_MOD_NEG)) /* ! double negation */
-               emit_neg(pc, src, src);
+       if (!(src->mod & NV50_MOD_NEG)) { /* ! double negation */
+               r = alloc_temp(pc, NULL);
+               emit_neg(pc, r, src);
+       }
 
        e->inst[0] = 0xc0150000;
        e->inst[1] = 0x8a400000;
        set_long(pc, e);
        set_dst(pc, dst, e);
-       set_src_0(pc, src, e);
-       set_src_2(pc, src, e);
+       set_src_0(pc, r, e);
+       set_src_2(pc, r, e);
+
+       if (r != src)
+               free_temp(pc, r);
 
        emit(pc, e);
 }