AirRegisterPriority.cpp [plain text]
#include "config.h"
#include "AirRegisterPriority.h"
#if ENABLE(B3_JIT)
#include "RegisterSet.h"
namespace JSC { namespace B3 { namespace Air {
const Vector<GPRReg>& gprsInPriorityOrder()
{
static Vector<GPRReg>* result;
static std::once_flag once;
std::call_once(
once,
[] {
result = new Vector<GPRReg>();
RegisterSet all = RegisterSet::allGPRs();
all.exclude(RegisterSet::stackRegisters());
all.exclude(RegisterSet::reservedHardwareRegisters());
RegisterSet calleeSave = RegisterSet::calleeSaveRegisters();
all.forEach(
[&] (Reg reg) {
if (!calleeSave.get(reg))
result->append(reg.gpr());
});
all.forEach(
[&] (Reg reg) {
if (calleeSave.get(reg))
result->append(reg.gpr());
});
});
return *result;
}
const Vector<FPRReg>& fprsInPriorityOrder()
{
static Vector<FPRReg>* result;
static std::once_flag once;
std::call_once(
once,
[] {
result = new Vector<FPRReg>();
RegisterSet all = RegisterSet::allFPRs();
RegisterSet calleeSave = RegisterSet::calleeSaveRegisters();
all.forEach(
[&] (Reg reg) {
if (!calleeSave.get(reg))
result->append(reg.fpr());
});
all.forEach(
[&] (Reg reg) {
if (calleeSave.get(reg))
result->append(reg.fpr());
});
});
return *result;
}
const Vector<Reg>& regsInPriorityOrder(Arg::Type type)
{
static Vector<Reg>* result[Arg::numTypes];
static std::once_flag once;
std::call_once(
once,
[] {
result[Arg::GP] = new Vector<Reg>();
for (GPRReg reg : gprsInPriorityOrder())
result[Arg::GP]->append(Reg(reg));
result[Arg::FP] = new Vector<Reg>();
for (FPRReg reg : fprsInPriorityOrder())
result[Arg::FP]->append(Reg(reg));
});
return *result[type];
}
} } }
#endif // ENABLE(B3_JIT)