reg_alloc: Deduplicate constants in RegAlloc::HostCall that were already defined by abi.h
This commit is contained in:
parent
59a8e14d1c
commit
7fedf04e79
1 changed files with 19 additions and 23 deletions
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <xbyak.h>
|
#include <xbyak.h>
|
||||||
|
|
||||||
|
#include "backend_x64/abi.h"
|
||||||
#include "backend_x64/jitstate.h"
|
#include "backend_x64/jitstate.h"
|
||||||
#include "backend_x64/reg_alloc.h"
|
#include "backend_x64/reg_alloc.h"
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
|
@ -273,42 +274,37 @@ HostLoc RegAlloc::ScratchHostLocReg(HostLocList desired_locations) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegAlloc::HostCall(IR::Inst* result_def, IR::Value arg0_use, IR::Value arg1_use, IR::Value arg2_use, IR::Value arg3_use) {
|
void RegAlloc::HostCall(IR::Inst* result_def, IR::Value arg0_use, IR::Value arg1_use, IR::Value arg2_use, IR::Value arg3_use) {
|
||||||
constexpr HostLoc AbiReturn = HostLoc::RAX;
|
constexpr size_t args_count = 4;
|
||||||
#ifdef _WIN32
|
constexpr std::array<HostLoc, args_count> args_hostloc = { ABI_PARAM1, ABI_PARAM2, ABI_PARAM3, ABI_PARAM4 };
|
||||||
constexpr std::array<HostLoc, 4> AbiArgs = { HostLoc::RCX, HostLoc::RDX, HostLoc::R8, HostLoc::R9 };
|
const std::array<IR::Value*, args_count> args = {&arg0_use, &arg1_use, &arg2_use, &arg3_use};
|
||||||
/// Caller-saved registers other than AbiReturn or AbiArgs
|
|
||||||
constexpr std::array<HostLoc, 2> OtherCallerSave = { HostLoc::R10, HostLoc::R11 };
|
|
||||||
#else
|
|
||||||
constexpr std::array<HostLoc, 4> AbiArgs = { HostLoc::RDI, HostLoc::RSI, HostLoc::RDX, HostLoc::RCX };
|
|
||||||
/// Caller-saved registers other than AbiReturn or AbiArgs
|
|
||||||
constexpr std::array<HostLoc, 4> OtherCallerSave = { HostLoc::R8, HostLoc::R9, HostLoc::R10, HostLoc::R11 };
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const std::array<IR::Value*, 4> args = {&arg0_use, &arg1_use, &arg2_use, &arg3_use};
|
const static std::vector<HostLoc> other_caller_save = [](){
|
||||||
|
std::vector<HostLoc> ret(ABI_ALL_CALLER_SAVE.begin(), ABI_ALL_CALLER_SAVE.end());
|
||||||
|
|
||||||
|
for (auto hostloc : {ABI_RETURN, ABI_PARAM1, ABI_PARAM2, ABI_PARAM3, ABI_PARAM4})
|
||||||
|
ret.erase(std::find(ret.begin(), ret.end(), hostloc));
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}();
|
||||||
|
|
||||||
// TODO: This works but almost certainly leads to suboptimal generated code.
|
// TODO: This works but almost certainly leads to suboptimal generated code.
|
||||||
|
|
||||||
for (HostLoc caller_save : OtherCallerSave) {
|
|
||||||
ScratchHostLocReg({caller_save});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result_def) {
|
if (result_def) {
|
||||||
DefHostLocReg(result_def, {AbiReturn});
|
DefHostLocReg(result_def, {ABI_RETURN});
|
||||||
} else {
|
} else {
|
||||||
ScratchHostLocReg({AbiReturn});
|
ScratchHostLocReg({ABI_RETURN});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < AbiArgs.size(); i++) {
|
for (size_t i = 0; i < args_count; i++) {
|
||||||
if (!args[i]->IsEmpty()) {
|
if (!args[i]->IsEmpty()) {
|
||||||
UseScratchHostLocReg(*args[i], {AbiArgs[i]});
|
UseScratchHostLocReg(*args[i], {args_hostloc[i]});
|
||||||
} else {
|
} else {
|
||||||
ScratchHostLocReg({AbiArgs[i]});
|
ScratchHostLocReg({args_hostloc[i]});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flush all xmm registers
|
for (HostLoc caller_saved : other_caller_save) {
|
||||||
for (auto xmm : any_xmm) {
|
ScratchHostLocReg({caller_saved});
|
||||||
ScratchHostLocReg({xmm});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue