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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 if_rhsisnotreceiver(assembler, Label::kDeferred); | 612 if_rhsisnotreceiver(assembler, Label::kDeferred); |
613 assembler->Branch( | 613 assembler->Branch( |
614 assembler->Int32LessThanOrEqual( | 614 assembler->Int32LessThanOrEqual( |
615 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 615 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
616 rhs_instance_type), | 616 rhs_instance_type), |
617 &if_rhsisreceiver, &if_rhsisnotreceiver); | 617 &if_rhsisreceiver, &if_rhsisnotreceiver); |
618 | 618 |
619 assembler->Bind(&if_rhsisreceiver); | 619 assembler->Bind(&if_rhsisreceiver); |
620 { | 620 { |
621 // Convert {rhs} to a primitive first passing no hint. | 621 // Convert {rhs} to a primitive first passing no hint. |
622 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 622 Callable callable = |
623 var_rhs.Bind( | 623 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); |
624 assembler->CallRuntime(Runtime::kToPrimitive, context, rhs)); | 624 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
625 assembler->Goto(&loop); | 625 assembler->Goto(&loop); |
626 } | 626 } |
627 | 627 |
628 assembler->Bind(&if_rhsisnotreceiver); | 628 assembler->Bind(&if_rhsisnotreceiver); |
629 { | 629 { |
630 // Convert {rhs} to a Number first. | 630 // Convert {rhs} to a Number first. |
631 Callable callable = | 631 Callable callable = |
632 CodeFactory::NonNumberToNumber(assembler->isolate()); | 632 CodeFactory::NonNumberToNumber(assembler->isolate()); |
633 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 633 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
634 assembler->Goto(&loop); | 634 assembler->Goto(&loop); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 if_lhsisnotreceiver(assembler, Label::kDeferred); | 690 if_lhsisnotreceiver(assembler, Label::kDeferred); |
691 assembler->Branch( | 691 assembler->Branch( |
692 assembler->Int32LessThanOrEqual( | 692 assembler->Int32LessThanOrEqual( |
693 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 693 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
694 lhs_instance_type), | 694 lhs_instance_type), |
695 &if_lhsisreceiver, &if_lhsisnotreceiver); | 695 &if_lhsisreceiver, &if_lhsisnotreceiver); |
696 | 696 |
697 assembler->Bind(&if_lhsisreceiver); | 697 assembler->Bind(&if_lhsisreceiver); |
698 { | 698 { |
699 // Convert {lhs} to a primitive first passing no hint. | 699 // Convert {lhs} to a primitive first passing no hint. |
700 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 700 Callable callable = |
701 var_lhs.Bind( | 701 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); |
702 assembler->CallRuntime(Runtime::kToPrimitive, context, lhs)); | 702 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
703 assembler->Goto(&loop); | 703 assembler->Goto(&loop); |
704 } | 704 } |
705 | 705 |
706 assembler->Bind(&if_lhsisnotreceiver); | 706 assembler->Bind(&if_lhsisnotreceiver); |
707 { | 707 { |
708 // Convert {lhs} to a Number first. | 708 // Convert {lhs} to a Number first. |
709 Callable callable = | 709 Callable callable = |
710 CodeFactory::NonNumberToNumber(assembler->isolate()); | 710 CodeFactory::NonNumberToNumber(assembler->isolate()); |
711 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 711 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
712 assembler->Goto(&loop); | 712 assembler->Goto(&loop); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 if_rhsisnotreceiver(assembler, Label::kDeferred); | 767 if_rhsisnotreceiver(assembler, Label::kDeferred); |
768 assembler->Branch( | 768 assembler->Branch( |
769 assembler->Int32LessThanOrEqual( | 769 assembler->Int32LessThanOrEqual( |
770 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 770 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
771 rhs_instance_type), | 771 rhs_instance_type), |
772 &if_rhsisreceiver, &if_rhsisnotreceiver); | 772 &if_rhsisreceiver, &if_rhsisnotreceiver); |
773 | 773 |
774 assembler->Bind(&if_rhsisreceiver); | 774 assembler->Bind(&if_rhsisreceiver); |
775 { | 775 { |
776 // Convert {rhs} to a primitive first passing no hint. | 776 // Convert {rhs} to a primitive first passing no hint. |
777 // TODO(bmeurer): Hook up ToPrimitiveStub here too. | 777 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
778 var_rhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 778 assembler->isolate()); |
779 context, rhs)); | 779 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
780 assembler->Goto(&loop); | 780 assembler->Goto(&loop); |
781 } | 781 } |
782 | 782 |
783 assembler->Bind(&if_rhsisnotreceiver); | 783 assembler->Bind(&if_rhsisnotreceiver); |
784 { | 784 { |
785 // Convert {rhs} to a Number first. | 785 // Convert {rhs} to a Number first. |
786 Callable callable = | 786 Callable callable = |
787 CodeFactory::NonNumberToNumber(assembler->isolate()); | 787 CodeFactory::NonNumberToNumber(assembler->isolate()); |
788 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 788 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
789 assembler->Goto(&loop); | 789 assembler->Goto(&loop); |
790 } | 790 } |
791 } | 791 } |
792 } | 792 } |
793 | 793 |
794 assembler->Bind(&if_lhsisnotnumber); | 794 assembler->Bind(&if_lhsisnotnumber); |
795 { | 795 { |
796 // Check if {lhs} is a JSReceiver. | 796 // Check if {lhs} is a JSReceiver. |
797 Label if_lhsisreceiver(assembler, Label::kDeferred), | 797 Label if_lhsisreceiver(assembler, Label::kDeferred), |
798 if_lhsisnotreceiver(assembler); | 798 if_lhsisnotreceiver(assembler); |
799 assembler->Branch( | 799 assembler->Branch( |
800 assembler->Int32LessThanOrEqual( | 800 assembler->Int32LessThanOrEqual( |
801 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 801 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
802 lhs_instance_type), | 802 lhs_instance_type), |
803 &if_lhsisreceiver, &if_lhsisnotreceiver); | 803 &if_lhsisreceiver, &if_lhsisnotreceiver); |
804 | 804 |
805 assembler->Bind(&if_lhsisreceiver); | 805 assembler->Bind(&if_lhsisreceiver); |
806 { | 806 { |
807 // Convert {lhs} to a primitive first passing no hint. | 807 // Convert {lhs} to a primitive first passing no hint. |
808 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 808 Callable callable = |
809 var_lhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 809 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); |
810 context, lhs)); | 810 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
811 assembler->Goto(&loop); | 811 assembler->Goto(&loop); |
812 } | 812 } |
813 | 813 |
814 assembler->Bind(&if_lhsisnotreceiver); | 814 assembler->Bind(&if_lhsisnotreceiver); |
815 { | 815 { |
816 // Check if {rhs} is a JSReceiver. | 816 // Check if {rhs} is a JSReceiver. |
817 Label if_rhsisreceiver(assembler, Label::kDeferred), | 817 Label if_rhsisreceiver(assembler, Label::kDeferred), |
818 if_rhsisnotreceiver(assembler, Label::kDeferred); | 818 if_rhsisnotreceiver(assembler, Label::kDeferred); |
819 assembler->Branch( | 819 assembler->Branch( |
820 assembler->Int32LessThanOrEqual( | 820 assembler->Int32LessThanOrEqual( |
821 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 821 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
822 rhs_instance_type), | 822 rhs_instance_type), |
823 &if_rhsisreceiver, &if_rhsisnotreceiver); | 823 &if_rhsisreceiver, &if_rhsisnotreceiver); |
824 | 824 |
825 assembler->Bind(&if_rhsisreceiver); | 825 assembler->Bind(&if_rhsisreceiver); |
826 { | 826 { |
827 // Convert {rhs} to a primitive first passing no hint. | 827 // Convert {rhs} to a primitive first passing no hint. |
828 // TODO(bmeurer): Hook up ToPrimitiveStub here too. | 828 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
829 var_rhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 829 assembler->isolate()); |
830 context, rhs)); | 830 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
831 assembler->Goto(&loop); | 831 assembler->Goto(&loop); |
832 } | 832 } |
833 | 833 |
834 assembler->Bind(&if_rhsisnotreceiver); | 834 assembler->Bind(&if_rhsisnotreceiver); |
835 { | 835 { |
836 // Convert {lhs} to a Number first. | 836 // Convert {lhs} to a Number first. |
837 Callable callable = | 837 Callable callable = |
838 CodeFactory::NonNumberToNumber(assembler->isolate()); | 838 CodeFactory::NonNumberToNumber(assembler->isolate()); |
839 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 839 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
840 assembler->Goto(&loop); | 840 assembler->Goto(&loop); |
(...skipping 1313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2154 if_rhsisnotreceiver(assembler, Label::kDeferred); | 2154 if_rhsisnotreceiver(assembler, Label::kDeferred); |
2155 assembler->Branch( | 2155 assembler->Branch( |
2156 assembler->Int32LessThanOrEqual( | 2156 assembler->Int32LessThanOrEqual( |
2157 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 2157 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
2158 rhs_instance_type), | 2158 rhs_instance_type), |
2159 &if_rhsisreceiver, &if_rhsisnotreceiver); | 2159 &if_rhsisreceiver, &if_rhsisnotreceiver); |
2160 | 2160 |
2161 assembler->Bind(&if_rhsisreceiver); | 2161 assembler->Bind(&if_rhsisreceiver); |
2162 { | 2162 { |
2163 // Convert {rhs} to a primitive first passing Number hint. | 2163 // Convert {rhs} to a primitive first passing Number hint. |
2164 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 2164 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
2165 var_rhs.Bind(assembler->CallRuntime( | 2165 assembler->isolate(), ToPrimitiveHint::kNumber); |
2166 Runtime::kToPrimitive_Number, context, rhs)); | 2166 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
2167 assembler->Goto(&loop); | 2167 assembler->Goto(&loop); |
2168 } | 2168 } |
2169 | 2169 |
2170 assembler->Bind(&if_rhsisnotreceiver); | 2170 assembler->Bind(&if_rhsisnotreceiver); |
2171 { | 2171 { |
2172 // Convert both {lhs} and {rhs} to Number. | 2172 // Convert both {lhs} and {rhs} to Number. |
2173 Callable callable = CodeFactory::ToNumber(assembler->isolate()); | 2173 Callable callable = CodeFactory::ToNumber(assembler->isolate()); |
2174 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 2174 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
2175 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 2175 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
2176 assembler->Goto(&loop); | 2176 assembler->Goto(&loop); |
(...skipping 11 matching lines...) Expand all Loading... |
2188 if_lhsisnotreceiver(assembler, Label::kDeferred); | 2188 if_lhsisnotreceiver(assembler, Label::kDeferred); |
2189 assembler->Branch( | 2189 assembler->Branch( |
2190 assembler->Int32LessThanOrEqual( | 2190 assembler->Int32LessThanOrEqual( |
2191 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 2191 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
2192 lhs_instance_type), | 2192 lhs_instance_type), |
2193 &if_lhsisreceiver, &if_lhsisnotreceiver); | 2193 &if_lhsisreceiver, &if_lhsisnotreceiver); |
2194 | 2194 |
2195 assembler->Bind(&if_lhsisreceiver); | 2195 assembler->Bind(&if_lhsisreceiver); |
2196 { | 2196 { |
2197 // Convert {lhs} to a primitive first passing Number hint. | 2197 // Convert {lhs} to a primitive first passing Number hint. |
2198 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 2198 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
2199 var_lhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive_Number, | 2199 assembler->isolate(), ToPrimitiveHint::kNumber); |
2200 context, lhs)); | 2200 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
2201 assembler->Goto(&loop); | 2201 assembler->Goto(&loop); |
2202 } | 2202 } |
2203 | 2203 |
2204 assembler->Bind(&if_lhsisnotreceiver); | 2204 assembler->Bind(&if_lhsisnotreceiver); |
2205 { | 2205 { |
2206 // Convert both {lhs} and {rhs} to Number. | 2206 // Convert both {lhs} and {rhs} to Number. |
2207 Callable callable = CodeFactory::ToNumber(assembler->isolate()); | 2207 Callable callable = CodeFactory::ToNumber(assembler->isolate()); |
2208 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 2208 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
2209 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 2209 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
2210 assembler->Goto(&loop); | 2210 assembler->Goto(&loop); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2514 if_rhsisnotreceiver(assembler); | 2514 if_rhsisnotreceiver(assembler); |
2515 assembler->Branch( | 2515 assembler->Branch( |
2516 assembler->Int32LessThanOrEqual( | 2516 assembler->Int32LessThanOrEqual( |
2517 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 2517 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
2518 rhs_instance_type), | 2518 rhs_instance_type), |
2519 &if_rhsisreceiver, &if_rhsisnotreceiver); | 2519 &if_rhsisreceiver, &if_rhsisnotreceiver); |
2520 | 2520 |
2521 assembler->Bind(&if_rhsisreceiver); | 2521 assembler->Bind(&if_rhsisreceiver); |
2522 { | 2522 { |
2523 // Convert {rhs} to a primitive first (passing no hint). | 2523 // Convert {rhs} to a primitive first (passing no hint). |
2524 // TODO(bmeurer): Hook up ToPrimitiveStub here once it exists. | 2524 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
2525 var_rhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 2525 assembler->isolate()); |
2526 context, rhs)); | 2526 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
2527 assembler->Goto(&loop); | 2527 assembler->Goto(&loop); |
2528 } | 2528 } |
2529 | 2529 |
2530 assembler->Bind(&if_rhsisnotreceiver); | 2530 assembler->Bind(&if_rhsisnotreceiver); |
2531 assembler->Goto(&if_notequal); | 2531 assembler->Goto(&if_notequal); |
2532 } | 2532 } |
2533 } | 2533 } |
2534 } | 2534 } |
2535 } | 2535 } |
2536 } | 2536 } |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2872 assembler->Word32And( | 2872 assembler->Word32And( |
2873 lhs_bitfield, | 2873 lhs_bitfield, |
2874 assembler->Int32Constant(1 << Map::kIsUndetectable)), | 2874 assembler->Int32Constant(1 << Map::kIsUndetectable)), |
2875 assembler->Int32Constant(0), &if_notequal, &if_equal); | 2875 assembler->Int32Constant(0), &if_notequal, &if_equal); |
2876 } | 2876 } |
2877 | 2877 |
2878 assembler->Bind(&if_rhsisnotundetectable); | 2878 assembler->Bind(&if_rhsisnotundetectable); |
2879 { | 2879 { |
2880 // The {rhs} is some Primitive different from Null and | 2880 // The {rhs} is some Primitive different from Null and |
2881 // Undefined, need to convert {lhs} to Primitive first. | 2881 // Undefined, need to convert {lhs} to Primitive first. |
2882 // TODO(bmeurer): Hook up ToPrimitiveStub here once it exists. | 2882 Callable callable = |
2883 var_lhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 2883 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); |
2884 context, lhs)); | 2884 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
2885 assembler->Goto(&loop); | 2885 assembler->Goto(&loop); |
2886 } | 2886 } |
2887 } | 2887 } |
2888 } | 2888 } |
2889 } | 2889 } |
2890 } | 2890 } |
2891 } | 2891 } |
2892 | 2892 |
2893 assembler->Bind(&do_rhsstringtonumber); | 2893 assembler->Bind(&do_rhsstringtonumber); |
2894 { | 2894 { |
(...skipping 2035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4930 if (type->Is(Type::UntaggedPointer())) { | 4930 if (type->Is(Type::UntaggedPointer())) { |
4931 return Representation::External(); | 4931 return Representation::External(); |
4932 } | 4932 } |
4933 | 4933 |
4934 DCHECK(!type->Is(Type::Untagged())); | 4934 DCHECK(!type->Is(Type::Untagged())); |
4935 return Representation::Tagged(); | 4935 return Representation::Tagged(); |
4936 } | 4936 } |
4937 | 4937 |
4938 } // namespace internal | 4938 } // namespace internal |
4939 } // namespace v8 | 4939 } // namespace v8 |
OLD | NEW |