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 }