mesa: adjust OPCODE_IF/ELSE BranchTarget fields to point to ELSE/ENDIF instr.

This is a little more logical.  Suggested in bug report 25654.
This commit is contained in:
Brian Paul
2009-12-22 14:21:07 -07:00
parent db721151b7
commit ddd9729bc3
3 changed files with 27 additions and 9 deletions
+2 -2
View File
@@ -5717,11 +5717,11 @@ GLboolean AssembleInstr(GLuint uiFirstInst,
return GL_FALSE;
break;
case OPCODE_IF :
case OPCODE_IF:
{
GLboolean bHasElse = GL_FALSE;
if(pILInst[pILInst[i].BranchTarget - 1].Opcode == OPCODE_ELSE)
if(pILInst[pILInst[i].BranchTarget].Opcode == OPCODE_ELSE)
{
bHasElse = GL_TRUE;
}
+8 -2
View File
@@ -910,6 +910,10 @@ _mesa_execute_program(GLcontext * ctx,
case OPCODE_IF:
{
GLboolean cond;
ASSERT(program->Instructions[inst->BranchTarget].Opcode
== OPCODE_ELSE ||
program->Instructions[inst->BranchTarget].Opcode
== OPCODE_ENDIF);
/* eval condition */
if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
GLfloat a[4];
@@ -929,14 +933,16 @@ _mesa_execute_program(GLcontext * ctx,
else {
/* go to the instruction after ELSE or ENDIF */
assert(inst->BranchTarget >= 0);
pc = inst->BranchTarget - 1;
pc = inst->BranchTarget;
}
}
break;
case OPCODE_ELSE:
/* goto ENDIF */
ASSERT(program->Instructions[inst->BranchTarget].Opcode
== OPCODE_ENDIF);
assert(inst->BranchTarget >= 0);
pc = inst->BranchTarget - 1;
pc = inst->BranchTarget;
break;
case OPCODE_ENDIF:
/* nothing */
+17 -5
View File
@@ -1728,6 +1728,7 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
if (!inst) {
return NULL;
}
prog->Instructions[ifInstLoc].BranchTarget = prog->NumInstructions - 1;
}
else {
/* jump to endif instruction */
@@ -1737,8 +1738,8 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
}
inst_comment(inst, "else");
inst->DstReg.CondMask = COND_TR; /* always branch */
prog->Instructions[ifInstLoc].BranchTarget = prog->NumInstructions;
}
prog->Instructions[ifInstLoc].BranchTarget = prog->NumInstructions;
emit(emitInfo, n->Children[2]);
}
else {
@@ -1753,8 +1754,14 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
}
}
if (n->Children[2]) {
prog->Instructions[elseInstLoc].BranchTarget = prog->NumInstructions;
if (elseInstLoc) {
/* point ELSE instruction BranchTarget at ENDIF */
if (emitInfo->EmitHighLevelInstructions) {
prog->Instructions[elseInstLoc].BranchTarget = prog->NumInstructions - 1;
}
else {
prog->Instructions[elseInstLoc].BranchTarget = prog->NumInstructions;
}
}
return NULL;
}
@@ -1824,7 +1831,12 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
assert(inst->Opcode == OPCODE_BRK ||
inst->Opcode == OPCODE_BRA);
/* go to instruction at end of loop */
inst->BranchTarget = endInstLoc;
if (emitInfo->EmitHighLevelInstructions) {
inst->BranchTarget = endInstLoc;
}
else {
inst->BranchTarget = endInstLoc + 1;
}
}
else {
assert(ir->Opcode == IR_CONT ||
@@ -1942,7 +1954,7 @@ emit_cont_break_if_true(slang_emit_info *emitInfo, slang_ir_node *n)
}
emitInfo->prog->Instructions[ifInstLoc].BranchTarget
= emitInfo->prog->NumInstructions;
= emitInfo->prog->NumInstructions - 1;
return inst;
}
}