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