aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
diff options
context:
space:
mode:
authorTom Stellard <[email protected]>2014-08-13 14:37:03 -0400
committerTom Stellard <[email protected]>2014-08-13 14:37:03 -0400
commit866dae85c826065f5628c14eecab3873045fbbf9 (patch)
tree78612731b6a4f983c51740608a424f103eb00c71 /src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
parented3f7eadad1527447df14ee0c33fdf75fcad47b1 (diff)
r300g: Fix bug in build_loop_info()/compiler v2
Fixes piglit glean "do-loop with continue and break" on RS690 It's based on Tom Stellard patch and improved to handle CMP instruction. [v2] handle CMP instruction Reviewed-by: Tom Stellard <[email protected]> Signed-off-by: David Heidelberger <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r300/compiler/radeon_emulate_loops.c')
-rw-r--r--src/gallium/drivers/r300/compiler/radeon_emulate_loops.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c b/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
index 91ed9d2615d..e7b69c875c6 100644
--- a/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
+++ b/src/gallium/drivers/r300/compiler/radeon_emulate_loops.c
@@ -368,6 +368,8 @@ static int build_loop_info(struct radeon_compiler * c, struct loop_info * loop,
break;
}
case RC_OPCODE_BRK:
+ {
+ struct rc_src_register *src;
if(ptr->Next->U.I.Opcode != RC_OPCODE_ENDIF
|| ptr->Prev->U.I.Opcode != RC_OPCODE_IF
|| loop->Brk){
@@ -376,20 +378,30 @@ static int build_loop_info(struct radeon_compiler * c, struct loop_info * loop,
loop->Brk = ptr;
loop->If = ptr->Prev;
loop->EndIf = ptr->Next;
- switch(loop->If->Prev->U.I.Opcode){
- case RC_OPCODE_SLT:
- case RC_OPCODE_SGE:
- case RC_OPCODE_SGT:
- case RC_OPCODE_SLE:
- case RC_OPCODE_SEQ:
- case RC_OPCODE_SNE:
- break;
- default:
+ src = &loop->If->U.I.SrcReg[0];
+
+ for (loop->Cond = loop->If->Prev;
+ loop->Cond->U.I.Opcode != RC_OPCODE_BGNLOOP;
+ loop->Cond = loop->Cond->Prev) {
+
+ const struct rc_dst_register *dst = &loop->Cond->U.I.DstReg;
+ if (dst->File == src->File &&
+ dst->Index == src->Index &&
+ dst->WriteMask & (rc_swizzle_to_writemask(src->Swizzle))) {
+ if (loop->Cond->U.I.Opcode == RC_OPCODE_CMP) {
+ src = &loop->Cond->U.I.SrcReg[0];
+ continue;
+ }
+ break;
+ }
+ }
+
+ if (loop->Cond->U.I.Opcode == RC_OPCODE_BGNLOOP) {
+ rc_error(c, "%s: Cannot find condition for if\n", __FUNCTION__);
return 0;
}
- loop->Cond = loop->If->Prev;
break;
-
+ }
case RC_OPCODE_ENDLOOP:
loop->EndLoop = ptr;
break;