| 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 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |