Fixing conditional branch logic.
This commit is contained in:
parent
2ab01af0bd
commit
1e67547a6b
|
@ -54,9 +54,11 @@ int XeEmitIndirectBranchTo(
|
||||||
if (!lk && reg == kXEPPCRegLR) {
|
if (!lk && reg == kXEPPCRegLR) {
|
||||||
// The return block will spill registers for us.
|
// The return block will spill registers for us.
|
||||||
// TODO(benvanik): 'lr_mismatch' debug info.
|
// TODO(benvanik): 'lr_mismatch' debug info.
|
||||||
c.test(target, c.getGpArg(1));
|
// Note: we need to test on *only* the 32-bit target, as the target ptr may
|
||||||
|
// have garbage in the upper 32 bits.
|
||||||
|
c.test(target.r32(), c.getGpArg(1).r32());
|
||||||
// TODO(benvanik): evaluate hint here.
|
// TODO(benvanik): evaluate hint here.
|
||||||
c.je(e.GetReturnLabel(), kCondHintLikely);
|
c.jnz(e.GetReturnLabel(), kCondHintLikely);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defer to the generator, which will do fancy things.
|
// Defer to the generator, which will do fancy things.
|
||||||
|
@ -227,9 +229,9 @@ XEEMITTER(bcx, 0x40000000, B )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
c.test(ctr, imm(0));
|
c.test(ctr, imm(0));
|
||||||
ctr_ok = c.newGpVar();
|
ctr_ok = c.newGpVar();
|
||||||
if (XESELECTBITS(i.B.BO, 1, 1)) {
|
if (XESELECTBITS(i.B.BO, 1, 1)) {
|
||||||
c.sete(ctr_ok);
|
c.setz(ctr_ok);
|
||||||
} else {
|
} else {
|
||||||
c.setne(ctr_ok);
|
c.setnz(ctr_ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,9 +245,9 @@ XEEMITTER(bcx, 0x40000000, B )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
c.test(cr, imm(0));
|
c.test(cr, imm(0));
|
||||||
cond_ok = c.newGpVar();
|
cond_ok = c.newGpVar();
|
||||||
if (XESELECTBITS(i.XL.BO, 3, 3)) {
|
if (XESELECTBITS(i.XL.BO, 3, 3)) {
|
||||||
c.setne(cond_ok);
|
c.setnz(cond_ok);
|
||||||
} else {
|
} else {
|
||||||
c.sete(cond_ok);
|
c.setz(cond_ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,9 +302,9 @@ XEEMITTER(bcctrx, 0x4C000420, XL )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
c.test(cr, imm(0));
|
c.test(cr, imm(0));
|
||||||
cond_ok = c.newGpVar();
|
cond_ok = c.newGpVar();
|
||||||
if (XESELECTBITS(i.XL.BO, 3, 3)) {
|
if (XESELECTBITS(i.XL.BO, 3, 3)) {
|
||||||
c.setne(cond_ok);
|
c.setnz(cond_ok);
|
||||||
} else {
|
} else {
|
||||||
c.sete(cond_ok);
|
c.setz(cond_ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,9 +355,9 @@ XEEMITTER(bclrx, 0x4C000020, XL )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
c.test(ctr, imm(0));
|
c.test(ctr, imm(0));
|
||||||
ctr_ok = c.newGpVar();
|
ctr_ok = c.newGpVar();
|
||||||
if (XESELECTBITS(i.XL.BO, 1, 1)) {
|
if (XESELECTBITS(i.XL.BO, 1, 1)) {
|
||||||
c.sete(ctr_ok);
|
c.setz(ctr_ok);
|
||||||
} else {
|
} else {
|
||||||
c.setne(ctr_ok);
|
c.setnz(ctr_ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,9 +371,9 @@ XEEMITTER(bclrx, 0x4C000020, XL )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
c.test(cr, imm(0));
|
c.test(cr, imm(0));
|
||||||
cond_ok = c.newGpVar();
|
cond_ok = c.newGpVar();
|
||||||
if (XESELECTBITS(i.XL.BO, 3, 3)) {
|
if (XESELECTBITS(i.XL.BO, 3, 3)) {
|
||||||
c.setne(cond_ok);
|
c.setnz(cond_ok);
|
||||||
} else {
|
} else {
|
||||||
c.sete(cond_ok);
|
c.setz(cond_ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue