blob: 389383e90a1306cc000027e96f66302ea427e599 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-wasm
6
7function bytes() {
8 var buffer = new ArrayBuffer(arguments.length);
9 var view = new Uint8Array(buffer);
10 for (var i = 0; i < arguments.length; i++) {
11 var val = arguments[i];
12 if ((typeof val) == "string") val = val.charCodeAt(0);
13 view[i] = val | 0;
14 }
15 return buffer;
16}
17
Ben Murdochda12d292016-06-02 14:46:10 +010018// Header declaration constants
19var kWasmH0 = 0;
20var kWasmH1 = 0x61;
21var kWasmH2 = 0x73;
22var kWasmH3 = 0x6d;
23
Ben Murdochc5610432016-08-08 18:44:38 +010024var kWasmV0 = 11;
Ben Murdochda12d292016-06-02 14:46:10 +010025var kWasmV1 = 0;
26var kWasmV2 = 0;
27var kWasmV3 = 0;
28
29var kHeaderSize = 8;
30var kPageSize = 65536;
31
32function bytesWithHeader() {
33 var buffer = new ArrayBuffer(kHeaderSize + arguments.length);
34 var view = new Uint8Array(buffer);
35 view[0] = kWasmH0;
36 view[1] = kWasmH1;
37 view[2] = kWasmH2;
38 view[3] = kWasmH3;
39 view[4] = kWasmV0;
40 view[5] = kWasmV1;
41 view[6] = kWasmV2;
42 view[7] = kWasmV3;
43 for (var i = 0; i < arguments.length; i++) {
44 var val = arguments[i];
45 if ((typeof val) == "string") val = val.charCodeAt(0);
46 view[kHeaderSize + i] = val | 0;
47 }
48 return buffer;
49}
50
51var kDeclNoLocals = 0;
52
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000053// Section declaration constants
54var kDeclMemory = 0x00;
55var kDeclSignatures = 0x01;
56var kDeclFunctions = 0x02;
57var kDeclGlobals = 0x03;
58var kDeclDataSegments = 0x04;
59var kDeclFunctionTable = 0x05;
Ben Murdochda12d292016-06-02 14:46:10 +010060var kDeclEnd = 0x06;
Ben Murdoch097c5b22016-05-18 11:27:45 +010061var kDeclStartFunction = 0x07;
62var kDeclImportTable = 0x08;
Ben Murdochda12d292016-06-02 14:46:10 +010063var kDeclExportTable = 0x09;
64var kDeclFunctionSignatures = 0x0a;
65var kDeclFunctionBodies = 0x0b;
66var kDeclNames = 0x0c;
67
Ben Murdochc5610432016-08-08 18:44:38 +010068var kArity0 = 0;
69var kArity1 = 1;
70var kArity2 = 2;
71var kArity3 = 3;
72var kWasmFunctionTypeForm = 0x40;
73
Ben Murdochda12d292016-06-02 14:46:10 +010074var section_names = [
Ben Murdochc5610432016-08-08 18:44:38 +010075 "memory", "type", "old_function", "global", "data",
76 "table", "end", "start", "import", "export",
77 "function", "code", "name"];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078
79// Function declaration flags
80var kDeclFunctionName = 0x01;
81var kDeclFunctionImport = 0x02;
82var kDeclFunctionLocals = 0x04;
83var kDeclFunctionExport = 0x08;
84
85// Local types
86var kAstStmt = 0;
87var kAstI32 = 1;
88var kAstI64 = 2;
89var kAstF32 = 3;
90var kAstF64 = 4;
91
Ben Murdochc5610432016-08-08 18:44:38 +010092// Useful signatures
93var kSig_i = [0, 1, kAstI32];
94var kSig_d = [0, 1, kAstF64];
95var kSig_i_i = [1, kAstI32, 1, kAstI32];
96var kSig_i_ii = [2, kAstI32, kAstI32, 1, kAstI32];
97var kSig_i_iii = [3, kAstI32, kAstI32, kAstI32, 1, kAstI32];
98var kSig_d_dd = [2, kAstF64, kAstF64, 1, kAstF64];
99var kSig_l_ll = [2, kAstI64, kAstI64, 1, kAstI64];
100var kSig_i_dd = [2, kAstF64, kAstF64, 1, kAstI32];
101var kSig_v_v = [0, 0];
102var kSig_i_v = [0, 1, kAstI32];
103
104function makeSig_v_xx(x) {
105 return [2, x, x, 0];
106}
107
108function makeSig_v_x(x) {
109 return [1, x, 0];
110}
111
112function makeSig_r_xx(r, x) {
113 return [2, x, x, 1, r];
114}
115
116function makeSig_r_x(r, x) {
117 return [1, x, 1, r];
118}
119
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120// Opcodes
121var kExprNop = 0x00;
122var kExprBlock = 0x01;
123var kExprLoop = 0x02;
124var kExprIf = 0x03;
Ben Murdochc5610432016-08-08 18:44:38 +0100125var kExprElse = 0x04;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000126var kExprSelect = 0x05;
127var kExprBr = 0x06;
128var kExprBrIf = 0x07;
Ben Murdochc5610432016-08-08 18:44:38 +0100129var kExprBrTable = 0x08;
130var kExprReturn = 0x09;
131var kExprUnreachable = 0x0a;
132var kExprEnd = 0x0f;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133
Ben Murdochc5610432016-08-08 18:44:38 +0100134var kExprI32Const = 0x10;
135var kExprI64Const = 0x11;
136var kExprF64Const = 0x12;
137var kExprF32Const = 0x13;
138var kExprGetLocal = 0x14;
139var kExprSetLocal = 0x15;
140var kExprCallFunction = 0x16;
141var kExprCallIndirect = 0x17;
142var kExprCallImport = 0x18;
143var kExprI8Const = 0xcb;
144var kExprLoadGlobal = 0xcc;
145var kExprStoreGlobal = 0xcd;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146
147var kExprI32LoadMem8S = 0x20;
148var kExprI32LoadMem8U = 0x21;
149var kExprI32LoadMem16S = 0x22;
150var kExprI32LoadMem16U = 0x23;
151var kExprI64LoadMem8S = 0x24;
152var kExprI64LoadMem8U = 0x25;
153var kExprI64LoadMem16S = 0x26;
154var kExprI64LoadMem16U = 0x27;
155var kExprI64LoadMem32S = 0x28;
156var kExprI64LoadMem32U = 0x29;
157var kExprI32LoadMem = 0x2a;
158var kExprI64LoadMem = 0x2b;
159var kExprF32LoadMem = 0x2c;
160var kExprF64LoadMem = 0x2d;
161
162var kExprI32StoreMem8 = 0x2e;
163var kExprI32StoreMem16 = 0x2f;
164var kExprI64StoreMem8 = 0x30;
165var kExprI64StoreMem16 = 0x31;
166var kExprI64StoreMem32 = 0x32;
167var kExprI32StoreMem = 0x33;
168var kExprI64StoreMem = 0x34;
169var kExprF32StoreMem = 0x35;
170var kExprF64StoreMem = 0x36;
171
172var kExprMemorySize = 0x3b;
173var kExprGrowMemory = 0x39;
174
175var kExprI32Add = 0x40;
176var kExprI32Sub = 0x41;
177var kExprI32Mul = 0x42;
178var kExprI32DivS = 0x43;
179var kExprI32DivU = 0x44;
180var kExprI32RemS = 0x45;
181var kExprI32RemU = 0x46;
182var kExprI32And = 0x47;
183var kExprI32Ior = 0x48;
184var kExprI32Xor = 0x49;
185var kExprI32Shl = 0x4a;
186var kExprI32ShrU = 0x4b;
187var kExprI32ShrS = 0x4c;
188var kExprI32Eq = 0x4d;
189var kExprI32Ne = 0x4e;
190var kExprI32LtS = 0x4f;
191var kExprI32LeS = 0x50;
192var kExprI32LtU = 0x51;
193var kExprI32LeU = 0x52;
194var kExprI32GtS = 0x53;
195var kExprI32GeS = 0x54;
196var kExprI32GtU = 0x55;
197var kExprI32GeU = 0x56;
198var kExprI32Clz = 0x57;
199var kExprI32Ctz = 0x58;
200var kExprI32Popcnt = 0x59;
Ben Murdochda12d292016-06-02 14:46:10 +0100201var kExprI32Eqz = 0x5a;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000202var kExprI64Add = 0x5b;
203var kExprI64Sub = 0x5c;
204var kExprI64Mul = 0x5d;
205var kExprI64DivS = 0x5e;
206var kExprI64DivU = 0x5f;
207var kExprI64RemS = 0x60;
208var kExprI64RemU = 0x61;
209var kExprI64And = 0x62;
210var kExprI64Ior = 0x63;
211var kExprI64Xor = 0x64;
212var kExprI64Shl = 0x65;
213var kExprI64ShrU = 0x66;
214var kExprI64ShrS = 0x67;
215var kExprI64Eq = 0x68;
216var kExprI64Ne = 0x69;
217var kExprI64LtS = 0x6a;
218var kExprI64LeS = 0x6b;
219var kExprI64LtU = 0x6c;
220var kExprI64LeU = 0x6d;
221var kExprI64GtS = 0x6e;
222var kExprI64GeS = 0x6f;
223var kExprI64GtU = 0x70;
224var kExprI64GeU = 0x71;
225var kExprI64Clz = 0x72;
226var kExprI64Ctz = 0x73;
227var kExprI64Popcnt = 0x74;
228var kExprF32Add = 0x75;
229var kExprF32Sub = 0x76;
230var kExprF32Mul = 0x77;
231var kExprF32Div = 0x78;
232var kExprF32Min = 0x79;
233var kExprF32Max = 0x7a;
234var kExprF32Abs = 0x7b;
235var kExprF32Neg = 0x7c;
236var kExprF32CopySign = 0x7d;
237var kExprF32Ceil = 0x7e;
238var kExprF32Floor = 0x7f;
239var kExprF32Trunc = 0x80;
240var kExprF32NearestInt = 0x81;
241var kExprF32Sqrt = 0x82;
242var kExprF32Eq = 0x83;
243var kExprF32Ne = 0x84;
244var kExprF32Lt = 0x85;
245var kExprF32Le = 0x86;
246var kExprF32Gt = 0x87;
247var kExprF32Ge = 0x88;
248var kExprF64Add = 0x89;
249var kExprF64Sub = 0x8a;
250var kExprF64Mul = 0x8b;
251var kExprF64Div = 0x8c;
252var kExprF64Min = 0x8d;
253var kExprF64Max = 0x8e;
254var kExprF64Abs = 0x8f;
255var kExprF64Neg = 0x90;
256var kExprF64CopySign = 0x91;
257var kExprF64Ceil = 0x92;
258var kExprF64Floor = 0x93;
259var kExprF64Trunc = 0x94;
260var kExprF64NearestInt = 0x95;
261var kExprF64Sqrt = 0x96;
262var kExprF64Eq = 0x97;
263var kExprF64Ne = 0x98;
264var kExprF64Lt = 0x99;
265var kExprF64Le = 0x9a;
266var kExprF64Gt = 0x9b;
267var kExprF64Ge = 0x9c;
268var kExprI32SConvertF32 = 0x9d;
269var kExprI32SConvertF64 = 0x9e;
270var kExprI32UConvertF32 = 0x9f;
271var kExprI32UConvertF64 = 0xa0;
272var kExprI32ConvertI64 = 0xa1;
273var kExprI64SConvertF32 = 0xa2;
274var kExprI64SConvertF64 = 0xa3;
275var kExprI64UConvertF32 = 0xa4;
276var kExprI64UConvertF64 = 0xa5;
277var kExprI64SConvertI32 = 0xa6;
278var kExprI64UConvertI32 = 0xa7;
279var kExprF32SConvertI32 = 0xa8;
280var kExprF32UConvertI32 = 0xa9;
281var kExprF32SConvertI64 = 0xaa;
282var kExprF32UConvertI64 = 0xab;
283var kExprF32ConvertF64 = 0xac;
284var kExprF32ReinterpretI32 = 0xad;
285var kExprF64SConvertI32 = 0xae;
286var kExprF64UConvertI32 = 0xaf;
287var kExprF64SConvertI64 = 0xb0;
288var kExprF64UConvertI64 = 0xb1;
289var kExprF64ConvertF32 = 0xb2;
290var kExprF64ReinterpretI64 = 0xb3;
291var kExprI32ReinterpretF32 = 0xb4;
292var kExprI64ReinterpretF64 = 0xb5;
Ben Murdochda12d292016-06-02 14:46:10 +0100293var kExprI32Ror = 0xb6;
294var kExprI32Rol = 0xb7;
295var kExprI64Ror = 0xb8;
296var kExprI64Rol = 0xb9;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297
298var kTrapUnreachable = 0;
299var kTrapMemOutOfBounds = 1;
300var kTrapDivByZero = 2;
301var kTrapDivUnrepresentable = 3;
302var kTrapRemByZero = 4;
303var kTrapFloatUnrepresentable = 5;
304var kTrapFuncInvalid = 6;
305var kTrapFuncSigMismatch = 7;
306
307var kTrapMsgs = [
308 "unreachable",
309 "memory access out of bounds",
310 "divide by zero",
311 "divide result unrepresentable",
312 "remainder by zero",
313 "integer result unrepresentable",
314 "invalid function",
315 "function signature mismatch"
316];
317
318function assertTraps(trap, code) {
319 var threwException = true;
320 try {
321 if (typeof code === 'function') {
322 code();
323 } else {
324 eval(code);
325 }
326 threwException = false;
327 } catch (e) {
Ben Murdochc5610432016-08-08 18:44:38 +0100328 assertEquals("object", typeof e);
329 assertEquals(kTrapMsgs[trap], e.message);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000330 // Success.
331 return;
332 }
333 throw new MjsUnitAssertionError("Did not trap, expected: " + kTrapMsgs[trap]);
334}