summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2010-09-16 19:02:42 -0600
committerVinson Lee <[email protected]>2010-09-17 10:51:50 -0700
commit83917660f1323bd8a50e8ba6ed2ff33d36880371 (patch)
tree949c87515736caec963d6ac5b7cf2a22c1f436e8
parent69f67f5ded6963ca83f8601f218f6dabf8bfbba5 (diff)
tgsi/sse: fix aos_to_soa() loop to handle num_inputs==0
Basically, change the loop from: do {...} while (--num_inputs != 0) into: while (num_inputs != 0) { ... --num_inputs; } Fixes fd.o bug 29987. (cherry picked from commit 4b27c614cf4b06ad0c2a0414f60737f19eed021d)
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_sse2.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/tgsi_sse2.c
index 785a9fb0356..13e2e8eb995 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_sse2.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_sse2.c
@@ -2703,8 +2703,7 @@ static void aos_to_soa( struct x86_function *func,
struct x86_reg aos_input = x86_make_reg( file_REG32, reg_BX );
struct x86_reg num_inputs = x86_make_reg( file_REG32, reg_CX );
struct x86_reg stride = x86_make_reg( file_REG32, reg_DX );
- int inner_loop;
-
+ int loop_top, loop_exit_fixup;
/* Save EBX */
x86_push( func, x86_make_reg( file_REG32, reg_BX ) );
@@ -2717,8 +2716,11 @@ static void aos_to_soa( struct x86_function *func,
x86_mov( func, num_inputs, x86_fn_arg( func, arg_num ) );
x86_mov( func, stride, x86_fn_arg( func, arg_stride ) );
- /* do */
- inner_loop = x86_get_label( func );
+ /* while (num_inputs != 0) */
+ loop_top = x86_get_label( func );
+ x86_cmp_imm( func, num_inputs, 0 );
+ loop_exit_fixup = x86_jcc_forward( func, cc_E );
+
{
x86_push( func, aos_input );
sse_movlps( func, make_xmm( 0 ), x86_make_disp( aos_input, 0 ) );
@@ -2750,9 +2752,10 @@ static void aos_to_soa( struct x86_function *func,
x86_lea( func, aos_input, x86_make_disp(aos_input, 16) );
x86_lea( func, soa_input, x86_make_disp(soa_input, 64) );
}
- /* while --num_inputs */
+ /* --num_inputs */
x86_dec( func, num_inputs );
- x86_jcc( func, cc_NE, inner_loop );
+ x86_jmp( func, loop_top );
+ x86_fixup_fwd_jump( func, loop_exit_fixup );
/* Restore EBX */
x86_pop( func, x86_make_reg( file_REG32, reg_BX ) );