From 12d74d6ba1b4dff0ebef68edf09a6f560eae3a65 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 7 May 2010 10:40:55 -0600 Subject: tgis: fix SOA aliasing for MUL instruction in SSE codegen Part of a fix for piglit trinity-fp1 test failure. --- src/gallium/auxiliary/tgsi/tgsi_sse2.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src/gallium/auxiliary') diff --git a/src/gallium/auxiliary/tgsi/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/tgsi_sse2.c index 01b4a96012..d5061f8b51 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_sse2.c +++ b/src/gallium/auxiliary/tgsi/tgsi_sse2.c @@ -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; -- cgit v1.2.3