diff options
| author | Simon Dardis <simon.dardis@mips.com> | 2018-04-30 09:44:44 +0000 |
|---|---|---|
| committer | Simon Dardis <simon.dardis@mips.com> | 2018-04-30 09:44:44 +0000 |
| commit | 57c2095d1b4013e15af07ea263c190189aa2b5f1 (patch) | |
| tree | a791f3345e08438cd1e78ce79d1a3eda065ef21d /llvm/lib | |
| parent | 89f7b46b7af23722b756bf289d78408d7d1e09f6 (diff) | |
| download | bcm5719-llvm-57c2095d1b4013e15af07ea263c190189aa2b5f1.tar.gz bcm5719-llvm-57c2095d1b4013e15af07ea263c190189aa2b5f1.zip | |
[mips] Fix microMIPS loads and stores.
Previously these instructions were unselectable and instead were generated
through the instruction mapping tables.
Reviewers: atanasyan, smaksimovic, abeserminji
Differential Revision: https://reviews.llvm.org/D46055
llvm-svn: 331165
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Mips/MicroMipsInstrInfo.td | 44 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsInstrInfo.td | 30 |
2 files changed, 41 insertions, 33 deletions
diff --git a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td index f83d9e64d1f..aef70efaf8a 100644 --- a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td @@ -793,21 +793,22 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in { /// Load and Store Instructions - aligned let DecoderMethod = "DecodeMemMMImm16" in { - def LB_MM : LoadMemory<"lb", GPR32Opnd, mem_mm_16, null_frag, II_LB>, - MMRel, LW_FM_MM<0x7>; - def LBu_MM : LoadMemory<"lbu", GPR32Opnd, mem_mm_16, null_frag, II_LBU>, - MMRel, LW_FM_MM<0x5>; + def LB_MM : LoadMemory<"lb", GPR32Opnd, mem_mm_16, sextloadi8, II_LB>, + MMRel, LW_FM_MM<0x7>, ISA_MICROMIPS; + def LBu_MM : LoadMemory<"lbu", GPR32Opnd, mem_mm_16, zextloadi8, II_LBU>, + MMRel, LW_FM_MM<0x5>, ISA_MICROMIPS; def LH_MM : LoadMemory<"lh", GPR32Opnd, mem_simm16, sextloadi16, II_LH, - addrDefault>, MMRel, LW_FM_MM<0xf>; + addrDefault>, MMRel, LW_FM_MM<0xf>, ISA_MICROMIPS; def LHu_MM : LoadMemory<"lhu", GPR32Opnd, mem_simm16, zextloadi16, II_LHU>, - MMRel, LW_FM_MM<0xd>; - def LW_MM : Load<"lw", GPR32Opnd, null_frag, II_LW>, MMRel, LW_FM_MM<0x3f>; - def SB_MM : Store<"sb", GPR32Opnd, null_frag, II_SB>, MMRel, - LW_FM_MM<0x6>; - def SH_MM : Store<"sh", GPR32Opnd, null_frag, II_SH>, MMRel, - LW_FM_MM<0xe>; + MMRel, LW_FM_MM<0xd>, ISA_MICROMIPS; + def LW_MM : Load<"lw", GPR32Opnd, null_frag, II_LW>, MMRel, LW_FM_MM<0x3f>, + ISA_MICROMIPS; + def SB_MM : Store<"sb", GPR32Opnd, truncstorei8, II_SB>, MMRel, + LW_FM_MM<0x6>, ISA_MICROMIPS; + def SH_MM : Store<"sh", GPR32Opnd, truncstorei16, II_SH>, MMRel, + LW_FM_MM<0xe>, ISA_MICROMIPS; def SW_MM : Store<"sw", GPR32Opnd, null_frag, II_SW>, MMRel, - LW_FM_MM<0x3e>; + LW_FM_MM<0x3e>, ISA_MICROMIPS; } } let DecoderNamespace = "MicroMips" in { @@ -1185,6 +1186,19 @@ let Predicates = [InMicroMips] in { (LW_MM addr:$addr)>; def : MipsPat<(subc GPR32:$lhs, GPR32:$rhs), (SUBu_MM GPR32:$lhs, GPR32:$rhs)>; + + def : MipsPat<(i32 (extloadi1 addr:$src)), (LBu_MM addr:$src)>, + ISA_MICROMIPS; + + def : MipsPat<(i32 (extloadi8 addr:$src)), (LBu_MM addr:$src)>, + ISA_MICROMIPS; + + def : MipsPat<(i32 (extloadi16 addr:$src)), (LHu_MM addr:$src)>, + ISA_MICROMIPS; + + let AddedComplexity = 40 in + def : MipsPat<(i32 (sextloadi16 addrRegImm:$a)), + (LH_MM addrRegImm:$a)>, ISA_MICROMIPS; } def : MipsPat<(bswap GPR32:$rt), (ROTR_MM (WSBH_MM GPR32:$rt), 16)>, @@ -1195,14 +1209,8 @@ def : MipsPat<(MipsTailCall (iPTR tglobaladdr:$dst)), def : MipsPat<(MipsTailCall (iPTR texternalsym:$dst)), (TAILCALL_MM texternalsym:$dst)>, ISA_MICROMIPS32_NOT_MIPS32R6; -let AddedComplexity = 40 in { - def : MipsPat<(i32 (sextloadi16 addrRegImm:$a)), - (LH_MM addrRegImm:$a)>; -} def : MipsPat<(atomic_load_16 addr:$a), (LH_MM addr:$a)>; -def : MipsPat<(i32 (extloadi16 addr:$src)), - (LHu_MM addr:$src)>; defm : BrcondPats<GPR32, BEQ_MM, BEQ_MM, BNE_MM, SLT_MM, SLTu_MM, SLTi_MM, SLTiu_MM, ZERO>; diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.td b/llvm/lib/Target/Mips/MipsInstrInfo.td index 5290b56d889..fd057a3eca4 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MipsInstrInfo.td @@ -2037,23 +2037,21 @@ let AdditionalPredicates = [NotInMicroMips] in { /// Load and Store Instructions /// aligned -def LB : LoadMemory<"lb", GPR32Opnd, mem_simmptr, sextloadi8, II_LB>, MMRel, - LW_FM<0x20>; -def LBu : LoadMemory<"lbu", GPR32Opnd, mem_simmptr, zextloadi8, II_LBU, - addrDefault>, MMRel, LW_FM<0x24>; let AdditionalPredicates = [NotInMicroMips] in { + def LB : LoadMemory<"lb", GPR32Opnd, mem_simmptr, sextloadi8, II_LB>, MMRel, + LW_FM<0x20>; + def LBu : LoadMemory<"lbu", GPR32Opnd, mem_simmptr, zextloadi8, II_LBU, + addrDefault>, MMRel, LW_FM<0x24>; def LH : LoadMemory<"lh", GPR32Opnd, mem_simm16, sextloadi16, II_LH, addrDefault>, MMRel, LW_FM<0x21>; def LHu : LoadMemory<"lhu", GPR32Opnd, mem_simm16, zextloadi16, II_LHU>, MMRel, LW_FM<0x25>; def LW : StdMMR6Rel, Load<"lw", GPR32Opnd, load, II_LW, addrDefault>, MMRel, LW_FM<0x23>; -} -def SB : StdMMR6Rel, Store<"sb", GPR32Opnd, truncstorei8, II_SB>, MMRel, - LW_FM<0x28>; -def SH : Store<"sh", GPR32Opnd, truncstorei16, II_SH>, MMRel, LW_FM<0x29>; -let AdditionalPredicates = [NotInMicroMips] in { -def SW : Store<"sw", GPR32Opnd, store, II_SW>, MMRel, LW_FM<0x2b>; + def SB : StdMMR6Rel, Store<"sb", GPR32Opnd, truncstorei8, II_SB>, MMRel, + LW_FM<0x28>; + def SH : Store<"sh", GPR32Opnd, truncstorei16, II_SH>, MMRel, LW_FM<0x29>; + def SW : Store<"sw", GPR32Opnd, store, II_SW>, MMRel, LW_FM<0x2b>; } /// load/store left/right @@ -3021,9 +3019,9 @@ def : MipsPat<(not GPR32:$in), } // extended loads -def : MipsPat<(i32 (extloadi1 addr:$src)), (LBu addr:$src)>; -def : MipsPat<(i32 (extloadi8 addr:$src)), (LBu addr:$src)>; let AdditionalPredicates = [NotInMicroMips] in { + def : MipsPat<(i32 (extloadi1 addr:$src)), (LBu addr:$src)>; + def : MipsPat<(i32 (extloadi8 addr:$src)), (LBu addr:$src)>; def : MipsPat<(i32 (extloadi16 addr:$src)), (LHu addr:$src)>; } @@ -3126,10 +3124,12 @@ let AdditionalPredicates = [NotInMicroMips] in { // Load halfword/word patterns. let AddedComplexity = 40 in { - def : LoadRegImmPat<LBu, i32, zextloadi8>; let AdditionalPredicates = [NotInMicroMips] in { - def : LoadRegImmPat<LH, i32, sextloadi16>; - def : LoadRegImmPat<LW, i32, load>; + def : LoadRegImmPat<LBu, i32, zextloadi8>, ISA_MIPS1; + def : LoadRegImmPat<LHu, i32, zextloadi16>, ISA_MIPS1; + def : LoadRegImmPat<LB, i32, sextloadi8>, ISA_MIPS1; + def : LoadRegImmPat<LH, i32, sextloadi16>, ISA_MIPS1; + def : LoadRegImmPat<LW, i32, load>, ISA_MIPS1; } } |

