| 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 | 
|---|