summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/mutable-globals.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/mutable-globals.js')
-rw-r--r--deps/v8/test/mjsunit/wasm/mutable-globals.js300
1 files changed, 300 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/wasm/mutable-globals.js b/deps/v8/test/mjsunit/wasm/mutable-globals.js
new file mode 100644
index 0000000000..0ed8b9d3ad
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/mutable-globals.js
@@ -0,0 +1,300 @@
+// Copyright 2018 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-mut-global
+
+function assertGlobalIsValid(global) {
+ assertSame(WebAssembly.Global.prototype, global.__proto__);
+ assertSame(WebAssembly.Global, global.constructor);
+ assertTrue(global instanceof Object);
+ assertTrue(global instanceof WebAssembly.Global);
+}
+
+(function TestConstructor() {
+
+ assertTrue(WebAssembly.Global instanceof Function);
+ assertSame(WebAssembly.Global, WebAssembly.Global.prototype.constructor);
+
+ assertThrows(() => new WebAssembly.Global(), TypeError);
+ assertThrows(() => new WebAssembly.Global(1), TypeError);
+ assertThrows(() => new WebAssembly.Global(""), TypeError);
+
+ assertThrows(() => new WebAssembly.Global({}), TypeError);
+ assertThrows(() => new WebAssembly.Global({type: 'foo'}), TypeError);
+ assertThrows(() => new WebAssembly.Global({type: 'i64'}), TypeError);
+
+ for (let type of ['i32', 'f32', 'f64']) {
+ assertGlobalIsValid(new WebAssembly.Global({type}));
+ }
+})();
+
+// Copied from //src/v8/test/cctest/compiler/value-helper.h
+const u32_values = [
+ 0x00000000, 0x00000001, 0xFFFFFFFF, 0x1B09788B, 0x04C5FCE8, 0xCC0DE5BF,
+ // This row is useful for testing lea optimizations on intel.
+ 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000008, 0x00000009,
+ 0x273A798E, 0x187937A3, 0xECE3AF83, 0x5495A16B, 0x0B668ECC, 0x11223344,
+ 0x0000009E, 0x00000043, 0x0000AF73, 0x0000116B, 0x00658ECC, 0x002B3B4C,
+ 0x88776655, 0x70000000, 0x07200000, 0x7FFFFFFF, 0x56123761, 0x7FFFFF00,
+ 0x761C4761, 0x80000000, 0x88888888, 0xA0000000, 0xDDDDDDDD, 0xE0000000,
+ 0xEEEEEEEE, 0xFFFFFFFD, 0xF0000000, 0x007FFFFF, 0x003FFFFF, 0x001FFFFF,
+ 0x000FFFFF, 0x0007FFFF, 0x0003FFFF, 0x0001FFFF, 0x0000FFFF, 0x00007FFF,
+ 0x00003FFF, 0x00001FFF, 0x00000FFF, 0x000007FF, 0x000003FF, 0x000001FF,
+ // Bit pattern of a quiet NaN and signaling NaN, with or without
+ // additional payload.
+ 0x7FC00000, 0x7F800000, 0x7FFFFFFF, 0x7F876543
+];
+
+const f32_values = [
+ -Infinity,
+ -2.70497e+38,
+ -1.4698e+37,
+ -1.22813e+35,
+ -1.20555e+35,
+ -1.34584e+34,
+ -1.0079e+32,
+ -6.49364e+26,
+ -3.06077e+25,
+ -1.46821e+25,
+ -1.17658e+23,
+ -1.9617e+22,
+ -2.7357e+20,
+ -9223372036854775808.0, // INT64_MIN
+ -1.48708e+13,
+ -1.89633e+12,
+ -4.66622e+11,
+ -2.22581e+11,
+ -1.45381e+10,
+ -2147483904.0, // First float32 after INT32_MIN
+ -2147483648.0, // INT32_MIN
+ -2147483520.0, // Last float32 before INT32_MIN
+ -1.3956e+09,
+ -1.32951e+09,
+ -1.30721e+09,
+ -1.19756e+09,
+ -9.26822e+08,
+ -6.35647e+08,
+ -4.00037e+08,
+ -1.81227e+08,
+ -5.09256e+07,
+ -964300.0,
+ -192446.0,
+ -28455.0,
+ -27194.0,
+ -26401.0,
+ -20575.0,
+ -17069.0,
+ -9167.0,
+ -960.178,
+ -113.0,
+ -62.0,
+ -15.0,
+ -7.0,
+ -1.0,
+ -0.0256635,
+ -4.60374e-07,
+ -3.63759e-10,
+ -4.30175e-14,
+ -5.27385e-15,
+ -1.5707963267948966,
+ -1.48084e-15,
+ -2.220446049250313e-16,
+ -1.05755e-19,
+ -3.2995e-21,
+ -1.67354e-23,
+ -1.11885e-23,
+ -1.78506e-30,
+ -5.07594e-31,
+ -3.65799e-31,
+ -1.43718e-34,
+ -1.27126e-38,
+ -0.0,
+ 0.0,
+ 1.17549e-38,
+ 1.56657e-37,
+ 4.08512e-29,
+ 3.31357e-28,
+ 6.25073e-22,
+ 4.1723e-13,
+ 1.44343e-09,
+ 1.5707963267948966,
+ 5.27004e-08,
+ 9.48298e-08,
+ 5.57888e-07,
+ 4.89988e-05,
+ 0.244326,
+ 1.0,
+ 12.4895,
+ 19.0,
+ 47.0,
+ 106.0,
+ 538.324,
+ 564.536,
+ 819.124,
+ 7048.0,
+ 12611.0,
+ 19878.0,
+ 20309.0,
+ 797056.0,
+ 1.77219e+09,
+ 2147483648.0, // INT32_MAX + 1
+ 4294967296.0, // UINT32_MAX + 1
+ 1.51116e+11,
+ 4.18193e+13,
+ 3.59167e+16,
+ 9223372036854775808.0, // INT64_MAX + 1
+ 18446744073709551616.0, // UINT64_MAX + 1
+ 3.38211e+19,
+ 2.67488e+20,
+ 1.78831e+21,
+ 9.20914e+21,
+ 8.35654e+23,
+ 1.4495e+24,
+ 5.94015e+25,
+ 4.43608e+30,
+ 2.44502e+33,
+ 2.61152e+33,
+ 1.38178e+37,
+ 1.71306e+37,
+ 3.31899e+38,
+ 3.40282e+38,
+ Infinity,
+ NaN
+];
+
+const f64_values = [
+ -2e66,
+ -2.220446049250313e-16,
+ -9223373136366403584.0,
+ -9223372036854775808.0, // INT64_MIN
+ -2147483649.5,
+ -2147483648.25,
+ -2147483648.0,
+ -2147483647.875,
+ -2147483647.125,
+ -2147483647.0,
+ -999.75,
+ -2e66,
+ -1.75,
+ -1.5707963267948966,
+ -1.0,
+ -0.5,
+ -0.0,
+ 0.0,
+ 3e-88,
+ 0.125,
+ 0.25,
+ 0.375,
+ 0.5,
+ 1.0,
+ 1.17549e-38,
+ 1.56657e-37,
+ 1.0000001,
+ 1.25,
+ 1.5707963267948966,
+ 2,
+ 3.1e7,
+ 5.125,
+ 6.25,
+ 888,
+ 982983.25,
+ 2147483647.0,
+ 2147483647.375,
+ 2147483647.75,
+ 2147483648.0,
+ 2147483648.25,
+ 2147483649.25,
+ 9223372036854775808.0, // INT64_MAX + 1
+ 9223373136366403584.0,
+ 18446744073709551616.0, // UINT64_MAX + 1
+ 2e66,
+ Infinity,
+ -Infinity,
+ NaN
+];
+
+function GlobalI32(value) {
+ return new WebAssembly.Global({type: 'i32', value});
+}
+
+function GlobalF32(value) {
+ return new WebAssembly.Global({type: 'f32', value});
+}
+
+function GlobalF64(value) {
+ return new WebAssembly.Global({type: 'f64', value});
+}
+
+(function TestDefaultValue() {
+ assertSame(0, GlobalI32().value);
+ // TODO(binji): The spec currently requires the default value to be NaN, but
+ // I think we should change this to 0. See
+ // https://github.com/WebAssembly/mutable-global/issues/6
+ assertSame(NaN, GlobalF32().value);
+ assertSame(NaN, GlobalF64().value);
+})();
+
+(function TestValueOf() {
+
+ for (let u32_value of u32_values) {
+ let i32_value = u32_value | 0;
+
+ assertSame(i32_value, GlobalI32(u32_value).valueOf());
+ assertSame(i32_value, GlobalI32(i32_value).valueOf());
+ }
+
+ for (let f32_value of f32_values) {
+ assertSame(Math.fround(f32_value), GlobalF32(f32_value).valueOf());
+ }
+
+ for (let f64_value of f64_values) {
+ assertSame(f64_value, GlobalF64(f64_value).valueOf());
+ }
+
+})();
+
+(function TestGetValue() {
+
+ for (let u32_value of u32_values) {
+ let i32_value = u32_value | 0;
+ assertSame(i32_value, GlobalI32(u32_value).value);
+ assertSame(i32_value, GlobalI32(i32_value).value);
+ }
+
+ for (let f32_value of f32_values) {
+ assertSame(Math.fround(f32_value), GlobalF32(f32_value).value);
+ }
+
+ for (let f64_value of f64_values) {
+ assertSame(f64_value, GlobalF64(f64_value).value);
+ }
+
+})();
+
+(function TestSetValue() {
+
+ for (let u32_value of u32_values) {
+ let i32_value = u32_value | 0;
+
+ let global = GlobalI32();
+ global.value = u32_value;
+ assertSame(i32_value, global.value);
+
+ global.value = i32_value;
+ assertSame(i32_value, global.value);
+ }
+
+ for (let f32_value of f32_values) {
+ let global = GlobalF32();
+ global.value = f32_value;
+ assertSame(Math.fround(f32_value), global.value);
+ }
+
+ for (let f64_value of f64_values) {
+ let global = GlobalF64();
+ global.value = f64_value;
+ assertSame(f64_value, global.value);
+ }
+
+})();