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

Side by Side Diff: src/builtins/arm64/builtins-arm64.cc

Issue 2950773002: [turbofan] Introduce new JSCallWithArrayLike operator. (Closed)
Patch Set: REBASE Created 3 years, 6 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
« no previous file with comments | « src/builtins/arm/builtins-arm.cc ('k') | src/builtins/builtins-call-gen.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 #if V8_TARGET_ARCH_ARM64 5 #if V8_TARGET_ARCH_ARM64
6 6
7 #include "src/arm64/frames-arm64.h" 7 #include "src/arm64/frames-arm64.h"
8 #include "src/arm64/macro-assembler-arm64-inl.h" 8 #include "src/arm64/macro-assembler-arm64-inl.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/counters.h" 10 #include "src/counters.h"
(...skipping 1976 matching lines...) Expand 10 before | Expand all | Expand 10 after
1987 __ Peek(receiver, 0); 1987 __ Peek(receiver, 0);
1988 __ Poke(this_arg, 0); 1988 __ Poke(this_arg, 0);
1989 } 1989 }
1990 1990
1991 // ----------- S t a t e ------------- 1991 // ----------- S t a t e -------------
1992 // -- x2 : argArray 1992 // -- x2 : argArray
1993 // -- x1 : receiver 1993 // -- x1 : receiver
1994 // -- jssp[0] : thisArg 1994 // -- jssp[0] : thisArg
1995 // ----------------------------------- 1995 // -----------------------------------
1996 1996
1997 // 2. Make sure the receiver is actually callable. 1997 // 2. We don't need to check explicitly for callable receiver here,
1998 Label receiver_not_callable; 1998 // since that's the first thing the Call/CallWithArrayLike builtins
1999 __ JumpIfSmi(receiver, &receiver_not_callable); 1999 // will do.
2000 __ Ldr(x10, FieldMemOperand(receiver, HeapObject::kMapOffset));
2001 __ Ldrb(w10, FieldMemOperand(x10, Map::kBitFieldOffset));
2002 __ TestAndBranchIfAllClear(x10, 1 << Map::kIsCallable,
2003 &receiver_not_callable);
2004 2000
2005 // 3. Tail call with no arguments if argArray is null or undefined. 2001 // 3. Tail call with no arguments if argArray is null or undefined.
2006 Label no_arguments; 2002 Label no_arguments;
2007 __ Cmp(arg_array, null_value); 2003 __ Cmp(arg_array, null_value);
2008 __ Ccmp(arg_array, undefined_value, ZFlag, ne); 2004 __ Ccmp(arg_array, undefined_value, ZFlag, ne);
2009 __ B(eq, &no_arguments); 2005 __ B(eq, &no_arguments);
2010 2006
2011 // 4a. Apply the receiver to the given argArray. 2007 // 4a. Apply the receiver to the given argArray.
2012 __ Jump(masm->isolate()->builtins()->CallWithArrayLike(), 2008 __ Jump(masm->isolate()->builtins()->CallWithArrayLike(),
2013 RelocInfo::CODE_TARGET); 2009 RelocInfo::CODE_TARGET);
2014 2010
2015 // 4b. The argArray is either null or undefined, so we tail call without any 2011 // 4b. The argArray is either null or undefined, so we tail call without any
2016 // arguments to the receiver. 2012 // arguments to the receiver.
2017 __ Bind(&no_arguments); 2013 __ Bind(&no_arguments);
2018 { 2014 {
2019 __ Mov(x0, 0); 2015 __ Mov(x0, 0);
2020 DCHECK(receiver.Is(x1)); 2016 DCHECK(receiver.Is(x1));
2021 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); 2017 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
2022 } 2018 }
2023
2024 // 4c. The receiver is not callable, throw an appropriate TypeError.
2025 __ Bind(&receiver_not_callable);
2026 {
2027 __ Poke(receiver, 0);
2028 __ TailCallRuntime(Runtime::kThrowApplyNonFunction);
2029 }
2030 } 2019 }
2031 2020
2032 // static 2021 // static
2033 void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { 2022 void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
2034 Register argc = x0; 2023 Register argc = x0;
2035 Register function = x1; 2024 Register function = x1;
2036 Register scratch1 = x10; 2025 Register scratch1 = x10;
2037 Register scratch2 = x11; 2026 Register scratch2 = x11;
2038 2027
2039 ASM_LOCATION("Builtins::Generate_FunctionPrototypeCall"); 2028 ASM_LOCATION("Builtins::Generate_FunctionPrototypeCall");
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2118 2107
2119 __ Poke(this_argument, 0); // Overwrite receiver. 2108 __ Poke(this_argument, 0); // Overwrite receiver.
2120 } 2109 }
2121 2110
2122 // ----------- S t a t e ------------- 2111 // ----------- S t a t e -------------
2123 // -- x2 : argumentsList 2112 // -- x2 : argumentsList
2124 // -- x1 : target 2113 // -- x1 : target
2125 // -- jssp[0] : thisArgument 2114 // -- jssp[0] : thisArgument
2126 // ----------------------------------- 2115 // -----------------------------------
2127 2116
2128 // 2. Make sure the target is actually callable. 2117 // 2. We don't need to check explicitly for callable target here,
2129 Label target_not_callable; 2118 // since that's the first thing the Call/CallWithArrayLike builtins
2130 __ JumpIfSmi(target, &target_not_callable); 2119 // will do.
2131 __ Ldr(x10, FieldMemOperand(target, HeapObject::kMapOffset));
2132 __ Ldr(x10, FieldMemOperand(x10, Map::kBitFieldOffset));
2133 __ TestAndBranchIfAllClear(x10, 1 << Map::kIsCallable, &target_not_callable);
2134 2120
2135 // 3a. Apply the target to the given argumentsList. 2121 // 3. Apply the target to the given argumentsList.
2136 __ Jump(masm->isolate()->builtins()->CallWithArrayLike(), 2122 __ Jump(masm->isolate()->builtins()->CallWithArrayLike(),
2137 RelocInfo::CODE_TARGET); 2123 RelocInfo::CODE_TARGET);
2138
2139 // 3b. The target is not callable, throw an appropriate TypeError.
2140 __ Bind(&target_not_callable);
2141 {
2142 __ Poke(target, 0);
2143 __ TailCallRuntime(Runtime::kThrowApplyNonFunction);
2144 }
2145 } 2124 }
2146 2125
2147 void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { 2126 void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
2148 // ----------- S t a t e ------------- 2127 // ----------- S t a t e -------------
2149 // -- x0 : argc 2128 // -- x0 : argc
2150 // -- jssp[0] : new.target (optional) 2129 // -- jssp[0] : new.target (optional)
2151 // -- jssp[8] : argumentsList 2130 // -- jssp[8] : argumentsList
2152 // -- jssp[16] : target 2131 // -- jssp[16] : target
2153 // -- jssp[24] : receiver 2132 // -- jssp[24] : receiver
2154 // ----------------------------------- 2133 // -----------------------------------
(...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after
3126 // Now jump to the instructions of the returned code object. 3105 // Now jump to the instructions of the returned code object.
3127 __ Jump(x8); 3106 __ Jump(x8);
3128 } 3107 }
3129 3108
3130 #undef __ 3109 #undef __
3131 3110
3132 } // namespace internal 3111 } // namespace internal
3133 } // namespace v8 3112 } // namespace v8
3134 3113
3135 #endif // V8_TARGET_ARCH_ARM 3114 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/builtins/arm/builtins-arm.cc ('k') | src/builtins/builtins-call-gen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698