mirror of https://github.com/inolen/redream.git
move select condition out of arg0 to optimize register allocation when select is true
This commit is contained in:
parent
05388bca6f
commit
8069a76100
|
@ -906,13 +906,19 @@ EMITTER(FTRUNC) {
|
||||||
|
|
||||||
EMITTER(SELECT) {
|
EMITTER(SELECT) {
|
||||||
const Xbyak::Reg result = e.GetRegister(instr);
|
const Xbyak::Reg result = e.GetRegister(instr);
|
||||||
const Xbyak::Reg cond = e.GetRegister(instr->arg0());
|
const Xbyak::Reg a = e.GetRegister(instr->arg0());
|
||||||
const Xbyak::Reg a = e.GetRegister(instr->arg1());
|
const Xbyak::Reg b = e.GetRegister(instr->arg1());
|
||||||
const Xbyak::Reg b = e.GetRegister(instr->arg2());
|
const Xbyak::Reg cond = e.GetRegister(instr->arg2());
|
||||||
|
|
||||||
|
// convert result to Reg32e to please xbyak
|
||||||
|
CHECK_GE(result.getBit(), 32);
|
||||||
|
Xbyak::Reg32e result_32e(result.getIdx(), result.getBit());
|
||||||
|
|
||||||
e.test(cond, cond);
|
e.test(cond, cond);
|
||||||
e.cmovnz(result.cvt32(), a);
|
if (result_32e != a) {
|
||||||
e.cmovz(result.cvt32(), b);
|
e.cmovnz(result_32e, a);
|
||||||
|
}
|
||||||
|
e.cmovz(result_32e, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
EMITTER(CMP) {
|
EMITTER(CMP) {
|
||||||
|
|
|
@ -217,16 +217,12 @@ Instr *IRBuilder::FTrunc(Value *v, ValueType dest_type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Instr *IRBuilder::Select(Value *cond, Value *t, Value *f) {
|
Instr *IRBuilder::Select(Value *cond, Value *t, Value *f) {
|
||||||
CHECK_EQ(t->type(), f->type());
|
CHECK(IsIntType(cond->type()) && IsIntType(t->type()) && t->type() == f->type());
|
||||||
|
|
||||||
if (cond->type() != VALUE_I8) {
|
|
||||||
cond = CmpNE(cond, AllocConstant(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
Instr *instr = AppendInstr(OP_SELECT, t->type());
|
Instr *instr = AppendInstr(OP_SELECT, t->type());
|
||||||
instr->set_arg0(cond);
|
instr->set_arg0(t);
|
||||||
instr->set_arg1(t);
|
instr->set_arg1(f);
|
||||||
instr->set_arg2(f);
|
instr->set_arg2(cond);
|
||||||
return instr;
|
return instr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue