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/dima/wk/webkit/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(I32, -0x1, B3::Int32, 0) \
42 macro(Void, -0x40, B3::Void, 1) \
43 macro(I64, -0x2, B3::Int64, 2) \
44 macro(F32, -0x3, B3::Float, 3) \
45 macro(Func, -0x20, B3::Void, 4) \
46 macro(Anyref, -0x11, B3::Int64, 5) \
47 macro(Funcref, -0x10, 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(RefFunc, 0xd2, Oops, 2) \
117 macro(GrowMemory, 0x40, Oops, 3) \
118 macro(I64Const, 0x42, Oops, 4) \
119 macro(TeeLocal, 0x22, Oops, 5) \
120 macro(SetLocal, 0x21, Oops, 6) \
121 macro(I32Const, 0x41, Oops, 7) \
122 macro(CurrentMemory, 0x3f, Oops, 8) \
123 macro(F32Const, 0x43, Oops, 9) \
124 macro(SetGlobal, 0x24, Oops, 10) \
125 macro(GetGlobal, 0x23, Oops, 11) \
126 macro(Call, 0x10, Oops, 12) \
127 macro(TableSet, 0x26, Oops, 13) \
128 macro(TableGet, 0x25, Oops, 14) \
129 macro(RefIsNull, 0xd1, Oops, 15) \
130 macro(GetLocal, 0x20, Oops, 16) \
131 macro(CallIndirect, 0x11, Oops, 17)
132
133#define FOR_EACH_WASM_CONTROL_FLOW_OP(macro) \
134 macro(Return, 0xf, Oops, 0) \
135 macro(Nop, 0x1, Oops, 1) \
136 macro(Drop, 0x1a, Oops, 2) \
137 macro(BrIf, 0xd, Oops, 3) \
138 macro(Br, 0xc, Oops, 4) \
139 macro(Select, 0x1b, Oops, 5) \
140 macro(Unreachable, 0x0, Oops, 6) \
141 macro(Else, 0x5, Oops, 7) \
142 macro(BrTable, 0xe, Oops, 8) \
143 macro(Loop, 0x3, Oops, 9) \
144 macro(If, 0x4, Oops, 10) \
145 macro(End, 0xb, Oops, 11) \
146 macro(Block, 0x2, Oops, 12)
147
148#define FOR_EACH_WASM_SIMPLE_UNARY_OP(macro) \
149 macro(F32Ceil, 0x8d, Ceil, 0) \
150 macro(F32DemoteF64, 0xb6, DoubleToFloat, 1) \
151 macro(I32Clz, 0x67, Clz, 2) \
152 macro(F64ConvertUI32, 0xb8, IToD(ZExt32(@0)), 3) \
153 macro(F32ReinterpretI32, 0xbe, BitwiseCast, 4) \
154 macro(F32Sqrt, 0x91, Sqrt, 5) \
155 macro(I64Eqz, 0x50, Equal(i64(0), @0), 6) \
156 macro(I64Clz, 0x79, Clz, 7) \
157 macro(F32Neg, 0x8c, Neg, 8) \
158 macro(F64Abs, 0x99, Abs, 9) \
159 macro(F32ConvertSI64, 0xb4, IToF, 10) \
160 macro(F64ConvertSI32, 0xb7, IToD, 11) \
161 macro(F32ConvertUI32, 0xb3, IToF(ZExt32(@0)), 12) \
162 macro(F64Ceil, 0x9b, Ceil, 13) \
163 macro(F64Floor, 0x9c, Floor, 14) \
164 macro(F32Abs, 0x8b, Abs, 15) \
165 macro(I32ReinterpretF32, 0xbc, BitwiseCast, 16) \
166 macro(F64ConvertSI64, 0xb9, IToD, 17) \
167 macro(F64PromoteF32, 0xbb, FloatToDouble, 18) \
168 macro(I64ExtendUI32, 0xad, ZExt32, 19) \
169 macro(F64ReinterpretI64, 0xbf, BitwiseCast, 20) \
170 macro(F32Floor, 0x8e, Floor, 21) \
171 macro(F32ConvertSI32, 0xb2, IToF, 22) \
172 macro(I32Eqz, 0x45, Equal(i32(0), @0), 23) \
173 macro(I64ReinterpretF64, 0xbd, BitwiseCast, 24) \
174 macro(F64Sqrt, 0x9f, Sqrt, 25) \
175 macro(I32WrapI64, 0xa7, Trunc, 26) \
176 macro(I64ExtendSI32, 0xac, SExt32, 27) \
177 macro(F64Neg, 0x9a, Neg, 28)
178
179#define FOR_EACH_WASM_UNARY_OP(macro) \
180 FOR_EACH_WASM_SIMPLE_UNARY_OP(macro) \
181 macro(I64TruncSF32, 0xae, Oops, 0) \
182 macro(F32ConvertUI64, 0xb5, Oops, 1) \
183 macro(I32Ctz, 0x68, Oops, 2) \
184 macro(I32TruncSF64, 0xaa, Oops, 3) \
185 macro(I32TruncUF64, 0xab, Oops, 4) \
186 macro(I32Popcnt, 0x69, Oops, 5) \
187 macro(I64Popcnt, 0x7b, Oops, 6) \
188 macro(I64Ctz, 0x7a, Oops, 7) \
189 macro(I32TruncSF32, 0xa8, Oops, 8) \
190 macro(I64TruncUF64, 0xb1, Oops, 9) \
191 macro(I64TruncSF64, 0xb0, Oops, 10) \
192 macro(F64ConvertUI64, 0xba, Oops, 11) \
193 macro(F64Nearest, 0x9e, Oops, 12) \
194 macro(F64Trunc, 0x9d, Oops, 13) \
195 macro(F32Trunc, 0x8f, Oops, 14) \
196 macro(I32TruncUF32, 0xa9, Oops, 15) \
197 macro(I64TruncUF32, 0xaf, Oops, 16) \
198 macro(F32Nearest, 0x90, Oops, 17)
199
200#define FOR_EACH_WASM_SIMPLE_BINARY_OP(macro) \
201 macro(I64ShrS, 0x87, SShr(@0, Trunc(@1)), 0) \
202 macro(I32Mul, 0x6c, Mul, 1) \
203 macro(I32Sub, 0x6b, Sub, 2) \
204 macro(F64Le, 0x65, LessEqual, 3) \
205 macro(F64Ne, 0x62, NotEqual, 4) \
206 macro(F64Lt, 0x63, LessThan, 5) \
207 macro(F32Max, 0x97, Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1)))), 6) \
208 macro(F64Mul, 0xa2, Mul, 7) \
209 macro(F32Div, 0x95, Div, 8) \
210 macro(F32Copysign, 0x98, BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i32(0x80000000)), BitAnd(BitwiseCast(@0), i32(0x7fffffff)))), 9) \
211 macro(I64And, 0x83, BitAnd, 10) \
212 macro(F32Ne, 0x5c, NotEqual, 11) \
213 macro(F64Gt, 0x64, GreaterThan, 12) \
214 macro(F64Ge, 0x66, GreaterEqual, 13) \
215 macro(I64GtS, 0x55, GreaterThan, 14) \
216 macro(I64GtU, 0x56, Above, 15) \
217 macro(F64Div, 0xa3, Div, 16) \
218 macro(F32Add, 0x92, Add, 17) \
219 macro(I64Or, 0x84, BitOr, 18) \
220 macro(I32LeU, 0x4d, BelowEqual, 19) \
221 macro(I32LeS, 0x4c, LessEqual, 20) \
222 macro(I64Ne, 0x52, NotEqual, 21) \
223 macro(I32And, 0x71, BitAnd, 22) \
224 macro(I32LtU, 0x49, Below, 23) \
225 macro(I64Rotr, 0x8a, RotR(@0, Trunc(@1)), 24) \
226 macro(I32LtS, 0x48, LessThan, 25) \
227 macro(I32Eq, 0x46, Equal, 26) \
228 macro(F64Copysign, 0xa6, BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i64(0x8000000000000000)), BitAnd(BitwiseCast(@0), i64(0x7fffffffffffffff)))), 27) \
229 macro(I64Rotl, 0x89, RotL(@0, Trunc(@1)), 28) \
230 macro(F32Lt, 0x5d, LessThan, 29) \
231 macro(F64Eq, 0x61, Equal, 30) \
232 macro(F32Le, 0x5f, LessEqual, 31) \
233 macro(F32Ge, 0x60, GreaterEqual, 32) \
234 macro(I32ShrU, 0x76, ZShr, 33) \
235 macro(I32ShrS, 0x75, SShr, 34) \
236 macro(I32GeU, 0x4f, AboveEqual, 35) \
237 macro(I32GeS, 0x4e, GreaterEqual, 36) \
238 macro(I32Shl, 0x74, Shl, 37) \
239 macro(I32Xor, 0x73, BitXor, 38) \
240 macro(F64Min, 0xa4, Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1)))), 39) \
241 macro(F32Mul, 0x94, Mul, 40) \
242 macro(I64Sub, 0x7d, Sub, 41) \
243 macro(I32Add, 0x6a, Add, 42) \
244 macro(F64Sub, 0xa1, Sub, 43) \
245 macro(I32Or, 0x72, BitOr, 44) \
246 macro(I64LtU, 0x54, Below, 45) \
247 macro(I64LtS, 0x53, LessThan, 46) \
248 macro(I64Xor, 0x85, BitXor, 47) \
249 macro(I64GeU, 0x5a, AboveEqual, 48) \
250 macro(F32Min, 0x96, Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1)))), 49) \
251 macro(I64Mul, 0x7e, Mul, 50) \
252 macro(F32Sub, 0x93, Sub, 51) \
253 macro(F64Add, 0xa0, Add, 52) \
254 macro(I64GeS, 0x59, GreaterEqual, 53) \
255 macro(I32Ne, 0x47, NotEqual, 54) \
256 macro(F32Eq, 0x5b, Equal, 55) \
257 macro(I64Eq, 0x51, Equal, 56) \
258 macro(I64ShrU, 0x88, ZShr(@0, Trunc(@1)), 57) \
259 macro(I64Shl, 0x86, Shl(@0, Trunc(@1)), 58) \
260 macro(F32Gt, 0x5e, GreaterThan, 59) \
261 macro(I32Rotl, 0x77, RotL, 60) \
262 macro(I32Rotr, 0x78, RotR, 61) \
263 macro(I32GtU, 0x4b, Above, 62) \
264 macro(I32GtS, 0x4a, GreaterThan, 63) \
265 macro(F64Max, 0xa5, Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1)))), 64) \
266 macro(I64LeU, 0x58, BelowEqual, 65) \
267 macro(I64LeS, 0x57, LessEqual, 66) \
268 macro(I64Add, 0x7c, Add, 67)
269
270#define FOR_EACH_WASM_BINARY_OP(macro) \
271 FOR_EACH_WASM_SIMPLE_BINARY_OP(macro) \
272 macro(I32DivU, 0x6e, Oops, 0) \
273 macro(I32DivS, 0x6d, Oops, 1) \
274 macro(I32RemU, 0x70, Oops, 2) \
275 macro(I32RemS, 0x6f, Oops, 3) \
276 macro(I64RemS, 0x81, Oops, 4) \
277 macro(I64RemU, 0x82, Oops, 5) \
278 macro(I64DivU, 0x80, Oops, 6) \
279 macro(I64DivS, 0x7f, Oops, 7)
280
281#define FOR_EACH_WASM_MEMORY_LOAD_OP(macro) \
282 macro(I64Load32U, 0x35, Oops, 0) \
283 macro(I64Load32S, 0x34, Oops, 1) \
284 macro(I32Load16S, 0x2e, Oops, 2) \
285 macro(I32Load16U, 0x2f, Oops, 3) \
286 macro(I64Load, 0x29, Oops, 4) \
287 macro(F64Load, 0x2b, Oops, 5) \
288 macro(I32Load8S, 0x2c, Oops, 6) \
289 macro(I32Load8U, 0x2d, Oops, 7) \
290 macro(I32Load, 0x28, Oops, 8) \
291 macro(F32Load, 0x2a, Oops, 9) \
292 macro(I64Load8U, 0x31, Oops, 10) \
293 macro(I64Load8S, 0x30, Oops, 11) \
294 macro(I64Load16S, 0x32, Oops, 12) \
295 macro(I64Load16U, 0x33, Oops, 13)
296
297#define FOR_EACH_WASM_MEMORY_STORE_OP(macro) \
298 macro(I64Store16, 0x3d, Oops, 0) \
299 macro(I64Store8, 0x3c, Oops, 1) \
300 macro(I32Store, 0x36, Oops, 2) \
301 macro(I32Store16, 0x3b, Oops, 3) \
302 macro(F32Store, 0x38, Oops, 4) \
303 macro(I64Store, 0x37, Oops, 5) \
304 macro(F64Store, 0x39, Oops, 6) \
305 macro(I32Store8, 0x3a, Oops, 7) \
306 macro(I64Store32, 0x3e, Oops, 8)
307
308#define FOR_EACH_WASM_EXT_TABLE_OP(macro) \
309 macro(TableFill, 0x11, Oops, 0) \
310 macro(TableGrow, 0x10, Oops, 1) \
311 macro(TableSize, 0xf, Oops, 2)
312
313
314#define FOR_EACH_WASM_OP(macro) \
315 FOR_EACH_WASM_SPECIAL_OP(macro) \
316 FOR_EACH_WASM_CONTROL_FLOW_OP(macro) \
317 FOR_EACH_WASM_UNARY_OP(macro) \
318 FOR_EACH_WASM_BINARY_OP(macro) \
319 FOR_EACH_WASM_MEMORY_LOAD_OP(macro) \
320 FOR_EACH_WASM_MEMORY_STORE_OP(macro) \
321 macro(ExtTable, 0xFC, Oops, 0)
322
323#define CREATE_ENUM_VALUE(name, id, b3op, inc) name = id,
324
325enum OpType : uint8_t {
326 FOR_EACH_WASM_OP(CREATE_ENUM_VALUE)
327};
328
329template<typename Int>
330inline bool isValidOpType(Int i)
331{
332 // Bitset of valid ops.
333 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, 0x7, 0x0, 0x0, 0x0, 0x0, 0x10 };
334 return 0 <= i && i <= 252 && (valid[i / 8] & (1 << (i % 8)));
335}
336
337enum class BinaryOpType : uint8_t {
338 FOR_EACH_WASM_BINARY_OP(CREATE_ENUM_VALUE)
339};
340
341enum class UnaryOpType : uint8_t {
342 FOR_EACH_WASM_UNARY_OP(CREATE_ENUM_VALUE)
343};
344
345enum class LoadOpType : uint8_t {
346 FOR_EACH_WASM_MEMORY_LOAD_OP(CREATE_ENUM_VALUE)
347};
348
349enum class StoreOpType : uint8_t {
350 FOR_EACH_WASM_MEMORY_STORE_OP(CREATE_ENUM_VALUE)
351};
352
353enum class ExtTableOpType : uint8_t {
354 FOR_EACH_WASM_EXT_TABLE_OP(CREATE_ENUM_VALUE)
355};
356
357#undef CREATE_ENUM_VALUE
358
359inline bool isControlOp(OpType op)
360{
361 switch (op) {
362#define CREATE_CASE(name, id, b3op, inc) case OpType::name:
363 FOR_EACH_WASM_CONTROL_FLOW_OP(CREATE_CASE)
364 return true;
365#undef CREATE_CASE
366 default:
367 break;
368 }
369 return false;
370}
371
372inline bool isSimple(UnaryOpType op)
373{
374 switch (op) {
375#define CREATE_CASE(name, id, b3op, inc) case UnaryOpType::name:
376 FOR_EACH_WASM_SIMPLE_UNARY_OP(CREATE_CASE)
377 return true;
378#undef CREATE_CASE
379 default:
380 break;
381 }
382 return false;
383}
384
385inline bool isSimple(BinaryOpType op)
386{
387 switch (op) {
388#define CREATE_CASE(name, id, b3op, inc) case BinaryOpType::name:
389 FOR_EACH_WASM_SIMPLE_BINARY_OP(CREATE_CASE)
390 return true;
391#undef CREATE_CASE
392 default:
393 break;
394 }
395 return false;
396}
397
398inline uint32_t memoryLog2Alignment(OpType op)
399{
400 switch (op) {
401 case I64Load32U: return 2;
402 case I64Load32S: return 2;
403 case I32Load16S: return 1;
404 case I32Load16U: return 1;
405 case I64Load: return 3;
406 case F64Load: return 3;
407 case I32Load8S: return 0;
408 case I32Load8U: return 0;
409 case I32Load: return 2;
410 case F32Load: return 2;
411 case I64Load8U: return 0;
412 case I64Load8S: return 0;
413 case I64Load16S: return 1;
414 case I64Load16U: return 1;
415 case I64Store16: return 1;
416 case I64Store8: return 0;
417 case I32Store: return 2;
418 case I32Store16: return 1;
419 case F32Store: return 2;
420 case I64Store: return 3;
421 case F64Store: return 3;
422 case I32Store8: return 0;
423 case I64Store32: return 2;
424 default:
425 break;
426 }
427 RELEASE_ASSERT_NOT_REACHED();
428 return 0;
429}
430
431#define CREATE_CASE(name, id, b3type, inc) case name: return #name;
432inline const char* makeString(OpType op)
433{
434 switch (op) {
435 FOR_EACH_WASM_OP(CREATE_CASE)
436 }
437 RELEASE_ASSERT_NOT_REACHED();
438 return nullptr;
439}
440#undef CREATE_CASE
441
442} } // namespace JSC::Wasm
443
444namespace WTF {
445
446inline void printInternal(PrintStream& out, JSC::Wasm::Type type)
447{
448 out.print(JSC::Wasm::makeString(type));
449}
450
451inline void printInternal(PrintStream& out, JSC::Wasm::OpType op)
452{
453 out.print(JSC::Wasm::makeString(op));
454}
455
456} // namespace WTF
457
458#endif // ENABLE(WEBASSEMBLY)
459
460