tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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);