emit_x86: Standardize time of DefineValue call

This commit is contained in:
MerryMage 2017-11-27 19:36:30 +00:00
parent 5d72f7048f
commit 30049ca928

View file

@ -540,18 +540,20 @@ void EmitX64::EmitLeastSignificantWord(RegAlloc& reg_alloc, IR::Block&, IR::Inst
} }
void EmitX64::EmitMostSignificantWord(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) { void EmitX64::EmitMostSignificantWord(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) {
auto carry_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp);
auto args = reg_alloc.GetArgumentInfo(inst); auto args = reg_alloc.GetArgumentInfo(inst);
Xbyak::Reg64 result = reg_alloc.UseScratchGpr(args[0]); Xbyak::Reg64 result = reg_alloc.UseScratchGpr(args[0]);
code->shr(result, 32); code->shr(result, 32);
reg_alloc.DefineValue(inst, result);
auto carry_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp);
if (carry_inst) { if (carry_inst) {
EraseInstruction(block, carry_inst); EraseInstruction(block, carry_inst);
Xbyak::Reg64 carry = reg_alloc.ScratchGpr(); Xbyak::Reg64 carry = reg_alloc.ScratchGpr();
code->setc(carry.cvt8()); code->setc(carry.cvt8());
reg_alloc.DefineValue(carry_inst, carry); reg_alloc.DefineValue(carry_inst, carry);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitLeastSignificantHalf(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) { void EmitX64::EmitLeastSignificantHalf(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
@ -985,8 +987,6 @@ void EmitX64::EmitRotateRightExtended(RegAlloc& reg_alloc, IR::Block& block, IR:
code->bt(carry.cvt32(), 0); code->bt(carry.cvt32(), 0);
code->rcr(result, 1); code->rcr(result, 1);
reg_alloc.DefineValue(inst, result);
if (carry_inst) { if (carry_inst) {
EraseInstruction(block, carry_inst); EraseInstruction(block, carry_inst);
@ -994,6 +994,8 @@ void EmitX64::EmitRotateRightExtended(RegAlloc& reg_alloc, IR::Block& block, IR:
reg_alloc.DefineValue(carry_inst, carry); reg_alloc.DefineValue(carry_inst, carry);
} }
reg_alloc.DefineValue(inst, result);
} }
const Xbyak::Reg64 INVALID_REG = Xbyak::Reg64(-1); const Xbyak::Reg64 INVALID_REG = Xbyak::Reg64(-1);
@ -1048,8 +1050,6 @@ void EmitX64::EmitAddWithCarry(RegAlloc& reg_alloc, IR::Block& block, IR::Inst*
} }
} }
reg_alloc.DefineValue(inst, result);
if (carry_inst) { if (carry_inst) {
EraseInstruction(block, carry_inst); EraseInstruction(block, carry_inst);
code->setc(carry); code->setc(carry);
@ -1060,6 +1060,8 @@ void EmitX64::EmitAddWithCarry(RegAlloc& reg_alloc, IR::Block& block, IR::Inst*
code->seto(overflow); code->seto(overflow);
reg_alloc.DefineValue(overflow_inst, overflow); reg_alloc.DefineValue(overflow_inst, overflow);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitAdd64(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) { void EmitX64::EmitAdd64(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
@ -1119,8 +1121,6 @@ void EmitX64::EmitSubWithCarry(RegAlloc& reg_alloc, IR::Block& block, IR::Inst*
} }
} }
reg_alloc.DefineValue(inst, result);
if (carry_inst) { if (carry_inst) {
EraseInstruction(block, carry_inst); EraseInstruction(block, carry_inst);
code->setnc(carry); code->setnc(carry);
@ -1131,6 +1131,8 @@ void EmitX64::EmitSubWithCarry(RegAlloc& reg_alloc, IR::Block& block, IR::Inst*
code->seto(overflow); code->seto(overflow);
reg_alloc.DefineValue(overflow_inst, overflow); reg_alloc.DefineValue(overflow_inst, overflow);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitSub64(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) { void EmitX64::EmitSub64(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
@ -1344,8 +1346,6 @@ void EmitX64::EmitSignedSaturatedAdd(RegAlloc& reg_alloc, IR::Block& block, IR::
code->add(result, addend); code->add(result, addend);
code->cmovo(result, overflow); code->cmovo(result, overflow);
reg_alloc.DefineValue(inst, result);
if (overflow_inst) { if (overflow_inst) {
EraseInstruction(block, overflow_inst); EraseInstruction(block, overflow_inst);
@ -1353,6 +1353,8 @@ void EmitX64::EmitSignedSaturatedAdd(RegAlloc& reg_alloc, IR::Block& block, IR::
reg_alloc.DefineValue(overflow_inst, overflow); reg_alloc.DefineValue(overflow_inst, overflow);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitSignedSaturatedSub(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) { void EmitX64::EmitSignedSaturatedSub(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) {
@ -1371,8 +1373,6 @@ void EmitX64::EmitSignedSaturatedSub(RegAlloc& reg_alloc, IR::Block& block, IR::
code->sub(result, subend); code->sub(result, subend);
code->cmovo(result, overflow); code->cmovo(result, overflow);
reg_alloc.DefineValue(inst, result);
if (overflow_inst) { if (overflow_inst) {
EraseInstruction(block, overflow_inst); EraseInstruction(block, overflow_inst);
@ -1380,6 +1380,8 @@ void EmitX64::EmitSignedSaturatedSub(RegAlloc& reg_alloc, IR::Block& block, IR::
reg_alloc.DefineValue(overflow_inst, overflow); reg_alloc.DefineValue(overflow_inst, overflow);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitUnsignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) { void EmitX64::EmitUnsignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) {
@ -1402,8 +1404,6 @@ void EmitX64::EmitUnsignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::
code->cmovle(result, overflow); code->cmovle(result, overflow);
code->cmovbe(result, reg_a); code->cmovbe(result, reg_a);
reg_alloc.DefineValue(inst, result);
if (overflow_inst) { if (overflow_inst) {
EraseInstruction(block, overflow_inst); EraseInstruction(block, overflow_inst);
@ -1411,6 +1411,8 @@ void EmitX64::EmitUnsignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::
reg_alloc.DefineValue(overflow_inst, overflow); reg_alloc.DefineValue(overflow_inst, overflow);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitSignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) { void EmitX64::EmitSignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) {
@ -1421,11 +1423,11 @@ void EmitX64::EmitSignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::In
ASSERT(N >= 1 && N <= 32); ASSERT(N >= 1 && N <= 32);
if (N == 32) { if (N == 32) {
reg_alloc.DefineValue(inst, args[0]);
if (overflow_inst) { if (overflow_inst) {
auto no_overflow = IR::Value(false); auto no_overflow = IR::Value(false);
overflow_inst->ReplaceUsesWith(no_overflow); overflow_inst->ReplaceUsesWith(no_overflow);
} }
reg_alloc.DefineValue(inst, args[0]);
return; return;
} }
@ -1452,8 +1454,6 @@ void EmitX64::EmitSignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::In
code->cmp(overflow, mask); code->cmp(overflow, mask);
code->cmovbe(result, reg_a); code->cmovbe(result, reg_a);
reg_alloc.DefineValue(inst, result);
if (overflow_inst) { if (overflow_inst) {
EraseInstruction(block, overflow_inst); EraseInstruction(block, overflow_inst);
@ -1461,6 +1461,8 @@ void EmitX64::EmitSignedSaturation(RegAlloc& reg_alloc, IR::Block& block, IR::In
reg_alloc.DefineValue(overflow_inst, overflow); reg_alloc.DefineValue(overflow_inst, overflow);
} }
reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitPackedAddU8(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) { void EmitX64::EmitPackedAddU8(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst) {