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

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

Issue 1609893003: [es6] Tail calls support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Support for CS and TF compilers added Created 4 years, 11 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/parsing/parser.cc ('k') | src/x64/code-stubs-x64.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 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 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/codegen.h" 8 #include "src/codegen.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/full-codegen/full-codegen.h" 10 #include "src/full-codegen/full-codegen.h"
(...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 __ JumpIfRoot(rax, Heap::kNullValueRootIndex, &no_arguments, Label::kNear); 1190 __ JumpIfRoot(rax, Heap::kNullValueRootIndex, &no_arguments, Label::kNear);
1191 __ JumpIfRoot(rax, Heap::kUndefinedValueRootIndex, &no_arguments, 1191 __ JumpIfRoot(rax, Heap::kUndefinedValueRootIndex, &no_arguments,
1192 Label::kNear); 1192 Label::kNear);
1193 1193
1194 // 4a. Apply the receiver to the given argArray (passing undefined for 1194 // 4a. Apply the receiver to the given argArray (passing undefined for
1195 // new.target). 1195 // new.target).
1196 __ LoadRoot(rdx, Heap::kUndefinedValueRootIndex); 1196 __ LoadRoot(rdx, Heap::kUndefinedValueRootIndex);
1197 __ Jump(masm->isolate()->builtins()->Apply(), RelocInfo::CODE_TARGET); 1197 __ Jump(masm->isolate()->builtins()->Apply(), RelocInfo::CODE_TARGET);
1198 1198
1199 // 4b. The argArray is either null or undefined, so we tail call without any 1199 // 4b. The argArray is either null or undefined, so we tail call without any
1200 // arguments to the receiver. 1200 // arguments to the receiver. Since we did not create a frame for
1201 // Function.prototype.apply() yet, we use a normal Call builtin here.
1201 __ bind(&no_arguments); 1202 __ bind(&no_arguments);
1202 { 1203 {
1203 __ Set(rax, 0); 1204 __ Set(rax, 0);
1204 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); 1205 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
1205 } 1206 }
1206 1207
1207 // 4c. The receiver is not callable, throw an appropriate TypeError. 1208 // 4c. The receiver is not callable, throw an appropriate TypeError.
1208 __ bind(&receiver_not_callable); 1209 __ bind(&receiver_not_callable);
1209 { 1210 {
1210 StackArgumentsAccessor args(rsp, 0); 1211 StackArgumentsAccessor args(rsp, 0);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 __ bind(&loop); 1255 __ bind(&loop);
1255 __ movp(rbx, args.GetArgumentOperand(1)); 1256 __ movp(rbx, args.GetArgumentOperand(1));
1256 __ movp(args.GetArgumentOperand(0), rbx); 1257 __ movp(args.GetArgumentOperand(0), rbx);
1257 __ decp(rcx); 1258 __ decp(rcx);
1258 __ j(not_zero, &loop); // While non-zero. 1259 __ j(not_zero, &loop); // While non-zero.
1259 __ DropUnderReturnAddress(1, rbx); // Drop one slot under return address. 1260 __ DropUnderReturnAddress(1, rbx); // Drop one slot under return address.
1260 __ decp(rax); // One fewer argument (first argument is new receiver). 1261 __ decp(rax); // One fewer argument (first argument is new receiver).
1261 } 1262 }
1262 1263
1263 // 4. Call the callable. 1264 // 4. Call the callable.
1265 // Since we did not create a frame for Function.prototype.call() yet,
1266 // we use a normal Call builtin here.
1264 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); 1267 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
1265 } 1268 }
1266 1269
1267 1270
1268 void Builtins::Generate_ReflectApply(MacroAssembler* masm) { 1271 void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
1269 // ----------- S t a t e ------------- 1272 // ----------- S t a t e -------------
1270 // -- rax : argc 1273 // -- rax : argc
1271 // -- rsp[0] : return address 1274 // -- rsp[0] : return address
1272 // -- rsp[8] : argumentsList 1275 // -- rsp[8] : argumentsList
1273 // -- rsp[16] : thisArgument 1276 // -- rsp[16] : thisArgument
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 2038
2036 // Dispatch to Call or Construct depending on whether new.target is undefined. 2039 // Dispatch to Call or Construct depending on whether new.target is undefined.
2037 { 2040 {
2038 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex); 2041 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex);
2039 __ j(equal, masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); 2042 __ j(equal, masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
2040 __ Jump(masm->isolate()->builtins()->Construct(), RelocInfo::CODE_TARGET); 2043 __ Jump(masm->isolate()->builtins()->Construct(), RelocInfo::CODE_TARGET);
2041 } 2044 }
2042 } 2045 }
2043 2046
2044 2047
2048 namespace {
2049
2050 // Drops top JavaScript frame and an arguments adaptor frame below it (if
2051 // present) preserving all the arguments prepared for current call.
2052 // Does nothing if debugger is currently active.
2053 // ES6 14.6.3. PrepareForTailCall
2054 //
2055 // Stack structure for the function g() tail calling f():
2056 //
2057 // ------- Caller frame: -------
2058 // | ...
2059 // | g()'s arg M
2060 // | ...
2061 // | g()'s arg 1
2062 // | g()'s receiver arg
2063 // | g()'s caller pc
2064 // ------- g()'s frame: -------
2065 // | g()'s caller fp <- fp
2066 // | g()'s context
2067 // | function pointer: g
2068 // | -------------------------
2069 // | ...
2070 // | ...
2071 // | f()'s arg N
2072 // | ...
2073 // | f()'s arg 1
2074 // | f()'s receiver arg
2075 // | f()'s caller pc <- sp
2076 // ----------------------
2077 //
2078 void PrepareForTailCall(MacroAssembler* masm, Register args_reg,
2079 Register scratch1, Register scratch2,
2080 Register scratch3) {
2081 DCHECK(!AreAliased(args_reg, scratch1, scratch2, scratch3));
2082 Comment cmnt(masm, "[ PrepareForTailCall");
2083
2084 // Prepare for tail call only if the debugger is not active.
2085 Label done;
2086 ExternalReference debug_is_active =
2087 ExternalReference::debug_is_active_address(masm->isolate());
2088 __ Move(kScratchRegister, debug_is_active);
2089 __ cmpb(Operand(kScratchRegister, 0), Immediate(0));
2090 __ j(not_equal, &done, Label::kNear);
2091
2092 // Check if next frame is an arguments adaptor frame.
2093 Label no_arguments_adaptor, formal_parameter_count_loaded;
2094 __ movp(scratch2, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
2095 __ Cmp(Operand(scratch2, StandardFrameConstants::kContextOffset),
2096 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
2097 __ j(not_equal, &no_arguments_adaptor, Label::kNear);
2098
2099 // Drop arguments adaptor frame and load arguments count.
2100 __ movp(rbp, scratch2);
2101 __ SmiToInteger32(
2102 scratch1, Operand(rbp, ArgumentsAdaptorFrameConstants::kLengthOffset));
2103 __ jmp(&formal_parameter_count_loaded, Label::kNear);
2104
2105 __ bind(&no_arguments_adaptor);
2106 // Load caller's formal parameter count
2107 __ movp(scratch1, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
2108 __ movp(scratch1,
2109 FieldOperand(scratch1, JSFunction::kSharedFunctionInfoOffset));
2110 __ LoadSharedFunctionInfoSpecialField(
2111 scratch1, scratch1, SharedFunctionInfo::kFormalParameterCountOffset);
2112
2113 __ bind(&formal_parameter_count_loaded);
2114
2115 // Calculate the destination address where we will put the return address
2116 // after we drop current frame.
2117 Register new_sp_reg = scratch2;
2118 __ subp(scratch1, args_reg);
2119 __ leap(new_sp_reg, Operand(rbp, scratch1, times_pointer_size,
2120 StandardFrameConstants::kCallerPCOffset));
2121
2122 if (FLAG_debug_code) {
2123 __ cmpp(rsp, new_sp_reg);
2124 __ Check(below, kStackAccessBelowStackPointer);
2125 }
2126
2127 // Copy receiver and return address as well.
2128 Register count_reg = scratch1;
2129 __ leap(count_reg, Operand(args_reg, 2));
2130
2131 // Copy return address from caller's frame to current frame's return address
2132 // to avoid its trashing and let the following loop copy it to the right
2133 // place.
2134 Register tmp_reg = scratch3;
2135 __ movp(tmp_reg, Operand(rbp, StandardFrameConstants::kCallerPCOffset));
2136 __ movp(Operand(rsp, 0), tmp_reg);
2137
2138 // Restore caller's frame pointer now as it could be overwritten by
2139 // the copying loop.
2140 __ movp(rbp, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
2141
2142 Operand src(rsp, count_reg, times_pointer_size, 0);
2143 Operand dst(new_sp_reg, count_reg, times_pointer_size, 0);
2144
2145 // Now copy callee arguments to the caller frame going backwards to avoid
2146 // callee arguments corruption (source and destination areas could overlap).
2147 Label loop, entry;
2148 __ jmp(&entry, Label::kNear);
2149 __ bind(&loop);
2150 __ decp(count_reg);
2151 __ movp(tmp_reg, src);
2152 __ movp(dst, tmp_reg);
2153 __ bind(&entry);
2154 __ cmpp(count_reg, Immediate(0));
2155 __ j(not_equal, &loop, Label::kNear);
2156
2157 // Leave current frame.
2158 __ movp(rsp, new_sp_reg);
2159
2160 __ bind(&done);
2161 }
2162 } // namespace
2163
2164
2045 // static 2165 // static
2046 void Builtins::Generate_CallFunction(MacroAssembler* masm, 2166 void Builtins::Generate_CallFunction(MacroAssembler* masm,
2047 ConvertReceiverMode mode) { 2167 ConvertReceiverMode mode,
2168 TailCallMode tail_call_mode) {
2048 // ----------- S t a t e ------------- 2169 // ----------- S t a t e -------------
2049 // -- rax : the number of arguments (not including the receiver) 2170 // -- rax : the number of arguments (not including the receiver)
2050 // -- rdi : the function to call (checked to be a JSFunction) 2171 // -- rdi : the function to call (checked to be a JSFunction)
2051 // ----------------------------------- 2172 // -----------------------------------
2052 StackArgumentsAccessor args(rsp, rax); 2173 StackArgumentsAccessor args(rsp, rax);
2053 __ AssertFunction(rdi); 2174 __ AssertFunction(rdi);
2054 2175
2055 // ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList) 2176 // ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList)
2056 // Check that the function is not a "classConstructor". 2177 // Check that the function is not a "classConstructor".
2057 Label class_constructor; 2178 Label class_constructor;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 } 2254 }
2134 __ bind(&done_convert); 2255 __ bind(&done_convert);
2135 2256
2136 // ----------- S t a t e ------------- 2257 // ----------- S t a t e -------------
2137 // -- rax : the number of arguments (not including the receiver) 2258 // -- rax : the number of arguments (not including the receiver)
2138 // -- rdx : the shared function info. 2259 // -- rdx : the shared function info.
2139 // -- rdi : the function to call (checked to be a JSFunction) 2260 // -- rdi : the function to call (checked to be a JSFunction)
2140 // -- rsi : the function context. 2261 // -- rsi : the function context.
2141 // ----------------------------------- 2262 // -----------------------------------
2142 2263
2264 if (tail_call_mode == TailCallMode::kAllow) {
2265 PrepareForTailCall(masm, rax, rbx, rcx, r8);
2266 }
2267
2143 __ LoadSharedFunctionInfoSpecialField( 2268 __ LoadSharedFunctionInfoSpecialField(
2144 rbx, rdx, SharedFunctionInfo::kFormalParameterCountOffset); 2269 rbx, rdx, SharedFunctionInfo::kFormalParameterCountOffset);
2145 ParameterCount actual(rax); 2270 ParameterCount actual(rax);
2146 ParameterCount expected(rbx); 2271 ParameterCount expected(rbx);
2147 2272
2148 __ InvokeFunctionCode(rdi, no_reg, expected, actual, JUMP_FUNCTION, 2273 __ InvokeFunctionCode(rdi, no_reg, expected, actual, JUMP_FUNCTION,
2149 CheckDebugStepCallWrapper()); 2274 CheckDebugStepCallWrapper());
2150 2275
2151 // The function is a "classConstructor", need to raise an exception. 2276 // The function is a "classConstructor", need to raise an exception.
2152 __ bind(&class_constructor); 2277 __ bind(&class_constructor);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2237 // [[BoundArguments]]), so we need to subtract one for the return address. 2362 // [[BoundArguments]]), so we need to subtract one for the return address.
2238 __ decl(rax); 2363 __ decl(rax);
2239 } 2364 }
2240 __ bind(&no_bound_arguments); 2365 __ bind(&no_bound_arguments);
2241 } 2366 }
2242 2367
2243 } // namespace 2368 } // namespace
2244 2369
2245 2370
2246 // static 2371 // static
2247 void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) { 2372 void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm,
Benedikt Meurer 2016/01/22 05:23:12 Nit: No need to add Impl suffix here.
Igor Sheludko 2016/01/22 09:48:51 We have to use a different name here otherwise the
2373 TailCallMode tail_call_mode) {
2248 // ----------- S t a t e ------------- 2374 // ----------- S t a t e -------------
2249 // -- rax : the number of arguments (not including the receiver) 2375 // -- rax : the number of arguments (not including the receiver)
2250 // -- rdi : the function to call (checked to be a JSBoundFunction) 2376 // -- rdi : the function to call (checked to be a JSBoundFunction)
2251 // ----------------------------------- 2377 // -----------------------------------
2252 __ AssertBoundFunction(rdi); 2378 __ AssertBoundFunction(rdi);
2253 2379
2380 if (tail_call_mode == TailCallMode::kAllow) {
Benedikt Meurer 2016/01/22 05:23:12 You don't need to do this here. Just pick the righ
Igor Sheludko 2016/01/22 09:48:51 If we do like you suggested that would mean that w
2381 PrepareForTailCall(masm, rax, rbx, rcx, r8);
2382 }
2383
2254 // Patch the receiver to [[BoundThis]]. 2384 // Patch the receiver to [[BoundThis]].
2255 StackArgumentsAccessor args(rsp, rax); 2385 StackArgumentsAccessor args(rsp, rax);
2256 __ movp(rbx, FieldOperand(rdi, JSBoundFunction::kBoundThisOffset)); 2386 __ movp(rbx, FieldOperand(rdi, JSBoundFunction::kBoundThisOffset));
2257 __ movp(args.GetReceiverOperand(), rbx); 2387 __ movp(args.GetReceiverOperand(), rbx);
2258 2388
2259 // Push the [[BoundArguments]] onto the stack. 2389 // Push the [[BoundArguments]] onto the stack.
2260 Generate_PushBoundArguments(masm); 2390 Generate_PushBoundArguments(masm);
2261 2391
2262 // Call the [[BoundTargetFunction]] via the Call builtin. 2392 // Call the [[BoundTargetFunction]] via the Call builtin.
2263 __ movp(rdi, FieldOperand(rdi, JSBoundFunction::kBoundTargetFunctionOffset)); 2393 __ movp(rdi, FieldOperand(rdi, JSBoundFunction::kBoundTargetFunctionOffset));
2264 __ Load(rcx, 2394 __ Load(rcx,
2265 ExternalReference(Builtins::kCall_ReceiverIsAny, masm->isolate())); 2395 ExternalReference(Builtins::kCall_ReceiverIsAny, masm->isolate()));
2266 __ leap(rcx, FieldOperand(rcx, Code::kHeaderSize)); 2396 __ leap(rcx, FieldOperand(rcx, Code::kHeaderSize));
2267 __ jmp(rcx); 2397 __ jmp(rcx);
2268 } 2398 }
2269 2399
2270 2400
2271 // static 2401 // static
2272 void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) { 2402 void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode,
2403 TailCallMode tail_call_mode) {
2273 // ----------- S t a t e ------------- 2404 // ----------- S t a t e -------------
2274 // -- rax : the number of arguments (not including the receiver) 2405 // -- rax : the number of arguments (not including the receiver)
2275 // -- rdi : the target to call (can be any Object) 2406 // -- rdi : the target to call (can be any Object)
2276 // ----------------------------------- 2407 // -----------------------------------
2277 StackArgumentsAccessor args(rsp, rax); 2408 StackArgumentsAccessor args(rsp, rax);
2278 2409
2279 Label non_callable, non_function, non_smi; 2410 Label non_callable, non_function, non_smi;
2280 __ JumpIfSmi(rdi, &non_callable); 2411 __ JumpIfSmi(rdi, &non_callable);
2281 __ bind(&non_smi); 2412 __ bind(&non_smi);
2282 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); 2413 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx);
2283 __ j(equal, masm->isolate()->builtins()->CallFunction(mode), 2414 __ j(equal, masm->isolate()->builtins()->CallFunction(mode, tail_call_mode),
2284 RelocInfo::CODE_TARGET); 2415 RelocInfo::CODE_TARGET);
2285 __ CmpInstanceType(rcx, JS_BOUND_FUNCTION_TYPE); 2416 __ CmpInstanceType(rcx, JS_BOUND_FUNCTION_TYPE);
2286 __ j(equal, masm->isolate()->builtins()->CallBoundFunction(), 2417 __ j(equal, masm->isolate()->builtins()->CallBoundFunction(tail_call_mode),
2287 RelocInfo::CODE_TARGET); 2418 RelocInfo::CODE_TARGET);
2288 __ CmpInstanceType(rcx, JS_PROXY_TYPE); 2419 __ CmpInstanceType(rcx, JS_PROXY_TYPE);
2289 __ j(not_equal, &non_function); 2420 __ j(not_equal, &non_function);
2290 2421
2422 // 0. Prepare for tail call if necessary.
2423 if (tail_call_mode == TailCallMode::kAllow) {
2424 PrepareForTailCall(masm, rax, rbx, rcx, r8);
2425 }
2426
2291 // 1. Runtime fallback for Proxy [[Call]]. 2427 // 1. Runtime fallback for Proxy [[Call]].
2292 __ PopReturnAddressTo(kScratchRegister); 2428 __ PopReturnAddressTo(kScratchRegister);
2293 __ Push(rdi); 2429 __ Push(rdi);
2294 __ PushReturnAddressFrom(kScratchRegister); 2430 __ PushReturnAddressFrom(kScratchRegister);
2295 // Increase the arguments size to include the pushed function and the 2431 // Increase the arguments size to include the pushed function and the
2296 // existing receiver on the stack. 2432 // existing receiver on the stack.
2297 __ addp(rax, Immediate(2)); 2433 __ addp(rax, Immediate(2));
2298 // Tail-call to the runtime. 2434 // Tail-call to the runtime.
2299 __ JumpToExternalReference( 2435 __ JumpToExternalReference(
2300 ExternalReference(Runtime::kJSProxyCall, masm->isolate())); 2436 ExternalReference(Runtime::kJSProxyCall, masm->isolate()));
2301 2437
2302 // 2. Call to something else, which might have a [[Call]] internal method (if 2438 // 2. Call to something else, which might have a [[Call]] internal method (if
2303 // not we raise an exception). 2439 // not we raise an exception).
2304 __ bind(&non_function); 2440 __ bind(&non_function);
2305 // Check if target has a [[Call]] internal method. 2441 // Check if target has a [[Call]] internal method.
2306 __ testb(FieldOperand(rcx, Map::kBitFieldOffset), 2442 __ testb(FieldOperand(rcx, Map::kBitFieldOffset),
2307 Immediate(1 << Map::kIsCallable)); 2443 Immediate(1 << Map::kIsCallable));
2308 __ j(zero, &non_callable, Label::kNear); 2444 __ j(zero, &non_callable, Label::kNear);
2309 // Overwrite the original receiver with the (original) target. 2445 // Overwrite the original receiver with the (original) target.
2310 __ movp(args.GetReceiverOperand(), rdi); 2446 __ movp(args.GetReceiverOperand(), rdi);
2311 // Let the "call_as_function_delegate" take care of the rest. 2447 // Let the "call_as_function_delegate" take care of the rest.
2312 __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, rdi); 2448 __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, rdi);
2313 __ Jump(masm->isolate()->builtins()->CallFunction( 2449 __ Jump(masm->isolate()->builtins()->CallFunction(
2314 ConvertReceiverMode::kNotNullOrUndefined), 2450 ConvertReceiverMode::kNotNullOrUndefined, tail_call_mode),
2315 RelocInfo::CODE_TARGET); 2451 RelocInfo::CODE_TARGET);
2316 2452
2317 // 3. Call to something that is not callable. 2453 // 3. Call to something that is not callable.
2318 __ bind(&non_callable); 2454 __ bind(&non_callable);
2319 { 2455 {
2320 FrameScope scope(masm, StackFrame::INTERNAL); 2456 FrameScope scope(masm, StackFrame::INTERNAL);
2321 __ Push(rdi); 2457 __ Push(rdi);
2322 __ CallRuntime(Runtime::kThrowCalledNonCallable); 2458 __ CallRuntime(Runtime::kThrowCalledNonCallable);
2323 } 2459 }
2324 } 2460 }
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
2615 __ ret(0); 2751 __ ret(0);
2616 } 2752 }
2617 2753
2618 2754
2619 #undef __ 2755 #undef __
2620 2756
2621 } // namespace internal 2757 } // namespace internal
2622 } // namespace v8 2758 } // namespace v8
2623 2759
2624 #endif // V8_TARGET_ARCH_X64 2760 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/x64/code-stubs-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698