On Tue, Aug 05, 2014 at 07:06:51PM +0200, David Heidelberger wrote: > 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 > > Signed-off-by: David Heidelberger <david.heidelber...@ixit.cz>
I've pushed this, thanks! -Tom > --- > .../drivers/r300/compiler/radeon_emulate_loops.c | 34 > +++++++++++++++------- > 1 file 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 91ed9d2..25512b3 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; > -- > 2.0.0 > 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 > > Signed-off-by: David Heidelberger <david.heidelber...@ixit.cz> > --- > .../drivers/r300/compiler/radeon_emulate_loops.c | 34 > +++++++++++++++------- > 1 file 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 91ed9d2..25512b3 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; > -- > 2.0.0 > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev