Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Side by Side Diff: src/code-stubs.cc

Issue 2152693002: [stubs] Introduce NonPrimitiveToPrimitive builtin. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698