1*d6675b6aSwanglei// LoongArchLBTInstrFormats.td - LoongArch LBT Instr Formats -*- tablegen -*-=// 2*d6675b6aSwanglei// 3*d6675b6aSwanglei// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*d6675b6aSwanglei// See https://llvm.org/LICENSE.txt for license information. 5*d6675b6aSwanglei// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*d6675b6aSwanglei// 7*d6675b6aSwanglei//===----------------------------------------------------------------------===// 8*d6675b6aSwanglei 9*d6675b6aSwanglei//===----------------------------------------------------------------------===// 10*d6675b6aSwanglei// Describe LoongArch LBT instructions format 11*d6675b6aSwanglei// 12*d6675b6aSwanglei// opcode - operation code. 13*d6675b6aSwanglei// rd/sd - destination register operand. 14*d6675b6aSwanglei// rj/rk/sj - source register operand. 15*d6675b6aSwanglei// immN/ptr - immediate data operand. 16*d6675b6aSwanglei// 17*d6675b6aSwanglei// Note: The definition of "NoDstFmt..." conveys the meaning of no explicit 18*d6675b6aSwanglei// output operand. In other words, there will be no output operand in the 19*d6675b6aSwanglei// assembly notation of these instructions. In fact, they always manipulate 20*d6675b6aSwanglei// the "EFLAGS" register. 21*d6675b6aSwanglei// Since these instructions are currently not used for code generation, 22*d6675b6aSwanglei// we do not need to add `let Defs/Uses = [EFLAGS]`. 23*d6675b6aSwanglei//===----------------------------------------------------------------------===// 24*d6675b6aSwanglei 25*d6675b6aSwanglei// 1R-type (no outs) 26*d6675b6aSwanglei// <opcode | rj> 27*d6675b6aSwangleiclass NoDstFmt1R<bits<32> op> 28*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj), 29*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj"> { 30*d6675b6aSwanglei bits<5> rj; 31*d6675b6aSwanglei 32*d6675b6aSwanglei let Inst{31-0} = op; 33*d6675b6aSwanglei let Inst{9-5} = rj; 34*d6675b6aSwanglei} 35*d6675b6aSwanglei 36*d6675b6aSwanglei// 1RI3-type (no outs) 37*d6675b6aSwanglei// <opcode | I3 | rj> 38*d6675b6aSwangleiclass NoDstFmt1RI3<bits<32> op> 39*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, uimm3:$imm3), 40*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $imm3"> { 41*d6675b6aSwanglei bits<3> imm3; 42*d6675b6aSwanglei bits<5> rj; 43*d6675b6aSwanglei 44*d6675b6aSwanglei let Inst{31-0} = op; 45*d6675b6aSwanglei let Inst{12-10} = imm3; 46*d6675b6aSwanglei let Inst{9-5} = rj; 47*d6675b6aSwanglei} 48*d6675b6aSwanglei 49*d6675b6aSwanglei// 1RI4-type (no outs) 50*d6675b6aSwanglei// <opcode | I4 | rj> 51*d6675b6aSwangleiclass NoDstFmt1RI4<bits<32> op> 52*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, uimm4:$imm4), 53*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $imm4"> { 54*d6675b6aSwanglei bits<4> imm4; 55*d6675b6aSwanglei bits<5> rj; 56*d6675b6aSwanglei 57*d6675b6aSwanglei let Inst{31-0} = op; 58*d6675b6aSwanglei let Inst{13-10} = imm4; 59*d6675b6aSwanglei let Inst{9-5} = rj; 60*d6675b6aSwanglei} 61*d6675b6aSwanglei 62*d6675b6aSwanglei// 1RI4-type 63*d6675b6aSwanglei// <opcode | I4 | rd> 64*d6675b6aSwangleiclass Fmt1RI4<bits<32> op> 65*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins uimm4:$imm4), 66*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rd, $imm4"> { 67*d6675b6aSwanglei bits<4> imm4; 68*d6675b6aSwanglei bits<5> rd; 69*d6675b6aSwanglei 70*d6675b6aSwanglei let Inst{31-0} = op; 71*d6675b6aSwanglei let Inst{13-10} = imm4; 72*d6675b6aSwanglei let Inst{4-0} = rd; 73*d6675b6aSwanglei} 74*d6675b6aSwanglei 75*d6675b6aSwanglei// 1RI5-type (no outs) 76*d6675b6aSwanglei// <opcode | I5 | rj> 77*d6675b6aSwangleiclass NoDstFmt1RI5<bits<32> op> 78*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, uimm5:$imm5), 79*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $imm5"> { 80*d6675b6aSwanglei bits<5> imm5; 81*d6675b6aSwanglei bits<5> rj; 82*d6675b6aSwanglei 83*d6675b6aSwanglei let Inst{31-0} = op; 84*d6675b6aSwanglei let Inst{14-10} = imm5; 85*d6675b6aSwanglei let Inst{9-5} = rj; 86*d6675b6aSwanglei} 87*d6675b6aSwanglei 88*d6675b6aSwanglei// 1RI5I4-type (no outs) 89*d6675b6aSwanglei// <opcode | rd | I5 | I4> 90*d6675b6aSwangleiclass NoDstFmt1RI5I4<bits<32> op> 91*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, uimm5:$imm5, uimm4:$imm4), 92*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $imm5, $imm4"> { 93*d6675b6aSwanglei bits<5> imm5; 94*d6675b6aSwanglei bits<5> rj; 95*d6675b6aSwanglei bits<4> imm4; 96*d6675b6aSwanglei 97*d6675b6aSwanglei let Inst{31-0} = op; 98*d6675b6aSwanglei let Inst{14-10} = imm5; 99*d6675b6aSwanglei let Inst{9-5} = rj; 100*d6675b6aSwanglei let Inst{3-0} = imm4; 101*d6675b6aSwanglei} 102*d6675b6aSwanglei 103*d6675b6aSwanglei// 1RI5I8-type 104*d6675b6aSwanglei// <opcode | rd | I5 | I8> 105*d6675b6aSwangleiclass Fmt1RI5I8<bits<32> op> 106*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins uimm5:$imm5, uimm8:$imm8), 107*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rd, $imm5, $imm8"> { 108*d6675b6aSwanglei bits<8> imm8; 109*d6675b6aSwanglei bits<5> imm5; 110*d6675b6aSwanglei bits<5> rd; 111*d6675b6aSwanglei 112*d6675b6aSwanglei let Inst{31-0} = op; 113*d6675b6aSwanglei let Inst{17-10} = imm8; 114*d6675b6aSwanglei let Inst{9-5} = imm5; 115*d6675b6aSwanglei let Inst{4-0} = rd; 116*d6675b6aSwanglei} 117*d6675b6aSwanglei 118*d6675b6aSwanglei// 1RI6-type (no outs) 119*d6675b6aSwanglei// <opcode | I6 | rj> 120*d6675b6aSwangleiclass NoDstFmt1RI6<bits<32> op> 121*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, uimm6:$imm6), 122*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $imm6"> { 123*d6675b6aSwanglei bits<6> imm6; 124*d6675b6aSwanglei bits<5> rj; 125*d6675b6aSwanglei 126*d6675b6aSwanglei let Inst{31-0} = op; 127*d6675b6aSwanglei let Inst{15-10} = imm6; 128*d6675b6aSwanglei let Inst{9-5} = rj; 129*d6675b6aSwanglei} 130*d6675b6aSwanglei 131*d6675b6aSwanglei// 1RI8-type 132*d6675b6aSwanglei// <opcode | I8 | rd> 133*d6675b6aSwangleiclass Fmt1RI8<bits<32> op> 134*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins uimm8:$imm8), 135*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rd, $imm8"> { 136*d6675b6aSwanglei bits<8> imm8; 137*d6675b6aSwanglei bits<5> rd; 138*d6675b6aSwanglei 139*d6675b6aSwanglei let Inst{31-0} = op; 140*d6675b6aSwanglei let Inst{17-10} = imm8; 141*d6675b6aSwanglei let Inst{4-0} = rd; 142*d6675b6aSwanglei} 143*d6675b6aSwanglei 144*d6675b6aSwanglei// 2R-type (no outs) 145*d6675b6aSwanglei// <opcode | rk | rj> 146*d6675b6aSwangleiclass NoDstFmt2R<bits<32> op> 147*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, GPR:$rk), 148*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $rk"> { 149*d6675b6aSwanglei bits<5> rk; 150*d6675b6aSwanglei bits<5> rj; 151*d6675b6aSwanglei 152*d6675b6aSwanglei let Inst{31-0} = op; 153*d6675b6aSwanglei let Inst{14-10} = rk; 154*d6675b6aSwanglei let Inst{9-5} = rj; 155*d6675b6aSwanglei} 156*d6675b6aSwanglei 157*d6675b6aSwanglei// 2RI4-type (no outs) 158*d6675b6aSwanglei// <opcode | rk | rj | imm4> 159*d6675b6aSwangleiclass NoDstFmt2RI4<bits<32> op> 160*d6675b6aSwanglei : LAInst<(outs), (ins GPR:$rj, GPR:$rk, uimm4:$imm4), 161*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rj, $rk, $imm4"> { 162*d6675b6aSwanglei bits<4> imm4; 163*d6675b6aSwanglei bits<5> rk; 164*d6675b6aSwanglei bits<5> rj; 165*d6675b6aSwanglei 166*d6675b6aSwanglei let Inst{31-0} = op; 167*d6675b6aSwanglei let Inst{14-10} = rk; 168*d6675b6aSwanglei let Inst{9-5} = rj; 169*d6675b6aSwanglei let Inst{3-0} = imm4; 170*d6675b6aSwanglei} 171*d6675b6aSwanglei 172*d6675b6aSwanglei// 2RI3-type 173*d6675b6aSwanglei// <opcode | I3 | rj | rd> 174*d6675b6aSwangleiclass Fmt2RI3<bits<32> op> 175*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins GPR:$rj, uimm3:$imm3), 176*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rd, $rj, $imm3"> { 177*d6675b6aSwanglei bits<3> imm3; 178*d6675b6aSwanglei bits<5> rj; 179*d6675b6aSwanglei bits<5> rd; 180*d6675b6aSwanglei 181*d6675b6aSwanglei let Inst{31-0} = op; 182*d6675b6aSwanglei let Inst{12-10} = imm3; 183*d6675b6aSwanglei let Inst{9-5} = rj; 184*d6675b6aSwanglei let Inst{4-0} = rd; 185*d6675b6aSwanglei} 186*d6675b6aSwanglei 187*d6675b6aSwanglei// 2RI4-type 188*d6675b6aSwanglei// <opcode | I4 | rj | rd> 189*d6675b6aSwangleiclass Fmt2RI4<bits<32> op> 190*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins GPR:$rj, uimm4:$imm4), 191*d6675b6aSwanglei deriveInsnMnemonic<NAME>.ret, "$rd, $rj, $imm4"> { 192*d6675b6aSwanglei bits<4> imm4; 193*d6675b6aSwanglei bits<5> rj; 194*d6675b6aSwanglei bits<5> rd; 195*d6675b6aSwanglei 196*d6675b6aSwanglei let Inst{31-0} = op; 197*d6675b6aSwanglei let Inst{13-10} = imm4; 198*d6675b6aSwanglei let Inst{9-5} = rj; 199*d6675b6aSwanglei let Inst{4-0} = rd; 200*d6675b6aSwanglei} 201*d6675b6aSwanglei 202*d6675b6aSwanglei// <opcode | rj | sd> 203*d6675b6aSwangleiclass FmtGR2SCR<bits<32> op> 204*d6675b6aSwanglei : LAInst<(outs SCR:$sd), (ins GPR:$rj), deriveInsnMnemonic<NAME>.ret, 205*d6675b6aSwanglei "$sd, $rj"> { 206*d6675b6aSwanglei bits<5> rj; 207*d6675b6aSwanglei bits<2> sd; 208*d6675b6aSwanglei 209*d6675b6aSwanglei let Inst{31-0} = op; 210*d6675b6aSwanglei let Inst{9-5} = rj; 211*d6675b6aSwanglei let Inst{1-0} = sd; 212*d6675b6aSwanglei} 213*d6675b6aSwanglei 214*d6675b6aSwanglei// <opcode | sj | rd> 215*d6675b6aSwangleiclass FmtSCR2GR<bits<32> op> 216*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins SCR:$sj), deriveInsnMnemonic<NAME>.ret, 217*d6675b6aSwanglei "$rd, $sj"> { 218*d6675b6aSwanglei bits<2> sj; 219*d6675b6aSwanglei bits<5> rd; 220*d6675b6aSwanglei 221*d6675b6aSwanglei let Inst{31-0} = op; 222*d6675b6aSwanglei let Inst{6-5} = sj; 223*d6675b6aSwanglei let Inst{4-0} = rd; 224*d6675b6aSwanglei} 225*d6675b6aSwanglei 226*d6675b6aSwanglei// <opcode | I21[15:0] | I21[20:16]> 227*d6675b6aSwangleiclass FmtJISCR<bits<32> op> 228*d6675b6aSwanglei : LAInst<(outs), (ins simm21_lsl2:$imm21), deriveInsnMnemonic<NAME>.ret, 229*d6675b6aSwanglei "$imm21"> { 230*d6675b6aSwanglei bits<21> imm21; 231*d6675b6aSwanglei bits<5> rj; 232*d6675b6aSwanglei 233*d6675b6aSwanglei let Inst{31-0} = op; 234*d6675b6aSwanglei let Inst{25-10} = imm21{15-0}; 235*d6675b6aSwanglei let Inst{4-0} = imm21{20-16}; 236*d6675b6aSwanglei} 237*d6675b6aSwanglei 238*d6675b6aSwanglei// <opcode | rd> 239*d6675b6aSwangleiclass FmtMFTOP<bits<32> op> 240*d6675b6aSwanglei : LAInst<(outs GPR:$rd), (ins), deriveInsnMnemonic<NAME>.ret, 241*d6675b6aSwanglei "$rd"> { 242*d6675b6aSwanglei bits<5> rd; 243*d6675b6aSwanglei 244*d6675b6aSwanglei let Inst{31-0} = op; 245*d6675b6aSwanglei let Inst{4-0} = rd; 246*d6675b6aSwanglei} 247*d6675b6aSwanglei 248*d6675b6aSwanglei// <opcode | ptr> 249*d6675b6aSwangleiclass FmtMTTOP<bits<32> op> 250*d6675b6aSwanglei : LAInst<(outs), (ins uimm3:$ptr), deriveInsnMnemonic<NAME>.ret, 251*d6675b6aSwanglei "$ptr"> { 252*d6675b6aSwanglei bits<3> ptr; 253*d6675b6aSwanglei 254*d6675b6aSwanglei let Inst{31-0} = op; 255*d6675b6aSwanglei let Inst{7-5} = ptr; 256*d6675b6aSwanglei} 257