bigint-or.js (3066B)
1 // |jit-test| test-join=--spectre-mitigations=off 2 3 // These do not test atomicity, just that code generation for BigInt values 4 // works correctly. 5 6 const bigIntValues = [ 7 // Definitely heap digits. 8 -(2n ** 2000n), 9 -(2n ** 1000n), 10 11 // -(2n**64n) 12 -18446744073709551617n, 13 -18446744073709551616n, 14 -18446744073709551615n, 15 16 // -(2n**63n) 17 -9223372036854775809n, 18 -9223372036854775808n, 19 -9223372036854775807n, 20 21 // -(2**32) 22 -4294967297n, 23 -4294967296n, 24 -4294967295n, 25 26 // -(2**31) 27 -2147483649n, 28 -2147483648n, 29 -2147483647n, 30 31 -1n, 32 0n, 33 1n, 34 35 // 2**31 36 2147483647n, 37 2147483648n, 38 2147483649n, 39 40 // 2**32 41 4294967295n, 42 4294967296n, 43 4294967297n, 44 45 // 2n**63n 46 9223372036854775807n, 47 9223372036854775808n, 48 9223372036854775809n, 49 50 // 2n**64n 51 18446744073709551615n, 52 18446744073709551616n, 53 18446744073709551617n, 54 55 // Definitely heap digits. 56 2n ** 1000n, 57 2n ** 2000n, 58 ]; 59 60 function testOr() { 61 const int64 = new BigInt64Array(2); 62 const uint64 = new BigUint64Array(2); 63 64 const int64All = -1n; 65 const uint64All = 0xffff_ffff_ffff_ffffn; 66 67 // Test with constant index. 68 for (let i = 0; i < 20; ++i) { 69 for (let j = 0; j < bigIntValues.length; ++j) { 70 let value = bigIntValues[j]; 71 72 // x | 0 == x 73 assertEq(Atomics.or(int64, 0, value), 0n); 74 assertEq(int64[0], BigInt.asIntN(64, value)); 75 76 assertEq(Atomics.or(uint64, 0, value), 0n); 77 assertEq(uint64[0], BigInt.asUintN(64, value)); 78 79 // 0 | x == x 80 assertEq(Atomics.or(int64, 0, 0n), BigInt.asIntN(64, value)); 81 assertEq(int64[0], BigInt.asIntN(64, value)); 82 83 assertEq(Atomics.or(uint64, 0, 0n), BigInt.asUintN(64, value)); 84 assertEq(uint64[0], BigInt.asUintN(64, value)); 85 86 // x | ~x == -1 87 assertEq(Atomics.or(int64, 0, ~value), BigInt.asIntN(64, value)); 88 assertEq(int64[0], int64All); 89 90 assertEq(Atomics.or(uint64, 0, ~value), BigInt.asUintN(64, value)); 91 assertEq(uint64[0], uint64All); 92 93 int64[0] = 0n; 94 uint64[0] = 0n; 95 } 96 } 97 98 // Test with variable index. 99 for (let i = 0; i < 20; ++i) { 100 for (let j = 0; j < bigIntValues.length; ++j) { 101 let value = bigIntValues[j]; 102 let idx = j & 1; 103 104 // x | 0 == x 105 assertEq(Atomics.or(int64, idx, value), 0n); 106 assertEq(int64[idx], BigInt.asIntN(64, value)); 107 108 assertEq(Atomics.or(uint64, idx, value), 0n); 109 assertEq(uint64[idx], BigInt.asUintN(64, value)); 110 111 // 0 | x == x 112 assertEq(Atomics.or(int64, idx, 0n), BigInt.asIntN(64, value)); 113 assertEq(int64[idx], BigInt.asIntN(64, value)); 114 115 assertEq(Atomics.or(uint64, idx, 0n), BigInt.asUintN(64, value)); 116 assertEq(uint64[idx], BigInt.asUintN(64, value)); 117 118 // x | ~x == -1 119 assertEq(Atomics.or(int64, idx, ~value), BigInt.asIntN(64, value)); 120 assertEq(int64[idx], int64All); 121 122 assertEq(Atomics.or(uint64, idx, ~value), BigInt.asUintN(64, value)); 123 assertEq(uint64[idx], uint64All); 124 125 int64[idx] = 0n; 126 uint64[idx] = 0n; 127 } 128 } 129 } 130 for (let i = 0; i < 2; ++i) testOr();