testExpressions.js (19300B)
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|0; var j=0; j=~i; return j|0 } return f")); 59 assertEq(f(0), ~0); 60 assertEq(f(3), ~3); 61 assertEq(f(-3), ~-3); 62 assertEq(f(INT32_MAX), ~INT32_MAX); 63 assertEq(f(INT32_MIN), ~INT32_MIN); 64 assertEq(f(UINT32_MAX), ~UINT32_MAX); 65 66 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=+i; var j=0; j=~~i; return j|0 } return f")); 67 assertEq(f(0), 0); 68 assertEq(f(3.5), 3); 69 assertEq(f(-3.5), -3); 70 assertEq(f(INT32_MAX), INT32_MAX); 71 assertEq(f(INT32_MIN), INT32_MIN); 72 assertEq(f(UINT32_MAX), -1); 73 74 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; var j=0.0; j=+~~i; return +j } return f")); 75 assertEq(f(0), 0); 76 assertEq(f(INT32_MAX), INT32_MAX); 77 assertEq(f(INT32_MIN), INT32_MIN); 78 79 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; var j=0.1; j=+(i>>>0); return +j } return f")); 80 assertEq(f(0), 0); 81 assertEq(f(INT32_MAX), INT32_MAX); 82 assertEq(f(UINT32_MAX), UINT32_MAX); 83 84 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return (-i)|0 } return f")); 85 assertEq(f(0), 0); 86 assertEq(f(-0), 0); 87 assertEq(f(1), -1); 88 assertEq(f(INT32_MAX), INT32_MIN+1); 89 assertEq(f(INT32_MIN), INT32_MIN); 90 91 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=+i; return +(-i) } return f")); 92 assertEq(f(0), -0); 93 assertEq(f(-0), 0); 94 assertEq(f(-1), 1); 95 assertEq(f(1), -1); 96 assertEq(f(Math.pow(2,50)), -Math.pow(2,50)); 97 assertEq(f(1.54e20), -1.54e20); 98 99 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i|0) < (j|0))|0 } return f")); 100 assertEq(f(0, 1), 1); 101 assertEq(f(1, 0), 0); 102 assertEq(f(1, 1), 0); 103 assertEq(f(INT32_MIN, INT32_MAX), 1); 104 assertEq(f(INT32_MAX, INT32_MIN), 0); 105 assertEq(f(0, INT32_MAX), 1); 106 assertEq(f(INT32_MAX, 0), 0); 107 assertEq(f(INT32_MIN, 0), 1); 108 assertEq(f(0, INT32_MIN), 0); 109 assertEq(f(UINT32_MAX, 0), 1); 110 assertEq(f(0, UINT32_MAX), 0); 111 112 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i>>>0) < (j>>>0))|0 } return f")); 113 assertEq(f(0, 1), 1); 114 assertEq(f(1, 0), 0); 115 assertEq(f(1, 1), 0); 116 assertEq(f(INT32_MIN, INT32_MAX), 0); 117 assertEq(f(INT32_MAX, INT32_MIN), 1); 118 assertEq(f(0, INT32_MAX), 1); 119 assertEq(f(INT32_MAX, 0), 0); 120 assertEq(f(INT32_MIN, 0), 0); 121 assertEq(f(0, INT32_MIN), 1); 122 assertEq(f(UINT32_MAX, 0), 0); 123 assertEq(f(0, UINT32_MAX), 1); 124 125 var f = 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")); 126 assertEq(f(1,2), 0); 127 assertEq(f(1,1), 1); 128 assertEq(f(2,1), 0); 129 130 var f = 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")); 131 assertEq(f(1,2), 1); 132 assertEq(f(1,1), 0); 133 assertEq(f(2,1), 1); 134 135 var f = 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")); 136 assertEq(f(1,2), 1); 137 assertEq(f(1,1), 0); 138 assertEq(f(1,0), 0); 139 140 var f = 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")); 141 assertEq(f(1,2), 0); 142 assertEq(f(1,1), 0); 143 assertEq(f(1,0), 1); 144 145 var f = 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")); 146 assertEq(f(1,2), 1); 147 assertEq(f(1,1), 1); 148 assertEq(f(1,0), 0); 149 150 var f = 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")); 151 assertEq(f(1,2), 0); 152 assertEq(f(1,1), 1); 153 assertEq(f(1,0), 1); 154 155 assertEq(asmLink(asmCompile(USE_ASM + "const I=2; function f(i) { i=i|0; var k=0; k=(i|0)<I; return k|0 } return f"))(1), 1); 156 assertEq(asmLink(asmCompile(USE_ASM + "const I=2; function f(i) { i=i|0; var k=0; k=(i>>>0)<I; return k|0 } return f"))(1), 1); 157 assertEq(asmLink(asmCompile(USE_ASM + "const I=-2; function f(i) { i=i|0; var k=0; k=(i|0)<I; return k|0 } return f"))(-1), 0); 158 assertAsmTypeFail(USE_ASM + "const I=-2; function f(i) { i=i|0; var k=0; k=(i>>>0)<I; return k|0 } return f"); 159 assertAsmTypeFail(USE_ASM + "const I=0x80000000; function f(i) { i=i|0; var k=0; k=(i|0)<I; return k|0 } return f"); 160 161 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i|0)/(j|0))|0 } return f")); 162 assertEq(f(4,2), 2); 163 assertEq(f(3,2), 1); 164 assertEq(f(3,-2), -1); 165 assertEq(f(-3,-2), 1); 166 assertEq(f(0, -1), 0); 167 assertEq(f(0, INT32_MAX), 0); 168 assertEq(f(0, INT32_MIN), 0); 169 assertEq(f(INT32_MAX, 0), 0); 170 assertEq(f(INT32_MIN, 0), 0); 171 assertEq(f(-1, INT32_MAX), 0); 172 assertEq(f(-1, INT32_MIN), 0); 173 assertEq(f(INT32_MAX, -1), -INT32_MAX); 174 assertEq(f(INT32_MIN, -1), INT32_MIN); // !! 175 assertEq(f(INT32_MAX, INT32_MAX), 1); 176 assertEq(f(INT32_MAX, INT32_MIN), 0); 177 assertEq(f(INT32_MIN, INT32_MAX), -1); 178 assertEq(f(INT32_MIN, INT32_MIN), 1); 179 180 var f = asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; return ((i>>>0)/(j>>>0))|0 } return f")); 181 assertEq(f(4,2), 2); 182 assertEq(f(3,2), 1); 183 assertEq(f(3,-2), 0); 184 assertEq(f(-3,-2), 0); 185 assertEq(f(0, -1), 0); 186 assertEq(f(0, INT32_MAX), 0); 187 assertEq(f(0, INT32_MIN), 0); 188 assertEq(f(0, UINT32_MAX), 0); 189 assertEq(f(INT32_MAX, 0), 0); 190 assertEq(f(INT32_MIN, 0), 0); 191 assertEq(f(UINT32_MAX, 0), 0); 192 assertEq(f(-1, INT32_MAX), 2); 193 assertEq(f(-1, INT32_MIN), 1); 194 assertEq(f(-1, UINT32_MAX), 1); 195 assertEq(f(INT32_MAX, -1), 0); 196 assertEq(f(INT32_MIN, -1), 0); 197 assertEq(f(UINT32_MAX, -1), 1); 198 assertEq(f(INT32_MAX, INT32_MAX), 1); 199 assertEq(f(INT32_MAX, INT32_MIN), 0); 200 assertEq(f(UINT32_MAX, INT32_MAX), 2); 201 assertEq(f(INT32_MAX, UINT32_MAX), 0); 202 assertEq(f(UINT32_MAX, UINT32_MAX), 1); 203 assertEq(f(INT32_MIN, INT32_MAX), 1); 204 assertEq(f(INT32_MIN, UINT32_MAX), 0); 205 assertEq(f(INT32_MIN, INT32_MIN), 1); 206 207 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")); 208 assertEq(f(4,2), 0); 209 assertEq(f(3,2), 1); 210 assertEq(f(3,-2), 1); 211 assertEq(f(-3,-2), -1); 212 assertEq(f(0, -1), 0); 213 assertEq(f(0, INT32_MAX), 0); 214 assertEq(f(0, INT32_MIN), 0); 215 assertEq(f(INT32_MAX, 0), 0); 216 assertEq(f(INT32_MIN, 0), 0); 217 assertEq(f(-1, INT32_MAX), -1); 218 assertEq(f(-1, INT32_MIN), -1); 219 assertEq(f(INT32_MAX, -1), 0); 220 assertEq(f(INT32_MIN, -1), 0); // !! 221 assertEq(f(INT32_MAX, INT32_MAX), 0); 222 assertEq(f(INT32_MAX, INT32_MIN), INT32_MAX); 223 assertEq(f(INT32_MIN, INT32_MAX), -1); 224 assertEq(f(INT32_MIN, INT32_MIN), 0); 225 226 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")); 227 assertEq(f(0), 0); 228 assertEq(f(-1), -1); 229 assertEq(f(-3), -3); 230 assertEq(f(-4), 0); 231 assertEq(f(INT32_MIN), 0); 232 assertEq(f(3), 3); 233 assertEq(f(4), 0); 234 assertEq(f(INT32_MAX), 3); 235 236 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")); 237 assertEq(f(4,2), 0); 238 assertEq(f(3,2), 1); 239 assertEq(f(3,-2), 3); 240 assertEq(f(-3,-2), -3); 241 assertEq(f(0, -1), 0); 242 assertEq(f(0, INT32_MAX), 0); 243 assertEq(f(0, INT32_MIN), 0); 244 assertEq(f(0, UINT32_MAX), 0); 245 assertEq(f(INT32_MAX, 0), 0); 246 assertEq(f(INT32_MIN, 0), 0); 247 assertEq(f(UINT32_MAX, 0), 0); 248 assertEq(f(-1, INT32_MAX), 1); 249 assertEq(f(-1, INT32_MIN), INT32_MAX); 250 assertEq(f(-1, UINT32_MAX), 0); 251 assertEq(f(INT32_MAX, -1), INT32_MAX); 252 assertEq(f(INT32_MIN, -1), INT32_MIN); 253 assertEq(f(UINT32_MAX, -1), 0); 254 assertEq(f(INT32_MAX, INT32_MAX), 0); 255 assertEq(f(INT32_MAX, INT32_MIN), INT32_MAX); 256 assertEq(f(UINT32_MAX, INT32_MAX), 1); 257 assertEq(f(INT32_MAX, UINT32_MAX), INT32_MAX); 258 assertEq(f(UINT32_MAX, UINT32_MAX), 0); 259 assertEq(f(INT32_MIN, INT32_MAX), 1); 260 assertEq(f(INT32_MIN, UINT32_MAX), INT32_MIN); 261 assertEq(f(INT32_MIN, INT32_MIN), 0); 262 263 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 / 2)|0 } return f"))(), 2); 264 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (3 / 2)|0 } return f"))(), 1); 265 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 % 2)|0 } return f"))(), 0); 266 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (3 % 2)|0 } return f"))(), 1); 267 268 assertAsmTypeFail(USE_ASM + "function f() { var i=42,j=1.1; return +(i?i:j) } return f"); 269 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return 0; 1 ? 1 : 1; return 0; } return f"))(), 0); 270 assertEq(asmLink(asmCompile(USE_ASM + "function f() { var i=42,j=1.1; return +(i?+(i|0):j) } return f"))(), 42); 271 assertEq(asmLink(asmCompile(USE_ASM + "function f() { var i=42,j=1; return (i?i:j)|0 } return f"))(), 42); 272 assertEq(asmLink(asmCompile(USE_ASM + "function f() { var i=42,j=1; return 13; return (i?i:j)|0 } return f"))(), 13); 273 274 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (0 > (-(~~1) >>> 0)) | 0; } return f"))(), 0); 275 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return 0 < 4294967294 | 0; } return f"))(), 1); 276 277 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")); 278 assertEq(f(2, 4), 104); 279 assertEq(f(-2, -4), 8); 280 281 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")); 282 assertEq(f(1,2,3), 3); 283 assertEq(f(1,3,2), 3); 284 assertEq(f(2,1,3), 3); 285 assertEq(f(2,3,1), 3); 286 assertEq(f(3,1,2), 3); 287 assertEq(f(3,2,1), 3); 288 289 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")); 290 assertEq(f(1,true), 1); 291 assertEq(f(-1,true), 0); 292 assertEq(f(-5,true), 1); 293 assertEq(f(1,false), 0); 294 assertEq(f(-1,false), 0); 295 assertEq(f(-5,false), 1); 296 297 assertAsmTypeFail('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return (i32[0]+1)|0 } return f"); 298 new Float64Array(BUF_64KB)[0] = 2.3; 299 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); 300 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); 301 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); 302 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); 303 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); 304 assertEq(asmLink(asmCompile('glob','imp','b', USE_ASM + HEAP_IMPORTS + "function f() { return +-f64[0] } return f"), this, null, BUF_64KB)(), -2.3); 305 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)); 306 new Int32Array(BUF_64KB)[0] = 42; 307 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); 308 309 // beware ye phis of comparisons and integers 310 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 ")); 311 assertEq(f(0), -1); 312 assertEq(f(1), 0); 313 assertEq(f(2), 1); 314 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 ")); 315 assertEq(f(0), -1); 316 assertEq(f(1), 0); 317 assertEq(f(2), 0); 318 319 // beware ye constant-evaluate of boolean-producing operators 320 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 | (2 == 2))|0 } return f"))(), 5); 321 assertEq(asmLink(asmCompile(USE_ASM + "function f() { return (4 | (!2))|0 } return f"))(), 4); 322 323 // get that order-of-operations right! 324 var buf = new ArrayBuffer(BUF_MIN); 325 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)(); 326 assertEq(new Int32Array(buf)[0], 42); 327 328 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) 329 330 // Signed integer division by a power of two. 331 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/1)|0; } return f;")); 332 for (let i = 0; i < 31; i++) { 333 assertEq(f(Math.pow(2,i)), Math.pow(2,i)); 334 assertEq(f(Math.pow(2,i)-1), Math.pow(2,i)-1); 335 assertEq(f(-Math.pow(2,i)), -Math.pow(2,i)); 336 assertEq(f(-Math.pow(2,i)-1), -Math.pow(2,i)-1); 337 } 338 assertEq(f(INT32_MIN), INT32_MIN); 339 assertEq(f(INT32_MAX), INT32_MAX); 340 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/2)|0; } return f;")); 341 for (let i = 0; i < 31; i++) { 342 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/2)|0); 343 assertEq(f(Math.pow(2,i)-1), ((Math.pow(2,i)-1)/2)|0); 344 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i)/2)|0); 345 assertEq(f(-Math.pow(2,i)-1), ((-Math.pow(2,i)-1)/2)|0); 346 } 347 assertEq(f(INT32_MIN), (INT32_MIN/2)|0); 348 assertEq(f(INT32_MAX), (INT32_MAX/2)|0); 349 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/4)|0; } return f;")); 350 for (let i = 0; i < 31; i++) { 351 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/4)|0); 352 assertEq(f(Math.pow(2,i)-1), ((Math.pow(2,i)-1)/4)|0); 353 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i)/4)|0); 354 assertEq(f(-Math.pow(2,i)-1), ((-Math.pow(2,i)-1)/4)|0); 355 } 356 assertEq(f(INT32_MIN), (INT32_MIN/4)|0); 357 assertEq(f(INT32_MAX), (INT32_MAX/4)|0); 358 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((i|0)/1073741824)|0; } return f;")); 359 for (let i = 0; i < 31; i++) { 360 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/Math.pow(2,30))|0); 361 assertEq(f(Math.pow(2,i)-1), ((Math.pow(2,i)-1)/Math.pow(2,30))|0); 362 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i)/Math.pow(2,30))|0); 363 assertEq(f(-Math.pow(2,i)-1), ((-Math.pow(2,i)-1)/Math.pow(2,30))|0); 364 } 365 assertEq(f(INT32_MIN), (INT32_MIN/Math.pow(2,30))|0); 366 assertEq(f(INT32_MAX), (INT32_MAX/Math.pow(2,30))|0); 367 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return ((((i|0)/1)|0)+i)|0; } return f;")); 368 for (let i = 0; i < 31; i++) { 369 assertEq(f(Math.pow(2,i)), (Math.pow(2,i) * 2)|0); 370 assertEq(f(Math.pow(2,i) - 1), ((Math.pow(2,i) - 1) * 2)|0); 371 assertEq(f(-Math.pow(2,i)), (-Math.pow(2,i) * 2)|0); 372 assertEq(f(-Math.pow(2,i) - 1), ((-Math.pow(2,i) - 1) * 2)|0); 373 } 374 assertEq(f(INT32_MIN), (INT32_MIN * 2)|0); 375 assertEq(f(INT32_MAX), (INT32_MAX * 2)|0); 376 377 // Signed integer division by a power of two - with a non-negative numerator! 378 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/1)|0; } return f;")); 379 for (let i = 0; i < 31; i++) { 380 assertEq(f(Math.pow(2,i)), Math.pow(2,i)); 381 assertEq(f(Math.pow(2,i+1)-1), Math.pow(2,i+1)-1); 382 } 383 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/2)|0; } return f;")); 384 for (let i = 0; i < 31; i++) { 385 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/2)|0); 386 assertEq(f(Math.pow(2,i+1)-1), ((Math.pow(2,i+1)-1)/2)|0); 387 } 388 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/4)|0; } return f;")); 389 for (let i = 0; i < 31; i++) { 390 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/4)|0); 391 assertEq(f(Math.pow(2,i+1)-1), ((Math.pow(2,i+1)-1)/4)|0); 392 } 393 var f = asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; i=(i&2147483647)|0; return ((i|0)/1073741824)|0; } return f;")); 394 for (let i = 0; i < 31; i++) { 395 assertEq(f(Math.pow(2,i)), (Math.pow(2,i)/Math.pow(2,30))|0); 396 assertEq(f(Math.pow(2,i+1)-1), ((Math.pow(2,i+1)-1)/Math.pow(2,30))|0); 397 } 398 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;")); 399 for (let i = 0; i < 31; i++) { 400 assertEq(f(Math.pow(2,i)), (Math.pow(2,i) * 2)|0); 401 assertEq(f(Math.pow(2,i+1) - 1), ((Math.pow(2,i+1) - 1) * 2)|0); 402 } 403 assertEq(asmLink(asmCompile(USE_ASM + "var g=0; function f(x, y) { x = x|0; y = y|0; g = (x>>>0)%(y>>>0)|0; return (x|0)%(y|0)|0; } return f;"))(0xff40001, 0xfff80000), 0x40001);