]>
git.saurik.com Git - apple/javascriptcore.git/blob - dfg/DFGEdge.h
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <wtf/Platform.h>
33 #include "DFGCommon.h"
35 namespace JSC
{ namespace DFG
{
42 : m_encodedWord(makeWord(NoNode
, UntypedUse
))
46 explicit Edge(NodeIndex nodeIndex
)
47 : m_encodedWord(makeWord(nodeIndex
, UntypedUse
))
51 Edge(NodeIndex nodeIndex
, UseKind useKind
)
52 : m_encodedWord(makeWord(nodeIndex
, useKind
))
56 NodeIndex
indexUnchecked() const { return m_encodedWord
>> shift(); }
57 NodeIndex
index() const
60 return m_encodedWord
>> shift();
62 void setIndex(NodeIndex nodeIndex
)
64 m_encodedWord
= makeWord(nodeIndex
, useKind());
67 UseKind
useKind() const
70 unsigned masked
= m_encodedWord
& (((1 << shift()) - 1));
71 ASSERT(masked
< LastUseKind
);
72 return static_cast<UseKind
>(masked
);
74 void setUseKind(UseKind useKind
)
77 m_encodedWord
= makeWord(index(), useKind
);
80 bool isSet() const { return indexUnchecked() != NoNode
; }
81 bool operator!() const { return !isSet(); }
83 bool operator==(Edge other
) const
85 return m_encodedWord
== other
.m_encodedWord
;
87 bool operator!=(Edge other
) const
89 return m_encodedWord
!= other
.m_encodedWord
;
93 friend class AdjacencyList
;
95 static uint32_t shift() { return 4; }
97 static int32_t makeWord(NodeIndex nodeIndex
, UseKind useKind
)
99 ASSERT(static_cast<uint32_t>(((static_cast<int32_t>(nodeIndex
) << shift()) >> shift())) == nodeIndex
);
100 ASSERT(useKind
>= 0 && useKind
< LastUseKind
);
101 ASSERT(LastUseKind
<= (1 << shift()));
102 return (nodeIndex
<< shift()) | useKind
;
105 int32_t m_encodedWord
;
108 inline bool operator==(Edge nodeUse
, NodeIndex nodeIndex
)
110 return nodeUse
.indexUnchecked() == nodeIndex
;
112 inline bool operator==(NodeIndex nodeIndex
, Edge nodeUse
)
114 return nodeUse
.indexUnchecked() == nodeIndex
;
116 inline bool operator!=(Edge nodeUse
, NodeIndex nodeIndex
)
118 return nodeUse
.indexUnchecked() != nodeIndex
;
120 inline bool operator!=(NodeIndex nodeIndex
, Edge nodeUse
)
122 return nodeUse
.indexUnchecked() != nodeIndex
;
125 } } // namespace JSC::DFG
127 #endif // ENABLE(DFG_JIT)