Chromium Code Reviews| 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 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2823 LoadImmediate(scratch, Utils::High32Bits(imm64), cond); | 2826 LoadImmediate(scratch, Utils::High32Bits(imm64), cond); |
| 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) { |
|
zra
2015/10/23 16:31:53
ASSERT(size != kWordPair);
rmacnak
2015/10/23 17:16:20
Done.
| |
| 2834 int32_t offset_mask = 0; | 2837 int32_t offset_mask = 0; |
| 2835 if (!Address::CanHoldLoadOffset(size, offset, &offset_mask)) { | 2838 if (!Address::CanHoldLoadOffset(size, offset, &offset_mask)) { |
| 2836 ASSERT(base != IP); | 2839 ASSERT(base != IP); |
| 2837 AddImmediate(IP, base, offset & ~offset_mask, cond); | 2840 AddImmediate(IP, base, offset & ~offset_mask, cond); |
| 2838 base = IP; | 2841 base = IP; |
| 2839 offset = offset & offset_mask; | 2842 offset = offset & offset_mask; |
| 2840 } | 2843 } |
| 2841 switch (size) { | 2844 switch (size) { |
| 2842 case kByte: | 2845 case kByte: |
| 2843 ldrsb(reg, Address(base, offset), cond); | 2846 ldrsb(reg, Address(base, offset), cond); |
| 2844 break; | 2847 break; |
| 2845 case kUnsignedByte: | 2848 case kUnsignedByte: |
| 2846 ldrb(reg, Address(base, offset), cond); | 2849 ldrb(reg, Address(base, offset), cond); |
| 2847 break; | 2850 break; |
| 2848 case kHalfword: | 2851 case kHalfword: |
| 2849 ldrsh(reg, Address(base, offset), cond); | 2852 ldrsh(reg, Address(base, offset), cond); |
| 2850 break; | 2853 break; |
| 2851 case kUnsignedHalfword: | 2854 case kUnsignedHalfword: |
| 2852 ldrh(reg, Address(base, offset), cond); | 2855 ldrh(reg, Address(base, offset), cond); |
| 2853 break; | 2856 break; |
| 2854 case kWord: | 2857 case kWord: |
| 2855 ldr(reg, Address(base, offset), cond); | 2858 ldr(reg, Address(base, offset), cond); |
| 2856 break; | 2859 break; |
| 2857 case kWordPair: | |
| 2858 ldrd(reg, base, offset, cond); | |
| 2859 break; | |
| 2860 default: | 2860 default: |
| 2861 UNREACHABLE(); | 2861 UNREACHABLE(); |
| 2862 } | 2862 } |
| 2863 } | 2863 } |
| 2864 | 2864 |
| 2865 | 2865 |
| 2866 void Assembler::StoreToOffset(OperandSize size, | 2866 void Assembler::StoreToOffset(OperandSize size, |
| 2867 Register reg, | 2867 Register reg, |
| 2868 Register base, | 2868 Register base, |
| 2869 int32_t offset, | 2869 int32_t offset, |
| 2870 Condition cond) { | 2870 Condition cond) { |
|
zra
2015/10/23 16:31:53
ASSERT(size != kWordPair);
rmacnak
2015/10/23 17:16:20
Done.
| |
| 2871 int32_t offset_mask = 0; | 2871 int32_t offset_mask = 0; |
| 2872 if (!Address::CanHoldStoreOffset(size, offset, &offset_mask)) { | 2872 if (!Address::CanHoldStoreOffset(size, offset, &offset_mask)) { |
| 2873 ASSERT(reg != IP); | 2873 ASSERT(reg != IP); |
| 2874 ASSERT(base != IP); | 2874 ASSERT(base != IP); |
| 2875 AddImmediate(IP, base, offset & ~offset_mask, cond); | 2875 AddImmediate(IP, base, offset & ~offset_mask, cond); |
| 2876 base = IP; | 2876 base = IP; |
| 2877 offset = offset & offset_mask; | 2877 offset = offset & offset_mask; |
| 2878 } | 2878 } |
| 2879 switch (size) { | 2879 switch (size) { |
| 2880 case kByte: | 2880 case kByte: |
| 2881 strb(reg, Address(base, offset), cond); | 2881 strb(reg, Address(base, offset), cond); |
| 2882 break; | 2882 break; |
| 2883 case kHalfword: | 2883 case kHalfword: |
| 2884 strh(reg, Address(base, offset), cond); | 2884 strh(reg, Address(base, offset), cond); |
| 2885 break; | 2885 break; |
| 2886 case kWord: | 2886 case kWord: |
| 2887 str(reg, Address(base, offset), cond); | 2887 str(reg, Address(base, offset), cond); |
| 2888 break; | 2888 break; |
| 2889 case kWordPair: | |
| 2890 strd(reg, base, offset, cond); | |
| 2891 break; | |
| 2892 default: | 2889 default: |
| 2893 UNREACHABLE(); | 2890 UNREACHABLE(); |
| 2894 } | 2891 } |
| 2895 } | 2892 } |
| 2896 | 2893 |
| 2897 | 2894 |
| 2898 void Assembler::LoadSFromOffset(SRegister reg, | 2895 void Assembler::LoadSFromOffset(SRegister reg, |
| 2899 Register base, | 2896 Register base, |
| 2900 int32_t offset, | 2897 int32_t offset, |
| 2901 Condition cond) { | 2898 Condition cond) { |
| (...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3640 | 3637 |
| 3641 | 3638 |
| 3642 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3639 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
| 3643 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); | 3640 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); |
| 3644 return fpu_reg_names[reg]; | 3641 return fpu_reg_names[reg]; |
| 3645 } | 3642 } |
| 3646 | 3643 |
| 3647 } // namespace dart | 3644 } // namespace dart |
| 3648 | 3645 |
| 3649 #endif // defined TARGET_ARCH_ARM | 3646 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |