#include "config.h"
#include "RegisterSet.h"
#if ENABLE(JIT)
#include "GPRInfo.h"
#include "MacroAssembler.h"
#include "JSCInlines.h"
#include <wtf/CommaPrinter.h>
namespace JSC {
RegisterSet RegisterSet::stackRegisters()
{
return RegisterSet(
MacroAssembler::stackPointerRegister,
MacroAssembler::framePointerRegister);
}
RegisterSet RegisterSet::reservedHardwareRegisters()
{
#if CPU(ARM64)
return RegisterSet(ARM64Registers::lr);
#else
return RegisterSet();
#endif
}
RegisterSet RegisterSet::runtimeRegisters()
{
#if USE(JSVALUE64)
return RegisterSet(GPRInfo::tagTypeNumberRegister, GPRInfo::tagMaskRegister);
#else
return RegisterSet();
#endif
}
RegisterSet RegisterSet::specialRegisters()
{
return RegisterSet(
stackRegisters(), reservedHardwareRegisters(), runtimeRegisters());
}
RegisterSet RegisterSet::calleeSaveRegisters()
{
RegisterSet result;
#if CPU(X86)
result.set(X86Registers::ebx);
result.set(X86Registers::ebp);
result.set(X86Registers::edi);
result.set(X86Registers::esi);
#elif CPU(X86_64)
result.set(X86Registers::ebx);
result.set(X86Registers::ebp);
result.set(X86Registers::r12);
result.set(X86Registers::r13);
result.set(X86Registers::r14);
result.set(X86Registers::r15);
#elif CPU(ARM_THUMB2)
result.set(ARMRegisters::r4);
result.set(ARMRegisters::r5);
result.set(ARMRegisters::r6);
result.set(ARMRegisters::r8);
#if !PLATFORM(IOS)
result.set(ARMRegisters::r9);
#endif
result.set(ARMRegisters::r10);
result.set(ARMRegisters::r11);
#elif CPU(ARM_TRADITIONAL)
result.set(ARMRegisters::r4);
result.set(ARMRegisters::r5);
result.set(ARMRegisters::r6);
result.set(ARMRegisters::r7);
result.set(ARMRegisters::r8);
result.set(ARMRegisters::r9);
result.set(ARMRegisters::r10);
result.set(ARMRegisters::r11);
#elif CPU(ARM64)
for (
ARM64Registers::RegisterID reg = ARM64Registers::x19;
reg <= ARM64Registers::x28;
reg = static_cast<ARM64Registers::RegisterID>(reg + 1))
result.set(reg);
result.set(ARM64Registers::fp);
for (
ARM64Registers::FPRegisterID reg = ARM64Registers::q8;
reg <= ARM64Registers::q15;
reg = static_cast<ARM64Registers::FPRegisterID>(reg + 1))
result.set(reg);
#else
UNREACHABLE_FOR_PLATFORM();
#endif
return result;
}
RegisterSet RegisterSet::allGPRs()
{
RegisterSet result;
for (MacroAssembler::RegisterID reg = MacroAssembler::firstRegister(); reg <= MacroAssembler::lastRegister(); reg = static_cast<MacroAssembler::RegisterID>(reg + 1))
result.set(reg);
return result;
}
RegisterSet RegisterSet::allFPRs()
{
RegisterSet result;
for (MacroAssembler::FPRegisterID reg = MacroAssembler::firstFPRegister(); reg <= MacroAssembler::lastFPRegister(); reg = static_cast<MacroAssembler::FPRegisterID>(reg + 1))
result.set(reg);
return result;
}
RegisterSet RegisterSet::allRegisters()
{
RegisterSet result;
result.merge(allGPRs());
result.merge(allFPRs());
return result;
}
size_t RegisterSet::numberOfSetGPRs() const
{
RegisterSet temp = *this;
temp.filter(allGPRs());
return temp.numberOfSetRegisters();
}
size_t RegisterSet::numberOfSetFPRs() const
{
RegisterSet temp = *this;
temp.filter(allFPRs());
return temp.numberOfSetRegisters();
}
void RegisterSet::dump(PrintStream& out) const
{
CommaPrinter comma;
out.print("[");
for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
if (get(reg))
out.print(comma, reg);
}
out.print("]");
}
}
#endif // ENABLE(JIT)