diff options
Diffstat (limited to 'Source/JavaScriptCore/jit/RegisterSet.h')
| -rw-r--r-- | Source/JavaScriptCore/jit/RegisterSet.h | 84 |
1 files changed, 61 insertions, 23 deletions
diff --git a/Source/JavaScriptCore/jit/RegisterSet.h b/Source/JavaScriptCore/jit/RegisterSet.h index 84ad226ad..a95583ea8 100644 --- a/Source/JavaScriptCore/jit/RegisterSet.h +++ b/Source/JavaScriptCore/jit/RegisterSet.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013-2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,13 +26,12 @@ #ifndef RegisterSet_h #define RegisterSet_h -#include <wtf/Platform.h> - #if ENABLE(JIT) #include "FPRInfo.h" #include "GPRInfo.h" #include "MacroAssembler.h" +#include "Reg.h" #include "TempRegisterSet.h" #include <wtf/BitVector.h> @@ -40,50 +39,72 @@ namespace JSC { class RegisterSet { public: - RegisterSet() { } + template<typename... Regs> + explicit RegisterSet(Regs... regs) + { + setMany(regs...); + } - static RegisterSet stackRegisters(); - static RegisterSet specialRegisters(); + JS_EXPORT_PRIVATE static RegisterSet stackRegisters(); + JS_EXPORT_PRIVATE static RegisterSet reservedHardwareRegisters(); + static RegisterSet runtimeRegisters(); + static RegisterSet specialRegisters(); // The union of stack, reserved hardware, and runtime registers. static RegisterSet calleeSaveRegisters(); - static RegisterSet allGPRs(); - static RegisterSet allFPRs(); + static RegisterSet vmCalleeSaveRegisters(); // Callee save registers that might be saved and used by any tier. + static RegisterSet llintBaselineCalleeSaveRegisters(); // Registers saved and used by the LLInt. + static RegisterSet dfgCalleeSaveRegisters(); // Registers saved and used by the DFG JIT. + static RegisterSet ftlCalleeSaveRegisters(); // Registers that might be saved and used by the FTL JIT. +#if ENABLE(WEBASSEMBLY) + static RegisterSet webAssemblyCalleeSaveRegisters(); // Registers saved and used by the WebAssembly JIT. +#endif + static RegisterSet volatileRegistersForJSCall(); + static RegisterSet stubUnavailableRegisters(); // The union of callee saves and special registers. + JS_EXPORT_PRIVATE static RegisterSet macroScratchRegisters(); + JS_EXPORT_PRIVATE static RegisterSet allGPRs(); + JS_EXPORT_PRIVATE static RegisterSet allFPRs(); static RegisterSet allRegisters(); - void set(GPRReg reg, bool value = true) + static RegisterSet registersToNotSaveForJSCall(); + static RegisterSet registersToNotSaveForCCall(); + + void set(Reg reg, bool value = true) { - m_vector.set(MacroAssembler::registerIndex(reg), value); + ASSERT(!!reg); + m_vector.set(reg.index(), value); } - void set(JSValueRegs regs) + void set(JSValueRegs regs, bool value = true) { if (regs.tagGPR() != InvalidGPRReg) - set(regs.tagGPR()); - set(regs.payloadGPR()); + set(regs.tagGPR(), value); + set(regs.payloadGPR(), value); } - void clear(GPRReg reg) + void clear(Reg reg) { + ASSERT(!!reg); set(reg, false); } - bool get(GPRReg reg) const { return m_vector.get(MacroAssembler::registerIndex(reg)); } - - void set(FPRReg reg, bool value = true) + bool get(Reg reg) const { - m_vector.set(MacroAssembler::registerIndex(reg), value); + ASSERT(!!reg); + return m_vector.get(reg.index()); } - - void clear(FPRReg reg) + + template<typename Iterable> + void setAll(const Iterable& iterable) { - set(reg, false); + for (Reg reg : iterable) + set(reg); } - bool get(FPRReg reg) const { return m_vector.get(MacroAssembler::registerIndex(reg)); } - void merge(const RegisterSet& other) { m_vector.merge(other.m_vector); } void filter(const RegisterSet& other) { m_vector.filter(other.m_vector); } void exclude(const RegisterSet& other) { m_vector.exclude(other.m_vector); } + size_t numberOfSetGPRs() const; + size_t numberOfSetFPRs() const; size_t numberOfSetRegisters() const { return m_vector.bitCount(); } void dump(PrintStream&) const; @@ -106,8 +127,25 @@ public: bool operator==(const RegisterSet& other) const { return m_vector == other.m_vector; } unsigned hash() const { return m_vector.hash(); } + + template<typename Functor> + void forEach(const Functor& functor) const + { + for (size_t index : m_vector) + functor(Reg::fromIndex(index)); + } private: + void setAny(Reg reg) { set(reg); } + void setAny(const RegisterSet& set) { merge(set); } + void setMany() { } + template<typename RegType, typename... Regs> + void setMany(RegType reg, Regs... regs) + { + setAny(reg); + setMany(regs...); + } + BitVector m_vector; }; |
