1292915Sdim//===- MipsEVAInstrInfo.td - EVA ASE instructions -*- tablegen ------------*-=//
2292915Sdim//
3292915Sdim//                     The LLVM Compiler Infrastructure
4292915Sdim//
5292915Sdim// This file is distributed under the University of Illinois Open Source
6292915Sdim// License. See LICENSE.TXT for details.
7292915Sdim//
8292915Sdim//===----------------------------------------------------------------------===//
9292915Sdim//
10292915Sdim// This file describes Mips EVA ASE instructions.
11292915Sdim//
12292915Sdim//===----------------------------------------------------------------------===//
13292915Sdim
14292915Sdim//===----------------------------------------------------------------------===//
15292915Sdim//
16292915Sdim// Instruction encodings
17292915Sdim//
18292915Sdim//===----------------------------------------------------------------------===//
19292915Sdim
20292915Sdim// Memory Load/Store EVA encodings
21292915Sdimclass LBE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBE>;
22292915Sdimclass LBuE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBuE>;
23292915Sdimclass LHE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHE>;
24292915Sdimclass LHuE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHuE>;
25292915Sdimclass LWE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWE>;
26292915Sdim
27292915Sdimclass SBE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SBE>;
28292915Sdimclass SHE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SHE>;
29292915Sdimclass SWE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWE>;
30292915Sdim
31292915Sdim// load/store left/right EVA encodings
32292915Sdimclass LWLE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWLE>;
33292915Sdimclass LWRE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWRE>;
34292915Sdimclass SWLE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWLE>;
35292915Sdimclass SWRE_ENC    : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWRE>;
36292915Sdim
37292915Sdim// Load-linked EVA, Store-conditional EVA encodings
38292915Sdimclass LLE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LLE>;
39292915Sdimclass SCE_ENC     : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SCE>;
40292915Sdim
41292915Sdimclass TLBINV_ENC  : TLB_FM<OPCODE6_TLBINV>;
42292915Sdimclass TLBINVF_ENC : TLB_FM<OPCODE6_TLBINVF>;
43292915Sdim
44292915Sdimclass CACHEE_ENC  : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_CACHEE>;
45292915Sdimclass PREFE_ENC   : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_PREFE>;
46292915Sdim
47292915Sdim//===----------------------------------------------------------------------===//
48292915Sdim//
49292915Sdim// Instruction descriptions
50292915Sdim//
51292915Sdim//===----------------------------------------------------------------------===//
52292915Sdim
53292915Sdim// Memory Load/Store EVA descriptions
54292915Sdimclass LOAD_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
55292915Sdim  dag OutOperandList = (outs GPROpnd:$rt);
56292915Sdim  dag InOperandList = (ins mem_simm9:$addr);
57292915Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
58292915Sdim  list<dag> Pattern = [];
59292915Sdim  string DecoderMethod = "DecodeMemEVA";
60292915Sdim  bit canFoldAsLoad = 1;
61292915Sdim  bit mayLoad = 1;
62292915Sdim}
63292915Sdim
64292915Sdimclass LBE_DESC  : LOAD_EVA_DESC_BASE<"lbe",  GPR32Opnd>;
65292915Sdimclass LBuE_DESC : LOAD_EVA_DESC_BASE<"lbue", GPR32Opnd>;
66292915Sdimclass LHE_DESC  : LOAD_EVA_DESC_BASE<"lhe",  GPR32Opnd>;
67292915Sdimclass LHuE_DESC : LOAD_EVA_DESC_BASE<"lhue", GPR32Opnd>;
68292915Sdimclass LWE_DESC  : LOAD_EVA_DESC_BASE<"lwe",  GPR32Opnd>;
69292915Sdim
70292915Sdimclass STORE_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
71292915Sdim                          SDPatternOperator OpNode = null_frag> {
72292915Sdim  dag OutOperandList = (outs);
73292915Sdim  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
74292915Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
75292915Sdim  list<dag> Pattern = [];
76292915Sdim  string DecoderMethod = "DecodeMemEVA";
77292915Sdim  bit mayStore = 1;
78292915Sdim}
79292915Sdim
80292915Sdimclass SBE_DESC  : STORE_EVA_DESC_BASE<"sbe",  GPR32Opnd>;
81292915Sdimclass SHE_DESC  : STORE_EVA_DESC_BASE<"she",  GPR32Opnd>;
82292915Sdimclass SWE_DESC  : STORE_EVA_DESC_BASE<"swe",  GPR32Opnd>;
83292915Sdim
84292915Sdim// Load/Store Left/Right EVA descriptions
85292915Sdimclass LOAD_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
86292915Sdim  dag OutOperandList = (outs GPROpnd:$rt);
87292915Sdim  dag InOperandList = (ins mem_simm9:$addr, GPROpnd:$src);
88292915Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
89292915Sdim  list<dag> Pattern = [];
90292915Sdim  string DecoderMethod = "DecodeMemEVA";
91292915Sdim  string Constraints = "$src = $rt";
92292915Sdim  bit canFoldAsLoad = 1;
93292915Sdim}
94292915Sdim
95292915Sdimclass LWLE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwle",  GPR32Opnd>;
96292915Sdimclass LWRE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwre",  GPR32Opnd>;
97292915Sdim
98292915Sdimclass STORE_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
99292915Sdim  dag OutOperandList = (outs);
100292915Sdim  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
101292915Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
102292915Sdim  list<dag> Pattern = [];
103292915Sdim  string DecoderMethod = "DecodeMemEVA";
104292915Sdim}
105292915Sdim
106292915Sdimclass SWLE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swle",  GPR32Opnd>;
107292915Sdimclass SWRE_DESC  : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swre",  GPR32Opnd>;
108292915Sdim
109292915Sdim// Load-linked EVA, Store-conditional EVA descriptions
110292915Sdimclass LLE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
111292915Sdim  dag OutOperandList = (outs GPROpnd:$rt);
112292915Sdim  dag InOperandList = (ins mem_simm9:$addr);
113292915Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
114292915Sdim  list<dag> Pattern = [];
115292915Sdim  bit mayLoad = 1;
116292915Sdim  string DecoderMethod = "DecodeMemEVA";
117292915Sdim}
118292915Sdim
119292915Sdimclass LLE_DESC : LLE_DESC_BASE<"lle", GPR32Opnd>;
120292915Sdim
121292915Sdimclass SCE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
122292915Sdim  dag OutOperandList = (outs GPROpnd:$dst);
123292915Sdim  dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr);
124292915Sdim  string AsmString = !strconcat(instr_asm, "\t$rt, $addr");
125292915Sdim  list<dag> Pattern = [];
126292915Sdim  bit mayStore = 1;
127292915Sdim  string Constraints = "$rt = $dst";
128292915Sdim  string DecoderMethod = "DecodeMemEVA";
129292915Sdim}
130292915Sdim
131292915Sdimclass SCE_DESC : SCE_DESC_BASE<"sce", GPR32Opnd>;
132292915Sdim
133292915Sdimclass TLB_DESC_BASE<string instr_asm> {
134292915Sdim  dag OutOperandList = (outs);
135292915Sdim  dag InOperandList = (ins);
136292915Sdim  string AsmString = instr_asm;
137292915Sdim  list<dag> Pattern = [];
138292915Sdim}
139292915Sdim
140292915Sdimclass TLBINV_DESC  : TLB_DESC_BASE<"tlbinv">;
141292915Sdimclass TLBINVF_DESC : TLB_DESC_BASE<"tlbinvf">;
142292915Sdim
143292915Sdimclass CACHEE_DESC_BASE<string instr_asm, Operand MemOpnd> {
144292915Sdim  dag OutOperandList = (outs);
145292915Sdim  dag InOperandList = (ins  MemOpnd:$addr, uimm5:$hint);
146292915Sdim  string AsmString = !strconcat(instr_asm, "\t$hint, $addr");
147292915Sdim  list<dag> Pattern = [];
148292915Sdim  string DecoderMethod = "DecodeCacheeOp_CacheOpR6";
149292915Sdim}
150292915Sdim
151292915Sdimclass CACHEE_DESC  : CACHEE_DESC_BASE<"cachee", mem>;
152292915Sdimclass PREFE_DESC   : CACHEE_DESC_BASE<"prefe", mem>;
153292915Sdim
154292915Sdim//===----------------------------------------------------------------------===//
155292915Sdim//
156292915Sdim// Instruction definitions
157292915Sdim//
158292915Sdim//===----------------------------------------------------------------------===//
159292915Sdim
160292915Sdim/// Load and Store EVA Instructions
161292915Sdimdef LBE     : LBE_ENC, LBE_DESC, INSN_EVA;
162292915Sdimdef LBuE    : LBuE_ENC, LBuE_DESC, INSN_EVA;
163292915Sdimdef LHE     : LHE_ENC, LHE_DESC, INSN_EVA;
164292915Sdimdef LHuE    : LHuE_ENC, LHuE_DESC, INSN_EVA;
165292915Sdimlet AdditionalPredicates = [NotInMicroMips] in {
166292915Sdimdef LWE     : LWE_ENC, LWE_DESC, INSN_EVA;
167292915Sdim}
168292915Sdimdef SBE     : SBE_ENC, SBE_DESC, INSN_EVA;
169292915Sdimdef SHE     : SHE_ENC, SHE_DESC, INSN_EVA;
170292915Sdimlet AdditionalPredicates = [NotInMicroMips] in {
171292915Sdimdef SWE     : SWE_ENC, SWE_DESC, INSN_EVA;
172292915Sdim}
173292915Sdim
174292915Sdim/// load/store left/right EVA
175292915Sdimlet AdditionalPredicates = [NotInMicroMips] in {
176292915Sdimdef LWLE    : LWLE_ENC, LWLE_DESC, INSN_EVA_NOT_32R6_64R6;
177292915Sdimdef LWRE    : LWRE_ENC, LWRE_DESC, INSN_EVA_NOT_32R6_64R6;
178292915Sdimdef SWLE    : SWLE_ENC, SWLE_DESC, INSN_EVA_NOT_32R6_64R6;
179292915Sdimdef SWRE    : SWRE_ENC, SWRE_DESC, INSN_EVA_NOT_32R6_64R6;
180292915Sdim}
181292915Sdim
182292915Sdim/// Load-linked EVA, Store-conditional EVA
183292915Sdimlet AdditionalPredicates = [NotInMicroMips] in {
184292915Sdimdef LLE     : LLE_ENC, LLE_DESC, INSN_EVA;
185292915Sdimdef SCE     : SCE_ENC, SCE_DESC, INSN_EVA;
186292915Sdim}
187292915Sdim
188292915Sdimdef TLBINV  : TLBINV_ENC, TLBINV_DESC, INSN_EVA;
189292915Sdimdef TLBINVF : TLBINVF_ENC, TLBINVF_DESC, INSN_EVA;
190292915Sdim
191292915Sdimdef CACHEE  : CACHEE_ENC, CACHEE_DESC, INSN_EVA;
192292915Sdimdef PREFE   : PREFE_ENC, PREFE_DESC, INSN_EVA;
193