1/*
2 * Copyright (C) 2015 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#pragma once
27
28#if ENABLE(JIT)
29
30#include "ResultType.h"
31
32namespace JSC {
33
34class SnippetOperand {
35 enum ConstOrVarType {
36 Variable,
37 ConstInt32,
38 ConstDouble
39 };
40
41public:
42 SnippetOperand()
43 : m_resultType(ResultType::unknownType())
44 { }
45
46 SnippetOperand(ResultType resultType)
47 : m_resultType(resultType)
48 { }
49
50 bool mightBeNumber() const { return m_resultType.mightBeNumber(); }
51 bool definitelyIsNumber() const { return m_resultType.definitelyIsNumber(); }
52
53 bool isConst() const { return m_type != Variable; }
54 bool isConstInt32() const { return m_type == ConstInt32; }
55 bool isConstDouble() const { return m_type == ConstDouble; }
56 bool isPositiveConstInt32() const { return isConstInt32() && asConstInt32() > 0; }
57
58 int64_t asRawBits() const { return m_val.rawBits; }
59
60 int32_t asConstInt32() const
61 {
62 ASSERT(m_type == ConstInt32);
63 return m_val.int32Val;
64 }
65
66 double asConstDouble() const
67 {
68 ASSERT(m_type == ConstDouble);
69 return m_val.doubleVal;
70 }
71
72 double asConstNumber() const
73 {
74 if (isConstInt32())
75 return asConstInt32();
76 ASSERT(isConstDouble());
77 return asConstDouble();
78 }
79
80 void setConstInt32(int32_t value)
81 {
82 m_type = ConstInt32;
83 m_val.int32Val = value;
84 }
85
86 void setConstDouble(double value)
87 {
88 m_type = ConstDouble;
89 m_val.doubleVal = value;
90 }
91
92private:
93 ResultType m_resultType;
94 ConstOrVarType m_type { Variable };
95 union {
96 int32_t int32Val;
97 double doubleVal;
98 int64_t rawBits;
99 } m_val;
100};
101
102} // namespace JSC
103
104#endif // ENABLE(JIT)
105