| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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 } | 
| OLD | NEW | 
|---|