diff options
| author | Simon Dardis <simon.dardis@mips.com> | 2018-06-20 22:40:12 +0000 |
|---|---|---|
| committer | Simon Dardis <simon.dardis@mips.com> | 2018-06-20 22:40:12 +0000 |
| commit | 0f111dd70432fe31bf8edd7ec296028ddc394d76 (patch) | |
| tree | d8c6dbc07f341874b8cf6b914cd60062258e7ebb /llvm/lib | |
| parent | d1d83df807649325514a921a19e90d543aab18ad (diff) | |
| download | bcm5719-llvm-0f111dd70432fe31bf8edd7ec296028ddc394d76.tar.gz bcm5719-llvm-0f111dd70432fe31bf8edd7ec296028ddc394d76.zip | |
[mips] Add microMIPS specific addressing patterns.
These are identical but use microMIPS instructions instead of MIPS instructions.
Also, flatten the 'let AdditionalPredicates = [InMicroMips]' by using the
ISA_MICROMIPS adjective. Add tests for constant materialization.
Reviewers: atanasyan, abeserminji, smaksimovic
Differential Revision: https://reviews.llvm.org/D48275
llvm-svn: 335185
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Mips/MicroMipsInstrInfo.td | 153 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsInstrInfo.td | 51 |
2 files changed, 113 insertions, 91 deletions
diff --git a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td index cd19f1c5cc0..171e5ed74ed 100644 --- a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td @@ -1165,75 +1165,96 @@ let DecoderNamespace = "MicroMips" in { // MicroMips arbitrary patterns that map to one or more instructions //===----------------------------------------------------------------------===// -let AdditionalPredicates = [InMicroMips] in { - def : MipsPat<(i32 immLi16:$imm), - (LI16_MM immLi16:$imm)>; - - defm : MaterializeImms<i32, ZERO, ADDiu_MM, LUi_MM, ORi_MM>; -} - -let Predicates = [InMicroMips] in { - def : MipsPat<(not GPRMM16:$in), - (NOT16_MM GPRMM16:$in)>; - def : MipsPat<(not GPR32:$in), - (NOR_MM GPR32Opnd:$in, ZERO)>; - - def : MipsPat<(add GPRMM16:$src, immSExtAddiur2:$imm), - (ADDIUR2_MM GPRMM16:$src, immSExtAddiur2:$imm)>; - def : MipsPat<(add GPR32:$src, immSExtAddius5:$imm), - (ADDIUS5_MM GPR32:$src, immSExtAddius5:$imm)>; - def : MipsPat<(add GPR32:$src, immSExt16:$imm), - (ADDiu_MM GPR32:$src, immSExt16:$imm)>; - - def : MipsPat<(and GPRMM16:$src, immZExtAndi16:$imm), - (ANDI16_MM GPRMM16:$src, immZExtAndi16:$imm)>; - def : MipsPat<(and GPR32:$src, immZExt16:$imm), - (ANDi_MM GPR32:$src, immZExt16:$imm)>; - - def : MipsPat<(shl GPRMM16:$src, immZExt2Shift:$imm), - (SLL16_MM GPRMM16:$src, immZExt2Shift:$imm)>; - def : MipsPat<(shl GPR32:$src, immZExt5:$imm), - (SLL_MM GPR32:$src, immZExt5:$imm)>; - def : MipsPat<(shl GPR32:$lhs, GPR32:$rhs), - (SLLV_MM GPR32:$lhs, GPR32:$rhs)>; - - def : MipsPat<(srl GPRMM16:$src, immZExt2Shift:$imm), - (SRL16_MM GPRMM16:$src, immZExt2Shift:$imm)>; - def : MipsPat<(srl GPR32:$src, immZExt5:$imm), - (SRL_MM GPR32:$src, immZExt5:$imm)>; - def : MipsPat<(srl GPR32:$lhs, GPR32:$rhs), - (SRLV_MM GPR32:$lhs, GPR32:$rhs)>; - - def : MipsPat<(sra GPR32:$src, immZExt5:$imm), - (SRA_MM GPR32:$src, immZExt5:$imm)>; - def : MipsPat<(sra GPR32:$lhs, GPR32:$rhs), - (SRAV_MM GPR32:$lhs, GPR32:$rhs)>; - - def : MipsPat<(store GPRMM16:$src, addrimm4lsl2:$addr), - (SW16_MM GPRMM16:$src, addrimm4lsl2:$addr)>; - def : MipsPat<(store GPR32:$src, addr:$addr), - (SW_MM GPR32:$src, addr:$addr)>; - - def : MipsPat<(load addrimm4lsl2:$addr), - (LW16_MM addrimm4lsl2:$addr)>; - def : MipsPat<(load addr:$addr), - (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; +defm : MipsHiLoRelocs<LUi_MM, ADDiu_MM, ZERO, GPR32Opnd>, ISA_MICROMIPS; - def : MipsPat<(i32 (extloadi8 addr:$src)), (LBu_MM addr:$src)>, - ISA_MICROMIPS; +def : MipsPat<(MipsGotHi tglobaladdr:$in), (LUi_MM tglobaladdr:$in)>, + ISA_MICROMIPS; +def : MipsPat<(MipsGotHi texternalsym:$in), (LUi_MM texternalsym:$in)>, + ISA_MICROMIPS; - def : MipsPat<(i32 (extloadi16 addr:$src)), (LHu_MM addr:$src)>, - ISA_MICROMIPS; +// gp_rel relocs +def : MipsPat<(add GPR32:$gp, (MipsGPRel tglobaladdr:$in)), + (ADDiu_MM GPR32:$gp, tglobaladdr:$in)>, ISA_MICROMIPS; +def : MipsPat<(add GPR32:$gp, (MipsGPRel tconstpool:$in)), + (ADDiu_MM GPR32:$gp, tconstpool:$in)>, ISA_MICROMIPS; + +def : WrapperPat<tglobaladdr, ADDiu_MM, GPR32>, ISA_MICROMIPS; +def : WrapperPat<tconstpool, ADDiu_MM, GPR32>, ISA_MICROMIPS; +def : WrapperPat<texternalsym, ADDiu_MM, GPR32>, ISA_MICROMIPS; +def : WrapperPat<tblockaddress, ADDiu_MM, GPR32>, ISA_MICROMIPS; +def : WrapperPat<tjumptable, ADDiu_MM, GPR32>, ISA_MICROMIPS; +def : WrapperPat<tglobaltlsaddr, ADDiu_MM, GPR32>, ISA_MICROMIPS; + +def : MipsPat<(atomic_load_8 addr:$a), (LB_MM addr:$a)>, ISA_MICROMIPS; +def : MipsPat<(atomic_load_16 addr:$a), (LH_MM addr:$a)>, ISA_MICROMIPS; +def : MipsPat<(atomic_load_32 addr:$a), (LW_MM addr:$a)>, ISA_MICROMIPS; + +def : MipsPat<(i32 immLi16:$imm), + (LI16_MM immLi16:$imm)>, ISA_MICROMIPS; + +defm : MaterializeImms<i32, ZERO, ADDiu_MM, LUi_MM, ORi_MM>, ISA_MICROMIPS; + +def : MipsPat<(not GPRMM16:$in), + (NOT16_MM GPRMM16:$in)>, ISA_MICROMIPS; +def : MipsPat<(not GPR32:$in), + (NOR_MM GPR32Opnd:$in, ZERO)>, ISA_MICROMIPS; + +def : MipsPat<(add GPRMM16:$src, immSExtAddiur2:$imm), + (ADDIUR2_MM GPRMM16:$src, immSExtAddiur2:$imm)>, ISA_MICROMIPS; +def : MipsPat<(add GPR32:$src, immSExtAddius5:$imm), + (ADDIUS5_MM GPR32:$src, immSExtAddius5:$imm)>, ISA_MICROMIPS; +def : MipsPat<(add GPR32:$src, immSExt16:$imm), + (ADDiu_MM GPR32:$src, immSExt16:$imm)>, ISA_MICROMIPS; + +def : MipsPat<(and GPRMM16:$src, immZExtAndi16:$imm), + (ANDI16_MM GPRMM16:$src, immZExtAndi16:$imm)>, ISA_MICROMIPS; +def : MipsPat<(and GPR32:$src, immZExt16:$imm), + (ANDi_MM GPR32:$src, immZExt16:$imm)>, ISA_MICROMIPS; + +def : MipsPat<(shl GPRMM16:$src, immZExt2Shift:$imm), + (SLL16_MM GPRMM16:$src, immZExt2Shift:$imm)>, ISA_MICROMIPS; +def : MipsPat<(shl GPR32:$src, immZExt5:$imm), + (SLL_MM GPR32:$src, immZExt5:$imm)>, ISA_MICROMIPS; +def : MipsPat<(shl GPR32:$lhs, GPR32:$rhs), + (SLLV_MM GPR32:$lhs, GPR32:$rhs)>, ISA_MICROMIPS; + +def : MipsPat<(srl GPRMM16:$src, immZExt2Shift:$imm), + (SRL16_MM GPRMM16:$src, immZExt2Shift:$imm)>, ISA_MICROMIPS; +def : MipsPat<(srl GPR32:$src, immZExt5:$imm), + (SRL_MM GPR32:$src, immZExt5:$imm)>, ISA_MICROMIPS; +def : MipsPat<(srl GPR32:$lhs, GPR32:$rhs), + (SRLV_MM GPR32:$lhs, GPR32:$rhs)>, ISA_MICROMIPS; + +def : MipsPat<(sra GPR32:$src, immZExt5:$imm), + (SRA_MM GPR32:$src, immZExt5:$imm)>, ISA_MICROMIPS; +def : MipsPat<(sra GPR32:$lhs, GPR32:$rhs), + (SRAV_MM GPR32:$lhs, GPR32:$rhs)>, ISA_MICROMIPS; + +def : MipsPat<(store GPRMM16:$src, addrimm4lsl2:$addr), + (SW16_MM GPRMM16:$src, addrimm4lsl2:$addr)>, ISA_MICROMIPS; +def : MipsPat<(store GPR32:$src, addr:$addr), + (SW_MM GPR32:$src, addr:$addr)>, ISA_MICROMIPS; + +def : MipsPat<(load addrimm4lsl2:$addr), + (LW16_MM addrimm4lsl2:$addr)>, ISA_MICROMIPS; +def : MipsPat<(load addr:$addr), + (LW_MM addr:$addr)>, ISA_MICROMIPS; +def : MipsPat<(subc GPR32:$lhs, GPR32:$rhs), + (SUBu_MM GPR32:$lhs, GPR32:$rhs)>, ISA_MICROMIPS; + +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; - 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)>, ISA_MICROMIPS; diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.td b/llvm/lib/Target/Mips/MipsInstrInfo.td index d4ab92b8014..6cd36acfa74 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MipsInstrInfo.td @@ -3016,33 +3016,34 @@ multiclass MipsHiLoRelocs<Instruction Lui, Instruction Addiu, (Addiu GPROpnd:$hi, tglobaltlsaddr:$lo)>; } -defm : MipsHiLoRelocs<LUi, ADDiu, ZERO, GPR32Opnd>; - -def : MipsPat<(MipsGotHi tglobaladdr:$in), (LUi tglobaladdr:$in)>; -def : MipsPat<(MipsGotHi texternalsym:$in), (LUi texternalsym:$in)>; - -// gp_rel relocs -def : MipsPat<(add GPR32:$gp, (MipsGPRel tglobaladdr:$in)), - (ADDiu GPR32:$gp, tglobaladdr:$in)>, ABI_NOT_N64; -def : MipsPat<(add GPR32:$gp, (MipsGPRel tconstpool:$in)), - (ADDiu GPR32:$gp, tconstpool:$in)>, ABI_NOT_N64; - -// wrapper_pic -class WrapperPat<SDNode node, Instruction ADDiuOp, RegisterClass RC>: - MipsPat<(MipsWrapper RC:$gp, node:$in), - (ADDiuOp RC:$gp, node:$in)>; +let AdditionalPredicates = [NotInMicroMips] in { + defm : MipsHiLoRelocs<LUi, ADDiu, ZERO, GPR32Opnd>, ISA_MIPS1; -def : WrapperPat<tglobaladdr, ADDiu, GPR32>; -def : WrapperPat<tconstpool, ADDiu, GPR32>; -def : WrapperPat<texternalsym, ADDiu, GPR32>; -def : WrapperPat<tblockaddress, ADDiu, GPR32>; -def : WrapperPat<tjumptable, ADDiu, GPR32>; -def : WrapperPat<tglobaltlsaddr, ADDiu, GPR32>; + def : MipsPat<(MipsGotHi tglobaladdr:$in), (LUi tglobaladdr:$in)>, ISA_MIPS1; + def : MipsPat<(MipsGotHi texternalsym:$in), (LUi texternalsym:$in)>, + ISA_MIPS1; -let AdditionalPredicates = [NotInMicroMips] in { -// Mips does not have "not", so we expand our way -def : MipsPat<(not GPR32:$in), - (NOR GPR32Opnd:$in, ZERO)>; + // gp_rel relocs + def : MipsPat<(add GPR32:$gp, (MipsGPRel tglobaladdr:$in)), + (ADDiu GPR32:$gp, tglobaladdr:$in)>, ISA_MIPS1, ABI_NOT_N64; + def : MipsPat<(add GPR32:$gp, (MipsGPRel tconstpool:$in)), + (ADDiu GPR32:$gp, tconstpool:$in)>, ISA_MIPS1, ABI_NOT_N64; + + // wrapper_pic + class WrapperPat<SDNode node, Instruction ADDiuOp, RegisterClass RC>: + MipsPat<(MipsWrapper RC:$gp, node:$in), + (ADDiuOp RC:$gp, node:$in)>; + + def : WrapperPat<tglobaladdr, ADDiu, GPR32>, ISA_MIPS1; + def : WrapperPat<tconstpool, ADDiu, GPR32>, ISA_MIPS1; + def : WrapperPat<texternalsym, ADDiu, GPR32>, ISA_MIPS1; + def : WrapperPat<tblockaddress, ADDiu, GPR32>, ISA_MIPS1; + def : WrapperPat<tjumptable, ADDiu, GPR32>, ISA_MIPS1; + def : WrapperPat<tglobaltlsaddr, ADDiu, GPR32>, ISA_MIPS1; + + // Mips does not have "not", so we expand our way + def : MipsPat<(not GPR32:$in), + (NOR GPR32Opnd:$in, ZERO)>, ISA_MIPS1; } // extended loads |

