[JSC] Add support for typed arrays to the Array profiling
[WebKit-https.git] / Source / JavaScriptCore / tests / stress / typed-array-get-by-val-profiling.js
1 function testArray(arrayType)
2 {
3     var testCode =
4         `
5         // We make this look like a polymorphic types for incomingObject but the GetByVal are never actually
6         // polymorphic. The boolean isTypedArray let us differentiate the types.
7         function ${ arrayType }AndObjectSpeculationInBounds(incomingObject, iterationLength, isTypedArray) {
8             var output = 0;
9             output += incomingObject.length;
10
11             if (isTypedArray) {
12                 for (var i = 0; i < iterationLength; ++i) {
13                     output += incomingObject[i];
14                 }
15             } else {
16                 for (var i = 0; i < iterationLength; ++i) {
17                     output += incomingObject[i];
18                 }
19             }
20             return output;
21         }
22         noInline(${ arrayType }AndObjectSpeculationInBounds);
23
24         var typedArray = new ${ arrayType }(64);
25         var regularArray = new Array(64);
26         for (var i = 0; i < 64; ++i) {
27             typedArray[i] = i;
28             regularArray[i] = i;
29         }
30
31         // Access in bounds.
32         for (var i = 0; i < 1e4; ++i) {
33             var output = ${ arrayType }AndObjectSpeculationInBounds(typedArray, 64, true);
34             if (output !== 32 * 65)
35                 throw "${ arrayType }AndObjectSpeculationInBounds(typedArray, 64, true) failed, value = " + output;
36
37             var output = ${ arrayType }AndObjectSpeculationInBounds(regularArray, 64, false);
38             if (output !== 32 * 65)
39                 throw "${ arrayType }AndObjectSpeculationInBounds(regularArray, 64, false) failed, value = " + output;
40         }
41
42         // One out of bounds on top of the in bounds profile.
43         {
44             var output = ${ arrayType }AndObjectSpeculationInBounds(typedArray, 128, true);
45             if (output === output)
46                 throw "${ arrayType }AndObjectSpeculationInBounds(typedArray, 128, true) failed, value = " + output;
47
48             var output = ${ arrayType }AndObjectSpeculationInBounds(regularArray, 128, false);
49             if (output === output)
50                 throw "${ arrayType }AndObjectSpeculationInBounds(regularArray, 128, false) failed, value = " + output;
51         }
52
53         // Same but here we make out-of-bounds a normal case.
54         function ${ arrayType }AndObjectSpeculationOutOfBounds(incomingObject, iterationLength, isTypedArray) {
55             var output = 0;
56             output += incomingObject.length;
57
58             if (isTypedArray) {
59                 for (var i = 0; i < iterationLength; ++i) {
60                     output += incomingObject[i]|0;
61                 }
62             } else {
63                 for (var i = 0; i < iterationLength; ++i) {
64                     output += incomingObject[i]|0;
65                 }
66             }
67             return output;
68         }
69         noInline(${ arrayType }AndObjectSpeculationOutOfBounds);
70
71         for (var i = 0; i < 1e4; ++i) {
72             var output = ${ arrayType }AndObjectSpeculationOutOfBounds(typedArray, 128, true);
73             if (output !== 32 * 65)
74                 throw "${ arrayType }AndObjectSpeculationOutOfBounds(typedArray, 128, true) failed, value = " + output;
75
76             var output = ${ arrayType }AndObjectSpeculationOutOfBounds(regularArray, 128, false);
77             if (output !== 32 * 65)
78                 throw "${ arrayType }AndObjectSpeculationOutOfBounds(regularArray, 128, false) failed, value = " + output;
79         }`
80     eval(testCode);
81 }
82
83 testArray("Int8Array");
84 testArray("Uint8Array");
85 testArray("Uint8ClampedArray");
86 testArray("Int16Array");
87 testArray("Uint16Array");
88 testArray("Int32Array");
89 testArray("Uint32Array");
90 testArray("Float32Array");
91 testArray("Float64Array");