r300/compiler: Handle SGT and SLE at the beginning of loops.

This commit is contained in:
Tom Stellard 2010-06-08 00:16:38 -07:00 committed by Marek Olšák
parent 0125f5270b
commit f7269cf26a

View 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.");