/ b3 / B3Opcode.cpp
B3Opcode.cpp
  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_ENABLED
 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 (type.isInt())
 48              return GreaterEqual;
 49          return WTF::nullopt;
 50      case GreaterThan:
 51          if (type.isInt())
 52              return LessEqual;
 53          return WTF::nullopt;
 54      case LessEqual:
 55          if (type.isInt())
 56              return GreaterThan;
 57          return WTF::nullopt;
 58      case GreaterEqual:
 59          if (type.isInt())
 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 BottomTuple:
124          out.print("BottomTuple");
125          return;
126      case Get:
127          out.print("Get");
128          return;
129      case Set:
130          out.print("Set");
131          return;
132      case SlotBase:
133          out.print("SlotBase");
134          return;
135      case ArgumentReg:
136          out.print("ArgumentReg");
137          return;
138      case FramePointer:
139          out.print("FramePointer");
140          return;
141      case Add:
142          out.print("Add");
143          return;
144      case Sub:
145          out.print("Sub");
146          return;
147      case Mul:
148          out.print("Mul");
149          return;
150      case Div:
151          out.print("Div");
152          return;
153      case UDiv:
154          out.print("UDiv");
155          return;
156      case Mod:
157          out.print("Mod");
158          return;
159      case UMod:
160          out.print("UMod");
161          return;
162      case Neg:
163          out.print("Neg");
164          return;
165      case BitAnd:
166          out.print("BitAnd");
167          return;
168      case BitOr:
169          out.print("BitOr");
170          return;
171      case BitXor:
172          out.print("BitXor");
173          return;
174      case Shl:
175          out.print("Shl");
176          return;
177      case SShr:
178          out.print("SShr");
179          return;
180      case ZShr:
181          out.print("ZShr");
182          return;
183      case RotR:
184          out.print("RotR");
185          return;
186      case RotL:
187          out.print("RotL");
188          return;
189      case Clz:
190          out.print("Clz");
191          return;
192      case Abs:
193          out.print("Abs");
194          return;
195      case Ceil:
196          out.print("Ceil");
197          return;
198      case Floor:
199          out.print("Floor");
200          return;
201      case Sqrt:
202          out.print("Sqrt");
203          return;
204      case BitwiseCast:
205          out.print("BitwiseCast");
206          return;
207      case SExt8:
208          out.print("SExt8");
209          return;
210      case SExt16:
211          out.print("SExt16");
212          return;
213      case SExt32:
214          out.print("SExt32");
215          return;
216      case ZExt32:
217          out.print("ZExt32");
218          return;
219      case Trunc:
220          out.print("Trunc");
221          return;
222      case IToD:
223          out.print("IToD");
224          return;
225      case IToF:
226          out.print("IToF");
227          return;
228      case FloatToDouble:
229          out.print("FloatToDouble");
230          return;
231      case DoubleToFloat:
232          out.print("DoubleToFloat");
233          return;
234      case Equal:
235          out.print("Equal");
236          return;
237      case NotEqual:
238          out.print("NotEqual");
239          return;
240      case LessThan:
241          out.print("LessThan");
242          return;
243      case GreaterThan:
244          out.print("GreaterThan");
245          return;
246      case LessEqual:
247          out.print("LessEqual");
248          return;
249      case GreaterEqual:
250          out.print("GreaterEqual");
251          return;
252      case Above:
253          out.print("Above");
254          return;
255      case Below:
256          out.print("Below");
257          return;
258      case AboveEqual:
259          out.print("AboveEqual");
260          return;
261      case BelowEqual:
262          out.print("BelowEqual");
263          return;
264      case EqualOrUnordered:
265          out.print("EqualOrUnordered");
266          return;
267      case Select:
268          out.print("Select");
269          return;
270      case Load8Z:
271          out.print("Load8Z");
272          return;
273      case Load8S:
274          out.print("Load8S");
275          return;
276      case Load16Z:
277          out.print("Load16Z");
278          return;
279      case Load16S:
280          out.print("Load16S");
281          return;
282      case Load:
283          out.print("Load");
284          return;
285      case Store8:
286          out.print("Store8");
287          return;
288      case Store16:
289          out.print("Store16");
290          return;
291      case Store:
292          out.print("Store");
293          return;
294      case AtomicWeakCAS:
295          out.print("AtomicWeakCAS");
296          return;
297      case AtomicStrongCAS:
298          out.print("AtomicStrongCAS");
299          return;
300      case AtomicXchgAdd:
301          out.print("AtomicXchgAdd");
302          return;
303      case AtomicXchgAnd:
304          out.print("AtomicXchgAnd");
305          return;
306      case AtomicXchgOr:
307          out.print("AtomicXchgOr");
308          return;
309      case AtomicXchgSub:
310          out.print("AtomicXchgSub");
311          return;
312      case AtomicXchgXor:
313          out.print("AtomicXchgXor");
314          return;
315      case AtomicXchg:
316          out.print("AtomicXchg");
317          return;
318      case Depend:
319          out.print("Depend");
320          return;
321      case WasmAddress:
322          out.print("WasmAddress");
323          return;
324      case Fence:
325          out.print("Fence");
326          return;
327      case CCall:
328          out.print("CCall");
329          return;
330      case Patchpoint:
331          out.print("Patchpoint");
332          return;
333      case Extract:
334          out.print("Extract");
335          return;
336      case CheckAdd:
337          out.print("CheckAdd");
338          return;
339      case CheckSub:
340          out.print("CheckSub");
341          return;
342      case CheckMul:
343          out.print("CheckMul");
344          return;
345      case Check:
346          out.print("Check");
347          return;
348      case WasmBoundsCheck:
349          out.print("WasmBoundsCheck");
350          return;
351      case Upsilon:
352          out.print("Upsilon");
353          return;
354      case Phi:
355          out.print("Phi");
356          return;
357      case Jump:
358          out.print("Jump");
359          return;
360      case Branch:
361          out.print("Branch");
362          return;
363      case Switch:
364          out.print("Switch");
365          return;
366      case EntrySwitch:
367          out.print("EntrySwitch");
368          return;
369      case Return:
370          out.print("Return");
371          return;
372      case Oops:
373          out.print("Oops");
374          return;
375      }
376      RELEASE_ASSERT_NOT_REACHED();
377  }
378  
379  } // namespace WTF
380  
381  #if !ASSERT_ENABLED
382  IGNORE_RETURN_TYPE_WARNINGS_END
383  #endif
384  
385  #endif // ENABLE(B3_JIT)