[ARM,MIPS] Skip slow tests
[WebKit-https.git] / JSTests / stress / SharedArrayBuffer-opt.js
1 //@ skip
2 var dv = new DataView(new SharedArrayBuffer(128));
3 var i8a = new Int8Array(new SharedArrayBuffer(128));
4 var i16a = new Int16Array(new SharedArrayBuffer(128));
5 var i32a = new Int32Array(new SharedArrayBuffer(128));
6 var u8a = new Uint8Array(new SharedArrayBuffer(128));
7 var u8ca = new Uint8ClampedArray(new SharedArrayBuffer(128));
8 var u16a = new Uint16Array(new SharedArrayBuffer(128));
9 var u32a = new Uint32Array(new SharedArrayBuffer(128));
10 var f32a = new Float32Array(new SharedArrayBuffer(128));
11 var f64a = new Float64Array(new SharedArrayBuffer(128));
12
13 var arrays = [i8a, i16a, i32a, u8a, u16a, u32a];
14
15 var atomics = new Map();
16 var genericAtomics = new Map();
17 for (var a of arrays) {
18     var map = new Map();
19     atomics.set(a, map);
20 }
21 var count = 0;
22 for (var op of ["add", "and", "compareExchange", "exchange", "load", "or", "store", "sub", "xor"]) {
23     var numExtraArgs;
24     switch (op) {
25     case "compareExchange":
26         numExtraArgs = 2;
27         break;
28     case "load":
29         numExtraArgs = 0;
30         break;
31     default:
32         numExtraArgs = 1;
33         break;
34     }
35     
36     function str() {
37         var str = "(function (array" + count + ", index";
38         for (var i = 0; i < numExtraArgs; ++i)
39             str += ", a" + i;
40         str += ") { return Atomics." + op + "(array" + count + ", index";
41         for (var i = 0; i < numExtraArgs; ++i)
42             str += ", a" + i;
43         str += "); })";
44         count++;
45         return str;
46     }
47     
48     var f = eval(str());
49     noInline(f);
50     // Warm it up on crazy.
51     for (var i = 0; i < 10000; ++i)
52         f(arrays[i % arrays.length], 0, 0, 0);
53     genericAtomics.set(op, f);
54     
55     for (var a of arrays) {
56         var map = atomics.get(a);
57         
58         var f = eval(str());
59         noInline(f);
60         
61         // Warm it up on something easy.
62         for (var i = 0; i < 10000; ++i)
63             f(a, 0, 0, 0);
64         
65         map.set(op, f);
66     }
67 }
68
69 function runAtomic(array, index, init, name, args, expectedResult, expectedOutcome)
70 {
71     for (var f of [{name: "specialized", func: atomics.get(array).get(name)},
72                    {name: "generic", func: genericAtomics.get(name)}]) {
73         array[index] = init;
74         var result = f.func(array, index, ...args);
75         if (result != expectedResult)
76             throw new Error("Expected Atomics." + name + "(array, " + index + ", " + args.join(", ") + ") to return " + expectedResult + " but returned " + result + " for " + Object.prototype.toString.apply(array) + " and " + f.name);
77         if (array[index] !== expectedOutcome)
78             throw new Error("Expected Atomics." + name + "(array, " + index + ", " + args.join(", ") + ") to result in array[" + index + "] = " + expectedOutcome + " but got " + array[index] + " for " + Object.prototype.toString.apply(array) + " and " + f.name);
79     }
80 }
81
82 for (var a of arrays) {
83     runAtomic(a, 0, 13, "add", [42], 13, 55);
84     runAtomic(a, 0, 13, "and", [42], 13, 8);
85     runAtomic(a, 0, 13, "compareExchange", [25, 42], 13, 13);
86     runAtomic(a, 0, 13, "compareExchange", [13, 42], 13, 42);
87     runAtomic(a, 0, 13, "exchange", [42], 13, 42);
88     runAtomic(a, 0, 13, "load", [], 13, 13);
89     runAtomic(a, 0, 13, "or", [42], 13, 47);
90     runAtomic(a, 0, 13, "store", [42], 42, 42);
91     runAtomic(a, 0, 42, "sub", [13], 42, 29);
92     runAtomic(a, 0, 13, "xor", [42], 13, 39);
93 }
94
95 function shouldFail(f, name)
96 {
97     try {
98         f();
99     } catch (e) {
100         if (e.name == name.name)
101             return;
102         throw new Error(f + " threw the wrong error: " + e);
103     }
104     throw new Error(f + " succeeded!");
105 }
106
107 for (var bad of [void 0, null, false, true, 1, 0.5, Symbol(), {}, "hello", dv, u8ca, f32a, f64a]) {
108     shouldFail(() => genericAtomics.get("add")(bad, 0, 0), TypeError);
109     shouldFail(() => genericAtomics.get("and")(bad, 0, 0), TypeError);
110     shouldFail(() => genericAtomics.get("compareExchange")(bad, 0, 0, 0), TypeError);
111     shouldFail(() => genericAtomics.get("exchange")(bad, 0, 0), TypeError);
112     shouldFail(() => genericAtomics.get("load")(bad, 0), TypeError);
113     shouldFail(() => genericAtomics.get("or")(bad, 0, 0), TypeError);
114     shouldFail(() => genericAtomics.get("store")(bad, 0, 0), TypeError);
115     shouldFail(() => genericAtomics.get("sub")(bad, 0, 0), TypeError);
116     shouldFail(() => genericAtomics.get("xor")(bad, 0, 0), TypeError);
117 }
118
119 for (var idx of [-1, -1000000000000, 10000, 10000000000000, "hello"]) {
120     for (var a of arrays) {
121         for (var m of [atomics.get(a), genericAtomics]) {
122             shouldFail(() => m.get("add")(a, idx, 0), RangeError);
123             shouldFail(() => m.get("and")(a, idx, 0), RangeError);
124             shouldFail(() => m.get("compareExchange")(a, idx, 0, 0), RangeError);
125             shouldFail(() => m.get("exchange")(a, idx, 0), RangeError);
126             shouldFail(() => m.get("load")(a, idx), RangeError);
127             shouldFail(() => m.get("or")(a, idx, 0), RangeError);
128             shouldFail(() => m.get("store")(a, idx, 0), RangeError);
129             shouldFail(() => m.get("sub")(a, idx, 0), RangeError);
130             shouldFail(() => m.get("xor")(a, idx, 0), RangeError);
131         }
132     }
133 }
134