Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: test/mjsunit/external-array.js

Issue 6961019: Prevent deopt on double value assignment to typed arrays (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: more review feedback Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/lithium-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 assertEquals(2.5, get(array, 0)); 80 assertEquals(2.5, get(array, 0));
81 assertEquals(3.5, get(array, 1)); 81 assertEquals(3.5, get(array, 1));
82 } 82 }
83 83
84 // Test loads and stores. 84 // Test loads and stores.
85 types = [Array, Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, 85 types = [Array, Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array,
86 Uint32Array, PixelArray, Float32Array, Float64Array]; 86 Uint32Array, PixelArray, Float32Array, Float64Array];
87 87
88 test_result_nan = [NaN, 0, 0, 0, 0, 0, 0, 0, NaN, NaN]; 88 test_result_nan = [NaN, 0, 0, 0, 0, 0, 0, 0, NaN, NaN];
89 test_result_low_int = [-1, -1, 255, -1, 65535, -1, 0xFFFFFFFF, 0, -1, -1]; 89 test_result_low_int = [-1, -1, 255, -1, 65535, -1, 0xFFFFFFFF, 0, -1, -1];
90 test_result_low_double = [-1.25, -1, 255, -1, 65535, -1, 0xFFFFFFFF, 0, -1.25, - 1.25];
90 test_result_middle = [253.75, -3, 253, 253, 253, 253, 253, 254, 253.75, 253.75]; 91 test_result_middle = [253.75, -3, 253, 253, 253, 253, 253, 254, 253.75, 253.75];
91 test_result_high_int = [256, 0, 0, 256, 256, 256, 256, 255, 256, 256]; 92 test_result_high_int = [256, 0, 0, 256, 256, 256, 256, 255, 256, 256];
93 test_result_high_double = [256.25, 0, 0, 256, 256, 256, 256, 255, 256.25, 256.25 ];
92 94
93 const kElementCount = 40; 95 const kElementCount = 40;
94 96
95 function test_load(array, sum) { 97 function test_load(array, sum) {
96 for (var i = 0; i < kElementCount; i++) { 98 for (var i = 0; i < kElementCount; i++) {
97 sum += array[i]; 99 sum += array[i];
98 } 100 }
99 return sum; 101 return sum;
100 } 102 }
101 103
(...skipping 11 matching lines...) Expand all
113 return sum; 115 return sum;
114 } 116 }
115 117
116 function test_store_const_key(array, sum) { 118 function test_store_const_key(array, sum) {
117 sum += array[0] = 1; 119 sum += array[0] = 1;
118 sum += array[1] = 2; 120 sum += array[1] = 2;
119 sum += array[2] = 3; 121 sum += array[2] = 3;
120 return sum; 122 return sum;
121 } 123 }
122 124
125 function zero() {
126 return 0.0;
127 }
123 128
124 function test_store_middle_double(array, sum) { 129 function test_store_middle_tagged(array, sum) {
125 array[0] = 253.75; 130 array[0] = 253.75;
126 return array[0]; 131 return array[0];
127 } 132 }
128 133
129 134 function test_store_high_tagged(array, sum) {
130 function test_store_high_double(array, sum) {
131 array[0] = 256.25; 135 array[0] = 256.25;
132 return array[0]; 136 return array[0];
133 } 137 }
134 138
139 function test_store_middle_double(array, sum) {
140 array[0] = 253.75 + zero(); // + forces double type feedback
141 return array[0];
142 }
143
144 function test_store_high_double(array, sum) {
145 array[0] = 256.25 + zero(); // + forces double type feedback
146 return array[0];
147 }
148
135 function test_store_high_double(array, sum) { 149 function test_store_high_double(array, sum) {
136 array[0] = 256.25; 150 array[0] = 256.25;
137 return array[0]; 151 return array[0];
138 } 152 }
139 153
140 function test_store_low_int(array, sum) { 154 function test_store_low_int(array, sum) {
141 array[0] = -1; 155 array[0] = -1;
142 return array[0]; 156 return array[0];
143 } 157 }
144 158
159 function test_store_low_tagged(array, sum) {
160 array[0] = -1.25;
161 return array[0];
162 }
163
164 function test_store_low_double(array, sum) {
165 array[0] = -1.25 + zero(); // + forces double type feedback
166 return array[0];
167 }
168
145 function test_store_high_int(array, sum) { 169 function test_store_high_int(array, sum) {
146 array[0] = 256; 170 array[0] = 256;
147 return array[0]; 171 return array[0];
148 } 172 }
149 173
150 function test_store_nan(array, sum) { 174 function test_store_nan(array, sum) {
151 array[0] = NaN; 175 array[0] = NaN;
152 return array[0]; 176 return array[0];
153 } 177 }
154 178
155 const kRuns = 10; 179 const kRuns = 10;
156 180
157 function run_test(test_func, array, expected_result) { 181 function run_test(test_func, array, expected_result) {
158 for (var i = 0; i < 5; i++) test_func(array, 0); 182 for (var i = 0; i < 5; i++) test_func(array, 0);
159 %OptimizeFunctionOnNextCall(test_func); 183 %OptimizeFunctionOnNextCall(test_func);
160 var sum = 0; 184 var sum = 0;
161 for (var i = 0; i < kRuns; i++) { 185 for (var i = 0; i < kRuns; i++) {
162 sum = test_func(array, sum); 186 sum = test_func(array, sum);
163 } 187 }
164 assertEquals(expected_result, sum); 188 assertEquals(expected_result, sum);
165 %DeoptimizeFunction(test_func); 189 %DeoptimizeFunction(test_func);
166 gc(); // Makes V8 forget about type information for test_func. 190 gc(); // Makes V8 forget about type information for test_func.
167 } 191 }
168 192
169 for (var t = 0; t < types.length; t++) { 193 for (var t = 0; t < types.length; t++) {
170 var type = types[t]; 194 var type = types[t];
171 print ("type = " + t);
172 var a = new type(kElementCount); 195 var a = new type(kElementCount);
173 for (var i = 0; i < kElementCount; i++) { 196 for (var i = 0; i < kElementCount; i++) {
174 a[i] = i; 197 a[i] = i;
175 } 198 }
176 199
177 // Run test functions defined above. 200 // Run test functions defined above.
178 run_test(test_load, a, 780 * kRuns); 201 run_test(test_load, a, 780 * kRuns);
179 run_test(test_load_const_key, a, 3 * kRuns); 202 run_test(test_load_const_key, a, 3 * kRuns);
180 run_test(test_store, a, 820 * kRuns); 203 run_test(test_store, a, 820 * kRuns);
181 run_test(test_store_const_key, a, 6 * kRuns); 204 run_test(test_store_const_key, a, 6 * kRuns);
182 run_test(test_store_low_int, a, test_result_low_int[t]); 205 run_test(test_store_low_int, a, test_result_low_int[t]);
206 run_test(test_store_low_double, a, test_result_low_double[t]);
207 run_test(test_store_low_tagged, a, test_result_low_double[t]);
183 run_test(test_store_high_int, a, test_result_high_int[t]); 208 run_test(test_store_high_int, a, test_result_high_int[t]);
184 run_test(test_store_nan, a, test_result_nan[t]); 209 run_test(test_store_nan, a, test_result_nan[t]);
185 run_test(test_store_middle_double, a, test_result_middle[t]); 210 run_test(test_store_middle_double, a, test_result_middle[t]);
211 run_test(test_store_middle_tagged, a, test_result_middle[t]);
212 run_test(test_store_high_double, a, test_result_high_double[t]);
213 run_test(test_store_high_tagged, a, test_result_high_double[t]);
186 214
187 // Test the correct behavior of the |length| property (which is read-only). 215 // Test the correct behavior of the |length| property (which is read-only).
188 if (t != 0) { 216 if (t != 0) {
189 assertEquals(kElementCount, a.length); 217 assertEquals(kElementCount, a.length);
190 a.length = 2; 218 a.length = 2;
191 assertEquals(kElementCount, a.length); 219 assertEquals(kElementCount, a.length);
192 assertTrue(delete a.length); 220 assertTrue(delete a.length);
193 a.length = 2; 221 a.length = 2;
194 assertEquals(2, a.length); 222 assertEquals(2, a.length);
195 } 223 }
196 224
197 function array_load_set_smi_check(a) { 225 function array_load_set_smi_check(a) {
198 return a[0] = a[0] = 1; 226 return a[0] = a[0] = 1;
199 } 227 }
200 228
201 array_load_set_smi_check(a); 229 array_load_set_smi_check(a);
202 array_load_set_smi_check(0); 230 array_load_set_smi_check(0);
203 231
204 function array_load_set_smi_check2(a) { 232 function array_load_set_smi_check2(a) {
205 return a[0] = a[0] = 1; 233 return a[0] = a[0] = 1;
206 } 234 }
207 235
208 array_load_set_smi_check2(a); 236 array_load_set_smi_check2(a);
209 %OptimizeFunctionOnNextCall(array_load_set_smi_check2); 237 %OptimizeFunctionOnNextCall(array_load_set_smi_check2);
210 array_load_set_smi_check2(a); 238 array_load_set_smi_check2(a);
211 array_load_set_smi_check2(0); 239 array_load_set_smi_check2(0);
212 %DeoptimizeFunction(array_load_set_smi_check2); 240 %DeoptimizeFunction(array_load_set_smi_check2);
213 gc(); // Makes V8 forget about type information for array_load_set_smi_check. 241 gc(); // Makes V8 forget about type information for array_load_set_smi_check.
214 } 242 }
OLDNEW
« no previous file with comments | « src/x64/lithium-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698