#pragma once
#if ENABLE(ASSEMBLER)
#include "FPRInfo.h"
#include "GPRInfo.h"
#include "MacroAssembler.h"
#include "Reg.h"
namespace JSC {
template<typename T>
class RegisterMap {
public:
T& operator[](Reg reg)
{
return m_map[reg.index()];
}
T& operator[](GPRReg gpr)
{
return m_map[MacroAssembler::registerIndex(gpr)];
}
T& operator[](FPRReg fpr)
{
return m_map[MacroAssembler::registerIndex(fpr)];
}
const T& operator[](Reg reg) const
{
return m_map[reg.index()];
}
const T& operator[](GPRReg gpr) const
{
return m_map[MacroAssembler::registerIndex(gpr)];
}
const T& operator[](FPRReg fpr) const
{
return m_map[MacroAssembler::registerIndex(fpr)];
}
private:
std::array<T, MacroAssembler::totalNumberOfRegisters()> m_map { { } };
};
template<typename T>
class GPRMap {
public:
T& operator[](GPRReg gpr)
{
return m_map[MacroAssembler::registerIndex(gpr)];
}
const T& operator[](GPRReg gpr) const
{
return m_map[MacroAssembler::registerIndex(gpr)];
}
private:
std::array<T, MacroAssembler::numberOfRegisters()> m_map { { } };
};
template<typename T>
class FPRMap {
public:
T& operator[](FPRReg fpr)
{
return m_map[MacroAssembler::fpRegisterIndex(fpr)];
}
const T& operator[](FPRReg fpr) const
{
return m_map[MacroAssembler::fpRegisterIndex(fpr)];
}
private:
std::array<T, MacroAssembler::numberOfFPRegisters()> m_map { { } };
};
}
#endif // ENABLE(ASSEMBLER)