OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 #if V8_TARGET_ARCH_S390 | 5 #if V8_TARGET_ARCH_S390 |
6 | 6 |
7 #include "src/full-codegen/full-codegen.h" | 7 #include "src/full-codegen/full-codegen.h" |
8 #include "src/ast/compile-time-value.h" | 8 #include "src/ast/compile-time-value.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1214 context()->Plug(r2); | 1214 context()->Plug(r2); |
1215 break; | 1215 break; |
1216 } | 1216 } |
1217 | 1217 |
1218 case VariableLocation::PARAMETER: | 1218 case VariableLocation::PARAMETER: |
1219 case VariableLocation::LOCAL: | 1219 case VariableLocation::LOCAL: |
1220 case VariableLocation::CONTEXT: { | 1220 case VariableLocation::CONTEXT: { |
1221 DCHECK_EQ(NOT_INSIDE_TYPEOF, typeof_mode); | 1221 DCHECK_EQ(NOT_INSIDE_TYPEOF, typeof_mode); |
1222 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" | 1222 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" |
1223 : "[ Stack variable"); | 1223 : "[ Stack variable"); |
1224 if (proxy->needs_hole_check()) { | 1224 if (proxy->hole_check_mode() == HoleCheckMode::kRequired) { |
1225 // Throw a reference error when using an uninitialized let/const | 1225 // Throw a reference error when using an uninitialized let/const |
1226 // binding in harmony mode. | 1226 // binding in harmony mode. |
1227 Label done; | 1227 Label done; |
1228 GetVar(r2, var); | 1228 GetVar(r2, var); |
1229 __ CompareRoot(r2, Heap::kTheHoleValueRootIndex); | 1229 __ CompareRoot(r2, Heap::kTheHoleValueRootIndex); |
1230 __ bne(&done); | 1230 __ bne(&done); |
1231 __ mov(r2, Operand(var->name())); | 1231 __ mov(r2, Operand(var->name())); |
1232 __ push(r2); | 1232 __ push(r2); |
1233 __ CallRuntime(Runtime::kThrowReferenceError); | 1233 __ CallRuntime(Runtime::kThrowReferenceError); |
1234 __ bind(&done); | 1234 __ bind(&done); |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1649 // Deoptimization point in case the binary operation may have side effects. | 1649 // Deoptimization point in case the binary operation may have side effects. |
1650 PrepareForBailout(expr->binary_operation(), BailoutState::TOS_REGISTER); | 1650 PrepareForBailout(expr->binary_operation(), BailoutState::TOS_REGISTER); |
1651 } else { | 1651 } else { |
1652 VisitForAccumulatorValue(expr->value()); | 1652 VisitForAccumulatorValue(expr->value()); |
1653 } | 1653 } |
1654 | 1654 |
1655 SetExpressionPosition(expr); | 1655 SetExpressionPosition(expr); |
1656 | 1656 |
1657 // Store the value. | 1657 // Store the value. |
1658 switch (assign_type) { | 1658 switch (assign_type) { |
1659 case VARIABLE: | 1659 case VARIABLE: { |
1660 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), | 1660 VariableProxy* proxy = expr->target()->AsVariableProxy(); |
1661 expr->op(), expr->AssignmentSlot()); | 1661 EmitVariableAssignment(proxy->var(), expr->op(), expr->AssignmentSlot(), |
| 1662 proxy->hole_check_mode()); |
1662 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); | 1663 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); |
1663 context()->Plug(r2); | 1664 context()->Plug(r2); |
1664 break; | 1665 break; |
| 1666 } |
1665 case NAMED_PROPERTY: | 1667 case NAMED_PROPERTY: |
1666 EmitNamedPropertyAssignment(expr); | 1668 EmitNamedPropertyAssignment(expr); |
1667 break; | 1669 break; |
1668 case NAMED_SUPER_PROPERTY: | 1670 case NAMED_SUPER_PROPERTY: |
1669 EmitNamedSuperPropertyStore(property); | 1671 EmitNamedSuperPropertyStore(property); |
1670 context()->Plug(r2); | 1672 context()->Plug(r2); |
1671 break; | 1673 break; |
1672 case KEYED_SUPER_PROPERTY: | 1674 case KEYED_SUPER_PROPERTY: |
1673 EmitKeyedSuperPropertyStore(property); | 1675 EmitKeyedSuperPropertyStore(property); |
1674 context()->Plug(r2); | 1676 context()->Plug(r2); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1979 | 1981 |
1980 void FullCodeGenerator::EmitAssignment(Expression* expr, | 1982 void FullCodeGenerator::EmitAssignment(Expression* expr, |
1981 FeedbackVectorSlot slot) { | 1983 FeedbackVectorSlot slot) { |
1982 DCHECK(expr->IsValidReferenceExpressionOrThis()); | 1984 DCHECK(expr->IsValidReferenceExpressionOrThis()); |
1983 | 1985 |
1984 Property* prop = expr->AsProperty(); | 1986 Property* prop = expr->AsProperty(); |
1985 LhsKind assign_type = Property::GetAssignType(prop); | 1987 LhsKind assign_type = Property::GetAssignType(prop); |
1986 | 1988 |
1987 switch (assign_type) { | 1989 switch (assign_type) { |
1988 case VARIABLE: { | 1990 case VARIABLE: { |
1989 Variable* var = expr->AsVariableProxy()->var(); | 1991 VariableProxy* proxy = expr->AsVariableProxy(); |
1990 EffectContext context(this); | 1992 EffectContext context(this); |
1991 EmitVariableAssignment(var, Token::ASSIGN, slot); | 1993 EmitVariableAssignment(proxy->var(), Token::ASSIGN, slot, |
| 1994 proxy->hole_check_mode()); |
1992 break; | 1995 break; |
1993 } | 1996 } |
1994 case NAMED_PROPERTY: { | 1997 case NAMED_PROPERTY: { |
1995 PushOperand(r2); // Preserve value. | 1998 PushOperand(r2); // Preserve value. |
1996 VisitForAccumulatorValue(prop->obj()); | 1999 VisitForAccumulatorValue(prop->obj()); |
1997 __ Move(StoreDescriptor::ReceiverRegister(), r2); | 2000 __ Move(StoreDescriptor::ReceiverRegister(), r2); |
1998 PopOperand(StoreDescriptor::ValueRegister()); // Restore value. | 2001 PopOperand(StoreDescriptor::ValueRegister()); // Restore value. |
1999 CallStoreIC(slot, prop->key()->AsLiteral()->value()); | 2002 CallStoreIC(slot, prop->key()->AsLiteral()->value()); |
2000 break; | 2003 break; |
2001 } | 2004 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2056 if (var->IsContextSlot()) { | 2059 if (var->IsContextSlot()) { |
2057 // RecordWrite may destroy all its register arguments. | 2060 // RecordWrite may destroy all its register arguments. |
2058 __ LoadRR(r5, result_register()); | 2061 __ LoadRR(r5, result_register()); |
2059 int offset = Context::SlotOffset(var->index()); | 2062 int offset = Context::SlotOffset(var->index()); |
2060 __ RecordWriteContextSlot(r3, offset, r5, r4, kLRHasBeenSaved, | 2063 __ RecordWriteContextSlot(r3, offset, r5, r4, kLRHasBeenSaved, |
2061 kDontSaveFPRegs); | 2064 kDontSaveFPRegs); |
2062 } | 2065 } |
2063 } | 2066 } |
2064 | 2067 |
2065 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, | 2068 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, |
2066 FeedbackVectorSlot slot) { | 2069 FeedbackVectorSlot slot, |
| 2070 HoleCheckMode hole_check_mode) { |
2067 if (var->IsUnallocated()) { | 2071 if (var->IsUnallocated()) { |
2068 // Global var, const, or let. | 2072 // Global var, const, or let. |
2069 __ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); | 2073 __ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); |
2070 CallStoreIC(slot, var->name()); | 2074 CallStoreIC(slot, var->name()); |
2071 | 2075 |
2072 } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { | 2076 } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { |
2073 // Non-initializing assignment to let variable needs a write barrier. | 2077 // Non-initializing assignment to let variable needs a write barrier. |
2074 DCHECK(!var->IsLookupSlot()); | 2078 DCHECK(!var->IsLookupSlot()); |
2075 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); | 2079 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
2076 MemOperand location = VarOperand(var, r3); | 2080 MemOperand location = VarOperand(var, r3); |
2077 // Perform an initialization check for lexically declared variables. | 2081 // Perform an initialization check for lexically declared variables. |
2078 if (var->binding_needs_init()) { | 2082 if (hole_check_mode == HoleCheckMode::kRequired) { |
2079 Label assign; | 2083 Label assign; |
2080 __ LoadP(r5, location); | 2084 __ LoadP(r5, location); |
2081 __ CompareRoot(r5, Heap::kTheHoleValueRootIndex); | 2085 __ CompareRoot(r5, Heap::kTheHoleValueRootIndex); |
2082 __ bne(&assign); | 2086 __ bne(&assign); |
2083 __ mov(r5, Operand(var->name())); | 2087 __ mov(r5, Operand(var->name())); |
2084 __ push(r5); | 2088 __ push(r5); |
2085 __ CallRuntime(Runtime::kThrowReferenceError); | 2089 __ CallRuntime(Runtime::kThrowReferenceError); |
2086 __ bind(&assign); | 2090 __ bind(&assign); |
2087 } | 2091 } |
2088 if (var->mode() != CONST) { | 2092 if (var->mode() != CONST) { |
(...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3106 | 3110 |
3107 SetExpressionPosition(expr); | 3111 SetExpressionPosition(expr); |
3108 | 3112 |
3109 Handle<Code> code = CodeFactory::BinaryOpIC(isolate(), Token::ADD).code(); | 3113 Handle<Code> code = CodeFactory::BinaryOpIC(isolate(), Token::ADD).code(); |
3110 CallIC(code, expr->CountBinOpFeedbackId()); | 3114 CallIC(code, expr->CountBinOpFeedbackId()); |
3111 patch_site.EmitPatchInfo(); | 3115 patch_site.EmitPatchInfo(); |
3112 __ bind(&done); | 3116 __ bind(&done); |
3113 | 3117 |
3114 // Store the value returned in r2. | 3118 // Store the value returned in r2. |
3115 switch (assign_type) { | 3119 switch (assign_type) { |
3116 case VARIABLE: | 3120 case VARIABLE: { |
| 3121 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
3117 if (expr->is_postfix()) { | 3122 if (expr->is_postfix()) { |
3118 { | 3123 { |
3119 EffectContext context(this); | 3124 EffectContext context(this); |
3120 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 3125 EmitVariableAssignment(proxy->var(), Token::ASSIGN, expr->CountSlot(), |
3121 Token::ASSIGN, expr->CountSlot()); | 3126 proxy->hole_check_mode()); |
3122 PrepareForBailoutForId(expr->AssignmentId(), | 3127 PrepareForBailoutForId(expr->AssignmentId(), |
3123 BailoutState::TOS_REGISTER); | 3128 BailoutState::TOS_REGISTER); |
3124 context.Plug(r2); | 3129 context.Plug(r2); |
3125 } | 3130 } |
3126 // For all contexts except EffectConstant We have the result on | 3131 // For all contexts except EffectConstant We have the result on |
3127 // top of the stack. | 3132 // top of the stack. |
3128 if (!context()->IsEffect()) { | 3133 if (!context()->IsEffect()) { |
3129 context()->PlugTOS(); | 3134 context()->PlugTOS(); |
3130 } | 3135 } |
3131 } else { | 3136 } else { |
3132 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 3137 EmitVariableAssignment(proxy->var(), Token::ASSIGN, expr->CountSlot(), |
3133 Token::ASSIGN, expr->CountSlot()); | 3138 proxy->hole_check_mode()); |
3134 PrepareForBailoutForId(expr->AssignmentId(), | 3139 PrepareForBailoutForId(expr->AssignmentId(), |
3135 BailoutState::TOS_REGISTER); | 3140 BailoutState::TOS_REGISTER); |
3136 context()->Plug(r2); | 3141 context()->Plug(r2); |
3137 } | 3142 } |
3138 break; | 3143 break; |
| 3144 } |
3139 case NAMED_PROPERTY: { | 3145 case NAMED_PROPERTY: { |
3140 PopOperand(StoreDescriptor::ReceiverRegister()); | 3146 PopOperand(StoreDescriptor::ReceiverRegister()); |
3141 CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value()); | 3147 CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value()); |
3142 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); | 3148 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); |
3143 if (expr->is_postfix()) { | 3149 if (expr->is_postfix()) { |
3144 if (!context()->IsEffect()) { | 3150 if (!context()->IsEffect()) { |
3145 context()->PlugTOS(); | 3151 context()->PlugTOS(); |
3146 } | 3152 } |
3147 } else { | 3153 } else { |
3148 context()->Plug(r2); | 3154 context()->Plug(r2); |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3539 DCHECK(kOSRBranchInstruction == br_instr); | 3545 DCHECK(kOSRBranchInstruction == br_instr); |
3540 | 3546 |
3541 DCHECK(interrupt_address == | 3547 DCHECK(interrupt_address == |
3542 isolate->builtins()->OnStackReplacement()->entry()); | 3548 isolate->builtins()->OnStackReplacement()->entry()); |
3543 return ON_STACK_REPLACEMENT; | 3549 return ON_STACK_REPLACEMENT; |
3544 } | 3550 } |
3545 | 3551 |
3546 } // namespace internal | 3552 } // namespace internal |
3547 } // namespace v8 | 3553 } // namespace v8 |
3548 #endif // V8_TARGET_ARCH_S390 | 3554 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |