Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: runtime/vm/assembler_arm.cc

Issue 2452453002: Support unaligned integer loads on ARM and MIPS. (Closed)
Patch Set: review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/assembler_arm.h ('k') | runtime/vm/assembler_arm64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.h ('k') | runtime/vm/assembler_arm64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698