summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/atomics/bigint-or.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/atomics/bigint-or.js')
-rw-r--r--js/src/jit-test/tests/atomics/bigint-or.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/atomics/bigint-or.js b/js/src/jit-test/tests/atomics/bigint-or.js
new file mode 100644
index 0000000000..95b99958e5
--- /dev/null
+++ b/js/src/jit-test/tests/atomics/bigint-or.js
@@ -0,0 +1,130 @@
+// |jit-test| test-join=--spectre-mitigations=off
+
+// These do not test atomicity, just that code generation for BigInt values
+// works correctly.
+
+const bigIntValues = [
+ // Definitely heap digits.
+ -(2n ** 2000n),
+ -(2n ** 1000n),
+
+ // -(2n**64n)
+ -18446744073709551617n,
+ -18446744073709551616n,
+ -18446744073709551615n,
+
+ // -(2n**63n)
+ -9223372036854775809n,
+ -9223372036854775808n,
+ -9223372036854775807n,
+
+ // -(2**32)
+ -4294967297n,
+ -4294967296n,
+ -4294967295n,
+
+ // -(2**31)
+ -2147483649n,
+ -2147483648n,
+ -2147483647n,
+
+ -1n,
+ 0n,
+ 1n,
+
+ // 2**31
+ 2147483647n,
+ 2147483648n,
+ 2147483649n,
+
+ // 2**32
+ 4294967295n,
+ 4294967296n,
+ 4294967297n,
+
+ // 2n**63n
+ 9223372036854775807n,
+ 9223372036854775808n,
+ 9223372036854775809n,
+
+ // 2n**64n
+ 18446744073709551615n,
+ 18446744073709551616n,
+ 18446744073709551617n,
+
+ // Definitely heap digits.
+ 2n ** 1000n,
+ 2n ** 2000n,
+];
+
+function testOr() {
+ const int64 = new BigInt64Array(2);
+ const uint64 = new BigUint64Array(2);
+
+ const int64All = -1n;
+ const uint64All = 0xffff_ffff_ffff_ffffn;
+
+ // Test with constant index.
+ for (let i = 0; i < 20; ++i) {
+ for (let j = 0; j < bigIntValues.length; ++j) {
+ let value = bigIntValues[j];
+
+ // x | 0 == x
+ assertEq(Atomics.or(int64, 0, value), 0n);
+ assertEq(int64[0], BigInt.asIntN(64, value));
+
+ assertEq(Atomics.or(uint64, 0, value), 0n);
+ assertEq(uint64[0], BigInt.asUintN(64, value));
+
+ // 0 | x == x
+ assertEq(Atomics.or(int64, 0, 0n), BigInt.asIntN(64, value));
+ assertEq(int64[0], BigInt.asIntN(64, value));
+
+ assertEq(Atomics.or(uint64, 0, 0n), BigInt.asUintN(64, value));
+ assertEq(uint64[0], BigInt.asUintN(64, value));
+
+ // x | ~x == -1
+ assertEq(Atomics.or(int64, 0, ~value), BigInt.asIntN(64, value));
+ assertEq(int64[0], int64All);
+
+ assertEq(Atomics.or(uint64, 0, ~value), BigInt.asUintN(64, value));
+ assertEq(uint64[0], uint64All);
+
+ int64[0] = 0n;
+ uint64[0] = 0n;
+ }
+ }
+
+ // Test with variable index.
+ for (let i = 0; i < 20; ++i) {
+ for (let j = 0; j < bigIntValues.length; ++j) {
+ let value = bigIntValues[j];
+ let idx = j & 1;
+
+ // x | 0 == x
+ assertEq(Atomics.or(int64, idx, value), 0n);
+ assertEq(int64[idx], BigInt.asIntN(64, value));
+
+ assertEq(Atomics.or(uint64, idx, value), 0n);
+ assertEq(uint64[idx], BigInt.asUintN(64, value));
+
+ // 0 | x == x
+ assertEq(Atomics.or(int64, idx, 0n), BigInt.asIntN(64, value));
+ assertEq(int64[idx], BigInt.asIntN(64, value));
+
+ assertEq(Atomics.or(uint64, idx, 0n), BigInt.asUintN(64, value));
+ assertEq(uint64[idx], BigInt.asUintN(64, value));
+
+ // x | ~x == -1
+ assertEq(Atomics.or(int64, idx, ~value), BigInt.asIntN(64, value));
+ assertEq(int64[idx], int64All);
+
+ assertEq(Atomics.or(uint64, idx, ~value), BigInt.asUintN(64, value));
+ assertEq(uint64[idx], uint64All);
+
+ int64[idx] = 0n;
+ uint64[idx] = 0n;
+ }
+ }
+}
+for (let i = 0; i < 2; ++i) testOr();