tgis: fix SOA aliasing for MUL instruction in SSE codegen
authorBrian Paul <brianp@vmware.com>
Fri, 7 May 2010 16:40:55 +0000 (10:40 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 7 May 2010 16:40:59 +0000 (10:40 -0600)
Part of a fix for piglit trinity-fp1 test failure.

src/gallium/auxiliary/tgsi/tgsi_sse2.c

index 01b4a960129c1ff83c9eed3b1e79da745b5fb286..d5061f8b511eeb296d487cf16f12b81a33e34ab7 100644 (file)
@@ -1929,11 +1929,17 @@ emit_instruction(
       break;
 
    case TGSI_OPCODE_MUL:
+      /* do all fetches and adds, storing results in temp regs */
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
-         FETCH( func, *inst, 0, 0, chan_index );
-         FETCH( func, *inst, 1, 1, chan_index );
-         emit_mul( func, 0, 1 );
-         STORE( func, *inst, 0, 0, chan_index );
+         int r = chan_index + 1;
+         FETCH( func, *inst, 0, 0, chan_index ); /* load xmm[0] */
+         FETCH( func, *inst, r, 1, chan_index ); /* load xmm[r] */
+         emit_mul( func, r, 0 );   /* xmm[r] = xmm[r] * xmm[0] */
+      }
+      /* do all stores of the temp regs */
+      FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
+         int r = chan_index + 1;
+         STORE( func, *inst, r, 0, chan_index ); /* store xmm[r] */
       }
       break;
 
@@ -2833,6 +2839,7 @@ check_soa_dependencies(const struct tgsi_full_instruction *inst)
    switch (inst->Instruction.Opcode) {
    case TGSI_OPCODE_ADD:
    case TGSI_OPCODE_MOV:
+   case TGSI_OPCODE_MUL:
    case TGSI_OPCODE_XPD:
       /* OK - these opcodes correctly handle SOA dependencies */
       break;