backend/x64: Move check_bit from JitState to stack

This commit is contained in:
MerryMage 2021-05-04 14:22:45 +01:00
parent a1950d1d2f
commit 030ff82ba8
5 changed files with 8 additions and 6 deletions

View file

@ -22,6 +22,7 @@
#include "backend/x64/emit_x64.h" #include "backend/x64/emit_x64.h"
#include "backend/x64/nzcv_util.h" #include "backend/x64/nzcv_util.h"
#include "backend/x64/perf_map.h" #include "backend/x64/perf_map.h"
#include "backend/x64/stack_layout.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/bit_util.h" #include "common/bit_util.h"
#include "common/common_types.h" #include "common/common_types.h"
@ -324,7 +325,7 @@ void A32EmitX64::GenTerminalHandlers() {
void A32EmitX64::EmitA32SetCheckBit(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32SetCheckBit(A32EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Reg8 to_store = ctx.reg_alloc.UseGpr(args[0]).cvt8(); const Xbyak::Reg8 to_store = ctx.reg_alloc.UseGpr(args[0]).cvt8();
code.mov(code.byte[r15 + offsetof(A32JitState, check_bit)], to_store); code.mov(code.byte[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, check_bit)], to_store);
} }
void A32EmitX64::EmitA32GetRegister(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32GetRegister(A32EmitContext& ctx, IR::Inst* inst) {
@ -1601,7 +1602,7 @@ void A32EmitX64::EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor
void A32EmitX64::EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location, bool is_single_step) { void A32EmitX64::EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location, bool is_single_step) {
Xbyak::Label fail; Xbyak::Label fail;
code.cmp(code.byte[r15 + offsetof(A32JitState, check_bit)], u8(0)); code.cmp(code.byte[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, check_bit)], u8(0));
code.jz(fail); code.jz(fail);
EmitTerminal(terminal.then_, initial_location, is_single_step); EmitTerminal(terminal.then_, initial_location, is_single_step);
code.L(fail); code.L(fail);

View file

@ -45,7 +45,6 @@ struct A32JitState {
s64 cycles_to_run = 0; s64 cycles_to_run = 0;
s64 cycles_remaining = 0; s64 cycles_remaining = 0;
bool halt_requested = false; bool halt_requested = false;
bool check_bit = false;
// Exclusive state // Exclusive state
u32 exclusive_state = 0; u32 exclusive_state = 0;

View file

@ -19,6 +19,7 @@
#include "backend/x64/emit_x64.h" #include "backend/x64/emit_x64.h"
#include "backend/x64/nzcv_util.h" #include "backend/x64/nzcv_util.h"
#include "backend/x64/perf_map.h" #include "backend/x64/perf_map.h"
#include "backend/x64/stack_layout.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/bit_util.h" #include "common/bit_util.h"
#include "common/common_types.h" #include "common/common_types.h"
@ -376,7 +377,7 @@ void A64EmitX64::EmitPushRSB(EmitContext& ctx, IR::Inst* inst) {
void A64EmitX64::EmitA64SetCheckBit(A64EmitContext& ctx, IR::Inst* inst) { void A64EmitX64::EmitA64SetCheckBit(A64EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Reg8 to_store = ctx.reg_alloc.UseGpr(args[0]).cvt8(); const Xbyak::Reg8 to_store = ctx.reg_alloc.UseGpr(args[0]).cvt8();
code.mov(code.byte[r15 + offsetof(A64JitState, check_bit)], to_store); code.mov(code.byte[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, check_bit)], to_store);
} }
void A64EmitX64::EmitA64GetCFlag(A64EmitContext& ctx, IR::Inst* inst) { void A64EmitX64::EmitA64GetCFlag(A64EmitContext& ctx, IR::Inst* inst) {
@ -1299,7 +1300,7 @@ void A64EmitX64::EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor
void A64EmitX64::EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location, bool is_single_step) { void A64EmitX64::EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location, bool is_single_step) {
Xbyak::Label fail; Xbyak::Label fail;
code.cmp(code.byte[r15 + offsetof(A64JitState, check_bit)], u8(0)); code.cmp(code.byte[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, check_bit)], u8(0));
code.jz(fail); code.jz(fail);
EmitTerminal(terminal.then_, initial_location, is_single_step); EmitTerminal(terminal.then_, initial_location, is_single_step);
code.L(fail); code.L(fail);

View file

@ -48,7 +48,6 @@ struct A64JitState {
s64 cycles_to_run = 0; s64 cycles_to_run = 0;
s64 cycles_remaining = 0; s64 cycles_remaining = 0;
bool halt_requested = false; bool halt_requested = false;
bool check_bit = false;
// Exclusive state // Exclusive state
static constexpr u64 RESERVATION_GRANULE_MASK = 0xFFFF'FFFF'FFFF'FFF0ull; static constexpr u64 RESERVATION_GRANULE_MASK = 0xFFFF'FFFF'FFFF'FFF0ull;

View file

@ -17,6 +17,8 @@ struct alignas(16) StackLayout {
std::array<std::array<u64, 2>, SpillCount> spill; std::array<std::array<u64, 2>, SpillCount> spill;
u32 save_host_MXCSR; u32 save_host_MXCSR;
bool check_bit;
}; };
static_assert(sizeof(StackLayout) % 16 == 0); static_assert(sizeof(StackLayout) % 16 == 0);