| 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 |