[WTF] Import std::optional reference implementation as WTF::Optional
[WebKit-https.git] / Source / JavaScriptCore / b3 / B3Opcode.cpp
1 /*
2  * Copyright (C) 2015-2016 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 #include "config.h"
27 #include "B3Opcode.h"
28
29 #if ENABLE(B3_JIT)
30
31 #include <wtf/PrintStream.h>
32
33 namespace JSC { namespace B3 {
34
35 std::optional<Opcode> invertedCompare(Opcode opcode, Type type)
36 {
37     switch (opcode) {
38     case Equal:
39         return NotEqual;
40     case NotEqual:
41         return Equal;
42     case LessThan:
43         if (isInt(type))
44             return GreaterEqual;
45         return std::nullopt;
46     case GreaterThan:
47         if (isInt(type))
48             return LessEqual;
49         return std::nullopt;
50     case LessEqual:
51         if (isInt(type))
52             return GreaterThan;
53         return std::nullopt;
54     case GreaterEqual:
55         if (isInt(type))
56             return LessThan;
57         return std::nullopt;
58     case Above:
59         return BelowEqual;
60     case Below:
61         return AboveEqual;
62     case AboveEqual:
63         return Below;
64     case BelowEqual:
65         return Above;
66     default:
67         return std::nullopt;
68     }
69 }
70
71 } } // namespace JSC::B3
72
73 namespace WTF {
74
75 using namespace JSC::B3;
76
77 void printInternal(PrintStream& out, Opcode opcode)
78 {
79     switch (opcode) {
80     case Nop:
81         out.print("Nop");
82         return;
83     case Identity:
84         out.print("Identity");
85         return;
86     case Const32:
87         out.print("Const32");
88         return;
89     case Const64:
90         out.print("Const64");
91         return;
92     case ConstDouble:
93         out.print("ConstDouble");
94         return;
95     case ConstFloat:
96         out.print("ConstFloat");
97         return;
98     case Get:
99         out.print("Get");
100         return;
101     case Set:
102         out.print("Set");
103         return;
104     case SlotBase:
105         out.print("SlotBase");
106         return;
107     case ArgumentReg:
108         out.print("ArgumentReg");
109         return;
110     case FramePointer:
111         out.print("FramePointer");
112         return;
113     case Add:
114         out.print("Add");
115         return;
116     case Sub:
117         out.print("Sub");
118         return;
119     case Mul:
120         out.print("Mul");
121         return;
122     case Div:
123         out.print("Div");
124         return;
125     case UDiv:
126         out.print("UDiv");
127         return;
128     case Mod:
129         out.print("Mod");
130         return;
131     case UMod:
132         out.print("UMod");
133         return;
134     case Neg:
135         out.print("Neg");
136         return;
137     case BitAnd:
138         out.print("BitAnd");
139         return;
140     case BitOr:
141         out.print("BitOr");
142         return;
143     case BitXor:
144         out.print("BitXor");
145         return;
146     case Shl:
147         out.print("Shl");
148         return;
149     case SShr:
150         out.print("SShr");
151         return;
152     case ZShr:
153         out.print("ZShr");
154         return;
155     case RotR:
156         out.print("RotR");
157         return;
158     case RotL:
159         out.print("RotL");
160         return;
161     case Clz:
162         out.print("Clz");
163         return;
164     case Abs:
165         out.print("Abs");
166         return;
167     case Ceil:
168         out.print("Ceil");
169         return;
170     case Floor:
171         out.print("Floor");
172         return;
173     case Sqrt:
174         out.print("Sqrt");
175         return;
176     case BitwiseCast:
177         out.print("BitwiseCast");
178         return;
179     case SExt8:
180         out.print("SExt8");
181         return;
182     case SExt16:
183         out.print("SExt16");
184         return;
185     case SExt32:
186         out.print("SExt32");
187         return;
188     case ZExt32:
189         out.print("ZExt32");
190         return;
191     case Trunc:
192         out.print("Trunc");
193         return;
194     case IToD:
195         out.print("IToD");
196         return;
197     case IToF:
198         out.print("IToF");
199         return;
200     case FloatToDouble:
201         out.print("FloatToDouble");
202         return;
203     case DoubleToFloat:
204         out.print("DoubleToFloat");
205         return;
206     case Equal:
207         out.print("Equal");
208         return;
209     case NotEqual:
210         out.print("NotEqual");
211         return;
212     case LessThan:
213         out.print("LessThan");
214         return;
215     case GreaterThan:
216         out.print("GreaterThan");
217         return;
218     case LessEqual:
219         out.print("LessEqual");
220         return;
221     case GreaterEqual:
222         out.print("GreaterEqual");
223         return;
224     case Above:
225         out.print("Above");
226         return;
227     case Below:
228         out.print("Below");
229         return;
230     case AboveEqual:
231         out.print("AboveEqual");
232         return;
233     case BelowEqual:
234         out.print("BelowEqual");
235         return;
236     case EqualOrUnordered:
237         out.print("EqualOrUnordered");
238         return;
239     case Select:
240         out.print("Select");
241         return;
242     case Load8Z:
243         out.print("Load8Z");
244         return;
245     case Load8S:
246         out.print("Load8S");
247         return;
248     case Load16Z:
249         out.print("Load16Z");
250         return;
251     case Load16S:
252         out.print("Load16S");
253         return;
254     case Load:
255         out.print("Load");
256         return;
257     case Store8:
258         out.print("Store8");
259         return;
260     case Store16:
261         out.print("Store16");
262         return;
263     case Store:
264         out.print("Store");
265         return;
266     case WasmAddress:
267         out.print("WasmAddress");
268         return;
269     case Fence:
270         out.print("Fence");
271         return;
272     case CCall:
273         out.print("CCall");
274         return;
275     case Patchpoint:
276         out.print("Patchpoint");
277         return;
278     case CheckAdd:
279         out.print("CheckAdd");
280         return;
281     case CheckSub:
282         out.print("CheckSub");
283         return;
284     case CheckMul:
285         out.print("CheckMul");
286         return;
287     case Check:
288         out.print("Check");
289         return;
290     case WasmBoundsCheck:
291         out.print("WasmBoundsCheck");
292         return;
293     case Upsilon:
294         out.print("Upsilon");
295         return;
296     case Phi:
297         out.print("Phi");
298         return;
299     case Jump:
300         out.print("Jump");
301         return;
302     case Branch:
303         out.print("Branch");
304         return;
305     case Switch:
306         out.print("Switch");
307         return;
308     case EntrySwitch:
309         out.print("EntrySwitch");
310         return;
311     case Return:
312         out.print("Return");
313         return;
314     case Oops:
315         out.print("Oops");
316         return;
317     }
318     RELEASE_ASSERT_NOT_REACHED();
319 }
320
321 } // namespace WTF
322
323 #endif // ENABLE(B3_JIT)