1*06c3fb27SDimitry Andric// LoongArchLASXInstrFormats.td - LoongArch LASX Instr Formats - tablegen -*-=// 2*06c3fb27SDimitry Andric// 3*06c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*06c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06c3fb27SDimitry Andric// 7*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 8*06c3fb27SDimitry Andric 9*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 10*06c3fb27SDimitry Andric// Describe LoongArch LASX instructions format 11*06c3fb27SDimitry Andric// 12*06c3fb27SDimitry Andric// opcode - operation code. 13*06c3fb27SDimitry Andric// xd/rd/cd - destination register operand. 14*06c3fb27SDimitry Andric// {r/x}{j/k} - source register operand. 15*06c3fb27SDimitry Andric// immN - immediate data operand. 16*06c3fb27SDimitry Andric// 17*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 18*06c3fb27SDimitry Andric 19*06c3fb27SDimitry Andric// 1RI13-type 20*06c3fb27SDimitry Andric// <opcode | I13 | xd> 21*06c3fb27SDimitry Andricclass Fmt1RI13_XI<bits<32> op, dag outs, dag ins, string opnstr, 22*06c3fb27SDimitry Andric list<dag> pattern = []> 23*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 24*06c3fb27SDimitry Andric bits<13> imm13; 25*06c3fb27SDimitry Andric bits<5> xd; 26*06c3fb27SDimitry Andric 27*06c3fb27SDimitry Andric let Inst{31-0} = op; 28*06c3fb27SDimitry Andric let Inst{17-5} = imm13; 29*06c3fb27SDimitry Andric let Inst{4-0} = xd; 30*06c3fb27SDimitry Andric} 31*06c3fb27SDimitry Andric 32*06c3fb27SDimitry Andric// 2R-type 33*06c3fb27SDimitry Andric// <opcode | xj | xd> 34*06c3fb27SDimitry Andricclass Fmt2R_XX<bits<32> op, dag outs, dag ins, string opnstr, 35*06c3fb27SDimitry Andric list<dag> pattern = []> 36*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 37*06c3fb27SDimitry Andric bits<5> xj; 38*06c3fb27SDimitry Andric bits<5> xd; 39*06c3fb27SDimitry Andric 40*06c3fb27SDimitry Andric let Inst{31-0} = op; 41*06c3fb27SDimitry Andric let Inst{9-5} = xj; 42*06c3fb27SDimitry Andric let Inst{4-0} = xd; 43*06c3fb27SDimitry Andric} 44*06c3fb27SDimitry Andric 45*06c3fb27SDimitry Andric// <opcode | rj | xd> 46*06c3fb27SDimitry Andricclass Fmt2R_XR<bits<32> op, dag outs, dag ins, string opnstr, 47*06c3fb27SDimitry Andric list<dag> pattern = []> 48*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 49*06c3fb27SDimitry Andric bits<5> rj; 50*06c3fb27SDimitry Andric bits<5> xd; 51*06c3fb27SDimitry Andric 52*06c3fb27SDimitry Andric let Inst{31-0} = op; 53*06c3fb27SDimitry Andric let Inst{9-5} = rj; 54*06c3fb27SDimitry Andric let Inst{4-0} = xd; 55*06c3fb27SDimitry Andric} 56*06c3fb27SDimitry Andric 57*06c3fb27SDimitry Andric// <opcode | xj | cd> 58*06c3fb27SDimitry Andricclass Fmt2R_CX<bits<32> op, dag outs, dag ins, string opnstr, 59*06c3fb27SDimitry Andric list<dag> pattern = []> 60*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 61*06c3fb27SDimitry Andric bits<5> xj; 62*06c3fb27SDimitry Andric bits<3> cd; 63*06c3fb27SDimitry Andric 64*06c3fb27SDimitry Andric let Inst{31-0} = op; 65*06c3fb27SDimitry Andric let Inst{9-5} = xj; 66*06c3fb27SDimitry Andric let Inst{2-0} = cd; 67*06c3fb27SDimitry Andric} 68*06c3fb27SDimitry Andric 69*06c3fb27SDimitry Andric// 2RI1-type 70*06c3fb27SDimitry Andric// <opcode | I1 | xj | xd> 71*06c3fb27SDimitry Andricclass Fmt2RI1_XXI<bits<32> op, dag outs, dag ins, string opnstr, 72*06c3fb27SDimitry Andric list<dag> pattern = []> 73*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 74*06c3fb27SDimitry Andric bits<1> imm1; 75*06c3fb27SDimitry Andric bits<5> xj; 76*06c3fb27SDimitry Andric bits<5> xd; 77*06c3fb27SDimitry Andric 78*06c3fb27SDimitry Andric let Inst{31-0} = op; 79*06c3fb27SDimitry Andric let Inst{10} = imm1; 80*06c3fb27SDimitry Andric let Inst{9-5} = xj; 81*06c3fb27SDimitry Andric let Inst{4-0} = xd; 82*06c3fb27SDimitry Andric} 83*06c3fb27SDimitry Andric 84*06c3fb27SDimitry Andric// 2RI2-type 85*06c3fb27SDimitry Andric// <opcode | I2 | xj | xd> 86*06c3fb27SDimitry Andricclass Fmt2RI2_XXI<bits<32> op, dag outs, dag ins, string opnstr, 87*06c3fb27SDimitry Andric list<dag> pattern = []> 88*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 89*06c3fb27SDimitry Andric bits<2> imm2; 90*06c3fb27SDimitry Andric bits<5> xj; 91*06c3fb27SDimitry Andric bits<5> xd; 92*06c3fb27SDimitry Andric 93*06c3fb27SDimitry Andric let Inst{31-0} = op; 94*06c3fb27SDimitry Andric let Inst{11-10} = imm2; 95*06c3fb27SDimitry Andric let Inst{9-5} = xj; 96*06c3fb27SDimitry Andric let Inst{4-0} = xd; 97*06c3fb27SDimitry Andric} 98*06c3fb27SDimitry Andric 99*06c3fb27SDimitry Andric// <opcode | I2 | rj | xd> 100*06c3fb27SDimitry Andricclass Fmt2RI2_XRI<bits<32> op, dag outs, dag ins, string opnstr, 101*06c3fb27SDimitry Andric list<dag> pattern = []> 102*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 103*06c3fb27SDimitry Andric bits<2> imm2; 104*06c3fb27SDimitry Andric bits<5> rj; 105*06c3fb27SDimitry Andric bits<5> xd; 106*06c3fb27SDimitry Andric 107*06c3fb27SDimitry Andric let Inst{31-0} = op; 108*06c3fb27SDimitry Andric let Inst{11-10} = imm2; 109*06c3fb27SDimitry Andric let Inst{9-5} = rj; 110*06c3fb27SDimitry Andric let Inst{4-0} = xd; 111*06c3fb27SDimitry Andric} 112*06c3fb27SDimitry Andric 113*06c3fb27SDimitry Andric// <opcode | I2 | xj | rd> 114*06c3fb27SDimitry Andricclass Fmt2RI2_RXI<bits<32> op, dag outs, dag ins, string opnstr, 115*06c3fb27SDimitry Andric list<dag> pattern = []> 116*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 117*06c3fb27SDimitry Andric bits<2> imm2; 118*06c3fb27SDimitry Andric bits<5> xj; 119*06c3fb27SDimitry Andric bits<5> rd; 120*06c3fb27SDimitry Andric 121*06c3fb27SDimitry Andric let Inst{31-0} = op; 122*06c3fb27SDimitry Andric let Inst{11-10} = imm2; 123*06c3fb27SDimitry Andric let Inst{9-5} = xj; 124*06c3fb27SDimitry Andric let Inst{4-0} = rd; 125*06c3fb27SDimitry Andric} 126*06c3fb27SDimitry Andric 127*06c3fb27SDimitry Andric// 2RI3-type 128*06c3fb27SDimitry Andric// <opcode | I3 | xj | xd> 129*06c3fb27SDimitry Andricclass Fmt2RI3_XXI<bits<32> op, dag outs, dag ins, string opnstr, 130*06c3fb27SDimitry Andric list<dag> pattern = []> 131*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 132*06c3fb27SDimitry Andric bits<3> imm3; 133*06c3fb27SDimitry Andric bits<5> xj; 134*06c3fb27SDimitry Andric bits<5> xd; 135*06c3fb27SDimitry Andric 136*06c3fb27SDimitry Andric let Inst{31-0} = op; 137*06c3fb27SDimitry Andric let Inst{12-10} = imm3; 138*06c3fb27SDimitry Andric let Inst{9-5} = xj; 139*06c3fb27SDimitry Andric let Inst{4-0} = xd; 140*06c3fb27SDimitry Andric} 141*06c3fb27SDimitry Andric 142*06c3fb27SDimitry Andric// <opcode | I3 | rj | xd> 143*06c3fb27SDimitry Andricclass Fmt2RI3_XRI<bits<32> op, dag outs, dag ins, string opnstr, 144*06c3fb27SDimitry Andric list<dag> pattern = []> 145*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 146*06c3fb27SDimitry Andric bits<3> imm3; 147*06c3fb27SDimitry Andric bits<5> rj; 148*06c3fb27SDimitry Andric bits<5> xd; 149*06c3fb27SDimitry Andric 150*06c3fb27SDimitry Andric let Inst{31-0} = op; 151*06c3fb27SDimitry Andric let Inst{12-10} = imm3; 152*06c3fb27SDimitry Andric let Inst{9-5} = rj; 153*06c3fb27SDimitry Andric let Inst{4-0} = xd; 154*06c3fb27SDimitry Andric} 155*06c3fb27SDimitry Andric 156*06c3fb27SDimitry Andric// <opcode | I3 | xj | rd> 157*06c3fb27SDimitry Andricclass Fmt2RI3_RXI<bits<32> op, dag outs, dag ins, string opnstr, 158*06c3fb27SDimitry Andric list<dag> pattern = []> 159*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 160*06c3fb27SDimitry Andric bits<3> imm3; 161*06c3fb27SDimitry Andric bits<5> xj; 162*06c3fb27SDimitry Andric bits<5> rd; 163*06c3fb27SDimitry Andric 164*06c3fb27SDimitry Andric let Inst{31-0} = op; 165*06c3fb27SDimitry Andric let Inst{12-10} = imm3; 166*06c3fb27SDimitry Andric let Inst{9-5} = xj; 167*06c3fb27SDimitry Andric let Inst{4-0} = rd; 168*06c3fb27SDimitry Andric} 169*06c3fb27SDimitry Andric 170*06c3fb27SDimitry Andric// 2RI4-type 171*06c3fb27SDimitry Andric// <opcode | I4 | xj | xd> 172*06c3fb27SDimitry Andricclass Fmt2RI4_XXI<bits<32> op, dag outs, dag ins, string opnstr, 173*06c3fb27SDimitry Andric list<dag> pattern = []> 174*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 175*06c3fb27SDimitry Andric bits<4> imm4; 176*06c3fb27SDimitry Andric bits<5> xj; 177*06c3fb27SDimitry Andric bits<5> xd; 178*06c3fb27SDimitry Andric 179*06c3fb27SDimitry Andric let Inst{31-0} = op; 180*06c3fb27SDimitry Andric let Inst{13-10} = imm4; 181*06c3fb27SDimitry Andric let Inst{9-5} = xj; 182*06c3fb27SDimitry Andric let Inst{4-0} = xd; 183*06c3fb27SDimitry Andric} 184*06c3fb27SDimitry Andric 185*06c3fb27SDimitry Andric// <opcode | I4 | rj | xd> 186*06c3fb27SDimitry Andricclass Fmt2RI4_XRI<bits<32> op, dag outs, dag ins, string opnstr, 187*06c3fb27SDimitry Andric list<dag> pattern = []> 188*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 189*06c3fb27SDimitry Andric bits<4> imm4; 190*06c3fb27SDimitry Andric bits<5> rj; 191*06c3fb27SDimitry Andric bits<5> xd; 192*06c3fb27SDimitry Andric 193*06c3fb27SDimitry Andric let Inst{31-0} = op; 194*06c3fb27SDimitry Andric let Inst{13-10} = imm4; 195*06c3fb27SDimitry Andric let Inst{9-5} = rj; 196*06c3fb27SDimitry Andric let Inst{4-0} = xd; 197*06c3fb27SDimitry Andric} 198*06c3fb27SDimitry Andric 199*06c3fb27SDimitry Andric// <opcode | I4 | xj | rd> 200*06c3fb27SDimitry Andricclass Fmt2RI4_RXI<bits<32> op, dag outs, dag ins, string opnstr, 201*06c3fb27SDimitry Andric list<dag> pattern = []> 202*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 203*06c3fb27SDimitry Andric bits<4> imm4; 204*06c3fb27SDimitry Andric bits<5> xj; 205*06c3fb27SDimitry Andric bits<5> rd; 206*06c3fb27SDimitry Andric 207*06c3fb27SDimitry Andric let Inst{31-0} = op; 208*06c3fb27SDimitry Andric let Inst{13-10} = imm4; 209*06c3fb27SDimitry Andric let Inst{9-5} = xj; 210*06c3fb27SDimitry Andric let Inst{4-0} = rd; 211*06c3fb27SDimitry Andric} 212*06c3fb27SDimitry Andric 213*06c3fb27SDimitry Andric// 2RI5-type 214*06c3fb27SDimitry Andric// <opcode | I5 | xj | xd> 215*06c3fb27SDimitry Andricclass Fmt2RI5_XXI<bits<32> op, dag outs, dag ins, string opnstr, 216*06c3fb27SDimitry Andric list<dag> pattern = []> 217*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 218*06c3fb27SDimitry Andric bits<5> imm5; 219*06c3fb27SDimitry Andric bits<5> xj; 220*06c3fb27SDimitry Andric bits<5> xd; 221*06c3fb27SDimitry Andric 222*06c3fb27SDimitry Andric let Inst{31-0} = op; 223*06c3fb27SDimitry Andric let Inst{14-10} = imm5; 224*06c3fb27SDimitry Andric let Inst{9-5} = xj; 225*06c3fb27SDimitry Andric let Inst{4-0} = xd; 226*06c3fb27SDimitry Andric} 227*06c3fb27SDimitry Andric 228*06c3fb27SDimitry Andric// 2RI6-type 229*06c3fb27SDimitry Andric// <opcode | I6 | xj | xd> 230*06c3fb27SDimitry Andricclass Fmt2RI6_XXI<bits<32> op, dag outs, dag ins, string opnstr, 231*06c3fb27SDimitry Andric list<dag> pattern = []> 232*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 233*06c3fb27SDimitry Andric bits<6> imm6; 234*06c3fb27SDimitry Andric bits<5> xj; 235*06c3fb27SDimitry Andric bits<5> xd; 236*06c3fb27SDimitry Andric 237*06c3fb27SDimitry Andric let Inst{31-0} = op; 238*06c3fb27SDimitry Andric let Inst{15-10} = imm6; 239*06c3fb27SDimitry Andric let Inst{9-5} = xj; 240*06c3fb27SDimitry Andric let Inst{4-0} = xd; 241*06c3fb27SDimitry Andric} 242*06c3fb27SDimitry Andric 243*06c3fb27SDimitry Andric// 2RI7-type 244*06c3fb27SDimitry Andric// <opcode | I7 | xj | xd> 245*06c3fb27SDimitry Andricclass Fmt2RI7_XXI<bits<32> op, dag outs, dag ins, string opnstr, 246*06c3fb27SDimitry Andric list<dag> pattern = []> 247*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 248*06c3fb27SDimitry Andric bits<7> imm7; 249*06c3fb27SDimitry Andric bits<5> xj; 250*06c3fb27SDimitry Andric bits<5> xd; 251*06c3fb27SDimitry Andric 252*06c3fb27SDimitry Andric let Inst{31-0} = op; 253*06c3fb27SDimitry Andric let Inst{16-10} = imm7; 254*06c3fb27SDimitry Andric let Inst{9-5} = xj; 255*06c3fb27SDimitry Andric let Inst{4-0} = xd; 256*06c3fb27SDimitry Andric} 257*06c3fb27SDimitry Andric 258*06c3fb27SDimitry Andric// 2RI8-type 259*06c3fb27SDimitry Andric// <opcode | I8 | xj | xd> 260*06c3fb27SDimitry Andricclass Fmt2RI8_XXI<bits<32> op, dag outs, dag ins, string opnstr, 261*06c3fb27SDimitry Andric list<dag> pattern = []> 262*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 263*06c3fb27SDimitry Andric bits<8> imm8; 264*06c3fb27SDimitry Andric bits<5> xj; 265*06c3fb27SDimitry Andric bits<5> xd; 266*06c3fb27SDimitry Andric 267*06c3fb27SDimitry Andric let Inst{31-0} = op; 268*06c3fb27SDimitry Andric let Inst{17-10} = imm8; 269*06c3fb27SDimitry Andric let Inst{9-5} = xj; 270*06c3fb27SDimitry Andric let Inst{4-0} = xd; 271*06c3fb27SDimitry Andric} 272*06c3fb27SDimitry Andric 273*06c3fb27SDimitry Andric// 2RI8I2-type 274*06c3fb27SDimitry Andric// <opcode | I2 | I8 | xj | xd> 275*06c3fb27SDimitry Andricclass Fmt2RI8I2_XRII<bits<32> op, dag outs, dag ins, string opnstr, 276*06c3fb27SDimitry Andric list<dag> pattern = []> 277*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 278*06c3fb27SDimitry Andric bits<2> imm2; 279*06c3fb27SDimitry Andric bits<8> imm8; 280*06c3fb27SDimitry Andric bits<5> rj; 281*06c3fb27SDimitry Andric bits<5> xd; 282*06c3fb27SDimitry Andric 283*06c3fb27SDimitry Andric let Inst{31-0} = op; 284*06c3fb27SDimitry Andric let Inst{19-18} = imm2; 285*06c3fb27SDimitry Andric let Inst{17-10} = imm8; 286*06c3fb27SDimitry Andric let Inst{9-5} = rj; 287*06c3fb27SDimitry Andric let Inst{4-0} = xd; 288*06c3fb27SDimitry Andric} 289*06c3fb27SDimitry Andric 290*06c3fb27SDimitry Andric// 2RI8I3-type 291*06c3fb27SDimitry Andric// <opcode | I3 | I8 | xj | xd> 292*06c3fb27SDimitry Andricclass Fmt2RI8I3_XRII<bits<32> op, dag outs, dag ins, string opnstr, 293*06c3fb27SDimitry Andric list<dag> pattern = []> 294*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 295*06c3fb27SDimitry Andric bits<3> imm3; 296*06c3fb27SDimitry Andric bits<8> imm8; 297*06c3fb27SDimitry Andric bits<5> rj; 298*06c3fb27SDimitry Andric bits<5> xd; 299*06c3fb27SDimitry Andric 300*06c3fb27SDimitry Andric let Inst{31-0} = op; 301*06c3fb27SDimitry Andric let Inst{20-18} = imm3; 302*06c3fb27SDimitry Andric let Inst{17-10} = imm8; 303*06c3fb27SDimitry Andric let Inst{9-5} = rj; 304*06c3fb27SDimitry Andric let Inst{4-0} = xd; 305*06c3fb27SDimitry Andric} 306*06c3fb27SDimitry Andric 307*06c3fb27SDimitry Andric// 2RI8I4-type 308*06c3fb27SDimitry Andric// <opcode | I4 | I8 | xj | xd> 309*06c3fb27SDimitry Andricclass Fmt2RI8I4_XRII<bits<32> op, dag outs, dag ins, string opnstr, 310*06c3fb27SDimitry Andric list<dag> pattern = []> 311*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 312*06c3fb27SDimitry Andric bits<4> imm4; 313*06c3fb27SDimitry Andric bits<8> imm8; 314*06c3fb27SDimitry Andric bits<5> rj; 315*06c3fb27SDimitry Andric bits<5> xd; 316*06c3fb27SDimitry Andric 317*06c3fb27SDimitry Andric let Inst{31-0} = op; 318*06c3fb27SDimitry Andric let Inst{21-18} = imm4; 319*06c3fb27SDimitry Andric let Inst{17-10} = imm8; 320*06c3fb27SDimitry Andric let Inst{9-5} = rj; 321*06c3fb27SDimitry Andric let Inst{4-0} = xd; 322*06c3fb27SDimitry Andric} 323*06c3fb27SDimitry Andric 324*06c3fb27SDimitry Andric// 2RI8I5-type 325*06c3fb27SDimitry Andric// <opcode | I5 | I8 | xj | xd> 326*06c3fb27SDimitry Andricclass Fmt2RI8I5_XRII<bits<32> op, dag outs, dag ins, string opnstr, 327*06c3fb27SDimitry Andric list<dag> pattern = []> 328*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 329*06c3fb27SDimitry Andric bits<5> imm5; 330*06c3fb27SDimitry Andric bits<8> imm8; 331*06c3fb27SDimitry Andric bits<5> rj; 332*06c3fb27SDimitry Andric bits<5> xd; 333*06c3fb27SDimitry Andric 334*06c3fb27SDimitry Andric let Inst{31-0} = op; 335*06c3fb27SDimitry Andric let Inst{22-18} = imm5; 336*06c3fb27SDimitry Andric let Inst{17-10} = imm8; 337*06c3fb27SDimitry Andric let Inst{9-5} = rj; 338*06c3fb27SDimitry Andric let Inst{4-0} = xd; 339*06c3fb27SDimitry Andric} 340*06c3fb27SDimitry Andric 341*06c3fb27SDimitry Andric// 2RI9-type 342*06c3fb27SDimitry Andric// <opcode | I9 | rj | xd> 343*06c3fb27SDimitry Andricclass Fmt2RI9_XRI<bits<32> op, dag outs, dag ins, string opnstr, 344*06c3fb27SDimitry Andric list<dag> pattern = []> 345*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 346*06c3fb27SDimitry Andric bits<9> imm9; 347*06c3fb27SDimitry Andric bits<5> rj; 348*06c3fb27SDimitry Andric bits<5> xd; 349*06c3fb27SDimitry Andric 350*06c3fb27SDimitry Andric let Inst{31-0} = op; 351*06c3fb27SDimitry Andric let Inst{18-10} = imm9; 352*06c3fb27SDimitry Andric let Inst{9-5} = rj; 353*06c3fb27SDimitry Andric let Inst{4-0} = xd; 354*06c3fb27SDimitry Andric} 355*06c3fb27SDimitry Andric 356*06c3fb27SDimitry Andric// 2RI10-type 357*06c3fb27SDimitry Andric// <opcode | I10 | rj | xd> 358*06c3fb27SDimitry Andricclass Fmt2RI10_XRI<bits<32> op, dag outs, dag ins, string opnstr, 359*06c3fb27SDimitry Andric list<dag> pattern = []> 360*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 361*06c3fb27SDimitry Andric bits<10> imm10; 362*06c3fb27SDimitry Andric bits<5> rj; 363*06c3fb27SDimitry Andric bits<5> xd; 364*06c3fb27SDimitry Andric 365*06c3fb27SDimitry Andric let Inst{31-0} = op; 366*06c3fb27SDimitry Andric let Inst{19-10} = imm10; 367*06c3fb27SDimitry Andric let Inst{9-5} = rj; 368*06c3fb27SDimitry Andric let Inst{4-0} = xd; 369*06c3fb27SDimitry Andric} 370*06c3fb27SDimitry Andric 371*06c3fb27SDimitry Andric// 2RI11-type 372*06c3fb27SDimitry Andric// <opcode | I11 | rj | xd> 373*06c3fb27SDimitry Andricclass Fmt2RI11_XRI<bits<32> op, dag outs, dag ins, string opnstr, 374*06c3fb27SDimitry Andric list<dag> pattern = []> 375*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 376*06c3fb27SDimitry Andric bits<11> imm11; 377*06c3fb27SDimitry Andric bits<5> rj; 378*06c3fb27SDimitry Andric bits<5> xd; 379*06c3fb27SDimitry Andric 380*06c3fb27SDimitry Andric let Inst{31-0} = op; 381*06c3fb27SDimitry Andric let Inst{20-10} = imm11; 382*06c3fb27SDimitry Andric let Inst{9-5} = rj; 383*06c3fb27SDimitry Andric let Inst{4-0} = xd; 384*06c3fb27SDimitry Andric} 385*06c3fb27SDimitry Andric 386*06c3fb27SDimitry Andric// 2RI12-type 387*06c3fb27SDimitry Andric// <opcode | I12 | rj | xd> 388*06c3fb27SDimitry Andricclass Fmt2RI12_XRI<bits<32> op, dag outs, dag ins, string opnstr, 389*06c3fb27SDimitry Andric list<dag> pattern = []> 390*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 391*06c3fb27SDimitry Andric bits<12> imm12; 392*06c3fb27SDimitry Andric bits<5> rj; 393*06c3fb27SDimitry Andric bits<5> xd; 394*06c3fb27SDimitry Andric 395*06c3fb27SDimitry Andric let Inst{31-0} = op; 396*06c3fb27SDimitry Andric let Inst{21-10} = imm12; 397*06c3fb27SDimitry Andric let Inst{9-5} = rj; 398*06c3fb27SDimitry Andric let Inst{4-0} = xd; 399*06c3fb27SDimitry Andric} 400*06c3fb27SDimitry Andric 401*06c3fb27SDimitry Andric// 3R-type 402*06c3fb27SDimitry Andric// <opcode | xk | xj | xd> 403*06c3fb27SDimitry Andricclass Fmt3R_XXX<bits<32> op, dag outs, dag ins, string opnstr, 404*06c3fb27SDimitry Andric list<dag> pattern = []> 405*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 406*06c3fb27SDimitry Andric bits<5> xk; 407*06c3fb27SDimitry Andric bits<5> xj; 408*06c3fb27SDimitry Andric bits<5> xd; 409*06c3fb27SDimitry Andric 410*06c3fb27SDimitry Andric let Inst{31-0} = op; 411*06c3fb27SDimitry Andric let Inst{14-10} = xk; 412*06c3fb27SDimitry Andric let Inst{9-5} = xj; 413*06c3fb27SDimitry Andric let Inst{4-0} = xd; 414*06c3fb27SDimitry Andric} 415*06c3fb27SDimitry Andric 416*06c3fb27SDimitry Andric// <opcode | rk | xj | xd> 417*06c3fb27SDimitry Andricclass Fmt3R_XXR<bits<32> op, dag outs, dag ins, string opnstr, 418*06c3fb27SDimitry Andric list<dag> pattern = []> 419*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 420*06c3fb27SDimitry Andric bits<5> rk; 421*06c3fb27SDimitry Andric bits<5> xj; 422*06c3fb27SDimitry Andric bits<5> xd; 423*06c3fb27SDimitry Andric 424*06c3fb27SDimitry Andric let Inst{31-0} = op; 425*06c3fb27SDimitry Andric let Inst{14-10} = rk; 426*06c3fb27SDimitry Andric let Inst{9-5} = xj; 427*06c3fb27SDimitry Andric let Inst{4-0} = xd; 428*06c3fb27SDimitry Andric} 429*06c3fb27SDimitry Andric 430*06c3fb27SDimitry Andric// <opcode | rk | rj | xd> 431*06c3fb27SDimitry Andricclass Fmt3R_XRR<bits<32> op, dag outs, dag ins, string opnstr, 432*06c3fb27SDimitry Andric list<dag> pattern = []> 433*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 434*06c3fb27SDimitry Andric bits<5> rk; 435*06c3fb27SDimitry Andric bits<5> rj; 436*06c3fb27SDimitry Andric bits<5> xd; 437*06c3fb27SDimitry Andric 438*06c3fb27SDimitry Andric let Inst{31-0} = op; 439*06c3fb27SDimitry Andric let Inst{14-10} = rk; 440*06c3fb27SDimitry Andric let Inst{9-5} = rj; 441*06c3fb27SDimitry Andric let Inst{4-0} = xd; 442*06c3fb27SDimitry Andric} 443*06c3fb27SDimitry Andric 444*06c3fb27SDimitry Andric// 4R-type 445*06c3fb27SDimitry Andric// <opcode | xa | xk | xj | xd> 446*06c3fb27SDimitry Andricclass Fmt4R_XXXX<bits<32> op, dag outs, dag ins, string opnstr, 447*06c3fb27SDimitry Andric list<dag> pattern = []> 448*06c3fb27SDimitry Andric : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> { 449*06c3fb27SDimitry Andric bits<5> xa; 450*06c3fb27SDimitry Andric bits<5> xk; 451*06c3fb27SDimitry Andric bits<5> xj; 452*06c3fb27SDimitry Andric bits<5> xd; 453*06c3fb27SDimitry Andric 454*06c3fb27SDimitry Andric let Inst{31-0} = op; 455*06c3fb27SDimitry Andric let Inst{19-15} = xa; 456*06c3fb27SDimitry Andric let Inst{14-10} = xk; 457*06c3fb27SDimitry Andric let Inst{9-5} = xj; 458*06c3fb27SDimitry Andric let Inst{4-0} = xd; 459*06c3fb27SDimitry Andric} 460