| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/cpu-profiler.h" | 10 #include "src/cpu-profiler.h" |
| (...skipping 4154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4165 Register name = ToRegister(instr->name()); | 4165 Register name = ToRegister(instr->name()); |
| 4166 DCHECK(receiver.is(LoadDescriptor::ReceiverRegister())); | 4166 DCHECK(receiver.is(LoadDescriptor::ReceiverRegister())); |
| 4167 DCHECK(name.is(LoadDescriptor::NameRegister())); | 4167 DCHECK(name.is(LoadDescriptor::NameRegister())); |
| 4168 DCHECK(receiver.is(r4)); | 4168 DCHECK(receiver.is(r4)); |
| 4169 DCHECK(name.is(r5)); | 4169 DCHECK(name.is(r5)); |
| 4170 Register scratch = r7; | 4170 Register scratch = r7; |
| 4171 Register extra = r8; | 4171 Register extra = r8; |
| 4172 Register extra2 = r9; | 4172 Register extra2 = r9; |
| 4173 Register extra3 = r10; | 4173 Register extra3 = r10; |
| 4174 | 4174 |
| 4175 #ifdef DEBUG | 4175 // The probe will tail call to a handler if found. |
| 4176 Register slot = FLAG_vector_ics ? ToRegister(instr->slot()) : no_reg; | 4176 isolate()->stub_cache()->GenerateProbe( |
| 4177 Register vector = FLAG_vector_ics ? ToRegister(instr->vector()) : no_reg; | 4177 masm(), Code::LOAD_IC, instr->hydrogen()->flags(), false, receiver, name, |
| 4178 DCHECK(!FLAG_vector_ics || | 4178 scratch, extra, extra2, extra3); |
| 4179 !AreAliased(slot, vector, scratch, extra, extra2, extra3)); | |
| 4180 #endif | |
| 4181 | |
| 4182 // Important for the tail-call. | |
| 4183 bool must_teardown_frame = NeedsEagerFrame(); | |
| 4184 | |
| 4185 if (!instr->hydrogen()->is_just_miss()) { | |
| 4186 DCHECK(!instr->hydrogen()->is_keyed_load()); | |
| 4187 | |
| 4188 // The probe will tail call to a handler if found. | |
| 4189 isolate()->stub_cache()->GenerateProbe( | |
| 4190 masm(), Code::LOAD_IC, instr->hydrogen()->flags(), must_teardown_frame, | |
| 4191 receiver, name, scratch, extra, extra2, extra3); | |
| 4192 } | |
| 4193 | 4179 |
| 4194 // Tail call to miss if we ended up here. | 4180 // Tail call to miss if we ended up here. |
| 4195 if (must_teardown_frame) __ LeaveFrame(StackFrame::INTERNAL); | 4181 LoadIC::GenerateMiss(masm()); |
| 4196 if (instr->hydrogen()->is_keyed_load()) { | |
| 4197 KeyedLoadIC::GenerateMiss(masm()); | |
| 4198 } else { | |
| 4199 LoadIC::GenerateMiss(masm()); | |
| 4200 } | |
| 4201 } | 4182 } |
| 4202 | 4183 |
| 4203 | 4184 |
| 4204 void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { | 4185 void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { |
| 4205 DCHECK(ToRegister(instr->result()).is(r3)); | 4186 DCHECK(ToRegister(instr->result()).is(r3)); |
| 4206 | 4187 |
| 4207 if (instr->hydrogen()->IsTailCall()) { | 4188 if (instr->hydrogen()->IsTailCall()) { |
| 4208 if (NeedsEagerFrame()) __ LeaveFrame(StackFrame::INTERNAL); | 4189 if (NeedsEagerFrame()) __ LeaveFrame(StackFrame::INTERNAL); |
| 4209 | 4190 |
| 4210 if (instr->target()->IsConstantOperand()) { | 4191 if (instr->target()->IsConstantOperand()) { |
| (...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6194 __ Push(scope_info); | 6175 __ Push(scope_info); |
| 6195 __ push(ToRegister(instr->function())); | 6176 __ push(ToRegister(instr->function())); |
| 6196 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6177 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6197 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6178 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6198 } | 6179 } |
| 6199 | 6180 |
| 6200 | 6181 |
| 6201 #undef __ | 6182 #undef __ |
| 6202 } | 6183 } |
| 6203 } // namespace v8::internal | 6184 } // namespace v8::internal |
| OLD | NEW |