r300/compiler: Handle SGT and SLE at the beginning of loops.
authorTom Stellard <tstellar@gmail.com>
Tue, 8 Jun 2010 07:16:38 +0000 (00:16 -0700)
committerMarek Olšák <maraeo@gmail.com>
Fri, 11 Jun 2010 20:06:59 +0000 (22:06 +0200)
src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c

index 28b9684e82d3fa95537d28eaf9859b536139e569..7e1ab5e55ad6a4d03412f617a165fa1ae3bf83fb 100644 (file)
@@ -297,10 +297,12 @@ static int transform_const_loop(struct emulate_loop_state * s,
        /* Remove the first 4 instructions inside the loop, which are part
         * of the conditional and no longer needed.
         */
-       /* SLT/SGE */
+       /* SLT/SGE/SGT/SLE */
        if(loop->BeginLoop->Next->U.I.Opcode != RC_OPCODE_SLT &&
-          loop->BeginLoop->Next->U.I.Opcode != RC_OPCODE_SGE){
-               rc_error(s->C,"Unexpected instruction, expected SLT/SGE\n");
+          loop->BeginLoop->Next->U.I.Opcode != RC_OPCODE_SGE &&
+          loop->BeginLoop->Next->U.I.Opcode != RC_OPCODE_SGT &&
+          loop->BeginLoop->Next->U.I.Opcode != RC_OPCODE_SLE){
+               rc_error(s->C,"Unexpected instruction, expected LT,GT,LE,GE\n");
                return 0;
        }
        /* IF */
@@ -364,6 +366,12 @@ static struct rc_instruction * transform_loop(struct emulate_loop_state * s,
        case RC_OPCODE_SLT:
                ptr->U.I.Opcode = RC_OPCODE_SGE;
                break;
+       case RC_OPCODE_SLE:
+               ptr->U.I.Opcode = RC_OPCODE_SGT;
+               break;
+       case RC_OPCODE_SGT:
+               ptr->U.I.Opcode = RC_OPCODE_SLE;
+               break;
        default:
                rc_error(s->C,
                        "Loop does not start with a conditional instruction.");