1/*
2 * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
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.
12 *
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.
24 */
25
26#ifndef DFGUseKind_h
27#define DFGUseKind_h
28
29#if ENABLE(DFG_JIT)
30
31#include "DFGNodeFlags.h"
32#include "SpeculatedType.h"
33#include <wtf/PrintStream.h>
34
35namespace JSC { namespace DFG {
36
37enum UseKind {
38    UntypedUse,
39    Int32Use,
40    KnownInt32Use,
41    Int52RepUse,
42    MachineIntUse,
43    NumberUse,
44    DoubleRepUse,
45    DoubleRepRealUse,
46    DoubleRepMachineIntUse,
47    BooleanUse,
48    CellUse,
49    KnownCellUse,
50    ObjectUse,
51    FinalObjectUse,
52    ObjectOrOtherUse,
53    StringIdentUse,
54    StringUse,
55    KnownStringUse,
56    StringObjectUse,
57    StringOrStringObjectUse,
58    NotStringVarUse,
59    NotCellUse,
60    OtherUse,
61    MiscUse,
62    LastUseKind // Must always be the last entry in the enum, as it is used to denote the number of enum elements.
63};
64
65inline SpeculatedType typeFilterFor(UseKind useKind)
66{
67    switch (useKind) {
68    case UntypedUse:
69        return SpecFullTop;
70    case Int32Use:
71    case KnownInt32Use:
72        return SpecInt32;
73    case Int52RepUse:
74        return SpecMachineInt;
75    case MachineIntUse:
76        return SpecInt32 | SpecInt52AsDouble;
77    case NumberUse:
78        return SpecBytecodeNumber;
79    case DoubleRepUse:
80        return SpecFullDouble;
81    case DoubleRepRealUse:
82        return SpecDoubleReal;
83    case DoubleRepMachineIntUse:
84        return SpecInt52AsDouble;
85    case BooleanUse:
86        return SpecBoolean;
87    case CellUse:
88    case KnownCellUse:
89        return SpecCell;
90    case ObjectUse:
91        return SpecObject;
92    case FinalObjectUse:
93        return SpecFinalObject;
94    case ObjectOrOtherUse:
95        return SpecObject | SpecOther;
96    case StringIdentUse:
97        return SpecStringIdent;
98    case StringUse:
99    case KnownStringUse:
100        return SpecString;
101    case StringObjectUse:
102        return SpecStringObject;
103    case StringOrStringObjectUse:
104        return SpecString | SpecStringObject;
105    case NotStringVarUse:
106        return ~SpecStringVar;
107    case NotCellUse:
108        return ~SpecCell;
109    case OtherUse:
110        return SpecOther;
111    case MiscUse:
112        return SpecMisc;
113    default:
114        RELEASE_ASSERT_NOT_REACHED();
115        return SpecFullTop;
116    }
117}
118
119inline bool shouldNotHaveTypeCheck(UseKind kind)
120{
121    switch (kind) {
122    case UntypedUse:
123    case KnownInt32Use:
124    case KnownCellUse:
125    case KnownStringUse:
126    case Int52RepUse:
127    case DoubleRepUse:
128        return true;
129    default:
130        return false;
131    }
132}
133
134inline bool mayHaveTypeCheck(UseKind kind)
135{
136    return !shouldNotHaveTypeCheck(kind);
137}
138
139inline bool isNumerical(UseKind kind)
140{
141    switch (kind) {
142    case Int32Use:
143    case KnownInt32Use:
144    case NumberUse:
145    case Int52RepUse:
146    case DoubleRepUse:
147    case DoubleRepRealUse:
148    case MachineIntUse:
149    case DoubleRepMachineIntUse:
150        return true;
151    default:
152        return false;
153    }
154}
155
156inline bool isDouble(UseKind kind)
157{
158    switch (kind) {
159    case DoubleRepUse:
160    case DoubleRepRealUse:
161    case DoubleRepMachineIntUse:
162        return true;
163    default:
164        return false;
165    }
166}
167
168inline bool isCell(UseKind kind)
169{
170    switch (kind) {
171    case CellUse:
172    case KnownCellUse:
173    case ObjectUse:
174    case FinalObjectUse:
175    case StringIdentUse:
176    case StringUse:
177    case KnownStringUse:
178    case StringObjectUse:
179    case StringOrStringObjectUse:
180        return true;
181    default:
182        return false;
183    }
184}
185
186// Returns true if it uses structure in a way that could be clobbered by
187// things that change the structure.
188inline bool usesStructure(UseKind kind)
189{
190    switch (kind) {
191    case StringObjectUse:
192    case StringOrStringObjectUse:
193        return true;
194    default:
195        return false;
196    }
197}
198
199inline UseKind useKindForResult(NodeFlags result)
200{
201    ASSERT(!(result & ~NodeResultMask));
202    switch (result) {
203    case NodeResultInt52:
204        return Int52RepUse;
205    case NodeResultDouble:
206        return DoubleRepUse;
207    default:
208        return UntypedUse;
209    }
210}
211
212} } // namespace JSC::DFG
213
214namespace WTF {
215
216void printInternal(PrintStream&, JSC::DFG::UseKind);
217
218} // namespace WTF
219
220#endif // ENABLE(DFG_JIT)
221
222#endif // DFGUseKind_h
223
224