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

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

Issue 1407393006: Make arm assembler explicitly take both registers for load/store-pair. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 months 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_arm_test.cc » ('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 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 void Assembler::ldrsb(Register rd, Address ad, Condition cond) { 486 void Assembler::ldrsb(Register rd, Address ad, Condition cond) {
487 EmitMemOpAddressMode3(cond, L | B7 | B6 | B4, rd, ad); 487 EmitMemOpAddressMode3(cond, L | B7 | B6 | B4, rd, ad);
488 } 488 }
489 489
490 490
491 void Assembler::ldrsh(Register rd, Address ad, Condition cond) { 491 void Assembler::ldrsh(Register rd, Address ad, Condition cond) {
492 EmitMemOpAddressMode3(cond, L | B7 | B6 | H | B4, rd, ad); 492 EmitMemOpAddressMode3(cond, L | B7 | B6 | H | B4, rd, ad);
493 } 493 }
494 494
495 495
496 void Assembler::ldrd(Register rd, Register rn, int32_t offset, Condition cond) { 496 void Assembler::ldrd(Register rd, Register rd2, Register rn, int32_t offset,
497 Condition cond) {
497 ASSERT((rd % 2) == 0); 498 ASSERT((rd % 2) == 0);
499 ASSERT(rd2 == rd + 1);
498 if (TargetCPUFeatures::arm_version() == ARMv5TE) { 500 if (TargetCPUFeatures::arm_version() == ARMv5TE) {
499 const Register rd2 = static_cast<Register>(static_cast<int32_t>(rd) + 1);
500 ldr(rd, Address(rn, offset), cond); 501 ldr(rd, Address(rn, offset), cond);
501 ldr(rd2, Address(rn, offset + kWordSize), cond); 502 ldr(rd2, Address(rn, offset + kWordSize), cond);
502 } else { 503 } else {
503 EmitMemOpAddressMode3(cond, B7 | B6 | B4, rd, Address(rn, offset)); 504 EmitMemOpAddressMode3(cond, B7 | B6 | B4, rd, Address(rn, offset));
504 } 505 }
505 } 506 }
506 507
507 508
508 void Assembler::strd(Register rd, Register rn, int32_t offset, Condition cond) { 509 void Assembler::strd(Register rd, Register rd2, Register rn, int32_t offset,
510 Condition cond) {
509 ASSERT((rd % 2) == 0); 511 ASSERT((rd % 2) == 0);
512 ASSERT(rd2 == rd + 1);
510 if (TargetCPUFeatures::arm_version() == ARMv5TE) { 513 if (TargetCPUFeatures::arm_version() == ARMv5TE) {
511 const Register rd2 = static_cast<Register>(static_cast<int32_t>(rd) + 1);
512 str(rd, Address(rn, offset), cond); 514 str(rd, Address(rn, offset), cond);
513 str(rd2, Address(rn, offset + kWordSize), cond); 515 str(rd2, Address(rn, offset + kWordSize), cond);
514 } else { 516 } else {
515 EmitMemOpAddressMode3(cond, B7 | B6 | B5 | B4, rd, Address(rn, offset)); 517 EmitMemOpAddressMode3(cond, B7 | B6 | B5 | B4, rd, Address(rn, offset));
516 } 518 }
517 } 519 }
518 520
519 521
520 void Assembler::ldm(BlockAddressMode am, Register base, RegList regs, 522 void Assembler::ldm(BlockAddressMode am, Register base, RegList regs,
521 Condition cond) { 523 Condition cond) {
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1700 str(value, Address(base, offset), cond); 1702 str(value, Address(base, offset), cond);
1701 } 1703 }
1702 1704
1703 1705
1704 void Assembler::WriteShadowedFieldPair(Register base, 1706 void Assembler::WriteShadowedFieldPair(Register base,
1705 intptr_t offset, 1707 intptr_t offset,
1706 Register value_even, 1708 Register value_even,
1707 Register value_odd, 1709 Register value_odd,
1708 Condition cond) { 1710 Condition cond) {
1709 ASSERT(value_odd == value_even + 1); 1711 ASSERT(value_odd == value_even + 1);
1712 ASSERT(value_even % 2 == 0);
1710 if (VerifiedMemory::enabled()) { 1713 if (VerifiedMemory::enabled()) {
1711 ASSERT(base != value_even); 1714 ASSERT(base != value_even);
1712 ASSERT(base != value_odd); 1715 ASSERT(base != value_odd);
1713 Operand shadow(GetVerifiedMemoryShadow()); 1716 Operand shadow(GetVerifiedMemoryShadow());
1714 add(base, base, shadow, cond); 1717 add(base, base, shadow, cond);
1715 strd(value_even, base, offset, cond); 1718 strd(value_even, value_odd, base, offset, cond);
1716 sub(base, base, shadow, cond); 1719 sub(base, base, shadow, cond);
1717 } 1720 }
1718 strd(value_even, base, offset, cond); 1721 strd(value_even, value_odd, base, offset, cond);
1719 } 1722 }
1720 1723
1721 1724
1722 Register UseRegister(Register reg, RegList* used) { 1725 Register UseRegister(Register reg, RegList* used) {
1723 ASSERT(reg != SP); 1726 ASSERT(reg != SP);
1724 ASSERT(reg != PC); 1727 ASSERT(reg != PC);
1725 ASSERT((*used & (1 << reg)) == 0); 1728 ASSERT((*used & (1 << reg)) == 0);
1726 *used |= (1 << reg); 1729 *used |= (1 << reg);
1727 return reg; 1730 return reg;
1728 } 1731 }
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after
2824 vmovdrr(dd, IP, scratch, cond); 2827 vmovdrr(dd, IP, scratch, cond);
2825 } 2828 }
2826 } 2829 }
2827 2830
2828 2831
2829 void Assembler::LoadFromOffset(OperandSize size, 2832 void Assembler::LoadFromOffset(OperandSize size,
2830 Register reg, 2833 Register reg,
2831 Register base, 2834 Register base,
2832 int32_t offset, 2835 int32_t offset,
2833 Condition cond) { 2836 Condition cond) {
2837 ASSERT(size != kWordPair);
2834 int32_t offset_mask = 0; 2838 int32_t offset_mask = 0;
2835 if (!Address::CanHoldLoadOffset(size, offset, &offset_mask)) { 2839 if (!Address::CanHoldLoadOffset(size, offset, &offset_mask)) {
2836 ASSERT(base != IP); 2840 ASSERT(base != IP);
2837 AddImmediate(IP, base, offset & ~offset_mask, cond); 2841 AddImmediate(IP, base, offset & ~offset_mask, cond);
2838 base = IP; 2842 base = IP;
2839 offset = offset & offset_mask; 2843 offset = offset & offset_mask;
2840 } 2844 }
2841 switch (size) { 2845 switch (size) {
2842 case kByte: 2846 case kByte:
2843 ldrsb(reg, Address(base, offset), cond); 2847 ldrsb(reg, Address(base, offset), cond);
2844 break; 2848 break;
2845 case kUnsignedByte: 2849 case kUnsignedByte:
2846 ldrb(reg, Address(base, offset), cond); 2850 ldrb(reg, Address(base, offset), cond);
2847 break; 2851 break;
2848 case kHalfword: 2852 case kHalfword:
2849 ldrsh(reg, Address(base, offset), cond); 2853 ldrsh(reg, Address(base, offset), cond);
2850 break; 2854 break;
2851 case kUnsignedHalfword: 2855 case kUnsignedHalfword:
2852 ldrh(reg, Address(base, offset), cond); 2856 ldrh(reg, Address(base, offset), cond);
2853 break; 2857 break;
2854 case kWord: 2858 case kWord:
2855 ldr(reg, Address(base, offset), cond); 2859 ldr(reg, Address(base, offset), cond);
2856 break; 2860 break;
2857 case kWordPair:
2858 ldrd(reg, base, offset, cond);
2859 break;
2860 default: 2861 default:
2861 UNREACHABLE(); 2862 UNREACHABLE();
2862 } 2863 }
2863 } 2864 }
2864 2865
2865 2866
2866 void Assembler::StoreToOffset(OperandSize size, 2867 void Assembler::StoreToOffset(OperandSize size,
2867 Register reg, 2868 Register reg,
2868 Register base, 2869 Register base,
2869 int32_t offset, 2870 int32_t offset,
2870 Condition cond) { 2871 Condition cond) {
2872 ASSERT(size != kWordPair);
2871 int32_t offset_mask = 0; 2873 int32_t offset_mask = 0;
2872 if (!Address::CanHoldStoreOffset(size, offset, &offset_mask)) { 2874 if (!Address::CanHoldStoreOffset(size, offset, &offset_mask)) {
2873 ASSERT(reg != IP); 2875 ASSERT(reg != IP);
2874 ASSERT(base != IP); 2876 ASSERT(base != IP);
2875 AddImmediate(IP, base, offset & ~offset_mask, cond); 2877 AddImmediate(IP, base, offset & ~offset_mask, cond);
2876 base = IP; 2878 base = IP;
2877 offset = offset & offset_mask; 2879 offset = offset & offset_mask;
2878 } 2880 }
2879 switch (size) { 2881 switch (size) {
2880 case kByte: 2882 case kByte:
2881 strb(reg, Address(base, offset), cond); 2883 strb(reg, Address(base, offset), cond);
2882 break; 2884 break;
2883 case kHalfword: 2885 case kHalfword:
2884 strh(reg, Address(base, offset), cond); 2886 strh(reg, Address(base, offset), cond);
2885 break; 2887 break;
2886 case kWord: 2888 case kWord:
2887 str(reg, Address(base, offset), cond); 2889 str(reg, Address(base, offset), cond);
2888 break; 2890 break;
2889 case kWordPair:
2890 strd(reg, base, offset, cond);
2891 break;
2892 default: 2891 default:
2893 UNREACHABLE(); 2892 UNREACHABLE();
2894 } 2893 }
2895 } 2894 }
2896 2895
2897 2896
2898 void Assembler::LoadSFromOffset(SRegister reg, 2897 void Assembler::LoadSFromOffset(SRegister reg,
2899 Register base, 2898 Register base,
2900 int32_t offset, 2899 int32_t offset,
2901 Condition cond) { 2900 Condition cond) {
(...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after
3640 3639
3641 3640
3642 const char* Assembler::FpuRegisterName(FpuRegister reg) { 3641 const char* Assembler::FpuRegisterName(FpuRegister reg) {
3643 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); 3642 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
3644 return fpu_reg_names[reg]; 3643 return fpu_reg_names[reg];
3645 } 3644 }
3646 3645
3647 } // namespace dart 3646 } // namespace dart
3648 3647
3649 #endif // defined TARGET_ARCH_ARM 3648 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.h ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698