a64_emit_x64: Simplify EmitExclusiveWrite
This commit is contained in:
parent
2fc6b33829
commit
85234338d3
2 changed files with 13 additions and 22 deletions
|
@ -817,7 +817,13 @@ void A64EmitX64::EmitA64WriteMemory128(A64EmitContext& ctx, IR::Inst* inst) {
|
||||||
code.CallFunction(memory_write_128);
|
code.CallFunction(memory_write_128);
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitExclusiveWrite(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize, Xbyak::Reg64 vaddr, int value_idx) {
|
void A64EmitX64::EmitExclusiveWrite(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
Xbyak::Reg64 vaddr = ctx.reg_alloc.UseGpr(args[0]);
|
||||||
|
int value_idx = bitsize != 128
|
||||||
|
? ctx.reg_alloc.UseGpr(args[1]).getIdx()
|
||||||
|
: ctx.reg_alloc.UseXmm(args[1]).getIdx();
|
||||||
|
|
||||||
Xbyak::Label end;
|
Xbyak::Label end;
|
||||||
Xbyak::Reg32 passed = ctx.reg_alloc.ScratchGpr().cvt32();
|
Xbyak::Reg32 passed = ctx.reg_alloc.ScratchGpr().cvt32();
|
||||||
Xbyak::Reg64 tmp = ctx.reg_alloc.ScratchGpr();
|
Xbyak::Reg64 tmp = ctx.reg_alloc.ScratchGpr();
|
||||||
|
@ -838,38 +844,23 @@ void A64EmitX64::EmitExclusiveWrite(A64EmitContext& ctx, IR::Inst* inst, size_t
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitA64ExclusiveWriteMemory8(A64EmitContext& ctx, IR::Inst* inst) {
|
void A64EmitX64::EmitA64ExclusiveWriteMemory8(A64EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
EmitExclusiveWrite(ctx, inst, 8);
|
||||||
Xbyak::Reg64 vaddr = ctx.reg_alloc.UseGpr(args[0]);
|
|
||||||
Xbyak::Reg64 value = ctx.reg_alloc.UseGpr(args[1]);
|
|
||||||
EmitExclusiveWrite(ctx, inst, 8, vaddr, value.getIdx());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitA64ExclusiveWriteMemory16(A64EmitContext& ctx, IR::Inst* inst) {
|
void A64EmitX64::EmitA64ExclusiveWriteMemory16(A64EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
EmitExclusiveWrite(ctx, inst, 16);
|
||||||
Xbyak::Reg64 vaddr = ctx.reg_alloc.UseGpr(args[0]);
|
|
||||||
Xbyak::Reg64 value = ctx.reg_alloc.UseGpr(args[1]);
|
|
||||||
EmitExclusiveWrite(ctx, inst, 16, vaddr, value.getIdx());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitA64ExclusiveWriteMemory32(A64EmitContext& ctx, IR::Inst* inst) {
|
void A64EmitX64::EmitA64ExclusiveWriteMemory32(A64EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
EmitExclusiveWrite(ctx, inst, 32);
|
||||||
Xbyak::Reg64 vaddr = ctx.reg_alloc.UseGpr(args[0]);
|
|
||||||
Xbyak::Reg64 value = ctx.reg_alloc.UseGpr(args[1]);
|
|
||||||
EmitExclusiveWrite(ctx, inst, 32, vaddr, value.getIdx());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitA64ExclusiveWriteMemory64(A64EmitContext& ctx, IR::Inst* inst) {
|
void A64EmitX64::EmitA64ExclusiveWriteMemory64(A64EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
EmitExclusiveWrite(ctx, inst, 64);
|
||||||
Xbyak::Reg64 vaddr = ctx.reg_alloc.UseGpr(args[0]);
|
|
||||||
Xbyak::Reg64 value = ctx.reg_alloc.UseGpr(args[1]);
|
|
||||||
EmitExclusiveWrite(ctx, inst, 64, vaddr, value.getIdx());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitA64ExclusiveWriteMemory128(A64EmitContext& ctx, IR::Inst* inst) {
|
void A64EmitX64::EmitA64ExclusiveWriteMemory128(A64EmitContext& ctx, IR::Inst* inst) {
|
||||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
EmitExclusiveWrite(ctx, inst, 128);
|
||||||
Xbyak::Reg64 vaddr = ctx.reg_alloc.UseGpr(args[0]);
|
|
||||||
Xbyak::Xmm value = ctx.reg_alloc.UseXmm(args[1]);
|
|
||||||
EmitExclusiveWrite(ctx, inst, 128, vaddr, value.getIdx());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitTerminalImpl(IR::Term::Interpret terminal, IR::LocationDescriptor) {
|
void A64EmitX64::EmitTerminalImpl(IR::Term::Interpret terminal, IR::LocationDescriptor) {
|
||||||
|
|
|
@ -60,7 +60,7 @@ protected:
|
||||||
|
|
||||||
void EmitDirectPageTableMemoryRead(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize);
|
void EmitDirectPageTableMemoryRead(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize);
|
||||||
void EmitDirectPageTableMemoryWrite(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize);
|
void EmitDirectPageTableMemoryWrite(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize);
|
||||||
void EmitExclusiveWrite(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize, Xbyak::Reg64 vaddr, int value_idx);
|
void EmitExclusiveWrite(A64EmitContext& ctx, IR::Inst* inst, size_t bitsize);
|
||||||
|
|
||||||
// Microinstruction emitters
|
// Microinstruction emitters
|
||||||
#define OPCODE(...)
|
#define OPCODE(...)
|
||||||
|
|
Loading…
Reference in a new issue