blob: 44ca5ffc0aa836ccc8fcde91f91e9221f28df863 [file] [log] [blame]
Akira Hatanakaecfb8282012-09-22 00:07:12 +00001//===- MipsDSPInstrInfo.td - DSP ASE instructions -*- tablegen ------------*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes Mips DSP ASE instructions.
11//
12//===----------------------------------------------------------------------===//
13
14// ImmLeaf
15def immZExt2 : ImmLeaf<i32, [{return isUInt<2>(Imm);}]>;
16def immZExt3 : ImmLeaf<i32, [{return isUInt<3>(Imm);}]>;
17def immZExt4 : ImmLeaf<i32, [{return isUInt<4>(Imm);}]>;
18def immZExt8 : ImmLeaf<i32, [{return isUInt<8>(Imm);}]>;
19def immZExt10 : ImmLeaf<i32, [{return isUInt<10>(Imm);}]>;
20def immSExt6 : ImmLeaf<i32, [{return isInt<6>(Imm);}]>;
Akira Hatanaka5eeac4f2012-09-27 01:50:59 +000021
Akira Hatanaka1babeaa2012-09-27 02:05:42 +000022// Mips-specific dsp nodes
23def SDT_MipsExtr : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>]>;
Akira Hatanaka9061a462012-09-27 02:11:20 +000024def SDT_MipsShilo : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>;
25def SDT_MipsDPA : SDTypeProfile<0, 2, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>]>;
26
27class MipsDSPBase<string Opc, SDTypeProfile Prof> :
28 SDNode<!strconcat("MipsISD::", Opc), Prof,
29 [SDNPHasChain, SDNPInGlue, SDNPOutGlue]>;
Akira Hatanaka1babeaa2012-09-27 02:05:42 +000030
31class MipsDSPSideEffectBase<string Opc, SDTypeProfile Prof> :
32 SDNode<!strconcat("MipsISD::", Opc), Prof,
33 [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPSideEffect]>;
34
35def MipsEXTP : MipsDSPSideEffectBase<"EXTP", SDT_MipsExtr>;
36def MipsEXTPDP : MipsDSPSideEffectBase<"EXTPDP", SDT_MipsExtr>;
37def MipsEXTR_S_H : MipsDSPSideEffectBase<"EXTR_S_H", SDT_MipsExtr>;
38def MipsEXTR_W : MipsDSPSideEffectBase<"EXTR_W", SDT_MipsExtr>;
39def MipsEXTR_R_W : MipsDSPSideEffectBase<"EXTR_R_W", SDT_MipsExtr>;
40def MipsEXTR_RS_W : MipsDSPSideEffectBase<"EXTR_RS_W", SDT_MipsExtr>;
41
Akira Hatanaka9061a462012-09-27 02:11:20 +000042def MipsSHILO : MipsDSPBase<"SHILO", SDT_MipsShilo>;
43def MipsMTHLIP : MipsDSPBase<"MTHLIP", SDT_MipsShilo>;
44
45def MipsMULSAQ_S_W_PH : MipsDSPSideEffectBase<"MULSAQ_S_W_PH", SDT_MipsDPA>;
46def MipsMAQ_S_W_PHL : MipsDSPSideEffectBase<"MAQ_S_W_PHL", SDT_MipsDPA>;
47def MipsMAQ_S_W_PHR : MipsDSPSideEffectBase<"MAQ_S_W_PHR", SDT_MipsDPA>;
48def MipsMAQ_SA_W_PHL : MipsDSPSideEffectBase<"MAQ_SA_W_PHL", SDT_MipsDPA>;
49def MipsMAQ_SA_W_PHR : MipsDSPSideEffectBase<"MAQ_SA_W_PHR", SDT_MipsDPA>;
50
51def MipsDPAU_H_QBL : MipsDSPBase<"DPAU_H_QBL", SDT_MipsDPA>;
52def MipsDPAU_H_QBR : MipsDSPBase<"DPAU_H_QBR", SDT_MipsDPA>;
53def MipsDPSU_H_QBL : MipsDSPBase<"DPSU_H_QBL", SDT_MipsDPA>;
54def MipsDPSU_H_QBR : MipsDSPBase<"DPSU_H_QBR", SDT_MipsDPA>;
55def MipsDPAQ_S_W_PH : MipsDSPSideEffectBase<"DPAQ_S_W_PH", SDT_MipsDPA>;
56def MipsDPSQ_S_W_PH : MipsDSPSideEffectBase<"DPSQ_S_W_PH", SDT_MipsDPA>;
57def MipsDPAQ_SA_L_W : MipsDSPSideEffectBase<"DPAQ_SA_L_W", SDT_MipsDPA>;
58def MipsDPSQ_SA_L_W : MipsDSPSideEffectBase<"DPSQ_SA_L_W", SDT_MipsDPA>;
59
60def MipsDPA_W_PH : MipsDSPBase<"DPA_W_PH", SDT_MipsDPA>;
61def MipsDPS_W_PH : MipsDSPBase<"DPS_W_PH", SDT_MipsDPA>;
62def MipsDPAQX_S_W_PH : MipsDSPSideEffectBase<"DPAQX_S_W_PH", SDT_MipsDPA>;
63def MipsDPAQX_SA_W_PH : MipsDSPSideEffectBase<"DPAQX_SA_W_PH", SDT_MipsDPA>;
64def MipsDPAX_W_PH : MipsDSPBase<"DPAX_W_PH", SDT_MipsDPA>;
65def MipsDPSX_W_PH : MipsDSPBase<"DPSX_W_PH", SDT_MipsDPA>;
66def MipsDPSQX_S_W_PH : MipsDSPSideEffectBase<"DPSQX_S_W_PH", SDT_MipsDPA>;
67def MipsDPSQX_SA_W_PH : MipsDSPSideEffectBase<"DPSQX_SA_W_PH", SDT_MipsDPA>;
68def MipsMULSA_W_PH : MipsDSPBase<"MULSA_W_PH", SDT_MipsDPA>;
69
70def MipsMULT : MipsDSPBase<"MULT", SDT_MipsDPA>;
71def MipsMULTU : MipsDSPBase<"MULTU", SDT_MipsDPA>;
72def MipsMADD_DSP : MipsDSPBase<"MADD_DSP", SDT_MipsDPA>;
73def MipsMADDU_DSP : MipsDSPBase<"MADDU_DSP", SDT_MipsDPA>;
74def MipsMSUB_DSP : MipsDSPBase<"MSUB_DSP", SDT_MipsDPA>;
75def MipsMSUBU_DSP : MipsDSPBase<"MSUBU_DSP", SDT_MipsDPA>;
76
77// Flags.
78class IsCommutable {
79 bit isCommutable = 1;
80}
81
82class UseAC {
83 list<Register> Uses = [AC0];
84}
85
Akira Hatanakad09642b2012-09-27 03:13:59 +000086class UseDSPCtrl {
87 list<Register> Uses = [DSPCtrl];
88}
89
90class ClearDefs {
91 list<Register> Defs = [];
92}
93
Akira Hatanaka1babeaa2012-09-27 02:05:42 +000094// Instruction encoding.
Akira Hatanakad09642b2012-09-27 03:13:59 +000095class ADDU_QB_ENC : ADDU_QB_FMT<0b00000>;
96class ADDU_S_QB_ENC : ADDU_QB_FMT<0b00100>;
97class SUBU_QB_ENC : ADDU_QB_FMT<0b00001>;
98class SUBU_S_QB_ENC : ADDU_QB_FMT<0b00101>;
99class ADDQ_PH_ENC : ADDU_QB_FMT<0b01010>;
100class ADDQ_S_PH_ENC : ADDU_QB_FMT<0b01110>;
101class SUBQ_PH_ENC : ADDU_QB_FMT<0b01011>;
102class SUBQ_S_PH_ENC : ADDU_QB_FMT<0b01111>;
103class ADDQ_S_W_ENC : ADDU_QB_FMT<0b10110>;
104class SUBQ_S_W_ENC : ADDU_QB_FMT<0b10111>;
105class ADDSC_ENC : ADDU_QB_FMT<0b10000>;
106class ADDWC_ENC : ADDU_QB_FMT<0b10001>;
107class MODSUB_ENC : ADDU_QB_FMT<0b10010>;
108class RADDU_W_QB_ENC : RADDU_W_QB_FMT<0b10100>;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000109class PRECRQ_QB_PH_ENC : CMP_EQ_QB_R3_FMT<0b01100>;
110class PRECRQ_PH_W_ENC : CMP_EQ_QB_R3_FMT<0b10100>;
111class PRECRQ_RS_PH_W_ENC : CMP_EQ_QB_R3_FMT<0b10101>;
112class PRECRQU_S_QB_PH_ENC : CMP_EQ_QB_R3_FMT<0b01111>;
Akira Hatanaka892b1042012-09-27 19:05:08 +0000113class SHLL_QB_ENC : SHLL_QB_FMT<0b00000>;
114class SHLLV_QB_ENC : SHLL_QB_FMT<0b00010>;
115class SHRL_QB_ENC : SHLL_QB_FMT<0b00001>;
116class SHRLV_QB_ENC : SHLL_QB_FMT<0b00011>;
117class SHLL_PH_ENC : SHLL_QB_FMT<0b01000>;
118class SHLLV_PH_ENC : SHLL_QB_FMT<0b01010>;
119class SHLL_S_PH_ENC : SHLL_QB_FMT<0b01100>;
120class SHLLV_S_PH_ENC : SHLL_QB_FMT<0b01110>;
121class SHRA_PH_ENC : SHLL_QB_FMT<0b01001>;
122class SHRAV_PH_ENC : SHLL_QB_FMT<0b01011>;
123class SHRA_R_PH_ENC : SHLL_QB_FMT<0b01101>;
124class SHRAV_R_PH_ENC : SHLL_QB_FMT<0b01111>;
125class SHLL_S_W_ENC : SHLL_QB_FMT<0b10100>;
126class SHLLV_S_W_ENC : SHLL_QB_FMT<0b10110>;
127class SHRA_R_W_ENC : SHLL_QB_FMT<0b10101>;
128class SHRAV_R_W_ENC : SHLL_QB_FMT<0b10111>;
Akira Hatanakad09642b2012-09-27 03:13:59 +0000129class MULEU_S_PH_QBL_ENC : ADDU_QB_FMT<0b00110>;
130class MULEU_S_PH_QBR_ENC : ADDU_QB_FMT<0b00111>;
131class MULEQ_S_W_PHL_ENC : ADDU_QB_FMT<0b11100>;
132class MULEQ_S_W_PHR_ENC : ADDU_QB_FMT<0b11101>;
133class MULQ_RS_PH_ENC : ADDU_QB_FMT<0b11111>;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000134class MULSAQ_S_W_PH_ENC : DPA_W_PH_FMT<0b00110>;
135class MAQ_S_W_PHL_ENC : DPA_W_PH_FMT<0b10100>;
136class MAQ_S_W_PHR_ENC : DPA_W_PH_FMT<0b10110>;
137class MAQ_SA_W_PHL_ENC : DPA_W_PH_FMT<0b10000>;
138class MAQ_SA_W_PHR_ENC : DPA_W_PH_FMT<0b10010>;
139class DPAU_H_QBL_ENC : DPA_W_PH_FMT<0b00011>;
140class DPAU_H_QBR_ENC : DPA_W_PH_FMT<0b00111>;
141class DPSU_H_QBL_ENC : DPA_W_PH_FMT<0b01011>;
142class DPSU_H_QBR_ENC : DPA_W_PH_FMT<0b01111>;
143class DPAQ_S_W_PH_ENC : DPA_W_PH_FMT<0b00100>;
144class DPSQ_S_W_PH_ENC : DPA_W_PH_FMT<0b00101>;
145class DPAQ_SA_L_W_ENC : DPA_W_PH_FMT<0b01100>;
146class DPSQ_SA_L_W_ENC : DPA_W_PH_FMT<0b01101>;
147class MULT_DSP_ENC : MULT_FMT<0b000000, 0b011000>;
148class MULTU_DSP_ENC : MULT_FMT<0b000000, 0b011001>;
149class MADD_DSP_ENC : MULT_FMT<0b011100, 0b000000>;
150class MADDU_DSP_ENC : MULT_FMT<0b011100, 0b000001>;
151class MSUB_DSP_ENC : MULT_FMT<0b011100, 0b000100>;
152class MSUBU_DSP_ENC : MULT_FMT<0b011100, 0b000101>;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000153class CMPU_EQ_QB_ENC : CMP_EQ_QB_R2_FMT<0b00000>;
154class CMPU_LT_QB_ENC : CMP_EQ_QB_R2_FMT<0b00001>;
155class CMPU_LE_QB_ENC : CMP_EQ_QB_R2_FMT<0b00010>;
156class CMPGU_EQ_QB_ENC : CMP_EQ_QB_R3_FMT<0b00100>;
157class CMPGU_LT_QB_ENC : CMP_EQ_QB_R3_FMT<0b00101>;
158class CMPGU_LE_QB_ENC : CMP_EQ_QB_R3_FMT<0b00110>;
159class CMP_EQ_PH_ENC : CMP_EQ_QB_R2_FMT<0b01000>;
160class CMP_LT_PH_ENC : CMP_EQ_QB_R2_FMT<0b01001>;
161class CMP_LE_PH_ENC : CMP_EQ_QB_R2_FMT<0b01010>;
162class PACKRL_PH_ENC : CMP_EQ_QB_R3_FMT<0b01110>;
163class PICK_QB_ENC : CMP_EQ_QB_R3_FMT<0b00011>;
164class PICK_PH_ENC : CMP_EQ_QB_R3_FMT<0b01011>;
Akira Hatanakae4bd0542012-09-27 02:15:57 +0000165class BPOSGE32_ENC : BPOSGE32_FMT<0b11100>;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000166
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000167class EXTP_ENC : EXTR_W_TY1_FMT<0b00010>;
168class EXTPV_ENC : EXTR_W_TY1_FMT<0b00011>;
169class EXTPDP_ENC : EXTR_W_TY1_FMT<0b01010>;
170class EXTPDPV_ENC : EXTR_W_TY1_FMT<0b01011>;
171class EXTR_W_ENC : EXTR_W_TY1_FMT<0b00000>;
172class EXTRV_W_ENC : EXTR_W_TY1_FMT<0b00001>;
173class EXTR_R_W_ENC : EXTR_W_TY1_FMT<0b00100>;
174class EXTRV_R_W_ENC : EXTR_W_TY1_FMT<0b00101>;
175class EXTR_RS_W_ENC : EXTR_W_TY1_FMT<0b00110>;
176class EXTRV_RS_W_ENC : EXTR_W_TY1_FMT<0b00111>;
177class EXTR_S_H_ENC : EXTR_W_TY1_FMT<0b01110>;
178class EXTRV_S_H_ENC : EXTR_W_TY1_FMT<0b01111>;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000179class SHILO_ENC : SHILO_R1_FMT<0b11010>;
180class SHILOV_ENC : SHILO_R2_FMT<0b11011>;
181class MTHLIP_ENC : SHILO_R2_FMT<0b11111>;
182
Akira Hatanaka314b43b2012-09-27 04:08:42 +0000183class RDDSP_ENC : RDDSP_FMT<0b10010>;
Akira Hatanakad09642b2012-09-27 03:13:59 +0000184class ADDU_PH_ENC : ADDU_QB_FMT<0b01000>;
185class ADDU_S_PH_ENC : ADDU_QB_FMT<0b01100>;
186class SUBU_PH_ENC : ADDU_QB_FMT<0b01001>;
187class SUBU_S_PH_ENC : ADDU_QB_FMT<0b01101>;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000188class CMPGDU_EQ_QB_ENC : CMP_EQ_QB_R3_FMT<0b11000>;
189class CMPGDU_LT_QB_ENC : CMP_EQ_QB_R3_FMT<0b11001>;
190class CMPGDU_LE_QB_ENC : CMP_EQ_QB_R3_FMT<0b11010>;
Akira Hatanakad09642b2012-09-27 03:13:59 +0000191class MULQ_S_PH_ENC : ADDU_QB_FMT<0b11110>;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000192class DPA_W_PH_ENC : DPA_W_PH_FMT<0b00000>;
193class DPS_W_PH_ENC : DPA_W_PH_FMT<0b00001>;
194class DPAQX_S_W_PH_ENC : DPA_W_PH_FMT<0b11000>;
195class DPAQX_SA_W_PH_ENC : DPA_W_PH_FMT<0b11010>;
196class DPAX_W_PH_ENC : DPA_W_PH_FMT<0b01000>;
197class DPSX_W_PH_ENC : DPA_W_PH_FMT<0b01001>;
198class DPSQX_S_W_PH_ENC : DPA_W_PH_FMT<0b11001>;
199class DPSQX_SA_W_PH_ENC : DPA_W_PH_FMT<0b11011>;
200class MULSA_W_PH_ENC : DPA_W_PH_FMT<0b00010>;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000201class PRECR_QB_PH_ENC : CMP_EQ_QB_R3_FMT<0b01101>;
202class PRECR_SRA_PH_W_ENC : PRECR_SRA_PH_W_FMT<0b11110>;
203class PRECR_SRA_R_PH_W_ENC : PRECR_SRA_PH_W_FMT<0b11111>;
Akira Hatanaka892b1042012-09-27 19:05:08 +0000204class SHRA_QB_ENC : SHLL_QB_FMT<0b00100>;
205class SHRAV_QB_ENC : SHLL_QB_FMT<0b00110>;
206class SHRA_R_QB_ENC : SHLL_QB_FMT<0b00101>;
207class SHRAV_R_QB_ENC : SHLL_QB_FMT<0b00111>;
208class SHRL_PH_ENC : SHLL_QB_FMT<0b11001>;
209class SHRLV_PH_ENC : SHLL_QB_FMT<0b11011>;
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000210
211// Instruction desc.
Akira Hatanakad09642b2012-09-27 03:13:59 +0000212class ADDU_QB_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
213 InstrItinClass itin, RegisterClass RCD,
214 RegisterClass RCS, RegisterClass RCT = RCS> {
215 dag OutOperandList = (outs RCD:$rd);
216 dag InOperandList = (ins RCS:$rs, RCT:$rt);
217 string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
218 list<dag> Pattern = [(set RCD:$rd, (OpNode RCS:$rs, RCT:$rt))];
219 InstrItinClass Itinerary = itin;
220 list<Register> Defs = [DSPCtrl];
221}
222
223class RADDU_W_QB_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
224 InstrItinClass itin, RegisterClass RCD,
225 RegisterClass RCS = RCD> {
226 dag OutOperandList = (outs RCD:$rd);
227 dag InOperandList = (ins RCS:$rs);
228 string AsmString = !strconcat(instr_asm, "\t$rd, $rs");
229 list<dag> Pattern = [(set RCD:$rd, (OpNode RCS:$rs))];
230 InstrItinClass Itinerary = itin;
231 list<Register> Defs = [DSPCtrl];
232}
233
Akira Hatanakab664ae62012-09-27 03:58:34 +0000234class CMP_EQ_QB_R2_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
235 InstrItinClass itin, RegisterClass RCS,
236 RegisterClass RCT = RCS> {
237 dag OutOperandList = (outs);
238 dag InOperandList = (ins RCS:$rs, RCT:$rt);
239 string AsmString = !strconcat(instr_asm, "\t$rs, $rt");
240 list<dag> Pattern = [(OpNode RCS:$rs, RCT:$rt)];
241 InstrItinClass Itinerary = itin;
242 list<Register> Defs = [DSPCtrl];
243}
244
245class CMP_EQ_QB_R3_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
246 InstrItinClass itin, RegisterClass RCD,
247 RegisterClass RCS, RegisterClass RCT = RCS> {
248 dag OutOperandList = (outs RCD:$rd);
249 dag InOperandList = (ins RCS:$rs, RCT:$rt);
250 string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt");
251 list<dag> Pattern = [(set RCD:$rd, (OpNode RCS:$rs, RCT:$rt))];
252 InstrItinClass Itinerary = itin;
253 list<Register> Defs = [DSPCtrl];
254}
255
256class PRECR_SRA_PH_W_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
257 InstrItinClass itin, RegisterClass RCT,
258 RegisterClass RCS = RCT> {
259 dag OutOperandList = (outs RCT:$rt);
260 dag InOperandList = (ins RCS:$rs, shamt:$sa, RCS:$src);
261 string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $sa");
262 list<dag> Pattern = [(set RCT:$rt, (OpNode RCS:$src, RCS:$rs, immZExt5:$sa))];
263 InstrItinClass Itinerary = itin;
264 list<Register> Defs = [DSPCtrl];
265 string Constraints = "$src = $rt";
266}
267
Akira Hatanaka892b1042012-09-27 19:05:08 +0000268class SHLL_QB_R3_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
269 InstrItinClass itin, RegisterClass RC> {
270 dag OutOperandList = (outs RC:$rd);
271 dag InOperandList = (ins RC:$rt, CPURegs:$rs_sa);
272 string AsmString = !strconcat(instr_asm, "\t$rd, $rt, $rs_sa");
273 list<dag> Pattern = [(set RC:$rd, (OpNode RC:$rt, CPURegs:$rs_sa))];
274 InstrItinClass Itinerary = itin;
275 list<Register> Defs = [DSPCtrl];
276}
277
278class SHLL_QB_R2_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
279 SDPatternOperator ImmPat, InstrItinClass itin,
280 RegisterClass RC> {
281 dag OutOperandList = (outs RC:$rd);
282 dag InOperandList = (ins RC:$rt, uimm16:$rs_sa);
283 string AsmString = !strconcat(instr_asm, "\t$rd, $rt, $rs_sa");
284 list<dag> Pattern = [(set RC:$rd, (OpNode RC:$rt, ImmPat:$rs_sa))];
285 InstrItinClass Itinerary = itin;
286 list<Register> Defs = [DSPCtrl];
287}
288
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000289class EXTR_W_TY1_R2_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
290 InstrItinClass itin> {
291 dag OutOperandList = (outs CPURegs:$rt);
292 dag InOperandList = (ins ACRegs:$ac, CPURegs:$shift_rs);
293 string AsmString = !strconcat(instr_asm, "\t$rt, $ac, $shift_rs");
294 InstrItinClass Itinerary = itin;
295 list<Register> Defs = [DSPCtrl];
296}
297
298class EXTR_W_TY1_R1_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
299 InstrItinClass itin> {
300 dag OutOperandList = (outs CPURegs:$rt);
301 dag InOperandList = (ins ACRegs:$ac, uimm16:$shift_rs);
302 string AsmString = !strconcat(instr_asm, "\t$rt, $ac, $shift_rs");
303 InstrItinClass Itinerary = itin;
304 list<Register> Defs = [DSPCtrl];
305}
306
Akira Hatanaka9061a462012-09-27 02:11:20 +0000307class SHILO_R1_PSEUDO_BASE<SDPatternOperator OpNode, InstrItinClass itin,
308 Instruction realinst> :
309 PseudoDSP<(outs), (ins simm16:$shift), [(OpNode immSExt6:$shift)]>,
310 PseudoInstExpansion<(realinst AC0, simm16:$shift)> {
311 list<Register> Defs = [DSPCtrl, AC0];
312 list<Register> Uses = [AC0];
313 InstrItinClass Itinerary = itin;
314}
315
316class SHILO_R1_DESC_BASE<string instr_asm> {
317 dag OutOperandList = (outs ACRegs:$ac);
318 dag InOperandList = (ins simm16:$shift);
319 string AsmString = !strconcat(instr_asm, "\t$ac, $shift");
320}
321
322class SHILO_R2_PSEUDO_BASE<SDPatternOperator OpNode, InstrItinClass itin,
323 Instruction realinst> :
324 PseudoDSP<(outs), (ins CPURegs:$rs), [(OpNode CPURegs:$rs)]>,
325 PseudoInstExpansion<(realinst AC0, CPURegs:$rs)> {
326 list<Register> Defs = [DSPCtrl, AC0];
327 list<Register> Uses = [AC0];
328 InstrItinClass Itinerary = itin;
329}
330
331class SHILO_R2_DESC_BASE<string instr_asm> {
332 dag OutOperandList = (outs ACRegs:$ac);
333 dag InOperandList = (ins CPURegs:$rs);
334 string AsmString = !strconcat(instr_asm, "\t$ac, $rs");
335}
336
337class MTHLIP_DESC_BASE<string instr_asm> {
338 dag OutOperandList = (outs ACRegs:$ac);
339 dag InOperandList = (ins CPURegs:$rs);
340 string AsmString = !strconcat(instr_asm, "\t$rs, $ac");
341}
342
Akira Hatanaka314b43b2012-09-27 04:08:42 +0000343class RDDSP_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
344 InstrItinClass itin> {
345 dag OutOperandList = (outs CPURegs:$rd);
346 dag InOperandList = (ins uimm16:$mask);
347 string AsmString = !strconcat(instr_asm, "\t$rd, $mask");
348 list<dag> Pattern = [(set CPURegs:$rd, (OpNode immZExt10:$mask))];
349 InstrItinClass Itinerary = itin;
350 list<Register> Uses = [DSPCtrl];
351}
352
Akira Hatanaka9061a462012-09-27 02:11:20 +0000353class DPA_W_PH_PSEUDO_BASE<SDPatternOperator OpNode, InstrItinClass itin,
354 Instruction realinst> :
355 PseudoDSP<(outs), (ins CPURegs:$rs, CPURegs:$rt),
356 [(OpNode CPURegs:$rs, CPURegs:$rt)]>,
357 PseudoInstExpansion<(realinst AC0, CPURegs:$rs, CPURegs:$rt)> {
358 list<Register> Defs = [DSPCtrl, AC0];
359 list<Register> Uses = [AC0];
360 InstrItinClass Itinerary = itin;
361}
362
363class DPA_W_PH_DESC_BASE<string instr_asm> {
364 dag OutOperandList = (outs ACRegs:$ac);
365 dag InOperandList = (ins CPURegs:$rs, CPURegs:$rt);
366 string AsmString = !strconcat(instr_asm, "\t$ac, $rs, $rt");
367}
368
369class MULT_PSEUDO_BASE<SDPatternOperator OpNode, InstrItinClass itin,
370 Instruction realinst> :
371 PseudoDSP<(outs), (ins CPURegs:$rs, CPURegs:$rt),
372 [(OpNode CPURegs:$rs, CPURegs:$rt)]>,
373 PseudoInstExpansion<(realinst AC0, CPURegs:$rs, CPURegs:$rt)> {
374 list<Register> Defs = [DSPCtrl, AC0];
375 InstrItinClass Itinerary = itin;
376}
377
378class MULT_DESC_BASE<string instr_asm> {
379 dag OutOperandList = (outs ACRegs:$ac);
380 dag InOperandList = (ins CPURegs:$rs, CPURegs:$rt);
381 string AsmString = !strconcat(instr_asm, "\t$ac, $rs, $rt");
382}
383
Akira Hatanakae4bd0542012-09-27 02:15:57 +0000384class BPOSGE32_PSEUDO_DESC_BASE<SDPatternOperator OpNode, InstrItinClass itin> :
385 MipsPseudo<(outs CPURegs:$dst), (ins), "", [(set CPURegs:$dst, (OpNode))]> {
386 list<Register> Uses = [DSPCtrl];
387 bit usesCustomInserter = 1;
388}
389
390class BPOSGE32_DESC_BASE<string instr_asm, InstrItinClass itin> {
391 dag OutOperandList = (outs);
392 dag InOperandList = (ins brtarget:$offset);
393 string AsmString = !strconcat(instr_asm, "\t$offset");
394 InstrItinClass Itinerary = itin;
395 list<Register> Uses = [DSPCtrl];
396 bit isBranch = 1;
397 bit isTerminator = 1;
398 bit hasDelaySlot = 1;
399}
400
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000401//===----------------------------------------------------------------------===//
402// MIPS DSP Rev 1
403//===----------------------------------------------------------------------===//
404
Akira Hatanakad09642b2012-09-27 03:13:59 +0000405// Addition/subtraction
406class ADDU_QB_DESC : ADDU_QB_DESC_BASE<"addu.qb", int_mips_addu_qb, NoItinerary,
407 DSPRegs, DSPRegs>, IsCommutable;
408
409class ADDU_S_QB_DESC : ADDU_QB_DESC_BASE<"addu_s.qb", int_mips_addu_s_qb,
410 NoItinerary, DSPRegs, DSPRegs>,
411 IsCommutable;
412
413class SUBU_QB_DESC : ADDU_QB_DESC_BASE<"subu.qb", int_mips_subu_qb, NoItinerary,
414 DSPRegs, DSPRegs>;
415
416class SUBU_S_QB_DESC : ADDU_QB_DESC_BASE<"subu_s.qb", int_mips_subu_s_qb,
417 NoItinerary, DSPRegs, DSPRegs>;
418
419class ADDQ_PH_DESC : ADDU_QB_DESC_BASE<"addq.ph", int_mips_addq_ph, NoItinerary,
420 DSPRegs, DSPRegs>, IsCommutable;
421
422class ADDQ_S_PH_DESC : ADDU_QB_DESC_BASE<"addq_s.ph", int_mips_addq_s_ph,
423 NoItinerary, DSPRegs, DSPRegs>,
424 IsCommutable;
425
426class SUBQ_PH_DESC : ADDU_QB_DESC_BASE<"subq.ph", int_mips_subq_ph, NoItinerary,
427 DSPRegs, DSPRegs>;
428
429class SUBQ_S_PH_DESC : ADDU_QB_DESC_BASE<"subq_s.ph", int_mips_subq_s_ph,
430 NoItinerary, DSPRegs, DSPRegs>;
431
432class ADDQ_S_W_DESC : ADDU_QB_DESC_BASE<"addq_s.w", int_mips_addq_s_w,
433 NoItinerary, CPURegs, CPURegs>,
434 IsCommutable;
435
436class SUBQ_S_W_DESC : ADDU_QB_DESC_BASE<"subq_s.w", int_mips_subq_s_w,
437 NoItinerary, CPURegs, CPURegs>;
438
439class ADDSC_DESC : ADDU_QB_DESC_BASE<"addsc", int_mips_addsc, NoItinerary,
440 CPURegs, CPURegs>, IsCommutable;
441
442class ADDWC_DESC : ADDU_QB_DESC_BASE<"addwc", int_mips_addwc, NoItinerary,
443 CPURegs, CPURegs>,
444 IsCommutable, UseDSPCtrl;
445
446class MODSUB_DESC : ADDU_QB_DESC_BASE<"modsub", int_mips_modsub, NoItinerary,
447 CPURegs, CPURegs>, ClearDefs;
448
449class RADDU_W_QB_DESC : RADDU_W_QB_DESC_BASE<"raddu.w.qb", int_mips_raddu_w_qb,
450 NoItinerary, CPURegs, DSPRegs>,
451 ClearDefs;
452
Akira Hatanakab664ae62012-09-27 03:58:34 +0000453// Precision reduce/expand
454class PRECRQ_QB_PH_DESC : CMP_EQ_QB_R3_DESC_BASE<"precrq.qb.ph",
455 int_mips_precrq_qb_ph,
456 NoItinerary, DSPRegs, DSPRegs>,
457 ClearDefs;
458
459class PRECRQ_PH_W_DESC : CMP_EQ_QB_R3_DESC_BASE<"precrq.ph.w",
460 int_mips_precrq_ph_w,
461 NoItinerary, DSPRegs, CPURegs>,
462 ClearDefs;
463
464class PRECRQ_RS_PH_W_DESC : CMP_EQ_QB_R3_DESC_BASE<"precrq_rs.ph.w",
465 int_mips_precrq_rs_ph_w,
466 NoItinerary, DSPRegs,
467 CPURegs>;
468
469class PRECRQU_S_QB_PH_DESC : CMP_EQ_QB_R3_DESC_BASE<"precrqu_s.qb.ph",
470 int_mips_precrqu_s_qb_ph,
471 NoItinerary, DSPRegs,
472 DSPRegs>;
473
Akira Hatanaka892b1042012-09-27 19:05:08 +0000474// Shift
475class SHLL_QB_DESC : SHLL_QB_R2_DESC_BASE<"shll.qb", int_mips_shll_qb, immZExt3,
476 NoItinerary, DSPRegs>;
477
478class SHLLV_QB_DESC : SHLL_QB_R3_DESC_BASE<"shllv.qb", int_mips_shll_qb,
479 NoItinerary, DSPRegs>;
480
481class SHRL_QB_DESC : SHLL_QB_R2_DESC_BASE<"shrl.qb", int_mips_shrl_qb, immZExt3,
482 NoItinerary, DSPRegs>, ClearDefs;
483
484class SHRLV_QB_DESC : SHLL_QB_R3_DESC_BASE<"shrlv.qb", int_mips_shrl_qb,
485 NoItinerary, DSPRegs>, ClearDefs;
486
487class SHLL_PH_DESC : SHLL_QB_R2_DESC_BASE<"shll.ph", int_mips_shll_ph, immZExt4,
488 NoItinerary, DSPRegs>;
489
490class SHLLV_PH_DESC : SHLL_QB_R3_DESC_BASE<"shllv.ph", int_mips_shll_ph,
491 NoItinerary, DSPRegs>;
492
493class SHLL_S_PH_DESC : SHLL_QB_R2_DESC_BASE<"shll_s.ph", int_mips_shll_s_ph,
494 immZExt4, NoItinerary, DSPRegs>;
495
496class SHLLV_S_PH_DESC : SHLL_QB_R3_DESC_BASE<"shllv_s.ph", int_mips_shll_s_ph,
497 NoItinerary, DSPRegs>;
498
499class SHRA_PH_DESC : SHLL_QB_R2_DESC_BASE<"shra.ph", int_mips_shra_ph, immZExt4,
500 NoItinerary, DSPRegs>, ClearDefs;
501
502class SHRAV_PH_DESC : SHLL_QB_R3_DESC_BASE<"shrav.ph", int_mips_shra_ph,
503 NoItinerary, DSPRegs>, ClearDefs;
504
505class SHRA_R_PH_DESC : SHLL_QB_R2_DESC_BASE<"shra_r.ph", int_mips_shra_r_ph,
506 immZExt4, NoItinerary, DSPRegs>,
507 ClearDefs;
508
509class SHRAV_R_PH_DESC : SHLL_QB_R3_DESC_BASE<"shrav_r.ph", int_mips_shra_r_ph,
510 NoItinerary, DSPRegs>, ClearDefs;
511
512class SHLL_S_W_DESC : SHLL_QB_R2_DESC_BASE<"shll_s.w", int_mips_shll_s_w,
513 immZExt5, NoItinerary, CPURegs>;
514
515class SHLLV_S_W_DESC : SHLL_QB_R3_DESC_BASE<"shllv_s.w", int_mips_shll_s_w,
516 NoItinerary, CPURegs>;
517
518class SHRA_R_W_DESC : SHLL_QB_R2_DESC_BASE<"shra_r.w", int_mips_shra_r_w,
519 immZExt5, NoItinerary, CPURegs>,
520 ClearDefs;
521
522class SHRAV_R_W_DESC : SHLL_QB_R3_DESC_BASE<"shrav_r.w", int_mips_shra_r_w,
523 NoItinerary, CPURegs>;
524
Akira Hatanaka9061a462012-09-27 02:11:20 +0000525// Multiplication
Akira Hatanakad09642b2012-09-27 03:13:59 +0000526class MULEU_S_PH_QBL_DESC : ADDU_QB_DESC_BASE<"muleu_s.ph.qbl",
527 int_mips_muleu_s_ph_qbl,
528 NoItinerary, DSPRegs, DSPRegs>;
529
530class MULEU_S_PH_QBR_DESC : ADDU_QB_DESC_BASE<"muleu_s.ph.qbr",
531 int_mips_muleu_s_ph_qbr,
532 NoItinerary, DSPRegs, DSPRegs>;
533
534class MULEQ_S_W_PHL_DESC : ADDU_QB_DESC_BASE<"muleq_s.w.phl",
535 int_mips_muleq_s_w_phl,
536 NoItinerary, CPURegs, DSPRegs>,
537 IsCommutable;
538
539class MULEQ_S_W_PHR_DESC : ADDU_QB_DESC_BASE<"muleq_s.w.phr",
540 int_mips_muleq_s_w_phr,
541 NoItinerary, CPURegs, DSPRegs>,
542 IsCommutable;
543
544class MULQ_RS_PH_DESC : ADDU_QB_DESC_BASE<"mulq_rs.ph", int_mips_mulq_rs_ph,
545 NoItinerary, DSPRegs, DSPRegs>,
546 IsCommutable;
547
Akira Hatanaka9061a462012-09-27 02:11:20 +0000548class MULSAQ_S_W_PH_DESC : DPA_W_PH_DESC_BASE<"mulsaq_s.w.ph">;
549
550class MAQ_S_W_PHL_DESC : DPA_W_PH_DESC_BASE<"maq_s.w.phl">;
551
552class MAQ_S_W_PHR_DESC : DPA_W_PH_DESC_BASE<"maq_s.w.phr">;
553
554class MAQ_SA_W_PHL_DESC : DPA_W_PH_DESC_BASE<"maq_sa.w.phl">;
555
556class MAQ_SA_W_PHR_DESC : DPA_W_PH_DESC_BASE<"maq_sa.w.phr">;
557
558// Dot product with accumulate/subtract
559class DPAU_H_QBL_DESC : DPA_W_PH_DESC_BASE<"dpau.h.qbl">;
560
561class DPAU_H_QBR_DESC : DPA_W_PH_DESC_BASE<"dpau.h.qbr">;
562
563class DPSU_H_QBL_DESC : DPA_W_PH_DESC_BASE<"dpsu.h.qbl">;
564
565class DPSU_H_QBR_DESC : DPA_W_PH_DESC_BASE<"dpsu.h.qbr">;
566
567class DPAQ_S_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpaq_s.w.ph">;
568
569class DPSQ_S_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpsq_s.w.ph">;
570
571class DPAQ_SA_L_W_DESC : DPA_W_PH_DESC_BASE<"dpaq_sa.l.w">;
572
573class DPSQ_SA_L_W_DESC : DPA_W_PH_DESC_BASE<"dpsq_sa.l.w">;
574
575class MULT_DSP_DESC : MULT_DESC_BASE<"mult">;
576
577class MULTU_DSP_DESC : MULT_DESC_BASE<"multu">;
578
579class MADD_DSP_DESC : MULT_DESC_BASE<"madd">;
580
581class MADDU_DSP_DESC : MULT_DESC_BASE<"maddu">;
582
583class MSUB_DSP_DESC : MULT_DESC_BASE<"msub">;
584
585class MSUBU_DSP_DESC : MULT_DESC_BASE<"msubu">;
586
Akira Hatanakab664ae62012-09-27 03:58:34 +0000587// Comparison
588class CMPU_EQ_QB_DESC : CMP_EQ_QB_R2_DESC_BASE<"cmpu.eq.qb",
589 int_mips_cmpu_eq_qb, NoItinerary,
590 DSPRegs>, IsCommutable;
591
592class CMPU_LT_QB_DESC : CMP_EQ_QB_R2_DESC_BASE<"cmpu.lt.qb",
593 int_mips_cmpu_lt_qb, NoItinerary,
594 DSPRegs>, IsCommutable;
595
596class CMPU_LE_QB_DESC : CMP_EQ_QB_R2_DESC_BASE<"cmpu.le.qb",
597 int_mips_cmpu_le_qb, NoItinerary,
598 DSPRegs>, IsCommutable;
599
600class CMPGU_EQ_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"cmpgu.eq.qb",
601 int_mips_cmpgu_eq_qb,
602 NoItinerary, CPURegs, DSPRegs>,
603 IsCommutable;
604
605class CMPGU_LT_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"cmpgu.lt.qb",
606 int_mips_cmpgu_lt_qb,
607 NoItinerary, CPURegs, DSPRegs>,
608 IsCommutable;
609
610class CMPGU_LE_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"cmpgu.le.qb",
611 int_mips_cmpgu_le_qb,
612 NoItinerary, CPURegs, DSPRegs>,
613 IsCommutable;
614
615class CMP_EQ_PH_DESC : CMP_EQ_QB_R2_DESC_BASE<"cmp.eq.ph", int_mips_cmp_eq_ph,
616 NoItinerary, DSPRegs>,
617 IsCommutable;
618
619class CMP_LT_PH_DESC : CMP_EQ_QB_R2_DESC_BASE<"cmp.lt.ph", int_mips_cmp_lt_ph,
620 NoItinerary, DSPRegs>,
621 IsCommutable;
622
623class CMP_LE_PH_DESC : CMP_EQ_QB_R2_DESC_BASE<"cmp.le.ph", int_mips_cmp_le_ph,
624 NoItinerary, DSPRegs>,
625 IsCommutable;
626
Akira Hatanakae4bd0542012-09-27 02:15:57 +0000627// Misc
Akira Hatanakab664ae62012-09-27 03:58:34 +0000628class PACKRL_PH_DESC : CMP_EQ_QB_R3_DESC_BASE<"packrl.ph", int_mips_packrl_ph,
629 NoItinerary, DSPRegs, DSPRegs>,
630 ClearDefs;
631
632class PICK_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"pick.qb", int_mips_pick_qb,
633 NoItinerary, DSPRegs, DSPRegs>,
634 ClearDefs, UseDSPCtrl;
635
636class PICK_PH_DESC : CMP_EQ_QB_R3_DESC_BASE<"pick.ph", int_mips_pick_ph,
637 NoItinerary, DSPRegs, DSPRegs>,
638 ClearDefs, UseDSPCtrl;
639
Akira Hatanakae4bd0542012-09-27 02:15:57 +0000640class BPOSGE32_DESC : BPOSGE32_DESC_BASE<"bposge32", NoItinerary>;
641
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000642// Extr
643class EXTP_DESC : EXTR_W_TY1_R1_DESC_BASE<"extp", MipsEXTP, NoItinerary>;
644
645class EXTPV_DESC : EXTR_W_TY1_R2_DESC_BASE<"extpv", MipsEXTP, NoItinerary>;
646
647class EXTPDP_DESC : EXTR_W_TY1_R1_DESC_BASE<"extpdp", MipsEXTPDP, NoItinerary>;
648
649class EXTPDPV_DESC : EXTR_W_TY1_R2_DESC_BASE<"extpdpv", MipsEXTPDP,
650 NoItinerary>;
651
652class EXTR_W_DESC : EXTR_W_TY1_R1_DESC_BASE<"extr.w", MipsEXTR_W, NoItinerary>;
653
654class EXTRV_W_DESC : EXTR_W_TY1_R2_DESC_BASE<"extrv.w", MipsEXTR_W,
655 NoItinerary>;
656
657class EXTR_R_W_DESC : EXTR_W_TY1_R1_DESC_BASE<"extr_r.w", MipsEXTR_R_W,
658 NoItinerary>;
659
660class EXTRV_R_W_DESC : EXTR_W_TY1_R2_DESC_BASE<"extrv_r.w", MipsEXTR_R_W,
661 NoItinerary>;
662
663class EXTR_RS_W_DESC : EXTR_W_TY1_R1_DESC_BASE<"extr_rs.w", MipsEXTR_RS_W,
664 NoItinerary>;
665
666class EXTRV_RS_W_DESC : EXTR_W_TY1_R2_DESC_BASE<"extrv_rs.w", MipsEXTR_RS_W,
667 NoItinerary>;
668
669class EXTR_S_H_DESC : EXTR_W_TY1_R1_DESC_BASE<"extr_s.h", MipsEXTR_S_H,
670 NoItinerary>;
671
672class EXTRV_S_H_DESC : EXTR_W_TY1_R2_DESC_BASE<"extrv_s.h", MipsEXTR_S_H,
673 NoItinerary>;
674
Akira Hatanaka9061a462012-09-27 02:11:20 +0000675class SHILO_DESC : SHILO_R1_DESC_BASE<"shilo">;
676
677class SHILOV_DESC : SHILO_R2_DESC_BASE<"shilov">;
678
679class MTHLIP_DESC : MTHLIP_DESC_BASE<"mthlip">;
680
Akira Hatanaka314b43b2012-09-27 04:08:42 +0000681class RDDSP_DESC : RDDSP_DESC_BASE<"rddsp", int_mips_rddsp, NoItinerary>;
682
Akira Hatanaka9061a462012-09-27 02:11:20 +0000683//===----------------------------------------------------------------------===//
684// MIPS DSP Rev 2
Akira Hatanakad09642b2012-09-27 03:13:59 +0000685// Addition/subtraction
686class ADDU_PH_DESC : ADDU_QB_DESC_BASE<"addu.ph", int_mips_addu_ph, NoItinerary,
687 DSPRegs, DSPRegs>, IsCommutable;
688
689class ADDU_S_PH_DESC : ADDU_QB_DESC_BASE<"addu_s.ph", int_mips_addu_s_ph,
690 NoItinerary, DSPRegs, DSPRegs>,
691 IsCommutable;
692
693class SUBU_PH_DESC : ADDU_QB_DESC_BASE<"subu.ph", int_mips_subu_ph, NoItinerary,
694 DSPRegs, DSPRegs>;
695
696class SUBU_S_PH_DESC : ADDU_QB_DESC_BASE<"subu_s.ph", int_mips_subu_s_ph,
697 NoItinerary, DSPRegs, DSPRegs>;
698
Akira Hatanakab664ae62012-09-27 03:58:34 +0000699// Comparison
700class CMPGDU_EQ_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"cmpgdu.eq.qb",
701 int_mips_cmpgdu_eq_qb,
702 NoItinerary, CPURegs, DSPRegs>,
703 IsCommutable;
704
705class CMPGDU_LT_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"cmpgdu.lt.qb",
706 int_mips_cmpgdu_lt_qb,
707 NoItinerary, CPURegs, DSPRegs>,
708 IsCommutable;
709
710class CMPGDU_LE_QB_DESC : CMP_EQ_QB_R3_DESC_BASE<"cmpgdu.le.qb",
711 int_mips_cmpgdu_le_qb,
712 NoItinerary, CPURegs, DSPRegs>,
713 IsCommutable;
714
Akira Hatanakad09642b2012-09-27 03:13:59 +0000715// Multiplication
716class MULQ_S_PH_DESC : ADDU_QB_DESC_BASE<"mulq_s.ph", int_mips_mulq_s_ph,
717 NoItinerary, DSPRegs, DSPRegs>,
718 IsCommutable;
719
Akira Hatanaka9061a462012-09-27 02:11:20 +0000720// Dot product with accumulate/subtract
721class DPA_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpa.w.ph">;
722
723class DPS_W_PH_DESC : DPA_W_PH_DESC_BASE<"dps.w.ph">;
724
725class DPAQX_S_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpaqx_s.w.ph">;
726
727class DPAQX_SA_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpaqx_sa.w.ph">;
728
729class DPAX_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpax.w.ph">;
730
731class DPSX_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpsx.w.ph">;
732
733class DPSQX_S_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpsqx_s.w.ph">;
734
735class DPSQX_SA_W_PH_DESC : DPA_W_PH_DESC_BASE<"dpsqx_sa.w.ph">;
736
737class MULSA_W_PH_DESC : DPA_W_PH_DESC_BASE<"mulsa.w.ph">;
738
Akira Hatanakab664ae62012-09-27 03:58:34 +0000739// Precision reduce/expand
740class PRECR_QB_PH_DESC : CMP_EQ_QB_R3_DESC_BASE<"precr.qb.ph",
741 int_mips_precr_qb_ph,
742 NoItinerary, DSPRegs, DSPRegs>;
743
744class PRECR_SRA_PH_W_DESC : PRECR_SRA_PH_W_DESC_BASE<"precr_sra.ph.w",
745 int_mips_precr_sra_ph_w,
746 NoItinerary, DSPRegs,
747 CPURegs>, ClearDefs;
748
749class PRECR_SRA_R_PH_W_DESC : PRECR_SRA_PH_W_DESC_BASE<"precr_sra_r.ph.w",
750 int_mips_precr_sra_r_ph_w,
751 NoItinerary, DSPRegs,
752 CPURegs>, ClearDefs;
753
Akira Hatanaka892b1042012-09-27 19:05:08 +0000754// Shift
755class SHRA_QB_DESC : SHLL_QB_R2_DESC_BASE<"shra.qb", int_mips_shra_qb, immZExt3,
756 NoItinerary, DSPRegs>, ClearDefs;
757
758class SHRAV_QB_DESC : SHLL_QB_R3_DESC_BASE<"shrav.qb", int_mips_shra_qb,
759 NoItinerary, DSPRegs>, ClearDefs;
760
761class SHRA_R_QB_DESC : SHLL_QB_R2_DESC_BASE<"shra_r.qb", int_mips_shra_r_qb,
762 immZExt3, NoItinerary, DSPRegs>,
763 ClearDefs;
764
765class SHRAV_R_QB_DESC : SHLL_QB_R3_DESC_BASE<"shrav_r.qb", int_mips_shra_r_qb,
766 NoItinerary, DSPRegs>, ClearDefs;
767
768class SHRL_PH_DESC : SHLL_QB_R2_DESC_BASE<"shrl.ph", int_mips_shrl_ph, immZExt4,
769 NoItinerary, DSPRegs>, ClearDefs;
770
771class SHRLV_PH_DESC : SHLL_QB_R3_DESC_BASE<"shrlv.ph", int_mips_shrl_ph,
772 NoItinerary, DSPRegs>, ClearDefs;
773
Akira Hatanakae4bd0542012-09-27 02:15:57 +0000774// Pseudos.
775def BPOSGE32_PSEUDO : BPOSGE32_PSEUDO_DESC_BASE<int_mips_bposge32, NoItinerary>;
776
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000777// Instruction defs.
778// MIPS DSP Rev 1
Akira Hatanakad09642b2012-09-27 03:13:59 +0000779def ADDU_QB : ADDU_QB_ENC, ADDU_QB_DESC;
780def ADDU_S_QB : ADDU_S_QB_ENC, ADDU_S_QB_DESC;
781def SUBU_QB : SUBU_QB_ENC, SUBU_QB_DESC;
782def SUBU_S_QB : SUBU_S_QB_ENC, SUBU_S_QB_DESC;
783def ADDQ_PH : ADDQ_PH_ENC, ADDQ_PH_DESC;
784def ADDQ_S_PH : ADDQ_S_PH_ENC, ADDQ_S_PH_DESC;
785def SUBQ_PH : SUBQ_PH_ENC, SUBQ_PH_DESC;
786def SUBQ_S_PH : SUBQ_S_PH_ENC, SUBQ_S_PH_DESC;
787def ADDQ_S_W : ADDQ_S_W_ENC, ADDQ_S_W_DESC;
788def SUBQ_S_W : SUBQ_S_W_ENC, SUBQ_S_W_DESC;
789def ADDSC : ADDSC_ENC, ADDSC_DESC;
790def ADDWC : ADDWC_ENC, ADDWC_DESC;
791def MODSUB : MODSUB_ENC, MODSUB_DESC;
792def RADDU_W_QB : RADDU_W_QB_ENC, RADDU_W_QB_DESC;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000793def PRECRQ_QB_PH : PRECRQ_QB_PH_ENC, PRECRQ_QB_PH_DESC;
794def PRECRQ_PH_W : PRECRQ_PH_W_ENC, PRECRQ_PH_W_DESC;
795def PRECRQ_RS_PH_W : PRECRQ_RS_PH_W_ENC, PRECRQ_RS_PH_W_DESC;
796def PRECRQU_S_QB_PH : PRECRQU_S_QB_PH_ENC, PRECRQU_S_QB_PH_DESC;
Akira Hatanaka892b1042012-09-27 19:05:08 +0000797def SHLL_QB : SHLL_QB_ENC, SHLL_QB_DESC;
798def SHLLV_QB : SHLLV_QB_ENC, SHLLV_QB_DESC;
799def SHRL_QB : SHRL_QB_ENC, SHRL_QB_DESC;
800def SHRLV_QB : SHRLV_QB_ENC, SHRLV_QB_DESC;
801def SHLL_PH : SHLL_PH_ENC, SHLL_PH_DESC;
802def SHLLV_PH : SHLLV_PH_ENC, SHLLV_PH_DESC;
803def SHLL_S_PH : SHLL_S_PH_ENC, SHLL_S_PH_DESC;
804def SHLLV_S_PH : SHLLV_S_PH_ENC, SHLLV_S_PH_DESC;
805def SHRA_PH : SHRA_PH_ENC, SHRA_PH_DESC;
806def SHRAV_PH : SHRAV_PH_ENC, SHRAV_PH_DESC;
807def SHRA_R_PH : SHRA_R_PH_ENC, SHRA_R_PH_DESC;
808def SHRAV_R_PH : SHRAV_R_PH_ENC, SHRAV_R_PH_DESC;
809def SHLL_S_W : SHLL_S_W_ENC, SHLL_S_W_DESC;
810def SHLLV_S_W : SHLLV_S_W_ENC, SHLLV_S_W_DESC;
811def SHRA_R_W : SHRA_R_W_ENC, SHRA_R_W_DESC;
812def SHRAV_R_W : SHRAV_R_W_ENC, SHRAV_R_W_DESC;
Akira Hatanakad09642b2012-09-27 03:13:59 +0000813def MULEU_S_PH_QBL : MULEU_S_PH_QBL_ENC, MULEU_S_PH_QBL_DESC;
814def MULEU_S_PH_QBR : MULEU_S_PH_QBR_ENC, MULEU_S_PH_QBR_DESC;
815def MULEQ_S_W_PHL : MULEQ_S_W_PHL_ENC, MULEQ_S_W_PHL_DESC;
816def MULEQ_S_W_PHR : MULEQ_S_W_PHR_ENC, MULEQ_S_W_PHR_DESC;
817def MULQ_RS_PH : MULQ_RS_PH_ENC, MULQ_RS_PH_DESC;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000818def MULSAQ_S_W_PH : MULSAQ_S_W_PH_ENC, MULSAQ_S_W_PH_DESC;
819def MAQ_S_W_PHL : MAQ_S_W_PHL_ENC, MAQ_S_W_PHL_DESC;
820def MAQ_S_W_PHR : MAQ_S_W_PHR_ENC, MAQ_S_W_PHR_DESC;
821def MAQ_SA_W_PHL : MAQ_SA_W_PHL_ENC, MAQ_SA_W_PHL_DESC;
822def MAQ_SA_W_PHR : MAQ_SA_W_PHR_ENC, MAQ_SA_W_PHR_DESC;
823def DPAU_H_QBL : DPAU_H_QBL_ENC, DPAU_H_QBL_DESC;
824def DPAU_H_QBR : DPAU_H_QBR_ENC, DPAU_H_QBR_DESC;
825def DPSU_H_QBL : DPSU_H_QBL_ENC, DPSU_H_QBL_DESC;
826def DPSU_H_QBR : DPSU_H_QBR_ENC, DPSU_H_QBR_DESC;
827def DPAQ_S_W_PH : DPAQ_S_W_PH_ENC, DPAQ_S_W_PH_DESC;
828def DPSQ_S_W_PH : DPSQ_S_W_PH_ENC, DPSQ_S_W_PH_DESC;
829def DPAQ_SA_L_W : DPAQ_SA_L_W_ENC, DPAQ_SA_L_W_DESC;
830def DPSQ_SA_L_W : DPSQ_SA_L_W_ENC, DPSQ_SA_L_W_DESC;
831def MULT_DSP : MULT_DSP_ENC, MULT_DSP_DESC;
832def MULTU_DSP : MULTU_DSP_ENC, MULTU_DSP_DESC;
833def MADD_DSP : MADD_DSP_ENC, MADD_DSP_DESC;
834def MADDU_DSP : MADDU_DSP_ENC, MADDU_DSP_DESC;
835def MSUB_DSP : MSUB_DSP_ENC, MSUB_DSP_DESC;
836def MSUBU_DSP : MSUBU_DSP_ENC, MSUBU_DSP_DESC;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000837def CMPU_EQ_QB : CMPU_EQ_QB_ENC, CMPU_EQ_QB_DESC;
838def CMPU_LT_QB : CMPU_LT_QB_ENC, CMPU_LT_QB_DESC;
839def CMPU_LE_QB : CMPU_LE_QB_ENC, CMPU_LE_QB_DESC;
840def CMPGU_EQ_QB : CMPGU_EQ_QB_ENC, CMPGU_EQ_QB_DESC;
841def CMPGU_LT_QB : CMPGU_LT_QB_ENC, CMPGU_LT_QB_DESC;
842def CMPGU_LE_QB : CMPGU_LE_QB_ENC, CMPGU_LE_QB_DESC;
843def CMP_EQ_PH : CMP_EQ_PH_ENC, CMP_EQ_PH_DESC;
844def CMP_LT_PH : CMP_LT_PH_ENC, CMP_LT_PH_DESC;
845def CMP_LE_PH : CMP_LE_PH_ENC, CMP_LE_PH_DESC;
846def PACKRL_PH : PACKRL_PH_ENC, PACKRL_PH_DESC;
847def PICK_QB : PICK_QB_ENC, PICK_QB_DESC;
848def PICK_PH : PICK_PH_ENC, PICK_PH_DESC;
Akira Hatanakae4bd0542012-09-27 02:15:57 +0000849def BPOSGE32 : BPOSGE32_ENC, BPOSGE32_DESC;
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000850def EXTP : EXTP_ENC, EXTP_DESC;
851def EXTPV : EXTPV_ENC, EXTPV_DESC;
852def EXTPDP : EXTPDP_ENC, EXTPDP_DESC;
853def EXTPDPV : EXTPDPV_ENC, EXTPDPV_DESC;
854def EXTR_W : EXTR_W_ENC, EXTR_W_DESC;
855def EXTRV_W : EXTRV_W_ENC, EXTRV_W_DESC;
856def EXTR_R_W : EXTR_R_W_ENC, EXTR_R_W_DESC;
857def EXTRV_R_W : EXTRV_R_W_ENC, EXTRV_R_W_DESC;
858def EXTR_RS_W : EXTR_RS_W_ENC, EXTR_RS_W_DESC;
859def EXTRV_RS_W : EXTRV_RS_W_ENC, EXTRV_RS_W_DESC;
860def EXTR_S_H : EXTR_S_H_ENC, EXTR_S_H_DESC;
861def EXTRV_S_H : EXTRV_S_H_ENC, EXTRV_S_H_DESC;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000862def SHILO : SHILO_ENC, SHILO_DESC;
863def SHILOV : SHILOV_ENC, SHILOV_DESC;
864def MTHLIP : MTHLIP_ENC, MTHLIP_DESC;
Akira Hatanaka314b43b2012-09-27 04:08:42 +0000865def RDDSP : RDDSP_ENC, RDDSP_DESC;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000866
867// MIPS DSP Rev 2
868let Predicates = [HasDSPR2] in {
869
Akira Hatanakad09642b2012-09-27 03:13:59 +0000870def ADDU_PH : ADDU_PH_ENC, ADDU_PH_DESC;
871def ADDU_S_PH : ADDU_S_PH_ENC, ADDU_S_PH_DESC;
872def SUBU_PH : SUBU_PH_ENC, SUBU_PH_DESC;
873def SUBU_S_PH : SUBU_S_PH_ENC, SUBU_S_PH_DESC;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000874def CMPGDU_EQ_QB : CMPGDU_EQ_QB_ENC, CMPGDU_EQ_QB_DESC;
875def CMPGDU_LT_QB : CMPGDU_LT_QB_ENC, CMPGDU_LT_QB_DESC;
876def CMPGDU_LE_QB : CMPGDU_LE_QB_ENC, CMPGDU_LE_QB_DESC;
Akira Hatanakad09642b2012-09-27 03:13:59 +0000877def MULQ_S_PH : MULQ_S_PH_ENC, MULQ_S_PH_DESC;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000878def DPA_W_PH : DPA_W_PH_ENC, DPA_W_PH_DESC;
879def DPS_W_PH : DPS_W_PH_ENC, DPS_W_PH_DESC;
880def DPAQX_S_W_PH : DPAQX_S_W_PH_ENC, DPAQX_S_W_PH_DESC;
881def DPAQX_SA_W_PH : DPAQX_SA_W_PH_ENC, DPAQX_SA_W_PH_DESC;
882def DPAX_W_PH : DPAX_W_PH_ENC, DPAX_W_PH_DESC;
883def DPSX_W_PH : DPSX_W_PH_ENC, DPSX_W_PH_DESC;
884def DPSQX_S_W_PH : DPSQX_S_W_PH_ENC, DPSQX_S_W_PH_DESC;
885def DPSQX_SA_W_PH : DPSQX_SA_W_PH_ENC, DPSQX_SA_W_PH_DESC;
886def MULSA_W_PH : MULSA_W_PH_ENC, MULSA_W_PH_DESC;
Akira Hatanakab664ae62012-09-27 03:58:34 +0000887def PRECR_QB_PH : PRECR_QB_PH_ENC, PRECR_QB_PH_DESC;
888def PRECR_SRA_PH_W : PRECR_SRA_PH_W_ENC, PRECR_SRA_PH_W_DESC;
889def PRECR_SRA_R_PH_W : PRECR_SRA_R_PH_W_ENC, PRECR_SRA_R_PH_W_DESC;
Akira Hatanaka892b1042012-09-27 19:05:08 +0000890def SHRA_QB : SHRA_QB_ENC, SHRA_QB_DESC;
891def SHRAV_QB : SHRAV_QB_ENC, SHRAV_QB_DESC;
892def SHRA_R_QB : SHRA_R_QB_ENC, SHRA_R_QB_DESC;
893def SHRAV_R_QB : SHRAV_R_QB_ENC, SHRAV_R_QB_DESC;
894def SHRL_PH : SHRL_PH_ENC, SHRL_PH_DESC;
895def SHRLV_PH : SHRLV_PH_ENC, SHRLV_PH_DESC;
Akira Hatanaka9061a462012-09-27 02:11:20 +0000896
897}
898
899// Pseudos.
900def MULSAQ_S_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsMULSAQ_S_W_PH, NoItinerary,
901 MULSAQ_S_W_PH>;
902def MAQ_S_W_PHL_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsMAQ_S_W_PHL, NoItinerary,
903 MAQ_S_W_PHL>;
904def MAQ_S_W_PHR_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsMAQ_S_W_PHR, NoItinerary,
905 MAQ_S_W_PHR>;
906def MAQ_SA_W_PHL_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsMAQ_SA_W_PHL, NoItinerary,
907 MAQ_SA_W_PHL>;
908def MAQ_SA_W_PHR_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsMAQ_SA_W_PHR, NoItinerary,
909 MAQ_SA_W_PHR>;
910def DPAU_H_QBL_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAU_H_QBL, NoItinerary,
911 DPAU_H_QBL>;
912def DPAU_H_QBR_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAU_H_QBR, NoItinerary,
913 DPAU_H_QBR>;
914def DPSU_H_QBL_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSU_H_QBL, NoItinerary,
915 DPSU_H_QBL>;
916def DPSU_H_QBR_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSU_H_QBR, NoItinerary,
917 DPSU_H_QBR>;
918def DPAQ_S_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAQ_S_W_PH, NoItinerary,
919 DPAQ_S_W_PH>;
920def DPSQ_S_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSQ_S_W_PH, NoItinerary,
921 DPSQ_S_W_PH>;
922def DPAQ_SA_L_W_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAQ_SA_L_W, NoItinerary,
923 DPAQ_SA_L_W>;
924def DPSQ_SA_L_W_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSQ_SA_L_W, NoItinerary,
925 DPSQ_SA_L_W>;
926
927def MULT_DSP_PSEUDO : MULT_PSEUDO_BASE<MipsMULT, NoItinerary, MULT_DSP>,
928 IsCommutable;
929def MULTU_DSP_PSEUDO : MULT_PSEUDO_BASE<MipsMULTU, NoItinerary, MULTU_DSP>,
930 IsCommutable;
931def MADD_DSP_PSEUDO : MULT_PSEUDO_BASE<MipsMADD_DSP, NoItinerary, MADD_DSP>,
932 IsCommutable, UseAC;
933def MADDU_DSP_PSEUDO : MULT_PSEUDO_BASE<MipsMADDU_DSP, NoItinerary, MADDU_DSP>,
934 IsCommutable, UseAC;
935def MSUB_DSP_PSEUDO : MULT_PSEUDO_BASE<MipsMSUB_DSP, NoItinerary, MSUB_DSP>,
936 UseAC;
937def MSUBU_DSP_PSEUDO : MULT_PSEUDO_BASE<MipsMSUBU_DSP, NoItinerary, MSUBU_DSP>,
938 UseAC;
939
940def SHILO_PSEUDO : SHILO_R1_PSEUDO_BASE<MipsSHILO, NoItinerary, SHILO>;
941def SHILOV_PSEUDO : SHILO_R2_PSEUDO_BASE<MipsSHILO, NoItinerary, SHILOV>;
942def MTHLIP_PSEUDO : SHILO_R2_PSEUDO_BASE<MipsMTHLIP, NoItinerary, MTHLIP>;
943
944let Predicates = [HasDSPR2] in {
945
946def DPA_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPA_W_PH, NoItinerary, DPA_W_PH>;
947def DPS_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPS_W_PH, NoItinerary, DPS_W_PH>;
948def DPAQX_S_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAQX_S_W_PH, NoItinerary,
949 DPAQX_S_W_PH>;
950def DPAQX_SA_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAQX_SA_W_PH, NoItinerary,
951 DPAQX_SA_W_PH>;
952def DPAX_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPAX_W_PH, NoItinerary,
953 DPAX_W_PH>;
954def DPSX_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSX_W_PH, NoItinerary,
955 DPSX_W_PH>;
956def DPSQX_S_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSQX_S_W_PH, NoItinerary,
957 DPSQX_S_W_PH>;
958def DPSQX_SA_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsDPSQX_SA_W_PH, NoItinerary,
959 DPSQX_SA_W_PH>;
960def MULSA_W_PH_PSEUDO : DPA_W_PH_PSEUDO_BASE<MipsMULSA_W_PH, NoItinerary,
961 MULSA_W_PH>;
962
963}
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000964
Akira Hatanaka5eeac4f2012-09-27 01:50:59 +0000965// Patterns.
966class DSPPat<dag pattern, dag result, Predicate pred = HasDSP> :
967 Pat<pattern, result>, Requires<[pred]>;
968
Akira Hatanakade8231ea2012-09-27 01:56:38 +0000969class BitconvertPat<ValueType DstVT, ValueType SrcVT, RegisterClass DstRC,
970 RegisterClass SrcRC> :
971 DSPPat<(DstVT (bitconvert (SrcVT SrcRC:$src))),
972 (COPY_TO_REGCLASS SrcRC:$src, DstRC)>;
973
974def : BitconvertPat<i32, v2i16, CPURegs, DSPRegs>;
975def : BitconvertPat<i32, v4i8, CPURegs, DSPRegs>;
976def : BitconvertPat<v2i16, i32, DSPRegs, CPURegs>;
977def : BitconvertPat<v4i8, i32, DSPRegs, CPURegs>;
978
Akira Hatanaka5eeac4f2012-09-27 01:50:59 +0000979def : DSPPat<(v2i16 (load addr:$a)),
980 (v2i16 (COPY_TO_REGCLASS (LW addr:$a), DSPRegs))>;
981def : DSPPat<(v4i8 (load addr:$a)),
982 (v4i8 (COPY_TO_REGCLASS (LW addr:$a), DSPRegs))>;
983def : DSPPat<(store (v2i16 DSPRegs:$val), addr:$a),
984 (SW (COPY_TO_REGCLASS DSPRegs:$val, CPURegs), addr:$a)>;
985def : DSPPat<(store (v4i8 DSPRegs:$val), addr:$a),
986 (SW (COPY_TO_REGCLASS DSPRegs:$val, CPURegs), addr:$a)>;
Akira Hatanaka1babeaa2012-09-27 02:05:42 +0000987
988// Extr patterns.
989class EXTR_W_TY1_R2_Pat<SDPatternOperator OpNode, Instruction Instr> :
990 DSPPat<(i32 (OpNode CPURegs:$rs)), (Instr AC0, CPURegs:$rs)>;
991
992class EXTR_W_TY1_R1_Pat<SDPatternOperator OpNode, Instruction Instr> :
993 DSPPat<(i32 (OpNode immZExt5:$shift)), (Instr AC0, immZExt5:$shift)>;
994
995def : EXTR_W_TY1_R1_Pat<MipsEXTP, EXTP>;
996def : EXTR_W_TY1_R2_Pat<MipsEXTP, EXTPV>;
997def : EXTR_W_TY1_R1_Pat<MipsEXTPDP, EXTPDP>;
998def : EXTR_W_TY1_R2_Pat<MipsEXTPDP, EXTPDPV>;
999def : EXTR_W_TY1_R1_Pat<MipsEXTR_W, EXTR_W>;
1000def : EXTR_W_TY1_R2_Pat<MipsEXTR_W, EXTRV_W>;
1001def : EXTR_W_TY1_R1_Pat<MipsEXTR_R_W, EXTR_R_W>;
1002def : EXTR_W_TY1_R2_Pat<MipsEXTR_R_W, EXTRV_R_W>;
1003def : EXTR_W_TY1_R1_Pat<MipsEXTR_RS_W, EXTR_RS_W>;
1004def : EXTR_W_TY1_R2_Pat<MipsEXTR_RS_W, EXTRV_RS_W>;
1005def : EXTR_W_TY1_R1_Pat<MipsEXTR_S_H, EXTR_S_H>;
1006def : EXTR_W_TY1_R2_Pat<MipsEXTR_S_H, EXTRV_S_H>;