xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsEVAInstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- MipsEVAInstrInfo.td - EVA ASE instructions -*- 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 Mips EVA ASE instructions.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker//
16*9880d681SAndroid Build Coastguard Worker// Instruction encodings
17*9880d681SAndroid Build Coastguard Worker//
18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker// Memory Load/Store EVA encodings
21*9880d681SAndroid Build Coastguard Workerclass LBE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBE>;
22*9880d681SAndroid Build Coastguard Workerclass LBuE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBuE>;
23*9880d681SAndroid Build Coastguard Workerclass LHE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHE>;
24*9880d681SAndroid Build Coastguard Workerclass LHuE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHuE>;
25*9880d681SAndroid Build Coastguard Workerclass LWE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWE>;
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerclass SBE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SBE>;
28*9880d681SAndroid Build Coastguard Workerclass SHE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SHE>;
29*9880d681SAndroid Build Coastguard Workerclass SWE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWE>;
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker// load/store left/right EVA encodings
32*9880d681SAndroid Build Coastguard Workerclass LWLE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWLE>;
33*9880d681SAndroid Build Coastguard Workerclass LWRE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWRE>;
34*9880d681SAndroid Build Coastguard Workerclass SWLE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWLE>;
35*9880d681SAndroid Build Coastguard Workerclass SWRE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWRE>;
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker// Load-linked EVA, Store-conditional EVA encodings
38*9880d681SAndroid Build Coastguard Workerclass LLE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LLE>;
39*9880d681SAndroid Build Coastguard Workerclass SCE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SCE>;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerclass TLBINV_ENC  : TLB_FM<OPCODE6_TLBINV>;
42*9880d681SAndroid Build Coastguard Workerclass TLBINVF_ENC : TLB_FM<OPCODE6_TLBINVF>;
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerclass CACHEE_ENC  : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_CACHEE>;
45*9880d681SAndroid Build Coastguard Workerclass PREFE_ENC   : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_PREFE>;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
48*9880d681SAndroid Build Coastguard Worker//
49*9880d681SAndroid Build Coastguard Worker// Instruction descriptions
50*9880d681SAndroid Build Coastguard Worker//
51*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker// Memory Load/Store EVA descriptions
54*9880d681SAndroid Build Coastguard Workerclass LOAD_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
55*9880d681SAndroid Build Coastguard Worker                         InstrItinClass itin = NoItinerary> {
56*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rt);
57*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins mem_simm9:$addr);
58*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
59*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
60*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeMemEVA";
61*9880d681SAndroid Build Coastguard Worker  bit canFoldAsLoad = 1;
62*9880d681SAndroid Build Coastguard Worker  bit mayLoad = 1;
63*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerclass LBE_DESC  : LOAD_EVA_DESC_BASE<"lbe",  GPR32Opnd, II_LBE>;
67*9880d681SAndroid Build Coastguard Workerclass LBuE_DESC : LOAD_EVA_DESC_BASE<"lbue", GPR32Opnd, II_LBUE>;
68*9880d681SAndroid Build Coastguard Workerclass LHE_DESC  : LOAD_EVA_DESC_BASE<"lhe",  GPR32Opnd, II_LHE>;
69*9880d681SAndroid Build Coastguard Workerclass LHuE_DESC : LOAD_EVA_DESC_BASE<"lhue", GPR32Opnd, II_LHUE>;
70*9880d681SAndroid Build Coastguard Workerclass LWE_DESC  : LOAD_EVA_DESC_BASE<"lwe",  GPR32Opnd, II_LWE>;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerclass STORE_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
73*9880d681SAndroid Build Coastguard Worker                          SDPatternOperator OpNode = null_frag,
74*9880d681SAndroid Build Coastguard Worker                          InstrItinClass itin = NoItinerary> {
75*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
76*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
77*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
78*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
79*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeMemEVA";
80*9880d681SAndroid Build Coastguard Worker  bit mayStore = 1;
81*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerclass SBE_DESC  : STORE_EVA_DESC_BASE<"sbe",  GPR32Opnd, null_frag, II_SBE>;
85*9880d681SAndroid Build Coastguard Workerclass SHE_DESC  : STORE_EVA_DESC_BASE<"she",  GPR32Opnd, null_frag, II_SHE>;
86*9880d681SAndroid Build Coastguard Workerclass SWE_DESC  : STORE_EVA_DESC_BASE<"swe",  GPR32Opnd, null_frag, II_SWE>;
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker// Load/Store Left/Right EVA descriptions
89*9880d681SAndroid Build Coastguard Workerclass LOAD_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
90*9880d681SAndroid Build Coastguard Worker                                    InstrItinClass itin = NoItinerary> {
91*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rt);
92*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins mem_simm9:$addr, GPROpnd:$src);
93*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
94*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
95*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeMemEVA";
96*9880d681SAndroid Build Coastguard Worker  string Constraints = "$src = $rt";
97*9880d681SAndroid Build Coastguard Worker  bit canFoldAsLoad = 1;
98*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerclass LWLE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwle",  GPR32Opnd, II_LWLE>;
102*9880d681SAndroid Build Coastguard Workerclass LWRE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwre",  GPR32Opnd, II_LWRE>;
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerclass STORE_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
105*9880d681SAndroid Build Coastguard Worker                                     InstrItinClass itin = NoItinerary> {
106*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
107*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
108*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
109*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
110*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeMemEVA";
111*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerclass SWLE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swle",  GPR32Opnd, II_SWLE>;
115*9880d681SAndroid Build Coastguard Workerclass SWRE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swre",  GPR32Opnd, II_SWRE>;
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker// Load-linked EVA, Store-conditional EVA descriptions
118*9880d681SAndroid Build Coastguard Workerclass LLE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
119*9880d681SAndroid Build Coastguard Worker                    InstrItinClass itin = NoItinerary> {
120*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$rt);
121*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins mem_simm9:$addr);
122*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
123*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
124*9880d681SAndroid Build Coastguard Worker  bit mayLoad = 1;
125*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeMemEVA";
126*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerclass LLE_DESC : LLE_DESC_BASE<"lle", GPR32Opnd, II_LLE>;
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerclass SCE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
132*9880d681SAndroid Build Coastguard Worker                    InstrItinClass itin = NoItinerary> {
133*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs GPROpnd:$dst);
134*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
135*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
136*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
137*9880d681SAndroid Build Coastguard Worker  bit mayStore = 1;
138*9880d681SAndroid Build Coastguard Worker  string Constraints = "$rt = $dst";
139*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeMemEVA";
140*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerclass SCE_DESC : SCE_DESC_BASE<"sce", GPR32Opnd, II_SCE>;
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerclass TLB_DESC_BASE<string instr_asm, InstrItinClass itin = NoItinerary> {
146*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
147*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins);
148*9880d681SAndroid Build Coastguard Worker  string AsmString = instr_asm;
149*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
150*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerclass TLBINV_DESC  : TLB_DESC_BASE<"tlbinv", II_TLBINV>;
154*9880d681SAndroid Build Coastguard Workerclass TLBINVF_DESC : TLB_DESC_BASE<"tlbinvf", II_TLBINVF>;
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerclass CACHEE_DESC_BASE<string instr_asm, Operand MemOpnd,
157*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin = NoItinerary> {
158*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = (outs);
159*9880d681SAndroid Build Coastguard Worker  dag InOperandList = (ins  MemOpnd:$addr, uimm5:$hint);
160*9880d681SAndroid Build Coastguard Worker  string AsmString = !strconcat(instr_asm, "\t$hint, $addr");
161*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = [];
162*9880d681SAndroid Build Coastguard Worker  string DecoderMethod = "DecodeCacheeOp_CacheOpR6";
163*9880d681SAndroid Build Coastguard Worker  InstrItinClass Itinerary = itin;
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerclass CACHEE_DESC  : CACHEE_DESC_BASE<"cachee", mem_simm9, II_CACHEE>;
167*9880d681SAndroid Build Coastguard Workerclass PREFE_DESC   : CACHEE_DESC_BASE<"prefe", mem_simm9, II_PREFE>;
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
170*9880d681SAndroid Build Coastguard Worker//
171*9880d681SAndroid Build Coastguard Worker// Instruction definitions
172*9880d681SAndroid Build Coastguard Worker//
173*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker/// Load and Store EVA Instructions
176*9880d681SAndroid Build Coastguard Workerdef LBE     : LBE_ENC, LBE_DESC, INSN_EVA;
177*9880d681SAndroid Build Coastguard Workerdef LBuE    : LBuE_ENC, LBuE_DESC, INSN_EVA;
178*9880d681SAndroid Build Coastguard Workerdef LHE     : LHE_ENC, LHE_DESC, INSN_EVA;
179*9880d681SAndroid Build Coastguard Workerdef LHuE    : LHuE_ENC, LHuE_DESC, INSN_EVA;
180*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
181*9880d681SAndroid Build Coastguard Workerdef LWE     : LWE_ENC, LWE_DESC, INSN_EVA;
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Workerdef SBE     : SBE_ENC, SBE_DESC, INSN_EVA;
184*9880d681SAndroid Build Coastguard Workerdef SHE     : SHE_ENC, SHE_DESC, INSN_EVA;
185*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
186*9880d681SAndroid Build Coastguard Workerdef SWE     : SWE_ENC, SWE_DESC, INSN_EVA;
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker/// load/store left/right EVA
190*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
191*9880d681SAndroid Build Coastguard Workerdef LWLE    : LWLE_ENC, LWLE_DESC, INSN_EVA_NOT_32R6_64R6;
192*9880d681SAndroid Build Coastguard Workerdef LWRE    : LWRE_ENC, LWRE_DESC, INSN_EVA_NOT_32R6_64R6;
193*9880d681SAndroid Build Coastguard Workerdef SWLE    : SWLE_ENC, SWLE_DESC, INSN_EVA_NOT_32R6_64R6;
194*9880d681SAndroid Build Coastguard Workerdef SWRE    : SWRE_ENC, SWRE_DESC, INSN_EVA_NOT_32R6_64R6;
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker/// Load-linked EVA, Store-conditional EVA
198*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
199*9880d681SAndroid Build Coastguard Workerdef LLE     : LLE_ENC, LLE_DESC, INSN_EVA;
200*9880d681SAndroid Build Coastguard Workerdef SCE     : SCE_ENC, SCE_DESC, INSN_EVA;
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in {
204*9880d681SAndroid Build Coastguard Worker  def TLBINV  : TLBINV_ENC, TLBINV_DESC, INSN_EVA;
205*9880d681SAndroid Build Coastguard Worker  def TLBINVF : TLBINVF_ENC, TLBINVF_DESC, INSN_EVA;
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerdef CACHEE  : CACHEE_ENC, CACHEE_DESC, INSN_EVA;
209*9880d681SAndroid Build Coastguard Workerdef PREFE   : PREFE_ENC, PREFE_DESC, INSN_EVA;
210