--- /dev/null
+/*
+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RegisterSet_h
+#define RegisterSet_h
+
+#if ENABLE(JIT)
+
+#include "FPRInfo.h"
+#include "GPRInfo.h"
+#include "MacroAssembler.h"
+#include "Reg.h"
+#include "TempRegisterSet.h"
+#include <wtf/BitVector.h>
+
+namespace JSC {
+
+class RegisterSet {
+public:
+ template<typename... Regs>
+ explicit RegisterSet(Regs... regs)
+ {
+ setMany(regs...);
+ }
+
+ static RegisterSet stackRegisters();
+ 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 allRegisters();
+
+ void set(Reg reg, bool value = true)
+ {
+ ASSERT(!!reg);
+ m_vector.set(reg.index(), value);
+ }
+
+ void set(JSValueRegs regs)
+ {
+ if (regs.tagGPR() != InvalidGPRReg)
+ set(regs.tagGPR());
+ set(regs.payloadGPR());
+ }
+
+ void clear(Reg reg)
+ {
+ ASSERT(!!reg);
+ set(reg, false);
+ }
+
+ bool get(Reg reg) const
+ {
+ ASSERT(!!reg);
+ return m_vector.get(reg.index());
+ }
+
+ 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;
+
+ enum EmptyValueTag { EmptyValue };
+ enum DeletedValueTag { DeletedValue };
+
+ RegisterSet(EmptyValueTag)
+ : m_vector(BitVector::EmptyValue)
+ {
+ }
+
+ RegisterSet(DeletedValueTag)
+ : m_vector(BitVector::DeletedValue)
+ {
+ }
+
+ bool isEmptyValue() const { return m_vector.isEmptyValue(); }
+ bool isDeletedValue() const { return m_vector.isDeletedValue(); }
+
+ bool operator==(const RegisterSet& other) const { return m_vector == other.m_vector; }
+ unsigned hash() const { return m_vector.hash(); }
+
+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;
+};
+
+struct RegisterSetHash {
+ static unsigned hash(const RegisterSet& set) { return set.hash(); }
+ static bool equal(const RegisterSet& a, const RegisterSet& b) { return a == b; }
+ static const bool safeToCompareToEmptyOrDeleted = false;
+};
+
+} // namespace JSC
+
+namespace WTF {
+
+template<typename T> struct DefaultHash;
+template<> struct DefaultHash<JSC::RegisterSet> {
+ typedef JSC::RegisterSetHash Hash;
+};
+
+template<typename T> struct HashTraits;
+template<> struct HashTraits<JSC::RegisterSet> : public CustomHashTraits<JSC::RegisterSet> { };
+
+} // namespace WTF
+
+#endif // ENABLE(JIT)
+
+#endif // RegisterSet_h
+