Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "arm64/lithium-codegen-arm64.h" | 7 #include "arm64/lithium-codegen-arm64.h" |
| 8 #include "arm64/lithium-gap-resolver-arm64.h" | 8 #include "arm64/lithium-gap-resolver-arm64.h" |
| 9 #include "code-stubs.h" | 9 #include "code-stubs.h" |
| 10 #include "stub-cache.h" | 10 #include "stub-cache.h" |
| (...skipping 3409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3420 case FAST_SMI_ELEMENTS: | 3420 case FAST_SMI_ELEMENTS: |
| 3421 case DICTIONARY_ELEMENTS: | 3421 case DICTIONARY_ELEMENTS: |
| 3422 case SLOPPY_ARGUMENTS_ELEMENTS: | 3422 case SLOPPY_ARGUMENTS_ELEMENTS: |
| 3423 UNREACHABLE(); | 3423 UNREACHABLE(); |
| 3424 break; | 3424 break; |
| 3425 } | 3425 } |
| 3426 } | 3426 } |
| 3427 } | 3427 } |
| 3428 | 3428 |
| 3429 | 3429 |
| 3430 void LCodeGen::CalcKeyedArrayBaseRegister(Register base, | 3430 MemOperand LCodeGen::PrepareKeyedArrayOperand(Register base, |
| 3431 Register elements, | 3431 Register elements, |
| 3432 Register key, | 3432 Register key, |
| 3433 bool key_is_tagged, | 3433 bool key_is_tagged, |
| 3434 ElementsKind elements_kind) { | 3434 ElementsKind elements_kind, |
| 3435 Representation representation, | |
| 3436 int additional_index) { | |
| 3437 STATIC_ASSERT((kSmiValueSize == 32) && (kSmiShift == 32) && (kSmiTag == 0)); | |
| 3435 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 3438 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
| 3436 | 3439 |
| 3440 // Read or write only the most-significant 32 bits in the case of fast smi | |
| 3441 // arrays with integer inputs/outputs. | |
| 3442 bool int32_and_fast_smi = representation.IsInteger32() && | |
|
ulan
2014/05/05 08:21:21
representation.IsInteger32() should imply (instr->
m.m.capewell
2014/05/06 13:20:45
Done.
| |
| 3443 (elements_kind == FAST_SMI_ELEMENTS); | |
| 3444 | |
| 3437 // Even though the HLoad/StoreKeyed instructions force the input | 3445 // Even though the HLoad/StoreKeyed instructions force the input |
| 3438 // representation for the key to be an integer, the input gets replaced during | 3446 // representation for the key to be an integer, the input gets replaced during |
| 3439 // bounds check elimination with the index argument to the bounds check, which | 3447 // bounds check elimination with the index argument to the bounds check, which |
| 3440 // can be tagged, so that case must be handled here, too. | 3448 // can be tagged, so that case must be handled here, too. |
| 3441 if (key_is_tagged) { | 3449 if (key_is_tagged) { |
| 3442 __ Add(base, elements, Operand::UntagSmiAndScale(key, element_size_shift)); | 3450 __ Add(base, elements, Operand::UntagSmiAndScale(key, element_size_shift)); |
| 3451 if (int32_and_fast_smi) { | |
| 3452 return UntagSmiFieldMemOperand(base, additional_index); | |
| 3453 } else { | |
| 3454 return FieldMemOperand(base, additional_index); | |
| 3455 } | |
| 3443 } else { | 3456 } else { |
| 3444 // Sign extend key because it could be a 32-bit negative value or contain | 3457 // Sign extend key because it could be a 32-bit negative value or contain |
| 3445 // garbage in the top 32-bits. The address computation happens in 64-bit. | 3458 // garbage in the top 32-bits. The address computation happens in 64-bit. |
| 3446 ASSERT((element_size_shift >= 0) && (element_size_shift <= 4)); | 3459 ASSERT((element_size_shift >= 0) && (element_size_shift <= 4)); |
| 3447 __ Add(base, elements, Operand(key, SXTW, element_size_shift)); | 3460 if (int32_and_fast_smi) { |
| 3461 __ Add(base, elements, Operand(key, SXTW, element_size_shift)); | |
| 3462 return UntagSmiFieldMemOperand(base, additional_index); | |
| 3463 } else { | |
| 3464 __ Add(base, elements, additional_index - kHeapObjectTag); | |
| 3465 return MemOperand(base, key, SXTW, element_size_shift); | |
| 3466 } | |
| 3448 } | 3467 } |
| 3449 } | 3468 } |
| 3450 | 3469 |
| 3451 | 3470 |
| 3452 void LCodeGen::DoLoadKeyedFixedDouble(LLoadKeyedFixedDouble* instr) { | 3471 void LCodeGen::DoLoadKeyedFixedDouble(LLoadKeyedFixedDouble* instr) { |
| 3453 Register elements = ToRegister(instr->elements()); | 3472 Register elements = ToRegister(instr->elements()); |
| 3454 DoubleRegister result = ToDoubleRegister(instr->result()); | 3473 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3455 Register load_base; | 3474 MemOperand mem_op; |
| 3456 int offset = 0; | |
| 3457 | 3475 |
| 3458 if (instr->key()->IsConstantOperand()) { | 3476 if (instr->key()->IsConstantOperand()) { |
| 3459 ASSERT(instr->hydrogen()->RequiresHoleCheck() || | 3477 ASSERT(instr->hydrogen()->RequiresHoleCheck() || |
| 3460 (instr->temp() == NULL)); | 3478 (instr->temp() == NULL)); |
| 3461 | 3479 |
| 3462 int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 3480 int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
| 3463 if (constant_key & 0xf0000000) { | 3481 if (constant_key & 0xf0000000) { |
| 3464 Abort(kArrayIndexConstantValueTooBig); | 3482 Abort(kArrayIndexConstantValueTooBig); |
| 3465 } | 3483 } |
| 3466 offset = FixedDoubleArray::OffsetOfElementAt(constant_key + | 3484 int offset = FixedDoubleArray::OffsetOfElementAt(constant_key + |
| 3467 instr->additional_index()); | 3485 instr->additional_index()); |
| 3468 load_base = elements; | 3486 mem_op = FieldMemOperand(elements, offset); |
| 3469 } else { | 3487 } else { |
| 3470 load_base = ToRegister(instr->temp()); | 3488 Register load_base = ToRegister(instr->temp()); |
| 3471 Register key = ToRegister(instr->key()); | 3489 Register key = ToRegister(instr->key()); |
| 3472 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); | 3490 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); |
| 3473 CalcKeyedArrayBaseRegister(load_base, elements, key, key_is_tagged, | 3491 int offset = FixedDoubleArray::OffsetOfElementAt(instr->additional_index()); |
| 3474 instr->hydrogen()->elements_kind()); | 3492 mem_op = PrepareKeyedArrayOperand(load_base, elements, key, key_is_tagged, |
| 3475 offset = FixedDoubleArray::OffsetOfElementAt(instr->additional_index()); | 3493 instr->hydrogen()->elements_kind(), |
| 3494 instr->hydrogen()->representation(), | |
| 3495 offset); | |
| 3476 } | 3496 } |
| 3477 __ Ldr(result, FieldMemOperand(load_base, offset)); | 3497 |
| 3498 __ Ldr(result, mem_op); | |
| 3478 | 3499 |
| 3479 if (instr->hydrogen()->RequiresHoleCheck()) { | 3500 if (instr->hydrogen()->RequiresHoleCheck()) { |
| 3480 Register scratch = ToRegister(instr->temp()); | 3501 Register scratch = ToRegister(instr->temp()); |
| 3481 | 3502 // Detect the hole NaN by adding one to the integer representation of the |
| 3482 // TODO(all): Is it faster to reload this value to an integer register, or | 3503 // result, and checking for overflow. |
| 3483 // move from fp to integer? | 3504 STATIC_ASSERT(kHoleNanInt64 == 0x7fffffffffffffff); |
| 3484 __ Fmov(scratch, result); | 3505 __ Ldr(scratch, mem_op); |
| 3485 __ Cmp(scratch, kHoleNanInt64); | 3506 __ Cmn(scratch, 1); |
| 3486 DeoptimizeIf(eq, instr->environment()); | 3507 DeoptimizeIf(vs, instr->environment()); |
| 3487 } | 3508 } |
| 3488 } | 3509 } |
| 3489 | 3510 |
| 3490 | 3511 |
| 3491 void LCodeGen::DoLoadKeyedFixed(LLoadKeyedFixed* instr) { | 3512 void LCodeGen::DoLoadKeyedFixed(LLoadKeyedFixed* instr) { |
| 3492 Register elements = ToRegister(instr->elements()); | 3513 Register elements = ToRegister(instr->elements()); |
| 3493 Register result = ToRegister(instr->result()); | 3514 Register result = ToRegister(instr->result()); |
| 3494 Register load_base; | 3515 MemOperand mem_op; |
| 3495 int offset = 0; | |
| 3496 | 3516 |
| 3517 Representation representation = instr->hydrogen()->representation(); | |
| 3497 if (instr->key()->IsConstantOperand()) { | 3518 if (instr->key()->IsConstantOperand()) { |
| 3498 ASSERT(instr->temp() == NULL); | 3519 ASSERT(instr->temp() == NULL); |
| 3499 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); | 3520 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); |
| 3500 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + | 3521 int offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + |
| 3501 instr->additional_index()); | 3522 instr->additional_index()); |
| 3502 load_base = elements; | 3523 if (representation.IsInteger32() && |
|
ulan
2014/05/05 08:21:21
representation.IsInteger32() should imply (instr->
m.m.capewell
2014/05/06 13:20:45
Done.
| |
| 3524 (instr->hydrogen()->elements_kind() == FAST_SMI_ELEMENTS)) { | |
| 3525 STATIC_ASSERT((kSmiValueSize == 32) && (kSmiShift == 32) && | |
| 3526 (kSmiTag == 0)); | |
| 3527 mem_op = UntagSmiFieldMemOperand(elements, offset); | |
| 3528 } else { | |
| 3529 mem_op = FieldMemOperand(elements, offset); | |
| 3530 } | |
| 3503 } else { | 3531 } else { |
| 3504 load_base = ToRegister(instr->temp()); | 3532 Register load_base = ToRegister(instr->temp()); |
| 3505 Register key = ToRegister(instr->key()); | 3533 Register key = ToRegister(instr->key()); |
| 3506 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); | 3534 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); |
| 3507 CalcKeyedArrayBaseRegister(load_base, elements, key, key_is_tagged, | 3535 int offset = FixedArray::OffsetOfElementAt(instr->additional_index()); |
| 3508 instr->hydrogen()->elements_kind()); | 3536 |
| 3509 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); | 3537 mem_op = PrepareKeyedArrayOperand(load_base, elements, key, key_is_tagged, |
| 3538 instr->hydrogen()->elements_kind(), | |
| 3539 representation, offset); | |
| 3510 } | 3540 } |
| 3511 Representation representation = instr->hydrogen()->representation(); | |
| 3512 | 3541 |
| 3513 if (representation.IsInteger32() && | 3542 __ Load(result, mem_op, representation); |
| 3514 instr->hydrogen()->elements_kind() == FAST_SMI_ELEMENTS) { | |
| 3515 STATIC_ASSERT(kSmiValueSize == 32 && kSmiShift == 32 && kSmiTag == 0); | |
| 3516 __ Load(result, UntagSmiFieldMemOperand(load_base, offset), | |
| 3517 Representation::Integer32()); | |
| 3518 } else { | |
| 3519 __ Load(result, FieldMemOperand(load_base, offset), | |
| 3520 representation); | |
| 3521 } | |
| 3522 | 3543 |
| 3523 if (instr->hydrogen()->RequiresHoleCheck()) { | 3544 if (instr->hydrogen()->RequiresHoleCheck()) { |
| 3524 if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) { | 3545 if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) { |
| 3525 DeoptimizeIfNotSmi(result, instr->environment()); | 3546 DeoptimizeIfNotSmi(result, instr->environment()); |
| 3526 } else { | 3547 } else { |
| 3527 DeoptimizeIfRoot(result, Heap::kTheHoleValueRootIndex, | 3548 DeoptimizeIfRoot(result, Heap::kTheHoleValueRootIndex, |
| 3528 instr->environment()); | 3549 instr->environment()); |
| 3529 } | 3550 } |
| 3530 } | 3551 } |
| 3531 } | 3552 } |
| (...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5107 UNREACHABLE(); | 5128 UNREACHABLE(); |
| 5108 break; | 5129 break; |
| 5109 } | 5130 } |
| 5110 } | 5131 } |
| 5111 } | 5132 } |
| 5112 | 5133 |
| 5113 | 5134 |
| 5114 void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) { | 5135 void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) { |
| 5115 Register elements = ToRegister(instr->elements()); | 5136 Register elements = ToRegister(instr->elements()); |
| 5116 DoubleRegister value = ToDoubleRegister(instr->value()); | 5137 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5117 Register store_base = no_reg; | 5138 MemOperand mem_op; |
| 5118 int offset = 0; | |
| 5119 | 5139 |
| 5120 if (instr->key()->IsConstantOperand()) { | 5140 if (instr->key()->IsConstantOperand()) { |
| 5121 int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); | 5141 int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
| 5122 if (constant_key & 0xf0000000) { | 5142 if (constant_key & 0xf0000000) { |
| 5123 Abort(kArrayIndexConstantValueTooBig); | 5143 Abort(kArrayIndexConstantValueTooBig); |
| 5124 } | 5144 } |
| 5125 offset = FixedDoubleArray::OffsetOfElementAt(constant_key + | 5145 int offset = FixedDoubleArray::OffsetOfElementAt(constant_key + |
| 5126 instr->additional_index()); | 5146 instr->additional_index()); |
| 5127 store_base = elements; | 5147 mem_op = FieldMemOperand(elements, offset); |
| 5128 } else { | 5148 } else { |
| 5129 store_base = ToRegister(instr->temp()); | 5149 Register store_base = ToRegister(instr->temp()); |
| 5130 Register key = ToRegister(instr->key()); | 5150 Register key = ToRegister(instr->key()); |
| 5131 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); | 5151 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); |
| 5132 CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged, | 5152 int offset = FixedDoubleArray::OffsetOfElementAt(instr->additional_index()); |
| 5133 instr->hydrogen()->elements_kind()); | 5153 mem_op = PrepareKeyedArrayOperand(store_base, elements, key, key_is_tagged, |
| 5134 offset = FixedDoubleArray::OffsetOfElementAt(instr->additional_index()); | 5154 instr->hydrogen()->elements_kind(), |
| 5155 instr->hydrogen()->representation(), | |
| 5156 offset); | |
| 5135 } | 5157 } |
| 5136 | 5158 |
| 5137 if (instr->NeedsCanonicalization()) { | 5159 if (instr->NeedsCanonicalization()) { |
| 5138 DoubleRegister dbl_scratch = double_scratch(); | 5160 DoubleRegister dbl_scratch = double_scratch(); |
| 5139 __ Fmov(dbl_scratch, | 5161 __ Fmov(dbl_scratch, |
| 5140 FixedDoubleArray::canonical_not_the_hole_nan_as_double()); | 5162 FixedDoubleArray::canonical_not_the_hole_nan_as_double()); |
| 5141 __ Fmaxnm(dbl_scratch, dbl_scratch, value); | 5163 __ Fmaxnm(dbl_scratch, dbl_scratch, value); |
| 5142 __ Str(dbl_scratch, FieldMemOperand(store_base, offset)); | 5164 __ Str(dbl_scratch, mem_op); |
| 5143 } else { | 5165 } else { |
| 5144 __ Str(value, FieldMemOperand(store_base, offset)); | 5166 __ Str(value, mem_op); |
| 5145 } | 5167 } |
| 5146 } | 5168 } |
| 5147 | 5169 |
| 5148 | 5170 |
| 5149 void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) { | 5171 void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) { |
| 5150 Register value = ToRegister(instr->value()); | 5172 Register value = ToRegister(instr->value()); |
| 5151 Register elements = ToRegister(instr->elements()); | 5173 Register elements = ToRegister(instr->elements()); |
| 5152 Register scratch = no_reg; | 5174 Register scratch = no_reg; |
| 5153 Register store_base = no_reg; | 5175 Register store_base = no_reg; |
| 5154 Register key = no_reg; | 5176 Register key = no_reg; |
| 5155 int offset = 0; | 5177 MemOperand mem_op; |
| 5156 | 5178 |
| 5157 if (!instr->key()->IsConstantOperand() || | 5179 if (!instr->key()->IsConstantOperand() || |
| 5158 instr->hydrogen()->NeedsWriteBarrier()) { | 5180 instr->hydrogen()->NeedsWriteBarrier()) { |
| 5159 scratch = ToRegister(instr->temp()); | 5181 scratch = ToRegister(instr->temp()); |
| 5160 } | 5182 } |
| 5161 | 5183 |
| 5184 Representation representation = instr->hydrogen()->value()->representation(); | |
| 5162 if (instr->key()->IsConstantOperand()) { | 5185 if (instr->key()->IsConstantOperand()) { |
| 5163 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); | 5186 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); |
| 5164 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + | 5187 int offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + |
| 5165 instr->additional_index()); | 5188 instr->additional_index()); |
| 5166 store_base = elements; | 5189 store_base = elements; |
| 5190 if (representation.IsInteger32() && | |
| 5191 (instr->hydrogen()->elements_kind() == FAST_SMI_ELEMENTS)) { | |
|
ulan
2014/05/05 08:21:21
representation.IsInteger32() should imply (instr->
m.m.capewell
2014/05/06 13:20:45
Done.
| |
| 5192 STATIC_ASSERT((kSmiValueSize == 32) && (kSmiShift == 32) && | |
| 5193 (kSmiTag == 0)); | |
| 5194 mem_op = UntagSmiFieldMemOperand(store_base, offset); | |
| 5195 } else { | |
| 5196 mem_op = FieldMemOperand(store_base, offset); | |
| 5197 } | |
| 5167 } else { | 5198 } else { |
| 5168 store_base = scratch; | 5199 store_base = scratch; |
| 5169 key = ToRegister(instr->key()); | 5200 key = ToRegister(instr->key()); |
| 5170 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); | 5201 bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi(); |
| 5171 CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged, | 5202 int offset = FixedArray::OffsetOfElementAt(instr->additional_index()); |
| 5172 instr->hydrogen()->elements_kind()); | 5203 |
| 5173 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); | 5204 mem_op = PrepareKeyedArrayOperand(store_base, elements, key, key_is_tagged, |
| 5205 instr->hydrogen()->elements_kind(), | |
| 5206 representation, offset); | |
| 5174 } | 5207 } |
| 5175 Representation representation = instr->hydrogen()->value()->representation(); | 5208 |
| 5176 if (representation.IsInteger32()) { | 5209 __ Store(value, mem_op, representation); |
| 5177 ASSERT(instr->hydrogen()->store_mode() == STORE_TO_INITIALIZED_ENTRY); | |
| 5178 ASSERT(instr->hydrogen()->elements_kind() == FAST_SMI_ELEMENTS); | |
|
ulan
2014/05/05 08:21:21
Can we keep these two asserts?
m.m.capewell
2014/05/06 13:20:45
Done.
| |
| 5179 STATIC_ASSERT(kSmiValueSize == 32 && kSmiShift == 32 && kSmiTag == 0); | |
| 5180 __ Store(value, UntagSmiFieldMemOperand(store_base, offset), | |
| 5181 Representation::Integer32()); | |
| 5182 } else { | |
| 5183 __ Store(value, FieldMemOperand(store_base, offset), representation); | |
| 5184 } | |
| 5185 | 5210 |
| 5186 if (instr->hydrogen()->NeedsWriteBarrier()) { | 5211 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 5187 ASSERT(representation.IsTagged()); | 5212 ASSERT(representation.IsTagged()); |
| 5188 // This assignment may cause element_addr to alias store_base. | 5213 // This assignment may cause element_addr to alias store_base. |
| 5189 Register element_addr = scratch; | 5214 Register element_addr = scratch; |
| 5190 SmiCheck check_needed = | 5215 SmiCheck check_needed = |
| 5191 instr->hydrogen()->value()->IsHeapObject() | 5216 instr->hydrogen()->value()->IsHeapObject() |
| 5192 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 5217 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 5193 // Compute address of modified element and store it into key register. | 5218 // Compute address of modified element and store it into key register. |
| 5194 __ Add(element_addr, store_base, offset - kHeapObjectTag); | 5219 __ Add(element_addr, store_base, mem_op.OffsetAsOperand()); |
|
ulan
2014/05/05 08:21:21
Using mem_op.base() instead of store_base would be
m.m.capewell
2014/05/06 13:20:45
Done.
| |
| 5195 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(), | 5220 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(), |
| 5196 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed); | 5221 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed); |
| 5197 } | 5222 } |
| 5198 } | 5223 } |
| 5199 | 5224 |
| 5200 | 5225 |
| 5201 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 5226 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 5202 ASSERT(ToRegister(instr->context()).is(cp)); | 5227 ASSERT(ToRegister(instr->context()).is(cp)); |
| 5203 ASSERT(ToRegister(instr->object()).Is(x2)); | 5228 ASSERT(ToRegister(instr->object()).Is(x2)); |
| 5204 ASSERT(ToRegister(instr->key()).Is(x1)); | 5229 ASSERT(ToRegister(instr->key()).Is(x1)); |
| (...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5911 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 5936 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 5912 // Index is equal to negated out of object property index plus 1. | 5937 // Index is equal to negated out of object property index plus 1. |
| 5913 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 5938 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
| 5914 __ Ldr(result, FieldMemOperand(result, | 5939 __ Ldr(result, FieldMemOperand(result, |
| 5915 FixedArray::kHeaderSize - kPointerSize)); | 5940 FixedArray::kHeaderSize - kPointerSize)); |
| 5916 __ Bind(deferred->exit()); | 5941 __ Bind(deferred->exit()); |
| 5917 __ Bind(&done); | 5942 __ Bind(&done); |
| 5918 } | 5943 } |
| 5919 | 5944 |
| 5920 } } // namespace v8::internal | 5945 } } // namespace v8::internal |
| OLD | NEW |