1/*
2 * Copyright (C) 2013 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#include <wtf/Platform.h>
30
31#if ENABLE(DFG_JIT)
32
33#include "SpeculatedType.h"
34#include <wtf/PrintStream.h>
35
36namespace JSC { namespace DFG {
37
38enum UseKind {
39    UntypedUse,
40    Int32Use,
41    KnownInt32Use,
42    RealNumberUse,
43    NumberUse,
44    KnownNumberUse,
45    BooleanUse,
46    CellUse,
47    KnownCellUse,
48    ObjectUse,
49    ObjectOrOtherUse,
50    StringUse,
51    KnownStringUse,
52    StringObjectUse,
53    StringOrStringObjectUse,
54    NotCellUse,
55    OtherUse,
56    LastUseKind // Must always be the last entry in the enum, as it is used to denote the number of enum elements.
57};
58
59ALWAYS_INLINE SpeculatedType typeFilterFor(UseKind useKind)
60{
61    switch (useKind) {
62    case UntypedUse:
63        return SpecEmptyOrTop; // TOP isn't good enough; untyped uses may use the normally unseen empty value, in the case of lazy registers.
64    case Int32Use:
65    case KnownInt32Use:
66        return SpecInt32;
67    case RealNumberUse:
68        return SpecRealNumber;
69    case NumberUse:
70    case KnownNumberUse:
71        return SpecNumber;
72    case BooleanUse:
73        return SpecBoolean;
74    case CellUse:
75    case KnownCellUse:
76        return SpecCell;
77    case ObjectUse:
78        return SpecObject;
79    case ObjectOrOtherUse:
80        return SpecObject | SpecOther;
81    case StringUse:
82    case KnownStringUse:
83        return SpecString;
84    case StringObjectUse:
85        return SpecStringObject;
86    case StringOrStringObjectUse:
87        return SpecString | SpecStringObject;
88    case NotCellUse:
89        return ~SpecCell;
90    case OtherUse:
91        return SpecOther;
92    default:
93        RELEASE_ASSERT_NOT_REACHED();
94        return SpecTop;
95    }
96}
97
98ALWAYS_INLINE bool isNumerical(UseKind kind)
99{
100    switch (kind) {
101    case Int32Use:
102    case KnownInt32Use:
103    case RealNumberUse:
104    case NumberUse:
105        return true;
106    default:
107        return false;
108    }
109}
110
111} } // namespace JSC::DFG
112
113namespace WTF {
114
115void printInternal(PrintStream&, JSC::DFG::UseKind);
116
117} // namespace WTF
118
119#endif // ENABLE(DFG_JIT)
120
121#endif // DFGUseKind_h
122
123