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 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 int no_frame_start = masm_->pc_offset(); | 453 int no_frame_start = masm_->pc_offset(); |
454 __ ldp(fp, lr, MemOperand(current_sp, 2 * kXRegSize, PostIndex)); | 454 __ ldp(fp, lr, MemOperand(current_sp, 2 * kXRegSize, PostIndex)); |
455 // Drop the arguments and receiver and return. | 455 // Drop the arguments and receiver and return. |
456 // TODO(all): This implementation is overkill as it supports 2**31+1 | 456 // TODO(all): This implementation is overkill as it supports 2**31+1 |
457 // arguments, consider how to improve it without creating a security | 457 // arguments, consider how to improve it without creating a security |
458 // hole. | 458 // hole. |
459 __ ldr_pcrel(ip0, (3 * kInstructionSize) >> kLoadLiteralScaleLog2); | 459 __ ldr_pcrel(ip0, (3 * kInstructionSize) >> kLoadLiteralScaleLog2); |
460 __ add(current_sp, current_sp, ip0); | 460 __ add(current_sp, current_sp, ip0); |
461 __ ret(); | 461 __ ret(); |
462 int32_t arg_count = info_->scope()->num_parameters() + 1; | 462 int32_t arg_count = info_->scope()->num_parameters() + 1; |
463 if (FLAG_experimental_classes && | 463 if (IsSubclassConstructor(info_->function()->kind())) { |
464 IsSubclassConstructor(info_->function()->kind())) { | |
465 arg_count++; | 464 arg_count++; |
466 } | 465 } |
467 __ dc64(kXRegSize * arg_count); | 466 __ dc64(kXRegSize * arg_count); |
468 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); | 467 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); |
469 } | 468 } |
470 } | 469 } |
471 } | 470 } |
472 | 471 |
473 | 472 |
474 void FullCodeGenerator::EffectContext::Plug(Variable* var) const { | 473 void FullCodeGenerator::EffectContext::Plug(Variable* var) const { |
(...skipping 2396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2871 PreservePositionScope scope(masm()->positions_recorder()); | 2870 PreservePositionScope scope(masm()->positions_recorder()); |
2872 VisitForStackValue(property->obj()); | 2871 VisitForStackValue(property->obj()); |
2873 } | 2872 } |
2874 if (is_named_call) { | 2873 if (is_named_call) { |
2875 EmitCallWithLoadIC(expr); | 2874 EmitCallWithLoadIC(expr); |
2876 } else { | 2875 } else { |
2877 EmitKeyedCallWithLoadIC(expr, property->key()); | 2876 EmitKeyedCallWithLoadIC(expr, property->key()); |
2878 } | 2877 } |
2879 } | 2878 } |
2880 } else if (call_type == Call::SUPER_CALL) { | 2879 } else if (call_type == Call::SUPER_CALL) { |
2881 if (FLAG_experimental_classes) { | 2880 EmitSuperConstructorCall(expr); |
2882 EmitSuperConstructorCall(expr); | |
2883 } else { | |
2884 SuperReference* super_ref = callee->AsSuperReference(); | |
2885 EmitLoadSuperConstructor(); | |
2886 __ Push(result_register()); | |
2887 VisitForStackValue(super_ref->this_var()); | |
2888 EmitCall(expr, CallICState::METHOD); | |
2889 } | |
2890 } else { | 2881 } else { |
2891 DCHECK(call_type == Call::OTHER_CALL); | 2882 DCHECK(call_type == Call::OTHER_CALL); |
2892 // Call to an arbitrary expression not handled specially above. | 2883 // Call to an arbitrary expression not handled specially above. |
2893 { PreservePositionScope scope(masm()->positions_recorder()); | 2884 { PreservePositionScope scope(masm()->positions_recorder()); |
2894 VisitForStackValue(callee); | 2885 VisitForStackValue(callee); |
2895 } | 2886 } |
2896 __ LoadRoot(x1, Heap::kUndefinedValueRootIndex); | 2887 __ LoadRoot(x1, Heap::kUndefinedValueRootIndex); |
2897 __ Push(x1); | 2888 __ Push(x1); |
2898 // Emit function call. | 2889 // Emit function call. |
2899 EmitCall(expr); | 2890 EmitCall(expr); |
(...skipping 2570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5470 return previous_; | 5461 return previous_; |
5471 } | 5462 } |
5472 | 5463 |
5473 | 5464 |
5474 #undef __ | 5465 #undef __ |
5475 | 5466 |
5476 | 5467 |
5477 } } // namespace v8::internal | 5468 } } // namespace v8::internal |
5478 | 5469 |
5479 #endif // V8_TARGET_ARCH_ARM64 | 5470 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |