| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 2452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2463 AccessorComponent accessor) { | 2463 AccessorComponent accessor) { |
| 2464 mov(dst, FieldOperand(holder, HeapObject::kMapOffset)); | 2464 mov(dst, FieldOperand(holder, HeapObject::kMapOffset)); |
| 2465 LoadInstanceDescriptors(dst, dst); | 2465 LoadInstanceDescriptors(dst, dst); |
| 2466 mov(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index))); | 2466 mov(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index))); |
| 2467 int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset | 2467 int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset |
| 2468 : AccessorPair::kSetterOffset; | 2468 : AccessorPair::kSetterOffset; |
| 2469 mov(dst, FieldOperand(dst, offset)); | 2469 mov(dst, FieldOperand(dst, offset)); |
| 2470 } | 2470 } |
| 2471 | 2471 |
| 2472 | 2472 |
| 2473 void MacroAssembler::LookupNumberStringCache(Register object, | |
| 2474 Register result, | |
| 2475 Register scratch1, | |
| 2476 Register scratch2, | |
| 2477 Label* not_found) { | |
| 2478 // Use of registers. Register result is used as a temporary. | |
| 2479 Register number_string_cache = result; | |
| 2480 Register mask = scratch1; | |
| 2481 Register scratch = scratch2; | |
| 2482 | |
| 2483 // Load the number string cache. | |
| 2484 LoadRoot(number_string_cache, Heap::kNumberStringCacheRootIndex); | |
| 2485 // Make the hash mask from the length of the number string cache. It | |
| 2486 // contains two elements (number and string) for each cache entry. | |
| 2487 mov(mask, FieldOperand(number_string_cache, FixedArray::kLengthOffset)); | |
| 2488 shr(mask, kSmiTagSize + 1); // Untag length and divide it by two. | |
| 2489 sub(mask, Immediate(1)); // Make mask. | |
| 2490 | |
| 2491 // Calculate the entry in the number string cache. The hash value in the | |
| 2492 // number string cache for smis is just the smi value, and the hash for | |
| 2493 // doubles is the xor of the upper and lower words. See | |
| 2494 // Heap::GetNumberStringCache. | |
| 2495 Label smi_hash_calculated; | |
| 2496 Label load_result_from_cache; | |
| 2497 Label not_smi; | |
| 2498 STATIC_ASSERT(kSmiTag == 0); | |
| 2499 JumpIfNotSmi(object, ¬_smi, Label::kNear); | |
| 2500 mov(scratch, object); | |
| 2501 SmiUntag(scratch); | |
| 2502 jmp(&smi_hash_calculated, Label::kNear); | |
| 2503 bind(¬_smi); | |
| 2504 cmp(FieldOperand(object, HeapObject::kMapOffset), | |
| 2505 isolate()->factory()->heap_number_map()); | |
| 2506 j(not_equal, not_found); | |
| 2507 STATIC_ASSERT(8 == kDoubleSize); | |
| 2508 mov(scratch, FieldOperand(object, HeapNumber::kValueOffset)); | |
| 2509 xor_(scratch, FieldOperand(object, HeapNumber::kValueOffset + 4)); | |
| 2510 // Object is heap number and hash is now in scratch. Calculate cache index. | |
| 2511 and_(scratch, mask); | |
| 2512 Register index = scratch; | |
| 2513 Register probe = mask; | |
| 2514 mov(probe, | |
| 2515 FieldOperand(number_string_cache, | |
| 2516 index, | |
| 2517 times_twice_pointer_size, | |
| 2518 FixedArray::kHeaderSize)); | |
| 2519 JumpIfSmi(probe, not_found); | |
| 2520 fld_d(FieldOperand(object, HeapNumber::kValueOffset)); | |
| 2521 fld_d(FieldOperand(probe, HeapNumber::kValueOffset)); | |
| 2522 FCmp(); | |
| 2523 j(parity_even, not_found); // Bail out if NaN is involved. | |
| 2524 j(not_equal, not_found); // The cache did not contain this value. | |
| 2525 jmp(&load_result_from_cache, Label::kNear); | |
| 2526 | |
| 2527 bind(&smi_hash_calculated); | |
| 2528 // Object is smi and hash is now in scratch. Calculate cache index. | |
| 2529 and_(scratch, mask); | |
| 2530 // Check if the entry is the smi we are looking for. | |
| 2531 cmp(object, | |
| 2532 FieldOperand(number_string_cache, | |
| 2533 index, | |
| 2534 times_twice_pointer_size, | |
| 2535 FixedArray::kHeaderSize)); | |
| 2536 j(not_equal, not_found); | |
| 2537 | |
| 2538 // Get the result from the cache. | |
| 2539 bind(&load_result_from_cache); | |
| 2540 mov(result, | |
| 2541 FieldOperand(number_string_cache, | |
| 2542 index, | |
| 2543 times_twice_pointer_size, | |
| 2544 FixedArray::kHeaderSize + kPointerSize)); | |
| 2545 IncrementCounter(isolate()->counters()->number_to_string_native(), 1); | |
| 2546 } | |
| 2547 | |
| 2548 | |
| 2549 void MacroAssembler::JumpIfInstanceTypeIsNotSequentialOneByte( | 2473 void MacroAssembler::JumpIfInstanceTypeIsNotSequentialOneByte( |
| 2550 Register instance_type, Register scratch, Label* failure) { | 2474 Register instance_type, Register scratch, Label* failure) { |
| 2551 if (!scratch.is(instance_type)) { | 2475 if (!scratch.is(instance_type)) { |
| 2552 mov(scratch, instance_type); | 2476 mov(scratch, instance_type); |
| 2553 } | 2477 } |
| 2554 and_(scratch, | 2478 and_(scratch, |
| 2555 kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask); | 2479 kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask); |
| 2556 cmp(scratch, kStringTag | kSeqStringTag | kOneByteStringTag); | 2480 cmp(scratch, kStringTag | kSeqStringTag | kOneByteStringTag); |
| 2557 j(not_equal, failure); | 2481 j(not_equal, failure); |
| 2558 } | 2482 } |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3066 mov(eax, dividend); | 2990 mov(eax, dividend); |
| 3067 shr(eax, 31); | 2991 shr(eax, 31); |
| 3068 add(edx, eax); | 2992 add(edx, eax); |
| 3069 } | 2993 } |
| 3070 | 2994 |
| 3071 | 2995 |
| 3072 } // namespace internal | 2996 } // namespace internal |
| 3073 } // namespace v8 | 2997 } // namespace v8 |
| 3074 | 2998 |
| 3075 #endif // V8_TARGET_ARCH_X87 | 2999 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |