diff options
author | Tom Stellard <[email protected]> | 2014-08-13 14:37:03 -0400 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2014-08-13 14:37:03 -0400 |
commit | 866dae85c826065f5628c14eecab3873045fbbf9 (patch) | |
tree | 78612731b6a4f983c51740608a424f103eb00c71 /src/gallium | |
parent | ed3f7eadad1527447df14ee0c33fdf75fcad47b1 (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')
-rw-r--r-- | src/gallium/drivers/r300/compiler/radeon_emulate_loops.c | 34 |
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; |