1*9880d681SAndroid Build Coastguard Worker//=- Mips32r6InstrInfo.td - Mips32r6 Instruction Information -*- tablegen -*-=// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes Mips32r6 instructions. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerinclude "Mips32r6InstrFormats.td" 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker// Notes about removals/changes from MIPS32r6: 17*9880d681SAndroid Build Coastguard Worker// Reencoded: jr -> jalr 18*9880d681SAndroid Build Coastguard Worker// Reencoded: jr.hb -> jalr.hb 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdef brtarget21 : Operand<OtherVT> { 21*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getBranchTarget21OpValue"; 22*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_PCREL"; 23*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeBranchTarget21"; 24*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MipsJumpTargetAsmOperand; 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdef brtarget26 : Operand<OtherVT> { 28*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getBranchTarget26OpValue"; 29*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_PCREL"; 30*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeBranchTarget26"; 31*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MipsJumpTargetAsmOperand; 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdef jmpoffset16 : Operand<OtherVT> { 35*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getJumpOffset16OpValue"; 36*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MipsJumpTargetAsmOperand; 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdef calloffset16 : Operand<iPTR> { 40*9880d681SAndroid Build Coastguard Worker let EncoderMethod = "getJumpOffset16OpValue"; 41*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = MipsJumpTargetAsmOperand; 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 45*9880d681SAndroid Build Coastguard Worker// 46*9880d681SAndroid Build Coastguard Worker// Instruction Encodings 47*9880d681SAndroid Build Coastguard Worker// 48*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerclass ADDIUPC_ENC : PCREL19_FM<OPCODE2_ADDIUPC>; 51*9880d681SAndroid Build Coastguard Workerclass ALIGN_ENC : SPECIAL3_ALIGN_FM<OPCODE6_ALIGN>; 52*9880d681SAndroid Build Coastguard Workerclass ALUIPC_ENC : PCREL16_FM<OPCODE5_ALUIPC>; 53*9880d681SAndroid Build Coastguard Workerclass AUI_ENC : AUI_FM; 54*9880d681SAndroid Build Coastguard Workerclass AUIPC_ENC : PCREL16_FM<OPCODE5_AUIPC>; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerclass BAL_ENC : BAL_FM; 57*9880d681SAndroid Build Coastguard Workerclass BALC_ENC : BRANCH_OFF26_FM<0b111010>; 58*9880d681SAndroid Build Coastguard Workerclass BC_ENC : BRANCH_OFF26_FM<0b110010>; 59*9880d681SAndroid Build Coastguard Workerclass BEQC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_ADDI>, 60*9880d681SAndroid Build Coastguard Worker DecodeDisambiguates<"AddiGroupBranch">; 61*9880d681SAndroid Build Coastguard Workerclass BEQZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_ADDI>, 62*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"DaddiGroupBranch">; 63*9880d681SAndroid Build Coastguard Workerclass BNEC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_DADDI>, 64*9880d681SAndroid Build Coastguard Worker DecodeDisambiguates<"DaddiGroupBranch">; 65*9880d681SAndroid Build Coastguard Workerclass BNEZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_DADDI>, 66*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"DaddiGroupBranch">; 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerclass BLTZC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BGTZL>, 69*9880d681SAndroid Build Coastguard Worker DecodeDisambiguates<"BgtzlGroupBranch">; 70*9880d681SAndroid Build Coastguard Workerclass BGEC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BLEZL>, 71*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BlezlGroupBranch">; 72*9880d681SAndroid Build Coastguard Workerclass BGEUC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BLEZ>, 73*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BlezGroupBranch">; 74*9880d681SAndroid Build Coastguard Workerclass BGEZC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BLEZL>, 75*9880d681SAndroid Build Coastguard Worker DecodeDisambiguates<"BlezlGroupBranch">; 76*9880d681SAndroid Build Coastguard Workerclass BGTZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BGTZ>, 77*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BgtzGroupBranch">; 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerclass BLTC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BGTZL>, 80*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BgtzlGroupBranch">; 81*9880d681SAndroid Build Coastguard Workerclass BLTUC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_BGTZ>, 82*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BgtzGroupBranch">; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerclass BLEZC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BLEZL>, 85*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BlezlGroupBranch">; 86*9880d681SAndroid Build Coastguard Workerclass BLTZALC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BGTZ>, 87*9880d681SAndroid Build Coastguard Worker DecodeDisambiguates<"BgtzGroupBranch">; 88*9880d681SAndroid Build Coastguard Workerclass BGTZC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BGTZL>, 89*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BgtzlGroupBranch">; 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerclass BEQZC_ENC : CMP_BRANCH_OFF21_FM<0b110110>; 92*9880d681SAndroid Build Coastguard Workerclass BGEZALC_ENC : CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP_BLEZ>, 93*9880d681SAndroid Build Coastguard Worker DecodeDisambiguates<"BlezGroupBranch">; 94*9880d681SAndroid Build Coastguard Workerclass BNEZC_ENC : CMP_BRANCH_OFF21_FM<0b111110>; 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerclass BC1EQZ_ENC : COP1_BCCZ_FM<OPCODE5_BC1EQZ>; 97*9880d681SAndroid Build Coastguard Workerclass BC1NEZ_ENC : COP1_BCCZ_FM<OPCODE5_BC1NEZ>; 98*9880d681SAndroid Build Coastguard Workerclass BC2EQZ_ENC : COP2_BCCZ_FM<OPCODE5_BC2EQZ>; 99*9880d681SAndroid Build Coastguard Workerclass BC2NEZ_ENC : COP2_BCCZ_FM<OPCODE5_BC2NEZ>; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerclass JIALC_ENC : JMP_IDX_COMPACT_FM<0b111110>; 102*9880d681SAndroid Build Coastguard Workerclass JIC_ENC : JMP_IDX_COMPACT_FM<0b110110>; 103*9880d681SAndroid Build Coastguard Workerclass JR_HB_R6_ENC : JR_HB_R6_FM<OPCODE6_JALR>; 104*9880d681SAndroid Build Coastguard Workerclass BITSWAP_ENC : SPECIAL3_2R_FM<OPCODE6_BITSWAP>; 105*9880d681SAndroid Build Coastguard Workerclass BLEZALC_ENC : CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP_BLEZ>, 106*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"BlezGroupBranch">; 107*9880d681SAndroid Build Coastguard Workerclass BNVC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_DADDI>, 108*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"DaddiGroupBranch">; 109*9880d681SAndroid Build Coastguard Workerclass BOVC_ENC : CMP_BRANCH_2R_OFF16_FM<OPGROUP_ADDI>, 110*9880d681SAndroid Build Coastguard Worker DecodeDisambiguatedBy<"AddiGroupBranch">; 111*9880d681SAndroid Build Coastguard Workerclass DIV_ENC : SPECIAL_3R_FM<0b00010, 0b011010>; 112*9880d681SAndroid Build Coastguard Workerclass DIVU_ENC : SPECIAL_3R_FM<0b00010, 0b011011>; 113*9880d681SAndroid Build Coastguard Workerclass MOD_ENC : SPECIAL_3R_FM<0b00011, 0b011010>; 114*9880d681SAndroid Build Coastguard Workerclass MODU_ENC : SPECIAL_3R_FM<0b00011, 0b011011>; 115*9880d681SAndroid Build Coastguard Workerclass MUH_ENC : SPECIAL_3R_FM<0b00011, 0b011000>; 116*9880d681SAndroid Build Coastguard Workerclass MUHU_ENC : SPECIAL_3R_FM<0b00011, 0b011001>; 117*9880d681SAndroid Build Coastguard Workerclass MUL_R6_ENC : SPECIAL_3R_FM<0b00010, 0b011000>; 118*9880d681SAndroid Build Coastguard Workerclass MULU_ENC : SPECIAL_3R_FM<0b00010, 0b011001>; 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerclass MADDF_S_ENC : COP1_3R_FM<0b011000, FIELD_FMT_S>; 121*9880d681SAndroid Build Coastguard Workerclass MADDF_D_ENC : COP1_3R_FM<0b011000, FIELD_FMT_D>; 122*9880d681SAndroid Build Coastguard Workerclass MSUBF_S_ENC : COP1_3R_FM<0b011001, FIELD_FMT_S>; 123*9880d681SAndroid Build Coastguard Workerclass MSUBF_D_ENC : COP1_3R_FM<0b011001, FIELD_FMT_D>; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerclass SEL_D_ENC : COP1_3R_FM<0b010000, FIELD_FMT_D>; 126*9880d681SAndroid Build Coastguard Workerclass SEL_S_ENC : COP1_3R_FM<0b010000, FIELD_FMT_S>; 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerclass SELEQZ_ENC : SPECIAL_3R_FM<0b00000, 0b110101>; 129*9880d681SAndroid Build Coastguard Workerclass SELNEZ_ENC : SPECIAL_3R_FM<0b00000, 0b110111>; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerclass LWPC_ENC : PCREL19_FM<OPCODE2_LWPC>; 132*9880d681SAndroid Build Coastguard Workerclass LWUPC_ENC : PCREL19_FM<OPCODE2_LWUPC>; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerclass MAX_S_ENC : COP1_3R_FM<0b011101, FIELD_FMT_S>; 135*9880d681SAndroid Build Coastguard Workerclass MAX_D_ENC : COP1_3R_FM<0b011101, FIELD_FMT_D>; 136*9880d681SAndroid Build Coastguard Workerclass MIN_S_ENC : COP1_3R_FM<0b011100, FIELD_FMT_S>; 137*9880d681SAndroid Build Coastguard Workerclass MIN_D_ENC : COP1_3R_FM<0b011100, FIELD_FMT_D>; 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerclass MAXA_S_ENC : COP1_3R_FM<0b011111, FIELD_FMT_S>; 140*9880d681SAndroid Build Coastguard Workerclass MAXA_D_ENC : COP1_3R_FM<0b011111, FIELD_FMT_D>; 141*9880d681SAndroid Build Coastguard Workerclass MINA_S_ENC : COP1_3R_FM<0b011110, FIELD_FMT_S>; 142*9880d681SAndroid Build Coastguard Workerclass MINA_D_ENC : COP1_3R_FM<0b011110, FIELD_FMT_D>; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerclass SELEQZ_S_ENC : COP1_3R_FM<0b010100, FIELD_FMT_S>; 145*9880d681SAndroid Build Coastguard Workerclass SELEQZ_D_ENC : COP1_3R_FM<0b010100, FIELD_FMT_D>; 146*9880d681SAndroid Build Coastguard Workerclass SELNEZ_S_ENC : COP1_3R_FM<0b010111, FIELD_FMT_S>; 147*9880d681SAndroid Build Coastguard Workerclass SELNEZ_D_ENC : COP1_3R_FM<0b010111, FIELD_FMT_D>; 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerclass RINT_S_ENC : COP1_2R_FM<0b011010, FIELD_FMT_S>; 150*9880d681SAndroid Build Coastguard Workerclass RINT_D_ENC : COP1_2R_FM<0b011010, FIELD_FMT_D>; 151*9880d681SAndroid Build Coastguard Workerclass CLASS_S_ENC : COP1_2R_FM<0b011011, FIELD_FMT_S>; 152*9880d681SAndroid Build Coastguard Workerclass CLASS_D_ENC : COP1_2R_FM<0b011011, FIELD_FMT_D>; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerclass CACHE_ENC : SPECIAL3_MEM_FM<OPCODE6_CACHE>; 155*9880d681SAndroid Build Coastguard Workerclass PREF_ENC : SPECIAL3_MEM_FM<OPCODE6_PREF>; 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerclass LDC2_R6_ENC : COP2LDST_FM<OPCODE5_LDC2>; 158*9880d681SAndroid Build Coastguard Workerclass LWC2_R6_ENC : COP2LDST_FM<OPCODE5_LWC2>; 159*9880d681SAndroid Build Coastguard Workerclass SDC2_R6_ENC : COP2LDST_FM<OPCODE5_SDC2>; 160*9880d681SAndroid Build Coastguard Workerclass SWC2_R6_ENC : COP2LDST_FM<OPCODE5_SWC2>; 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerclass LSA_R6_ENC : SPECIAL_LSA_FM<OPCODE6_LSA>; 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerclass LL_R6_ENC : SPECIAL3_LL_SC_FM<OPCODE6_LL>; 165*9880d681SAndroid Build Coastguard Workerclass SC_R6_ENC : SPECIAL3_LL_SC_FM<OPCODE6_SC>; 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerclass CLO_R6_ENC : SPECIAL_2R_FM<OPCODE6_CLO>; 168*9880d681SAndroid Build Coastguard Workerclass CLZ_R6_ENC : SPECIAL_2R_FM<OPCODE6_CLZ>; 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerclass SDBBP_R6_ENC : SPECIAL_SDBBP_FM; 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 173*9880d681SAndroid Build Coastguard Worker// 174*9880d681SAndroid Build Coastguard Worker// Instruction Multiclasses 175*9880d681SAndroid Build Coastguard Worker// 176*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerclass CMP_CONDN_DESC_BASE<string CondStr, string Typestr, 179*9880d681SAndroid Build Coastguard Worker RegisterOperand FGROpnd, 180*9880d681SAndroid Build Coastguard Worker SDPatternOperator Op = null_frag> { 181*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs FGRCCOpnd:$fd); 182*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGROpnd:$fs, FGROpnd:$ft); 183*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat("cmp.", CondStr, ".", Typestr, "\t$fd, $fs, $ft"); 184*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set FGRCCOpnd:$fd, (Op FGROpnd:$fs, FGROpnd:$ft))]; 185*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workermulticlass CMP_CC_M <FIELD_CMP_FORMAT Format, string Typestr, 189*9880d681SAndroid Build Coastguard Worker RegisterOperand FGROpnd>{ 190*9880d681SAndroid Build Coastguard Worker let AdditionalPredicates = [NotInMicroMips] in { 191*9880d681SAndroid Build Coastguard Worker def CMP_F_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_AF>, 192*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"af", Typestr, FGROpnd>, 193*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.af.", Typestr)>, 194*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 195*9880d681SAndroid Build Coastguard Worker def CMP_UN_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_UN>, 196*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"un", Typestr, FGROpnd, setuo>, 197*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.un.", Typestr)>, 198*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 199*9880d681SAndroid Build Coastguard Worker def CMP_EQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_EQ>, 200*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"eq", Typestr, FGROpnd, setoeq>, 201*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.eq.", Typestr)>, 202*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 203*9880d681SAndroid Build Coastguard Worker def CMP_UEQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 204*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_UEQ>, 205*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"ueq", Typestr, FGROpnd, setueq>, 206*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.ueq.", Typestr)>, 207*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 208*9880d681SAndroid Build Coastguard Worker def CMP_LT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_LT>, 209*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"lt", Typestr, FGROpnd, setolt>, 210*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.lt.", Typestr)>, 211*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 212*9880d681SAndroid Build Coastguard Worker def CMP_ULT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 213*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_ULT>, 214*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"ult", Typestr, FGROpnd, setult>, 215*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.ult.", Typestr)>, 216*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 217*9880d681SAndroid Build Coastguard Worker def CMP_LE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_LE>, 218*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"le", Typestr, FGROpnd, setole>, 219*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.le.", Typestr)>, 220*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 221*9880d681SAndroid Build Coastguard Worker def CMP_ULE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 222*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_ULE>, 223*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"ule", Typestr, FGROpnd, setule>, 224*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.ule.", Typestr)>, 225*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 226*9880d681SAndroid Build Coastguard Worker def CMP_SAF_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 227*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SAF>, 228*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"saf", Typestr, FGROpnd>, 229*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.saf.", Typestr)>, 230*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 231*9880d681SAndroid Build Coastguard Worker def CMP_SUN_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 232*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SUN>, 233*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"sun", Typestr, FGROpnd>, 234*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.sun.", Typestr)>, 235*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 236*9880d681SAndroid Build Coastguard Worker def CMP_SEQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 237*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SEQ>, 238*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"seq", Typestr, FGROpnd>, 239*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.seq.", Typestr)>, 240*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 241*9880d681SAndroid Build Coastguard Worker def CMP_SUEQ_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 242*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SUEQ>, 243*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"sueq", Typestr, FGROpnd>, 244*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.sueq.", Typestr)>, 245*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 246*9880d681SAndroid Build Coastguard Worker def CMP_SLT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 247*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SLT>, 248*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"slt", Typestr, FGROpnd>, 249*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.slt.", Typestr)>, 250*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 251*9880d681SAndroid Build Coastguard Worker def CMP_SULT_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 252*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SULT>, 253*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"sult", Typestr, FGROpnd>, 254*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.sult.", Typestr)>, 255*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 256*9880d681SAndroid Build Coastguard Worker def CMP_SLE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 257*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SLE>, 258*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"sle", Typestr, FGROpnd>, 259*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.sle.", Typestr)>, 260*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 261*9880d681SAndroid Build Coastguard Worker def CMP_SULE_#NAME : R6MMR6Rel, COP1_CMP_CONDN_FM<Format, 262*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND_SULE>, 263*9880d681SAndroid Build Coastguard Worker CMP_CONDN_DESC_BASE<"sule", Typestr, FGROpnd>, 264*9880d681SAndroid Build Coastguard Worker MipsR6Arch<!strconcat("cmp.sule.", Typestr)>, 265*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6, HARDFLOAT; 266*9880d681SAndroid Build Coastguard Worker } 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 270*9880d681SAndroid Build Coastguard Worker// 271*9880d681SAndroid Build Coastguard Worker// Instruction Descriptions 272*9880d681SAndroid Build Coastguard Worker// 273*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Workerclass PCREL_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 276*9880d681SAndroid Build Coastguard Worker Operand ImmOpnd, InstrItinClass itin> 277*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 278*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rs); 279*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins ImmOpnd:$imm); 280*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rs, $imm"); 281*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 282*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerclass ADDIUPC_DESC : PCREL_DESC_BASE<"addiupc", GPR32Opnd, simm19_lsl2, 286*9880d681SAndroid Build Coastguard Worker II_ADDIUPC>; 287*9880d681SAndroid Build Coastguard Workerclass LWPC_DESC: PCREL_DESC_BASE<"lwpc", GPR32Opnd, simm19_lsl2, II_LWPC>; 288*9880d681SAndroid Build Coastguard Workerclass LWUPC_DESC: PCREL_DESC_BASE<"lwupc", GPR32Opnd, simm19_lsl2, II_LWUPC>; 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerclass ALIGN_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 291*9880d681SAndroid Build Coastguard Worker Operand ImmOpnd, InstrItinClass itin> 292*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 293*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 294*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp); 295*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp"); 296*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 297*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerclass ALIGN_DESC : ALIGN_DESC_BASE<"align", GPR32Opnd, uimm2, II_ALIGN>; 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerclass ALUIPC_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 303*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 304*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 305*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rs); 306*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins simm16:$imm); 307*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rs, $imm"); 308*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 309*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workerclass ALUIPC_DESC : ALUIPC_DESC_BASE<"aluipc", GPR32Opnd, II_ALUIPC>; 313*9880d681SAndroid Build Coastguard Workerclass AUIPC_DESC : ALUIPC_DESC_BASE<"auipc", GPR32Opnd, II_AUIPC>; 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Workerclass AUI_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 316*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 317*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 318*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rs); 319*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, simm16:$imm); 320*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rs, $rt, $imm"); 321*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 322*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Workerclass AUI_DESC : AUI_DESC_BASE<"aui", GPR32Opnd, II_AUI>; 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerclass BRANCH_DESC_BASE { 328*9880d681SAndroid Build Coastguard Worker bit isBranch = 1; 329*9880d681SAndroid Build Coastguard Worker bit isTerminator = 1; 330*9880d681SAndroid Build Coastguard Worker bit hasDelaySlot = 0; 331*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 332*9880d681SAndroid Build Coastguard Worker} 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Workerclass BC_DESC_BASE<string instr_asm, DAGOperand opnd> : BRANCH_DESC_BASE, 335*9880d681SAndroid Build Coastguard Worker MipsR6Arch<instr_asm> { 336*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins opnd:$offset); 337*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 338*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$offset"); 339*9880d681SAndroid Build Coastguard Worker bit isBarrier = 1; 340*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_BC; 341*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerclass CMP_BC_DESC_BASE<string instr_asm, DAGOperand opnd, 345*9880d681SAndroid Build Coastguard Worker RegisterOperand GPROpnd> : BRANCH_DESC_BASE, 346*9880d681SAndroid Build Coastguard Worker MipsR6Arch<instr_asm> { 347*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, opnd:$offset); 348*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 349*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rs, $rt, $offset"); 350*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [AT]; 351*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_BCCC; 352*9880d681SAndroid Build Coastguard Worker bit hasForbiddenSlot = 1; 353*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 354*9880d681SAndroid Build Coastguard Worker} 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Workerclass CMP_CBR_EQNE_Z_DESC_BASE<string instr_asm, DAGOperand opnd, 357*9880d681SAndroid Build Coastguard Worker RegisterOperand GPROpnd> 358*9880d681SAndroid Build Coastguard Worker : BRANCH_DESC_BASE, MipsR6Arch<instr_asm> { 359*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, opnd:$offset); 360*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 361*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rs, $offset"); 362*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [AT]; 363*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_BCCZC; 364*9880d681SAndroid Build Coastguard Worker bit hasForbiddenSlot = 1; 365*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerclass CMP_CBR_RT_Z_DESC_BASE<string instr_asm, DAGOperand opnd, 369*9880d681SAndroid Build Coastguard Worker RegisterOperand GPROpnd> 370*9880d681SAndroid Build Coastguard Worker : BRANCH_DESC_BASE, MipsR6Arch<instr_asm> { 371*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, opnd:$offset); 372*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 373*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $offset"); 374*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [AT]; 375*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_BCCZC; 376*9880d681SAndroid Build Coastguard Worker bit hasForbiddenSlot = 1; 377*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 378*9880d681SAndroid Build Coastguard Worker} 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Workerclass BAL_DESC : BC_DESC_BASE<"bal", brtarget> { 381*9880d681SAndroid Build Coastguard Worker bit isCall = 1; 382*9880d681SAndroid Build Coastguard Worker bit hasDelaySlot = 1; 383*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 384*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 385*9880d681SAndroid Build Coastguard Worker} 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Workerclass BALC_DESC : BC_DESC_BASE<"balc", brtarget26> { 388*9880d681SAndroid Build Coastguard Worker bit isCall = 1; 389*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 390*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_BALC; 391*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 392*9880d681SAndroid Build Coastguard Worker} 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Workerclass BC_DESC : BC_DESC_BASE<"bc", brtarget26>; 395*9880d681SAndroid Build Coastguard Workerclass BGEC_DESC : CMP_BC_DESC_BASE<"bgec", brtarget, GPR32Opnd>; 396*9880d681SAndroid Build Coastguard Workerclass BGEUC_DESC : CMP_BC_DESC_BASE<"bgeuc", brtarget, GPR32Opnd>; 397*9880d681SAndroid Build Coastguard Workerclass BEQC_DESC : CMP_BC_DESC_BASE<"beqc", brtarget, GPR32Opnd>; 398*9880d681SAndroid Build Coastguard Workerclass BNEC_DESC : CMP_BC_DESC_BASE<"bnec", brtarget, GPR32Opnd>; 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard Workerclass BLTC_DESC : CMP_BC_DESC_BASE<"bltc", brtarget, GPR32Opnd>; 401*9880d681SAndroid Build Coastguard Workerclass BLTUC_DESC : CMP_BC_DESC_BASE<"bltuc", brtarget, GPR32Opnd>; 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerclass BLTZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bltzc", brtarget, GPR32Opnd>; 404*9880d681SAndroid Build Coastguard Workerclass BGEZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgezc", brtarget, GPR32Opnd>; 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Workerclass BLEZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"blezc", brtarget, GPR32Opnd>; 407*9880d681SAndroid Build Coastguard Workerclass BGTZC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgtzc", brtarget, GPR32Opnd>; 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Workerclass BEQZC_DESC : CMP_CBR_EQNE_Z_DESC_BASE<"beqzc", brtarget21, GPR32Opnd>; 410*9880d681SAndroid Build Coastguard Workerclass BNEZC_DESC : CMP_CBR_EQNE_Z_DESC_BASE<"bnezc", brtarget21, GPR32Opnd>; 411*9880d681SAndroid Build Coastguard Worker 412*9880d681SAndroid Build Coastguard Workerclass COP1_BCCZ_DESC_BASE<string instr_asm> : BRANCH_DESC_BASE { 413*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGR64Opnd:$ft, brtarget:$offset); 414*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 415*9880d681SAndroid Build Coastguard Worker string AsmString = instr_asm; 416*9880d681SAndroid Build Coastguard Worker bit hasDelaySlot = 1; 417*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_BC1CCZ; 418*9880d681SAndroid Build Coastguard Worker} 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Workerclass BC1EQZ_DESC : COP1_BCCZ_DESC_BASE<"bc1eqz $ft, $offset">; 421*9880d681SAndroid Build Coastguard Workerclass BC1NEZ_DESC : COP1_BCCZ_DESC_BASE<"bc1nez $ft, $offset">; 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerclass COP2_BCCZ_DESC_BASE<string instr_asm> : BRANCH_DESC_BASE { 424*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins COP2Opnd:$ct, brtarget:$offset); 425*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 426*9880d681SAndroid Build Coastguard Worker string AsmString = instr_asm; 427*9880d681SAndroid Build Coastguard Worker bit hasDelaySlot = 1; 428*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 429*9880d681SAndroid Build Coastguard Worker} 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Workerclass BC2EQZ_DESC : COP2_BCCZ_DESC_BASE<"bc2eqz $ct, $offset">; 432*9880d681SAndroid Build Coastguard Workerclass BC2NEZ_DESC : COP2_BCCZ_DESC_BASE<"bc2nez $ct, $offset">; 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Workerclass BOVC_DESC : CMP_BC_DESC_BASE<"bovc", brtarget, GPR32Opnd>; 435*9880d681SAndroid Build Coastguard Workerclass BNVC_DESC : CMP_BC_DESC_BASE<"bnvc", brtarget, GPR32Opnd>; 436*9880d681SAndroid Build Coastguard Worker 437*9880d681SAndroid Build Coastguard Workerclass JMP_IDX_COMPACT_DESC_BASE<string opstr, DAGOperand opnd, 438*9880d681SAndroid Build Coastguard Worker RegisterOperand GPROpnd, 439*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> 440*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<opstr> { 441*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, opnd:$offset); 442*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(opstr, "\t$rt, $offset"); 443*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 444*9880d681SAndroid Build Coastguard Worker bit hasDelaySlot = 0; 445*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 446*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 447*9880d681SAndroid Build Coastguard Worker bit isBranch = 1; 448*9880d681SAndroid Build Coastguard Worker bit isIndirectBranch = 1; 449*9880d681SAndroid Build Coastguard Worker} 450*9880d681SAndroid Build Coastguard Worker 451*9880d681SAndroid Build Coastguard Workerclass JIALC_DESC : JMP_IDX_COMPACT_DESC_BASE<"jialc", calloffset16, 452*9880d681SAndroid Build Coastguard Worker GPR32Opnd, II_JIALC> { 453*9880d681SAndroid Build Coastguard Worker bit isCall = 1; 454*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 455*9880d681SAndroid Build Coastguard Worker} 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Workerclass JIC_DESC : JMP_IDX_COMPACT_DESC_BASE<"jic", jmpoffset16, 458*9880d681SAndroid Build Coastguard Worker GPR32Opnd, II_JIALC> { 459*9880d681SAndroid Build Coastguard Worker bit isBarrier = 1; 460*9880d681SAndroid Build Coastguard Worker bit isTerminator = 1; 461*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [AT]; 462*9880d681SAndroid Build Coastguard Worker} 463*9880d681SAndroid Build Coastguard Worker 464*9880d681SAndroid Build Coastguard Workerclass JR_HB_R6_DESC : JR_HB_DESC_BASE<"jr.hb", GPR32Opnd> { 465*9880d681SAndroid Build Coastguard Worker bit isBranch = 1; 466*9880d681SAndroid Build Coastguard Worker bit isIndirectBranch = 1; 467*9880d681SAndroid Build Coastguard Worker bit hasDelaySlot = 1; 468*9880d681SAndroid Build Coastguard Worker bit isTerminator=1; 469*9880d681SAndroid Build Coastguard Worker bit isBarrier=1; 470*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 471*9880d681SAndroid Build Coastguard Worker} 472*9880d681SAndroid Build Coastguard Worker 473*9880d681SAndroid Build Coastguard Workerclass BITSWAP_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 474*9880d681SAndroid Build Coastguard Worker InstrItinClass itin> 475*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 476*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 477*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt); 478*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rt"); 479*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 480*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 481*9880d681SAndroid Build Coastguard Worker} 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Workerclass BITSWAP_DESC : BITSWAP_DESC_BASE<"bitswap", GPR32Opnd, II_BITSWAP>; 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Workerclass DIVMOD_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 486*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, 487*9880d681SAndroid Build Coastguard Worker SDPatternOperator Op=null_frag> 488*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 489*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 490*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt); 491*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt"); 492*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPROpnd:$rd, (Op GPROpnd:$rs, GPROpnd:$rt))]; 493*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 494*9880d681SAndroid Build Coastguard Worker // This instruction doesn't trap division by zero itself. We must insert 495*9880d681SAndroid Build Coastguard Worker // teq instructions as well. 496*9880d681SAndroid Build Coastguard Worker bit usesCustomInserter = 1; 497*9880d681SAndroid Build Coastguard Worker} 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Workerclass DIV_DESC : DIVMOD_DESC_BASE<"div", GPR32Opnd, II_DIV, sdiv>; 500*9880d681SAndroid Build Coastguard Workerclass DIVU_DESC : DIVMOD_DESC_BASE<"divu", GPR32Opnd, II_DIVU, udiv>; 501*9880d681SAndroid Build Coastguard Workerclass MOD_DESC : DIVMOD_DESC_BASE<"mod", GPR32Opnd, II_MOD, srem>; 502*9880d681SAndroid Build Coastguard Workerclass MODU_DESC : DIVMOD_DESC_BASE<"modu", GPR32Opnd, II_MODU, urem>; 503*9880d681SAndroid Build Coastguard Worker 504*9880d681SAndroid Build Coastguard Workerclass BEQZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"beqzalc", brtarget, GPR32Opnd> { 505*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 506*9880d681SAndroid Build Coastguard Worker} 507*9880d681SAndroid Build Coastguard Worker 508*9880d681SAndroid Build Coastguard Workerclass BGEZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgezalc", brtarget, GPR32Opnd> { 509*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 510*9880d681SAndroid Build Coastguard Worker} 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Workerclass BGTZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bgtzalc", brtarget, GPR32Opnd> { 513*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 514*9880d681SAndroid Build Coastguard Worker} 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Workerclass BLEZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"blezalc", brtarget, GPR32Opnd> { 517*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 518*9880d681SAndroid Build Coastguard Worker} 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Workerclass BLTZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bltzalc", brtarget, GPR32Opnd> { 521*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 522*9880d681SAndroid Build Coastguard Worker} 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Workerclass BNEZALC_DESC : CMP_CBR_RT_Z_DESC_BASE<"bnezalc", brtarget, GPR32Opnd> { 525*9880d681SAndroid Build Coastguard Worker list<Register> Defs = [RA]; 526*9880d681SAndroid Build Coastguard Worker} 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Workerclass MUL_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 529*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, 530*9880d681SAndroid Build Coastguard Worker SDPatternOperator Op=null_frag> : MipsR6Arch<instr_asm> { 531*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 532*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt); 533*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt"); 534*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPROpnd:$rd, (Op GPROpnd:$rs, GPROpnd:$rt))]; 535*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 536*9880d681SAndroid Build Coastguard Worker} 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Workerclass MUH_DESC : MUL_R6_DESC_BASE<"muh", GPR32Opnd, II_MUH, mulhs>; 539*9880d681SAndroid Build Coastguard Workerclass MUHU_DESC : MUL_R6_DESC_BASE<"muhu", GPR32Opnd, II_MUHU, mulhu>; 540*9880d681SAndroid Build Coastguard Workerclass MUL_R6_DESC : MUL_R6_DESC_BASE<"mul", GPR32Opnd, II_MUL, mul>; 541*9880d681SAndroid Build Coastguard Workerclass MULU_DESC : MUL_R6_DESC_BASE<"mulu", GPR32Opnd, II_MULU>; 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Workerclass COP1_SEL_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> { 544*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs FGROpnd:$fd); 545*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGRCCOpnd:$fd_in, FGROpnd:$fs, FGROpnd:$ft); 546*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft"); 547*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set FGROpnd:$fd, (select FGRCCOpnd:$fd_in, 548*9880d681SAndroid Build Coastguard Worker FGROpnd:$ft, 549*9880d681SAndroid Build Coastguard Worker FGROpnd:$fs))]; 550*9880d681SAndroid Build Coastguard Worker string Constraints = "$fd_in = $fd"; 551*9880d681SAndroid Build Coastguard Worker} 552*9880d681SAndroid Build Coastguard Worker 553*9880d681SAndroid Build Coastguard Workerclass SEL_D_DESC : COP1_SEL_DESC_BASE<"sel.d", FGR64Opnd>, MipsR6Arch<"sel.d"> { 554*9880d681SAndroid Build Coastguard Worker // We must insert a SUBREG_TO_REG around $fd_in 555*9880d681SAndroid Build Coastguard Worker bit usesCustomInserter = 1; 556*9880d681SAndroid Build Coastguard Worker} 557*9880d681SAndroid Build Coastguard Workerclass SEL_S_DESC : COP1_SEL_DESC_BASE<"sel.s", FGR32Opnd>, MipsR6Arch<"sel.s">; 558*9880d681SAndroid Build Coastguard Worker 559*9880d681SAndroid Build Coastguard Workerclass SELEQNE_Z_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> 560*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 561*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 562*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt); 563*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt"); 564*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 565*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = II_SELCCZ; 566*9880d681SAndroid Build Coastguard Worker} 567*9880d681SAndroid Build Coastguard Worker 568*9880d681SAndroid Build Coastguard Workerclass SELEQZ_DESC : SELEQNE_Z_DESC_BASE<"seleqz", GPR32Opnd>; 569*9880d681SAndroid Build Coastguard Workerclass SELNEZ_DESC : SELEQNE_Z_DESC_BASE<"selnez", GPR32Opnd>; 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Workerclass COP1_4R_DESC_BASE<string instr_asm, RegisterOperand FGROpnd, 572*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 573*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs FGROpnd:$fd); 574*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGROpnd:$fd_in, FGROpnd:$fs, FGROpnd:$ft); 575*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft"); 576*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 577*9880d681SAndroid Build Coastguard Worker string Constraints = "$fd_in = $fd"; 578*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 579*9880d681SAndroid Build Coastguard Worker} 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Workerclass MADDF_S_DESC : COP1_4R_DESC_BASE<"maddf.s", FGR32Opnd, II_MADDF_S>; 582*9880d681SAndroid Build Coastguard Workerclass MADDF_D_DESC : COP1_4R_DESC_BASE<"maddf.d", FGR64Opnd, II_MADDF_D>; 583*9880d681SAndroid Build Coastguard Workerclass MSUBF_S_DESC : COP1_4R_DESC_BASE<"msubf.s", FGR32Opnd, II_MSUBF_S>; 584*9880d681SAndroid Build Coastguard Workerclass MSUBF_D_DESC : COP1_4R_DESC_BASE<"msubf.d", FGR64Opnd, II_MSUBF_D>; 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Workerclass MAX_MIN_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> { 587*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs FGROpnd:$fd); 588*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGROpnd:$fs, FGROpnd:$ft); 589*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft"); 590*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 591*9880d681SAndroid Build Coastguard Worker} 592*9880d681SAndroid Build Coastguard Worker 593*9880d681SAndroid Build Coastguard Workerclass MAX_S_DESC : MAX_MIN_DESC_BASE<"max.s", FGR32Opnd>; 594*9880d681SAndroid Build Coastguard Workerclass MAX_D_DESC : MAX_MIN_DESC_BASE<"max.d", FGR64Opnd>; 595*9880d681SAndroid Build Coastguard Workerclass MIN_S_DESC : MAX_MIN_DESC_BASE<"min.s", FGR32Opnd>; 596*9880d681SAndroid Build Coastguard Workerclass MIN_D_DESC : MAX_MIN_DESC_BASE<"min.d", FGR64Opnd>; 597*9880d681SAndroid Build Coastguard Worker 598*9880d681SAndroid Build Coastguard Workerclass MAXA_S_DESC : MAX_MIN_DESC_BASE<"maxa.s", FGR32Opnd>; 599*9880d681SAndroid Build Coastguard Workerclass MAXA_D_DESC : MAX_MIN_DESC_BASE<"maxa.d", FGR64Opnd>; 600*9880d681SAndroid Build Coastguard Workerclass MINA_S_DESC : MAX_MIN_DESC_BASE<"mina.s", FGR32Opnd>; 601*9880d681SAndroid Build Coastguard Workerclass MINA_D_DESC : MAX_MIN_DESC_BASE<"mina.d", FGR64Opnd>; 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Workerclass SELEQNEZ_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> { 604*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs FGROpnd:$fd); 605*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGROpnd:$fs, FGROpnd:$ft); 606*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$fd, $fs, $ft"); 607*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 608*9880d681SAndroid Build Coastguard Worker} 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Workerclass SELEQZ_S_DESC : SELEQNEZ_DESC_BASE<"seleqz.s", FGR32Opnd>, 611*9880d681SAndroid Build Coastguard Worker MipsR6Arch<"seleqz.s">; 612*9880d681SAndroid Build Coastguard Workerclass SELEQZ_D_DESC : SELEQNEZ_DESC_BASE<"seleqz.d", FGR64Opnd>, 613*9880d681SAndroid Build Coastguard Worker MipsR6Arch<"seleqz.d">; 614*9880d681SAndroid Build Coastguard Workerclass SELNEZ_S_DESC : SELEQNEZ_DESC_BASE<"selnez.s", FGR32Opnd>, 615*9880d681SAndroid Build Coastguard Worker MipsR6Arch<"selnez.s">; 616*9880d681SAndroid Build Coastguard Workerclass SELNEZ_D_DESC : SELEQNEZ_DESC_BASE<"selnez.d", FGR64Opnd>, 617*9880d681SAndroid Build Coastguard Worker MipsR6Arch<"selnez.d">; 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Workerclass CLASS_RINT_DESC_BASE<string instr_asm, RegisterOperand FGROpnd> { 620*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs FGROpnd:$fd); 621*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins FGROpnd:$fs); 622*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$fd, $fs"); 623*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 624*9880d681SAndroid Build Coastguard Worker} 625*9880d681SAndroid Build Coastguard Worker 626*9880d681SAndroid Build Coastguard Workerclass RINT_S_DESC : CLASS_RINT_DESC_BASE<"rint.s", FGR32Opnd>; 627*9880d681SAndroid Build Coastguard Workerclass RINT_D_DESC : CLASS_RINT_DESC_BASE<"rint.d", FGR64Opnd>; 628*9880d681SAndroid Build Coastguard Workerclass CLASS_S_DESC : CLASS_RINT_DESC_BASE<"class.s", FGR32Opnd>; 629*9880d681SAndroid Build Coastguard Workerclass CLASS_D_DESC : CLASS_RINT_DESC_BASE<"class.d", FGR64Opnd>; 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Workerclass CACHE_HINT_DESC<string instr_asm, Operand MemOpnd, 632*9880d681SAndroid Build Coastguard Worker RegisterOperand GPROpnd> : MipsR6Arch<instr_asm> { 633*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 634*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint); 635*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$hint, $addr"); 636*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 637*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeCacheeOp_CacheOpR6"; 638*9880d681SAndroid Build Coastguard Worker} 639*9880d681SAndroid Build Coastguard Worker 640*9880d681SAndroid Build Coastguard Workerclass CACHE_DESC : CACHE_HINT_DESC<"cache", mem_simm9, GPR32Opnd>; 641*9880d681SAndroid Build Coastguard Workerclass PREF_DESC : CACHE_HINT_DESC<"pref", mem_simm9, GPR32Opnd>; 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Workerclass COP2LD_DESC_BASE<string instr_asm, RegisterOperand COPOpnd> { 644*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs COPOpnd:$rt); 645*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins mem_simm11:$addr); 646*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 647*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 648*9880d681SAndroid Build Coastguard Worker bit mayLoad = 1; 649*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeFMemCop2R6"; 650*9880d681SAndroid Build Coastguard Worker} 651*9880d681SAndroid Build Coastguard Worker 652*9880d681SAndroid Build Coastguard Workerclass LDC2_R6_DESC : COP2LD_DESC_BASE<"ldc2", COP2Opnd>; 653*9880d681SAndroid Build Coastguard Workerclass LWC2_R6_DESC : COP2LD_DESC_BASE<"lwc2", COP2Opnd>; 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Workerclass COP2ST_DESC_BASE<string instr_asm, RegisterOperand COPOpnd> { 656*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 657*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins COPOpnd:$rt, mem_simm11:$addr); 658*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 659*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 660*9880d681SAndroid Build Coastguard Worker bit mayStore = 1; 661*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeFMemCop2R6"; 662*9880d681SAndroid Build Coastguard Worker} 663*9880d681SAndroid Build Coastguard Worker 664*9880d681SAndroid Build Coastguard Workerclass SDC2_R6_DESC : COP2ST_DESC_BASE<"sdc2", COP2Opnd>; 665*9880d681SAndroid Build Coastguard Workerclass SWC2_R6_DESC : COP2ST_DESC_BASE<"swc2", COP2Opnd>; 666*9880d681SAndroid Build Coastguard Worker 667*9880d681SAndroid Build Coastguard Workerclass LSA_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 668*9880d681SAndroid Build Coastguard Worker Operand ImmOpnd, InstrItinClass itin> 669*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 670*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 671*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$imm2); 672*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $imm2"); 673*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 674*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 675*9880d681SAndroid Build Coastguard Worker} 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Workerclass LSA_R6_DESC : LSA_R6_DESC_BASE<"lsa", GPR32Opnd, uimm2_plus1, II_LSA>; 678*9880d681SAndroid Build Coastguard Worker 679*9880d681SAndroid Build Coastguard Workerclass LL_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 680*9880d681SAndroid Build Coastguard Worker Operand MemOpnd, InstrItinClass itin> 681*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 682*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rt); 683*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins MemOpnd:$addr); 684*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 685*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 686*9880d681SAndroid Build Coastguard Worker bit mayLoad = 1; 687*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 688*9880d681SAndroid Build Coastguard Worker} 689*9880d681SAndroid Build Coastguard Worker 690*9880d681SAndroid Build Coastguard Workerclass LL_R6_DESC : LL_R6_DESC_BASE<"ll", GPR32Opnd, mem_simm9, II_LL>; 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Workerclass SC_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 693*9880d681SAndroid Build Coastguard Worker InstrItinClass itin> { 694*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$dst); 695*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 696*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 697*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 698*9880d681SAndroid Build Coastguard Worker bit mayStore = 1; 699*9880d681SAndroid Build Coastguard Worker string Constraints = "$rt = $dst"; 700*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 701*9880d681SAndroid Build Coastguard Worker} 702*9880d681SAndroid Build Coastguard Worker 703*9880d681SAndroid Build Coastguard Workerclass SC_R6_DESC : SC_R6_DESC_BASE<"sc", GPR32Opnd, II_SC>; 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Workerclass CLO_CLZ_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 706*9880d681SAndroid Build Coastguard Worker InstrItinClass itin> 707*9880d681SAndroid Build Coastguard Worker : MipsR6Arch<instr_asm> { 708*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rd); 709*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rs); 710*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rd, $rs"); 711*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 712*9880d681SAndroid Build Coastguard Worker} 713*9880d681SAndroid Build Coastguard Worker 714*9880d681SAndroid Build Coastguard Workerclass CLO_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 715*9880d681SAndroid Build Coastguard Worker InstrItinClass itin> : 716*9880d681SAndroid Build Coastguard Worker CLO_CLZ_R6_DESC_BASE<instr_asm, GPROpnd, itin> { 717*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPROpnd:$rd, (ctlz (not GPROpnd:$rs)))]; 718*9880d681SAndroid Build Coastguard Worker} 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Workerclass CLZ_R6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 721*9880d681SAndroid Build Coastguard Worker InstrItinClass itin> : 722*9880d681SAndroid Build Coastguard Worker CLO_CLZ_R6_DESC_BASE<instr_asm, GPROpnd, itin> { 723*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = [(set GPROpnd:$rd, (ctlz GPROpnd:$rs))]; 724*9880d681SAndroid Build Coastguard Worker} 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Workerclass CLO_R6_DESC : CLO_R6_DESC_BASE<"clo", GPR32Opnd, II_CLO>; 727*9880d681SAndroid Build Coastguard Workerclass CLZ_R6_DESC : CLZ_R6_DESC_BASE<"clz", GPR32Opnd, II_CLZ>; 728*9880d681SAndroid Build Coastguard Worker 729*9880d681SAndroid Build Coastguard Workerclass SDBBP_R6_DESC { 730*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 731*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins uimm20:$code_); 732*9880d681SAndroid Build Coastguard Worker string AsmString = "sdbbp\t$code_"; 733*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 734*9880d681SAndroid Build Coastguard Worker bit isCTI = 1; 735*9880d681SAndroid Build Coastguard Worker} 736*9880d681SAndroid Build Coastguard Worker 737*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 738*9880d681SAndroid Build Coastguard Worker// 739*9880d681SAndroid Build Coastguard Worker// Instruction Definitions 740*9880d681SAndroid Build Coastguard Worker// 741*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 742*9880d681SAndroid Build Coastguard Worker 743*9880d681SAndroid Build Coastguard Workerdef ADDIUPC : R6MMR6Rel, ADDIUPC_ENC, ADDIUPC_DESC, ISA_MIPS32R6; 744*9880d681SAndroid Build Coastguard Workerdef ALIGN : R6MMR6Rel, ALIGN_ENC, ALIGN_DESC, ISA_MIPS32R6; 745*9880d681SAndroid Build Coastguard Workerdef ALUIPC : R6MMR6Rel, ALUIPC_ENC, ALUIPC_DESC, ISA_MIPS32R6; 746*9880d681SAndroid Build Coastguard Workerdef AUI : R6MMR6Rel, AUI_ENC, AUI_DESC, ISA_MIPS32R6; 747*9880d681SAndroid Build Coastguard Workerdef AUIPC : R6MMR6Rel, AUIPC_ENC, AUIPC_DESC, ISA_MIPS32R6; 748*9880d681SAndroid Build Coastguard Workerdef BAL : BAL_ENC, BAL_DESC, ISA_MIPS32R6; 749*9880d681SAndroid Build Coastguard Workerdef BALC : R6MMR6Rel, BALC_ENC, BALC_DESC, ISA_MIPS32R6; 750*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 751*9880d681SAndroid Build Coastguard Worker def BC1EQZ : BC1EQZ_ENC, BC1EQZ_DESC, ISA_MIPS32R6, HARDFLOAT; 752*9880d681SAndroid Build Coastguard Worker def BC1NEZ : BC1NEZ_ENC, BC1NEZ_DESC, ISA_MIPS32R6, HARDFLOAT; 753*9880d681SAndroid Build Coastguard Worker def BC2EQZ : BC2EQZ_ENC, BC2EQZ_DESC, ISA_MIPS32R6; 754*9880d681SAndroid Build Coastguard Worker def BC2NEZ : BC2NEZ_ENC, BC2NEZ_DESC, ISA_MIPS32R6; 755*9880d681SAndroid Build Coastguard Worker} 756*9880d681SAndroid Build Coastguard Workerdef BC : R6MMR6Rel, BC_ENC, BC_DESC, ISA_MIPS32R6; 757*9880d681SAndroid Build Coastguard Workerdef BEQC : R6MMR6Rel, BEQC_ENC, BEQC_DESC, ISA_MIPS32R6; 758*9880d681SAndroid Build Coastguard Workerdef BEQZALC : R6MMR6Rel, BEQZALC_ENC, BEQZALC_DESC, ISA_MIPS32R6; 759*9880d681SAndroid Build Coastguard Workerdef BEQZC : R6MMR6Rel, BEQZC_ENC, BEQZC_DESC, ISA_MIPS32R6; 760*9880d681SAndroid Build Coastguard Workerdef BGEC : R6MMR6Rel, BGEC_ENC, BGEC_DESC, ISA_MIPS32R6; 761*9880d681SAndroid Build Coastguard Workerdef BGEUC : R6MMR6Rel, BGEUC_ENC, BGEUC_DESC, ISA_MIPS32R6; 762*9880d681SAndroid Build Coastguard Workerdef BGEZALC : R6MMR6Rel, BGEZALC_ENC, BGEZALC_DESC, ISA_MIPS32R6; 763*9880d681SAndroid Build Coastguard Workerdef BGEZC : BGEZC_ENC, BGEZC_DESC, ISA_MIPS32R6; 764*9880d681SAndroid Build Coastguard Workerdef BGTZALC : R6MMR6Rel, BGTZALC_ENC, BGTZALC_DESC, ISA_MIPS32R6; 765*9880d681SAndroid Build Coastguard Workerdef BGTZC : BGTZC_ENC, BGTZC_DESC, ISA_MIPS32R6; 766*9880d681SAndroid Build Coastguard Workerdef BITSWAP : R6MMR6Rel, BITSWAP_ENC, BITSWAP_DESC, ISA_MIPS32R6; 767*9880d681SAndroid Build Coastguard Workerdef BLEZALC : R6MMR6Rel, BLEZALC_ENC, BLEZALC_DESC, ISA_MIPS32R6; 768*9880d681SAndroid Build Coastguard Workerdef BLEZC : BLEZC_ENC, BLEZC_DESC, ISA_MIPS32R6; 769*9880d681SAndroid Build Coastguard Workerdef BLTC : R6MMR6Rel, BLTC_ENC, BLTC_DESC, ISA_MIPS32R6; 770*9880d681SAndroid Build Coastguard Workerdef BLTUC : R6MMR6Rel, BLTUC_ENC, BLTUC_DESC, ISA_MIPS32R6; 771*9880d681SAndroid Build Coastguard Workerdef BLTZALC : R6MMR6Rel, BLTZALC_ENC, BLTZALC_DESC, ISA_MIPS32R6; 772*9880d681SAndroid Build Coastguard Workerdef BLTZC : BLTZC_ENC, BLTZC_DESC, ISA_MIPS32R6; 773*9880d681SAndroid Build Coastguard Workerdef BNEC : R6MMR6Rel, BNEC_ENC, BNEC_DESC, ISA_MIPS32R6; 774*9880d681SAndroid Build Coastguard Workerdef BNEZALC : R6MMR6Rel, BNEZALC_ENC, BNEZALC_DESC, ISA_MIPS32R6; 775*9880d681SAndroid Build Coastguard Workerdef BNEZC : R6MMR6Rel, BNEZC_ENC, BNEZC_DESC, ISA_MIPS32R6; 776*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 777*9880d681SAndroid Build Coastguard Worker def BNVC : R6MMR6Rel, BNVC_ENC, BNVC_DESC, ISA_MIPS32R6; 778*9880d681SAndroid Build Coastguard Worker def BOVC : R6MMR6Rel, BOVC_ENC, BOVC_DESC, ISA_MIPS32R6; 779*9880d681SAndroid Build Coastguard Worker} 780*9880d681SAndroid Build Coastguard Workerdef CACHE_R6 : R6MMR6Rel, CACHE_ENC, CACHE_DESC, ISA_MIPS32R6; 781*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 782*9880d681SAndroid Build Coastguard Worker def CLASS_D : CLASS_D_ENC, CLASS_D_DESC, ISA_MIPS32R6, HARDFLOAT; 783*9880d681SAndroid Build Coastguard Worker def CLASS_S : CLASS_S_ENC, CLASS_S_DESC, ISA_MIPS32R6, HARDFLOAT; 784*9880d681SAndroid Build Coastguard Worker} 785*9880d681SAndroid Build Coastguard Workerdef CLO_R6 : R6MMR6Rel, CLO_R6_ENC, CLO_R6_DESC, ISA_MIPS32R6; 786*9880d681SAndroid Build Coastguard Workerdef CLZ_R6 : R6MMR6Rel, CLZ_R6_ENC, CLZ_R6_DESC, ISA_MIPS32R6; 787*9880d681SAndroid Build Coastguard Workerdefm S : CMP_CC_M<FIELD_CMP_FORMAT_S, "s", FGR32Opnd>; 788*9880d681SAndroid Build Coastguard Workerdefm D : CMP_CC_M<FIELD_CMP_FORMAT_D, "d", FGR64Opnd>; 789*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 790*9880d681SAndroid Build Coastguard Worker def DIV : R6MMR6Rel, DIV_ENC, DIV_DESC, ISA_MIPS32R6; 791*9880d681SAndroid Build Coastguard Worker def DIVU : R6MMR6Rel, DIVU_ENC, DIVU_DESC, ISA_MIPS32R6; 792*9880d681SAndroid Build Coastguard Worker} 793*9880d681SAndroid Build Coastguard Workerdef JIALC : R6MMR6Rel, JIALC_ENC, JIALC_DESC, ISA_MIPS32R6; 794*9880d681SAndroid Build Coastguard Workerdef JIC : R6MMR6Rel, JIC_ENC, JIC_DESC, ISA_MIPS32R6; 795*9880d681SAndroid Build Coastguard Workerdef JR_HB_R6 : JR_HB_R6_ENC, JR_HB_R6_DESC, ISA_MIPS32R6; 796*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 797*9880d681SAndroid Build Coastguard Worker def LDC2_R6 : LDC2_R6_ENC, LDC2_R6_DESC, ISA_MIPS32R6; 798*9880d681SAndroid Build Coastguard Worker def LL_R6 : LL_R6_ENC, LL_R6_DESC, PTR_32, ISA_MIPS32R6; 799*9880d681SAndroid Build Coastguard Worker} 800*9880d681SAndroid Build Coastguard Workerdef LSA_R6 : R6MMR6Rel, LSA_R6_ENC, LSA_R6_DESC, ISA_MIPS32R6; 801*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 802*9880d681SAndroid Build Coastguard Worker def LWC2_R6 : LWC2_R6_ENC, LWC2_R6_DESC, ISA_MIPS32R6; 803*9880d681SAndroid Build Coastguard Worker} 804*9880d681SAndroid Build Coastguard Workerdef LWPC : R6MMR6Rel, LWPC_ENC, LWPC_DESC, ISA_MIPS32R6; 805*9880d681SAndroid Build Coastguard Workerdef LWUPC : LWUPC_ENC, LWUPC_DESC, ISA_MIPS32R6; 806*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 807*9880d681SAndroid Build Coastguard Worker def MADDF_S : MADDF_S_ENC, MADDF_S_DESC, ISA_MIPS32R6, HARDFLOAT; 808*9880d681SAndroid Build Coastguard Worker def MADDF_D : MADDF_D_ENC, MADDF_D_DESC, ISA_MIPS32R6, HARDFLOAT; 809*9880d681SAndroid Build Coastguard Worker def MAXA_D : MAXA_D_ENC, MAXA_D_DESC, ISA_MIPS32R6, HARDFLOAT; 810*9880d681SAndroid Build Coastguard Worker def MAXA_S : MAXA_S_ENC, MAXA_S_DESC, ISA_MIPS32R6, HARDFLOAT; 811*9880d681SAndroid Build Coastguard Worker def MAX_D : MAX_D_ENC, MAX_D_DESC, ISA_MIPS32R6, HARDFLOAT; 812*9880d681SAndroid Build Coastguard Worker def MAX_S : MAX_S_ENC, MAX_S_DESC, ISA_MIPS32R6, HARDFLOAT; 813*9880d681SAndroid Build Coastguard Worker def MINA_D : MINA_D_ENC, MINA_D_DESC, ISA_MIPS32R6, HARDFLOAT; 814*9880d681SAndroid Build Coastguard Worker def MINA_S : MINA_S_ENC, MINA_S_DESC, ISA_MIPS32R6, HARDFLOAT; 815*9880d681SAndroid Build Coastguard Worker def MIN_D : MIN_D_ENC, MIN_D_DESC, ISA_MIPS32R6, HARDFLOAT; 816*9880d681SAndroid Build Coastguard Worker def MIN_S : MIN_S_ENC, MIN_S_DESC, ISA_MIPS32R6, HARDFLOAT; 817*9880d681SAndroid Build Coastguard Worker 818*9880d681SAndroid Build Coastguard Worker def MOD : R6MMR6Rel, MOD_ENC, MOD_DESC, ISA_MIPS32R6; 819*9880d681SAndroid Build Coastguard Worker def MODU : R6MMR6Rel, MODU_ENC, MODU_DESC, ISA_MIPS32R6; 820*9880d681SAndroid Build Coastguard Worker 821*9880d681SAndroid Build Coastguard Worker def MSUBF_S : MSUBF_S_ENC, MSUBF_S_DESC, ISA_MIPS32R6, HARDFLOAT; 822*9880d681SAndroid Build Coastguard Worker def MSUBF_D : MSUBF_D_ENC, MSUBF_D_DESC, ISA_MIPS32R6, HARDFLOAT; 823*9880d681SAndroid Build Coastguard Worker 824*9880d681SAndroid Build Coastguard Worker def MUH : R6MMR6Rel, MUH_ENC, MUH_DESC, ISA_MIPS32R6; 825*9880d681SAndroid Build Coastguard Worker def MUHU : R6MMR6Rel, MUHU_ENC, MUHU_DESC, ISA_MIPS32R6; 826*9880d681SAndroid Build Coastguard Worker def MUL_R6 : R6MMR6Rel, MUL_R6_ENC, MUL_R6_DESC, ISA_MIPS32R6; 827*9880d681SAndroid Build Coastguard Worker def MULU : R6MMR6Rel, MULU_ENC, MULU_DESC, ISA_MIPS32R6; 828*9880d681SAndroid Build Coastguard Worker} 829*9880d681SAndroid Build Coastguard Workerdef NAL; // BAL with rd=0 830*9880d681SAndroid Build Coastguard Workerdef PREF_R6 : R6MMR6Rel, PREF_ENC, PREF_DESC, ISA_MIPS32R6; 831*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 832*9880d681SAndroid Build Coastguard Worker def RINT_D : RINT_D_ENC, RINT_D_DESC, ISA_MIPS32R6, HARDFLOAT; 833*9880d681SAndroid Build Coastguard Worker def RINT_S : RINT_S_ENC, RINT_S_DESC, ISA_MIPS32R6, HARDFLOAT; 834*9880d681SAndroid Build Coastguard Worker def SC_R6 : SC_R6_ENC, SC_R6_DESC, PTR_32, ISA_MIPS32R6; 835*9880d681SAndroid Build Coastguard Worker def SDBBP_R6 : SDBBP_R6_ENC, SDBBP_R6_DESC, ISA_MIPS32R6; 836*9880d681SAndroid Build Coastguard Worker def SELEQZ : R6MMR6Rel, SELEQZ_ENC, SELEQZ_DESC, ISA_MIPS32R6, GPR_32; 837*9880d681SAndroid Build Coastguard Worker def SELNEZ : R6MMR6Rel, SELNEZ_ENC, SELNEZ_DESC, ISA_MIPS32R6, GPR_32; 838*9880d681SAndroid Build Coastguard Worker def SELEQZ_D : R6MMR6Rel, SELEQZ_D_ENC, SELEQZ_D_DESC, ISA_MIPS32R6, 839*9880d681SAndroid Build Coastguard Worker HARDFLOAT; 840*9880d681SAndroid Build Coastguard Worker def SELEQZ_S : R6MMR6Rel, SELEQZ_S_ENC, SELEQZ_S_DESC, ISA_MIPS32R6, 841*9880d681SAndroid Build Coastguard Worker HARDFLOAT; 842*9880d681SAndroid Build Coastguard Worker def SELNEZ_D : R6MMR6Rel, SELNEZ_D_ENC, SELNEZ_D_DESC, ISA_MIPS32R6, 843*9880d681SAndroid Build Coastguard Worker HARDFLOAT; 844*9880d681SAndroid Build Coastguard Worker def SELNEZ_S : R6MMR6Rel, SELNEZ_S_ENC, SELNEZ_S_DESC, ISA_MIPS32R6, 845*9880d681SAndroid Build Coastguard Worker HARDFLOAT; 846*9880d681SAndroid Build Coastguard Worker def SEL_D : R6MMR6Rel, SEL_D_ENC, SEL_D_DESC, ISA_MIPS32R6, HARDFLOAT; 847*9880d681SAndroid Build Coastguard Worker def SEL_S : R6MMR6Rel, SEL_S_ENC, SEL_S_DESC, ISA_MIPS32R6, HARDFLOAT; 848*9880d681SAndroid Build Coastguard Worker def SDC2_R6 : SDC2_R6_ENC, SDC2_R6_DESC, ISA_MIPS32R6; 849*9880d681SAndroid Build Coastguard Worker def SWC2_R6 : SWC2_R6_ENC, SWC2_R6_DESC, ISA_MIPS32R6; 850*9880d681SAndroid Build Coastguard Worker} 851*9880d681SAndroid Build Coastguard Worker 852*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 853*9880d681SAndroid Build Coastguard Worker// 854*9880d681SAndroid Build Coastguard Worker// Instruction Aliases 855*9880d681SAndroid Build Coastguard Worker// 856*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 857*9880d681SAndroid Build Coastguard Worker 858*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 859*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"sdbbp", (SDBBP_R6 0)>, ISA_MIPS32R6; 860*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"jr $rs", (JALR ZERO, GPR32Opnd:$rs), 1>, ISA_MIPS32R6, GPR_32; 861*9880d681SAndroid Build Coastguard Worker} 862*9880d681SAndroid Build Coastguard Worker 863*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"jrc $rs", (JIC GPR32Opnd:$rs, 0), 1>, ISA_MIPS32R6, GPR_32; 864*9880d681SAndroid Build Coastguard Worker 865*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 866*9880d681SAndroid Build Coastguard Workerdef : MipsInstAlias<"jalrc $rs", (JIALC GPR32Opnd:$rs, 0), 1>, ISA_MIPS32R6, GPR_32; 867*9880d681SAndroid Build Coastguard Worker} 868*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 869*9880d681SAndroid Build Coastguard Worker// 870*9880d681SAndroid Build Coastguard Worker// Patterns and Pseudo Instructions 871*9880d681SAndroid Build Coastguard Worker// 872*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 873*9880d681SAndroid Build Coastguard Worker 874*9880d681SAndroid Build Coastguard Worker// comparisons supported via another comparison 875*9880d681SAndroid Build Coastguard Workermulticlass Cmp_Pats<ValueType VT, Instruction NOROp, Register ZEROReg> { 876*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setone VT:$lhs, VT:$rhs), 877*9880d681SAndroid Build Coastguard Worker (NOROp (!cast<Instruction>("CMP_UEQ_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>; 878*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(seto VT:$lhs, VT:$rhs), 879*9880d681SAndroid Build Coastguard Worker (NOROp (!cast<Instruction>("CMP_UN_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>; 880*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setune VT:$lhs, VT:$rhs), 881*9880d681SAndroid Build Coastguard Worker (NOROp (!cast<Instruction>("CMP_EQ_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>; 882*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(seteq VT:$lhs, VT:$rhs), 883*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("CMP_EQ_"#NAME) VT:$lhs, VT:$rhs)>; 884*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setgt VT:$lhs, VT:$rhs), 885*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("CMP_LE_"#NAME) VT:$rhs, VT:$lhs)>; 886*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setge VT:$lhs, VT:$rhs), 887*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("CMP_LT_"#NAME) VT:$rhs, VT:$lhs)>; 888*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setlt VT:$lhs, VT:$rhs), 889*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("CMP_LT_"#NAME) VT:$lhs, VT:$rhs)>; 890*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setle VT:$lhs, VT:$rhs), 891*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>("CMP_LE_"#NAME) VT:$lhs, VT:$rhs)>; 892*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(setne VT:$lhs, VT:$rhs), 893*9880d681SAndroid Build Coastguard Worker (NOROp (!cast<Instruction>("CMP_EQ_"#NAME) VT:$lhs, VT:$rhs), ZEROReg)>; 894*9880d681SAndroid Build Coastguard Worker} 895*9880d681SAndroid Build Coastguard Worker 896*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 897*9880d681SAndroid Build Coastguard Worker defm S : Cmp_Pats<f32, NOR, ZERO>, ISA_MIPS32R6; 898*9880d681SAndroid Build Coastguard Worker defm D : Cmp_Pats<f64, NOR, ZERO>, ISA_MIPS32R6; 899*9880d681SAndroid Build Coastguard Worker} 900*9880d681SAndroid Build Coastguard Worker 901*9880d681SAndroid Build Coastguard Worker// i32 selects 902*9880d681SAndroid Build Coastguard Workermulticlass SelectInt_Pats<ValueType RC, Instruction OROp, Instruction XORiOp, 903*9880d681SAndroid Build Coastguard Worker Instruction SLTiOp, Instruction SLTiuOp, 904*9880d681SAndroid Build Coastguard Worker Instruction SELEQZOp, Instruction SELNEZOp, 905*9880d681SAndroid Build Coastguard Worker SDPatternOperator imm_type, ValueType Opg> { 906*9880d681SAndroid Build Coastguard Worker// reg, immz 907*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, immz)), RC:$t, RC:$f), 908*9880d681SAndroid Build Coastguard Worker (OROp (SELEQZOp RC:$t, RC:$cond), (SELNEZOp RC:$f, RC:$cond))>; 909*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, immz)), RC:$t, RC:$f), 910*9880d681SAndroid Build Coastguard Worker (OROp (SELNEZOp RC:$t, RC:$cond), (SELEQZOp RC:$f, RC:$cond))>; 911*9880d681SAndroid Build Coastguard Worker 912*9880d681SAndroid Build Coastguard Worker// reg, immZExt16[_64] 913*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, imm_type:$imm)), RC:$t, RC:$f), 914*9880d681SAndroid Build Coastguard Worker (OROp (SELEQZOp RC:$t, (XORiOp RC:$cond, imm_type:$imm)), 915*9880d681SAndroid Build Coastguard Worker (SELNEZOp RC:$f, (XORiOp RC:$cond, imm_type:$imm)))>; 916*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, imm_type:$imm)), RC:$t, RC:$f), 917*9880d681SAndroid Build Coastguard Worker (OROp (SELNEZOp RC:$t, (XORiOp RC:$cond, imm_type:$imm)), 918*9880d681SAndroid Build Coastguard Worker (SELEQZOp RC:$f, (XORiOp RC:$cond, imm_type:$imm)))>; 919*9880d681SAndroid Build Coastguard Worker 920*9880d681SAndroid Build Coastguard Worker// reg, immSExt16Plus1 921*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setgt RC:$cond, immSExt16Plus1:$imm)), RC:$t, RC:$f), 922*9880d681SAndroid Build Coastguard Worker (OROp (SELEQZOp RC:$t, (SLTiOp RC:$cond, (Plus1 imm:$imm))), 923*9880d681SAndroid Build Coastguard Worker (SELNEZOp RC:$f, (SLTiOp RC:$cond, (Plus1 imm:$imm))))>; 924*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setugt RC:$cond, immSExt16Plus1:$imm)), RC:$t, RC:$f), 925*9880d681SAndroid Build Coastguard Worker (OROp (SELEQZOp RC:$t, (SLTiuOp RC:$cond, (Plus1 imm:$imm))), 926*9880d681SAndroid Build Coastguard Worker (SELNEZOp RC:$f, (SLTiuOp RC:$cond, (Plus1 imm:$imm))))>; 927*9880d681SAndroid Build Coastguard Worker 928*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, immz)), RC:$t, immz), 929*9880d681SAndroid Build Coastguard Worker (SELEQZOp RC:$t, RC:$cond)>; 930*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, immz)), RC:$t, immz), 931*9880d681SAndroid Build Coastguard Worker (SELNEZOp RC:$t, RC:$cond)>; 932*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (seteq RC:$cond, immz)), immz, RC:$f), 933*9880d681SAndroid Build Coastguard Worker (SELNEZOp RC:$f, RC:$cond)>; 934*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select (Opg (setne RC:$cond, immz)), immz, RC:$f), 935*9880d681SAndroid Build Coastguard Worker (SELEQZOp RC:$f, RC:$cond)>; 936*9880d681SAndroid Build Coastguard Worker} 937*9880d681SAndroid Build Coastguard Worker 938*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 939*9880d681SAndroid Build Coastguard Workerdefm : SelectInt_Pats<i32, OR, XORi, SLTi, SLTiu, SELEQZ, SELNEZ, 940*9880d681SAndroid Build Coastguard Worker immZExt16, i32>, ISA_MIPS32R6; 941*9880d681SAndroid Build Coastguard Worker 942*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select i32:$cond, i32:$t, i32:$f), 943*9880d681SAndroid Build Coastguard Worker (OR (SELNEZ i32:$t, i32:$cond), 944*9880d681SAndroid Build Coastguard Worker (SELEQZ i32:$f, i32:$cond))>, 945*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6; 946*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select i32:$cond, i32:$t, immz), 947*9880d681SAndroid Build Coastguard Worker (SELNEZ i32:$t, i32:$cond)>, 948*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6; 949*9880d681SAndroid Build Coastguard Workerdef : MipsPat<(select i32:$cond, immz, i32:$f), 950*9880d681SAndroid Build Coastguard Worker (SELEQZ i32:$f, i32:$cond)>, 951*9880d681SAndroid Build Coastguard Worker ISA_MIPS32R6; 952*9880d681SAndroid Build Coastguard Worker} 953