| 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 1363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2204 if_rhsisnotreceiver(assembler, Label::kDeferred); | 2204 if_rhsisnotreceiver(assembler, Label::kDeferred); |
| 2205 assembler->Branch( | 2205 assembler->Branch( |
| 2206 assembler->Int32LessThanOrEqual( | 2206 assembler->Int32LessThanOrEqual( |
| 2207 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 2207 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
| 2208 rhs_instance_type), | 2208 rhs_instance_type), |
| 2209 &if_rhsisreceiver, &if_rhsisnotreceiver); | 2209 &if_rhsisreceiver, &if_rhsisnotreceiver); |
| 2210 | 2210 |
| 2211 assembler->Bind(&if_rhsisreceiver); | 2211 assembler->Bind(&if_rhsisreceiver); |
| 2212 { | 2212 { |
| 2213 // Convert {rhs} to a primitive first passing Number hint. | 2213 // Convert {rhs} to a primitive first passing Number hint. |
| 2214 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 2214 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
| 2215 var_rhs.Bind(assembler->CallRuntime( | 2215 assembler->isolate(), ToPrimitiveHint::kNumber); |
| 2216 Runtime::kToPrimitive_Number, context, rhs)); | 2216 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
| 2217 assembler->Goto(&loop); | 2217 assembler->Goto(&loop); |
| 2218 } | 2218 } |
| 2219 | 2219 |
| 2220 assembler->Bind(&if_rhsisnotreceiver); | 2220 assembler->Bind(&if_rhsisnotreceiver); |
| 2221 { | 2221 { |
| 2222 // Convert both {lhs} and {rhs} to Number. | 2222 // Convert both {lhs} and {rhs} to Number. |
| 2223 Callable callable = CodeFactory::ToNumber(assembler->isolate()); | 2223 Callable callable = CodeFactory::ToNumber(assembler->isolate()); |
| 2224 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 2224 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
| 2225 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 2225 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
| 2226 assembler->Goto(&loop); | 2226 assembler->Goto(&loop); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2238 if_lhsisnotreceiver(assembler, Label::kDeferred); | 2238 if_lhsisnotreceiver(assembler, Label::kDeferred); |
| 2239 assembler->Branch( | 2239 assembler->Branch( |
| 2240 assembler->Int32LessThanOrEqual( | 2240 assembler->Int32LessThanOrEqual( |
| 2241 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 2241 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
| 2242 lhs_instance_type), | 2242 lhs_instance_type), |
| 2243 &if_lhsisreceiver, &if_lhsisnotreceiver); | 2243 &if_lhsisreceiver, &if_lhsisnotreceiver); |
| 2244 | 2244 |
| 2245 assembler->Bind(&if_lhsisreceiver); | 2245 assembler->Bind(&if_lhsisreceiver); |
| 2246 { | 2246 { |
| 2247 // Convert {lhs} to a primitive first passing Number hint. | 2247 // Convert {lhs} to a primitive first passing Number hint. |
| 2248 // TODO(bmeurer): Hook up ToPrimitiveStub here, once it's there. | 2248 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
| 2249 var_lhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive_Number, | 2249 assembler->isolate(), ToPrimitiveHint::kNumber); |
| 2250 context, lhs)); | 2250 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
| 2251 assembler->Goto(&loop); | 2251 assembler->Goto(&loop); |
| 2252 } | 2252 } |
| 2253 | 2253 |
| 2254 assembler->Bind(&if_lhsisnotreceiver); | 2254 assembler->Bind(&if_lhsisnotreceiver); |
| 2255 { | 2255 { |
| 2256 // Convert both {lhs} and {rhs} to Number. | 2256 // Convert both {lhs} and {rhs} to Number. |
| 2257 Callable callable = CodeFactory::ToNumber(assembler->isolate()); | 2257 Callable callable = CodeFactory::ToNumber(assembler->isolate()); |
| 2258 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); | 2258 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
| 2259 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); | 2259 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
| 2260 assembler->Goto(&loop); | 2260 assembler->Goto(&loop); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2564 if_rhsisnotreceiver(assembler); | 2564 if_rhsisnotreceiver(assembler); |
| 2565 assembler->Branch( | 2565 assembler->Branch( |
| 2566 assembler->Int32LessThanOrEqual( | 2566 assembler->Int32LessThanOrEqual( |
| 2567 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), | 2567 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE), |
| 2568 rhs_instance_type), | 2568 rhs_instance_type), |
| 2569 &if_rhsisreceiver, &if_rhsisnotreceiver); | 2569 &if_rhsisreceiver, &if_rhsisnotreceiver); |
| 2570 | 2570 |
| 2571 assembler->Bind(&if_rhsisreceiver); | 2571 assembler->Bind(&if_rhsisreceiver); |
| 2572 { | 2572 { |
| 2573 // Convert {rhs} to a primitive first (passing no hint). | 2573 // Convert {rhs} to a primitive first (passing no hint). |
| 2574 // TODO(bmeurer): Hook up ToPrimitiveStub here once it exists. | 2574 Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
| 2575 var_rhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 2575 assembler->isolate()); |
| 2576 context, rhs)); | 2576 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); |
| 2577 assembler->Goto(&loop); | 2577 assembler->Goto(&loop); |
| 2578 } | 2578 } |
| 2579 | 2579 |
| 2580 assembler->Bind(&if_rhsisnotreceiver); | 2580 assembler->Bind(&if_rhsisnotreceiver); |
| 2581 assembler->Goto(&if_notequal); | 2581 assembler->Goto(&if_notequal); |
| 2582 } | 2582 } |
| 2583 } | 2583 } |
| 2584 } | 2584 } |
| 2585 } | 2585 } |
| 2586 } | 2586 } |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2922 assembler->Word32And( | 2922 assembler->Word32And( |
| 2923 lhs_bitfield, | 2923 lhs_bitfield, |
| 2924 assembler->Int32Constant(1 << Map::kIsUndetectable)), | 2924 assembler->Int32Constant(1 << Map::kIsUndetectable)), |
| 2925 assembler->Int32Constant(0), &if_notequal, &if_equal); | 2925 assembler->Int32Constant(0), &if_notequal, &if_equal); |
| 2926 } | 2926 } |
| 2927 | 2927 |
| 2928 assembler->Bind(&if_rhsisnotundetectable); | 2928 assembler->Bind(&if_rhsisnotundetectable); |
| 2929 { | 2929 { |
| 2930 // The {rhs} is some Primitive different from Null and | 2930 // The {rhs} is some Primitive different from Null and |
| 2931 // Undefined, need to convert {lhs} to Primitive first. | 2931 // Undefined, need to convert {lhs} to Primitive first. |
| 2932 // TODO(bmeurer): Hook up ToPrimitiveStub here once it exists. | 2932 Callable callable = |
| 2933 var_lhs.Bind(assembler->CallRuntime(Runtime::kToPrimitive, | 2933 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); |
| 2934 context, lhs)); | 2934 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); |
| 2935 assembler->Goto(&loop); | 2935 assembler->Goto(&loop); |
| 2936 } | 2936 } |
| 2937 } | 2937 } |
| 2938 } | 2938 } |
| 2939 } | 2939 } |
| 2940 } | 2940 } |
| 2941 } | 2941 } |
| 2942 | 2942 |
| 2943 assembler->Bind(&do_rhsstringtonumber); | 2943 assembler->Bind(&do_rhsstringtonumber); |
| 2944 { | 2944 { |
| (...skipping 2035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4980 if (type->Is(Type::UntaggedPointer())) { | 4980 if (type->Is(Type::UntaggedPointer())) { |
| 4981 return Representation::External(); | 4981 return Representation::External(); |
| 4982 } | 4982 } |
| 4983 | 4983 |
| 4984 DCHECK(!type->Is(Type::Untagged())); | 4984 DCHECK(!type->Is(Type::Untagged())); |
| 4985 return Representation::Tagged(); | 4985 return Representation::Tagged(); |
| 4986 } | 4986 } |
| 4987 | 4987 |
| 4988 } // namespace internal | 4988 } // namespace internal |
| 4989 } // namespace v8 | 4989 } // namespace v8 |
| OLD | NEW |