| 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 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 __ movl(rcx, rbx); | 460 __ movl(rcx, rbx); |
| 461 __ shr(rcx, Immediate(KeyedLookupCache::kMapHashShift)); | 461 __ shr(rcx, Immediate(KeyedLookupCache::kMapHashShift)); |
| 462 __ movl(rdi, FieldOperand(rax, String::kHashFieldOffset)); | 462 __ movl(rdi, FieldOperand(rax, String::kHashFieldOffset)); |
| 463 __ shr(rdi, Immediate(String::kHashShift)); | 463 __ shr(rdi, Immediate(String::kHashShift)); |
| 464 __ xor_(rcx, rdi); | 464 __ xor_(rcx, rdi); |
| 465 int mask = (KeyedLookupCache::kCapacityMask & KeyedLookupCache::kHashMask); | 465 int mask = (KeyedLookupCache::kCapacityMask & KeyedLookupCache::kHashMask); |
| 466 __ and_(rcx, Immediate(mask)); | 466 __ and_(rcx, Immediate(mask)); |
| 467 | 467 |
| 468 // Load the key (consisting of map and symbol) from the cache and | 468 // Load the key (consisting of map and symbol) from the cache and |
| 469 // check for match. | 469 // check for match. |
| 470 Label try_second_entry, hit_on_first_entry, load_in_object_property; | 470 Label load_in_object_property; |
| 471 static const int kEntriesPerBucket = KeyedLookupCache::kEntriesPerBucket; |
| 472 Label hit_on_nth_entry[kEntriesPerBucket]; |
| 471 ExternalReference cache_keys | 473 ExternalReference cache_keys |
| 472 = ExternalReference::keyed_lookup_cache_keys(masm->isolate()); | 474 = ExternalReference::keyed_lookup_cache_keys(masm->isolate()); |
| 473 __ movq(rdi, rcx); | |
| 474 __ shl(rdi, Immediate(kPointerSizeLog2 + 1)); | |
| 475 __ LoadAddress(kScratchRegister, cache_keys); | |
| 476 __ cmpq(rbx, Operand(kScratchRegister, rdi, times_1, 0)); | |
| 477 __ j(not_equal, &try_second_entry); | |
| 478 __ cmpq(rax, Operand(kScratchRegister, rdi, times_1, kPointerSize)); | |
| 479 __ j(equal, &hit_on_first_entry); | |
| 480 | 475 |
| 481 __ bind(&try_second_entry); | 476 for (int i = 0; i < kEntriesPerBucket - 1; i++) { |
| 482 __ cmpq(rbx, Operand(kScratchRegister, rdi, times_1, kPointerSize * 2)); | 477 Label try_next_entry; |
| 478 __ movq(rdi, rcx); |
| 479 __ shl(rdi, Immediate(kPointerSizeLog2 + 1)); |
| 480 __ LoadAddress(kScratchRegister, cache_keys); |
| 481 int off = kPointerSize * i * 2; |
| 482 __ cmpq(rbx, Operand(kScratchRegister, rdi, times_1, off)); |
| 483 __ j(not_equal, &try_next_entry); |
| 484 __ cmpq(rax, Operand(kScratchRegister, rdi, times_1, off + kPointerSize)); |
| 485 __ j(equal, &hit_on_nth_entry[i]); |
| 486 __ bind(&try_next_entry); |
| 487 } |
| 488 |
| 489 int off = kPointerSize * (kEntriesPerBucket - 1) * 2; |
| 490 __ cmpq(rbx, Operand(kScratchRegister, rdi, times_1, off)); |
| 483 __ j(not_equal, &slow); | 491 __ j(not_equal, &slow); |
| 484 __ cmpq(rax, Operand(kScratchRegister, rdi, times_1, kPointerSize * 3)); | 492 __ cmpq(rax, Operand(kScratchRegister, rdi, times_1, off + kPointerSize)); |
| 485 __ j(not_equal, &slow); | 493 __ j(not_equal, &slow); |
| 486 | 494 |
| 487 // Get field offset, which is a 32-bit integer. | 495 // Get field offset, which is a 32-bit integer. |
| 488 ExternalReference cache_field_offsets | 496 ExternalReference cache_field_offsets |
| 489 = ExternalReference::keyed_lookup_cache_field_offsets(masm->isolate()); | 497 = ExternalReference::keyed_lookup_cache_field_offsets(masm->isolate()); |
| 490 | 498 |
| 491 // Hit on second entry. | 499 // Hit on nth entry. |
| 492 __ LoadAddress(kScratchRegister, cache_field_offsets); | 500 for (int i = kEntriesPerBucket - 1; i >= 0; i--) { |
| 493 __ addl(rcx, Immediate(1)); | 501 __ bind(&hit_on_nth_entry[i]); |
| 494 __ movl(rdi, Operand(kScratchRegister, rcx, times_4, 0)); | 502 if (i != 0) { |
| 495 __ movzxbq(rcx, FieldOperand(rbx, Map::kInObjectPropertiesOffset)); | 503 __ addl(rcx, Immediate(i)); |
| 496 __ subq(rdi, rcx); | 504 } |
| 497 __ j(above_equal, &property_array_property); | 505 __ LoadAddress(kScratchRegister, cache_field_offsets); |
| 498 __ jmp(&load_in_object_property); | 506 __ movl(rdi, Operand(kScratchRegister, rcx, times_4, 0)); |
| 499 | 507 __ movzxbq(rcx, FieldOperand(rbx, Map::kInObjectPropertiesOffset)); |
| 500 // Hit on first entry. | 508 __ subq(rdi, rcx); |
| 501 __ bind(&hit_on_first_entry); | 509 __ j(above_equal, &property_array_property); |
| 502 __ LoadAddress(kScratchRegister, cache_field_offsets); | 510 if (i != 0) { |
| 503 __ movl(rdi, Operand(kScratchRegister, rcx, times_4, 0)); | 511 __ jmp(&load_in_object_property); |
| 504 __ movzxbq(rcx, FieldOperand(rbx, Map::kInObjectPropertiesOffset)); | 512 } |
| 505 __ subq(rdi, rcx); | 513 } |
| 506 __ j(above_equal, &property_array_property); | |
| 507 | 514 |
| 508 // Load in-object property. | 515 // Load in-object property. |
| 509 __ bind(&load_in_object_property); | 516 __ bind(&load_in_object_property); |
| 510 __ movzxbq(rcx, FieldOperand(rbx, Map::kInstanceSizeOffset)); | 517 __ movzxbq(rcx, FieldOperand(rbx, Map::kInstanceSizeOffset)); |
| 511 __ addq(rcx, rdi); | 518 __ addq(rcx, rdi); |
| 512 __ movq(rax, FieldOperand(rdx, rcx, times_pointer_size, 0)); | 519 __ movq(rax, FieldOperand(rdx, rcx, times_pointer_size, 0)); |
| 513 __ IncrementCounter(counters->keyed_load_generic_lookup_cache(), 1); | 520 __ IncrementCounter(counters->keyed_load_generic_lookup_cache(), 1); |
| 514 __ ret(0); | 521 __ ret(0); |
| 515 | 522 |
| 516 // Load property array property. | 523 // Load property array property. |
| (...skipping 1202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1719 Condition cc = *jmp_address == Assembler::kJncShortOpcode | 1726 Condition cc = *jmp_address == Assembler::kJncShortOpcode |
| 1720 ? not_zero | 1727 ? not_zero |
| 1721 : zero; | 1728 : zero; |
| 1722 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1729 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
| 1723 } | 1730 } |
| 1724 | 1731 |
| 1725 | 1732 |
| 1726 } } // namespace v8::internal | 1733 } } // namespace v8::internal |
| 1727 | 1734 |
| 1728 #endif // V8_TARGET_ARCH_X64 | 1735 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |