| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <assert.h> // For assert | 5 #include <assert.h> // For assert |
| 6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_PPC | 8 #if V8_TARGET_ARCH_PPC |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 2608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2619 Register heap_number_map, | 2619 Register heap_number_map, |
| 2620 Register scratch, | 2620 Register scratch, |
| 2621 Label* on_not_heap_number) { | 2621 Label* on_not_heap_number) { |
| 2622 LoadP(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); | 2622 LoadP(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); |
| 2623 AssertIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); | 2623 AssertIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
| 2624 cmp(scratch, heap_number_map); | 2624 cmp(scratch, heap_number_map); |
| 2625 bne(on_not_heap_number); | 2625 bne(on_not_heap_number); |
| 2626 } | 2626 } |
| 2627 | 2627 |
| 2628 | 2628 |
| 2629 void MacroAssembler::LookupNumberStringCache(Register object, Register result, | |
| 2630 Register scratch1, | |
| 2631 Register scratch2, | |
| 2632 Register scratch3, | |
| 2633 Label* not_found) { | |
| 2634 // Use of registers. Register result is used as a temporary. | |
| 2635 Register number_string_cache = result; | |
| 2636 Register mask = scratch3; | |
| 2637 | |
| 2638 // Load the number string cache. | |
| 2639 LoadRoot(number_string_cache, Heap::kNumberStringCacheRootIndex); | |
| 2640 | |
| 2641 // Make the hash mask from the length of the number string cache. It | |
| 2642 // contains two elements (number and string) for each cache entry. | |
| 2643 LoadP(mask, FieldMemOperand(number_string_cache, FixedArray::kLengthOffset)); | |
| 2644 // Divide length by two (length is a smi). | |
| 2645 ShiftRightArithImm(mask, mask, kSmiTagSize + kSmiShiftSize + 1); | |
| 2646 subi(mask, mask, Operand(1)); // Make mask. | |
| 2647 | |
| 2648 // Calculate the entry in the number string cache. The hash value in the | |
| 2649 // number string cache for smis is just the smi value, and the hash for | |
| 2650 // doubles is the xor of the upper and lower words. See | |
| 2651 // Heap::GetNumberStringCache. | |
| 2652 Label is_smi; | |
| 2653 Label load_result_from_cache; | |
| 2654 JumpIfSmi(object, &is_smi); | |
| 2655 CheckMap(object, scratch1, Heap::kHeapNumberMapRootIndex, not_found, | |
| 2656 DONT_DO_SMI_CHECK); | |
| 2657 | |
| 2658 STATIC_ASSERT(8 == kDoubleSize); | |
| 2659 lwz(scratch1, FieldMemOperand(object, HeapNumber::kExponentOffset)); | |
| 2660 lwz(scratch2, FieldMemOperand(object, HeapNumber::kMantissaOffset)); | |
| 2661 xor_(scratch1, scratch1, scratch2); | |
| 2662 and_(scratch1, scratch1, mask); | |
| 2663 | |
| 2664 // Calculate address of entry in string cache: each entry consists | |
| 2665 // of two pointer sized fields. | |
| 2666 ShiftLeftImm(scratch1, scratch1, Operand(kPointerSizeLog2 + 1)); | |
| 2667 add(scratch1, number_string_cache, scratch1); | |
| 2668 | |
| 2669 Register probe = mask; | |
| 2670 LoadP(probe, FieldMemOperand(scratch1, FixedArray::kHeaderSize)); | |
| 2671 JumpIfSmi(probe, not_found); | |
| 2672 lfd(d0, FieldMemOperand(object, HeapNumber::kValueOffset)); | |
| 2673 lfd(d1, FieldMemOperand(probe, HeapNumber::kValueOffset)); | |
| 2674 fcmpu(d0, d1); | |
| 2675 bne(not_found); // The cache did not contain this value. | |
| 2676 b(&load_result_from_cache); | |
| 2677 | |
| 2678 bind(&is_smi); | |
| 2679 Register scratch = scratch1; | |
| 2680 SmiUntag(scratch, object); | |
| 2681 and_(scratch, mask, scratch); | |
| 2682 // Calculate address of entry in string cache: each entry consists | |
| 2683 // of two pointer sized fields. | |
| 2684 ShiftLeftImm(scratch, scratch, Operand(kPointerSizeLog2 + 1)); | |
| 2685 add(scratch, number_string_cache, scratch); | |
| 2686 | |
| 2687 // Check if the entry is the smi we are looking for. | |
| 2688 LoadP(probe, FieldMemOperand(scratch, FixedArray::kHeaderSize)); | |
| 2689 cmp(object, probe); | |
| 2690 bne(not_found); | |
| 2691 | |
| 2692 // Get the result from the cache. | |
| 2693 bind(&load_result_from_cache); | |
| 2694 LoadP(result, | |
| 2695 FieldMemOperand(scratch, FixedArray::kHeaderSize + kPointerSize)); | |
| 2696 IncrementCounter(isolate()->counters()->number_to_string_native(), 1, | |
| 2697 scratch1, scratch2); | |
| 2698 } | |
| 2699 | |
| 2700 | |
| 2701 void MacroAssembler::JumpIfNonSmisNotBothSequentialOneByteStrings( | 2629 void MacroAssembler::JumpIfNonSmisNotBothSequentialOneByteStrings( |
| 2702 Register first, Register second, Register scratch1, Register scratch2, | 2630 Register first, Register second, Register scratch1, Register scratch2, |
| 2703 Label* failure) { | 2631 Label* failure) { |
| 2704 // Test that both first and second are sequential one-byte strings. | 2632 // Test that both first and second are sequential one-byte strings. |
| 2705 // Assume that they are non-smis. | 2633 // Assume that they are non-smis. |
| 2706 LoadP(scratch1, FieldMemOperand(first, HeapObject::kMapOffset)); | 2634 LoadP(scratch1, FieldMemOperand(first, HeapObject::kMapOffset)); |
| 2707 LoadP(scratch2, FieldMemOperand(second, HeapObject::kMapOffset)); | 2635 LoadP(scratch2, FieldMemOperand(second, HeapObject::kMapOffset)); |
| 2708 lbz(scratch1, FieldMemOperand(scratch1, Map::kInstanceTypeOffset)); | 2636 lbz(scratch1, FieldMemOperand(scratch1, Map::kInstanceTypeOffset)); |
| 2709 lbz(scratch2, FieldMemOperand(scratch2, Map::kInstanceTypeOffset)); | 2637 lbz(scratch2, FieldMemOperand(scratch2, Map::kInstanceTypeOffset)); |
| 2710 | 2638 |
| (...skipping 1715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4426 } | 4354 } |
| 4427 if (mag.shift > 0) srawi(result, result, mag.shift); | 4355 if (mag.shift > 0) srawi(result, result, mag.shift); |
| 4428 ExtractBit(r0, dividend, 31); | 4356 ExtractBit(r0, dividend, 31); |
| 4429 add(result, result, r0); | 4357 add(result, result, r0); |
| 4430 } | 4358 } |
| 4431 | 4359 |
| 4432 } // namespace internal | 4360 } // namespace internal |
| 4433 } // namespace v8 | 4361 } // namespace v8 |
| 4434 | 4362 |
| 4435 #endif // V8_TARGET_ARCH_PPC | 4363 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |