| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 5041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5052 UNREACHABLE(); | 5052 UNREACHABLE(); |
| 5053 break; | 5053 break; |
| 5054 } | 5054 } |
| 5055 } | 5055 } |
| 5056 } | 5056 } |
| 5057 | 5057 |
| 5058 | 5058 |
| 5059 void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) { | 5059 void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) { |
| 5060 Register elements = ToRegister(instr->elements()); | 5060 Register elements = ToRegister(instr->elements()); |
| 5061 DoubleRegister value = ToDoubleRegister(instr->value()); | 5061 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5062 Register store_base = ToRegister(instr->temp()); | 5062 Register store_base = no_reg; |
| 5063 int offset = 0; | 5063 int offset = 0; |
| 5064 | 5064 |
| 5065 if (instr->key()->IsConstantOperand()) { | 5065 if (instr->key()->IsConstantOperand()) { |
| 5066 int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 5066 int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
| 5067 if (constant_key & 0xf0000000) { | 5067 if (constant_key & 0xf0000000) { |
| 5068 Abort(kArrayIndexConstantValueTooBig); | 5068 Abort(kArrayIndexConstantValueTooBig); |
| 5069 } | 5069 } |
| 5070 offset = FixedDoubleArray::OffsetOfElementAt(constant_key + | 5070 offset = FixedDoubleArray::OffsetOfElementAt(constant_key + |
| 5071 instr->additional_index()); | 5071 instr->additional_index()); |
| 5072 store_base = elements; | 5072 store_base = elements; |
| 5073 } else { | 5073 } else { |
| 5074 store_base = ToRegister(instr->temp()); |
| 5074 Register key = ToRegister(instr->key()); | 5075 Register key = ToRegister(instr->key()); |
| 5075 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); | 5076 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); |
| 5076 CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged, | 5077 CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged, |
| 5077 instr->hydrogen()->elements_kind()); | 5078 instr->hydrogen()->elements_kind()); |
| 5078 offset = FixedDoubleArray::OffsetOfElementAt(instr->additional_index()); | 5079 offset = FixedDoubleArray::OffsetOfElementAt(instr->additional_index()); |
| 5079 } | 5080 } |
| 5080 | 5081 |
| 5081 if (instr->NeedsCanonicalization()) { | 5082 if (instr->NeedsCanonicalization()) { |
| 5082 DoubleRegister dbl_scratch = double_scratch(); | 5083 DoubleRegister dbl_scratch = double_scratch(); |
| 5083 __ Fmov(dbl_scratch, | 5084 __ Fmov(dbl_scratch, |
| 5084 FixedDoubleArray::canonical_not_the_hole_nan_as_double()); | 5085 FixedDoubleArray::canonical_not_the_hole_nan_as_double()); |
| 5085 __ Fmaxnm(dbl_scratch, dbl_scratch, value); | 5086 __ Fmaxnm(dbl_scratch, dbl_scratch, value); |
| 5086 __ Str(dbl_scratch, FieldMemOperand(store_base, offset)); | 5087 __ Str(dbl_scratch, FieldMemOperand(store_base, offset)); |
| 5087 } else { | 5088 } else { |
| 5088 __ Str(value, FieldMemOperand(store_base, offset)); | 5089 __ Str(value, FieldMemOperand(store_base, offset)); |
| 5089 } | 5090 } |
| 5090 } | 5091 } |
| 5091 | 5092 |
| 5092 | 5093 |
| 5093 void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) { | 5094 void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) { |
| 5094 Register value = ToRegister(instr->value()); | 5095 Register value = ToRegister(instr->value()); |
| 5095 Register elements = ToRegister(instr->elements()); | 5096 Register elements = ToRegister(instr->elements()); |
| 5096 Register store_base = ToRegister(instr->temp()); | 5097 Register scratch = no_reg; |
| 5098 Register store_base = no_reg; |
| 5097 Register key = no_reg; | 5099 Register key = no_reg; |
| 5098 int offset = 0; | 5100 int offset = 0; |
| 5099 | 5101 |
| 5102 if (!instr->key()->IsConstantOperand() || |
| 5103 instr->hydrogen()->NeedsWriteBarrier()) { |
| 5104 scratch = ToRegister(instr->temp()); |
| 5105 } |
| 5106 |
| 5100 if (instr->key()->IsConstantOperand()) { | 5107 if (instr->key()->IsConstantOperand()) { |
| 5101 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); | |
| 5102 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); | 5108 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); |
| 5103 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + | 5109 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + |
| 5104 instr->additional_index()); | 5110 instr->additional_index()); |
| 5105 store_base = elements; | 5111 store_base = elements; |
| 5106 } else { | 5112 } else { |
| 5113 store_base = scratch; |
| 5107 key = ToRegister(instr->key()); | 5114 key = ToRegister(instr->key()); |
| 5108 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); | 5115 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); |
| 5109 CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged, | 5116 CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged, |
| 5110 instr->hydrogen()->elements_kind()); | 5117 instr->hydrogen()->elements_kind()); |
| 5111 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); | 5118 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); |
| 5112 } | 5119 } |
| 5113 Representation representation = instr->hydrogen()->value()->representation(); | 5120 Representation representation = instr->hydrogen()->value()->representation(); |
| 5114 if (representation.IsInteger32()) { | 5121 if (representation.IsInteger32()) { |
| 5115 ASSERT(instr->hydrogen()->store_mode() == STORE_TO_INITIALIZED_ENTRY); | 5122 ASSERT(instr->hydrogen()->store_mode() == STORE_TO_INITIALIZED_ENTRY); |
| 5116 ASSERT(instr->hydrogen()->elements_kind() == FAST_SMI_ELEMENTS); | 5123 ASSERT(instr->hydrogen()->elements_kind() == FAST_SMI_ELEMENTS); |
| 5117 STATIC_ASSERT(kSmiValueSize == 32 && kSmiShift == 32 && kSmiTag == 0); | 5124 STATIC_ASSERT(kSmiValueSize == 32 && kSmiShift == 32 && kSmiTag == 0); |
| 5118 __ Store(value, UntagSmiFieldMemOperand(store_base, offset), | 5125 __ Store(value, UntagSmiFieldMemOperand(store_base, offset), |
| 5119 Representation::Integer32()); | 5126 Representation::Integer32()); |
| 5120 } else { | 5127 } else { |
| 5121 __ Store(value, FieldMemOperand(store_base, offset), representation); | 5128 __ Store(value, FieldMemOperand(store_base, offset), representation); |
| 5122 } | 5129 } |
| 5123 | 5130 |
| 5124 if (instr->hydrogen()->NeedsWriteBarrier()) { | 5131 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 5132 ASSERT(representation.IsTagged()); |
| 5133 // This assignment may cause element_addr to alias store_base. |
| 5134 Register element_addr = scratch; |
| 5125 SmiCheck check_needed = | 5135 SmiCheck check_needed = |
| 5126 instr->hydrogen()->value()->IsHeapObject() | 5136 instr->hydrogen()->value()->IsHeapObject() |
| 5127 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 5137 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 5128 // Compute address of modified element and store it into key register. | 5138 // Compute address of modified element and store it into key register. |
| 5129 __ Add(key, store_base, offset - kHeapObjectTag); | 5139 __ Add(element_addr, store_base, offset - kHeapObjectTag); |
| 5130 __ RecordWrite(elements, key, value, GetLinkRegisterState(), kSaveFPRegs, | 5140 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(), |
| 5131 EMIT_REMEMBERED_SET, check_needed); | 5141 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed); |
| 5132 } | 5142 } |
| 5133 } | 5143 } |
| 5134 | 5144 |
| 5135 | 5145 |
| 5136 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 5146 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 5137 ASSERT(ToRegister(instr->context()).is(cp)); | 5147 ASSERT(ToRegister(instr->context()).is(cp)); |
| 5138 ASSERT(ToRegister(instr->object()).Is(x2)); | 5148 ASSERT(ToRegister(instr->object()).Is(x2)); |
| 5139 ASSERT(ToRegister(instr->key()).Is(x1)); | 5149 ASSERT(ToRegister(instr->key()).Is(x1)); |
| 5140 ASSERT(ToRegister(instr->value()).Is(x0)); | 5150 ASSERT(ToRegister(instr->value()).Is(x0)); |
| 5141 | 5151 |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5801 __ Bind(&out_of_object); | 5811 __ Bind(&out_of_object); |
| 5802 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 5812 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 5803 // Index is equal to negated out of object property index plus 1. | 5813 // Index is equal to negated out of object property index plus 1. |
| 5804 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 5814 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
| 5805 __ Ldr(result, FieldMemOperand(result, | 5815 __ Ldr(result, FieldMemOperand(result, |
| 5806 FixedArray::kHeaderSize - kPointerSize)); | 5816 FixedArray::kHeaderSize - kPointerSize)); |
| 5807 __ Bind(&done); | 5817 __ Bind(&done); |
| 5808 } | 5818 } |
| 5809 | 5819 |
| 5810 } } // namespace v8::internal | 5820 } } // namespace v8::internal |
| OLD | NEW |