Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 load(libdir + "asm.js");
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");
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");
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;
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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)
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);
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 }