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
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

Reply via email to