diff options
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGVariableEvent.h')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGVariableEvent.h | 91 |
1 files changed, 54 insertions, 37 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGVariableEvent.h b/Source/JavaScriptCore/dfg/DFGVariableEvent.h index 1605f79b8..5fa4bb686 100644 --- a/Source/JavaScriptCore/dfg/DFGVariableEvent.h +++ b/Source/JavaScriptCore/dfg/DFGVariableEvent.h @@ -26,8 +26,6 @@ #ifndef DFGVariableEvent_h #define DFGVariableEvent_h -#include <wtf/Platform.h> - #if ENABLE(DFG_JIT) #include "DFGCommon.h" @@ -49,6 +47,7 @@ enum VariableEventKind { // that we start to care about this node. BirthToFill, BirthToSpill, + Birth, // Events related to how a node is represented. Fill, @@ -61,8 +60,7 @@ enum VariableEventKind { // but that it has not been stored into that operand. MovHintEvent, - // A SetLocalEvent means that a node's value has actually been stored into the - // bytecode operand that it's associated with. + // A SetLocalEvent means that a node's value has been stored into the stack. SetLocalEvent, // Used to indicate an uninitialized VariableEvent. Don't use for other @@ -104,8 +102,8 @@ public: ASSERT(!(dataFormat & DataFormatJS)); #endif VariableEvent event; - event.m_id = id; - event.u.gpr = gpr; + event.m_which.id = id.bits(); + event.m_representation.gpr = gpr; event.m_kind = kind; event.m_dataFormat = dataFormat; return event; @@ -116,9 +114,9 @@ public: { ASSERT(kind == BirthToFill || kind == Fill); VariableEvent event; - event.m_id = id; - event.u.pair.tagGPR = tagGPR; - event.u.pair.payloadGPR = payloadGPR; + event.m_which.id = id.bits(); + event.m_representation.pair.tagGPR = tagGPR; + event.m_representation.pair.payloadGPR = payloadGPR; event.m_kind = kind; event.m_dataFormat = DataFormatJS; return event; @@ -129,19 +127,27 @@ public: { ASSERT(kind == BirthToFill || kind == Fill); VariableEvent event; - event.m_id = id; - event.u.fpr = fpr; + event.m_which.id = id.bits(); + event.m_representation.fpr = fpr; event.m_kind = kind; event.m_dataFormat = DataFormatDouble; return event; } + static VariableEvent birth(MinifiedID id) + { + VariableEvent event; + event.m_which.id = id.bits(); + event.m_kind = Birth; + return event; + } + static VariableEvent spill(VariableEventKind kind, MinifiedID id, VirtualRegister virtualRegister, DataFormat format) { ASSERT(kind == BirthToSpill || kind == Spill); VariableEvent event; - event.m_id = id; - event.u.virtualReg = virtualRegister; + event.m_which.id = id.bits(); + event.m_representation.virtualReg = virtualRegister.offset(); event.m_kind = kind; event.m_dataFormat = format; return event; @@ -150,25 +156,27 @@ public: static VariableEvent death(MinifiedID id) { VariableEvent event; - event.m_id = id; + event.m_which.id = id.bits(); event.m_kind = Death; return event; } - static VariableEvent setLocal(int operand, DataFormat format) + static VariableEvent setLocal( + VirtualRegister bytecodeReg, VirtualRegister machineReg, DataFormat format) { VariableEvent event; - event.u.virtualReg = operand; + event.m_which.virtualReg = machineReg.offset(); + event.m_representation.virtualReg = bytecodeReg.offset(); event.m_kind = SetLocalEvent; event.m_dataFormat = format; return event; } - static VariableEvent movHint(MinifiedID id, int operand) + static VariableEvent movHint(MinifiedID id, VirtualRegister bytecodeReg) { VariableEvent event; - event.m_id = id; - event.u.virtualReg = operand; + event.m_which.id = id.bits(); + event.m_representation.virtualReg = bytecodeReg.offset(); event.m_kind = MovHintEvent; return event; } @@ -180,17 +188,17 @@ public: MinifiedID id() const { - ASSERT(m_kind == BirthToFill || m_kind == Fill - || m_kind == BirthToSpill || m_kind == Spill - || m_kind == Death || m_kind == MovHintEvent); - return m_id; + ASSERT( + m_kind == BirthToFill || m_kind == Fill || m_kind == BirthToSpill || m_kind == Spill + || m_kind == Death || m_kind == MovHintEvent || m_kind == Birth); + return MinifiedID::fromBits(m_which.id); } DataFormat dataFormat() const { - ASSERT(m_kind == BirthToFill || m_kind == Fill - || m_kind == BirthToSpill || m_kind == Spill - || m_kind == SetLocalEvent); + ASSERT( + m_kind == BirthToFill || m_kind == Fill || m_kind == BirthToSpill || m_kind == Spill + || m_kind == SetLocalEvent); return static_cast<DataFormat>(m_dataFormat); } @@ -202,7 +210,7 @@ public: #if USE(JSVALUE32_64) ASSERT(!(m_dataFormat & DataFormatJS)); #endif - return u.gpr; + return m_representation.gpr; } #if USE(JSVALUE32_64) @@ -210,13 +218,13 @@ public: { ASSERT(m_kind == BirthToFill || m_kind == Fill); ASSERT(m_dataFormat & DataFormatJS); - return u.pair.tagGPR; + return m_representation.pair.tagGPR; } MacroAssembler::RegisterID payloadGPR() const { ASSERT(m_kind == BirthToFill || m_kind == Fill); ASSERT(m_dataFormat & DataFormatJS); - return u.pair.payloadGPR; + return m_representation.pair.payloadGPR; } #endif // USE(JSVALUE32_64) @@ -224,22 +232,28 @@ public: { ASSERT(m_kind == BirthToFill || m_kind == Fill); ASSERT(m_dataFormat == DataFormatDouble); - return u.fpr; + return m_representation.fpr; } - VirtualRegister virtualRegister() const + VirtualRegister spillRegister() const { ASSERT(m_kind == BirthToSpill || m_kind == Spill); - return static_cast<VirtualRegister>(u.virtualReg); + return VirtualRegister(m_representation.virtualReg); } - int operand() const + VirtualRegister bytecodeRegister() const { ASSERT(m_kind == SetLocalEvent || m_kind == MovHintEvent); - return u.virtualReg; + return VirtualRegister(m_representation.virtualReg); + } + + VirtualRegister machineRegister() const + { + ASSERT(m_kind == SetLocalEvent); + return VirtualRegister(m_which.virtualReg); } - const VariableRepresentation& variableRepresentation() const { return u; } + const VariableRepresentation& variableRepresentation() const { return m_representation; } void dump(PrintStream&) const; @@ -247,7 +261,10 @@ private: void dumpFillInfo(const char* name, PrintStream&) const; void dumpSpillInfo(const char* name, PrintStream&) const; - MinifiedID m_id; + union { + int virtualReg; + uintptr_t id; + } m_which; // For BirthToFill, Fill: // - The GPR or FPR, or a GPR pair. @@ -257,7 +274,7 @@ private: // - The bytecode operand. // For Death: // - Unused. - VariableRepresentation u; + VariableRepresentation m_representation; int8_t m_kind; int8_t m_dataFormat; |