xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchLBTInstrInfo.td (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric//===- LoongArchLBTInstrInfo.td - LoongArch LBT instructions -*- 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// This file describes the LBT extension instructions.
10*06c3fb27SDimitry Andric//
11*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
12*06c3fb27SDimitry Andric
13*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
14*06c3fb27SDimitry Andric// Instructions
15*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
16*06c3fb27SDimitry Andric
17*06c3fb27SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 0, Predicates = [HasExtLBT] in {
18*06c3fb27SDimitry Andric
19*06c3fb27SDimitry Andricdef MOVGR2SCR : FmtGR2SCR<0x00000800>;
20*06c3fb27SDimitry Andricdef MOVSCR2GR : FmtSCR2GR<0x00000c00>;
21*06c3fb27SDimitry Andric
22*06c3fb27SDimitry Andricdef JISCR0 : FmtJISCR<0x48000200>;
23*06c3fb27SDimitry Andricdef JISCR1 : FmtJISCR<0x48000300>;
24*06c3fb27SDimitry Andric
25*06c3fb27SDimitry Andricdef ADDU12I_W : ALU_2RI5<0x00290000, simm5>;
26*06c3fb27SDimitry Andric
27*06c3fb27SDimitry Andricdef ADC_B : ALU_3R<0x00300000>;
28*06c3fb27SDimitry Andricdef ADC_H : ALU_3R<0x00308000>;
29*06c3fb27SDimitry Andricdef ADC_W : ALU_3R<0x00310000>;
30*06c3fb27SDimitry Andric
31*06c3fb27SDimitry Andricdef SBC_B : ALU_3R<0x00320000>;
32*06c3fb27SDimitry Andricdef SBC_H : ALU_3R<0x00328000>;
33*06c3fb27SDimitry Andricdef SBC_W : ALU_3R<0x00330000>;
34*06c3fb27SDimitry Andric
35*06c3fb27SDimitry Andricdef ROTR_B : ALU_3R<0x001a0000>;
36*06c3fb27SDimitry Andricdef ROTR_H : ALU_3R<0x001a8000>;
37*06c3fb27SDimitry Andric
38*06c3fb27SDimitry Andricdef ROTRI_B : Fmt2RI3<0x004c2000>;
39*06c3fb27SDimitry Andricdef ROTRI_H : Fmt2RI4<0x004c4000>;
40*06c3fb27SDimitry Andric
41*06c3fb27SDimitry Andricdef RCR_B : ALU_3R<0x00340000>;
42*06c3fb27SDimitry Andricdef RCR_H : ALU_3R<0x00348000>;
43*06c3fb27SDimitry Andricdef RCR_W : ALU_3R<0x00350000>;
44*06c3fb27SDimitry Andric
45*06c3fb27SDimitry Andricdef RCRI_B : Fmt2RI3<0x00502000>;
46*06c3fb27SDimitry Andricdef RCRI_H : Fmt2RI4<0x00504000>;
47*06c3fb27SDimitry Andricdef RCRI_W : ALU_2RI5<0x00508000, uimm5>;
48*06c3fb27SDimitry Andric
49*06c3fb27SDimitry Andricdef FCVT_UD_D : FP_CONV<0x0114e400>;
50*06c3fb27SDimitry Andricdef FCVT_LD_D : FP_CONV<0x0114e000>;
51*06c3fb27SDimitry Andricdef FCVT_D_LD : FP_ALU_3R<0x01150000>;
52*06c3fb27SDimitry Andric
53*06c3fb27SDimitry Andriclet mayLoad = 1 in {
54*06c3fb27SDimitry Andricdef LDL_W : LOAD_2RI12<0x2e000000>;
55*06c3fb27SDimitry Andricdef LDR_W : LOAD_2RI12<0x2e400000>;
56*06c3fb27SDimitry Andric} // mayLoad = 1
57*06c3fb27SDimitry Andric
58*06c3fb27SDimitry Andriclet mayStore = 1 in {
59*06c3fb27SDimitry Andricdef STL_W : STORE_2RI12<0x2f000000>;
60*06c3fb27SDimitry Andricdef STR_W : STORE_2RI12<0x2f400000>;
61*06c3fb27SDimitry Andric} // mayStore = 1
62*06c3fb27SDimitry Andric
63*06c3fb27SDimitry Andricdef X86ADC_B : NoDstFmt2R<0x003f000c>;
64*06c3fb27SDimitry Andricdef X86ADC_H : NoDstFmt2R<0x003f000d>;
65*06c3fb27SDimitry Andricdef X86ADC_W : NoDstFmt2R<0x003f000e>;
66*06c3fb27SDimitry Andricdef X86ADD_B : NoDstFmt2R<0x003f0004>;
67*06c3fb27SDimitry Andricdef X86ADD_H : NoDstFmt2R<0x003f0005>;
68*06c3fb27SDimitry Andricdef X86ADD_W : NoDstFmt2R<0x003f0006>;
69*06c3fb27SDimitry Andric
70*06c3fb27SDimitry Andricdef X86INC_B : NoDstFmt1R<0x00008000>;
71*06c3fb27SDimitry Andricdef X86INC_H : NoDstFmt1R<0x00008001>;
72*06c3fb27SDimitry Andricdef X86INC_W : NoDstFmt1R<0x00008002>;
73*06c3fb27SDimitry Andric
74*06c3fb27SDimitry Andricdef X86SBC_B : NoDstFmt2R<0x003f0010>;
75*06c3fb27SDimitry Andricdef X86SBC_H : NoDstFmt2R<0x003f0011>;
76*06c3fb27SDimitry Andricdef X86SBC_W : NoDstFmt2R<0x003f0012>;
77*06c3fb27SDimitry Andricdef X86SUB_B : NoDstFmt2R<0x003f0008>;
78*06c3fb27SDimitry Andricdef X86SUB_H : NoDstFmt2R<0x003f0009>;
79*06c3fb27SDimitry Andricdef X86SUB_W : NoDstFmt2R<0x003f000a>;
80*06c3fb27SDimitry Andric
81*06c3fb27SDimitry Andricdef X86DEC_B : NoDstFmt1R<0x00008004>;
82*06c3fb27SDimitry Andricdef X86DEC_H : NoDstFmt1R<0x00008005>;
83*06c3fb27SDimitry Andricdef X86DEC_W : NoDstFmt1R<0x00008006>;
84*06c3fb27SDimitry Andric
85*06c3fb27SDimitry Andricdef X86AND_B : NoDstFmt2R<0x003f8010>;
86*06c3fb27SDimitry Andricdef X86AND_H : NoDstFmt2R<0x003f8011>;
87*06c3fb27SDimitry Andricdef X86AND_W : NoDstFmt2R<0x003f8012>;
88*06c3fb27SDimitry Andric
89*06c3fb27SDimitry Andricdef X86OR_B : NoDstFmt2R<0x003f8014>;
90*06c3fb27SDimitry Andricdef X86OR_H : NoDstFmt2R<0x003f8015>;
91*06c3fb27SDimitry Andricdef X86OR_W : NoDstFmt2R<0x003f8016>;
92*06c3fb27SDimitry Andric
93*06c3fb27SDimitry Andricdef X86XOR_B : NoDstFmt2R<0x003f8018>;
94*06c3fb27SDimitry Andricdef X86XOR_H : NoDstFmt2R<0x003f8019>;
95*06c3fb27SDimitry Andricdef X86XOR_W : NoDstFmt2R<0x003f801a>;
96*06c3fb27SDimitry Andric
97*06c3fb27SDimitry Andricdef X86MUL_B : NoDstFmt2R<0x003e8000>;
98*06c3fb27SDimitry Andricdef X86MUL_H : NoDstFmt2R<0x003e8001>;
99*06c3fb27SDimitry Andricdef X86MUL_W : NoDstFmt2R<0x003e8002>;
100*06c3fb27SDimitry Andricdef X86MUL_BU : NoDstFmt2R<0x003e8004>;
101*06c3fb27SDimitry Andricdef X86MUL_HU : NoDstFmt2R<0x003e8005>;
102*06c3fb27SDimitry Andric
103*06c3fb27SDimitry Andricdef X86RCL_B : NoDstFmt2R<0x003f800c>;
104*06c3fb27SDimitry Andricdef X86RCL_H : NoDstFmt2R<0x003f800d>;
105*06c3fb27SDimitry Andricdef X86RCL_W : NoDstFmt2R<0x003f800e>;
106*06c3fb27SDimitry Andricdef X86RCLI_B : NoDstFmt1RI3<0x00542018>;
107*06c3fb27SDimitry Andricdef X86RCLI_H : NoDstFmt1RI4<0x00544019>;
108*06c3fb27SDimitry Andricdef X86RCLI_W : NoDstFmt1RI5<0x0054801a>;
109*06c3fb27SDimitry Andric
110*06c3fb27SDimitry Andricdef X86RCR_B : NoDstFmt2R<0x003f8008>;
111*06c3fb27SDimitry Andricdef X86RCR_H : NoDstFmt2R<0x003f8009>;
112*06c3fb27SDimitry Andricdef X86RCR_W : NoDstFmt2R<0x003f800a>;
113*06c3fb27SDimitry Andricdef X86RCRI_B : NoDstFmt1RI3<0x00542010>;
114*06c3fb27SDimitry Andricdef X86RCRI_H : NoDstFmt1RI4<0x00544011>;
115*06c3fb27SDimitry Andricdef X86RCRI_W : NoDstFmt1RI5<0x00548012>;
116*06c3fb27SDimitry Andric
117*06c3fb27SDimitry Andricdef X86ROTL_B : NoDstFmt2R<0x003f8004>;
118*06c3fb27SDimitry Andricdef X86ROTL_H : NoDstFmt2R<0x003f8005>;
119*06c3fb27SDimitry Andricdef X86ROTL_W : NoDstFmt2R<0x003f8006>;
120*06c3fb27SDimitry Andricdef X86ROTLI_B : NoDstFmt1RI3<0x00542014>;
121*06c3fb27SDimitry Andricdef X86ROTLI_H : NoDstFmt1RI4<0x00544015>;
122*06c3fb27SDimitry Andricdef X86ROTLI_W : NoDstFmt1RI5<0x00548016>;
123*06c3fb27SDimitry Andric
124*06c3fb27SDimitry Andricdef X86ROTR_B : NoDstFmt2R<0x003f8000>;
125*06c3fb27SDimitry Andricdef X86ROTR_H : NoDstFmt2R<0x003f8001>;
126*06c3fb27SDimitry Andricdef X86ROTR_W : NoDstFmt2R<0x003f8003>;
127*06c3fb27SDimitry Andricdef X86ROTRI_B : NoDstFmt1RI3<0x0054200c>;
128*06c3fb27SDimitry Andricdef X86ROTRI_H : NoDstFmt1RI4<0x0054400d>;
129*06c3fb27SDimitry Andricdef X86ROTRI_W : NoDstFmt1RI5<0x0054800e>;
130*06c3fb27SDimitry Andric
131*06c3fb27SDimitry Andricdef X86SLL_B : NoDstFmt2R<0x003f0014>;
132*06c3fb27SDimitry Andricdef X86SLL_H : NoDstFmt2R<0x003f0015>;
133*06c3fb27SDimitry Andricdef X86SLL_W : NoDstFmt2R<0x003f0016>;
134*06c3fb27SDimitry Andricdef X86SLLI_B : NoDstFmt1RI3<0x00542000>;
135*06c3fb27SDimitry Andricdef X86SLLI_H : NoDstFmt1RI4<0x00544001>;
136*06c3fb27SDimitry Andricdef X86SLLI_W : NoDstFmt1RI5<0x00548002>;
137*06c3fb27SDimitry Andric
138*06c3fb27SDimitry Andricdef X86SRL_B : NoDstFmt2R<0x003f0018>;
139*06c3fb27SDimitry Andricdef X86SRL_H : NoDstFmt2R<0x003f0019>;
140*06c3fb27SDimitry Andricdef X86SRL_W : NoDstFmt2R<0x003f001a>;
141*06c3fb27SDimitry Andricdef X86SRLI_B : NoDstFmt1RI3<0x00542004>;
142*06c3fb27SDimitry Andricdef X86SRLI_H : NoDstFmt1RI4<0x00544005>;
143*06c3fb27SDimitry Andricdef X86SRLI_W : NoDstFmt1RI5<0x00548006>;
144*06c3fb27SDimitry Andric
145*06c3fb27SDimitry Andricdef X86SRA_B : NoDstFmt2R<0x003f001c>;
146*06c3fb27SDimitry Andricdef X86SRA_H : NoDstFmt2R<0x003f001d>;
147*06c3fb27SDimitry Andricdef X86SRA_W : NoDstFmt2R<0x003f001e>;
148*06c3fb27SDimitry Andricdef X86SRAI_B : NoDstFmt1RI3<0x00542008>;
149*06c3fb27SDimitry Andricdef X86SRAI_H : NoDstFmt1RI4<0x00544009>;
150*06c3fb27SDimitry Andricdef X86SRAI_W : NoDstFmt1RI5<0x0054800a>;
151*06c3fb27SDimitry Andric
152*06c3fb27SDimitry Andricdef SETX86J : Fmt1RI4<0x00368000>;
153*06c3fb27SDimitry Andricdef SETX86LOOPE : ALU_2R<0x00007800>;
154*06c3fb27SDimitry Andricdef SETX86LOOPNE : ALU_2R<0x00007c00>;
155*06c3fb27SDimitry Andricdef X86MFFLAG : Fmt1RI8<0x005c0000>;
156*06c3fb27SDimitry Andricdef X86MTFLAG : Fmt1RI8<0x005c0020>;
157*06c3fb27SDimitry Andricdef X86MFTOP : FmtMFTOP<0x00007400>;
158*06c3fb27SDimitry Andricdef X86MTTOP : FmtMTTOP<0x00007000>;
159*06c3fb27SDimitry Andric
160*06c3fb27SDimitry Andricdef X86INCTOP : FmtI32<0x00008009>;
161*06c3fb27SDimitry Andricdef X86DECTOP : FmtI32<0x00008029>;
162*06c3fb27SDimitry Andricdef X86SETTM : FmtI32<0x00008008>;
163*06c3fb27SDimitry Andricdef X86CLRTM : FmtI32<0x00008028>;
164*06c3fb27SDimitry Andricdef X86SETTAG : Fmt1RI5I8<0x00580000>;
165*06c3fb27SDimitry Andric
166*06c3fb27SDimitry Andricdef ARMADD_W : NoDstFmt2RI4<0x00370010>;
167*06c3fb27SDimitry Andricdef ARMSUB_W : NoDstFmt2RI4<0x00378010>;
168*06c3fb27SDimitry Andricdef ARMADC_W : NoDstFmt2RI4<0x00380010>;
169*06c3fb27SDimitry Andricdef ARMSBC_W : NoDstFmt2RI4<0x00388010>;
170*06c3fb27SDimitry Andricdef ARMAND_W : NoDstFmt2RI4<0x00390010>;
171*06c3fb27SDimitry Andricdef ARMOR_W : NoDstFmt2RI4<0x00398010>;
172*06c3fb27SDimitry Andricdef ARMXOR_W : NoDstFmt2RI4<0x003a0010>;
173*06c3fb27SDimitry Andricdef ARMNOT_W : NoDstFmt1RI4<0x003fc01c>;
174*06c3fb27SDimitry Andricdef ARMSLL_W : NoDstFmt2RI4<0x003a8010>;
175*06c3fb27SDimitry Andricdef ARMSRL_W : NoDstFmt2RI4<0x003b0010>;
176*06c3fb27SDimitry Andricdef ARMSRA_W : NoDstFmt2RI4<0x003b8010>;
177*06c3fb27SDimitry Andricdef ARMROTR_W : NoDstFmt2RI4<0x003c0010>;
178*06c3fb27SDimitry Andricdef ARMSLLI_W : NoDstFmt1RI5I4<0x003c8010>;
179*06c3fb27SDimitry Andricdef ARMSRLI_W : NoDstFmt1RI5I4<0x003d0010>;
180*06c3fb27SDimitry Andricdef ARMSRAI_W : NoDstFmt1RI5I4<0x003d8010>;
181*06c3fb27SDimitry Andricdef ARMROTRI_W : NoDstFmt1RI5I4<0x003e0010>;
182*06c3fb27SDimitry Andricdef ARMRRX_W : NoDstFmt1RI4<0x003fc01f>;
183*06c3fb27SDimitry Andricdef ARMMOVE : Fmt2RI4<0x00364000>;
184*06c3fb27SDimitry Andricdef ARMMOV_W : NoDstFmt1RI4<0x003fc01d>;
185*06c3fb27SDimitry Andric
186*06c3fb27SDimitry Andricdef ARMMFFLAG : Fmt1RI8<0x005c0040>;
187*06c3fb27SDimitry Andricdef ARMMTFLAG : Fmt1RI8<0x005c0060>;
188*06c3fb27SDimitry Andricdef SETARMJ : Fmt1RI4<0x0036c000>;
189*06c3fb27SDimitry Andric
190*06c3fb27SDimitry Andriclet Predicates = [IsLA64] in {
191*06c3fb27SDimitry Andricdef ADDU12I_D : ALU_2RI5<0x00298000, simm5>;
192*06c3fb27SDimitry Andricdef ADC_D : ALU_3R<0x00318000>;
193*06c3fb27SDimitry Andricdef SBC_D : ALU_3R<0x00338000>;
194*06c3fb27SDimitry Andricdef RCR_D : ALU_3R<0x00358000>;
195*06c3fb27SDimitry Andricdef RCRI_D : ALU_2RI6<0x00510000, uimm6>;
196*06c3fb27SDimitry Andric
197*06c3fb27SDimitry Andric// mayLoad = 1
198*06c3fb27SDimitry Andriclet mayLoad = 1 in {
199*06c3fb27SDimitry Andricdef LDL_D : LOAD_2RI12<0x2e800000>;
200*06c3fb27SDimitry Andricdef LDR_D : LOAD_2RI12<0x2ec00000>;
201*06c3fb27SDimitry Andric} // mayLoad = 1
202*06c3fb27SDimitry Andric
203*06c3fb27SDimitry Andriclet mayStore = 1 in {
204*06c3fb27SDimitry Andricdef STL_D : STORE_2RI12<0x2f800000>;
205*06c3fb27SDimitry Andricdef STR_D : STORE_2RI12<0x2fc00000>;
206*06c3fb27SDimitry Andric} // mayStore = 1
207*06c3fb27SDimitry Andric
208*06c3fb27SDimitry Andricdef X86ADC_D : NoDstFmt2R<0x003f000f>;
209*06c3fb27SDimitry Andricdef X86ADD_D : NoDstFmt2R<0x003f0007>;
210*06c3fb27SDimitry Andricdef X86ADD_WU : NoDstFmt2R<0x003f0000>;
211*06c3fb27SDimitry Andricdef X86ADD_DU : NoDstFmt2R<0x003f0001>;
212*06c3fb27SDimitry Andricdef X86INC_D : NoDstFmt1R<0x00008003>;
213*06c3fb27SDimitry Andricdef X86SBC_D : NoDstFmt2R<0x003f0013>;
214*06c3fb27SDimitry Andricdef X86SUB_WU : NoDstFmt2R<0x003f0002>;
215*06c3fb27SDimitry Andricdef X86SUB_D : NoDstFmt2R<0x003f000b>;
216*06c3fb27SDimitry Andricdef X86SUB_DU : NoDstFmt2R<0x003f0003>;
217*06c3fb27SDimitry Andricdef X86DEC_D : NoDstFmt1R<0x00008007>;
218*06c3fb27SDimitry Andricdef X86AND_D : NoDstFmt2R<0x003f8013>;
219*06c3fb27SDimitry Andricdef X86OR_D : NoDstFmt2R<0x003f8017>;
220*06c3fb27SDimitry Andricdef X86XOR_D : NoDstFmt2R<0x003f801b>;
221*06c3fb27SDimitry Andricdef X86MUL_D : NoDstFmt2R<0x003e8003>;
222*06c3fb27SDimitry Andricdef X86MUL_WU : NoDstFmt2R<0x003e8006>;
223*06c3fb27SDimitry Andricdef X86MUL_DU : NoDstFmt2R<0x003e8007>;
224*06c3fb27SDimitry Andricdef X86RCL_D : NoDstFmt2R<0x003f800f>;
225*06c3fb27SDimitry Andricdef X86RCLI_D : NoDstFmt1RI6<0x0055001b>;
226*06c3fb27SDimitry Andricdef X86RCR_D : NoDstFmt2R<0x003f800b>;
227*06c3fb27SDimitry Andricdef X86RCRI_D : NoDstFmt1RI6<0x00550013>;
228*06c3fb27SDimitry Andricdef X86ROTL_D : NoDstFmt2R<0x003f8007>;
229*06c3fb27SDimitry Andricdef X86ROTLI_D : NoDstFmt1RI6<0x00550017>;
230*06c3fb27SDimitry Andricdef X86ROTR_D : NoDstFmt2R<0x003f8002>;
231*06c3fb27SDimitry Andricdef X86ROTRI_D : NoDstFmt1RI6<0x0055000f>;
232*06c3fb27SDimitry Andricdef X86SLL_D : NoDstFmt2R<0x003f0017>;
233*06c3fb27SDimitry Andricdef X86SLLI_D : NoDstFmt1RI6<0x00550003>;
234*06c3fb27SDimitry Andricdef X86SRL_D : NoDstFmt2R<0x003f001b>;
235*06c3fb27SDimitry Andricdef X86SRLI_D : NoDstFmt1RI6<0x00550007>;
236*06c3fb27SDimitry Andricdef X86SRA_D : NoDstFmt2R<0x003f001f>;
237*06c3fb27SDimitry Andricdef X86SRAI_D : NoDstFmt1RI6<0x0055000b>;
238*06c3fb27SDimitry Andricdef ARMMOV_D : NoDstFmt1RI4<0x003fc01e>;
239*06c3fb27SDimitry Andric
240*06c3fb27SDimitry Andric} // Predicates = [IsLA64]
241*06c3fb27SDimitry Andric} // hasSideEffects = 0, mayLoad = 0, mayStore = 0, Predicates = [HasExtLBT]
242