OLD | NEW |
| (Empty) |
1 // 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: --validate-asm --allow-natives-syntax | |
6 | |
7 var selectedTest = undefined; | |
8 //selectedTest = 16; | |
9 | |
10 function skip(a) { | |
11 return selectedTest != undefined ? a != selectedTest : false; | |
12 } | |
13 | |
14 const assign_in_stmt = [ | |
15 "if (E) =", | |
16 "if (=) E", | |
17 "if (E) E; else =", | |
18 "for (=; E; S) S", | |
19 "for (E; =; S) S", | |
20 "for (E; E; =) E", | |
21 "for (E; E; E) =", | |
22 "do { = } while(E)", | |
23 "do { S } while (=)", | |
24 ]; | |
25 const assign_in_expr = [ | |
26 "i32_func(=)", | |
27 "(=) ? E : E", | |
28 "E ? (=) : E", | |
29 "E ? E : (=)", | |
30 "(=) + E", | |
31 "E + (=)", | |
32 "imul(=, E)", | |
33 "imul(E, =)", | |
34 "~(=)", | |
35 "(=) | 0", | |
36 "(=), E", | |
37 "E, (=)", | |
38 "E, E, (=)", | |
39 "E, (=), E", | |
40 "(=), E, E", | |
41 ]; | |
42 | |
43 const stdlib = { | |
44 Math: Math, | |
45 Int8Array: Int8Array, | |
46 Int16Array: Int16Array, | |
47 Int32Array: Int32Array, | |
48 Uint8Array: Uint8Array, | |
49 Uint16Array: Uint16Array, | |
50 Uint32Array: Uint32Array, | |
51 Float32Array: Float32Array, | |
52 Float64Array: Float64Array, | |
53 }; | |
54 | |
55 const buffer = new ArrayBuffer(65536); | |
56 | |
57 // Template for a module. | |
58 function MODULE_TEMPLATE(stdlib, foreign, buffer) { | |
59 "use asm"; | |
60 var imul = stdlib.Math.imul; | |
61 var fround = stdlib.Math.fround; | |
62 var M = new stdlib.Int32Array(buffer); | |
63 var G = 0; | |
64 | |
65 function void_func() {} | |
66 function i32_func(a) { | |
67 a = a | 0; | |
68 return a | 0; | |
69 } | |
70 | |
71 FUNC_DECL | |
72 return {main: main}; | |
73 } | |
74 | |
75 // Template for main function. | |
76 { | |
77 function main(i32, f32, f64) { | |
78 i32 = i32 | 0; | |
79 f32 = fround(f32); | |
80 f64 = +f64; | |
81 FUNC_BODY | |
82 } | |
83 } | |
84 | |
85 function RunAsmJsTest(asmfunc, expect) { | |
86 var asm_source = asmfunc.toString(); | |
87 var nonasm_source = asm_source.replace(new RegExp("use asm"), ""); | |
88 | |
89 print("Testing " + asmfunc.name + " (js)..."); | |
90 var js_module = eval("(" + nonasm_source + ")")(stdlib, {}, buffer); | |
91 expect(js_module); | |
92 | |
93 print("Testing " + asmfunc.name + " (asm.js)..."); | |
94 var asm_module = asmfunc(stdlib, {}, buffer); | |
95 assertTrue(%IsAsmWasmCode(asmfunc)); | |
96 expect(asm_module); | |
97 } | |
98 | |
99 var test = 0; | |
100 | |
101 function DoTheTests(expr, assign, stmt) { | |
102 // ==== Expression assignment tests ======================================== | |
103 for (let e of assign_in_expr) { | |
104 if (skip(++test)) continue; | |
105 var orig = e; | |
106 e = e.replace(/=/g, assign); | |
107 e = e.replace(/E/g, expr); | |
108 e = e.replace(/S/g, stmt); | |
109 var str = main.toString().replace("FUNC_BODY", "return (" + e + ") | 0;"); | |
110 var asm_source = MODULE_TEMPLATE.toString().replace("FUNC_DECL", str); | |
111 // TODO(titzer): a verbosity API for these kinds of tests? | |
112 // print(asm_source); | |
113 | |
114 doTest(asm_source, "(" + test + ") " + e); | |
115 } | |
116 | |
117 // ==== Statement assignment tests ========================================= | |
118 for (let e of assign_in_stmt) { | |
119 if (skip(++test)) continue; | |
120 var orig = e; | |
121 e = e.replace(/=/g, assign); | |
122 e = e.replace(/E/g, expr); | |
123 e = e.replace(/S/g, stmt); | |
124 var str = main.toString().replace("FUNC_BODY", e + "; return 0;"); | |
125 var asm_source = MODULE_TEMPLATE.toString().replace("FUNC_DECL", str); | |
126 // print(asm_source); | |
127 | |
128 doTest(asm_source, "(" + test + ") " + e); | |
129 } | |
130 | |
131 function doTest(asm_source, orig) { | |
132 var nonasm_source = asm_source.replace(new RegExp("use asm"), ""); | |
133 print("Testing JS: " + orig); | |
134 var js_module = eval("(" + nonasm_source + ")")(stdlib, {}, buffer); | |
135 expect(js_module); | |
136 | |
137 var asmfunc = eval("(" + asm_source + ")"); | |
138 | |
139 print("Testing ASMJS: " + orig); | |
140 var asm_module = asmfunc(stdlib, {}, buffer); | |
141 assertTrue(%IsAsmWasmCode(asmfunc)); | |
142 expect(asm_module); | |
143 } | |
144 | |
145 function expect(module) { module.main(0, 0, 0); print(" ok"); return true; } | |
146 } | |
147 | |
148 DoTheTests("(i32 | 0)", "i32 = 0", "void_func()"); | |
149 DoTheTests("G", "G = 0", "void_func()"); | |
150 DoTheTests("G", "G = 0", "G"); | |
151 DoTheTests("(M[0] | 0)", "M[0] = 0", "void_func()"); | |
OLD | NEW |