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 1959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1970 if (result_saved) { | 1970 if (result_saved) { |
1971 __ Drop(1); // literal index | 1971 __ Drop(1); // literal index |
1972 context()->PlugTOS(); | 1972 context()->PlugTOS(); |
1973 } else { | 1973 } else { |
1974 context()->Plug(x0); | 1974 context()->Plug(x0); |
1975 } | 1975 } |
1976 } | 1976 } |
1977 | 1977 |
1978 | 1978 |
1979 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1979 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
1980 DCHECK(expr->target()->IsValidReferenceExpression()); | 1980 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); |
1981 | 1981 |
1982 Comment cmnt(masm_, "[ Assignment"); | 1982 Comment cmnt(masm_, "[ Assignment"); |
1983 SetExpressionPosition(expr, INSERT_BREAK); | 1983 SetExpressionPosition(expr, INSERT_BREAK); |
1984 | 1984 |
1985 Property* property = expr->target()->AsProperty(); | 1985 Property* property = expr->target()->AsProperty(); |
1986 LhsKind assign_type = Property::GetAssignType(property); | 1986 LhsKind assign_type = Property::GetAssignType(property); |
1987 | 1987 |
1988 // Evaluate LHS expression. | 1988 // Evaluate LHS expression. |
1989 switch (assign_type) { | 1989 switch (assign_type) { |
1990 case VARIABLE: | 1990 case VARIABLE: |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2352 // Freeze the prototype. | 2352 // Freeze the prototype. |
2353 __ CallRuntime(Runtime::kObjectFreeze, 1); | 2353 __ CallRuntime(Runtime::kObjectFreeze, 1); |
2354 // Freeze the constructor. | 2354 // Freeze the constructor. |
2355 __ CallRuntime(Runtime::kObjectFreeze, 1); | 2355 __ CallRuntime(Runtime::kObjectFreeze, 1); |
2356 } | 2356 } |
2357 } | 2357 } |
2358 | 2358 |
2359 | 2359 |
2360 void FullCodeGenerator::EmitAssignment(Expression* expr, | 2360 void FullCodeGenerator::EmitAssignment(Expression* expr, |
2361 FeedbackVectorICSlot slot) { | 2361 FeedbackVectorICSlot slot) { |
2362 DCHECK(expr->IsValidReferenceExpression()); | 2362 DCHECK(expr->IsValidReferenceExpressionOrThis()); |
2363 | 2363 |
2364 Property* prop = expr->AsProperty(); | 2364 Property* prop = expr->AsProperty(); |
2365 LhsKind assign_type = Property::GetAssignType(prop); | 2365 LhsKind assign_type = Property::GetAssignType(prop); |
2366 | 2366 |
2367 switch (assign_type) { | 2367 switch (assign_type) { |
2368 case VARIABLE: { | 2368 case VARIABLE: { |
2369 Variable* var = expr->AsVariableProxy()->var(); | 2369 Variable* var = expr->AsVariableProxy()->var(); |
2370 EffectContext context(this); | 2370 EffectContext context(this); |
2371 EmitVariableAssignment(var, Token::ASSIGN, slot); | 2371 EmitVariableAssignment(var, Token::ASSIGN, slot); |
2372 break; | 2372 break; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2501 Label const_error; | 2501 Label const_error; |
2502 MemOperand location = VarOperand(var, x1); | 2502 MemOperand location = VarOperand(var, x1); |
2503 __ Ldr(x10, location); | 2503 __ Ldr(x10, location); |
2504 __ JumpIfNotRoot(x10, Heap::kTheHoleValueRootIndex, &const_error); | 2504 __ JumpIfNotRoot(x10, Heap::kTheHoleValueRootIndex, &const_error); |
2505 __ Mov(x10, Operand(var->name())); | 2505 __ Mov(x10, Operand(var->name())); |
2506 __ Push(x10); | 2506 __ Push(x10); |
2507 __ CallRuntime(Runtime::kThrowReferenceError, 1); | 2507 __ CallRuntime(Runtime::kThrowReferenceError, 1); |
2508 __ Bind(&const_error); | 2508 __ Bind(&const_error); |
2509 __ CallRuntime(Runtime::kThrowConstAssignError, 0); | 2509 __ CallRuntime(Runtime::kThrowConstAssignError, 0); |
2510 | 2510 |
| 2511 } else if (var->is_this() && op == Token::INIT_CONST) { |
| 2512 // Initializing assignment to const {this} needs a write barrier. |
| 2513 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
| 2514 Label uninitialized_this; |
| 2515 MemOperand location = VarOperand(var, x1); |
| 2516 __ Ldr(x10, location); |
| 2517 __ JumpIfRoot(x10, Heap::kTheHoleValueRootIndex, &uninitialized_this); |
| 2518 __ Mov(x0, Operand(var->name())); |
| 2519 __ Push(x0); |
| 2520 __ CallRuntime(Runtime::kThrowReferenceError, 1); |
| 2521 __ bind(&uninitialized_this); |
| 2522 EmitStoreToStackLocalOrContextSlot(var, location); |
| 2523 |
2511 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { | 2524 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { |
2512 if (var->IsLookupSlot()) { | 2525 if (var->IsLookupSlot()) { |
2513 // Assignment to var. | 2526 // Assignment to var. |
2514 __ Mov(x11, Operand(var->name())); | 2527 __ Mov(x11, Operand(var->name())); |
2515 __ Mov(x10, Smi::FromInt(language_mode())); | 2528 __ Mov(x10, Smi::FromInt(language_mode())); |
2516 // jssp[0] : mode. | 2529 // jssp[0] : mode. |
2517 // jssp[8] : name. | 2530 // jssp[8] : name. |
2518 // jssp[16] : context. | 2531 // jssp[16] : context. |
2519 // jssp[24] : value. | 2532 // jssp[24] : value. |
2520 __ Push(x0, cp, x11, x10); | 2533 __ Push(x0, cp, x11, x10); |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2859 __ Mov(x12, Smi::FromInt(scope()->start_position())); | 2872 __ Mov(x12, Smi::FromInt(scope()->start_position())); |
2860 | 2873 |
2861 // Push. | 2874 // Push. |
2862 __ Push(x9, x10, x11, x12); | 2875 __ Push(x9, x10, x11, x12); |
2863 | 2876 |
2864 // Do the runtime call. | 2877 // Do the runtime call. |
2865 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 5); | 2878 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 5); |
2866 } | 2879 } |
2867 | 2880 |
2868 | 2881 |
2869 void FullCodeGenerator::EmitInitializeThisAfterSuper( | |
2870 SuperCallReference* super_ref, FeedbackVectorICSlot slot) { | |
2871 Variable* this_var = super_ref->this_var()->var(); | |
2872 GetVar(x1, this_var); | |
2873 Label uninitialized_this; | |
2874 __ JumpIfRoot(x1, Heap::kTheHoleValueRootIndex, &uninitialized_this); | |
2875 __ Mov(x0, Operand(this_var->name())); | |
2876 __ Push(x0); | |
2877 __ CallRuntime(Runtime::kThrowReferenceError, 1); | |
2878 __ bind(&uninitialized_this); | |
2879 | |
2880 EmitVariableAssignment(this_var, Token::INIT_CONST, slot); | |
2881 } | |
2882 | |
2883 | |
2884 // See http://www.ecma-international.org/ecma-262/6.0/#sec-function-calls. | 2882 // See http://www.ecma-international.org/ecma-262/6.0/#sec-function-calls. |
2885 void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) { | 2883 void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) { |
2886 VariableProxy* callee = expr->expression()->AsVariableProxy(); | 2884 VariableProxy* callee = expr->expression()->AsVariableProxy(); |
2887 if (callee->var()->IsLookupSlot()) { | 2885 if (callee->var()->IsLookupSlot()) { |
2888 Label slow, done; | 2886 Label slow, done; |
2889 SetExpressionPosition(callee); | 2887 SetExpressionPosition(callee); |
2890 // Generate code for loading from variables potentially shadowed | 2888 // Generate code for loading from variables potentially shadowed |
2891 // by eval-introduced variables. | 2889 // by eval-introduced variables. |
2892 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); | 2890 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); |
2893 | 2891 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3096 } | 3094 } |
3097 | 3095 |
3098 __ LoadObject(x2, FeedbackVector()); | 3096 __ LoadObject(x2, FeedbackVector()); |
3099 __ Mov(x3, SmiFromSlot(expr->CallFeedbackSlot())); | 3097 __ Mov(x3, SmiFromSlot(expr->CallFeedbackSlot())); |
3100 | 3098 |
3101 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); | 3099 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); |
3102 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); | 3100 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); |
3103 | 3101 |
3104 RecordJSReturnSite(expr); | 3102 RecordJSReturnSite(expr); |
3105 | 3103 |
3106 EmitInitializeThisAfterSuper(super_call_ref, expr->CallFeedbackICSlot()); | |
3107 context()->Plug(x0); | 3104 context()->Plug(x0); |
3108 } | 3105 } |
3109 | 3106 |
3110 | 3107 |
3111 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { | 3108 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { |
3112 ZoneList<Expression*>* args = expr->arguments(); | 3109 ZoneList<Expression*>* args = expr->arguments(); |
3113 DCHECK(args->length() == 1); | 3110 DCHECK(args->length() == 1); |
3114 | 3111 |
3115 VisitForAccumulatorValue(args->at(0)); | 3112 VisitForAccumulatorValue(args->at(0)); |
3116 | 3113 |
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4427 | 4424 |
4428 // Push NewTarget | 4425 // Push NewTarget |
4429 DCHECK(args->at(2)->IsVariableProxy()); | 4426 DCHECK(args->at(2)->IsVariableProxy()); |
4430 VisitForStackValue(args->at(2)); | 4427 VisitForStackValue(args->at(2)); |
4431 | 4428 |
4432 EmitCallJSRuntimeFunction(call); | 4429 EmitCallJSRuntimeFunction(call); |
4433 | 4430 |
4434 // Restore context register. | 4431 // Restore context register. |
4435 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4432 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
4436 context()->DropAndPlug(1, x0); | 4433 context()->DropAndPlug(1, x0); |
4437 | |
4438 // TODO(mvstanton): with FLAG_vector_stores this needs a slot id. | |
4439 EmitInitializeThisAfterSuper(super_call_ref); | |
4440 } | 4434 } |
4441 | 4435 |
4442 | 4436 |
4443 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { | 4437 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { |
4444 // Push the builtins object as the receiver. | 4438 // Push the builtins object as the receiver. |
4445 __ Ldr(x10, GlobalObjectMemOperand()); | 4439 __ Ldr(x10, GlobalObjectMemOperand()); |
4446 __ Ldr(LoadDescriptor::ReceiverRegister(), | 4440 __ Ldr(LoadDescriptor::ReceiverRegister(), |
4447 FieldMemOperand(x10, GlobalObject::kBuiltinsOffset)); | 4441 FieldMemOperand(x10, GlobalObject::kBuiltinsOffset)); |
4448 __ Push(LoadDescriptor::ReceiverRegister()); | 4442 __ Push(LoadDescriptor::ReceiverRegister()); |
4449 | 4443 |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4625 context()->Plug(x0); | 4619 context()->Plug(x0); |
4626 break; | 4620 break; |
4627 } | 4621 } |
4628 default: | 4622 default: |
4629 UNREACHABLE(); | 4623 UNREACHABLE(); |
4630 } | 4624 } |
4631 } | 4625 } |
4632 | 4626 |
4633 | 4627 |
4634 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4628 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
4635 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4629 DCHECK(expr->expression()->IsValidReferenceExpressionOrThis()); |
4636 | 4630 |
4637 Comment cmnt(masm_, "[ CountOperation"); | 4631 Comment cmnt(masm_, "[ CountOperation"); |
4638 | 4632 |
4639 Property* prop = expr->expression()->AsProperty(); | 4633 Property* prop = expr->expression()->AsProperty(); |
4640 LhsKind assign_type = Property::GetAssignType(prop); | 4634 LhsKind assign_type = Property::GetAssignType(prop); |
4641 | 4635 |
4642 // Evaluate expression and get value. | 4636 // Evaluate expression and get value. |
4643 if (assign_type == VARIABLE) { | 4637 if (assign_type == VARIABLE) { |
4644 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4638 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
4645 AccumulatorValueContext context(this); | 4639 AccumulatorValueContext context(this); |
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5613 } | 5607 } |
5614 | 5608 |
5615 return INTERRUPT; | 5609 return INTERRUPT; |
5616 } | 5610 } |
5617 | 5611 |
5618 | 5612 |
5619 } // namespace internal | 5613 } // namespace internal |
5620 } // namespace v8 | 5614 } // namespace v8 |
5621 | 5615 |
5622 #endif // V8_TARGET_ARCH_ARM64 | 5616 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |