MUL/MUL_HI/DIV
This commit is contained in:
parent
ebaf8aa16d
commit
f55fb17e1b
|
@ -1592,20 +1592,110 @@ void alloy::backend::x64::lowering::RegisterSequences(LoweringTable* table) {
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#define LIKE_REG(dest, like) Operand(dest.getIdx(), dest.getKind(), like.getBit(), false)
|
||||||
|
|
||||||
table->AddSequence(OPCODE_MUL, [](X64Emitter& e, Instr*& i) {
|
table->AddSequence(OPCODE_MUL, [](X64Emitter& e, Instr*& i) {
|
||||||
UNIMPLEMENTED_SEQ();
|
BinaryOp(
|
||||||
|
e, i,
|
||||||
|
[](X64Emitter& e, Instr& i, const Reg& dest_src, const Operand& src) {
|
||||||
|
// RAX = value, RDX = clobbered
|
||||||
|
// TODO(benvanik): make the register allocator put dest_src in RAX?
|
||||||
|
e.db(0xCC);
|
||||||
|
auto Nax = LIKE_REG(e.rax, dest_src);
|
||||||
|
e.mov(Nax, dest_src);
|
||||||
|
if (i.flags & ARITHMETIC_UNSIGNED) {
|
||||||
|
e.mul(src);
|
||||||
|
} else {
|
||||||
|
e.imul(src);
|
||||||
|
}
|
||||||
|
e.mov(dest_src, Nax);
|
||||||
|
},
|
||||||
|
[](X64Emitter& e, Instr& i, const Reg& dest_src, uint32_t src) {
|
||||||
|
// RAX = value, RDX = clobbered
|
||||||
|
// TODO(benvanik): make the register allocator put dest_src in RAX?
|
||||||
|
auto Nax = LIKE_REG(e.rax, dest_src);
|
||||||
|
auto Ndx = LIKE_REG(e.rdx, dest_src);
|
||||||
|
e.db(0xCC);
|
||||||
|
e.mov(Nax, dest_src);
|
||||||
|
e.mov(Ndx, src);
|
||||||
|
if (i.flags & ARITHMETIC_UNSIGNED) {
|
||||||
|
e.mul(Ndx);
|
||||||
|
} else {
|
||||||
|
e.imul(Ndx);
|
||||||
|
}
|
||||||
|
e.mov(dest_src, Nax);
|
||||||
|
});
|
||||||
i = e.Advance(i);
|
i = e.Advance(i);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
table->AddSequence(OPCODE_MUL_HI, [](X64Emitter& e, Instr*& i) {
|
table->AddSequence(OPCODE_MUL_HI, [](X64Emitter& e, Instr*& i) {
|
||||||
UNIMPLEMENTED_SEQ();
|
BinaryOp(
|
||||||
|
e, i,
|
||||||
|
[](X64Emitter& e, Instr& i, const Reg& dest_src, const Operand& src) {
|
||||||
|
// RAX = value, RDX = clobbered
|
||||||
|
// TODO(benvanik): make the register allocator put dest_src in RAX?
|
||||||
|
e.db(0xCC);
|
||||||
|
auto Nax = LIKE_REG(e.rax, dest_src);
|
||||||
|
auto Ndx = LIKE_REG(e.rdx, dest_src);
|
||||||
|
e.mov(Nax, dest_src);
|
||||||
|
if (i.flags & ARITHMETIC_UNSIGNED) {
|
||||||
|
e.mul(src);
|
||||||
|
} else {
|
||||||
|
e.imul(src);
|
||||||
|
}
|
||||||
|
e.mov(dest_src, Ndx);
|
||||||
|
},
|
||||||
|
[](X64Emitter& e, Instr& i, const Reg& dest_src, uint32_t src) {
|
||||||
|
// RAX = value, RDX = clobbered
|
||||||
|
// TODO(benvanik): make the register allocator put dest_src in RAX?
|
||||||
|
auto Nax = LIKE_REG(e.rax, dest_src);
|
||||||
|
auto Ndx = LIKE_REG(e.rdx, dest_src);
|
||||||
|
e.db(0xCC);
|
||||||
|
e.mov(Nax, dest_src);
|
||||||
|
e.mov(Ndx, src);
|
||||||
|
if (i.flags & ARITHMETIC_UNSIGNED) {
|
||||||
|
e.mul(Ndx);
|
||||||
|
} else {
|
||||||
|
e.imul(Ndx);
|
||||||
|
}
|
||||||
|
e.mov(dest_src, Ndx);
|
||||||
|
});
|
||||||
i = e.Advance(i);
|
i = e.Advance(i);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
table->AddSequence(OPCODE_DIV, [](X64Emitter& e, Instr*& i) {
|
table->AddSequence(OPCODE_DIV, [](X64Emitter& e, Instr*& i) {
|
||||||
UNIMPLEMENTED_SEQ();
|
BinaryOp(
|
||||||
|
e, i,
|
||||||
|
[](X64Emitter& e, Instr& i, const Reg& dest_src, const Operand& src) {
|
||||||
|
// RAX = value, RDX = clobbered
|
||||||
|
// TODO(benvanik): make the register allocator put dest_src in RAX?
|
||||||
|
e.db(0xCC);
|
||||||
|
auto Nax = LIKE_REG(e.rax, dest_src);
|
||||||
|
e.mov(Nax, dest_src);
|
||||||
|
if (i.flags & ARITHMETIC_UNSIGNED) {
|
||||||
|
e.div(src);
|
||||||
|
} else {
|
||||||
|
e.idiv(src);
|
||||||
|
}
|
||||||
|
e.mov(dest_src, Nax);
|
||||||
|
},
|
||||||
|
[](X64Emitter& e, Instr& i, const Reg& dest_src, uint32_t src) {
|
||||||
|
// RAX = value, RDX = clobbered
|
||||||
|
// TODO(benvanik): make the register allocator put dest_src in RAX?
|
||||||
|
auto Nax = LIKE_REG(e.rax, dest_src);
|
||||||
|
auto Ndx = LIKE_REG(e.rdx, dest_src);
|
||||||
|
e.db(0xCC);
|
||||||
|
e.mov(Nax, dest_src);
|
||||||
|
e.mov(Ndx, src);
|
||||||
|
if (i.flags & ARITHMETIC_UNSIGNED) {
|
||||||
|
e.div(Ndx);
|
||||||
|
} else {
|
||||||
|
e.idiv(Ndx);
|
||||||
|
}
|
||||||
|
e.mov(dest_src, Nax);
|
||||||
|
});
|
||||||
i = e.Advance(i);
|
i = e.Advance(i);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue