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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/division-by-constant.h" | 10 #include "src/base/division-by-constant.h" |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 Label* fail, | 590 Label* fail, |
591 int elements_offset) { | 591 int elements_offset) { |
592 Label smi_value, done, maybe_nan, not_nan, is_nan, have_double_value; | 592 Label smi_value, done, maybe_nan, not_nan, is_nan, have_double_value; |
593 JumpIfSmi(maybe_number, &smi_value, Label::kNear); | 593 JumpIfSmi(maybe_number, &smi_value, Label::kNear); |
594 | 594 |
595 CheckMap(maybe_number, | 595 CheckMap(maybe_number, |
596 isolate()->factory()->heap_number_map(), | 596 isolate()->factory()->heap_number_map(), |
597 fail, | 597 fail, |
598 DONT_DO_SMI_CHECK); | 598 DONT_DO_SMI_CHECK); |
599 | 599 |
600 // Double value, canonicalize NaN. | |
601 uint32_t offset = HeapNumber::kValueOffset + sizeof(kHoleNanLower32); | |
602 cmp(FieldOperand(maybe_number, offset), | |
603 Immediate(kNaNOrInfinityLowerBoundUpper32)); | |
604 j(greater_equal, &maybe_nan, Label::kNear); | |
605 | |
606 bind(¬_nan); | |
607 ExternalReference canonical_nan_reference = | |
608 ExternalReference::address_of_canonical_non_hole_nan(); | |
609 fld_d(FieldOperand(maybe_number, HeapNumber::kValueOffset)); | 600 fld_d(FieldOperand(maybe_number, HeapNumber::kValueOffset)); |
610 bind(&have_double_value); | 601 jmp(&done, Label::kNear); |
611 fstp_d(FieldOperand(elements, key, times_4, | |
612 FixedDoubleArray::kHeaderSize - elements_offset)); | |
613 jmp(&done); | |
614 | |
615 bind(&maybe_nan); | |
616 // Could be NaN or Infinity. If fraction is not zero, it's NaN, otherwise | |
617 // it's an Infinity, and the non-NaN code path applies. | |
618 j(greater, &is_nan, Label::kNear); | |
619 cmp(FieldOperand(maybe_number, HeapNumber::kValueOffset), Immediate(0)); | |
620 j(zero, ¬_nan); | |
621 bind(&is_nan); | |
622 fld_d(Operand::StaticVariable(canonical_nan_reference)); | |
623 jmp(&have_double_value, Label::kNear); | |
624 | 602 |
625 bind(&smi_value); | 603 bind(&smi_value); |
626 // Value is a smi. Convert to a double and store. | 604 // Value is a smi. Convert to a double and store. |
627 // Preserve original value. | 605 // Preserve original value. |
628 mov(scratch, maybe_number); | 606 mov(scratch, maybe_number); |
629 SmiUntag(scratch); | 607 SmiUntag(scratch); |
630 push(scratch); | 608 push(scratch); |
631 fild_s(Operand(esp, 0)); | 609 fild_s(Operand(esp, 0)); |
632 pop(scratch); | 610 pop(scratch); |
| 611 bind(&done); |
633 fstp_d(FieldOperand(elements, key, times_4, | 612 fstp_d(FieldOperand(elements, key, times_4, |
634 FixedDoubleArray::kHeaderSize - elements_offset)); | 613 FixedDoubleArray::kHeaderSize - elements_offset)); |
635 bind(&done); | |
636 } | 614 } |
637 | 615 |
638 | 616 |
639 void MacroAssembler::CompareMap(Register obj, Handle<Map> map) { | 617 void MacroAssembler::CompareMap(Register obj, Handle<Map> map) { |
640 cmp(FieldOperand(obj, HeapObject::kMapOffset), map); | 618 cmp(FieldOperand(obj, HeapObject::kMapOffset), map); |
641 } | 619 } |
642 | 620 |
643 | 621 |
644 void MacroAssembler::CheckMap(Register obj, | 622 void MacroAssembler::CheckMap(Register obj, |
645 Handle<Map> map, | 623 Handle<Map> map, |
(...skipping 2556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3202 if (mag.shift > 0) sar(edx, mag.shift); | 3180 if (mag.shift > 0) sar(edx, mag.shift); |
3203 mov(eax, dividend); | 3181 mov(eax, dividend); |
3204 shr(eax, 31); | 3182 shr(eax, 31); |
3205 add(edx, eax); | 3183 add(edx, eax); |
3206 } | 3184 } |
3207 | 3185 |
3208 | 3186 |
3209 } } // namespace v8::internal | 3187 } } // namespace v8::internal |
3210 | 3188 |
3211 #endif // V8_TARGET_ARCH_X87 | 3189 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |