1 | /* |
2 | * Copyright (C) 2015-2017 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 | #if ASSERT_DISABLED |
34 | IGNORE_RETURN_TYPE_WARNINGS_BEGIN |
35 | #endif |
36 | |
37 | namespace JSC { namespace B3 { |
38 | |
39 | Optional<Opcode> invertedCompare(Opcode opcode, Type type) |
40 | { |
41 | switch (opcode) { |
42 | case Equal: |
43 | return NotEqual; |
44 | case NotEqual: |
45 | return Equal; |
46 | case LessThan: |
47 | if (isInt(type)) |
48 | return GreaterEqual; |
49 | return WTF::nullopt; |
50 | case GreaterThan: |
51 | if (isInt(type)) |
52 | return LessEqual; |
53 | return WTF::nullopt; |
54 | case LessEqual: |
55 | if (isInt(type)) |
56 | return GreaterThan; |
57 | return WTF::nullopt; |
58 | case GreaterEqual: |
59 | if (isInt(type)) |
60 | return LessThan; |
61 | return WTF::nullopt; |
62 | case Above: |
63 | return BelowEqual; |
64 | case Below: |
65 | return AboveEqual; |
66 | case AboveEqual: |
67 | return Below; |
68 | case BelowEqual: |
69 | return Above; |
70 | default: |
71 | return WTF::nullopt; |
72 | } |
73 | } |
74 | |
75 | Opcode storeOpcode(Bank bank, Width width) |
76 | { |
77 | switch (bank) { |
78 | case GP: |
79 | switch (width) { |
80 | case Width8: |
81 | return Store8; |
82 | case Width16: |
83 | return Store16; |
84 | default: |
85 | return Store; |
86 | } |
87 | case FP: |
88 | return Store; |
89 | } |
90 | ASSERT_NOT_REACHED(); |
91 | } |
92 | |
93 | } } // namespace JSC::B3 |
94 | |
95 | namespace WTF { |
96 | |
97 | using namespace JSC::B3; |
98 | |
99 | void printInternal(PrintStream& out, Opcode opcode) |
100 | { |
101 | switch (opcode) { |
102 | case Nop: |
103 | out.print("Nop" ); |
104 | return; |
105 | case Identity: |
106 | out.print("Identity" ); |
107 | return; |
108 | case Opaque: |
109 | out.print("Opaque" ); |
110 | return; |
111 | case Const32: |
112 | out.print("Const32" ); |
113 | return; |
114 | case Const64: |
115 | out.print("Const64" ); |
116 | return; |
117 | case ConstDouble: |
118 | out.print("ConstDouble" ); |
119 | return; |
120 | case ConstFloat: |
121 | out.print("ConstFloat" ); |
122 | return; |
123 | case Get: |
124 | out.print("Get" ); |
125 | return; |
126 | case Set: |
127 | out.print("Set" ); |
128 | return; |
129 | case SlotBase: |
130 | out.print("SlotBase" ); |
131 | return; |
132 | case ArgumentReg: |
133 | out.print("ArgumentReg" ); |
134 | return; |
135 | case FramePointer: |
136 | out.print("FramePointer" ); |
137 | return; |
138 | case Add: |
139 | out.print("Add" ); |
140 | return; |
141 | case Sub: |
142 | out.print("Sub" ); |
143 | return; |
144 | case Mul: |
145 | out.print("Mul" ); |
146 | return; |
147 | case Div: |
148 | out.print("Div" ); |
149 | return; |
150 | case UDiv: |
151 | out.print("UDiv" ); |
152 | return; |
153 | case Mod: |
154 | out.print("Mod" ); |
155 | return; |
156 | case UMod: |
157 | out.print("UMod" ); |
158 | return; |
159 | case Neg: |
160 | out.print("Neg" ); |
161 | return; |
162 | case BitAnd: |
163 | out.print("BitAnd" ); |
164 | return; |
165 | case BitOr: |
166 | out.print("BitOr" ); |
167 | return; |
168 | case BitXor: |
169 | out.print("BitXor" ); |
170 | return; |
171 | case Shl: |
172 | out.print("Shl" ); |
173 | return; |
174 | case SShr: |
175 | out.print("SShr" ); |
176 | return; |
177 | case ZShr: |
178 | out.print("ZShr" ); |
179 | return; |
180 | case RotR: |
181 | out.print("RotR" ); |
182 | return; |
183 | case RotL: |
184 | out.print("RotL" ); |
185 | return; |
186 | case Clz: |
187 | out.print("Clz" ); |
188 | return; |
189 | case Abs: |
190 | out.print("Abs" ); |
191 | return; |
192 | case Ceil: |
193 | out.print("Ceil" ); |
194 | return; |
195 | case Floor: |
196 | out.print("Floor" ); |
197 | return; |
198 | case Sqrt: |
199 | out.print("Sqrt" ); |
200 | return; |
201 | case BitwiseCast: |
202 | out.print("BitwiseCast" ); |
203 | return; |
204 | case SExt8: |
205 | out.print("SExt8" ); |
206 | return; |
207 | case SExt16: |
208 | out.print("SExt16" ); |
209 | return; |
210 | case SExt32: |
211 | out.print("SExt32" ); |
212 | return; |
213 | case ZExt32: |
214 | out.print("ZExt32" ); |
215 | return; |
216 | case Trunc: |
217 | out.print("Trunc" ); |
218 | return; |
219 | case IToD: |
220 | out.print("IToD" ); |
221 | return; |
222 | case IToF: |
223 | out.print("IToF" ); |
224 | return; |
225 | case FloatToDouble: |
226 | out.print("FloatToDouble" ); |
227 | return; |
228 | case DoubleToFloat: |
229 | out.print("DoubleToFloat" ); |
230 | return; |
231 | case Equal: |
232 | out.print("Equal" ); |
233 | return; |
234 | case NotEqual: |
235 | out.print("NotEqual" ); |
236 | return; |
237 | case LessThan: |
238 | out.print("LessThan" ); |
239 | return; |
240 | case GreaterThan: |
241 | out.print("GreaterThan" ); |
242 | return; |
243 | case LessEqual: |
244 | out.print("LessEqual" ); |
245 | return; |
246 | case GreaterEqual: |
247 | out.print("GreaterEqual" ); |
248 | return; |
249 | case Above: |
250 | out.print("Above" ); |
251 | return; |
252 | case Below: |
253 | out.print("Below" ); |
254 | return; |
255 | case AboveEqual: |
256 | out.print("AboveEqual" ); |
257 | return; |
258 | case BelowEqual: |
259 | out.print("BelowEqual" ); |
260 | return; |
261 | case EqualOrUnordered: |
262 | out.print("EqualOrUnordered" ); |
263 | return; |
264 | case Select: |
265 | out.print("Select" ); |
266 | return; |
267 | case Load8Z: |
268 | out.print("Load8Z" ); |
269 | return; |
270 | case Load8S: |
271 | out.print("Load8S" ); |
272 | return; |
273 | case Load16Z: |
274 | out.print("Load16Z" ); |
275 | return; |
276 | case Load16S: |
277 | out.print("Load16S" ); |
278 | return; |
279 | case Load: |
280 | out.print("Load" ); |
281 | return; |
282 | case Store8: |
283 | out.print("Store8" ); |
284 | return; |
285 | case Store16: |
286 | out.print("Store16" ); |
287 | return; |
288 | case Store: |
289 | out.print("Store" ); |
290 | return; |
291 | case AtomicWeakCAS: |
292 | out.print("AtomicWeakCAS" ); |
293 | return; |
294 | case AtomicStrongCAS: |
295 | out.print("AtomicStrongCAS" ); |
296 | return; |
297 | case AtomicXchgAdd: |
298 | out.print("AtomicXchgAdd" ); |
299 | return; |
300 | case AtomicXchgAnd: |
301 | out.print("AtomicXchgAnd" ); |
302 | return; |
303 | case AtomicXchgOr: |
304 | out.print("AtomicXchgOr" ); |
305 | return; |
306 | case AtomicXchgSub: |
307 | out.print("AtomicXchgSub" ); |
308 | return; |
309 | case AtomicXchgXor: |
310 | out.print("AtomicXchgXor" ); |
311 | return; |
312 | case AtomicXchg: |
313 | out.print("AtomicXchg" ); |
314 | return; |
315 | case Depend: |
316 | out.print("Depend" ); |
317 | return; |
318 | case WasmAddress: |
319 | out.print("WasmAddress" ); |
320 | return; |
321 | case Fence: |
322 | out.print("Fence" ); |
323 | return; |
324 | case CCall: |
325 | out.print("CCall" ); |
326 | return; |
327 | case Patchpoint: |
328 | out.print("Patchpoint" ); |
329 | return; |
330 | case CheckAdd: |
331 | out.print("CheckAdd" ); |
332 | return; |
333 | case CheckSub: |
334 | out.print("CheckSub" ); |
335 | return; |
336 | case CheckMul: |
337 | out.print("CheckMul" ); |
338 | return; |
339 | case Check: |
340 | out.print("Check" ); |
341 | return; |
342 | case WasmBoundsCheck: |
343 | out.print("WasmBoundsCheck" ); |
344 | return; |
345 | case Upsilon: |
346 | out.print("Upsilon" ); |
347 | return; |
348 | case Phi: |
349 | out.print("Phi" ); |
350 | return; |
351 | case Jump: |
352 | out.print("Jump" ); |
353 | return; |
354 | case Branch: |
355 | out.print("Branch" ); |
356 | return; |
357 | case Switch: |
358 | out.print("Switch" ); |
359 | return; |
360 | case EntrySwitch: |
361 | out.print("EntrySwitch" ); |
362 | return; |
363 | case Return: |
364 | out.print("Return" ); |
365 | return; |
366 | case Oops: |
367 | out.print("Oops" ); |
368 | return; |
369 | } |
370 | RELEASE_ASSERT_NOT_REACHED(); |
371 | } |
372 | |
373 | } // namespace WTF |
374 | |
375 | #if ASSERT_DISABLED |
376 | IGNORE_RETURN_TYPE_WARNINGS_END |
377 | #endif |
378 | |
379 | #endif // ENABLE(B3_JIT) |
380 | |