| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // NOLINT | 5 #include "vm/globals.h" // NOLINT |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
| (...skipping 2824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2835 | 2835 |
| 2836 void Assembler::LoadMultipleDFromOffset(DRegister first, | 2836 void Assembler::LoadMultipleDFromOffset(DRegister first, |
| 2837 intptr_t count, | 2837 intptr_t count, |
| 2838 Register base, | 2838 Register base, |
| 2839 int32_t offset) { | 2839 int32_t offset) { |
| 2840 ASSERT(base != IP); | 2840 ASSERT(base != IP); |
| 2841 AddImmediate(IP, base, offset); | 2841 AddImmediate(IP, base, offset); |
| 2842 vldmd(IA, IP, first, count); | 2842 vldmd(IA, IP, first, count); |
| 2843 } | 2843 } |
| 2844 | 2844 |
| 2845 |
| 2845 void Assembler::StoreMultipleDToOffset(DRegister first, | 2846 void Assembler::StoreMultipleDToOffset(DRegister first, |
| 2846 intptr_t count, | 2847 intptr_t count, |
| 2847 Register base, | 2848 Register base, |
| 2848 int32_t offset) { | 2849 int32_t offset) { |
| 2849 ASSERT(base != IP); | 2850 ASSERT(base != IP); |
| 2850 AddImmediate(IP, base, offset); | 2851 AddImmediate(IP, base, offset); |
| 2851 vstmd(IA, IP, first, count); | 2852 vstmd(IA, IP, first, count); |
| 2852 } | 2853 } |
| 2853 | 2854 |
| 2854 | 2855 |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3474 if (Address::CanHoldImmediateOffset(is_load, cid, offset)) { | 3475 if (Address::CanHoldImmediateOffset(is_load, cid, offset)) { |
| 3475 return Address(array, static_cast<int32_t>(offset)); | 3476 return Address(array, static_cast<int32_t>(offset)); |
| 3476 } else { | 3477 } else { |
| 3477 ASSERT(Address::CanHoldImmediateOffset(is_load, cid, offset - offset_base)); | 3478 ASSERT(Address::CanHoldImmediateOffset(is_load, cid, offset - offset_base)); |
| 3478 AddImmediate(temp, array, static_cast<int32_t>(offset_base)); | 3479 AddImmediate(temp, array, static_cast<int32_t>(offset_base)); |
| 3479 return Address(temp, static_cast<int32_t>(offset - offset_base)); | 3480 return Address(temp, static_cast<int32_t>(offset - offset_base)); |
| 3480 } | 3481 } |
| 3481 } | 3482 } |
| 3482 | 3483 |
| 3483 | 3484 |
| 3485 void Assembler::LoadElementAddressForIntIndex(Register address, |
| 3486 bool is_load, |
| 3487 bool is_external, |
| 3488 intptr_t cid, |
| 3489 intptr_t index_scale, |
| 3490 Register array, |
| 3491 intptr_t index) { |
| 3492 const int64_t offset_base = |
| 3493 (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag)); |
| 3494 const int64_t offset = offset_base + |
| 3495 static_cast<int64_t>(index) * index_scale; |
| 3496 ASSERT(Utils::IsInt(32, offset)); |
| 3497 AddImmediate(address, array, offset); |
| 3498 } |
| 3499 |
| 3500 |
| 3484 Address Assembler::ElementAddressForRegIndex(bool is_load, | 3501 Address Assembler::ElementAddressForRegIndex(bool is_load, |
| 3485 bool is_external, | 3502 bool is_external, |
| 3486 intptr_t cid, | 3503 intptr_t cid, |
| 3487 intptr_t index_scale, | 3504 intptr_t index_scale, |
| 3488 Register array, | 3505 Register array, |
| 3489 Register index) { | 3506 Register index) { |
| 3490 // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays. | 3507 // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays. |
| 3491 const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift; | 3508 const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift; |
| 3492 int32_t offset = | 3509 int32_t offset = |
| 3493 is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag); | 3510 is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3518 (!is_load && !Address::CanHoldStoreOffset(size, | 3535 (!is_load && !Address::CanHoldStoreOffset(size, |
| 3519 offset, | 3536 offset, |
| 3520 &offset_mask))) { | 3537 &offset_mask))) { |
| 3521 AddImmediate(base, offset & ~offset_mask); | 3538 AddImmediate(base, offset & ~offset_mask); |
| 3522 offset = offset & offset_mask; | 3539 offset = offset & offset_mask; |
| 3523 } | 3540 } |
| 3524 return Address(base, offset); | 3541 return Address(base, offset); |
| 3525 } | 3542 } |
| 3526 | 3543 |
| 3527 | 3544 |
| 3545 void Assembler::LoadElementAddressForRegIndex(Register address, |
| 3546 bool is_load, |
| 3547 bool is_external, |
| 3548 intptr_t cid, |
| 3549 intptr_t index_scale, |
| 3550 Register array, |
| 3551 Register index) { |
| 3552 // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays. |
| 3553 const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift; |
| 3554 int32_t offset = |
| 3555 is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag); |
| 3556 if (shift < 0) { |
| 3557 ASSERT(shift == -1); |
| 3558 add(address, array, Operand(index, ASR, 1)); |
| 3559 } else { |
| 3560 add(address, array, Operand(index, LSL, shift)); |
| 3561 } |
| 3562 if (offset != 0) { |
| 3563 AddImmediate(address, offset); |
| 3564 } |
| 3565 } |
| 3566 |
| 3567 |
| 3568 void Assembler::LoadHalfWordUnaligned(Register dst, |
| 3569 Register addr, |
| 3570 Register tmp) { |
| 3571 ASSERT(dst != addr); |
| 3572 ldrb(dst, Address(addr, 0)); |
| 3573 ldrsb(tmp, Address(addr, 1)); |
| 3574 orr(dst, dst, Operand(tmp, LSL, 8)); |
| 3575 } |
| 3576 |
| 3577 |
| 3578 void Assembler::LoadHalfWordUnsignedUnaligned(Register dst, |
| 3579 Register addr, |
| 3580 Register tmp) { |
| 3581 ASSERT(dst != addr); |
| 3582 ldrb(dst, Address(addr, 0)); |
| 3583 ldrb(tmp, Address(addr, 1)); |
| 3584 orr(dst, dst, Operand(tmp, LSL, 8)); |
| 3585 } |
| 3586 |
| 3587 |
| 3588 void Assembler::StoreHalfWordUnaligned(Register src, |
| 3589 Register addr, |
| 3590 Register tmp) { |
| 3591 strb(src, Address(addr, 0)); |
| 3592 Lsr(tmp, src, Operand(8)); |
| 3593 strb(tmp, Address(addr, 1)); |
| 3594 } |
| 3595 |
| 3596 |
| 3597 void Assembler::LoadWordUnaligned(Register dst, Register addr, Register tmp) { |
| 3598 ASSERT(dst != addr); |
| 3599 ldrb(dst, Address(addr, 0)); |
| 3600 ldrb(tmp, Address(addr, 1)); |
| 3601 orr(dst, dst, Operand(tmp, LSL, 8)); |
| 3602 ldrb(tmp, Address(addr, 2)); |
| 3603 orr(dst, dst, Operand(tmp, LSL, 16)); |
| 3604 ldrb(tmp, Address(addr, 3)); |
| 3605 orr(dst, dst, Operand(tmp, LSL, 24)); |
| 3606 } |
| 3607 |
| 3608 |
| 3609 void Assembler::StoreWordUnaligned(Register src, Register addr, Register tmp) { |
| 3610 strb(src, Address(addr, 0)); |
| 3611 Lsr(tmp, src, Operand(8)); |
| 3612 strb(tmp, Address(addr, 1)); |
| 3613 Lsr(tmp, src, Operand(16)); |
| 3614 strb(tmp, Address(addr, 2)); |
| 3615 Lsr(tmp, src, Operand(24)); |
| 3616 strb(tmp, Address(addr, 3)); |
| 3617 } |
| 3618 |
| 3619 |
| 3528 static const char* cpu_reg_names[kNumberOfCpuRegisters] = { | 3620 static const char* cpu_reg_names[kNumberOfCpuRegisters] = { |
| 3529 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", | 3621 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", |
| 3530 "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc", | 3622 "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc", |
| 3531 }; | 3623 }; |
| 3532 | 3624 |
| 3533 | 3625 |
| 3534 const char* Assembler::RegisterName(Register reg) { | 3626 const char* Assembler::RegisterName(Register reg) { |
| 3535 ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters)); | 3627 ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters)); |
| 3536 return cpu_reg_names[reg]; | 3628 return cpu_reg_names[reg]; |
| 3537 } | 3629 } |
| 3538 | 3630 |
| 3539 | 3631 |
| 3540 static const char* fpu_reg_names[kNumberOfFpuRegisters] = { | 3632 static const char* fpu_reg_names[kNumberOfFpuRegisters] = { |
| 3541 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", | 3633 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", |
| 3542 #if defined(VFPv3_D32) | 3634 #if defined(VFPv3_D32) |
| 3543 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", | 3635 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", |
| 3544 #endif | 3636 #endif |
| 3545 }; | 3637 }; |
| 3546 | 3638 |
| 3547 | 3639 |
| 3548 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3640 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
| 3549 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); | 3641 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); |
| 3550 return fpu_reg_names[reg]; | 3642 return fpu_reg_names[reg]; |
| 3551 } | 3643 } |
| 3552 | 3644 |
| 3553 } // namespace dart | 3645 } // namespace dart |
| 3554 | 3646 |
| 3555 #endif // defined TARGET_ARCH_ARM | 3647 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |