summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2010-07-12 13:14:38 -0700
committerTom Stellard <tstellar@gmail.com>2010-08-03 19:11:08 -0700
commit680f486ffd4aab8b9354f1b5a035b3881ac2310c (patch)
treed4fb5b993d6141c2a5fcd83cc03d7278cb010c3b /src
parenta3ff6c269729597dd1318df2a10fb2a7dba093d6 (diff)
r300/compiler: Don't unroll loops with continue or break.
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
index 131e9e7436..fed4d8829a 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
@@ -191,7 +191,7 @@ static void get_incr_amount(void * data, struct rc_instruction * inst,
static int transform_const_loop(struct emulate_loop_state * s,
struct loop_info * loop)
{
- int end_loops = 1;
+ int end_loops;
int iterations;
struct count_inst count_inst;
float limit_value;
@@ -235,6 +235,7 @@ static int transform_const_loop(struct emulate_loop_state * s,
count_inst.Swz = counter->Swizzle;
count_inst.Amount = 0.0f;
count_inst.Unknown = 0;
+ end_loops = 1;
for(inst = loop->BeginLoop->Next; end_loops > 0; inst = inst->Next){
switch(inst->U.I.Opcode){
/* XXX In the future we might want to try to unroll nested
@@ -246,6 +247,16 @@ static int transform_const_loop(struct emulate_loop_state * s,
loop->EndLoop = inst;
end_loops--;
break;
+ case RC_OPCODE_BRK:
+ /* Don't unroll loops if it has a BRK instruction
+ * other one used when testing the main conditional
+ * of the loop. */
+
+ /* Make sure we haven't entered a nested loops. */
+ if(inst != loop->Brk && end_loops == 1) {
+ return 0;
+ }
+ break;
/* XXX Check if the counter is modified within an if statement.
*/
case RC_OPCODE_IF: