Mesa (master): tgis: fix SOA aliasing for MUL instruction in SSE codegen
Brian Paul
brianp at kemper.freedesktop.org
Fri May 7 20:32:05 UTC 2010
Module: Mesa
Branch: master
Commit: 12d74d6ba1b4dff0ebef68edf09a6f560eae3a65
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=12d74d6ba1b4dff0ebef68edf09a6f560eae3a65
Author: Brian Paul <brianp at vmware.com>
Date: Fri May 7 10:40:55 2010 -0600
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 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/gallium/auxiliary/tgsi/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/tgsi_sse2.c
index 01b4a96..d5061f8 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;
More information about the mesa-commit
mailing list