diff options
| author | Simon Dardis <simon.dardis@imgtec.com> | 2016-10-18 14:28:00 +0000 |
|---|---|---|
| committer | Simon Dardis <simon.dardis@imgtec.com> | 2016-10-18 14:28:00 +0000 |
| commit | aff4d141b922cc6cbbcd575a289fee76271259e7 (patch) | |
| tree | 87bdb25d8dce6d0e22433e61ff9a0191f33341cd /llvm/lib/Target/Mips/MipsInstrInfo.td | |
| parent | 1bee6340efca945609438fcac0d6c149952d97d0 (diff) | |
| download | bcm5719-llvm-aff4d141b922cc6cbbcd575a289fee76271259e7.tar.gz bcm5719-llvm-aff4d141b922cc6cbbcd575a289fee76271259e7.zip | |
[mips] Macro expansion for ld, sd for O32
ld and sd when assembled for the O32 ABI expand to a pair of 32 bit word loads
or stores using the specified source or destination register and the next
register.
This patch does not add support for the cases where the offset is greater than
a 16 bit signed immediate as that would lead to a wrong/misleading error
message as the assembler would report "instruction requires a CPU feature
not currently enabled" for ld & sd for MIPS64 when their offset is not a signed
16 bit number.
This fixes PR/29159.
Thanks to Sean Bruno for reporting this issue!
Reviewers: vkalintiris, seanbruno, zoran.jovanovic
Differential Review: https://reviews.llvm.org/D24556
llvm-svn: 284481
Diffstat (limited to 'llvm/lib/Target/Mips/MipsInstrInfo.td')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsInstrInfo.td | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.td b/llvm/lib/Target/Mips/MipsInstrInfo.td index ce5a8c9fbc2..2900a3f4e66 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MipsInstrInfo.td @@ -157,6 +157,8 @@ def HasMips3_32r2 : Predicate<"Subtarget->hasMips3_32r2()">, AssemblerPredicate<"FeatureMips3_32r2">; def HasMips3 : Predicate<"Subtarget->hasMips3()">, AssemblerPredicate<"FeatureMips3">; +def NotMips3 : Predicate<"!Subtarget->hasMips3()">, + AssemblerPredicate<"!FeatureMips3">; def HasMips4_32 : Predicate<"Subtarget->hasMips4_32()">, AssemblerPredicate<"FeatureMips4_32">; def NotMips4_32 : Predicate<"!Subtarget->hasMips4_32()">, @@ -242,6 +244,9 @@ class PTR_64 { list<Predicate> PTRPredicates = [IsPTR64bit]; } // subtractive predicate will hopefully keep us under the 32 predicate // limit long enough to develop an alternative way to handle P1||P2 // predicates. +class ISA_MIPS1_NOT_MIPS3 { + list<Predicate> InsnPredicates = [NotMips3]; +} class ISA_MIPS1_NOT_4_32 { list<Predicate> InsnPredicates = [NotMips4_32]; } @@ -2541,6 +2546,12 @@ def Ulhu : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), def Ulw : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins mem:$addr), "ulw\t$rt, $addr">; //, ISA_MIPS1_NOT_32R6_64R6; +def LDMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), + (ins mem_simm16:$addr), "ld $rt, $addr">, + ISA_MIPS1_NOT_MIPS3; +def SDMacro : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), + (ins mem_simm16:$addr), "sd $rt, $addr">, + ISA_MIPS1_NOT_MIPS3; //===----------------------------------------------------------------------===// // Arbitrary patterns that map to one or more instructions //===----------------------------------------------------------------------===// |

