| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 if (check_dictionary == CHECK_DICTIONARY) { | 97 if (check_dictionary == CHECK_DICTIONARY) { |
| 98 // Check that the properties array is a dictionary. | 98 // Check that the properties array is a dictionary. |
| 99 __ Cmp(FieldOperand(r0, HeapObject::kMapOffset), Factory::hash_table_map()); | 99 __ Cmp(FieldOperand(r0, HeapObject::kMapOffset), Factory::hash_table_map()); |
| 100 __ j(not_equal, miss_label); | 100 __ j(not_equal, miss_label); |
| 101 } | 101 } |
| 102 | 102 |
| 103 // Compute the capacity mask. | 103 // Compute the capacity mask. |
| 104 const int kCapacityOffset = | 104 const int kCapacityOffset = |
| 105 StringDictionary::kHeaderSize + | 105 StringDictionary::kHeaderSize + |
| 106 StringDictionary::kCapacityIndex * kPointerSize; | 106 StringDictionary::kCapacityIndex * kPointerSize; |
| 107 __ movq(r2, FieldOperand(r0, kCapacityOffset)); | 107 __ SmiToInteger32(r2, FieldOperand(r0, kCapacityOffset)); |
| 108 __ SmiToInteger32(r2, r2); | |
| 109 __ decl(r2); | 108 __ decl(r2); |
| 110 | 109 |
| 111 // Generate an unrolled loop that performs a few probes before | 110 // Generate an unrolled loop that performs a few probes before |
| 112 // giving up. Measurements done on Gmail indicate that 2 probes | 111 // giving up. Measurements done on Gmail indicate that 2 probes |
| 113 // cover ~93% of loads from dictionaries. | 112 // cover ~93% of loads from dictionaries. |
| 114 static const int kProbes = 4; | 113 static const int kProbes = 4; |
| 115 const int kElementsStartOffset = | 114 const int kElementsStartOffset = |
| 116 StringDictionary::kHeaderSize + | 115 StringDictionary::kHeaderSize + |
| 117 StringDictionary::kElementsStartIndex * kPointerSize; | 116 StringDictionary::kElementsStartIndex * kPointerSize; |
| 118 for (int i = 0; i < kProbes; i++) { | 117 for (int i = 0; i < kProbes; i++) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 __ shrl(r1, Immediate(4)); | 194 __ shrl(r1, Immediate(4)); |
| 196 __ xorl(r0, r1); | 195 __ xorl(r0, r1); |
| 197 // hash = hash * 2057; | 196 // hash = hash * 2057; |
| 198 __ imull(r0, r0, Immediate(2057)); | 197 __ imull(r0, r0, Immediate(2057)); |
| 199 // hash = hash ^ (hash >> 16); | 198 // hash = hash ^ (hash >> 16); |
| 200 __ movl(r1, r0); | 199 __ movl(r1, r0); |
| 201 __ shrl(r1, Immediate(16)); | 200 __ shrl(r1, Immediate(16)); |
| 202 __ xorl(r0, r1); | 201 __ xorl(r0, r1); |
| 203 | 202 |
| 204 // Compute capacity mask. | 203 // Compute capacity mask. |
| 205 __ movq(r1, FieldOperand(elements, NumberDictionary::kCapacityOffset)); | 204 __ SmiToInteger32(r1, |
| 206 __ SmiToInteger32(r1, r1); | 205 FieldOperand(elements, NumberDictionary::kCapacityOffset)); |
| 207 __ decl(r1); | 206 __ decl(r1); |
| 208 | 207 |
| 209 // Generate an unrolled loop that performs a few probes before giving up. | 208 // Generate an unrolled loop that performs a few probes before giving up. |
| 210 const int kProbes = 4; | 209 const int kProbes = 4; |
| 211 for (int i = 0; i < kProbes; i++) { | 210 for (int i = 0; i < kProbes; i++) { |
| 212 // Use r2 for index calculations and keep the hash intact in r0. | 211 // Use r2 for index calculations and keep the hash intact in r0. |
| 213 __ movq(r2, r0); | 212 __ movq(r2, r0); |
| 214 // Compute the masked index: (hash + i + i * i) & mask. | 213 // Compute the masked index: (hash + i + i * i) & mask. |
| 215 if (i > 0) { | 214 if (i > 0) { |
| 216 __ addl(r2, Immediate(NumberDictionary::GetProbeOffset(i))); | 215 __ addl(r2, Immediate(NumberDictionary::GetProbeOffset(i))); |
| (...skipping 1399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 GenerateMiss(masm); | 1615 GenerateMiss(masm); |
| 1617 } | 1616 } |
| 1618 | 1617 |
| 1619 | 1618 |
| 1620 #undef __ | 1619 #undef __ |
| 1621 | 1620 |
| 1622 | 1621 |
| 1623 } } // namespace v8::internal | 1622 } } // namespace v8::internal |
| 1624 | 1623 |
| 1625 #endif // V8_TARGET_ARCH_X64 | 1624 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |