| OLD | NEW |
| 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-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 } | 403 } |
| 404 } | 404 } |
| 405 | 405 |
| 406 | 406 |
| 407 void LCodeGen::DoCallFunction(LCallFunction* instr) { | 407 void LCodeGen::DoCallFunction(LCallFunction* instr) { |
| 408 DCHECK(ToRegister(instr->context()).is(cp)); | 408 DCHECK(ToRegister(instr->context()).is(cp)); |
| 409 DCHECK(ToRegister(instr->function()).Is(x1)); | 409 DCHECK(ToRegister(instr->function()).Is(x1)); |
| 410 DCHECK(ToRegister(instr->result()).Is(x0)); | 410 DCHECK(ToRegister(instr->result()).Is(x0)); |
| 411 | 411 |
| 412 int arity = instr->arity(); | 412 int arity = instr->arity(); |
| 413 CallFunctionFlags flags = instr->hydrogen()->function_flags(); | 413 CallFunctionStub stub(isolate(), arity, instr->hydrogen()->function_flags()); |
| 414 if (instr->hydrogen()->HasVectorAndSlot()) { | 414 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 415 Register slot_register = ToRegister(instr->temp_slot()); | |
| 416 Register vector_register = ToRegister(instr->temp_vector()); | |
| 417 DCHECK(slot_register.is(x3)); | |
| 418 DCHECK(vector_register.is(x2)); | |
| 419 | |
| 420 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); | |
| 421 int index = vector->GetIndex(instr->hydrogen()->slot()); | |
| 422 | |
| 423 __ Mov(vector_register, vector); | |
| 424 __ Mov(slot_register, Operand(Smi::FromInt(index))); | |
| 425 | |
| 426 CallICState::CallType call_type = | |
| 427 (flags & CALL_AS_METHOD) ? CallICState::METHOD : CallICState::FUNCTION; | |
| 428 | |
| 429 Handle<Code> ic = | |
| 430 CodeFactory::CallICInOptimizedCode(isolate(), arity, call_type).code(); | |
| 431 CallCode(ic, RelocInfo::CODE_TARGET, instr); | |
| 432 } else { | |
| 433 CallFunctionStub stub(isolate(), arity, flags); | |
| 434 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | |
| 435 } | |
| 436 after_push_argument_ = false; | 415 after_push_argument_ = false; |
| 437 } | 416 } |
| 438 | 417 |
| 439 | 418 |
| 440 void LCodeGen::DoCallNew(LCallNew* instr) { | 419 void LCodeGen::DoCallNew(LCallNew* instr) { |
| 441 DCHECK(ToRegister(instr->context()).is(cp)); | 420 DCHECK(ToRegister(instr->context()).is(cp)); |
| 442 DCHECK(instr->IsMarkedAsCall()); | 421 DCHECK(instr->IsMarkedAsCall()); |
| 443 DCHECK(ToRegister(instr->constructor()).is(x1)); | 422 DCHECK(ToRegister(instr->constructor()).is(x1)); |
| 444 | 423 |
| 445 __ Mov(x0, instr->arity()); | 424 __ Mov(x0, instr->arity()); |
| (...skipping 5638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6084 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6063 Handle<ScopeInfo> scope_info = instr->scope_info(); |
| 6085 __ Push(scope_info); | 6064 __ Push(scope_info); |
| 6086 __ Push(ToRegister(instr->function())); | 6065 __ Push(ToRegister(instr->function())); |
| 6087 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6066 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6088 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6067 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6089 } | 6068 } |
| 6090 | 6069 |
| 6091 | 6070 |
| 6092 | 6071 |
| 6093 } } // namespace v8::internal | 6072 } } // namespace v8::internal |
| OLD | NEW |