tor-browser

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

recover-int64tobigint.js (6193B)


      1 // |jit-test| --ion-limit-script-size=off
      2 
      3 setJitCompilerOption("baseline.warmup.trigger", 9);
      4 setJitCompilerOption("ion.warmup.trigger", 20);
      5 
      6 // Prevent GC from cancelling/discarding Ion compilations.
      7 gczeal(0);
      8 
      9 var max = 200;
     10 
     11 // Check that we are able to remove the operation inside recover test functions
     12 // (denoted by "rop..."), when we inline the first version of uceFault, and
     13 // ensure that the bailout is correct when uceFault is replaced (which cause an
     14 // invalidation bailout).
     15 
     16 var uceFault = function (i) {
     17  if (i > 98) {
     18    uceFault = function (i) { return true; };
     19  }
     20  return false;
     21 };
     22 
     23 let i64 = new BigInt64Array(100);
     24 
     25 for (let i = 0; i < i64.length; ++i) {
     26  i64[i] = 0x8000_0000_0000_0000n + BigInt(i);
     27 }
     28 
     29 let u64 = new BigUint64Array(i64.length);
     30 u64.set(i64);
     31 
     32 let dv = new DataView(i64.buffer);
     33 
     34 let uceFault_rint64tobigint_i64_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_load'));
     35 function rint64tobigint_i64_load(i) {
     36  var y = i64[i];
     37  if (uceFault_rint64tobigint_i64_load(i) || uceFault_rint64tobigint_i64_load(i))
     38    assertEq(y, -0x7fff_ffff_ffff_ff9dn);
     39  assertRecoveredOnBailout(y, true);
     40  return i;
     41 }
     42 
     43 let uceFault_rint64tobigint_u64_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_load'));
     44 function rint64tobigint_u64_load(i) {
     45  var y = u64[i];
     46  if (uceFault_rint64tobigint_u64_load(i) || uceFault_rint64tobigint_u64_load(i))
     47    assertEq(y, 0x8000_0000_0000_0063n);
     48  assertRecoveredOnBailout(y, true);
     49  return i;
     50 }
     51 
     52 let uceFault_rint64tobigint_i64_dataview = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_dataview'));
     53 function rint64tobigint_i64_dataview(i) {
     54  var y = dv.getBigInt64(i * 8, true);
     55  if (uceFault_rint64tobigint_i64_dataview(i) || uceFault_rint64tobigint_i64_dataview(i))
     56    assertEq(y, -0x7fff_ffff_ffff_ff9dn);
     57  assertRecoveredOnBailout(y, true);
     58  return i;
     59 }
     60 
     61 let uceFault_rint64tobigint_u64_dataview = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_dataview'));
     62 function rint64tobigint_u64_dataview(i) {
     63  var y = dv.getBigUint64(i * 8, true);
     64  if (uceFault_rint64tobigint_u64_dataview(i) || uceFault_rint64tobigint_u64_dataview(i))
     65    assertEq(y, 0x8000_0000_0000_0063n);
     66  assertRecoveredOnBailout(y, true);
     67  return i;
     68 }
     69 
     70 let uceFault_rint64tobigint_i64_atomics_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_load'));
     71 function rint64tobigint_i64_atomics_load(i) {
     72  var y = Atomics.load(i64, i);
     73  if (uceFault_rint64tobigint_i64_atomics_load(i) || uceFault_rint64tobigint_i64_atomics_load(i))
     74    assertEq(y, -0x7fff_ffff_ffff_ff9dn);
     75  assertRecoveredOnBailout(y, true);
     76  return i;
     77 }
     78 
     79 let uceFault_rint64tobigint_u64_atomics_load = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_load'));
     80 function rint64tobigint_u64_atomics_load(i) {
     81  var y = Atomics.load(u64, i);
     82  if (uceFault_rint64tobigint_u64_atomics_load(i) || uceFault_rint64tobigint_u64_atomics_load(i))
     83    assertEq(y, 0x8000_0000_0000_0063n);
     84  assertRecoveredOnBailout(y, true);
     85  return i;
     86 }
     87 
     88 let uceFault_rint64tobigint_i64_atomics_and = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_and'));
     89 function rint64tobigint_i64_atomics_and(i) {
     90  var y = Atomics.and(i64, i, -1n);
     91  if (uceFault_rint64tobigint_i64_atomics_and(i) || uceFault_rint64tobigint_i64_atomics_and(i))
     92    assertEq(y, -0x7fff_ffff_ffff_ff9dn);
     93  assertRecoveredOnBailout(y, true);
     94  return i;
     95 }
     96 
     97 let uceFault_rint64tobigint_u64_atomics_and = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_and'));
     98 function rint64tobigint_u64_atomics_and(i) {
     99  var y = Atomics.and(u64, i, -1n);
    100  if (uceFault_rint64tobigint_u64_atomics_and(i) || uceFault_rint64tobigint_u64_atomics_and(i))
    101    assertEq(y, 0x8000_0000_0000_0063n);
    102  assertRecoveredOnBailout(y, true);
    103  return i;
    104 }
    105 
    106 let uceFault_rint64tobigint_i64_atomics_cmpxchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_cmpxchg'));
    107 function rint64tobigint_i64_atomics_cmpxchg(i) {
    108  var y = Atomics.compareExchange(i64, i, -1n, 0n);
    109  if (uceFault_rint64tobigint_i64_atomics_cmpxchg(i) || uceFault_rint64tobigint_i64_atomics_cmpxchg(i))
    110    assertEq(y, -0x7fff_ffff_ffff_ff9dn);
    111  assertRecoveredOnBailout(y, true);
    112  return i;
    113 }
    114 
    115 let uceFault_rint64tobigint_u64_atomics_cmpxchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_cmpxchg'));
    116 function rint64tobigint_u64_atomics_cmpxchg(i) {
    117  var y = Atomics.compareExchange(u64, i, -1n, 0n);
    118  if (uceFault_rint64tobigint_u64_atomics_cmpxchg(i) || uceFault_rint64tobigint_u64_atomics_cmpxchg(i))
    119    assertEq(y, 0x8000_0000_0000_0063n);
    120  assertRecoveredOnBailout(y, true);
    121  return i;
    122 }
    123 
    124 let uceFault_rint64tobigint_i64_atomics_xchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_i64_atomics_xchg'));
    125 function rint64tobigint_i64_atomics_xchg(i) {
    126  var y = Atomics.exchange(i64, i, -1n);
    127  if (uceFault_rint64tobigint_i64_atomics_xchg(i) || uceFault_rint64tobigint_i64_atomics_xchg(i))
    128    assertEq(y, -0x7fff_ffff_ffff_ff9dn);
    129  assertRecoveredOnBailout(y, true);
    130  return i;
    131 }
    132 
    133 let uceFault_rint64tobigint_u64_atomics_xchg = eval(`(${uceFault})`.replace('uceFault', 'uceFault_rint64tobigint_u64_atomics_xchg'));
    134 function rint64tobigint_u64_atomics_xchg(i) {
    135  var y = Atomics.exchange(u64, i, -1n);
    136  if (uceFault_rint64tobigint_u64_atomics_xchg(i) || uceFault_rint64tobigint_u64_atomics_xchg(i))
    137    assertEq(y, 0x8000_0000_0000_0063n);
    138  assertRecoveredOnBailout(y, true);
    139  return i;
    140 }
    141 
    142 for (let j = 100 - max; j < 100; j++) {
    143  with({}){} // Do not Ion-compile this loop.
    144  let i = j < 2 ? (Math.abs(j) % 50) + 2 : j;
    145 
    146  rint64tobigint_i64_load(i);
    147  rint64tobigint_u64_load(i);
    148  rint64tobigint_i64_dataview(i);
    149  rint64tobigint_u64_dataview(i);
    150  rint64tobigint_i64_atomics_load(i);
    151  rint64tobigint_u64_atomics_load(i);
    152  rint64tobigint_i64_atomics_and(i);
    153  rint64tobigint_u64_atomics_and(i);
    154  rint64tobigint_i64_atomics_cmpxchg(i);
    155  rint64tobigint_u64_atomics_cmpxchg(i);
    156  rint64tobigint_i64_atomics_xchg(i);
    157  rint64tobigint_u64_atomics_xchg(i);
    158 }