|
1 load(libdir + "asm.js"); |
|
2 |
|
3 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i+j)|0 } return f"); |
|
4 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i+j)|0 } return f"); |
|
5 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i-j)|0 } return f"); |
|
6 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i-j)|0 } return f"); |
|
7 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i*j)|0 } return f"); |
|
8 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i*j)|0 } return f"); |
|
9 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0; return (i*j)|0 } return f"); |
|
10 assertAsmTypeFail(USE_ASM + "function f() { var i=0; return (i*1048576)|0 } return f"); |
|
11 assertAsmTypeFail(USE_ASM + "function f() { var i=0; return (i*-1048576)|0 } return f"); |
|
12 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0; return (i + (j*4))|0 } return f"); |
|
13 assertAsmTypeFail(USE_ASM + "function f() { var two30 = 1073741824; return (((two30 * 524288 * 16) + 1) & 1)|0 } return f"); |
|
14 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i/j)|0 } return f"); |
|
15 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i/j)|0 } return f"); |
|
16 assertAsmTypeFail(USE_ASM + "function f() { var i=1,j=1; return (i/j)|0 } return f"); |
|
17 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i%j)|0 } return f"); |
|
18 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i%j)|0 } return f"); |
|
19 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i<j)|0 } return f"); |
|
20 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i<j)|0 } return f"); |
|
21 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0; return (i<j)|0 } return f"); |
|
22 assertAsmTypeFail(USE_ASM + "function f() { var i=0.0; return (-i)|0 } return f"); |
|
23 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0; return (-(i+j))|0 } return f"); |
|
24 |
|
25 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0,k=0; k = (i|0)/(k|0) } return f"); |
|
26 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0,k=0; k = (i>>>0)/(k>>>0) } return f"); |
|
27 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0,k=0; k = (i|0)%(k|0) } return f"); |
|
28 assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0,k=0; k = (i>>>0)%(k>>>0) } return f"); |
|
29 |
|
30 const UINT32_MAX = Math.pow(2,32)-1; |
|
31 const INT32_MIN = -Math.pow(2,31); |
|
32 const INT32_MAX = Math.pow(2,31)-1; |
|
33 |
|
34 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return (i*2)|0 } return f")); |
|
35 assertEq(f(0), 0); |
|
36 assertEq(f(INT32_MIN), (2*INT32_MIN)|0); |
|
37 assertEq(f(INT32_MAX), (2*INT32_MAX)|0); |
|
38 |
|
39 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return (2*i)|0 } return f")); |
|
40 assertEq(f(0), 0); |
|
41 assertEq(f(INT32_MIN), (2*INT32_MIN)|0); |
|
42 assertEq(f(INT32_MAX), (2*INT32_MAX)|0); |
|
43 |
|
44 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return (i*1048575)|0 } return f")); |
|
45 assertEq(f(0), 0); |
|
46 assertEq(f(2), (1048575*2)|0); |
|
47 assertEq(f(-1), (1048575*-1)|0); |
|
48 assertEq(f(INT32_MIN), (1048575*INT32_MIN)|0); |
|
49 assertEq(f(INT32_MAX), (1048575*INT32_MAX)|0); |
|
50 |
|
51 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return (1048575*i)|0 } return f")); |
|
52 assertEq(f(0), 0); |
|
53 assertEq(f(2), (1048575*2)|0); |
|
54 assertEq(f(-1), (1048575*-1)|0); |
|
55 assertEq(f(INT32_MIN), (1048575*INT32_MIN)|0); |
|
56 assertEq(f(INT32_MAX), (1048575*INT32_MAX)|0); |
|
57 |
|
58 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=+i; var j=0; j=~~i; return j|0 } return f")); |
|
59 assertEq(f(0), 0); |
|
60 assertEq(f(3.5), 3); |
|
61 assertEq(f(-3.5), -3); |
|
62 assertEq(f(INT32_MAX), INT32_MAX); |
|
63 assertEq(f(INT32_MIN), INT32_MIN); |
|
64 assertEq(f(UINT32_MAX), -1); |
|
65 |
|
66 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; var j=0.0; j=+~~i; return +j } return f")); |
|
67 assertEq(f(0), 0); |
|
68 assertEq(f(INT32_MAX), INT32_MAX); |
|
69 assertEq(f(INT32_MIN), INT32_MIN); |
|
70 |
|
71 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; var j=0.1; j=+(i>>>0); return +j } return f")); |
|
72 assertEq(f(0), 0); |
|
73 assertEq(f(INT32_MAX), INT32_MAX); |
|
74 assertEq(f(UINT32_MAX), UINT32_MAX); |
|
75 |
|
76 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return (-i)|0 } return f")); |
|
77 assertEq(f(0), 0); |
|
78 assertEq(f(-0), 0); |
|
79 assertEq(f(1), -1); |
|
80 assertEq(f(INT32_MAX), INT32_MIN+1); |
|
81 assertEq(f(INT32_MIN), INT32_MIN); |
|
82 |
|
83 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=+i; return +(-i) } return f")); |
|
84 assertEq(f(0), -0); |
|
85 assertEq(f(-0), 0); |
|
86 assertEq(f(-1), 1); |
|
87 assertEq(f(1), -1); |
|
88 assertEq(f(Math.pow(2,50)), -Math.pow(2,50)); |
|
89 assertEq(f(1.54e20), -1.54e20); |
|
90 |
|
91 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i|0) < (j|0))|0 } return f")); |
|
92 assertEq(f(0, 1), 1); |
|
93 assertEq(f(1, 0), 0); |
|
94 assertEq(f(1, 1), 0); |
|
95 assertEq(f(INT32_MIN, INT32_MAX), 1); |
|
96 assertEq(f(INT32_MAX, INT32_MIN), 0); |
|
97 assertEq(f(0, INT32_MAX), 1); |
|
98 assertEq(f(INT32_MAX, 0), 0); |
|
99 assertEq(f(INT32_MIN, 0), 1); |
|
100 assertEq(f(0, INT32_MIN), 0); |
|
101 assertEq(f(UINT32_MAX, 0), 1); |
|
102 assertEq(f(0, UINT32_MAX), 0); |
|
103 |
|
104 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i>>>0) < (j>>>0))|0 } return f")); |
|
105 assertEq(f(0, 1), 1); |
|
106 assertEq(f(1, 0), 0); |
|
107 assertEq(f(1, 1), 0); |
|
108 assertEq(f(INT32_MIN, INT32_MAX), 0); |
|
109 assertEq(f(INT32_MAX, INT32_MIN), 1); |
|
110 assertEq(f(0, INT32_MAX), 1); |
|
111 assertEq(f(INT32_MAX, 0), 0); |
|
112 assertEq(f(INT32_MIN, 0), 0); |
|
113 assertEq(f(0, INT32_MIN), 1); |
|
114 assertEq(f(UINT32_MAX, 0), 0); |
|
115 assertEq(f(0, UINT32_MAX), 1); |
|
116 |
|
117 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k=0; k=(i|0)==(j|0); return k|0 } return f"))(1,2), 0); |
|
118 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k=0; k=(i|0)!=(j|0); return k|0 } return f"))(1,2), 1); |
|
119 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k=0; k=(i|0)<(j|0); return k|0 } return f"))(1,2), 1); |
|
120 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k=0; k=(i|0)>(j|0); return k|0 } return f"))(1,2), 0); |
|
121 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k=0; k=(i|0)<=(j|0); return k|0 } return f"))(1,2), 1); |
|
122 assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k=0; k=(i|0)>=(j|0); return k|0 } return f"))(1,2), 0); |
|
123 |
|
124 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i|0)/(j|0))|0 } return f")); |
|
125 assertEq(f(4,2), 2); |
|
126 assertEq(f(3,2), 1); |
|
127 assertEq(f(3,-2), -1); |
|
128 assertEq(f(-3,-2), 1); |
|
129 assertEq(f(0, -1), 0); |
|
130 assertEq(f(0, INT32_MAX), 0); |
|
131 assertEq(f(0, INT32_MIN), 0); |
|
132 assertEq(f(INT32_MAX, 0), 0); |
|
133 assertEq(f(INT32_MIN, 0), 0); |
|
134 assertEq(f(-1, INT32_MAX), 0); |
|
135 assertEq(f(-1, INT32_MIN), 0); |
|
136 assertEq(f(INT32_MAX, -1), -INT32_MAX); |
|
137 assertEq(f(INT32_MIN, -1), INT32_MIN); // !! |
|
138 assertEq(f(INT32_MAX, INT32_MAX), 1); |
|
139 assertEq(f(INT32_MAX, INT32_MIN), 0); |
|
140 assertEq(f(INT32_MIN, INT32_MAX), -1); |
|
141 assertEq(f(INT32_MIN, INT32_MIN), 1); |
|
142 |
|
143 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i>>>0)/(j>>>0))|0 } return f")); |
|
144 assertEq(f(4,2), 2); |
|
145 assertEq(f(3,2), 1); |
|
146 assertEq(f(3,-2), 0); |
|
147 assertEq(f(-3,-2), 0); |
|
148 assertEq(f(0, -1), 0); |
|
149 assertEq(f(0, INT32_MAX), 0); |
|
150 assertEq(f(0, INT32_MIN), 0); |
|
151 assertEq(f(0, UINT32_MAX), 0); |
|
152 assertEq(f(INT32_MAX, 0), 0); |
|
153 assertEq(f(INT32_MIN, 0), 0); |
|
154 assertEq(f(UINT32_MAX, 0), 0); |
|
155 assertEq(f(-1, INT32_MAX), 2); |
|
156 assertEq(f(-1, INT32_MIN), 1); |
|
157 assertEq(f(-1, UINT32_MAX), 1); |
|
158 assertEq(f(INT32_MAX, -1), 0); |
|
159 assertEq(f(INT32_MIN, -1), 0); |
|
160 assertEq(f(UINT32_MAX, -1), 1); |
|
161 assertEq(f(INT32_MAX, INT32_MAX), 1); |
|
162 assertEq(f(INT32_MAX, INT32_MIN), 0); |
|
163 assertEq(f(UINT32_MAX, INT32_MAX), 2); |
|
164 assertEq(f(INT32_MAX, UINT32_MAX), 0); |
|
165 assertEq(f(UINT32_MAX, UINT32_MAX), 1); |
|
166 assertEq(f(INT32_MIN, INT32_MAX), 1); |
|
167 assertEq(f(INT32_MIN, UINT32_MAX), 0); |
|
168 assertEq(f(INT32_MIN, INT32_MIN), 1); |
|
169 |
|
170 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k = 0; k = (i|0)%(j|0)|0; return k|0 } return f")); |
|
171 assertEq(f(4,2), 0); |
|
172 assertEq(f(3,2), 1); |
|
173 assertEq(f(3,-2), 1); |
|
174 assertEq(f(-3,-2), -1); |
|
175 assertEq(f(0, -1), 0); |
|
176 assertEq(f(0, INT32_MAX), 0); |
|
177 assertEq(f(0, INT32_MIN), 0); |
|
178 assertEq(f(INT32_MAX, 0), 0); |
|
179 assertEq(f(INT32_MIN, 0), 0); |
|
180 assertEq(f(-1, INT32_MAX), -1); |
|
181 assertEq(f(-1, INT32_MIN), -1); |
|
182 assertEq(f(INT32_MAX, -1), 0); |
|
183 assertEq(f(INT32_MIN, -1), 0); // !! |
|
184 assertEq(f(INT32_MAX, INT32_MAX), 0); |
|
185 assertEq(f(INT32_MAX, INT32_MIN), INT32_MAX); |
|
186 assertEq(f(INT32_MIN, INT32_MAX), -1); |
|
187 assertEq(f(INT32_MIN, INT32_MIN), 0); |
|
188 |
|
189 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k = 0; k = (i|0)%4|0; return k|0 } return f")); |
|
190 assertEq(f(0), 0); |
|
191 assertEq(f(-1), -1); |
|
192 assertEq(f(-3), -3); |
|
193 assertEq(f(-4), 0); |
|
194 assertEq(f(INT32_MIN), 0); |
|
195 assertEq(f(3), 3); |
|
196 assertEq(f(4), 0); |
|
197 assertEq(f(INT32_MAX), 3); |
|
198 |
|
199 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var k = 0; k = (i>>>0)%(j>>>0)|0; return k|0 } return f")); |
|
200 assertEq(f(4,2), 0); |
|
201 assertEq(f(3,2), 1); |
|
202 assertEq(f(3,-2), 3); |
|
203 assertEq(f(-3,-2), -3); |
|
204 assertEq(f(0, -1), 0); |
|
205 assertEq(f(0, INT32_MAX), 0); |
|
206 assertEq(f(0, INT32_MIN), 0); |
|
207 assertEq(f(0, UINT32_MAX), 0); |
|
208 assertEq(f(INT32_MAX, 0), 0); |
|
209 assertEq(f(INT32_MIN, 0), 0); |
|
210 assertEq(f(UINT32_MAX, 0), 0); |
|
211 assertEq(f(-1, INT32_MAX), 1); |
|
212 assertEq(f(-1, INT32_MIN), INT32_MAX); |
|
213 assertEq(f(-1, UINT32_MAX), 0); |
|
214 assertEq(f(INT32_MAX, -1), INT32_MAX); |
|
215 assertEq(f(INT32_MIN, -1), INT32_MIN); |
|
216 assertEq(f(UINT32_MAX, -1), 0); |
|
217 assertEq(f(INT32_MAX, INT32_MAX), 0); |
|
218 assertEq(f(INT32_MAX, INT32_MIN), INT32_MAX); |
|
219 assertEq(f(UINT32_MAX, INT32_MAX), 1); |
|
220 assertEq(f(INT32_MAX, UINT32_MAX), INT32_MAX); |
|
221 assertEq(f(UINT32_MAX, UINT32_MAX), 0); |
|
222 assertEq(f(INT32_MIN, INT32_MAX), 1); |
|
223 assertEq(f(INT32_MIN, UINT32_MAX), INT32_MIN); |
|
224 assertEq(f(INT32_MIN, INT32_MIN), 0); |
|
225 |
|
226 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 / 2)|0 } return f"))(), 2); |
|
227 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (3 / 2)|0 } return f"))(), 1); |
|
228 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 % 2)|0 } return f"))(), 0); |
|
229 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (3 % 2)|0 } return f"))(), 1); |
|
230 |
|
231 assertAsmTypeFail(USE_ASM + "function f() { var i=42,j=1.1; return +(i?i:j) } return f"); |
|
232 assertEq(asmLink(asmCompile(USE_ASM + "function f() { var i=42,j=1.1; return +(i?+(i|0):j) } return f"))(), 42); |
|
233 assertEq(asmLink(asmCompile(USE_ASM + "function f() { var i=42,j=1; return (i?i:j)|0 } return f"))(), 42); |
|
234 |
|
235 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i|0)>(j|0)?(i+10)|0:(j+100)|0)|0 } return f")); |
|
236 assertEq(f(2, 4), 104); |
|
237 assertEq(f(-2, -4), 8); |
|
238 |
|
239 var f = asmLink(asmCompile(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=k|0; return ((i|0)>(j|0) ? (i|0)>(k|0) ? i : k : (j|0)>(k|0) ? j : k)|0 } return f")); |
|
240 assertEq(f(1,2,3), 3); |
|
241 assertEq(f(1,3,2), 3); |
|
242 assertEq(f(2,1,3), 3); |
|
243 assertEq(f(2,3,1), 3); |
|
244 assertEq(f(3,1,2), 3); |
|
245 assertEq(f(3,2,1), 3); |
|
246 |
|
247 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; var a=0,b=0; a=i>>>0 < 4294967292; b=(i|0) < -4; return (j ? a : b)|0 } return f")); |
|
248 assertEq(f(1,true), 1); |
|
249 assertEq(f(-1,true), 0); |
|
250 assertEq(f(-5,true), 1); |
|
251 assertEq(f(1,false), 0); |
|
252 assertEq(f(-1,false), 0); |
|
253 assertEq(f(-5,false), 1); |
|
254 |
|
255 assertAsmTypeFail('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return (i32[0]+1)|0 } return f"); |
|
256 new Float64Array(BUF_64KB)[0] = 2.3; |
|
257 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +(f64[0] + 2.0) } return f"), this, null, BUF_64KB)(), 2.3+2); |
|
258 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +(f64[0] - 2.0) } return f"), this, null, BUF_64KB)(), 2.3-2); |
|
259 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +(f64[0] * 2.0) } return f"), this, null, BUF_64KB)(), 2.3*2); |
|
260 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +(f64[0] / 2.0) } return f"), this, null, BUF_64KB)(), 2.3/2); |
|
261 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +(f64[0] % 2.0) } return f"), this, null, BUF_64KB)(), 2.3%2); |
|
262 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +-f64[0] } return f"), this, null, BUF_64KB)(), -2.3); |
|
263 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "var sqrt=glob.Math.sqrt; function f() { return +sqrt(f64[0]) } return f"), this, null, BUF_64KB)(), Math.sqrt(2.3)); |
|
264 new Int32Array(BUF_64KB)[0] = 42; |
|
265 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "var imul=glob.Math.imul; function f() { return imul(i32[0], 2)|0 } return f"), this, null, BUF_64KB)(), 84); |
|
266 |
|
267 // beware ye phis of comparisons and integers |
|
268 var f = asmLink(asmCompile(USE_ASM + "function g(i) { i=i|0; if (i) { i = ((i|0) == 2); } else { i=(i-1)|0 } return i|0; } return g ")); |
|
269 assertEq(f(0), -1); |
|
270 assertEq(f(1), 0); |
|
271 assertEq(f(2), 1); |
|
272 var f = asmLink(asmCompile(USE_ASM + "function g(i) { i=i|0; if (i) { i = !i } else { i=(i-1)|0 } return i|0; } return g ")); |
|
273 assertEq(f(0), -1); |
|
274 assertEq(f(1), 0); |
|
275 assertEq(f(2), 0); |
|
276 |
|
277 // beware ye constant-evaluate of boolean-producing operators |
|
278 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 | (2 == 2))|0 } return f"))(), 5); |
|
279 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 | (!2))|0 } return f"))(), 4); |
|
280 |
|
281 // get that order-of-operations right! |
|
282 var buf = new ArrayBuffer(4096); |
|
283 asmLink(asmCompile('glob','imp','buf', USE_ASM + "var i32=new glob.Int32Array(buf); var x=0; function a() { return x|0 } function b() { x=42; return 0 } function f() { i32[((b()|0) & 0x3) >> 2] = a()|0 } return f"), this, null, buf)(); |
|
284 assertEq(new Int32Array(buf)[0], 42); |
|
285 |
|
286 assertEq(asmLink(asmCompile(USE_ASM + "function f() { var a=0,i=0; for (; ~~i!=4; i=(i+1)|0) { a = (a*5)|0; if (+(a>>>0) != 0.0) return 1; } return 0; } return f"))(), 0) |
|
287 |
|
288 // Signed integer division by a power of two. |
|
289 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/1)|0; } return f;")); |
|
290 for (let i = 0; i < 31; i++) { |
|
291 assertEq(f(Math.pow(2,i)), Math.pow(2,i)); |
|
292 assertEq(f(Math.pow(2,i)-1), Math.pow(2,i)-1); |
|
293 assertEq(f(-Math.pow(2,i)), -Math.pow(2,i)); |
|
294 assertEq(f(-Math.pow(2,i)-1), -Math.pow(2,i)-1); |
|
295 } |
|
296 assertEq(f(INT32_MIN), INT32_MIN); |
|
297 assertEq(f(INT32_MAX), INT32_MAX); |
|
298 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/2)|0; } return f;")); |
|
299 for (let i = 0; i < 31; i++) { |
|
300 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/2)|0); |
|
301 assertEq(f(Math.pow(2,i)-1), ((Math.pow(2,i)-1)/2)|0); |
|
302 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i)/2)|0); |
|
303 assertEq(f(-Math.pow(2,i)-1), ((-Math.pow(2,i)-1)/2)|0); |
|
304 } |
|
305 assertEq(f(INT32_MIN), (INT32_MIN/2)|0); |
|
306 assertEq(f(INT32_MAX), (INT32_MAX/2)|0); |
|
307 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/4)|0; } return f;")); |
|
308 for (let i = 0; i < 31; i++) { |
|
309 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/4)|0); |
|
310 assertEq(f(Math.pow(2,i)-1), ((Math.pow(2,i)-1)/4)|0); |
|
311 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i)/4)|0); |
|
312 assertEq(f(-Math.pow(2,i)-1), ((-Math.pow(2,i)-1)/4)|0); |
|
313 } |
|
314 assertEq(f(INT32_MIN), (INT32_MIN/4)|0); |
|
315 assertEq(f(INT32_MAX), (INT32_MAX/4)|0); |
|
316 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/1073741824)|0; } return f;")); |
|
317 for (let i = 0; i < 31; i++) { |
|
318 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/Math.pow(2,30))|0); |
|
319 assertEq(f(Math.pow(2,i)-1), ((Math.pow(2,i)-1)/Math.pow(2,30))|0); |
|
320 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i)/Math.pow(2,30))|0); |
|
321 assertEq(f(-Math.pow(2,i)-1), ((-Math.pow(2,i)-1)/Math.pow(2,30))|0); |
|
322 } |
|
323 assertEq(f(INT32_MIN), (INT32_MIN/Math.pow(2,30))|0); |
|
324 assertEq(f(INT32_MAX), (INT32_MAX/Math.pow(2,30))|0); |
|
325 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((((i|0)/1)|0)+i)|0; } return f;")); |
|
326 for (let i = 0; i < 31; i++) { |
|
327 assertEq(f(Math.pow(2,i)), (Math.pow(2,i) * 2)|0); |
|
328 assertEq(f(Math.pow(2,i) - 1), ((Math.pow(2,i) - 1) * 2)|0); |
|
329 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i) * 2)|0); |
|
330 assertEq(f(-Math.pow(2,i) - 1), ((-Math.pow(2,i) - 1) * 2)|0); |
|
331 } |
|
332 assertEq(f(INT32_MIN), (INT32_MIN * 2)|0); |
|
333 assertEq(f(INT32_MAX), (INT32_MAX * 2)|0); |
|
334 |
|
335 // Signed integer division by a power of two - with a non-negative numerator! |
|
336 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/1)|0; } return f;")); |
|
337 for (let i = 0; i < 31; i++) { |
|
338 assertEq(f(Math.pow(2,i)), Math.pow(2,i)); |
|
339 assertEq(f(Math.pow(2,i+1)-1), Math.pow(2,i+1)-1); |
|
340 } |
|
341 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/2)|0; } return f;")); |
|
342 for (let i = 0; i < 31; i++) { |
|
343 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/2)|0); |
|
344 assertEq(f(Math.pow(2,i+1)-1), ((Math.pow(2,i+1)-1)/2)|0); |
|
345 } |
|
346 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/4)|0; } return f;")); |
|
347 for (let i = 0; i < 31; i++) { |
|
348 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/4)|0); |
|
349 assertEq(f(Math.pow(2,i+1)-1), ((Math.pow(2,i+1)-1)/4)|0); |
|
350 } |
|
351 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/1073741824)|0; } return f;")); |
|
352 for (let i = 0; i < 31; i++) { |
|
353 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/Math.pow(2,30))|0); |
|
354 assertEq(f(Math.pow(2,i+1)-1), ((Math.pow(2,i+1)-1)/Math.pow(2,30))|0); |
|
355 } |
|
356 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((((i|0)/1)|0)+i)|0; } return f;")); |
|
357 for (let i = 0; i < 31; i++) { |
|
358 assertEq(f(Math.pow(2,i)), (Math.pow(2,i) * 2)|0); |
|
359 assertEq(f(Math.pow(2,i+1) - 1), ((Math.pow(2,i+1) - 1) * 2)|0); |
|
360 } |