draw: Reuse xmm registers.
authorKeith Whitwell <keithw@vmware.com>
Tue, 17 Feb 2009 21:45:54 +0000 (21:45 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 17 Feb 2009 21:45:54 +0000 (21:45 +0000)
src/gallium/auxiliary/draw/draw_vs_aos.c

index 6141ba9cbf70b015a3d1bee7b7b04a4681004c20..875ecb92db5cec4748e7fa65aa637833f777d007 100644 (file)
@@ -284,6 +284,15 @@ void aos_release_xmm_reg( struct aos_compilation *cp,
 }
 
 
+static void aos_soft_release_xmm( struct aos_compilation *cp,
+                                  struct x86_reg reg )
+{
+   if (reg.file == file_XMM) {
+      assert(cp->xmm[reg.idx].last_used == cp->insn_counter);
+      cp->xmm[reg.idx].last_used = cp->insn_counter - 1;
+   }
+}
+
 
      
 /* Mark an xmm reg as holding the current copy of a shader reg.
@@ -584,10 +593,12 @@ static struct x86_reg fetch_src( struct aos_compilation *cp,
          sse_mulps(cp->func, dst, tmp);
 
          aos_release_xmm_reg(cp, tmp.idx);
+         aos_soft_release_xmm(cp, imm_swz);
       }
       else if (negs) {
          struct x86_reg imm_negs = aos_get_internal_xmm(cp, IMM_NEGS);
          sse_mulps(cp->func, dst, imm_negs);
+         aos_soft_release_xmm(cp, imm_negs);
       }
 
 
@@ -603,8 +614,10 @@ static struct x86_reg fetch_src( struct aos_compilation *cp,
          sse_maxps(cp->func, dst, tmp);
 
          aos_release_xmm_reg(cp, tmp.idx);
+         aos_soft_release_xmm(cp, neg);
       }
 
+      aos_soft_release_xmm(cp, arg0);
       return dst;
    }