| 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 345 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 356   // Always emit a 'return undefined' in case control fell off the end of | 356   // Always emit a 'return undefined' in case control fell off the end of | 
| 357   // the body. | 357   // the body. | 
| 358   { | 358   { | 
| 359     Comment cmnt(masm_, "[ return <undefined>;"); | 359     Comment cmnt(masm_, "[ return <undefined>;"); | 
| 360     __ LoadRoot(r2, Heap::kUndefinedValueRootIndex); | 360     __ LoadRoot(r2, Heap::kUndefinedValueRootIndex); | 
| 361   } | 361   } | 
| 362   EmitReturnSequence(); | 362   EmitReturnSequence(); | 
| 363 } | 363 } | 
| 364 | 364 | 
| 365 void FullCodeGenerator::ClearAccumulator() { | 365 void FullCodeGenerator::ClearAccumulator() { | 
| 366   __ LoadSmiLiteral(r2, Smi::FromInt(0)); | 366   __ LoadSmiLiteral(r2, Smi::kZero); | 
| 367 } | 367 } | 
| 368 | 368 | 
| 369 void FullCodeGenerator::EmitProfilingCounterDecrement(int delta) { | 369 void FullCodeGenerator::EmitProfilingCounterDecrement(int delta) { | 
| 370   __ mov(r4, Operand(profiling_counter_)); | 370   __ mov(r4, Operand(profiling_counter_)); | 
| 371   intptr_t smi_delta = reinterpret_cast<intptr_t>(Smi::FromInt(delta)); | 371   intptr_t smi_delta = reinterpret_cast<intptr_t>(Smi::FromInt(delta)); | 
| 372   if (CpuFeatures::IsSupported(GENERAL_INSTR_EXT) && is_int8(-smi_delta)) { | 372   if (CpuFeatures::IsSupported(GENERAL_INSTR_EXT) && is_int8(-smi_delta)) { | 
| 373     __ AddP(FieldMemOperand(r4, Cell::kValueOffset), Operand(-smi_delta)); | 373     __ AddP(FieldMemOperand(r4, Cell::kValueOffset), Operand(-smi_delta)); | 
| 374     __ LoadP(r5, FieldMemOperand(r4, Cell::kValueOffset)); | 374     __ LoadP(r5, FieldMemOperand(r4, Cell::kValueOffset)); | 
| 375   } else { | 375   } else { | 
| 376     __ LoadP(r5, FieldMemOperand(r4, Cell::kValueOffset)); | 376     __ LoadP(r5, FieldMemOperand(r4, Cell::kValueOffset)); | 
| (...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 977   Label fixed_array; | 977   Label fixed_array; | 
| 978   __ LoadP(r4, FieldMemOperand(r2, HeapObject::kMapOffset)); | 978   __ LoadP(r4, FieldMemOperand(r2, HeapObject::kMapOffset)); | 
| 979   __ CompareRoot(r4, Heap::kMetaMapRootIndex); | 979   __ CompareRoot(r4, Heap::kMetaMapRootIndex); | 
| 980   __ bne(&fixed_array); | 980   __ bne(&fixed_array); | 
| 981 | 981 | 
| 982   // We got a map in register r2. Get the enumeration cache from it. | 982   // We got a map in register r2. Get the enumeration cache from it. | 
| 983   Label no_descriptors; | 983   Label no_descriptors; | 
| 984   __ bind(&use_cache); | 984   __ bind(&use_cache); | 
| 985 | 985 | 
| 986   __ EnumLength(r3, r2); | 986   __ EnumLength(r3, r2); | 
| 987   __ CmpSmiLiteral(r3, Smi::FromInt(0), r0); | 987   __ CmpSmiLiteral(r3, Smi::kZero, r0); | 
| 988   __ beq(&no_descriptors, Label::kNear); | 988   __ beq(&no_descriptors, Label::kNear); | 
| 989 | 989 | 
| 990   __ LoadInstanceDescriptors(r2, r4); | 990   __ LoadInstanceDescriptors(r2, r4); | 
| 991   __ LoadP(r4, FieldMemOperand(r4, DescriptorArray::kEnumCacheOffset)); | 991   __ LoadP(r4, FieldMemOperand(r4, DescriptorArray::kEnumCacheOffset)); | 
| 992   __ LoadP(r4, | 992   __ LoadP(r4, | 
| 993            FieldMemOperand(r4, DescriptorArray::kEnumCacheBridgeCacheOffset)); | 993            FieldMemOperand(r4, DescriptorArray::kEnumCacheBridgeCacheOffset)); | 
| 994 | 994 | 
| 995   // Set up the four remaining stack slots. | 995   // Set up the four remaining stack slots. | 
| 996   __ push(r2);  // Map. | 996   __ push(r2);  // Map. | 
| 997   __ LoadSmiLiteral(r2, Smi::FromInt(0)); | 997   __ LoadSmiLiteral(r2, Smi::kZero); | 
| 998   // Push enumeration cache, enumeration cache length (as smi) and zero. | 998   // Push enumeration cache, enumeration cache length (as smi) and zero. | 
| 999   __ Push(r4, r3, r2); | 999   __ Push(r4, r3, r2); | 
| 1000   __ b(&loop); | 1000   __ b(&loop); | 
| 1001 | 1001 | 
| 1002   __ bind(&no_descriptors); | 1002   __ bind(&no_descriptors); | 
| 1003   __ Drop(1); | 1003   __ Drop(1); | 
| 1004   __ b(&exit); | 1004   __ b(&exit); | 
| 1005 | 1005 | 
| 1006   // We got a fixed array in register r2. Iterate through that. | 1006   // We got a fixed array in register r2. Iterate through that. | 
| 1007   __ bind(&fixed_array); | 1007   __ bind(&fixed_array); | 
| 1008 | 1008 | 
| 1009   __ LoadSmiLiteral(r3, Smi::FromInt(1));  // Smi(1) indicates slow check | 1009   __ LoadSmiLiteral(r3, Smi::FromInt(1));  // Smi(1) indicates slow check | 
| 1010   __ Push(r3, r2);                         // Smi and array | 1010   __ Push(r3, r2);                         // Smi and array | 
| 1011   __ LoadP(r3, FieldMemOperand(r2, FixedArray::kLengthOffset)); | 1011   __ LoadP(r3, FieldMemOperand(r2, FixedArray::kLengthOffset)); | 
| 1012   __ Push(r3);  // Fixed array length (as smi). | 1012   __ Push(r3);  // Fixed array length (as smi). | 
| 1013   PrepareForBailoutForId(stmt->PrepareId(), BailoutState::NO_REGISTERS); | 1013   PrepareForBailoutForId(stmt->PrepareId(), BailoutState::NO_REGISTERS); | 
| 1014   __ LoadSmiLiteral(r2, Smi::FromInt(0)); | 1014   __ LoadSmiLiteral(r2, Smi::kZero); | 
| 1015   __ Push(r2);  // Initial index. | 1015   __ Push(r2);  // Initial index. | 
| 1016 | 1016 | 
| 1017   // Generate code for doing the condition check. | 1017   // Generate code for doing the condition check. | 
| 1018   __ bind(&loop); | 1018   __ bind(&loop); | 
| 1019   SetExpressionAsStatementPosition(stmt->each()); | 1019   SetExpressionAsStatementPosition(stmt->each()); | 
| 1020 | 1020 | 
| 1021   // Load the current count to r2, load the length to r3. | 1021   // Load the current count to r2, load the length to r3. | 
| 1022   __ LoadP(r2, MemOperand(sp, 0 * kPointerSize)); | 1022   __ LoadP(r2, MemOperand(sp, 0 * kPointerSize)); | 
| 1023   __ LoadP(r3, MemOperand(sp, 1 * kPointerSize)); | 1023   __ LoadP(r3, MemOperand(sp, 1 * kPointerSize)); | 
| 1024   __ CmpLogicalP(r2, r3);  // Compare to the array length. | 1024   __ CmpLogicalP(r2, r3);  // Compare to the array length. | 
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1889 #else | 1889 #else | 
| 1890       __ LoadRR(right, scratch2); | 1890       __ LoadRR(right, scratch2); | 
| 1891 #endif | 1891 #endif | 
| 1892       __ b(&done); | 1892       __ b(&done); | 
| 1893       // We need -0 if we were multiplying a negative number with 0 to get 0. | 1893       // We need -0 if we were multiplying a negative number with 0 to get 0. | 
| 1894       // We know one of them was zero. | 1894       // We know one of them was zero. | 
| 1895       __ bind(&mul_zero); | 1895       __ bind(&mul_zero); | 
| 1896       __ AddP(scratch2, right, left); | 1896       __ AddP(scratch2, right, left); | 
| 1897       __ CmpP(scratch2, Operand::Zero()); | 1897       __ CmpP(scratch2, Operand::Zero()); | 
| 1898       __ blt(&stub_call); | 1898       __ blt(&stub_call); | 
| 1899       __ LoadSmiLiteral(right, Smi::FromInt(0)); | 1899       __ LoadSmiLiteral(right, Smi::kZero); | 
| 1900       break; | 1900       break; | 
| 1901     } | 1901     } | 
| 1902     case Token::BIT_OR: | 1902     case Token::BIT_OR: | 
| 1903       __ OrP(right, left); | 1903       __ OrP(right, left); | 
| 1904       break; | 1904       break; | 
| 1905     case Token::BIT_AND: | 1905     case Token::BIT_AND: | 
| 1906       __ AndP(right, left); | 1906       __ AndP(right, left); | 
| 1907       break; | 1907       break; | 
| 1908     case Token::BIT_XOR: | 1908     case Token::BIT_XOR: | 
| 1909       __ XorP(right, left); | 1909       __ XorP(right, left); | 
| (...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2988   LhsKind assign_type = Property::GetAssignType(prop); | 2988   LhsKind assign_type = Property::GetAssignType(prop); | 
| 2989 | 2989 | 
| 2990   // Evaluate expression and get value. | 2990   // Evaluate expression and get value. | 
| 2991   if (assign_type == VARIABLE) { | 2991   if (assign_type == VARIABLE) { | 
| 2992     DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 2992     DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 
| 2993     AccumulatorValueContext context(this); | 2993     AccumulatorValueContext context(this); | 
| 2994     EmitVariableLoad(expr->expression()->AsVariableProxy()); | 2994     EmitVariableLoad(expr->expression()->AsVariableProxy()); | 
| 2995   } else { | 2995   } else { | 
| 2996     // Reserve space for result of postfix operation. | 2996     // Reserve space for result of postfix operation. | 
| 2997     if (expr->is_postfix() && !context()->IsEffect()) { | 2997     if (expr->is_postfix() && !context()->IsEffect()) { | 
| 2998       __ LoadSmiLiteral(ip, Smi::FromInt(0)); | 2998       __ LoadSmiLiteral(ip, Smi::kZero); | 
| 2999       PushOperand(ip); | 2999       PushOperand(ip); | 
| 3000     } | 3000     } | 
| 3001     switch (assign_type) { | 3001     switch (assign_type) { | 
| 3002       case NAMED_PROPERTY: { | 3002       case NAMED_PROPERTY: { | 
| 3003         // Put the object both on the stack and in the register. | 3003         // Put the object both on the stack and in the register. | 
| 3004         VisitForStackValue(prop->obj()); | 3004         VisitForStackValue(prop->obj()); | 
| 3005         __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 3005         __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 
| 3006         EmitNamedPropertyLoad(prop); | 3006         EmitNamedPropertyLoad(prop); | 
| 3007         break; | 3007         break; | 
| 3008       } | 3008       } | 
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3571   DCHECK(kOSRBranchInstruction == br_instr); | 3571   DCHECK(kOSRBranchInstruction == br_instr); | 
| 3572 | 3572 | 
| 3573   DCHECK(interrupt_address == | 3573   DCHECK(interrupt_address == | 
| 3574          isolate->builtins()->OnStackReplacement()->entry()); | 3574          isolate->builtins()->OnStackReplacement()->entry()); | 
| 3575   return ON_STACK_REPLACEMENT; | 3575   return ON_STACK_REPLACEMENT; | 
| 3576 } | 3576 } | 
| 3577 | 3577 | 
| 3578 }  // namespace internal | 3578 }  // namespace internal | 
| 3579 }  // namespace v8 | 3579 }  // namespace v8 | 
| 3580 #endif  // V8_TARGET_ARCH_S390 | 3580 #endif  // V8_TARGET_ARCH_S390 | 
| OLD | NEW | 
|---|