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

Side by Side Diff: src/arm64/lithium-codegen-arm64.cc

Issue 535873002: Encapsulate megamorphic load/tail-call in hydrogen (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE. Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « src/arm64/lithium-arm64.cc ('k') | src/code-stubs.h » ('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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/arm64/lithium-codegen-arm64.h" 7 #include "src/arm64/lithium-codegen-arm64.h"
8 #include "src/arm64/lithium-gap-resolver-arm64.h" 8 #include "src/arm64/lithium-gap-resolver-arm64.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
11 #include "src/hydrogen-osr.h" 11 #include "src/hydrogen-osr.h"
12 #include "src/ic/stub-cache.h"
12 13
13 namespace v8 { 14 namespace v8 {
14 namespace internal { 15 namespace internal {
15 16
16 17
17 class SafepointGenerator FINAL : public CallWrapper { 18 class SafepointGenerator FINAL : public CallWrapper {
18 public: 19 public:
19 SafepointGenerator(LCodeGen* codegen, 20 SafepointGenerator(LCodeGen* codegen,
20 LPointerMap* pointers, 21 LPointerMap* pointers,
21 Safepoint::DeoptMode mode) 22 Safepoint::DeoptMode mode)
(...skipping 2008 matching lines...) Expand 10 before | Expand all | Expand 10 after
2030 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); 2031 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT);
2031 } else { 2032 } else {
2032 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); 2033 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt);
2033 ParameterCount count(arity); 2034 ParameterCount count(arity);
2034 ParameterCount expected(formal_parameter_count); 2035 ParameterCount expected(formal_parameter_count);
2035 __ InvokeFunction(function_reg, expected, count, CALL_FUNCTION, generator); 2036 __ InvokeFunction(function_reg, expected, count, CALL_FUNCTION, generator);
2036 } 2037 }
2037 } 2038 }
2038 2039
2039 2040
2041 void LCodeGen::DoTailCallThroughMegamorphicCache(
2042 LTailCallThroughMegamorphicCache* instr) {
2043 Register receiver = ToRegister(instr->receiver());
2044 Register name = ToRegister(instr->name());
2045 DCHECK(receiver.is(LoadDescriptor::ReceiverRegister()));
2046 DCHECK(name.is(LoadDescriptor::NameRegister()));
2047 DCHECK(receiver.is(x1));
2048 DCHECK(name.is(x2));
2049
2050 Register scratch = x3;
2051 Register extra = x4;
2052 Register extra2 = x5;
2053 Register extra3 = x6;
2054
2055 // Important for the tail-call.
2056 bool must_teardown_frame = NeedsEagerFrame();
2057
2058 // The probe will tail call to a handler if found.
2059 isolate()->stub_cache()->GenerateProbe(masm(), instr->hydrogen()->flags(),
2060 must_teardown_frame, receiver, name,
2061 scratch, extra, extra2, extra3);
2062
2063 // Tail call to miss if we ended up here.
2064 if (must_teardown_frame) __ LeaveFrame(StackFrame::INTERNAL);
2065 LoadIC::GenerateMiss(masm());
2066 }
2067
2068
2040 void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { 2069 void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) {
2041 DCHECK(instr->IsMarkedAsCall()); 2070 DCHECK(instr->IsMarkedAsCall());
2042 DCHECK(ToRegister(instr->result()).Is(x0)); 2071 DCHECK(ToRegister(instr->result()).Is(x0));
2043 2072
2044 LPointerMap* pointers = instr->pointer_map(); 2073 LPointerMap* pointers = instr->pointer_map();
2045 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); 2074 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt);
2046 2075
2047 if (instr->target()->IsConstantOperand()) { 2076 if (instr->target()->IsConstantOperand()) {
2048 LConstantOperand* target = LConstantOperand::cast(instr->target()); 2077 LConstantOperand* target = LConstantOperand::cast(instr->target());
2049 Handle<Code> code = Handle<Code>::cast(ToHandle(target)); 2078 Handle<Code> code = Handle<Code>::cast(ToHandle(target));
(...skipping 3972 matching lines...) Expand 10 before | Expand all | Expand 10 after
6022 Handle<ScopeInfo> scope_info = instr->scope_info(); 6051 Handle<ScopeInfo> scope_info = instr->scope_info();
6023 __ Push(scope_info); 6052 __ Push(scope_info);
6024 __ Push(ToRegister(instr->function())); 6053 __ Push(ToRegister(instr->function()));
6025 CallRuntime(Runtime::kPushBlockContext, 2, instr); 6054 CallRuntime(Runtime::kPushBlockContext, 2, instr);
6026 RecordSafepoint(Safepoint::kNoLazyDeopt); 6055 RecordSafepoint(Safepoint::kNoLazyDeopt);
6027 } 6056 }
6028 6057
6029 6058
6030 6059
6031 } } // namespace v8::internal 6060 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-arm64.cc ('k') | src/code-stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698