diff options
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGEdge.h')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGEdge.h | 141 |
1 files changed, 103 insertions, 38 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGEdge.h b/Source/JavaScriptCore/dfg/DFGEdge.h index 10988bf39..eb835b050 100644 --- a/Source/JavaScriptCore/dfg/DFGEdge.h +++ b/Source/JavaScriptCore/dfg/DFGEdge.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2011, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,6 +31,7 @@ #if ENABLE(DFG_JIT) #include "DFGCommon.h" +#include "DFGUseKind.h" namespace JSC { namespace DFG { @@ -38,46 +39,90 @@ class AdjacencyList; class Edge { public: - Edge() - : m_encodedWord(makeWord(NoNode, UntypedUse)) + explicit Edge(Node* node = 0, UseKind useKind = UntypedUse, ProofStatus proofStatus = NeedsCheck) +#if USE(JSVALUE64) + : m_encodedWord(makeWord(node, useKind, proofStatus)) +#else + : m_node(node) + , m_encodedWord(makeWord(useKind, proofStatus)) +#endif { } - explicit Edge(NodeIndex nodeIndex) - : m_encodedWord(makeWord(nodeIndex, UntypedUse)) +#if USE(JSVALUE64) + Node* node() const { return bitwise_cast<Node*>(m_encodedWord >> shift()); } +#else + Node* node() const { return m_node; } +#endif + + Node& operator*() const { return *node(); } + Node* operator->() const { return node(); } + + void setNode(Node* node) { +#if USE(JSVALUE64) + m_encodedWord = makeWord(node, useKind(), proofStatus()); +#else + m_node = node; +#endif } - Edge(NodeIndex nodeIndex, UseKind useKind) - : m_encodedWord(makeWord(nodeIndex, useKind)) + UseKind useKindUnchecked() const { +#if USE(JSVALUE64) + unsigned masked = m_encodedWord & (((1 << shift()) - 1)); + unsigned shifted = masked >> 1; +#else + unsigned shifted = static_cast<UseKind>(m_encodedWord) >> 1; +#endif + ASSERT(shifted < static_cast<unsigned>(LastUseKind)); + UseKind result = static_cast<UseKind>(shifted); + ASSERT(node() || result == UntypedUse); + return result; } - - NodeIndex indexUnchecked() const { return m_encodedWord >> shift(); } - NodeIndex index() const + UseKind useKind() const { - ASSERT(isSet()); - return m_encodedWord >> shift(); + ASSERT(node()); + return useKindUnchecked(); } - void setIndex(NodeIndex nodeIndex) + void setUseKind(UseKind useKind) { - m_encodedWord = makeWord(nodeIndex, useKind()); + ASSERT(node()); +#if USE(JSVALUE64) + m_encodedWord = makeWord(node(), useKind, proofStatus()); +#else + m_encodedWord = makeWord(useKind, proofStatus()); +#endif } - UseKind useKind() const + ProofStatus proofStatusUnchecked() const { - ASSERT(isSet()); - unsigned masked = m_encodedWord & (((1 << shift()) - 1)); - ASSERT(masked < LastUseKind); - return static_cast<UseKind>(masked); + return proofStatusForIsProved(m_encodedWord & 1); } - void setUseKind(UseKind useKind) + ProofStatus proofStatus() const { - ASSERT(isSet()); - m_encodedWord = makeWord(index(), useKind); + ASSERT(node()); + return proofStatusUnchecked(); + } + void setProofStatus(ProofStatus proofStatus) + { + ASSERT(node()); +#if USE(JSVALUE64) + m_encodedWord = makeWord(node(), useKind(), proofStatus); +#else + m_encodedWord = makeWord(useKind(), proofStatus); +#endif + } + bool isProved() const + { + return proofStatus() == IsProved; + } + bool needsCheck() const + { + return proofStatus() == NeedsCheck; } - bool isSet() const { return indexUnchecked() != NoNode; } + bool isSet() const { return !!node(); } typedef void* Edge::*UnspecifiedBoolType; operator UnspecifiedBoolType*() const { return reinterpret_cast<UnspecifiedBoolType*>(isSet()); } @@ -86,44 +131,64 @@ public: bool operator==(Edge other) const { +#if USE(JSVALUE64) return m_encodedWord == other.m_encodedWord; +#else + return m_node == other.m_node && m_encodedWord == other.m_encodedWord; +#endif } bool operator!=(Edge other) const { - return m_encodedWord != other.m_encodedWord; + return !(*this == other); } + + void dump(PrintStream&) const; private: friend class AdjacencyList; - static uint32_t shift() { return 4; } +#if USE(JSVALUE64) + static uint32_t shift() { return 6; } - static int32_t makeWord(NodeIndex nodeIndex, UseKind useKind) + static uintptr_t makeWord(Node* node, UseKind useKind, ProofStatus proofStatus) { - ASSERT(static_cast<uint32_t>(((static_cast<int32_t>(nodeIndex) << shift()) >> shift())) == nodeIndex); + ASSERT(sizeof(node) == 8); + uintptr_t shiftedValue = bitwise_cast<uintptr_t>(node) << shift(); + ASSERT((shiftedValue >> shift()) == bitwise_cast<uintptr_t>(node)); ASSERT(useKind >= 0 && useKind < LastUseKind); - ASSERT(LastUseKind <= (1 << shift())); - return (nodeIndex << shift()) | useKind; + ASSERT((static_cast<uintptr_t>(LastUseKind) << 1) <= (static_cast<uintptr_t>(1) << shift())); + return shiftedValue | (static_cast<uintptr_t>(useKind) << 1) | DFG::isProved(proofStatus); + } + +#else + static uintptr_t makeWord(UseKind useKind, ProofStatus proofStatus) + { + return (static_cast<uintptr_t>(useKind) << 1) | DFG::isProved(proofStatus); } - int32_t m_encodedWord; + Node* m_node; +#endif + // On 64-bit this holds both the pointer and the use kind, while on 32-bit + // this just holds the use kind. In both cases this may be hijacked by + // AdjacencyList for storing firstChild and numChildren. + uintptr_t m_encodedWord; }; -inline bool operator==(Edge nodeUse, NodeIndex nodeIndex) +inline bool operator==(Edge edge, Node* node) { - return nodeUse.indexUnchecked() == nodeIndex; + return edge.node() == node; } -inline bool operator==(NodeIndex nodeIndex, Edge nodeUse) +inline bool operator==(Node* node, Edge edge) { - return nodeUse.indexUnchecked() == nodeIndex; + return edge.node() == node; } -inline bool operator!=(Edge nodeUse, NodeIndex nodeIndex) +inline bool operator!=(Edge edge, Node* node) { - return nodeUse.indexUnchecked() != nodeIndex; + return edge.node() != node; } -inline bool operator!=(NodeIndex nodeIndex, Edge nodeUse) +inline bool operator!=(Node* node, Edge edge) { - return nodeUse.indexUnchecked() != nodeIndex; + return edge.node() != node; } } } // namespace JSC::DFG |