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 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 | 615 |
616 | 616 |
617 void TypeRecordingUnaryOpStub::GenerateSmiStubBitNot(MacroAssembler* masm) { | 617 void TypeRecordingUnaryOpStub::GenerateSmiStubBitNot(MacroAssembler* masm) { |
618 Label non_smi; | 618 Label non_smi; |
619 GenerateSmiCodeBitNot(masm, &non_smi); | 619 GenerateSmiCodeBitNot(masm, &non_smi); |
620 __ bind(&non_smi); | 620 __ bind(&non_smi); |
621 GenerateTypeTransition(masm); | 621 GenerateTypeTransition(masm); |
622 } | 622 } |
623 | 623 |
624 | 624 |
625 void TypeRecordingUnaryOpStub::GenerateSmiCodeSub( | 625 void TypeRecordingUnaryOpStub::GenerateSmiCodeSub(MacroAssembler* masm, |
626 MacroAssembler* masm, Label* non_smi, Label* undo, Label* slow, | 626 Label* non_smi, |
627 Label::Distance non_smi_near, Label::Distance undo_near, | 627 Label* undo, |
628 Label::Distance slow_near) { | 628 Label* slow, |
| 629 Label::Distance non_smi_near, |
| 630 Label::Distance undo_near, |
| 631 Label::Distance slow_near) { |
629 // Check whether the value is a smi. | 632 // Check whether the value is a smi. |
630 __ test(eax, Immediate(kSmiTagMask)); | 633 __ test(eax, Immediate(kSmiTagMask)); |
631 __ j(not_zero, non_smi, non_smi_near); | 634 __ j(not_zero, non_smi, non_smi_near); |
632 | 635 |
633 // We can't handle -0 with smis, so use a type transition for that case. | 636 // We can't handle -0 with smis, so use a type transition for that case. |
634 __ test(eax, Operand(eax)); | 637 __ test(eax, Operand(eax)); |
635 __ j(zero, slow, slow_near); | 638 __ j(zero, slow, slow_near); |
636 | 639 |
637 // Try optimistic subtraction '0 - value', saving operand in eax for undo. | 640 // Try optimistic subtraction '0 - value', saving operand in eax for undo. |
638 __ mov(edx, Operand(eax)); | 641 __ mov(edx, Operand(eax)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 case Token::BIT_NOT: | 675 case Token::BIT_NOT: |
673 GenerateHeapNumberStubBitNot(masm); | 676 GenerateHeapNumberStubBitNot(masm); |
674 break; | 677 break; |
675 default: | 678 default: |
676 UNREACHABLE(); | 679 UNREACHABLE(); |
677 } | 680 } |
678 } | 681 } |
679 | 682 |
680 | 683 |
681 void TypeRecordingUnaryOpStub::GenerateHeapNumberStubSub(MacroAssembler* masm) { | 684 void TypeRecordingUnaryOpStub::GenerateHeapNumberStubSub(MacroAssembler* masm) { |
682 Label non_smi, undo, slow; | 685 Label non_smi, undo, slow, call_builtin; |
683 GenerateSmiCodeSub(masm, &non_smi, &undo, &slow, Label::kNear); | 686 GenerateSmiCodeSub(masm, &non_smi, &undo, &call_builtin, Label::kNear); |
684 __ bind(&non_smi); | 687 __ bind(&non_smi); |
685 GenerateHeapNumberCodeSub(masm, &slow); | 688 GenerateHeapNumberCodeSub(masm, &slow); |
686 __ bind(&undo); | 689 __ bind(&undo); |
687 GenerateSmiCodeUndo(masm); | 690 GenerateSmiCodeUndo(masm); |
688 __ bind(&slow); | 691 __ bind(&slow); |
689 GenerateTypeTransition(masm); | 692 GenerateTypeTransition(masm); |
| 693 __ bind(&call_builtin); |
| 694 GenerateGenericCodeFallback(masm); |
690 } | 695 } |
691 | 696 |
692 | 697 |
693 void TypeRecordingUnaryOpStub::GenerateHeapNumberStubBitNot( | 698 void TypeRecordingUnaryOpStub::GenerateHeapNumberStubBitNot( |
694 MacroAssembler* masm) { | 699 MacroAssembler* masm) { |
695 Label non_smi, slow; | 700 Label non_smi, slow; |
696 GenerateSmiCodeBitNot(masm, &non_smi, Label::kNear); | 701 GenerateSmiCodeBitNot(masm, &non_smi, Label::kNear); |
697 __ bind(&non_smi); | 702 __ bind(&non_smi); |
698 GenerateHeapNumberCodeBitNot(masm, &slow); | 703 GenerateHeapNumberCodeBitNot(masm, &slow); |
699 __ bind(&slow); | 704 __ bind(&slow); |
(...skipping 5477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6177 __ Drop(1); | 6182 __ Drop(1); |
6178 __ ret(2 * kPointerSize); | 6183 __ ret(2 * kPointerSize); |
6179 } | 6184 } |
6180 | 6185 |
6181 | 6186 |
6182 #undef __ | 6187 #undef __ |
6183 | 6188 |
6184 } } // namespace v8::internal | 6189 } } // namespace v8::internal |
6185 | 6190 |
6186 #endif // V8_TARGET_ARCH_IA32 | 6191 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |