| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
| 8 | 8 |
| 9 // Note on Mips implementation: | 9 // Note on Mips implementation: |
| 10 // | 10 // |
| (...skipping 1971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1982 if (result_saved) { | 1982 if (result_saved) { |
| 1983 __ Pop(); // literal index | 1983 __ Pop(); // literal index |
| 1984 context()->PlugTOS(); | 1984 context()->PlugTOS(); |
| 1985 } else { | 1985 } else { |
| 1986 context()->Plug(v0); | 1986 context()->Plug(v0); |
| 1987 } | 1987 } |
| 1988 } | 1988 } |
| 1989 | 1989 |
| 1990 | 1990 |
| 1991 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1991 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| 1992 DCHECK(expr->target()->IsValidReferenceExpression()); | 1992 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); |
| 1993 | 1993 |
| 1994 Comment cmnt(masm_, "[ Assignment"); | 1994 Comment cmnt(masm_, "[ Assignment"); |
| 1995 SetExpressionPosition(expr, INSERT_BREAK); | 1995 SetExpressionPosition(expr, INSERT_BREAK); |
| 1996 | 1996 |
| 1997 Property* property = expr->target()->AsProperty(); | 1997 Property* property = expr->target()->AsProperty(); |
| 1998 LhsKind assign_type = Property::GetAssignType(property); | 1998 LhsKind assign_type = Property::GetAssignType(property); |
| 1999 | 1999 |
| 2000 // Evaluate LHS expression. | 2000 // Evaluate LHS expression. |
| 2001 switch (assign_type) { | 2001 switch (assign_type) { |
| 2002 case VARIABLE: | 2002 case VARIABLE: |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2652 CodeFactory::BinaryOpIC(isolate(), op, strength(language_mode())).code(); | 2652 CodeFactory::BinaryOpIC(isolate(), op, strength(language_mode())).code(); |
| 2653 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. | 2653 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. |
| 2654 CallIC(code, expr->BinaryOperationFeedbackId()); | 2654 CallIC(code, expr->BinaryOperationFeedbackId()); |
| 2655 patch_site.EmitPatchInfo(); | 2655 patch_site.EmitPatchInfo(); |
| 2656 context()->Plug(v0); | 2656 context()->Plug(v0); |
| 2657 } | 2657 } |
| 2658 | 2658 |
| 2659 | 2659 |
| 2660 void FullCodeGenerator::EmitAssignment(Expression* expr, | 2660 void FullCodeGenerator::EmitAssignment(Expression* expr, |
| 2661 FeedbackVectorICSlot slot) { | 2661 FeedbackVectorICSlot slot) { |
| 2662 DCHECK(expr->IsValidReferenceExpression()); | 2662 DCHECK(expr->IsValidReferenceExpressionOrThis()); |
| 2663 | 2663 |
| 2664 Property* prop = expr->AsProperty(); | 2664 Property* prop = expr->AsProperty(); |
| 2665 LhsKind assign_type = Property::GetAssignType(prop); | 2665 LhsKind assign_type = Property::GetAssignType(prop); |
| 2666 | 2666 |
| 2667 switch (assign_type) { | 2667 switch (assign_type) { |
| 2668 case VARIABLE: { | 2668 case VARIABLE: { |
| 2669 Variable* var = expr->AsVariableProxy()->var(); | 2669 Variable* var = expr->AsVariableProxy()->var(); |
| 2670 EffectContext context(this); | 2670 EffectContext context(this); |
| 2671 EmitVariableAssignment(var, Token::ASSIGN, slot); | 2671 EmitVariableAssignment(var, Token::ASSIGN, slot); |
| 2672 break; | 2672 break; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2801 MemOperand location = VarOperand(var, a1); | 2801 MemOperand location = VarOperand(var, a1); |
| 2802 __ ld(a3, location); | 2802 __ ld(a3, location); |
| 2803 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 2803 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 2804 __ Branch(&const_error, ne, a3, Operand(at)); | 2804 __ Branch(&const_error, ne, a3, Operand(at)); |
| 2805 __ li(a3, Operand(var->name())); | 2805 __ li(a3, Operand(var->name())); |
| 2806 __ push(a3); | 2806 __ push(a3); |
| 2807 __ CallRuntime(Runtime::kThrowReferenceError, 1); | 2807 __ CallRuntime(Runtime::kThrowReferenceError, 1); |
| 2808 __ bind(&const_error); | 2808 __ bind(&const_error); |
| 2809 __ CallRuntime(Runtime::kThrowConstAssignError, 0); | 2809 __ CallRuntime(Runtime::kThrowConstAssignError, 0); |
| 2810 | 2810 |
| 2811 } else if (var->is_this() && op == Token::INIT_CONST) { |
| 2812 // Initializing assignment to const {this} needs a write barrier. |
| 2813 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
| 2814 Label uninitialized_this; |
| 2815 MemOperand location = VarOperand(var, a1); |
| 2816 __ ld(a3, location); |
| 2817 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 2818 __ Branch(&uninitialized_this, eq, a3, Operand(at)); |
| 2819 __ li(a0, Operand(var->name())); |
| 2820 __ Push(a0); |
| 2821 __ CallRuntime(Runtime::kThrowReferenceError, 1); |
| 2822 __ bind(&uninitialized_this); |
| 2823 EmitStoreToStackLocalOrContextSlot(var, location); |
| 2824 |
| 2811 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { | 2825 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { |
| 2812 if (var->IsLookupSlot()) { | 2826 if (var->IsLookupSlot()) { |
| 2813 // Assignment to var. | 2827 // Assignment to var. |
| 2814 __ li(a4, Operand(var->name())); | 2828 __ li(a4, Operand(var->name())); |
| 2815 __ li(a3, Operand(Smi::FromInt(language_mode()))); | 2829 __ li(a3, Operand(Smi::FromInt(language_mode()))); |
| 2816 // jssp[0] : language mode. | 2830 // jssp[0] : language mode. |
| 2817 // jssp[8] : name. | 2831 // jssp[8] : name. |
| 2818 // jssp[16] : context. | 2832 // jssp[16] : context. |
| 2819 // jssp[24] : value. | 2833 // jssp[24] : value. |
| 2820 __ Push(v0, cp, a4, a3); | 2834 __ Push(v0, cp, a4, a3); |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3153 | 3167 |
| 3154 // a1: the start position of the scope the calls resides in. | 3168 // a1: the start position of the scope the calls resides in. |
| 3155 __ li(a1, Operand(Smi::FromInt(scope()->start_position()))); | 3169 __ li(a1, Operand(Smi::FromInt(scope()->start_position()))); |
| 3156 | 3170 |
| 3157 // Do the runtime call. | 3171 // Do the runtime call. |
| 3158 __ Push(a6, a5, a4, a1); | 3172 __ Push(a6, a5, a4, a1); |
| 3159 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 5); | 3173 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 5); |
| 3160 } | 3174 } |
| 3161 | 3175 |
| 3162 | 3176 |
| 3163 void FullCodeGenerator::EmitInitializeThisAfterSuper( | |
| 3164 SuperCallReference* super_ref, FeedbackVectorICSlot slot) { | |
| 3165 Variable* this_var = super_ref->this_var()->var(); | |
| 3166 GetVar(a1, this_var); | |
| 3167 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | |
| 3168 Label uninitialized_this; | |
| 3169 __ Branch(&uninitialized_this, eq, a1, Operand(at)); | |
| 3170 __ li(a0, Operand(this_var->name())); | |
| 3171 __ Push(a0); | |
| 3172 __ CallRuntime(Runtime::kThrowReferenceError, 1); | |
| 3173 __ bind(&uninitialized_this); | |
| 3174 | |
| 3175 EmitVariableAssignment(this_var, Token::INIT_CONST, slot); | |
| 3176 } | |
| 3177 | |
| 3178 | |
| 3179 // See http://www.ecma-international.org/ecma-262/6.0/#sec-function-calls. | 3177 // See http://www.ecma-international.org/ecma-262/6.0/#sec-function-calls. |
| 3180 void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) { | 3178 void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) { |
| 3181 VariableProxy* callee = expr->expression()->AsVariableProxy(); | 3179 VariableProxy* callee = expr->expression()->AsVariableProxy(); |
| 3182 if (callee->var()->IsLookupSlot()) { | 3180 if (callee->var()->IsLookupSlot()) { |
| 3183 Label slow, done; | 3181 Label slow, done; |
| 3184 | 3182 |
| 3185 SetExpressionPosition(callee); | 3183 SetExpressionPosition(callee); |
| 3186 // Generate code for loading from variables potentially shadowed by | 3184 // Generate code for loading from variables potentially shadowed by |
| 3187 // eval-introduced variables. | 3185 // eval-introduced variables. |
| 3188 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); | 3186 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3388 } | 3386 } |
| 3389 | 3387 |
| 3390 __ li(a2, FeedbackVector()); | 3388 __ li(a2, FeedbackVector()); |
| 3391 __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); | 3389 __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); |
| 3392 | 3390 |
| 3393 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); | 3391 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); |
| 3394 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); | 3392 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); |
| 3395 | 3393 |
| 3396 RecordJSReturnSite(expr); | 3394 RecordJSReturnSite(expr); |
| 3397 | 3395 |
| 3398 EmitInitializeThisAfterSuper(super_call_ref, expr->CallFeedbackICSlot()); | |
| 3399 context()->Plug(v0); | 3396 context()->Plug(v0); |
| 3400 } | 3397 } |
| 3401 | 3398 |
| 3402 | 3399 |
| 3403 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { | 3400 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { |
| 3404 ZoneList<Expression*>* args = expr->arguments(); | 3401 ZoneList<Expression*>* args = expr->arguments(); |
| 3405 DCHECK(args->length() == 1); | 3402 DCHECK(args->length() == 1); |
| 3406 | 3403 |
| 3407 VisitForAccumulatorValue(args->at(0)); | 3404 VisitForAccumulatorValue(args->at(0)); |
| 3408 | 3405 |
| (...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4756 | 4753 |
| 4757 // Push NewTarget | 4754 // Push NewTarget |
| 4758 DCHECK(args->at(2)->IsVariableProxy()); | 4755 DCHECK(args->at(2)->IsVariableProxy()); |
| 4759 VisitForStackValue(args->at(2)); | 4756 VisitForStackValue(args->at(2)); |
| 4760 | 4757 |
| 4761 EmitCallJSRuntimeFunction(call); | 4758 EmitCallJSRuntimeFunction(call); |
| 4762 | 4759 |
| 4763 // Restore context register. | 4760 // Restore context register. |
| 4764 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 4761 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 4765 context()->DropAndPlug(1, v0); | 4762 context()->DropAndPlug(1, v0); |
| 4766 | |
| 4767 // TODO(mvstanton): with FLAG_vector_stores this needs a slot id. | |
| 4768 EmitInitializeThisAfterSuper(super_call_ref); | |
| 4769 } | 4763 } |
| 4770 | 4764 |
| 4771 | 4765 |
| 4772 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { | 4766 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { |
| 4773 // Push the builtins object as the receiver. | 4767 // Push the builtins object as the receiver. |
| 4774 Register receiver = LoadDescriptor::ReceiverRegister(); | 4768 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 4775 __ ld(receiver, GlobalObjectOperand()); | 4769 __ ld(receiver, GlobalObjectOperand()); |
| 4776 __ ld(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); | 4770 __ ld(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); |
| 4777 __ push(receiver); | 4771 __ push(receiver); |
| 4778 | 4772 |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4955 break; | 4949 break; |
| 4956 } | 4950 } |
| 4957 | 4951 |
| 4958 default: | 4952 default: |
| 4959 UNREACHABLE(); | 4953 UNREACHABLE(); |
| 4960 } | 4954 } |
| 4961 } | 4955 } |
| 4962 | 4956 |
| 4963 | 4957 |
| 4964 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4958 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| 4965 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4959 DCHECK(expr->expression()->IsValidReferenceExpressionOrThis()); |
| 4966 | 4960 |
| 4967 Comment cmnt(masm_, "[ CountOperation"); | 4961 Comment cmnt(masm_, "[ CountOperation"); |
| 4968 | 4962 |
| 4969 Property* prop = expr->expression()->AsProperty(); | 4963 Property* prop = expr->expression()->AsProperty(); |
| 4970 LhsKind assign_type = Property::GetAssignType(prop); | 4964 LhsKind assign_type = Property::GetAssignType(prop); |
| 4971 | 4965 |
| 4972 // Evaluate expression and get value. | 4966 // Evaluate expression and get value. |
| 4973 if (assign_type == VARIABLE) { | 4967 if (assign_type == VARIABLE) { |
| 4974 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4968 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
| 4975 AccumulatorValueContext context(this); | 4969 AccumulatorValueContext context(this); |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5594 reinterpret_cast<uint64_t>( | 5588 reinterpret_cast<uint64_t>( |
| 5595 isolate->builtins()->OsrAfterStackCheck()->entry())); | 5589 isolate->builtins()->OsrAfterStackCheck()->entry())); |
| 5596 return OSR_AFTER_STACK_CHECK; | 5590 return OSR_AFTER_STACK_CHECK; |
| 5597 } | 5591 } |
| 5598 | 5592 |
| 5599 | 5593 |
| 5600 } // namespace internal | 5594 } // namespace internal |
| 5601 } // namespace v8 | 5595 } // namespace v8 |
| 5602 | 5596 |
| 5603 #endif // V8_TARGET_ARCH_MIPS64 | 5597 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |