1*9880d681SAndroid Build Coastguard Worker//=- Mips32r6InstrFormats.td - Mips32r6 Instruction Formats -*- 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 instruction formats. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerclass R6MMR6Rel; 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdef MipsR62MicroMipsR6 : InstrMapping { 17*9880d681SAndroid Build Coastguard Worker let FilterClass = "R6MMR6Rel"; 18*9880d681SAndroid Build Coastguard Worker // Instructions with the same BaseOpcode and isNVStore values form a row. 19*9880d681SAndroid Build Coastguard Worker let RowFields = ["BaseOpcode"]; 20*9880d681SAndroid Build Coastguard Worker // Instructions with the same predicate sense form a column. 21*9880d681SAndroid Build Coastguard Worker let ColFields = ["Arch"]; 22*9880d681SAndroid Build Coastguard Worker // The key column is the unpredicated instructions. 23*9880d681SAndroid Build Coastguard Worker let KeyCol = ["mipsr6"]; 24*9880d681SAndroid Build Coastguard Worker // Value columns are PredSense=true and PredSense=false 25*9880d681SAndroid Build Coastguard Worker let ValueCols = [["mipsr6"], ["micromipsr6"]]; 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerclass MipsR6Arch<string opstr> { 29*9880d681SAndroid Build Coastguard Worker string Arch = "mipsr6"; 30*9880d681SAndroid Build Coastguard Worker string BaseOpcode = opstr; 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerclass MipsR6Inst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther>, 34*9880d681SAndroid Build Coastguard Worker PredicateControl { 35*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "Mips32r6_64r6"; 36*9880d681SAndroid Build Coastguard Worker let EncodingPredicates = [HasStdEnc]; 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 40*9880d681SAndroid Build Coastguard Worker// 41*9880d681SAndroid Build Coastguard Worker// Field Values 42*9880d681SAndroid Build Coastguard Worker// 43*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerclass OPGROUP<bits<6> Val> { 46*9880d681SAndroid Build Coastguard Worker bits<6> Value = Val; 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Workerdef OPGROUP_COP1 : OPGROUP<0b010001>; 49*9880d681SAndroid Build Coastguard Workerdef OPGROUP_COP2 : OPGROUP<0b010010>; 50*9880d681SAndroid Build Coastguard Workerdef OPGROUP_ADDI : OPGROUP<0b001000>; 51*9880d681SAndroid Build Coastguard Workerdef OPGROUP_AUI : OPGROUP<0b001111>; 52*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BLEZ : OPGROUP<0b000110>; 53*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BGTZ : OPGROUP<0b000111>; 54*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BLEZL : OPGROUP<0b010110>; 55*9880d681SAndroid Build Coastguard Workerdef OPGROUP_BGTZL : OPGROUP<0b010111>; 56*9880d681SAndroid Build Coastguard Workerdef OPGROUP_DADDI : OPGROUP<0b011000>; 57*9880d681SAndroid Build Coastguard Workerdef OPGROUP_DAUI : OPGROUP<0b011101>; 58*9880d681SAndroid Build Coastguard Workerdef OPGROUP_PCREL : OPGROUP<0b111011>; 59*9880d681SAndroid Build Coastguard Workerdef OPGROUP_REGIMM : OPGROUP<0b000001>; 60*9880d681SAndroid Build Coastguard Workerdef OPGROUP_SPECIAL : OPGROUP<0b000000>; 61*9880d681SAndroid Build Coastguard Worker// The spec occasionally names this value LL, LLD, SC, or SCD. 62*9880d681SAndroid Build Coastguard Workerdef OPGROUP_SPECIAL3 : OPGROUP<0b011111>; 63*9880d681SAndroid Build Coastguard Worker// The spec names this constant LWC2, LDC2, SWC2, and SDC2 in different places. 64*9880d681SAndroid Build Coastguard Workerdef OPGROUP_COP2LDST : OPGROUP<0b010010>; 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerclass OPCODE2<bits<2> Val> { 67*9880d681SAndroid Build Coastguard Worker bits<2> Value = Val; 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Workerdef OPCODE2_ADDIUPC : OPCODE2<0b00>; 70*9880d681SAndroid Build Coastguard Workerdef OPCODE2_LWPC : OPCODE2<0b01>; 71*9880d681SAndroid Build Coastguard Workerdef OPCODE2_LWUPC : OPCODE2<0b10>; 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerclass OPCODE3<bits<3> Val> { 74*9880d681SAndroid Build Coastguard Worker bits<3> Value = Val; 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Workerdef OPCODE3_LDPC : OPCODE3<0b110>; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerclass OPCODE5<bits<5> Val> { 79*9880d681SAndroid Build Coastguard Worker bits<5> Value = Val; 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Workerdef OPCODE5_ALUIPC : OPCODE5<0b11111>; 82*9880d681SAndroid Build Coastguard Workerdef OPCODE5_AUIPC : OPCODE5<0b11110>; 83*9880d681SAndroid Build Coastguard Workerdef OPCODE5_DAHI : OPCODE5<0b00110>; 84*9880d681SAndroid Build Coastguard Workerdef OPCODE5_DATI : OPCODE5<0b11110>; 85*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC1EQZ : OPCODE5<0b01001>; 86*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC1NEZ : OPCODE5<0b01101>; 87*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC2EQZ : OPCODE5<0b01001>; 88*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BC2NEZ : OPCODE5<0b01101>; 89*9880d681SAndroid Build Coastguard Workerdef OPCODE5_BGEZAL : OPCODE5<0b10001>; 90*9880d681SAndroid Build Coastguard Worker// The next four constants are unnamed in the spec. These names are taken from 91*9880d681SAndroid Build Coastguard Worker// the OPGROUP names they are used with. 92*9880d681SAndroid Build Coastguard Workerdef OPCODE5_LDC2 : OPCODE5<0b01110>; 93*9880d681SAndroid Build Coastguard Workerdef OPCODE5_LWC2 : OPCODE5<0b01010>; 94*9880d681SAndroid Build Coastguard Workerdef OPCODE5_SDC2 : OPCODE5<0b01111>; 95*9880d681SAndroid Build Coastguard Workerdef OPCODE5_SWC2 : OPCODE5<0b01011>; 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerclass OPCODE6<bits<6> Val> { 98*9880d681SAndroid Build Coastguard Worker bits<6> Value = Val; 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Workerdef OPCODE6_ALIGN : OPCODE6<0b100000>; 101*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DALIGN : OPCODE6<0b100100>; 102*9880d681SAndroid Build Coastguard Workerdef OPCODE6_BITSWAP : OPCODE6<0b100000>; 103*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DBITSWAP : OPCODE6<0b100100>; 104*9880d681SAndroid Build Coastguard Workerdef OPCODE6_JALR : OPCODE6<0b001001>; 105*9880d681SAndroid Build Coastguard Workerdef OPCODE6_CACHE : OPCODE6<0b100101>; 106*9880d681SAndroid Build Coastguard Workerdef OPCODE6_PREF : OPCODE6<0b110101>; 107*9880d681SAndroid Build Coastguard Worker// The next four constants are unnamed in the spec. These names are taken from 108*9880d681SAndroid Build Coastguard Worker// the OPGROUP names they are used with. 109*9880d681SAndroid Build Coastguard Workerdef OPCODE6_LL : OPCODE6<0b110110>; 110*9880d681SAndroid Build Coastguard Workerdef OPCODE6_LLD : OPCODE6<0b110111>; 111*9880d681SAndroid Build Coastguard Workerdef OPCODE6_SC : OPCODE6<0b100110>; 112*9880d681SAndroid Build Coastguard Workerdef OPCODE6_SCD : OPCODE6<0b100111>; 113*9880d681SAndroid Build Coastguard Workerdef OPCODE6_CLO : OPCODE6<0b010001>; 114*9880d681SAndroid Build Coastguard Workerdef OPCODE6_CLZ : OPCODE6<0b010000>; 115*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DCLO : OPCODE6<0b010011>; 116*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DCLZ : OPCODE6<0b010010>; 117*9880d681SAndroid Build Coastguard Workerdef OPCODE6_LSA : OPCODE6<0b000101>; 118*9880d681SAndroid Build Coastguard Workerdef OPCODE6_DLSA : OPCODE6<0b010101>; 119*9880d681SAndroid Build Coastguard Workerdef OPCODE6_SDBBP : OPCODE6<0b001110>; 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerclass FIELD_FMT<bits<5> Val> { 122*9880d681SAndroid Build Coastguard Worker bits<5> Value = Val; 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Workerdef FIELD_FMT_S : FIELD_FMT<0b10000>; 125*9880d681SAndroid Build Coastguard Workerdef FIELD_FMT_D : FIELD_FMT<0b10001>; 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerclass FIELD_CMP_COND<bits<5> Val> { 128*9880d681SAndroid Build Coastguard Worker bits<5> Value = Val; 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker// Note: The CMP_COND_FMT names differ from the C_COND_FMT names. 131*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_AF : FIELD_CMP_COND<0b00000>; 132*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_UN : FIELD_CMP_COND<0b00001>; 133*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_EQ : FIELD_CMP_COND<0b00010>; 134*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_UEQ : FIELD_CMP_COND<0b00011>; 135*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_LT : FIELD_CMP_COND<0b00100>; 136*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_ULT : FIELD_CMP_COND<0b00101>; 137*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_LE : FIELD_CMP_COND<0b00110>; 138*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_ULE : FIELD_CMP_COND<0b00111>; 139*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SAF : FIELD_CMP_COND<0b01000>; 140*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SUN : FIELD_CMP_COND<0b01001>; 141*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SEQ : FIELD_CMP_COND<0b01010>; 142*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SUEQ : FIELD_CMP_COND<0b01011>; 143*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SLT : FIELD_CMP_COND<0b01100>; 144*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SULT : FIELD_CMP_COND<0b01101>; 145*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SLE : FIELD_CMP_COND<0b01110>; 146*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_COND_SULE : FIELD_CMP_COND<0b01111>; 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerclass FIELD_CMP_FORMAT<bits<5> Val> { 149*9880d681SAndroid Build Coastguard Worker bits<5> Value = Val; 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_FORMAT_S : FIELD_CMP_FORMAT<0b10100>; 152*9880d681SAndroid Build Coastguard Workerdef FIELD_CMP_FORMAT_D : FIELD_CMP_FORMAT<0b10101>; 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 155*9880d681SAndroid Build Coastguard Worker// 156*9880d681SAndroid Build Coastguard Worker// Disambiguators 157*9880d681SAndroid Build Coastguard Worker// 158*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 159*9880d681SAndroid Build Coastguard Worker// 160*9880d681SAndroid Build Coastguard Worker// Some encodings are ambiguous except by comparing field values. 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerclass DecodeDisambiguates<string Name> { 163*9880d681SAndroid Build Coastguard Worker string DecoderMethod = !strconcat("Decode", Name); 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerclass DecodeDisambiguatedBy<string Name> : DecodeDisambiguates<Name> { 167*9880d681SAndroid Build Coastguard Worker string DecoderNamespace = "Mips32r6_64r6_Ambiguous"; 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 171*9880d681SAndroid Build Coastguard Worker// 172*9880d681SAndroid Build Coastguard Worker// Encoding Formats 173*9880d681SAndroid Build Coastguard Worker// 174*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerclass AUI_FM : MipsR6Inst { 177*9880d681SAndroid Build Coastguard Worker bits<5> rs; 178*9880d681SAndroid Build Coastguard Worker bits<5> rt; 179*9880d681SAndroid Build Coastguard Worker bits<16> imm; 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_AUI.Value; 184*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 185*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 186*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = imm; 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerclass DAUI_FM : AUI_FM { 190*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_DAUI.Value; 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerclass BAL_FM : MipsR6Inst { 194*9880d681SAndroid Build Coastguard Worker bits<16> offset; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_REGIMM.Value; 199*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = 0b00000; 200*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = OPCODE5_BGEZAL.Value; 201*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerclass COP1_2R_FM<bits<6> funct, FIELD_FMT Format> : MipsR6Inst { 205*9880d681SAndroid Build Coastguard Worker bits<5> fs; 206*9880d681SAndroid Build Coastguard Worker bits<5> fd; 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_COP1.Value; 211*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = Format.Value; 212*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 213*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = fs; 214*9880d681SAndroid Build Coastguard Worker let Inst{10-6} = fd; 215*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = funct; 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerclass COP1_3R_FM<bits<6> funct, FIELD_FMT Format> : MipsR6Inst { 219*9880d681SAndroid Build Coastguard Worker bits<5> ft; 220*9880d681SAndroid Build Coastguard Worker bits<5> fs; 221*9880d681SAndroid Build Coastguard Worker bits<5> fd; 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_COP1.Value; 226*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = Format.Value; 227*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = ft; 228*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = fs; 229*9880d681SAndroid Build Coastguard Worker let Inst{10-6} = fd; 230*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = funct; 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerclass COP1_BCCZ_FM<OPCODE5 Operation> : MipsR6Inst { 234*9880d681SAndroid Build Coastguard Worker bits<5> ft; 235*9880d681SAndroid Build Coastguard Worker bits<16> offset; 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_COP1.Value; 240*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = Operation.Value; 241*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = ft; 242*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerclass COP2_BCCZ_FM<OPCODE5 Operation> : MipsR6Inst { 246*9880d681SAndroid Build Coastguard Worker bits<5> ct; 247*9880d681SAndroid Build Coastguard Worker bits<16> offset; 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_COP2.Value; 252*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = Operation.Value; 253*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = ct; 254*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerclass PCREL16_FM<OPCODE5 Operation> : MipsR6Inst { 258*9880d681SAndroid Build Coastguard Worker bits<5> rs; 259*9880d681SAndroid Build Coastguard Worker bits<16> imm; 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_PCREL.Value; 264*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 265*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Operation.Value; 266*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = imm; 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerclass PCREL19_FM<OPCODE2 Operation> : MipsR6Inst { 270*9880d681SAndroid Build Coastguard Worker bits<5> rs; 271*9880d681SAndroid Build Coastguard Worker bits<19> imm; 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_PCREL.Value; 276*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 277*9880d681SAndroid Build Coastguard Worker let Inst{20-19} = Operation.Value; 278*9880d681SAndroid Build Coastguard Worker let Inst{18-0} = imm; 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerclass PCREL18_FM<OPCODE3 Operation> : MipsR6Inst { 282*9880d681SAndroid Build Coastguard Worker bits<5> rs; 283*9880d681SAndroid Build Coastguard Worker bits<18> imm; 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_PCREL.Value; 288*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 289*9880d681SAndroid Build Coastguard Worker let Inst{20-18} = Operation.Value; 290*9880d681SAndroid Build Coastguard Worker let Inst{17-0} = imm; 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_2R_FM<OPCODE6 Operation> : MipsR6Inst { 294*9880d681SAndroid Build Coastguard Worker bits<5> rd; 295*9880d681SAndroid Build Coastguard Worker bits<5> rt; 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL3.Value; 300*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = 0b00000; 301*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 302*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = rd; 303*9880d681SAndroid Build Coastguard Worker let Inst{10-6} = 0b00000; 304*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_MEM_FM<OPCODE6 Operation> : MipsR6Inst { 308*9880d681SAndroid Build Coastguard Worker bits<21> addr; 309*9880d681SAndroid Build Coastguard Worker bits<5> hint; 310*9880d681SAndroid Build Coastguard Worker bits<5> base = addr{20-16}; 311*9880d681SAndroid Build Coastguard Worker bits<9> offset = addr{8-0}; 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL3.Value; 316*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = base; 317*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = hint; 318*9880d681SAndroid Build Coastguard Worker let Inst{15-7} = offset; 319*9880d681SAndroid Build Coastguard Worker let Inst{6} = 0; 320*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 321*9880d681SAndroid Build Coastguard Worker} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Workerclass SPECIAL_2R_FM<OPCODE6 Operation> : MipsR6Inst { 324*9880d681SAndroid Build Coastguard Worker bits<5> rd; 325*9880d681SAndroid Build Coastguard Worker bits<5> rs; 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL.Value; 330*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 331*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0b00000; 332*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = rd; 333*9880d681SAndroid Build Coastguard Worker let Inst{10-6} = 0b00001; 334*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 335*9880d681SAndroid Build Coastguard Worker} 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Workerclass SPECIAL_3R_FM<bits<5> mulop, bits<6> funct> : MipsR6Inst { 338*9880d681SAndroid Build Coastguard Worker bits<5> rd; 339*9880d681SAndroid Build Coastguard Worker bits<5> rs; 340*9880d681SAndroid Build Coastguard Worker bits<5> rt; 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL.Value; 345*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 346*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 347*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = rd; 348*9880d681SAndroid Build Coastguard Worker let Inst{10-6} = mulop; 349*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = funct; 350*9880d681SAndroid Build Coastguard Worker} 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Workerclass SPECIAL_SDBBP_FM : MipsR6Inst { 353*9880d681SAndroid Build Coastguard Worker bits<20> code_; 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL.Value; 358*9880d681SAndroid Build Coastguard Worker let Inst{25-6} = code_; 359*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = OPCODE6_SDBBP.Value; 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Worker// This class is ambiguous with other branches: 363*9880d681SAndroid Build Coastguard Worker// BEQC/BNEC require that rs < rt && rs != 0 364*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_2R_OFF16_FM<OPGROUP funct> : MipsR6Inst { 365*9880d681SAndroid Build Coastguard Worker bits<5> rs; 366*9880d681SAndroid Build Coastguard Worker bits<5> rt; 367*9880d681SAndroid Build Coastguard Worker bits<16> offset; 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = funct.Value; 372*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 373*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 374*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 375*9880d681SAndroid Build Coastguard Worker} 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Worker// This class is ambiguous with other branches: 378*9880d681SAndroid Build Coastguard Worker// BLEZC/BGEZC/BEQZALC/BNEZALC/BGTZALC require that rs == 0 && rt != 0 379*9880d681SAndroid Build Coastguard Worker// The '1R_RT' in the name means 1 register in the rt field. 380*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_1R_RT_OFF16_FM<OPGROUP funct> : MipsR6Inst { 381*9880d681SAndroid Build Coastguard Worker bits<5> rt; 382*9880d681SAndroid Build Coastguard Worker bits<16> offset; 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = funct.Value; 387*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = 0b00000; 388*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 389*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 390*9880d681SAndroid Build Coastguard Worker} 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker// This class is ambiguous with other branches: 393*9880d681SAndroid Build Coastguard Worker// BLTZC/BGTZC/BLTZALC/BGEZALC require that rs == rt && rt != 0 394*9880d681SAndroid Build Coastguard Worker// The '1R_BOTH' in the name means 1 register in both the rs and rt fields. 395*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_1R_BOTH_OFF16_FM<OPGROUP funct> : MipsR6Inst { 396*9880d681SAndroid Build Coastguard Worker bits<5> rt; 397*9880d681SAndroid Build Coastguard Worker bits<16> offset; 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = funct.Value; 402*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rt; 403*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 404*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 405*9880d681SAndroid Build Coastguard Worker} 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Workerclass CMP_BRANCH_OFF21_FM<bits<6> funct> : MipsR6Inst { 408*9880d681SAndroid Build Coastguard Worker bits<5> rs; // rs != 0 409*9880d681SAndroid Build Coastguard Worker bits<21> offset; 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = funct; 414*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 415*9880d681SAndroid Build Coastguard Worker let Inst{20-0} = offset; 416*9880d681SAndroid Build Coastguard Worker} 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Workerclass JMP_IDX_COMPACT_FM<bits<6> funct> : MipsR6Inst { 419*9880d681SAndroid Build Coastguard Worker bits<5> rt; 420*9880d681SAndroid Build Coastguard Worker bits<16> offset; 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = funct; 425*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = 0b00000; 426*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 427*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = offset; 428*9880d681SAndroid Build Coastguard Worker} 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Workerclass BRANCH_OFF26_FM<bits<6> funct> : MipsR6Inst { 431*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 432*9880d681SAndroid Build Coastguard Worker bits<26> offset; 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = funct; 435*9880d681SAndroid Build Coastguard Worker let Inst{25-0} = offset; 436*9880d681SAndroid Build Coastguard Worker} 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_ALIGN_FM<OPCODE6 Operation> : MipsR6Inst { 439*9880d681SAndroid Build Coastguard Worker bits<5> rd; 440*9880d681SAndroid Build Coastguard Worker bits<5> rs; 441*9880d681SAndroid Build Coastguard Worker bits<5> rt; 442*9880d681SAndroid Build Coastguard Worker bits<2> bp; 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 445*9880d681SAndroid Build Coastguard Worker 446*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL3.Value; 447*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 448*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 449*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = rd; 450*9880d681SAndroid Build Coastguard Worker let Inst{10-8} = 0b010; 451*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = bp; 452*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 453*9880d681SAndroid Build Coastguard Worker} 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_DALIGN_FM<OPCODE6 Operation> : MipsR6Inst { 456*9880d681SAndroid Build Coastguard Worker bits<5> rd; 457*9880d681SAndroid Build Coastguard Worker bits<5> rs; 458*9880d681SAndroid Build Coastguard Worker bits<5> rt; 459*9880d681SAndroid Build Coastguard Worker bits<3> bp; 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL3.Value; 464*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 465*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 466*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = rd; 467*9880d681SAndroid Build Coastguard Worker let Inst{10-9} = 0b01; 468*9880d681SAndroid Build Coastguard Worker let Inst{8-6} = bp; 469*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 470*9880d681SAndroid Build Coastguard Worker} 471*9880d681SAndroid Build Coastguard Worker 472*9880d681SAndroid Build Coastguard Workerclass SPECIAL3_LL_SC_FM<OPCODE6 Operation> : MipsR6Inst { 473*9880d681SAndroid Build Coastguard Worker bits<5> rt; 474*9880d681SAndroid Build Coastguard Worker bits<21> addr; 475*9880d681SAndroid Build Coastguard Worker bits<5> base = addr{20-16}; 476*9880d681SAndroid Build Coastguard Worker bits<9> offset = addr{8-0}; 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL3.Value; 481*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = base; 482*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 483*9880d681SAndroid Build Coastguard Worker let Inst{15-7} = offset; 484*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeSpecial3LlSc"; 487*9880d681SAndroid Build Coastguard Worker} 488*9880d681SAndroid Build Coastguard Worker 489*9880d681SAndroid Build Coastguard Workerclass SPECIAL_LSA_FM<OPCODE6 Operation> : MipsR6Inst { 490*9880d681SAndroid Build Coastguard Worker bits<5> rd; 491*9880d681SAndroid Build Coastguard Worker bits<5> rs; 492*9880d681SAndroid Build Coastguard Worker bits<5> rt; 493*9880d681SAndroid Build Coastguard Worker bits<2> imm2; 494*9880d681SAndroid Build Coastguard Worker 495*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL.Value; 498*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 499*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 500*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = rd; 501*9880d681SAndroid Build Coastguard Worker let Inst{10-8} = 0b000; 502*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = imm2; 503*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 504*9880d681SAndroid Build Coastguard Worker} 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Workerclass REGIMM_FM<OPCODE5 Operation> : MipsR6Inst { 507*9880d681SAndroid Build Coastguard Worker bits<5> rs; 508*9880d681SAndroid Build Coastguard Worker bits<16> imm; 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_REGIMM.Value; 513*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 514*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = Operation.Value; 515*9880d681SAndroid Build Coastguard Worker let Inst{15-0} = imm; 516*9880d681SAndroid Build Coastguard Worker} 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Workerclass COP1_CMP_CONDN_FM<FIELD_CMP_FORMAT Format, 519*9880d681SAndroid Build Coastguard Worker FIELD_CMP_COND Cond> : MipsR6Inst { 520*9880d681SAndroid Build Coastguard Worker bits<5> fd; 521*9880d681SAndroid Build Coastguard Worker bits<5> fs; 522*9880d681SAndroid Build Coastguard Worker bits<5> ft; 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_COP1.Value; 527*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = Format.Value; 528*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = ft; 529*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = fs; 530*9880d681SAndroid Build Coastguard Worker let Inst{10-6} = fd; 531*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 532*9880d681SAndroid Build Coastguard Worker let Inst{4-0} = Cond.Value; 533*9880d681SAndroid Build Coastguard Worker} 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Workerclass JR_HB_R6_FM<OPCODE6 Operation> : MipsR6Inst { 536*9880d681SAndroid Build Coastguard Worker bits<5> rs; 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_SPECIAL.Value; 541*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = rs; 542*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = 0; 543*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = 0; 544*9880d681SAndroid Build Coastguard Worker let Inst{10} = 1; 545*9880d681SAndroid Build Coastguard Worker let Inst{9-6} = 0; 546*9880d681SAndroid Build Coastguard Worker let Inst{5-0} = Operation.Value; 547*9880d681SAndroid Build Coastguard Worker} 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Workerclass COP2LDST_FM<OPCODE5 Operation> : MipsR6Inst { 550*9880d681SAndroid Build Coastguard Worker bits<5> rt; 551*9880d681SAndroid Build Coastguard Worker bits<21> addr; 552*9880d681SAndroid Build Coastguard Worker bits<5> base = addr{20-16}; 553*9880d681SAndroid Build Coastguard Worker bits<11> offset = addr{10-0}; 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Worker bits<32> Inst; 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Worker let Inst{31-26} = OPGROUP_COP2LDST.Value; 558*9880d681SAndroid Build Coastguard Worker let Inst{25-21} = Operation.Value; 559*9880d681SAndroid Build Coastguard Worker let Inst{20-16} = rt; 560*9880d681SAndroid Build Coastguard Worker let Inst{15-11} = base; 561*9880d681SAndroid Build Coastguard Worker let Inst{10-0} = offset; 562*9880d681SAndroid Build Coastguard Worker} 563