1/*
2 * Copyright (C) 2016-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 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26// DO NO EDIT! - This file was generated by /home/user/data/webkitgtk-2.25.2/Source/JavaScriptCore/wasm/generateWasmOpsHeader.py
27
28#pragma once
29
30#if ENABLE(WEBASSEMBLY)
31
32#include <cstdint>
33
34namespace JSC { namespace Wasm {
35
36static constexpr unsigned expectedVersionNumber = 1;
37
38static constexpr unsigned numTypes = 8;
39
40#define FOR_EACH_WASM_TYPE(macro) \
41 macro(Anyfunc, -0x10, B3::Void, 0) \
42 macro(I32, -0x1, B3::Int32, 1) \
43 macro(Void, -0x40, B3::Void, 2) \
44 macro(I64, -0x2, B3::Int64, 3) \
45 macro(F32, -0x3, B3::Float, 4) \
46 macro(Func, -0x20, B3::Void, 5) \
47 macro(Anyref, -0x11, B3::Int64, 6) \
48 macro(F64, -0x4, B3::Double, 7)
49#define CREATE_ENUM_VALUE(name, id, b3type, inc) name = id,
50enum Type : int8_t {
51 FOR_EACH_WASM_TYPE(CREATE_ENUM_VALUE)
52};
53#undef CREATE_ENUM_VALUE
54
55#define CREATE_CASE(name, id, b3type, inc) case id: return true;
56template <typename Int>
57inline bool isValidType(Int i)
58{
59 switch (i) {
60 default: return false;
61 FOR_EACH_WASM_TYPE(CREATE_CASE)
62 }
63 RELEASE_ASSERT_NOT_REACHED();
64 return false;
65}
66#undef CREATE_CASE
67
68#define CREATE_CASE(name, id, b3type, inc) case name: return b3type;
69inline B3::Type toB3Type(Type type)
70{
71 switch (type) {
72 FOR_EACH_WASM_TYPE(CREATE_CASE)
73 }
74 RELEASE_ASSERT_NOT_REACHED();
75 return B3::Void;
76}
77#undef CREATE_CASE
78
79#define CREATE_CASE(name, id, b3type, inc) case name: return #name;
80inline const char* makeString(Type type)
81{
82 switch (type) {
83 FOR_EACH_WASM_TYPE(CREATE_CASE)
84 }
85 RELEASE_ASSERT_NOT_REACHED();
86 return nullptr;
87}
88#undef CREATE_CASE
89
90#define CREATE_CASE(name, id, b3type, inc) case id: return inc;
91inline int linearizeType(Type type)
92{
93 switch (type) {
94 FOR_EACH_WASM_TYPE(CREATE_CASE)
95 }
96 RELEASE_ASSERT_NOT_REACHED();
97 return 0;
98}
99#undef CREATE_CASE
100
101#define CREATE_CASE(name, id, b3type, inc) case inc: return name;
102inline Type linearizedToType(int i)
103{
104 switch (i) {
105 FOR_EACH_WASM_TYPE(CREATE_CASE)
106 }
107 RELEASE_ASSERT_NOT_REACHED();
108 return Void;
109}
110#undef CREATE_CASE
111
112
113#define FOR_EACH_WASM_SPECIAL_OP(macro) \
114 macro(F64Const, 0x44, Oops, 0) \
115 macro(RefNull, 0xd0, Oops, 1) \
116 macro(GrowMemory, 0x40, Oops, 2) \
117 macro(I64Const, 0x42, Oops, 3) \
118 macro(TeeLocal, 0x22, Oops, 4) \
119 macro(SetLocal, 0x21, Oops, 5) \
120 macro(I32Const, 0x41, Oops, 6) \
121 macro(CurrentMemory, 0x3f, Oops, 7) \
122 macro(F32Const, 0x43, Oops, 8) \
123 macro(SetGlobal, 0x24, Oops, 9) \
124 macro(GetGlobal, 0x23, Oops, 10) \
125 macro(Call, 0x10, Oops, 11) \
126 macro(TableSet, 0x26, Oops, 12) \
127 macro(TableGet, 0x25, Oops, 13) \
128 macro(RefIsNull, 0xd1, Oops, 14) \
129 macro(GetLocal, 0x20, Oops, 15) \
130 macro(CallIndirect, 0x11, Oops, 16)
131
132#define FOR_EACH_WASM_CONTROL_FLOW_OP(macro) \
133 macro(Return, 0xf, Oops, 0) \
134 macro(Nop, 0x1, Oops, 1) \
135 macro(Drop, 0x1a, Oops, 2) \
136 macro(BrIf, 0xd, Oops, 3) \
137 macro(Br, 0xc, Oops, 4) \
138 macro(Select, 0x1b, Oops, 5) \
139 macro(Unreachable, 0x0, Oops, 6) \
140 macro(Else, 0x5, Oops, 7) \
141 macro(BrTable, 0xe, Oops, 8) \
142 macro(Loop, 0x3, Oops, 9) \
143 macro(If, 0x4, Oops, 10) \
144 macro(End, 0xb, Oops, 11) \
145 macro(Block, 0x2, Oops, 12)
146
147#define FOR_EACH_WASM_SIMPLE_UNARY_OP(macro) \
148 macro(F32Ceil, 0x8d, Ceil, 0) \
149 macro(F32DemoteF64, 0xb6, DoubleToFloat, 1) \
150 macro(I32Clz, 0x67, Clz, 2) \
151 macro(F64ConvertUI32, 0xb8, IToD(ZExt32(@0)), 3) \
152 macro(F32ReinterpretI32, 0xbe, BitwiseCast, 4) \
153 macro(F32Sqrt, 0x91, Sqrt, 5) \
154 macro(I64Eqz, 0x50, Equal(i64(0), @0), 6) \
155 macro(I64Clz, 0x79, Clz, 7) \
156 macro(F32Neg, 0x8c, Neg, 8) \
157 macro(F64Abs, 0x99, Abs, 9) \
158 macro(F32ConvertSI64, 0xb4, IToF, 10) \
159 macro(F64ConvertSI32, 0xb7, IToD, 11) \
160 macro(F32ConvertUI32, 0xb3, IToF(ZExt32(@0)), 12) \
161 macro(F64Ceil, 0x9b, Ceil, 13) \
162 macro(F64Floor, 0x9c, Floor, 14) \
163 macro(F32Abs, 0x8b, Abs, 15) \
164 macro(I32ReinterpretF32, 0xbc, BitwiseCast, 16) \
165 macro(F64ConvertSI64, 0xb9, IToD, 17) \
166 macro(F64PromoteF32, 0xbb, FloatToDouble, 18) \
167 macro(I64ExtendUI32, 0xad, ZExt32, 19) \
168 macro(F64ReinterpretI64, 0xbf, BitwiseCast, 20) \
169 macro(F32Floor, 0x8e, Floor, 21) \
170 macro(F32ConvertSI32, 0xb2, IToF, 22) \
171 macro(I32Eqz, 0x45, Equal(i32(0), @0), 23) \
172 macro(I64ReinterpretF64, 0xbd, BitwiseCast, 24) \
173 macro(F64Sqrt, 0x9f, Sqrt, 25) \
174 macro(I32WrapI64, 0xa7, Trunc, 26) \
175 macro(I64ExtendSI32, 0xac, SExt32, 27) \
176 macro(F64Neg, 0x9a, Neg, 28)
177
178#define FOR_EACH_WASM_UNARY_OP(macro) \
179 FOR_EACH_WASM_SIMPLE_UNARY_OP(macro) \
180 macro(I64TruncSF32, 0xae, Oops, 0) \
181 macro(F32ConvertUI64, 0xb5, Oops, 1) \
182 macro(I32Ctz, 0x68, Oops, 2) \
183 macro(I32TruncSF64, 0xaa, Oops, 3) \
184 macro(I32TruncUF64, 0xab, Oops, 4) \
185 macro(I32Popcnt, 0x69, Oops, 5) \
186 macro(I64Popcnt, 0x7b, Oops, 6) \
187 macro(I64Ctz, 0x7a, Oops, 7) \
188 macro(I32TruncSF32, 0xa8, Oops, 8) \
189 macro(I64TruncUF64, 0xb1, Oops, 9) \
190 macro(I64TruncSF64, 0xb0, Oops, 10) \
191 macro(F64ConvertUI64, 0xba, Oops, 11) \
192 macro(F64Nearest, 0x9e, Oops, 12) \
193 macro(F64Trunc, 0x9d, Oops, 13) \
194 macro(F32Trunc, 0x8f, Oops, 14) \
195 macro(I32TruncUF32, 0xa9, Oops, 15) \
196 macro(I64TruncUF32, 0xaf, Oops, 16) \
197 macro(F32Nearest, 0x90, Oops, 17)
198
199#define FOR_EACH_WASM_SIMPLE_BINARY_OP(macro) \
200 macro(I64ShrS, 0x87, SShr(@0, Trunc(@1)), 0) \
201 macro(I32Mul, 0x6c, Mul, 1) \
202 macro(I32Sub, 0x6b, Sub, 2) \
203 macro(F64Le, 0x65, LessEqual, 3) \
204 macro(F32Min, 0x96, Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1)))), 4) \
205 macro(F64Ne, 0x62, NotEqual, 5) \
206 macro(F64Lt, 0x63, LessThan, 6) \
207 macro(F32Max, 0x97, Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1)))), 7) \
208 macro(F64Mul, 0xa2, Mul, 8) \
209 macro(F32Div, 0x95, Div, 9) \
210 macro(F32Copysign, 0x98, BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i32(0x80000000)), BitAnd(BitwiseCast(@0), i32(0x7fffffff)))), 10) \
211 macro(I64And, 0x83, BitAnd, 11) \
212 macro(F32Ne, 0x5c, NotEqual, 12) \
213 macro(F64Gt, 0x64, GreaterThan, 13) \
214 macro(F64Ge, 0x66, GreaterEqual, 14) \
215 macro(I64GtS, 0x55, GreaterThan, 15) \
216 macro(I64GtU, 0x56, Above, 16) \
217 macro(F64Div, 0xa3, Div, 17) \
218 macro(F32Add, 0x92, Add, 18) \
219 macro(I64Or, 0x84, BitOr, 19) \
220 macro(I32LeU, 0x4d, BelowEqual, 20) \
221 macro(I32LeS, 0x4c, LessEqual, 21) \
222 macro(I64Ne, 0x52, NotEqual, 22) \
223 macro(I32And, 0x71, BitAnd, 23) \
224 macro(I32LtU, 0x49, Below, 24) \
225 macro(I64Rotr, 0x8a, RotR(@0, Trunc(@1)), 25) \
226 macro(I32LtS, 0x48, LessThan, 26) \
227 macro(I32Eq, 0x46, Equal, 27) \
228 macro(F64Copysign, 0xa6, BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i64(0x8000000000000000)), BitAnd(BitwiseCast(@0), i64(0x7fffffffffffffff)))), 28) \
229 macro(I64Rotl, 0x89, RotL(@0, Trunc(@1)), 29) \
230 macro(F32Lt, 0x5d, LessThan, 30) \
231 macro(F64Eq, 0x61, Equal, 31) \
232 macro(F32Le, 0x5f, LessEqual, 32) \
233 macro(F32Ge, 0x60, GreaterEqual, 33) \
234 macro(I32ShrU, 0x76, ZShr, 34) \
235 macro(I32ShrS, 0x75, SShr, 35) \
236 macro(I32GeU, 0x4f, AboveEqual, 36) \
237 macro(I32GeS, 0x4e, GreaterEqual, 37) \
238 macro(I32Shl, 0x74, Shl, 38) \
239 macro(I32Xor, 0x73, BitXor, 39) \
240 macro(F64Min, 0xa4, Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1)))), 40) \
241 macro(F32Mul, 0x94, Mul, 41) \
242 macro(I64Sub, 0x7d, Sub, 42) \
243 macro(I32Add, 0x6a, Add, 43) \
244 macro(F64Sub, 0xa1, Sub, 44) \
245 macro(I32Or, 0x72, BitOr, 45) \
246 macro(I64LtU, 0x54, Below, 46) \
247 macro(I64LtS, 0x53, LessThan, 47) \
248 macro(I64Xor, 0x85, BitXor, 48) \
249 macro(I64GeU, 0x5a, AboveEqual, 49) \
250 macro(I64Mul, 0x7e, Mul, 50) \
251 macro(F32Sub, 0x93, Sub, 51) \
252 macro(F64Add, 0xa0, Add, 52) \
253 macro(I64GeS, 0x59, GreaterEqual, 53) \
254 macro(I32Ne, 0x47, NotEqual, 54) \
255 macro(F32Eq, 0x5b, Equal, 55) \
256 macro(I64Eq, 0x51, Equal, 56) \
257 macro(I64ShrU, 0x88, ZShr(@0, Trunc(@1)), 57) \
258 macro(I64Shl, 0x86, Shl(@0, Trunc(@1)), 58) \
259 macro(F32Gt, 0x5e, GreaterThan, 59) \
260 macro(I32Rotl, 0x77, RotL, 60) \
261 macro(I32Rotr, 0x78, RotR, 61) \
262 macro(I32GtU, 0x4b, Above, 62) \
263 macro(I32GtS, 0x4a, GreaterThan, 63) \
264 macro(F64Max, 0xa5, Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1)))), 64) \
265 macro(I64LeU, 0x58, BelowEqual, 65) \
266 macro(I64LeS, 0x57, LessEqual, 66) \
267 macro(I64Add, 0x7c, Add, 67)
268
269#define FOR_EACH_WASM_BINARY_OP(macro) \
270 FOR_EACH_WASM_SIMPLE_BINARY_OP(macro) \
271 macro(I32DivU, 0x6e, Oops, 0) \
272 macro(I32DivS, 0x6d, Oops, 1) \
273 macro(I32RemU, 0x70, Oops, 2) \
274 macro(I32RemS, 0x6f, Oops, 3) \
275 macro(I64RemS, 0x81, Oops, 4) \
276 macro(I64RemU, 0x82, Oops, 5) \
277 macro(I64DivU, 0x80, Oops, 6) \
278 macro(I64DivS, 0x7f, Oops, 7)
279
280#define FOR_EACH_WASM_MEMORY_LOAD_OP(macro) \
281 macro(I64Load32U, 0x35, Oops, 0) \
282 macro(I64Load32S, 0x34, Oops, 1) \
283 macro(I32Load16S, 0x2e, Oops, 2) \
284 macro(I32Load16U, 0x2f, Oops, 3) \
285 macro(I64Load, 0x29, Oops, 4) \
286 macro(F64Load, 0x2b, Oops, 5) \
287 macro(I32Load8S, 0x2c, Oops, 6) \
288 macro(I32Load8U, 0x2d, Oops, 7) \
289 macro(I32Load, 0x28, Oops, 8) \
290 macro(F32Load, 0x2a, Oops, 9) \
291 macro(I64Load8U, 0x31, Oops, 10) \
292 macro(I64Load8S, 0x30, Oops, 11) \
293 macro(I64Load16S, 0x32, Oops, 12) \
294 macro(I64Load16U, 0x33, Oops, 13)
295
296#define FOR_EACH_WASM_MEMORY_STORE_OP(macro) \
297 macro(I64Store16, 0x3d, Oops, 0) \
298 macro(I64Store8, 0x3c, Oops, 1) \
299 macro(I32Store, 0x36, Oops, 2) \
300 macro(I32Store16, 0x3b, Oops, 3) \
301 macro(F32Store, 0x38, Oops, 4) \
302 macro(I64Store, 0x37, Oops, 5) \
303 macro(F64Store, 0x39, Oops, 6) \
304 macro(I32Store8, 0x3a, Oops, 7) \
305 macro(I64Store32, 0x3e, Oops, 8)
306
307
308#define FOR_EACH_WASM_OP(macro) \
309 FOR_EACH_WASM_SPECIAL_OP(macro) \
310 FOR_EACH_WASM_CONTROL_FLOW_OP(macro) \
311 FOR_EACH_WASM_UNARY_OP(macro) \
312 FOR_EACH_WASM_BINARY_OP(macro) \
313 FOR_EACH_WASM_MEMORY_LOAD_OP(macro) \
314 FOR_EACH_WASM_MEMORY_STORE_OP(macro)
315
316#define CREATE_ENUM_VALUE(name, id, b3op, inc) name = id,
317
318enum OpType : uint8_t {
319 FOR_EACH_WASM_OP(CREATE_ENUM_VALUE)
320};
321
322template<typename Int>
323inline bool isValidOpType(Int i)
324{
325 // Bitset of valid ops.
326 static const uint8_t valid[] = { 0x3f, 0xf8, 0x3, 0xc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3 };
327 return 0 <= i && i <= 209 && (valid[i / 8] & (1 << (i % 8)));
328}
329
330enum class BinaryOpType : uint8_t {
331 FOR_EACH_WASM_BINARY_OP(CREATE_ENUM_VALUE)
332};
333
334enum class UnaryOpType : uint8_t {
335 FOR_EACH_WASM_UNARY_OP(CREATE_ENUM_VALUE)
336};
337
338enum class LoadOpType : uint8_t {
339 FOR_EACH_WASM_MEMORY_LOAD_OP(CREATE_ENUM_VALUE)
340};
341
342enum class StoreOpType : uint8_t {
343 FOR_EACH_WASM_MEMORY_STORE_OP(CREATE_ENUM_VALUE)
344};
345
346#undef CREATE_ENUM_VALUE
347
348inline bool isControlOp(OpType op)
349{
350 switch (op) {
351#define CREATE_CASE(name, id, b3op, inc) case OpType::name:
352 FOR_EACH_WASM_CONTROL_FLOW_OP(CREATE_CASE)
353 return true;
354#undef CREATE_CASE
355 default:
356 break;
357 }
358 return false;
359}
360
361inline bool isSimple(UnaryOpType op)
362{
363 switch (op) {
364#define CREATE_CASE(name, id, b3op, inc) case UnaryOpType::name:
365 FOR_EACH_WASM_SIMPLE_UNARY_OP(CREATE_CASE)
366 return true;
367#undef CREATE_CASE
368 default:
369 break;
370 }
371 return false;
372}
373
374inline bool isSimple(BinaryOpType op)
375{
376 switch (op) {
377#define CREATE_CASE(name, id, b3op, inc) case BinaryOpType::name:
378 FOR_EACH_WASM_SIMPLE_BINARY_OP(CREATE_CASE)
379 return true;
380#undef CREATE_CASE
381 default:
382 break;
383 }
384 return false;
385}
386
387inline uint32_t memoryLog2Alignment(OpType op)
388{
389 switch (op) {
390 case I64Load32U: return 2;
391 case I64Load32S: return 2;
392 case I32Load16S: return 1;
393 case I32Load16U: return 1;
394 case I64Load: return 3;
395 case F64Load: return 3;
396 case I32Load8S: return 0;
397 case I32Load8U: return 0;
398 case I32Load: return 2;
399 case F32Load: return 2;
400 case I64Load8U: return 0;
401 case I64Load8S: return 0;
402 case I64Load16S: return 1;
403 case I64Load16U: return 1;
404 case I64Store16: return 1;
405 case I64Store8: return 0;
406 case I32Store: return 2;
407 case I32Store16: return 1;
408 case F32Store: return 2;
409 case I64Store: return 3;
410 case F64Store: return 3;
411 case I32Store8: return 0;
412 case I64Store32: return 2;
413 default:
414 break;
415 }
416 RELEASE_ASSERT_NOT_REACHED();
417 return 0;
418}
419
420#define CREATE_CASE(name, id, b3type, inc) case name: return #name;
421inline const char* makeString(OpType op)
422{
423 switch (op) {
424 FOR_EACH_WASM_OP(CREATE_CASE)
425 }
426 RELEASE_ASSERT_NOT_REACHED();
427 return nullptr;
428}
429#undef CREATE_CASE
430
431} } // namespace JSC::Wasm
432
433#endif // ENABLE(WEBASSEMBLY)
434
435