xref: /llvm-project/llvm/lib/Target/LoongArch/LoongArchLBTInstrFormats.td (revision d6675b6a61ad94124c6fba13dea7ddf9a6374e8f)
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