blob: 514ddefb7edea1a36be8a6a74f9da85f49f213ca [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// Copyright 2016 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 WrapInAsmModule(func) {
8 function MODULE_NAME(stdlib) {
9 "use asm";
10 var imul = stdlib.Math.imul;
11
12 FUNC_BODY
13 return {main: FUNC_NAME};
14 }
15
16 var source = MODULE_NAME.toString()
17 .replace(/MODULE_NAME/g, func.name + "_module")
18 .replace(/FUNC_BODY/g, func.toString())
19 .replace(/FUNC_NAME/g, func.name);
20 return eval("(" + source + ")");
21}
22
23function RunThreeWayTest(asmfunc, expect) {
24 var asm_source = asmfunc.toString();
25 var nonasm_source = asm_source.replace(new RegExp("use asm"), "");
26 var stdlib = {Math: Math};
27
28 var js_module = eval("(" + nonasm_source + ")")(stdlib);
29 print("Testing " + asmfunc.name + " (js)...");
30 expect(js_module);
31
32 print("Testing " + asmfunc.name + " (asm.js)...");
33 var asm_module = asmfunc(stdlib);
34 expect(asm_module);
35
36 print("Testing " + asmfunc.name + " (wasm)...");
37 var wasm_module = Wasm.instantiateModuleFromAsm(asm_source, stdlib);
38 expect(wasm_module);
39}
40
41const imul = Math.imul;
42
43function u32_add(a, b) {
44 a = a | 0;
45 b = b | 0;
46 return +(((a >>> 0) + (b >>> 0)) >>> 0);
47}
48
49function u32_sub(a, b) {
50 a = a | 0;
51 b = b | 0;
52 return +(((a >>> 0) - (b >>> 0)) >>> 0);
53}
54
55function u32_mul(a, b) {
56 a = a | 0;
57 b = b | 0;
58 return +imul(a >>> 0, b >>> 0);
59}
60
61function u32_div(a, b) {
62 a = a | 0;
63 b = b | 0;
64 return +(((a >>> 0) / (b >>> 0)) >>> 0);
65}
66
67function u32_mod(a, b) {
68 a = a | 0;
69 b = b | 0;
70 return +(((a >>> 0) % (b >>> 0)) >>> 0);
71}
72
73function u32_and(a, b) {
74 a = a | 0;
75 b = b | 0;
76 return +((a >>> 0) & (b >>> 0));
77}
78
79function u32_or(a, b) {
80 a = a | 0;
81 b = b | 0;
82 return +((a >>> 0) | (b >>> 0));
83}
84
85function u32_xor(a, b) {
86 a = a | 0;
87 b = b | 0;
88 return +((a >>> 0) ^ (b >>> 0));
89}
90
91function u32_shl(a, b) {
92 a = a | 0;
93 b = b | 0;
94 return +((a >>> 0) << (b >>> 0));
95}
96
97function u32_shr(a, b) {
98 a = a | 0;
99 b = b | 0;
100 return +((a >>> 0) >> (b >>> 0));
101}
102
103function u32_sar(a, b) {
104 a = a | 0;
105 b = b | 0;
106 return ((a >>> 0) >>> (b >>> 0)) | 0;
107}
108
109function u32_eq(a, b) {
110 a = a | 0;
111 b = b | 0;
112 if ((a >>> 0) == (b >>> 0)) {
113 return 1;
114 }
115 return 0;
116}
117
118function u32_ne(a, b) {
119 a = a | 0;
120 b = b | 0;
121 if ((a >>> 0) < (b >>> 0)) {
122 return 1;
123 }
124 return 0;
125}
126
127function u32_lt(a, b) {
128 a = a | 0;
129 b = b | 0;
130 if ((a >>> 0) < (b >>> 0)) {
131 return 1;
132 }
133 return 0;
134}
135
136function u32_lteq(a, b) {
137 a = a | 0;
138 b = b | 0;
139 if ((a >>> 0) <= (b >>> 0)) {
140 return 1;
141 }
142 return 0;
143}
144
145function u32_gt(a, b) {
146 a = a | 0;
147 b = b | 0;
148 if ((a >>> 0) > (b >>> 0)) {
149 return 1;
150 }
151 return 0;
152}
153
154function u32_gteq(a, b) {
155 a = a | 0;
156 b = b | 0;
157 if ((a >>> 0) >= (b >>> 0)) {
158 return 1;
159 }
160 return 0;
161}
162
163
164var inputs = [
165 0, 1, 2, 3, 4,
166 10, 20, 30, 31, 32, 33, 100, 2000,
167 30000, 400000, 5000000,
168 100000000, 2000000000,
169 2147483646,
170 2147483647,
171 2147483648,
172 2147483649,
173 0x273a798e, 0x187937a3, 0xece3af83, 0x5495a16b, 0x0b668ecc, 0x11223344,
174 0x0000009e, 0x00000043, 0x0000af73, 0x0000116b, 0x00658ecc, 0x002b3b4c,
175 0x88776655, 0x70000000, 0x07200000, 0x7fffffff, 0x56123761, 0x7fffff00,
176 0x761c4761, 0x80000000, 0x88888888, 0xa0000000, 0xdddddddd, 0xe0000000,
177 0xeeeeeeee, 0xfffffffd, 0xf0000000, 0x007fffff, 0x003fffff, 0x001fffff,
178 0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff,
179 0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
180 -1, -2, -3, -4,
181 -10, -20, -30, -31, -32, -33, -100, -2000,
182 -30000, -400000, -5000000,
183 -100000000, -2000000000,
184 -2147483646,
185 -2147483647,
186 -2147483648,
187 -2147483649,
188];
189
190var funcs = [
191 u32_add,
192 u32_sub,
193 u32_div,
194 u32_mod,
195// TODO(titzer): u32_mul crashes turbofan in asm.js mode
196 u32_and,
197 u32_or,
198 u32_xor,
199 u32_shl,
200 u32_shr,
201 u32_sar,
202 u32_eq,
203 u32_ne,
204 u32_lt,
205 u32_lteq,
206 u32_gt,
207 u32_gteq,
208 // TODO(titzer): u32_min
209 // TODO(titzer): u32_max
210 // TODO(titzer): u32_abs
211];
212
213(function () {
214 for (func of funcs) {
215 RunThreeWayTest(WrapInAsmModule(func), function (module) {
216 for (a of inputs) {
217 for (b of inputs) {
218 var expected = func(a, b);
219 assertEquals(expected, module.main(a, b));
220 }
221 }
222 });
223 }
224
225})();