Mark SMIN/SMAX/UMIN/UMAX nodes as legal and add patterns for them.
[oota-llvm.git] / lib / Target / Hexagon / HexagonIntrinsics.td
1 //===-- HexagonIntrinsics.td - Instruction intrinsics ------*- 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 // This is populated based on the following specs:
10 // Hexagon V2 Architecture
11 // Application-Level Specification
12 // 80-V9418-8 Rev. B
13 // March 4, 2008
14 //===----------------------------------------------------------------------===//
15
16 class T_I_pat <InstHexagon MI, Intrinsic IntID>
17   : Pat <(IntID imm:$Is),
18          (MI imm:$Is)>;
19
20 class T_R_pat <InstHexagon MI, Intrinsic IntID>
21   : Pat <(IntID I32:$Rs),
22          (MI I32:$Rs)>;
23
24 class T_P_pat <InstHexagon MI, Intrinsic IntID>
25   : Pat <(IntID I64:$Rs),
26          (MI DoubleRegs:$Rs)>;
27
28 class T_II_pat <InstHexagon MI, Intrinsic IntID, PatFrag Imm1, PatFrag Imm2>
29   : Pat<(IntID Imm1:$Is, Imm2:$It),
30         (MI Imm1:$Is, Imm2:$It)>;
31
32 class T_RI_pat <InstHexagon MI, Intrinsic IntID, PatLeaf ImmPred = PatLeaf<(i32 imm)>>
33   : Pat<(IntID I32:$Rs, ImmPred:$It),
34         (MI I32:$Rs, ImmPred:$It)>;
35
36 class T_IR_pat <InstHexagon MI, Intrinsic IntID, PatFrag ImmPred = PatLeaf<(i32 imm)>>
37   : Pat<(IntID ImmPred:$Is, I32:$Rt),
38         (MI ImmPred:$Is, I32:$Rt)>;
39
40 class T_PI_pat <InstHexagon MI, Intrinsic IntID>
41   : Pat<(IntID I64:$Rs, imm:$It),
42         (MI DoubleRegs:$Rs, imm:$It)>;
43
44 class T_RP_pat <InstHexagon MI, Intrinsic IntID>
45   : Pat<(IntID I32:$Rs, I64:$Rt),
46         (MI I32:$Rs, DoubleRegs:$Rt)>;
47
48 class T_RR_pat <InstHexagon MI, Intrinsic IntID>
49   : Pat <(IntID I32:$Rs, I32:$Rt),
50          (MI I32:$Rs, I32:$Rt)>;
51
52 class T_PP_pat <InstHexagon MI, Intrinsic IntID>
53   : Pat <(IntID I64:$Rs, I64:$Rt),
54          (MI DoubleRegs:$Rs, DoubleRegs:$Rt)>;
55
56 class T_QII_pat <InstHexagon MI, Intrinsic IntID, PatFrag Imm1, PatFrag Imm2>
57   : Pat <(IntID (i32 PredRegs:$Ps), Imm1:$Is, Imm2:$It),
58          (MI PredRegs:$Ps, Imm1:$Is, Imm2:$It)>;
59
60 class T_QRI_pat <InstHexagon MI, Intrinsic IntID, PatFrag ImmPred>
61   : Pat <(IntID (i32 PredRegs:$Ps), I32:$Rs, ImmPred:$Is),
62          (MI PredRegs:$Ps, I32:$Rs, ImmPred:$Is)>;
63
64 class T_QIR_pat <InstHexagon MI, Intrinsic IntID, PatFrag ImmPred>
65   : Pat <(IntID (i32 PredRegs:$Ps), ImmPred:$Is, I32:$Rs),
66          (MI PredRegs:$Ps, ImmPred:$Is, I32:$Rs)>;
67
68 class T_RRI_pat <InstHexagon MI, Intrinsic IntID>
69   : Pat <(IntID I32:$Rs, I32:$Rt, imm:$Iu),
70          (MI I32:$Rs, I32:$Rt, imm:$Iu)>;
71
72 class T_RII_pat <InstHexagon MI, Intrinsic IntID>
73   : Pat <(IntID I32:$Rs, imm:$It, imm:$Iu),
74          (MI I32:$Rs, imm:$It, imm:$Iu)>;
75
76 class T_IRI_pat <InstHexagon MI, Intrinsic IntID>
77   : Pat <(IntID imm:$It, I32:$Rs, imm:$Iu),
78          (MI imm:$It, I32:$Rs, imm:$Iu)>;
79
80 class T_IRR_pat <InstHexagon MI, Intrinsic IntID>
81   : Pat <(IntID imm:$Is, I32:$Rs, I32:$Rt),
82          (MI imm:$Is, I32:$Rs, I32:$Rt)>;
83
84 class T_RIR_pat <InstHexagon MI, Intrinsic IntID>
85   : Pat <(IntID I32:$Rs, imm:$Is, I32:$Rt),
86          (MI I32:$Rs, imm:$Is, I32:$Rt)>;
87
88 class T_RRR_pat <InstHexagon MI, Intrinsic IntID>
89   : Pat <(IntID I32:$Rs, I32:$Rt, I32:$Ru),
90          (MI I32:$Rs, I32:$Rt, I32:$Ru)>;
91
92 class T_PPI_pat <InstHexagon MI, Intrinsic IntID>
93   : Pat <(IntID I64:$Rs, I64:$Rt, imm:$Iu),
94          (MI DoubleRegs:$Rs, DoubleRegs:$Rt, imm:$Iu)>;
95
96 class T_PII_pat <InstHexagon MI, Intrinsic IntID>
97   : Pat <(IntID I64:$Rs, imm:$It, imm:$Iu),
98          (MI DoubleRegs:$Rs, imm:$It, imm:$Iu)>;
99
100 class T_PPP_pat <InstHexagon MI, Intrinsic IntID>
101   : Pat <(IntID I64:$Rs, I64:$Rt, I64:$Ru),
102          (MI DoubleRegs:$Rs, DoubleRegs:$Rt, DoubleRegs:$Ru)>;
103
104 class T_PPR_pat <InstHexagon MI, Intrinsic IntID>
105   : Pat <(IntID I64:$Rs, I64:$Rt, I32:$Ru),
106          (MI DoubleRegs:$Rs, DoubleRegs:$Rt, I32:$Ru)>;
107
108 class T_PRR_pat <InstHexagon MI, Intrinsic IntID>
109   : Pat <(IntID I64:$Rs, I32:$Rt, I32:$Ru),
110          (MI DoubleRegs:$Rs, I32:$Rt, I32:$Ru)>;
111
112 class T_PPQ_pat <InstHexagon MI, Intrinsic IntID>
113   : Pat <(IntID I64:$Rs, I64:$Rt, (i32 PredRegs:$Ru)),
114          (MI DoubleRegs:$Rs, DoubleRegs:$Rt, PredRegs:$Ru)>;
115
116 class T_PR_pat <InstHexagon MI, Intrinsic IntID>
117   : Pat <(IntID I64:$Rs, I32:$Rt),
118          (MI DoubleRegs:$Rs, I32:$Rt)>;
119
120 class T_D_pat <InstHexagon MI, Intrinsic IntID>
121   : Pat<(IntID (F64:$Rs)),
122         (MI (F64:$Rs))>;
123
124 class T_DI_pat <InstHexagon MI, Intrinsic IntID,
125                 PatLeaf ImmPred = PatLeaf<(i32 imm)>>
126   : Pat<(IntID F64:$Rs, ImmPred:$It),
127         (MI F64:$Rs, ImmPred:$It)>;
128
129 class T_F_pat <InstHexagon MI, Intrinsic IntID>
130   : Pat<(IntID F32:$Rs),
131         (MI F32:$Rs)>;
132
133 class T_FI_pat <InstHexagon MI, Intrinsic IntID,
134                  PatLeaf ImmPred = PatLeaf<(i32 imm)>>
135   : Pat<(IntID F32:$Rs, ImmPred:$It),
136         (MI F32:$Rs, ImmPred:$It)>;
137
138 class T_FF_pat <InstHexagon MI, Intrinsic IntID>
139   : Pat<(IntID F32:$Rs, F32:$Rt),
140         (MI F32:$Rs, F32:$Rt)>;
141
142 class T_DD_pat <InstHexagon MI, Intrinsic IntID>
143   : Pat<(IntID F64:$Rs, F64:$Rt),
144         (MI F64:$Rs, F64:$Rt)>;
145
146 class T_FFF_pat <InstHexagon MI, Intrinsic IntID>
147   : Pat<(IntID F32:$Rs, F32:$Rt, F32:$Ru),
148         (MI F32:$Rs, F32:$Rt, F32:$Ru)>;
149
150 class T_FFFQ_pat <InstHexagon MI, Intrinsic IntID>
151   : Pat <(IntID F32:$Rs, F32:$Rt, F32:$Ru, (i32 PredRegs:$Rx)),
152          (MI F32:$Rs, F32:$Rt, F32:$Ru, PredRegs:$Rx)>;
153
154 //===----------------------------------------------------------------------===//
155 // MPYS / Multipy signed/unsigned halfwords
156 //Rd=mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:rnd][:sat]
157 //===----------------------------------------------------------------------===//
158
159 def : T_RR_pat <M2_mpy_ll_s1, int_hexagon_M2_mpy_ll_s1>;
160 def : T_RR_pat <M2_mpy_ll_s0, int_hexagon_M2_mpy_ll_s0>;
161 def : T_RR_pat <M2_mpy_lh_s1, int_hexagon_M2_mpy_lh_s1>;
162 def : T_RR_pat <M2_mpy_lh_s0, int_hexagon_M2_mpy_lh_s0>;
163 def : T_RR_pat <M2_mpy_hl_s1, int_hexagon_M2_mpy_hl_s1>;
164 def : T_RR_pat <M2_mpy_hl_s0, int_hexagon_M2_mpy_hl_s0>;
165 def : T_RR_pat <M2_mpy_hh_s1, int_hexagon_M2_mpy_hh_s1>;
166 def : T_RR_pat <M2_mpy_hh_s0, int_hexagon_M2_mpy_hh_s0>;
167
168 def : T_RR_pat <M2_mpyu_ll_s1, int_hexagon_M2_mpyu_ll_s1>;
169 def : T_RR_pat <M2_mpyu_ll_s0, int_hexagon_M2_mpyu_ll_s0>;
170 def : T_RR_pat <M2_mpyu_lh_s1, int_hexagon_M2_mpyu_lh_s1>;
171 def : T_RR_pat <M2_mpyu_lh_s0, int_hexagon_M2_mpyu_lh_s0>;
172 def : T_RR_pat <M2_mpyu_hl_s1, int_hexagon_M2_mpyu_hl_s1>;
173 def : T_RR_pat <M2_mpyu_hl_s0, int_hexagon_M2_mpyu_hl_s0>;
174 def : T_RR_pat <M2_mpyu_hh_s1, int_hexagon_M2_mpyu_hh_s1>;
175 def : T_RR_pat <M2_mpyu_hh_s0, int_hexagon_M2_mpyu_hh_s0>;
176
177 def : T_RR_pat <M2_mpy_sat_ll_s1, int_hexagon_M2_mpy_sat_ll_s1>;
178 def : T_RR_pat <M2_mpy_sat_ll_s0, int_hexagon_M2_mpy_sat_ll_s0>;
179 def : T_RR_pat <M2_mpy_sat_lh_s1, int_hexagon_M2_mpy_sat_lh_s1>;
180 def : T_RR_pat <M2_mpy_sat_lh_s0, int_hexagon_M2_mpy_sat_lh_s0>;
181 def : T_RR_pat <M2_mpy_sat_hl_s1, int_hexagon_M2_mpy_sat_hl_s1>;
182 def : T_RR_pat <M2_mpy_sat_hl_s0, int_hexagon_M2_mpy_sat_hl_s0>;
183 def : T_RR_pat <M2_mpy_sat_hh_s1, int_hexagon_M2_mpy_sat_hh_s1>;
184 def : T_RR_pat <M2_mpy_sat_hh_s0, int_hexagon_M2_mpy_sat_hh_s0>;
185
186 def : T_RR_pat <M2_mpy_rnd_ll_s1, int_hexagon_M2_mpy_rnd_ll_s1>;
187 def : T_RR_pat <M2_mpy_rnd_ll_s0, int_hexagon_M2_mpy_rnd_ll_s0>;
188 def : T_RR_pat <M2_mpy_rnd_lh_s1, int_hexagon_M2_mpy_rnd_lh_s1>;
189 def : T_RR_pat <M2_mpy_rnd_lh_s0, int_hexagon_M2_mpy_rnd_lh_s0>;
190 def : T_RR_pat <M2_mpy_rnd_hl_s1, int_hexagon_M2_mpy_rnd_hl_s1>;
191 def : T_RR_pat <M2_mpy_rnd_hl_s0, int_hexagon_M2_mpy_rnd_hl_s0>;
192 def : T_RR_pat <M2_mpy_rnd_hh_s1, int_hexagon_M2_mpy_rnd_hh_s1>;
193 def : T_RR_pat <M2_mpy_rnd_hh_s0, int_hexagon_M2_mpy_rnd_hh_s0>;
194
195 def : T_RR_pat <M2_mpy_sat_rnd_ll_s1, int_hexagon_M2_mpy_sat_rnd_ll_s1>;
196 def : T_RR_pat <M2_mpy_sat_rnd_ll_s0, int_hexagon_M2_mpy_sat_rnd_ll_s0>;
197 def : T_RR_pat <M2_mpy_sat_rnd_lh_s1, int_hexagon_M2_mpy_sat_rnd_lh_s1>;
198 def : T_RR_pat <M2_mpy_sat_rnd_lh_s0, int_hexagon_M2_mpy_sat_rnd_lh_s0>;
199 def : T_RR_pat <M2_mpy_sat_rnd_hl_s1, int_hexagon_M2_mpy_sat_rnd_hl_s1>;
200 def : T_RR_pat <M2_mpy_sat_rnd_hl_s0, int_hexagon_M2_mpy_sat_rnd_hl_s0>;
201 def : T_RR_pat <M2_mpy_sat_rnd_hh_s1, int_hexagon_M2_mpy_sat_rnd_hh_s1>;
202 def : T_RR_pat <M2_mpy_sat_rnd_hh_s0, int_hexagon_M2_mpy_sat_rnd_hh_s0>;
203
204
205 //===----------------------------------------------------------------------===//
206 // MPYS / Multipy signed/unsigned halfwords and add/subtract the
207 // result from the accumulator.
208 //Rx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat]
209 //===----------------------------------------------------------------------===//
210
211 def : T_RRR_pat <M2_mpy_acc_ll_s1, int_hexagon_M2_mpy_acc_ll_s1>;
212 def : T_RRR_pat <M2_mpy_acc_ll_s0, int_hexagon_M2_mpy_acc_ll_s0>;
213 def : T_RRR_pat <M2_mpy_acc_lh_s1, int_hexagon_M2_mpy_acc_lh_s1>;
214 def : T_RRR_pat <M2_mpy_acc_lh_s0, int_hexagon_M2_mpy_acc_lh_s0>;
215 def : T_RRR_pat <M2_mpy_acc_hl_s1, int_hexagon_M2_mpy_acc_hl_s1>;
216 def : T_RRR_pat <M2_mpy_acc_hl_s0, int_hexagon_M2_mpy_acc_hl_s0>;
217 def : T_RRR_pat <M2_mpy_acc_hh_s1, int_hexagon_M2_mpy_acc_hh_s1>;
218 def : T_RRR_pat <M2_mpy_acc_hh_s0, int_hexagon_M2_mpy_acc_hh_s0>;
219
220 def : T_RRR_pat <M2_mpyu_acc_ll_s1, int_hexagon_M2_mpyu_acc_ll_s1>;
221 def : T_RRR_pat <M2_mpyu_acc_ll_s0, int_hexagon_M2_mpyu_acc_ll_s0>;
222 def : T_RRR_pat <M2_mpyu_acc_lh_s1, int_hexagon_M2_mpyu_acc_lh_s1>;
223 def : T_RRR_pat <M2_mpyu_acc_lh_s0, int_hexagon_M2_mpyu_acc_lh_s0>;
224 def : T_RRR_pat <M2_mpyu_acc_hl_s1, int_hexagon_M2_mpyu_acc_hl_s1>;
225 def : T_RRR_pat <M2_mpyu_acc_hl_s0, int_hexagon_M2_mpyu_acc_hl_s0>;
226 def : T_RRR_pat <M2_mpyu_acc_hh_s1, int_hexagon_M2_mpyu_acc_hh_s1>;
227 def : T_RRR_pat <M2_mpyu_acc_hh_s0, int_hexagon_M2_mpyu_acc_hh_s0>;
228
229 def : T_RRR_pat <M2_mpy_nac_ll_s1, int_hexagon_M2_mpy_nac_ll_s1>;
230 def : T_RRR_pat <M2_mpy_nac_ll_s0, int_hexagon_M2_mpy_nac_ll_s0>;
231 def : T_RRR_pat <M2_mpy_nac_lh_s1, int_hexagon_M2_mpy_nac_lh_s1>;
232 def : T_RRR_pat <M2_mpy_nac_lh_s0, int_hexagon_M2_mpy_nac_lh_s0>;
233 def : T_RRR_pat <M2_mpy_nac_hl_s1, int_hexagon_M2_mpy_nac_hl_s1>;
234 def : T_RRR_pat <M2_mpy_nac_hl_s0, int_hexagon_M2_mpy_nac_hl_s0>;
235 def : T_RRR_pat <M2_mpy_nac_hh_s1, int_hexagon_M2_mpy_nac_hh_s1>;
236 def : T_RRR_pat <M2_mpy_nac_hh_s0, int_hexagon_M2_mpy_nac_hh_s0>;
237
238 def : T_RRR_pat <M2_mpyu_nac_ll_s1, int_hexagon_M2_mpyu_nac_ll_s1>;
239 def : T_RRR_pat <M2_mpyu_nac_ll_s0, int_hexagon_M2_mpyu_nac_ll_s0>;
240 def : T_RRR_pat <M2_mpyu_nac_lh_s1, int_hexagon_M2_mpyu_nac_lh_s1>;
241 def : T_RRR_pat <M2_mpyu_nac_lh_s0, int_hexagon_M2_mpyu_nac_lh_s0>;
242 def : T_RRR_pat <M2_mpyu_nac_hl_s1, int_hexagon_M2_mpyu_nac_hl_s1>;
243 def : T_RRR_pat <M2_mpyu_nac_hl_s0, int_hexagon_M2_mpyu_nac_hl_s0>;
244 def : T_RRR_pat <M2_mpyu_nac_hh_s1, int_hexagon_M2_mpyu_nac_hh_s1>;
245 def : T_RRR_pat <M2_mpyu_nac_hh_s0, int_hexagon_M2_mpyu_nac_hh_s0>;
246
247 def : T_RRR_pat <M2_mpy_acc_sat_ll_s1, int_hexagon_M2_mpy_acc_sat_ll_s1>;
248 def : T_RRR_pat <M2_mpy_acc_sat_ll_s0, int_hexagon_M2_mpy_acc_sat_ll_s0>;
249 def : T_RRR_pat <M2_mpy_acc_sat_lh_s1, int_hexagon_M2_mpy_acc_sat_lh_s1>;
250 def : T_RRR_pat <M2_mpy_acc_sat_lh_s0, int_hexagon_M2_mpy_acc_sat_lh_s0>;
251 def : T_RRR_pat <M2_mpy_acc_sat_hl_s1, int_hexagon_M2_mpy_acc_sat_hl_s1>;
252 def : T_RRR_pat <M2_mpy_acc_sat_hl_s0, int_hexagon_M2_mpy_acc_sat_hl_s0>;
253 def : T_RRR_pat <M2_mpy_acc_sat_hh_s1, int_hexagon_M2_mpy_acc_sat_hh_s1>;
254 def : T_RRR_pat <M2_mpy_acc_sat_hh_s0, int_hexagon_M2_mpy_acc_sat_hh_s0>;
255
256 def : T_RRR_pat <M2_mpy_nac_sat_ll_s1, int_hexagon_M2_mpy_nac_sat_ll_s1>;
257 def : T_RRR_pat <M2_mpy_nac_sat_ll_s0, int_hexagon_M2_mpy_nac_sat_ll_s0>;
258 def : T_RRR_pat <M2_mpy_nac_sat_lh_s1, int_hexagon_M2_mpy_nac_sat_lh_s1>;
259 def : T_RRR_pat <M2_mpy_nac_sat_lh_s0, int_hexagon_M2_mpy_nac_sat_lh_s0>;
260 def : T_RRR_pat <M2_mpy_nac_sat_hl_s1, int_hexagon_M2_mpy_nac_sat_hl_s1>;
261 def : T_RRR_pat <M2_mpy_nac_sat_hl_s0, int_hexagon_M2_mpy_nac_sat_hl_s0>;
262 def : T_RRR_pat <M2_mpy_nac_sat_hh_s1, int_hexagon_M2_mpy_nac_sat_hh_s1>;
263 def : T_RRR_pat <M2_mpy_nac_sat_hh_s0, int_hexagon_M2_mpy_nac_sat_hh_s0>;
264
265
266 //===----------------------------------------------------------------------===//
267 // Multiply signed/unsigned halfwords with and without saturation and rounding
268 // into a 64-bits destination register.
269 //===----------------------------------------------------------------------===//
270
271 def : T_RR_pat <M2_mpyd_hh_s0, int_hexagon_M2_mpyd_hh_s0>;
272 def : T_RR_pat <M2_mpyd_hl_s0, int_hexagon_M2_mpyd_hl_s0>;
273 def : T_RR_pat <M2_mpyd_lh_s0, int_hexagon_M2_mpyd_lh_s0>;
274 def : T_RR_pat <M2_mpyd_ll_s0, int_hexagon_M2_mpyd_ll_s0>;
275 def : T_RR_pat <M2_mpyd_hh_s1, int_hexagon_M2_mpyd_hh_s1>;
276 def : T_RR_pat <M2_mpyd_hl_s1, int_hexagon_M2_mpyd_hl_s1>;
277 def : T_RR_pat <M2_mpyd_lh_s1, int_hexagon_M2_mpyd_lh_s1>;
278 def : T_RR_pat <M2_mpyd_ll_s1, int_hexagon_M2_mpyd_ll_s1>;
279
280 def : T_RR_pat <M2_mpyd_rnd_hh_s0, int_hexagon_M2_mpyd_rnd_hh_s0>;
281 def : T_RR_pat <M2_mpyd_rnd_hl_s0, int_hexagon_M2_mpyd_rnd_hl_s0>;
282 def : T_RR_pat <M2_mpyd_rnd_lh_s0, int_hexagon_M2_mpyd_rnd_lh_s0>;
283 def : T_RR_pat <M2_mpyd_rnd_ll_s0, int_hexagon_M2_mpyd_rnd_ll_s0>;
284 def : T_RR_pat <M2_mpyd_rnd_hh_s1, int_hexagon_M2_mpyd_rnd_hh_s1>;
285 def : T_RR_pat <M2_mpyd_rnd_hl_s1, int_hexagon_M2_mpyd_rnd_hl_s1>;
286 def : T_RR_pat <M2_mpyd_rnd_lh_s1, int_hexagon_M2_mpyd_rnd_lh_s1>;
287 def : T_RR_pat <M2_mpyd_rnd_ll_s1, int_hexagon_M2_mpyd_rnd_ll_s1>;
288
289 def : T_RR_pat <M2_mpyud_hh_s0, int_hexagon_M2_mpyud_hh_s0>;
290 def : T_RR_pat <M2_mpyud_hl_s0, int_hexagon_M2_mpyud_hl_s0>;
291 def : T_RR_pat <M2_mpyud_lh_s0, int_hexagon_M2_mpyud_lh_s0>;
292 def : T_RR_pat <M2_mpyud_ll_s0, int_hexagon_M2_mpyud_ll_s0>;
293 def : T_RR_pat <M2_mpyud_hh_s1, int_hexagon_M2_mpyud_hh_s1>;
294 def : T_RR_pat <M2_mpyud_hl_s1, int_hexagon_M2_mpyud_hl_s1>;
295 def : T_RR_pat <M2_mpyud_lh_s1, int_hexagon_M2_mpyud_lh_s1>;
296 def : T_RR_pat <M2_mpyud_ll_s1, int_hexagon_M2_mpyud_ll_s1>;
297
298 //===----------------------------------------------------------------------===//
299 // MPYS / Multipy signed/unsigned halfwords and add/subtract the
300 // result from the 64-bit destination register.
301 //Rxx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat]
302 //===----------------------------------------------------------------------===//
303
304 def : T_PRR_pat <M2_mpyd_acc_hh_s0, int_hexagon_M2_mpyd_acc_hh_s0>;
305 def : T_PRR_pat <M2_mpyd_acc_hl_s0, int_hexagon_M2_mpyd_acc_hl_s0>;
306 def : T_PRR_pat <M2_mpyd_acc_lh_s0, int_hexagon_M2_mpyd_acc_lh_s0>;
307 def : T_PRR_pat <M2_mpyd_acc_ll_s0, int_hexagon_M2_mpyd_acc_ll_s0>;
308
309 def : T_PRR_pat <M2_mpyd_acc_hh_s1, int_hexagon_M2_mpyd_acc_hh_s1>;
310 def : T_PRR_pat <M2_mpyd_acc_hl_s1, int_hexagon_M2_mpyd_acc_hl_s1>;
311 def : T_PRR_pat <M2_mpyd_acc_lh_s1, int_hexagon_M2_mpyd_acc_lh_s1>;
312 def : T_PRR_pat <M2_mpyd_acc_ll_s1, int_hexagon_M2_mpyd_acc_ll_s1>;
313
314 def : T_PRR_pat <M2_mpyd_nac_hh_s0, int_hexagon_M2_mpyd_nac_hh_s0>;
315 def : T_PRR_pat <M2_mpyd_nac_hl_s0, int_hexagon_M2_mpyd_nac_hl_s0>;
316 def : T_PRR_pat <M2_mpyd_nac_lh_s0, int_hexagon_M2_mpyd_nac_lh_s0>;
317 def : T_PRR_pat <M2_mpyd_nac_ll_s0, int_hexagon_M2_mpyd_nac_ll_s0>;
318
319 def : T_PRR_pat <M2_mpyd_nac_hh_s1, int_hexagon_M2_mpyd_nac_hh_s1>;
320 def : T_PRR_pat <M2_mpyd_nac_hl_s1, int_hexagon_M2_mpyd_nac_hl_s1>;
321 def : T_PRR_pat <M2_mpyd_nac_lh_s1, int_hexagon_M2_mpyd_nac_lh_s1>;
322 def : T_PRR_pat <M2_mpyd_nac_ll_s1, int_hexagon_M2_mpyd_nac_ll_s1>;
323
324 def : T_PRR_pat <M2_mpyud_acc_hh_s0, int_hexagon_M2_mpyud_acc_hh_s0>;
325 def : T_PRR_pat <M2_mpyud_acc_hl_s0, int_hexagon_M2_mpyud_acc_hl_s0>;
326 def : T_PRR_pat <M2_mpyud_acc_lh_s0, int_hexagon_M2_mpyud_acc_lh_s0>;
327 def : T_PRR_pat <M2_mpyud_acc_ll_s0, int_hexagon_M2_mpyud_acc_ll_s0>;
328
329 def : T_PRR_pat <M2_mpyud_acc_hh_s1, int_hexagon_M2_mpyud_acc_hh_s1>;
330 def : T_PRR_pat <M2_mpyud_acc_hl_s1, int_hexagon_M2_mpyud_acc_hl_s1>;
331 def : T_PRR_pat <M2_mpyud_acc_lh_s1, int_hexagon_M2_mpyud_acc_lh_s1>;
332 def : T_PRR_pat <M2_mpyud_acc_ll_s1, int_hexagon_M2_mpyud_acc_ll_s1>;
333
334 def : T_PRR_pat <M2_mpyud_nac_hh_s0, int_hexagon_M2_mpyud_nac_hh_s0>;
335 def : T_PRR_pat <M2_mpyud_nac_hl_s0, int_hexagon_M2_mpyud_nac_hl_s0>;
336 def : T_PRR_pat <M2_mpyud_nac_lh_s0, int_hexagon_M2_mpyud_nac_lh_s0>;
337 def : T_PRR_pat <M2_mpyud_nac_ll_s0, int_hexagon_M2_mpyud_nac_ll_s0>;
338
339 def : T_PRR_pat <M2_mpyud_nac_hh_s1, int_hexagon_M2_mpyud_nac_hh_s1>;
340 def : T_PRR_pat <M2_mpyud_nac_hl_s1, int_hexagon_M2_mpyud_nac_hl_s1>;
341 def : T_PRR_pat <M2_mpyud_nac_lh_s1, int_hexagon_M2_mpyud_nac_lh_s1>;
342 def : T_PRR_pat <M2_mpyud_nac_ll_s1, int_hexagon_M2_mpyud_nac_ll_s1>;
343
344 // Vector complex multiply imaginary: Rdd=vcmpyi(Rss,Rtt)[:<<1]:sat
345 def : T_PP_pat <M2_vcmpy_s1_sat_i, int_hexagon_M2_vcmpy_s1_sat_i>;
346 def : T_PP_pat <M2_vcmpy_s0_sat_i, int_hexagon_M2_vcmpy_s0_sat_i>;
347
348 // Vector complex multiply real: Rdd=vcmpyr(Rss,Rtt)[:<<1]:sat
349 def : T_PP_pat <M2_vcmpy_s1_sat_r, int_hexagon_M2_vcmpy_s1_sat_r>;
350 def : T_PP_pat <M2_vcmpy_s0_sat_r, int_hexagon_M2_vcmpy_s0_sat_r>;
351
352 // Vector dual multiply: Rdd=vdmpy(Rss,Rtt)[:<<1]:sat
353 def : T_PP_pat <M2_vdmpys_s1, int_hexagon_M2_vdmpys_s1>;
354 def : T_PP_pat <M2_vdmpys_s0, int_hexagon_M2_vdmpys_s0>;
355
356 // Vector multiply even halfwords: Rdd=vmpyeh(Rss,Rtt)[:<<1]:sat
357 def : T_PP_pat <M2_vmpy2es_s1, int_hexagon_M2_vmpy2es_s1>;
358 def : T_PP_pat <M2_vmpy2es_s0, int_hexagon_M2_vmpy2es_s0>;
359
360 //Rdd=vmpywoh(Rss,Rtt)[:<<1][:rnd]:sat
361 def : T_PP_pat <M2_mmpyh_s0,  int_hexagon_M2_mmpyh_s0>;
362 def : T_PP_pat <M2_mmpyh_s1,  int_hexagon_M2_mmpyh_s1>;
363 def : T_PP_pat <M2_mmpyh_rs0, int_hexagon_M2_mmpyh_rs0>;
364 def : T_PP_pat <M2_mmpyh_rs1, int_hexagon_M2_mmpyh_rs1>;
365
366 //Rdd=vmpyweh(Rss,Rtt)[:<<1][:rnd]:sat
367 def : T_PP_pat <M2_mmpyl_s0,  int_hexagon_M2_mmpyl_s0>;
368 def : T_PP_pat <M2_mmpyl_s1,  int_hexagon_M2_mmpyl_s1>;
369 def : T_PP_pat <M2_mmpyl_rs0, int_hexagon_M2_mmpyl_rs0>;
370 def : T_PP_pat <M2_mmpyl_rs1, int_hexagon_M2_mmpyl_rs1>;
371
372 //Rdd=vmpywouh(Rss,Rtt)[:<<1][:rnd]:sat
373 def : T_PP_pat <M2_mmpyuh_s0,  int_hexagon_M2_mmpyuh_s0>;
374 def : T_PP_pat <M2_mmpyuh_s1,  int_hexagon_M2_mmpyuh_s1>;
375 def : T_PP_pat <M2_mmpyuh_rs0, int_hexagon_M2_mmpyuh_rs0>;
376 def : T_PP_pat <M2_mmpyuh_rs1, int_hexagon_M2_mmpyuh_rs1>;
377
378 //Rdd=vmpyweuh(Rss,Rtt)[:<<1][:rnd]:sat
379 def : T_PP_pat <M2_mmpyul_s0,  int_hexagon_M2_mmpyul_s0>;
380 def : T_PP_pat <M2_mmpyul_s1,  int_hexagon_M2_mmpyul_s1>;
381 def : T_PP_pat <M2_mmpyul_rs0, int_hexagon_M2_mmpyul_rs0>;
382 def : T_PP_pat <M2_mmpyul_rs1, int_hexagon_M2_mmpyul_rs1>;
383
384 // Vector reduce add unsigned bytes: Rdd32[+]=vrmpybu(Rss32,Rtt32)
385 def : T_PP_pat  <A2_vraddub,     int_hexagon_A2_vraddub>;
386 def : T_PPP_pat <A2_vraddub_acc, int_hexagon_A2_vraddub_acc>;
387
388 // Vector sum of absolute differences unsigned bytes: Rdd=vrsadub(Rss,Rtt)
389 def : T_PP_pat  <A2_vrsadub,     int_hexagon_A2_vrsadub>;
390 def : T_PPP_pat <A2_vrsadub_acc, int_hexagon_A2_vrsadub_acc>;
391
392 // Vector absolute difference: Rdd=vabsdiffh(Rtt,Rss)
393 def : T_PP_pat <M2_vabsdiffh, int_hexagon_M2_vabsdiffh>;
394
395 // Vector absolute difference words: Rdd=vabsdiffw(Rtt,Rss)
396 def : T_PP_pat <M2_vabsdiffw, int_hexagon_M2_vabsdiffw>;
397
398 // Vector reduce complex multiply real or imaginary:
399 // Rdd[+]=vrcmpy[ir](Rss,Rtt[*])
400 def : T_PP_pat  <M2_vrcmpyi_s0,  int_hexagon_M2_vrcmpyi_s0>;
401 def : T_PP_pat  <M2_vrcmpyi_s0c, int_hexagon_M2_vrcmpyi_s0c>;
402 def : T_PPP_pat <M2_vrcmaci_s0,  int_hexagon_M2_vrcmaci_s0>;
403 def : T_PPP_pat <M2_vrcmaci_s0c, int_hexagon_M2_vrcmaci_s0c>;
404
405 def : T_PP_pat  <M2_vrcmpyr_s0,  int_hexagon_M2_vrcmpyr_s0>;
406 def : T_PP_pat  <M2_vrcmpyr_s0c, int_hexagon_M2_vrcmpyr_s0c>;
407 def : T_PPP_pat <M2_vrcmacr_s0,  int_hexagon_M2_vrcmacr_s0>;
408 def : T_PPP_pat <M2_vrcmacr_s0c, int_hexagon_M2_vrcmacr_s0c>;
409
410 // Vector reduce halfwords
411 // Rdd[+]=vrmpyh(Rss,Rtt)
412 def : T_PP_pat  <M2_vrmpy_s0, int_hexagon_M2_vrmpy_s0>;
413 def : T_PPP_pat <M2_vrmac_s0, int_hexagon_M2_vrmac_s0>;
414
415 //===----------------------------------------------------------------------===//
416 // Vector Multipy with accumulation
417 //===----------------------------------------------------------------------===//
418
419 // Vector multiply word by signed half with accumulation
420 // Rxx+=vmpyw[eo]h(Rss,Rtt)[:<<1][:rnd]:sat
421 def : T_PPP_pat <M2_mmacls_s1, int_hexagon_M2_mmacls_s1>;
422 def : T_PPP_pat <M2_mmacls_s0, int_hexagon_M2_mmacls_s0>;
423 def : T_PPP_pat <M2_mmacls_rs1, int_hexagon_M2_mmacls_rs1>;
424 def : T_PPP_pat <M2_mmacls_rs0, int_hexagon_M2_mmacls_rs0>;
425 def : T_PPP_pat <M2_mmachs_s1, int_hexagon_M2_mmachs_s1>;
426 def : T_PPP_pat <M2_mmachs_s0, int_hexagon_M2_mmachs_s0>;
427 def : T_PPP_pat <M2_mmachs_rs1, int_hexagon_M2_mmachs_rs1>;
428 def : T_PPP_pat <M2_mmachs_rs0, int_hexagon_M2_mmachs_rs0>;
429
430 // Vector multiply word by unsigned half with accumulation
431 // Rxx+=vmpyw[eo]uh(Rss,Rtt)[:<<1][:rnd]:sat
432 def : T_PPP_pat <M2_mmaculs_s1, int_hexagon_M2_mmaculs_s1>;
433 def : T_PPP_pat <M2_mmaculs_s0, int_hexagon_M2_mmaculs_s0>;
434 def : T_PPP_pat <M2_mmaculs_rs1, int_hexagon_M2_mmaculs_rs1>;
435 def : T_PPP_pat <M2_mmaculs_rs0, int_hexagon_M2_mmaculs_rs0>;
436 def : T_PPP_pat <M2_mmacuhs_s1, int_hexagon_M2_mmacuhs_s1>;
437 def : T_PPP_pat <M2_mmacuhs_s0, int_hexagon_M2_mmacuhs_s0>;
438 def : T_PPP_pat <M2_mmacuhs_rs1, int_hexagon_M2_mmacuhs_rs1>;
439 def : T_PPP_pat <M2_mmacuhs_rs0, int_hexagon_M2_mmacuhs_rs0>;
440
441 // Vector multiply even halfwords with accumulation
442 // Rxx+=vmpyeh(Rss,Rtt)[:<<1][:sat]
443 def : T_PPP_pat <M2_vmac2es, int_hexagon_M2_vmac2es>;
444 def : T_PPP_pat <M2_vmac2es_s1, int_hexagon_M2_vmac2es_s1>;
445 def : T_PPP_pat <M2_vmac2es_s0, int_hexagon_M2_vmac2es_s0>;
446
447 // Vector dual multiply with accumulation
448 // Rxx+=vdmpy(Rss,Rtt)[:sat]
449 def : T_PPP_pat <M2_vdmacs_s1, int_hexagon_M2_vdmacs_s1>;
450 def : T_PPP_pat <M2_vdmacs_s0, int_hexagon_M2_vdmacs_s0>;
451
452 // Vector complex multiply real or imaginary with accumulation
453 // Rxx+=vcmpy[ir](Rss,Rtt):sat
454 def : T_PPP_pat <M2_vcmac_s0_sat_r, int_hexagon_M2_vcmac_s0_sat_r>;
455 def : T_PPP_pat <M2_vcmac_s0_sat_i, int_hexagon_M2_vcmac_s0_sat_i>;
456
457 //===----------------------------------------------------------------------===//
458 // Add/Subtract halfword
459 // Rd=add(Rt.L,Rs.[HL])[:sat]
460 // Rd=sub(Rt.L,Rs.[HL])[:sat]
461 // Rd=add(Rt.[LH],Rs.[HL])[:sat][:<16]
462 // Rd=sub(Rt.[LH],Rs.[HL])[:sat][:<16]
463 //===----------------------------------------------------------------------===//
464
465 //Rd=add(Rt.L,Rs.[LH])
466 def : T_RR_pat <A2_addh_l16_ll,     int_hexagon_A2_addh_l16_ll>;
467 def : T_RR_pat <A2_addh_l16_hl,     int_hexagon_A2_addh_l16_hl>;
468
469 //Rd=add(Rt.L,Rs.[LH]):sat
470 def : T_RR_pat <A2_addh_l16_sat_ll, int_hexagon_A2_addh_l16_sat_ll>;
471 def : T_RR_pat <A2_addh_l16_sat_hl, int_hexagon_A2_addh_l16_sat_hl>;
472
473 //Rd=sub(Rt.L,Rs.[LH])
474 def : T_RR_pat <A2_subh_l16_ll,     int_hexagon_A2_subh_l16_ll>;
475 def : T_RR_pat <A2_subh_l16_hl,     int_hexagon_A2_subh_l16_hl>;
476
477 //Rd=sub(Rt.L,Rs.[LH]):sat
478 def : T_RR_pat <A2_subh_l16_sat_ll, int_hexagon_A2_subh_l16_sat_ll>;
479 def : T_RR_pat <A2_subh_l16_sat_hl, int_hexagon_A2_subh_l16_sat_hl>;
480
481 //Rd=add(Rt.[LH],Rs.[LH]):<<16
482 def : T_RR_pat <A2_addh_h16_ll,     int_hexagon_A2_addh_h16_ll>;
483 def : T_RR_pat <A2_addh_h16_lh,     int_hexagon_A2_addh_h16_lh>;
484 def : T_RR_pat <A2_addh_h16_hl,     int_hexagon_A2_addh_h16_hl>;
485 def : T_RR_pat <A2_addh_h16_hh,     int_hexagon_A2_addh_h16_hh>;
486
487 //Rd=sub(Rt.[LH],Rs.[LH]):<<16
488 def : T_RR_pat <A2_subh_h16_ll,     int_hexagon_A2_subh_h16_ll>;
489 def : T_RR_pat <A2_subh_h16_lh,     int_hexagon_A2_subh_h16_lh>;
490 def : T_RR_pat <A2_subh_h16_hl,     int_hexagon_A2_subh_h16_hl>;
491 def : T_RR_pat <A2_subh_h16_hh,     int_hexagon_A2_subh_h16_hh>;
492
493 //Rd=add(Rt.[LH],Rs.[LH]):sat:<<16
494 def : T_RR_pat <A2_addh_h16_sat_ll, int_hexagon_A2_addh_h16_sat_ll>;
495 def : T_RR_pat <A2_addh_h16_sat_lh, int_hexagon_A2_addh_h16_sat_lh>;
496 def : T_RR_pat <A2_addh_h16_sat_hl, int_hexagon_A2_addh_h16_sat_hl>;
497 def : T_RR_pat <A2_addh_h16_sat_hh, int_hexagon_A2_addh_h16_sat_hh>;
498
499 //Rd=sub(Rt.[LH],Rs.[LH]):sat:<<16
500 def : T_RR_pat <A2_subh_h16_sat_ll, int_hexagon_A2_subh_h16_sat_ll>;
501 def : T_RR_pat <A2_subh_h16_sat_lh, int_hexagon_A2_subh_h16_sat_lh>;
502 def : T_RR_pat <A2_subh_h16_sat_hl, int_hexagon_A2_subh_h16_sat_hl>;
503 def : T_RR_pat <A2_subh_h16_sat_hh, int_hexagon_A2_subh_h16_sat_hh>;
504
505 // ALU64 / ALU / min max
506 def : T_RR_pat<A2_max,  int_hexagon_A2_max>;
507 def : T_RR_pat<A2_min,  int_hexagon_A2_min>;
508 def : T_RR_pat<A2_maxu, int_hexagon_A2_maxu>;
509 def : T_RR_pat<A2_minu, int_hexagon_A2_minu>;
510
511 // Shift and accumulate
512 def : T_RRI_pat <S2_asr_i_r_nac,  int_hexagon_S2_asr_i_r_nac>;
513 def : T_RRI_pat <S2_lsr_i_r_nac,  int_hexagon_S2_lsr_i_r_nac>;
514 def : T_RRI_pat <S2_asl_i_r_nac,  int_hexagon_S2_asl_i_r_nac>;
515 def : T_RRI_pat <S2_asr_i_r_acc,  int_hexagon_S2_asr_i_r_acc>;
516 def : T_RRI_pat <S2_lsr_i_r_acc,  int_hexagon_S2_lsr_i_r_acc>;
517 def : T_RRI_pat <S2_asl_i_r_acc,  int_hexagon_S2_asl_i_r_acc>;
518
519 def : T_RRI_pat <S2_asr_i_r_and,  int_hexagon_S2_asr_i_r_and>;
520 def : T_RRI_pat <S2_lsr_i_r_and,  int_hexagon_S2_lsr_i_r_and>;
521 def : T_RRI_pat <S2_asl_i_r_and,  int_hexagon_S2_asl_i_r_and>;
522 def : T_RRI_pat <S2_asr_i_r_or,   int_hexagon_S2_asr_i_r_or>;
523 def : T_RRI_pat <S2_lsr_i_r_or,   int_hexagon_S2_lsr_i_r_or>;
524 def : T_RRI_pat <S2_asl_i_r_or,   int_hexagon_S2_asl_i_r_or>;
525 def : T_RRI_pat <S2_lsr_i_r_xacc, int_hexagon_S2_lsr_i_r_xacc>;
526 def : T_RRI_pat <S2_asl_i_r_xacc, int_hexagon_S2_asl_i_r_xacc>;
527
528 def : T_PPI_pat <S2_asr_i_p_nac,  int_hexagon_S2_asr_i_p_nac>;
529 def : T_PPI_pat <S2_lsr_i_p_nac,  int_hexagon_S2_lsr_i_p_nac>;
530 def : T_PPI_pat <S2_asl_i_p_nac,  int_hexagon_S2_asl_i_p_nac>;
531 def : T_PPI_pat <S2_asr_i_p_acc,  int_hexagon_S2_asr_i_p_acc>;
532 def : T_PPI_pat <S2_lsr_i_p_acc,  int_hexagon_S2_lsr_i_p_acc>;
533 def : T_PPI_pat <S2_asl_i_p_acc,  int_hexagon_S2_asl_i_p_acc>;
534
535 def : T_PPI_pat <S2_asr_i_p_and,  int_hexagon_S2_asr_i_p_and>;
536 def : T_PPI_pat <S2_lsr_i_p_and,  int_hexagon_S2_lsr_i_p_and>;
537 def : T_PPI_pat <S2_asl_i_p_and,  int_hexagon_S2_asl_i_p_and>;
538 def : T_PPI_pat <S2_asr_i_p_or,   int_hexagon_S2_asr_i_p_or>;
539 def : T_PPI_pat <S2_lsr_i_p_or,   int_hexagon_S2_lsr_i_p_or>;
540 def : T_PPI_pat <S2_asl_i_p_or,   int_hexagon_S2_asl_i_p_or>;
541 def : T_PPI_pat <S2_lsr_i_p_xacc, int_hexagon_S2_lsr_i_p_xacc>;
542 def : T_PPI_pat <S2_asl_i_p_xacc, int_hexagon_S2_asl_i_p_xacc>;
543
544 def : T_RRR_pat <S2_asr_r_r_nac,  int_hexagon_S2_asr_r_r_nac>;
545 def : T_RRR_pat <S2_lsr_r_r_nac,  int_hexagon_S2_lsr_r_r_nac>;
546 def : T_RRR_pat <S2_asl_r_r_nac,  int_hexagon_S2_asl_r_r_nac>;
547 def : T_RRR_pat <S2_lsl_r_r_nac,  int_hexagon_S2_lsl_r_r_nac>;
548 def : T_RRR_pat <S2_asr_r_r_acc,  int_hexagon_S2_asr_r_r_acc>;
549 def : T_RRR_pat <S2_lsr_r_r_acc,  int_hexagon_S2_lsr_r_r_acc>;
550 def : T_RRR_pat <S2_asl_r_r_acc,  int_hexagon_S2_asl_r_r_acc>;
551 def : T_RRR_pat <S2_lsl_r_r_acc,  int_hexagon_S2_lsl_r_r_acc>;
552
553 def : T_RRR_pat <S2_asr_r_r_and,  int_hexagon_S2_asr_r_r_and>;
554 def : T_RRR_pat <S2_lsr_r_r_and,  int_hexagon_S2_lsr_r_r_and>;
555 def : T_RRR_pat <S2_asl_r_r_and,  int_hexagon_S2_asl_r_r_and>;
556 def : T_RRR_pat <S2_lsl_r_r_and,  int_hexagon_S2_lsl_r_r_and>;
557 def : T_RRR_pat <S2_asr_r_r_or,   int_hexagon_S2_asr_r_r_or>;
558 def : T_RRR_pat <S2_lsr_r_r_or,   int_hexagon_S2_lsr_r_r_or>;
559 def : T_RRR_pat <S2_asl_r_r_or,   int_hexagon_S2_asl_r_r_or>;
560 def : T_RRR_pat <S2_lsl_r_r_or,   int_hexagon_S2_lsl_r_r_or>;
561
562 def : T_PPR_pat <S2_asr_r_p_nac,  int_hexagon_S2_asr_r_p_nac>;
563 def : T_PPR_pat <S2_lsr_r_p_nac,  int_hexagon_S2_lsr_r_p_nac>;
564 def : T_PPR_pat <S2_asl_r_p_nac,  int_hexagon_S2_asl_r_p_nac>;
565 def : T_PPR_pat <S2_lsl_r_p_nac,  int_hexagon_S2_lsl_r_p_nac>;
566 def : T_PPR_pat <S2_asr_r_p_acc,  int_hexagon_S2_asr_r_p_acc>;
567 def : T_PPR_pat <S2_lsr_r_p_acc,  int_hexagon_S2_lsr_r_p_acc>;
568 def : T_PPR_pat <S2_asl_r_p_acc,  int_hexagon_S2_asl_r_p_acc>;
569 def : T_PPR_pat <S2_lsl_r_p_acc,  int_hexagon_S2_lsl_r_p_acc>;
570
571 def : T_PPR_pat <S2_asr_r_p_and,  int_hexagon_S2_asr_r_p_and>;
572 def : T_PPR_pat <S2_lsr_r_p_and,  int_hexagon_S2_lsr_r_p_and>;
573 def : T_PPR_pat <S2_asl_r_p_and,  int_hexagon_S2_asl_r_p_and>;
574 def : T_PPR_pat <S2_lsl_r_p_and,  int_hexagon_S2_lsl_r_p_and>;
575 def : T_PPR_pat <S2_asr_r_p_or,   int_hexagon_S2_asr_r_p_or>;
576 def : T_PPR_pat <S2_lsr_r_p_or,   int_hexagon_S2_lsr_r_p_or>;
577 def : T_PPR_pat <S2_asl_r_p_or,   int_hexagon_S2_asl_r_p_or>;
578 def : T_PPR_pat <S2_lsl_r_p_or,   int_hexagon_S2_lsl_r_p_or>;
579
580 def : T_RRI_pat <S2_asr_i_r_nac,  int_hexagon_S2_asr_i_r_nac>;
581 def : T_RRI_pat <S2_lsr_i_r_nac,  int_hexagon_S2_lsr_i_r_nac>;
582 def : T_RRI_pat <S2_asl_i_r_nac,  int_hexagon_S2_asl_i_r_nac>;
583 def : T_RRI_pat <S2_asr_i_r_acc,  int_hexagon_S2_asr_i_r_acc>;
584 def : T_RRI_pat <S2_lsr_i_r_acc,  int_hexagon_S2_lsr_i_r_acc>;
585 def : T_RRI_pat <S2_asl_i_r_acc,  int_hexagon_S2_asl_i_r_acc>;
586
587 def : T_RRI_pat <S2_asr_i_r_and,  int_hexagon_S2_asr_i_r_and>;
588 def : T_RRI_pat <S2_lsr_i_r_and,  int_hexagon_S2_lsr_i_r_and>;
589 def : T_RRI_pat <S2_asl_i_r_and,  int_hexagon_S2_asl_i_r_and>;
590 def : T_RRI_pat <S2_asr_i_r_or,   int_hexagon_S2_asr_i_r_or>;
591 def : T_RRI_pat <S2_lsr_i_r_or,   int_hexagon_S2_lsr_i_r_or>;
592 def : T_RRI_pat <S2_asl_i_r_or,   int_hexagon_S2_asl_i_r_or>;
593 def : T_RRI_pat <S2_lsr_i_r_xacc, int_hexagon_S2_lsr_i_r_xacc>;
594 def : T_RRI_pat <S2_asl_i_r_xacc, int_hexagon_S2_asl_i_r_xacc>;
595
596 def : T_PPI_pat <S2_asr_i_p_nac,  int_hexagon_S2_asr_i_p_nac>;
597 def : T_PPI_pat <S2_lsr_i_p_nac,  int_hexagon_S2_lsr_i_p_nac>;
598 def : T_PPI_pat <S2_asl_i_p_nac,  int_hexagon_S2_asl_i_p_nac>;
599 def : T_PPI_pat <S2_asr_i_p_acc,  int_hexagon_S2_asr_i_p_acc>;
600 def : T_PPI_pat <S2_lsr_i_p_acc,  int_hexagon_S2_lsr_i_p_acc>;
601 def : T_PPI_pat <S2_asl_i_p_acc,  int_hexagon_S2_asl_i_p_acc>;
602
603 def : T_PPI_pat <S2_asr_i_p_and,  int_hexagon_S2_asr_i_p_and>;
604 def : T_PPI_pat <S2_lsr_i_p_and,  int_hexagon_S2_lsr_i_p_and>;
605 def : T_PPI_pat <S2_asl_i_p_and,  int_hexagon_S2_asl_i_p_and>;
606 def : T_PPI_pat <S2_asr_i_p_or,   int_hexagon_S2_asr_i_p_or>;
607 def : T_PPI_pat <S2_lsr_i_p_or,   int_hexagon_S2_lsr_i_p_or>;
608 def : T_PPI_pat <S2_asl_i_p_or,   int_hexagon_S2_asl_i_p_or>;
609 def : T_PPI_pat <S2_lsr_i_p_xacc, int_hexagon_S2_lsr_i_p_xacc>;
610 def : T_PPI_pat <S2_asl_i_p_xacc, int_hexagon_S2_asl_i_p_xacc>;
611
612 def : T_RRR_pat <S2_asr_r_r_nac,  int_hexagon_S2_asr_r_r_nac>;
613 def : T_RRR_pat <S2_lsr_r_r_nac,  int_hexagon_S2_lsr_r_r_nac>;
614 def : T_RRR_pat <S2_asl_r_r_nac,  int_hexagon_S2_asl_r_r_nac>;
615 def : T_RRR_pat <S2_lsl_r_r_nac,  int_hexagon_S2_lsl_r_r_nac>;
616 def : T_RRR_pat <S2_asr_r_r_acc,  int_hexagon_S2_asr_r_r_acc>;
617 def : T_RRR_pat <S2_lsr_r_r_acc,  int_hexagon_S2_lsr_r_r_acc>;
618 def : T_RRR_pat <S2_asl_r_r_acc,  int_hexagon_S2_asl_r_r_acc>;
619 def : T_RRR_pat <S2_lsl_r_r_acc,  int_hexagon_S2_lsl_r_r_acc>;
620
621 def : T_RRR_pat <S2_asr_r_r_and,  int_hexagon_S2_asr_r_r_and>;
622 def : T_RRR_pat <S2_lsr_r_r_and,  int_hexagon_S2_lsr_r_r_and>;
623 def : T_RRR_pat <S2_asl_r_r_and,  int_hexagon_S2_asl_r_r_and>;
624 def : T_RRR_pat <S2_lsl_r_r_and,  int_hexagon_S2_lsl_r_r_and>;
625 def : T_RRR_pat <S2_asr_r_r_or,   int_hexagon_S2_asr_r_r_or>;
626 def : T_RRR_pat <S2_lsr_r_r_or,   int_hexagon_S2_lsr_r_r_or>;
627 def : T_RRR_pat <S2_asl_r_r_or,   int_hexagon_S2_asl_r_r_or>;
628 def : T_RRR_pat <S2_lsl_r_r_or,   int_hexagon_S2_lsl_r_r_or>;
629
630 def : T_PPR_pat <S2_asr_r_p_nac,  int_hexagon_S2_asr_r_p_nac>;
631 def : T_PPR_pat <S2_lsr_r_p_nac,  int_hexagon_S2_lsr_r_p_nac>;
632 def : T_PPR_pat <S2_asl_r_p_nac,  int_hexagon_S2_asl_r_p_nac>;
633 def : T_PPR_pat <S2_lsl_r_p_nac,  int_hexagon_S2_lsl_r_p_nac>;
634 def : T_PPR_pat <S2_asr_r_p_acc,  int_hexagon_S2_asr_r_p_acc>;
635 def : T_PPR_pat <S2_lsr_r_p_acc,  int_hexagon_S2_lsr_r_p_acc>;
636 def : T_PPR_pat <S2_asl_r_p_acc,  int_hexagon_S2_asl_r_p_acc>;
637 def : T_PPR_pat <S2_lsl_r_p_acc,  int_hexagon_S2_lsl_r_p_acc>;
638
639 def : T_PPR_pat <S2_asr_r_p_and,  int_hexagon_S2_asr_r_p_and>;
640 def : T_PPR_pat <S2_lsr_r_p_and,  int_hexagon_S2_lsr_r_p_and>;
641 def : T_PPR_pat <S2_asl_r_p_and,  int_hexagon_S2_asl_r_p_and>;
642 def : T_PPR_pat <S2_lsl_r_p_and,  int_hexagon_S2_lsl_r_p_and>;
643 def : T_PPR_pat <S2_asr_r_p_or,   int_hexagon_S2_asr_r_p_or>;
644 def : T_PPR_pat <S2_lsr_r_p_or,   int_hexagon_S2_lsr_r_p_or>;
645 def : T_PPR_pat <S2_asl_r_p_or,   int_hexagon_S2_asl_r_p_or>;
646 def : T_PPR_pat <S2_lsl_r_p_or,   int_hexagon_S2_lsl_r_p_or>;
647
648 /********************************************************************
649 *            ALU32/ALU                                              *
650 *********************************************************************/
651 def : T_RR_pat<A2_add,      int_hexagon_A2_add>;
652 def : T_RI_pat<A2_addi,     int_hexagon_A2_addi>;
653 def : T_RR_pat<A2_sub,      int_hexagon_A2_sub>;
654 def : T_IR_pat<A2_subri,    int_hexagon_A2_subri>;
655 def : T_RR_pat<A2_and,      int_hexagon_A2_and>;
656 def : T_RI_pat<A2_andir,    int_hexagon_A2_andir>;
657 def : T_RR_pat<A2_or,       int_hexagon_A2_or>;
658 def : T_RI_pat<A2_orir,     int_hexagon_A2_orir>;
659 def : T_RR_pat<A2_xor,      int_hexagon_A2_xor>;
660 def : T_RR_pat<A2_combinew, int_hexagon_A2_combinew>;
661
662 // Assembler mapped from Rd32=not(Rs32) to Rd32=sub(#-1,Rs32)
663 def : Pat <(int_hexagon_A2_not (I32:$Rs)),
664            (A2_subri -1, IntRegs:$Rs)>;
665
666 // Assembler mapped from Rd32=neg(Rs32) to Rd32=sub(#0,Rs32)
667 def : Pat <(int_hexagon_A2_neg IntRegs:$Rs),
668            (A2_subri 0, IntRegs:$Rs)>;
669
670 // Transfer immediate
671 def  : Pat <(int_hexagon_A2_tfril (I32:$Rs), u16_0ImmPred:$Is),
672             (A2_tfril IntRegs:$Rs, u16_0ImmPred:$Is)>;
673 def  : Pat <(int_hexagon_A2_tfrih (I32:$Rs), u16_0ImmPred:$Is),
674             (A2_tfrih IntRegs:$Rs, u16_0ImmPred:$Is)>;
675
676 //  Transfer Register/immediate.
677 def : T_R_pat <A2_tfr, int_hexagon_A2_tfr>;
678 def : T_I_pat <A2_tfrsi, int_hexagon_A2_tfrsi>;
679
680 // Assembler mapped from Rdd32=Rss32 to Rdd32=combine(Rss.H32,Rss.L32)
681 def : Pat<(int_hexagon_A2_tfrp DoubleRegs:$src),
682           (A2_combinew (HiReg DoubleRegs:$src), (LoReg DoubleRegs:$src))>;
683
684 /********************************************************************
685 *            ALU32/PERM                                             *
686 *********************************************************************/
687 // Combine
688 def: T_RR_pat<A2_combine_hh, int_hexagon_A2_combine_hh>;
689 def: T_RR_pat<A2_combine_hl, int_hexagon_A2_combine_hl>;
690 def: T_RR_pat<A2_combine_lh, int_hexagon_A2_combine_lh>;
691 def: T_RR_pat<A2_combine_ll, int_hexagon_A2_combine_ll>;
692
693 def: T_II_pat<A2_combineii, int_hexagon_A2_combineii, s32ImmPred, s8ImmPred>;
694
695 def: Pat<(i32 (int_hexagon_C2_mux (I32:$Rp), (I32:$Rs), (I32:$Rt))),
696          (i32 (C2_mux (C2_tfrrp IntRegs:$Rp), IntRegs:$Rs, IntRegs:$Rt))>;
697
698 // Mux
699 def : T_QRI_pat<C2_muxir, int_hexagon_C2_muxir, s32ImmPred>;
700 def : T_QIR_pat<C2_muxri, int_hexagon_C2_muxri, s32ImmPred>;
701 def : T_QII_pat<C2_muxii, int_hexagon_C2_muxii, s32ImmPred, s8ImmPred>;
702
703 // Shift halfword
704 def : T_R_pat<A2_aslh, int_hexagon_A2_aslh>;
705 def : T_R_pat<A2_asrh, int_hexagon_A2_asrh>;
706 def : T_R_pat<A2_asrh, int_hexagon_SI_to_SXTHI_asrh>;
707
708 // Sign/zero extend
709 def : T_R_pat<A2_sxth, int_hexagon_A2_sxth>;
710 def : T_R_pat<A2_sxtb, int_hexagon_A2_sxtb>;
711 def : T_R_pat<A2_zxth, int_hexagon_A2_zxth>;
712 def : T_R_pat<A2_zxtb, int_hexagon_A2_zxtb>;
713
714 /********************************************************************
715 *            ALU32/PRED                                             *
716 *********************************************************************/
717 // Compare
718 def : T_RR_pat<C2_cmpeq,  int_hexagon_C2_cmpeq>;
719 def : T_RR_pat<C2_cmpgt,  int_hexagon_C2_cmpgt>;
720 def : T_RR_pat<C2_cmpgtu, int_hexagon_C2_cmpgtu>;
721
722 def : T_RI_pat<C2_cmpeqi, int_hexagon_C2_cmpeqi, s32ImmPred>;
723 def : T_RI_pat<C2_cmpgti, int_hexagon_C2_cmpgti, s32ImmPred>;
724 def : T_RI_pat<C2_cmpgtui, int_hexagon_C2_cmpgtui, u32ImmPred>;
725
726 def : Pat <(i32 (int_hexagon_C2_cmpgei (I32:$src1), s32ImmPred:$src2)),
727       (i32 (C2_cmpgti (I32:$src1),
728                       (DEC_CONST_SIGNED s32ImmPred:$src2)))>;
729
730 def : Pat <(i32 (int_hexagon_C2_cmpgeui (I32:$src1), u32ImmPred:$src2)),
731       (i32 (C2_cmpgtui (I32:$src1),
732                        (DEC_CONST_UNSIGNED u32ImmPred:$src2)))>;
733
734 // The instruction, Pd=cmp.geu(Rs, #u8) -> Pd=cmp.eq(Rs,Rs) when #u8 == 0.
735 def : Pat <(i32 (int_hexagon_C2_cmpgeui (I32:$src1), 0)),
736       (i32 (C2_cmpeq (I32:$src1), (I32:$src1)))>;
737
738 def : Pat <(i32 (int_hexagon_C2_cmplt (I32:$src1),
739                                       (I32:$src2))),
740       (i32 (C2_cmpgt (I32:$src2), (I32:$src1)))>;
741
742 def : Pat <(i32 (int_hexagon_C2_cmpltu (I32:$src1),
743                                        (I32:$src2))),
744       (i32 (C2_cmpgtu (I32:$src2), (I32:$src1)))>;
745
746 /********************************************************************
747 *            ALU32/VH                                               *
748 *********************************************************************/
749 // Vector add, subtract, average halfwords
750 def: T_RR_pat<A2_svaddh,   int_hexagon_A2_svaddh>;
751 def: T_RR_pat<A2_svaddhs,  int_hexagon_A2_svaddhs>;
752 def: T_RR_pat<A2_svadduhs, int_hexagon_A2_svadduhs>;
753
754 def: T_RR_pat<A2_svsubh,   int_hexagon_A2_svsubh>;
755 def: T_RR_pat<A2_svsubhs,  int_hexagon_A2_svsubhs>;
756 def: T_RR_pat<A2_svsubuhs, int_hexagon_A2_svsubuhs>;
757
758 def: T_RR_pat<A2_svavgh,   int_hexagon_A2_svavgh>;
759 def: T_RR_pat<A2_svavghs,  int_hexagon_A2_svavghs>;
760 def: T_RR_pat<A2_svnavgh,  int_hexagon_A2_svnavgh>;
761
762 /********************************************************************
763 *            ALU64/ALU                                              *
764 *********************************************************************/
765 def: T_RR_pat<A2_addsat,   int_hexagon_A2_addsat>;
766 def: T_RR_pat<A2_subsat,   int_hexagon_A2_subsat>;
767 def: T_PP_pat<A2_addp,     int_hexagon_A2_addp>;
768 def: T_PP_pat<A2_subp,     int_hexagon_A2_subp>;
769
770 def: T_PP_pat<A2_andp,     int_hexagon_A2_andp>;
771 def: T_PP_pat<A2_orp,      int_hexagon_A2_orp>;
772 def: T_PP_pat<A2_xorp,     int_hexagon_A2_xorp>;
773
774 def: T_PP_pat<C2_cmpeqp,   int_hexagon_C2_cmpeqp>;
775 def: T_PP_pat<C2_cmpgtp,   int_hexagon_C2_cmpgtp>;
776 def: T_PP_pat<C2_cmpgtup,  int_hexagon_C2_cmpgtup>;
777
778 def: T_PP_pat<S2_parityp,  int_hexagon_S2_parityp>;
779 def: T_RR_pat<S2_packhl,   int_hexagon_S2_packhl>;
780
781 /********************************************************************
782 *            ALU64/VB                                               *
783 *********************************************************************/
784 // ALU64 - Vector add
785 def : T_PP_pat <A2_vaddub,   int_hexagon_A2_vaddub>;
786 def : T_PP_pat <A2_vaddubs,  int_hexagon_A2_vaddubs>;
787 def : T_PP_pat <A2_vaddh,    int_hexagon_A2_vaddh>;
788 def : T_PP_pat <A2_vaddhs,   int_hexagon_A2_vaddhs>;
789 def : T_PP_pat <A2_vadduhs,  int_hexagon_A2_vadduhs>;
790 def : T_PP_pat <A2_vaddw,    int_hexagon_A2_vaddw>;
791 def : T_PP_pat <A2_vaddws,   int_hexagon_A2_vaddws>;
792
793 // ALU64 - Vector average
794 def : T_PP_pat <A2_vavgub,   int_hexagon_A2_vavgub>;
795 def : T_PP_pat <A2_vavgubr,  int_hexagon_A2_vavgubr>;
796 def : T_PP_pat <A2_vavgh,    int_hexagon_A2_vavgh>;
797 def : T_PP_pat <A2_vavghr,   int_hexagon_A2_vavghr>;
798 def : T_PP_pat <A2_vavghcr,  int_hexagon_A2_vavghcr>;
799 def : T_PP_pat <A2_vavguh,   int_hexagon_A2_vavguh>;
800 def : T_PP_pat <A2_vavguhr,  int_hexagon_A2_vavguhr>;
801
802 def : T_PP_pat <A2_vavgw,    int_hexagon_A2_vavgw>;
803 def : T_PP_pat <A2_vavgwr,   int_hexagon_A2_vavgwr>;
804 def : T_PP_pat <A2_vavgwcr,  int_hexagon_A2_vavgwcr>;
805 def : T_PP_pat <A2_vavguw,   int_hexagon_A2_vavguw>;
806 def : T_PP_pat <A2_vavguwr,  int_hexagon_A2_vavguwr>;
807
808 // ALU64 - Vector negative average
809 def : T_PP_pat <A2_vnavgh,   int_hexagon_A2_vnavgh>;
810 def : T_PP_pat <A2_vnavghr,  int_hexagon_A2_vnavghr>;
811 def : T_PP_pat <A2_vnavghcr, int_hexagon_A2_vnavghcr>;
812 def : T_PP_pat <A2_vnavgw,   int_hexagon_A2_vnavgw>;
813 def : T_PP_pat <A2_vnavgwr,  int_hexagon_A2_vnavgwr>;
814 def : T_PP_pat <A2_vnavgwcr, int_hexagon_A2_vnavgwcr>;
815
816 // ALU64 - Vector max
817 def : T_PP_pat <A2_vmaxh,    int_hexagon_A2_vmaxh>;
818 def : T_PP_pat <A2_vmaxw,    int_hexagon_A2_vmaxw>;
819 def : T_PP_pat <A2_vmaxub,   int_hexagon_A2_vmaxub>;
820 def : T_PP_pat <A2_vmaxuh,   int_hexagon_A2_vmaxuh>;
821 def : T_PP_pat <A2_vmaxuw,   int_hexagon_A2_vmaxuw>;
822
823 // ALU64 - Vector min
824 def : T_PP_pat <A2_vminh,    int_hexagon_A2_vminh>;
825 def : T_PP_pat <A2_vminw,    int_hexagon_A2_vminw>;
826 def : T_PP_pat <A2_vminub,   int_hexagon_A2_vminub>;
827 def : T_PP_pat <A2_vminuh,   int_hexagon_A2_vminuh>;
828 def : T_PP_pat <A2_vminuw,   int_hexagon_A2_vminuw>;
829
830 // ALU64 - Vector sub
831 def : T_PP_pat <A2_vsubub,   int_hexagon_A2_vsubub>;
832 def : T_PP_pat <A2_vsububs,  int_hexagon_A2_vsububs>;
833 def : T_PP_pat <A2_vsubh,    int_hexagon_A2_vsubh>;
834 def : T_PP_pat <A2_vsubhs,   int_hexagon_A2_vsubhs>;
835 def : T_PP_pat <A2_vsubuhs,  int_hexagon_A2_vsubuhs>;
836 def : T_PP_pat <A2_vsubw,    int_hexagon_A2_vsubw>;
837 def : T_PP_pat <A2_vsubws,   int_hexagon_A2_vsubws>;
838
839 // ALU64 - Vector compare bytes
840 def : T_PP_pat <A2_vcmpbeq,  int_hexagon_A2_vcmpbeq>;
841 def : T_PP_pat <A4_vcmpbgt,  int_hexagon_A4_vcmpbgt>;
842 def : T_PP_pat <A2_vcmpbgtu, int_hexagon_A2_vcmpbgtu>;
843
844 // ALU64 - Vector compare halfwords
845 def : T_PP_pat <A2_vcmpheq,  int_hexagon_A2_vcmpheq>;
846 def : T_PP_pat <A2_vcmphgt,  int_hexagon_A2_vcmphgt>;
847 def : T_PP_pat <A2_vcmphgtu, int_hexagon_A2_vcmphgtu>;
848
849 // ALU64 - Vector compare words
850 def : T_PP_pat <A2_vcmpweq,  int_hexagon_A2_vcmpweq>;
851 def : T_PP_pat <A2_vcmpwgt,  int_hexagon_A2_vcmpwgt>;
852 def : T_PP_pat <A2_vcmpwgtu, int_hexagon_A2_vcmpwgtu>;
853
854 // ALU64 / VB / Vector mux.
855 def : Pat<(int_hexagon_C2_vmux PredRegs:$Pu, DoubleRegs:$Rs, DoubleRegs:$Rt),
856           (C2_vmux PredRegs:$Pu, DoubleRegs:$Rs, DoubleRegs:$Rt)>;
857
858 // MPY - Multiply and use full result
859 // Rdd = mpy[u](Rs, Rt)
860 def : T_RR_pat <M2_dpmpyss_s0, int_hexagon_M2_dpmpyss_s0>;
861 def : T_RR_pat <M2_dpmpyuu_s0, int_hexagon_M2_dpmpyuu_s0>;
862
863 // Complex multiply real or imaginary
864 def : T_RR_pat <M2_cmpyi_s0,   int_hexagon_M2_cmpyi_s0>;
865 def : T_RR_pat <M2_cmpyr_s0,   int_hexagon_M2_cmpyr_s0>;
866
867 // Complex multiply
868 def : T_RR_pat <M2_cmpys_s0,   int_hexagon_M2_cmpys_s0>;
869 def : T_RR_pat <M2_cmpysc_s0,  int_hexagon_M2_cmpysc_s0>;
870 def : T_RR_pat <M2_cmpys_s1,   int_hexagon_M2_cmpys_s1>;
871 def : T_RR_pat <M2_cmpysc_s1,  int_hexagon_M2_cmpysc_s1>;
872
873 // Vector multiply halfwords
874 // Rdd=vmpyh(Rs,Rt)[:<<1]:sat
875 def : T_RR_pat <M2_vmpy2s_s0,  int_hexagon_M2_vmpy2s_s0>;
876 def : T_RR_pat <M2_vmpy2s_s1,  int_hexagon_M2_vmpy2s_s1>;
877
878 // Rxx[+-]= mpy[u](Rs,Rt)
879 def : T_PRR_pat <M2_dpmpyss_acc_s0, int_hexagon_M2_dpmpyss_acc_s0>;
880 def : T_PRR_pat <M2_dpmpyss_nac_s0, int_hexagon_M2_dpmpyss_nac_s0>;
881 def : T_PRR_pat <M2_dpmpyuu_acc_s0, int_hexagon_M2_dpmpyuu_acc_s0>;
882 def : T_PRR_pat <M2_dpmpyuu_nac_s0, int_hexagon_M2_dpmpyuu_nac_s0>;
883
884 // Rxx[-+]=cmpy(Rs,Rt)[:<<1]:sat
885 def : T_PRR_pat <M2_cmacs_s0, int_hexagon_M2_cmacs_s0>;
886 def : T_PRR_pat <M2_cnacs_s0, int_hexagon_M2_cnacs_s0>;
887 def : T_PRR_pat <M2_cmacs_s1, int_hexagon_M2_cmacs_s1>;
888 def : T_PRR_pat <M2_cnacs_s1, int_hexagon_M2_cnacs_s1>;
889
890 // Rxx[-+]=cmpy(Rs,Rt*)[:<<1]:sat
891 def : T_PRR_pat <M2_cmacsc_s0, int_hexagon_M2_cmacsc_s0>;
892 def : T_PRR_pat <M2_cnacsc_s0, int_hexagon_M2_cnacsc_s0>;
893 def : T_PRR_pat <M2_cmacsc_s1, int_hexagon_M2_cmacsc_s1>;
894 def : T_PRR_pat <M2_cnacsc_s1, int_hexagon_M2_cnacsc_s1>;
895
896 // Rxx+=cmpy[ir](Rs,Rt)
897 def : T_PRR_pat <M2_cmaci_s0, int_hexagon_M2_cmaci_s0>;
898 def : T_PRR_pat <M2_cmacr_s0, int_hexagon_M2_cmacr_s0>;
899
900 // Rxx+=vmpyh(Rs,Rt)[:<<1][:sat]
901 def : T_PRR_pat <M2_vmac2, int_hexagon_M2_vmac2>;
902 def : T_PRR_pat <M2_vmac2s_s0, int_hexagon_M2_vmac2s_s0>;
903 def : T_PRR_pat <M2_vmac2s_s1, int_hexagon_M2_vmac2s_s1>;
904
905 /********************************************************************
906 *            CR                                                     *
907 *********************************************************************/
908 class qi_CRInst_qi_pat<InstHexagon Inst, Intrinsic IntID> :
909   Pat<(i32 (IntID IntRegs:$Rs)),
910       (i32 (C2_tfrpr (Inst (C2_tfrrp IntRegs:$Rs))))>;
911
912 class qi_CRInst_qiqi_pat<InstHexagon Inst, Intrinsic IntID> :
913   Pat<(i32 (IntID IntRegs:$Rs, IntRegs:$Rt)),
914       (i32 (C2_tfrpr (Inst (C2_tfrrp IntRegs:$Rs), (C2_tfrrp IntRegs:$Rt))))>;
915
916 def: qi_CRInst_qi_pat<C2_not,     int_hexagon_C2_not>;
917 def: qi_CRInst_qi_pat<C2_all8,    int_hexagon_C2_all8>;
918 def: qi_CRInst_qi_pat<C2_any8,    int_hexagon_C2_any8>;
919
920 def: qi_CRInst_qiqi_pat<C2_and,   int_hexagon_C2_and>;
921 def: qi_CRInst_qiqi_pat<C2_andn,  int_hexagon_C2_andn>;
922 def: qi_CRInst_qiqi_pat<C2_or,    int_hexagon_C2_or>;
923 def: qi_CRInst_qiqi_pat<C2_orn,   int_hexagon_C2_orn>;
924 def: qi_CRInst_qiqi_pat<C2_xor,   int_hexagon_C2_xor>;
925
926 // Multiply 32x32 and use lower result
927 def : T_RRI_pat <M2_macsip, int_hexagon_M2_macsip>;
928 def : T_RRI_pat <M2_macsin, int_hexagon_M2_macsin>;
929 def : T_RRR_pat <M2_maci, int_hexagon_M2_maci>;
930
931 // Subtract and accumulate
932 def : T_RRR_pat <M2_subacc, int_hexagon_M2_subacc>;
933
934 // Add and accumulate
935 def : T_RRR_pat <M2_acci,   int_hexagon_M2_acci>;
936 def : T_RRR_pat <M2_nacci,  int_hexagon_M2_nacci>;
937 def : T_RRI_pat <M2_accii,  int_hexagon_M2_accii>;
938 def : T_RRI_pat <M2_naccii, int_hexagon_M2_naccii>;
939
940 // XOR and XOR with destination
941 def : T_RRR_pat <M2_xor_xacc, int_hexagon_M2_xor_xacc>;
942
943 class MType_R32_pat <Intrinsic IntID, InstHexagon OutputInst> :
944       Pat <(IntID IntRegs:$src1, IntRegs:$src2),
945            (OutputInst IntRegs:$src1, IntRegs:$src2)>;
946
947 // Vector dual multiply with round and pack
948
949 def : Pat <(int_hexagon_M2_vdmpyrs_s0 DoubleRegs:$src1, DoubleRegs:$src2),
950            (M2_vdmpyrs_s0 DoubleRegs:$src1, DoubleRegs:$src2)>;
951
952 def : Pat <(int_hexagon_M2_vdmpyrs_s1 DoubleRegs:$src1, DoubleRegs:$src2),
953            (M2_vdmpyrs_s1 DoubleRegs:$src1, DoubleRegs:$src2)>;
954
955 // Vector multiply halfwords with round and pack
956
957 def : MType_R32_pat <int_hexagon_M2_vmpy2s_s0pack, M2_vmpy2s_s0pack>;
958 def : MType_R32_pat <int_hexagon_M2_vmpy2s_s1pack, M2_vmpy2s_s1pack>;
959
960 // Multiply and use lower result
961 def : MType_R32_pat <int_hexagon_M2_mpyi, M2_mpyi>;
962 def : T_RI_pat<M2_mpysmi, int_hexagon_M2_mpysmi>;
963
964 // Assembler mapped from Rd32=mpyui(Rs32,Rt32) to Rd32=mpyi(Rs32,Rt32)
965 def : MType_R32_pat <int_hexagon_M2_mpyui, M2_mpyi>;
966
967 // Multiply and use upper result
968 def : MType_R32_pat <int_hexagon_M2_mpy_up, M2_mpy_up>;
969 def : MType_R32_pat <int_hexagon_M2_mpyu_up, M2_mpyu_up>;
970 def : MType_R32_pat <int_hexagon_M2_hmmpyh_rs1, M2_hmmpyh_rs1>;
971 def : MType_R32_pat <int_hexagon_M2_hmmpyl_rs1, M2_hmmpyl_rs1>;
972 def : MType_R32_pat <int_hexagon_M2_dpmpyss_rnd_s0, M2_dpmpyss_rnd_s0>;
973
974 // Complex multiply with round and pack
975 // Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat
976 def : MType_R32_pat <int_hexagon_M2_cmpyrs_s0, M2_cmpyrs_s0>;
977 def : MType_R32_pat <int_hexagon_M2_cmpyrs_s1, M2_cmpyrs_s1>;
978 def : MType_R32_pat <int_hexagon_M2_cmpyrsc_s0, M2_cmpyrsc_s0>;
979 def : MType_R32_pat <int_hexagon_M2_cmpyrsc_s1, M2_cmpyrsc_s1>;
980
981 /********************************************************************
982 *            STYPE/ALU                                              *
983 *********************************************************************/
984 def : T_P_pat <A2_absp, int_hexagon_A2_absp>;
985 def : T_P_pat <A2_negp, int_hexagon_A2_negp>;
986 def : T_P_pat <A2_notp, int_hexagon_A2_notp>;
987
988 /********************************************************************
989 *            STYPE/BIT                                              *
990 *********************************************************************/
991
992 // Count leading/trailing
993 def: T_R_pat<S2_cl0,     int_hexagon_S2_cl0>;
994 def: T_P_pat<S2_cl0p,    int_hexagon_S2_cl0p>;
995 def: T_R_pat<S2_cl1,     int_hexagon_S2_cl1>;
996 def: T_P_pat<S2_cl1p,    int_hexagon_S2_cl1p>;
997 def: T_R_pat<S2_clb,     int_hexagon_S2_clb>;
998 def: T_P_pat<S2_clbp,    int_hexagon_S2_clbp>;
999 def: T_R_pat<S2_clbnorm, int_hexagon_S2_clbnorm>;
1000 def: T_R_pat<S2_ct0,     int_hexagon_S2_ct0>;
1001 def: T_R_pat<S2_ct1,     int_hexagon_S2_ct1>;
1002
1003 // Compare bit mask
1004 def: T_RR_pat<C2_bitsclr,  int_hexagon_C2_bitsclr>;
1005 def: T_RI_pat<C2_bitsclri, int_hexagon_C2_bitsclri>;
1006 def: T_RR_pat<C2_bitsset,  int_hexagon_C2_bitsset>;
1007
1008 // Vector shuffle
1009 def : T_PP_pat <S2_shuffeb, int_hexagon_S2_shuffeb>;
1010 def : T_PP_pat <S2_shuffob, int_hexagon_S2_shuffob>;
1011 def : T_PP_pat <S2_shuffeh, int_hexagon_S2_shuffeh>;
1012 def : T_PP_pat <S2_shuffoh, int_hexagon_S2_shuffoh>;
1013
1014 // Vector truncate
1015 def : T_PP_pat <S2_vtrunewh, int_hexagon_S2_vtrunewh>;
1016 def : T_PP_pat <S2_vtrunowh, int_hexagon_S2_vtrunowh>;
1017
1018 // Linear feedback-shift Iteration.
1019 def : T_PP_pat <S2_lfsp, int_hexagon_S2_lfsp>;
1020
1021 // Vector splice
1022 def : T_PPQ_pat <S2_vsplicerb, int_hexagon_S2_vsplicerb>;
1023 def : T_PPI_pat <S2_vspliceib, int_hexagon_S2_vspliceib>;
1024
1025 // Shift by immediate and add
1026 def : T_RRI_pat<S2_addasl_rrri, int_hexagon_S2_addasl_rrri>;
1027
1028 // Extract bitfield
1029 def : T_PII_pat<S2_extractup,    int_hexagon_S2_extractup>;
1030 def : T_RII_pat<S2_extractu,     int_hexagon_S2_extractu>;
1031 def : T_RP_pat <S2_extractu_rp,  int_hexagon_S2_extractu_rp>;
1032 def : T_PP_pat <S2_extractup_rp, int_hexagon_S2_extractup_rp>;
1033
1034 // Insert bitfield
1035 def : Pat <(int_hexagon_S2_insert_rp IntRegs:$src1, IntRegs:$src2,
1036                                      DoubleRegs:$src3),
1037            (S2_insert_rp IntRegs:$src1, IntRegs:$src2, DoubleRegs:$src3)>;
1038
1039 def : Pat<(i64 (int_hexagon_S2_insertp_rp (I64:$src1),
1040                  (I64:$src2), (I64:$src3))),
1041           (i64 (S2_insertp_rp (I64:$src1), (I64:$src2),
1042                               (I64:$src3)))>;
1043
1044 def : Pat<(int_hexagon_S2_insert IntRegs:$src1, IntRegs:$src2,
1045                                  u5ImmPred:$src3, u5ImmPred:$src4),
1046           (S2_insert IntRegs:$src1, IntRegs:$src2,
1047                      u5ImmPred:$src3, u5ImmPred:$src4)>;
1048
1049 def : Pat<(i64 (int_hexagon_S2_insertp (I64:$src1),
1050                  (I64:$src2), u6ImmPred:$src3, u6ImmPred:$src4)),
1051           (i64 (S2_insertp (I64:$src1), (I64:$src2),
1052                            u6ImmPred:$src3, u6ImmPred:$src4))>;
1053
1054
1055 // Innterleave/deinterleave
1056 def : T_P_pat <S2_interleave, int_hexagon_S2_interleave>;
1057 def : T_P_pat <S2_deinterleave, int_hexagon_S2_deinterleave>;
1058
1059 // Set/Clear/Toggle Bit
1060 def: T_RI_pat<S2_setbit_i,    int_hexagon_S2_setbit_i>;
1061 def: T_RI_pat<S2_clrbit_i,    int_hexagon_S2_clrbit_i>;
1062 def: T_RI_pat<S2_togglebit_i, int_hexagon_S2_togglebit_i>;
1063
1064 def: T_RR_pat<S2_setbit_r,    int_hexagon_S2_setbit_r>;
1065 def: T_RR_pat<S2_clrbit_r,    int_hexagon_S2_clrbit_r>;
1066 def: T_RR_pat<S2_togglebit_r, int_hexagon_S2_togglebit_r>;
1067
1068 // Test Bit
1069 def: T_RI_pat<S2_tstbit_i,    int_hexagon_S2_tstbit_i>;
1070 def: T_RR_pat<S2_tstbit_r,    int_hexagon_S2_tstbit_r>;
1071
1072 /********************************************************************
1073 *            STYPE/COMPLEX                                          *
1074 *********************************************************************/
1075 // Vector Complex conjugate
1076 def : T_P_pat <A2_vconj, int_hexagon_A2_vconj>;
1077
1078 // Vector Complex rotate
1079 def : T_PR_pat <S2_vcrotate, int_hexagon_S2_vcrotate>;
1080
1081 /********************************************************************
1082 *            STYPE/PERM                                             *
1083 *********************************************************************/
1084
1085 // Vector saturate without pack
1086 def : T_P_pat <S2_vsathb_nopack, int_hexagon_S2_vsathb_nopack>;
1087 def : T_P_pat <S2_vsathub_nopack, int_hexagon_S2_vsathub_nopack>;
1088 def : T_P_pat <S2_vsatwh_nopack, int_hexagon_S2_vsatwh_nopack>;
1089 def : T_P_pat <S2_vsatwuh_nopack, int_hexagon_S2_vsatwuh_nopack>;
1090
1091 /********************************************************************
1092 *            STYPE/PRED                                             *
1093 *********************************************************************/
1094
1095 // Predicate transfer
1096 def: Pat<(i32 (int_hexagon_C2_tfrpr (I32:$Rs))),
1097          (i32 (C2_tfrpr (C2_tfrrp (I32:$Rs))))>;
1098 def: Pat<(i32 (int_hexagon_C2_tfrrp (I32:$Rs))),
1099          (i32 (C2_tfrpr (C2_tfrrp (I32:$Rs))))>;
1100
1101 // Mask generate from predicate
1102 def: Pat<(i64 (int_hexagon_C2_mask (I32:$Rs))),
1103          (i64 (C2_mask (C2_tfrrp (I32:$Rs))))>;
1104
1105 // Viterbi pack even and odd predicate bits
1106 def: Pat<(i32 (int_hexagon_C2_vitpack (I32:$Rs), (I32:$Rt))),
1107          (i32 (C2_vitpack (C2_tfrrp (I32:$Rs)),
1108                           (C2_tfrrp (I32:$Rt))))>;
1109
1110 /********************************************************************
1111 *            STYPE/SHIFT                                            *
1112 *********************************************************************/
1113
1114 def : T_PI_pat <S2_asr_i_p, int_hexagon_S2_asr_i_p>;
1115 def : T_PI_pat <S2_lsr_i_p, int_hexagon_S2_lsr_i_p>;
1116 def : T_PI_pat <S2_asl_i_p, int_hexagon_S2_asl_i_p>;
1117
1118 def : T_PR_pat <S2_asr_r_p, int_hexagon_S2_asr_r_p>;
1119 def : T_PR_pat <S2_lsr_r_p, int_hexagon_S2_lsr_r_p>;
1120 def : T_PR_pat <S2_asl_r_p, int_hexagon_S2_asl_r_p>;
1121 def : T_PR_pat <S2_lsl_r_p, int_hexagon_S2_lsl_r_p>;
1122
1123 def : T_RR_pat <S2_asr_r_r, int_hexagon_S2_asr_r_r>;
1124 def : T_RR_pat <S2_lsr_r_r, int_hexagon_S2_lsr_r_r>;
1125 def : T_RR_pat <S2_asl_r_r, int_hexagon_S2_asl_r_r>;
1126 def : T_RR_pat <S2_lsl_r_r, int_hexagon_S2_lsl_r_r>;
1127
1128 def : T_RR_pat <S2_asr_r_r_sat, int_hexagon_S2_asr_r_r_sat>;
1129 def : T_RR_pat <S2_asl_r_r_sat, int_hexagon_S2_asl_r_r_sat>;
1130
1131 def : T_R_pat <S2_vsxtbh,   int_hexagon_S2_vsxtbh>;
1132 def : T_R_pat <S2_vzxtbh,   int_hexagon_S2_vzxtbh>;
1133 def : T_R_pat <S2_vsxthw,   int_hexagon_S2_vsxthw>;
1134 def : T_R_pat <S2_vzxthw,   int_hexagon_S2_vzxthw>;
1135 def : T_R_pat <S2_vsplatrh, int_hexagon_S2_vsplatrh>;
1136 def : T_R_pat <A2_sxtw,     int_hexagon_A2_sxtw>;
1137
1138 // Vector saturate and pack
1139 def : T_R_pat <S2_svsathb,  int_hexagon_S2_svsathb>;
1140 def : T_R_pat <S2_svsathub, int_hexagon_S2_svsathub>;
1141 def : T_P_pat <S2_vsathub,  int_hexagon_S2_vsathub>;
1142 def : T_P_pat <S2_vsatwh,   int_hexagon_S2_vsatwh>;
1143 def : T_P_pat <S2_vsatwuh,  int_hexagon_S2_vsatwuh>;
1144 def : T_P_pat <S2_vsathb,   int_hexagon_S2_vsathb>;
1145
1146 def : T_P_pat <S2_vtrunohb,    int_hexagon_S2_vtrunohb>;
1147 def : T_P_pat <S2_vtrunehb,    int_hexagon_S2_vtrunehb>;
1148 def : T_P_pat <S2_vrndpackwh,  int_hexagon_S2_vrndpackwh>;
1149 def : T_P_pat <S2_vrndpackwhs, int_hexagon_S2_vrndpackwhs>;
1150 def : T_R_pat <S2_brev,        int_hexagon_S2_brev>;
1151 def : T_R_pat <S2_vsplatrb,    int_hexagon_S2_vsplatrb>;
1152
1153 def : T_R_pat <A2_abs,    int_hexagon_A2_abs>;
1154 def : T_R_pat <A2_abssat, int_hexagon_A2_abssat>;
1155 def : T_R_pat <A2_negsat, int_hexagon_A2_negsat>;
1156
1157 def : T_R_pat <A2_swiz,   int_hexagon_A2_swiz>;
1158
1159 def : T_P_pat <A2_sat,    int_hexagon_A2_sat>;
1160 def : T_R_pat <A2_sath,   int_hexagon_A2_sath>;
1161 def : T_R_pat <A2_satuh,  int_hexagon_A2_satuh>;
1162 def : T_R_pat <A2_satub,  int_hexagon_A2_satub>;
1163 def : T_R_pat <A2_satb,   int_hexagon_A2_satb>;
1164
1165 // Vector arithmetic shift right by immediate with truncate and pack.
1166 def : T_PI_pat<S2_asr_i_svw_trun, int_hexagon_S2_asr_i_svw_trun>;
1167
1168 def : T_RI_pat <S2_asr_i_r,     int_hexagon_S2_asr_i_r>;
1169 def : T_RI_pat <S2_lsr_i_r,     int_hexagon_S2_lsr_i_r>;
1170 def : T_RI_pat <S2_asl_i_r,     int_hexagon_S2_asl_i_r>;
1171 def : T_RI_pat <S2_asr_i_r_rnd, int_hexagon_S2_asr_i_r_rnd>;
1172 def : T_RI_pat <S2_asr_i_r_rnd_goodsyntax,
1173                 int_hexagon_S2_asr_i_r_rnd_goodsyntax>;
1174
1175 // Shift left by immediate with saturation.
1176 def : T_RI_pat <S2_asl_i_r_sat, int_hexagon_S2_asl_i_r_sat>;
1177
1178 //===----------------------------------------------------------------------===//
1179 // Template 'def pat' to map tableidx[bhwd] intrinsics to :raw instructions.
1180 //===----------------------------------------------------------------------===//
1181 class S2op_tableidx_pat <Intrinsic IntID, InstHexagon OutputInst,
1182                          SDNodeXForm XformImm>
1183   : Pat <(IntID IntRegs:$src1, IntRegs:$src2, u4ImmPred:$src3, u5ImmPred:$src4),
1184          (OutputInst IntRegs:$src1, IntRegs:$src2, u4ImmPred:$src3,
1185                      (XformImm u5ImmPred:$src4))>;
1186
1187
1188 // Table Index : Extract and insert bits.
1189 // Map to the real hardware instructions after subtracting appropriate
1190 // values from the 4th input operand. Please note that subtraction is not
1191 // needed for int_hexagon_S2_tableidxb_goodsyntax.
1192
1193 def : Pat <(int_hexagon_S2_tableidxb_goodsyntax IntRegs:$src1, IntRegs:$src2,
1194                                               u4ImmPred:$src3, u5ImmPred:$src4),
1195            (S2_tableidxb IntRegs:$src1, IntRegs:$src2,
1196                          u4ImmPred:$src3, u5ImmPred:$src4)>;
1197
1198 def : S2op_tableidx_pat <int_hexagon_S2_tableidxh_goodsyntax, S2_tableidxh,
1199                          DEC_CONST_SIGNED>;
1200 def : S2op_tableidx_pat <int_hexagon_S2_tableidxw_goodsyntax, S2_tableidxw,
1201                          DEC2_CONST_SIGNED>;
1202 def : S2op_tableidx_pat <int_hexagon_S2_tableidxd_goodsyntax, S2_tableidxd,
1203                          DEC3_CONST_SIGNED>;
1204
1205 /********************************************************************
1206 *            STYPE/VH                                               *
1207 *********************************************************************/
1208
1209 // Vector absolute value halfwords with and without saturation
1210 // Rdd64=vabsh(Rss64)[:sat]
1211 def : T_P_pat <A2_vabsh, int_hexagon_A2_vabsh>;
1212 def : T_P_pat <A2_vabshsat, int_hexagon_A2_vabshsat>;
1213
1214 // Vector shift halfwords by immediate
1215 // Rdd64=[vaslh/vasrh/vlsrh](Rss64,u4)
1216 def : T_PI_pat <S2_asr_i_vh, int_hexagon_S2_asr_i_vh>;
1217 def : T_PI_pat <S2_lsr_i_vh, int_hexagon_S2_lsr_i_vh>;
1218 def : T_PI_pat <S2_asl_i_vh, int_hexagon_S2_asl_i_vh>;
1219
1220 // Vector shift halfwords by register
1221 // Rdd64=[vaslw/vasrw/vlslw/vlsrw](Rss64,Rt32)
1222 def : T_PR_pat <S2_asr_r_vh, int_hexagon_S2_asr_r_vh>;
1223 def : T_PR_pat <S2_lsr_r_vh, int_hexagon_S2_lsr_r_vh>;
1224 def : T_PR_pat <S2_asl_r_vh, int_hexagon_S2_asl_r_vh>;
1225 def : T_PR_pat <S2_lsl_r_vh, int_hexagon_S2_lsl_r_vh>;
1226
1227 /********************************************************************
1228 *            STYPE/VW                                               *
1229 *********************************************************************/
1230
1231 // Vector absolute value words with and without saturation
1232 def : T_P_pat <A2_vabsw, int_hexagon_A2_vabsw>;
1233 def : T_P_pat <A2_vabswsat, int_hexagon_A2_vabswsat>;
1234
1235 // Vector shift words by immediate.
1236 // Rdd64=[vasrw/vlsrw|vaslw](Rss64,u5)
1237 def : T_PI_pat <S2_asr_i_vw, int_hexagon_S2_asr_i_vw>;
1238 def : T_PI_pat <S2_lsr_i_vw, int_hexagon_S2_lsr_i_vw>;
1239 def : T_PI_pat <S2_asl_i_vw, int_hexagon_S2_asl_i_vw>;
1240
1241 // Vector shift words by register.
1242 // Rdd64=[vasrw/vlsrw|vaslw|vlslw](Rss64,Rt32)
1243 def : T_PR_pat <S2_asr_r_vw, int_hexagon_S2_asr_r_vw>;
1244 def : T_PR_pat <S2_lsr_r_vw, int_hexagon_S2_lsr_r_vw>;
1245 def : T_PR_pat <S2_asl_r_vw, int_hexagon_S2_asl_r_vw>;
1246 def : T_PR_pat <S2_lsl_r_vw, int_hexagon_S2_lsl_r_vw>;
1247
1248 // Vector shift words with truncate and pack
1249
1250 def : T_PR_pat <S2_asr_r_svw_trun, int_hexagon_S2_asr_r_svw_trun>;
1251
1252 def : T_R_pat<L2_loadw_locked, int_hexagon_L2_loadw_locked>;
1253 def : T_R_pat<L4_loadd_locked, int_hexagon_L4_loadd_locked>;
1254
1255 def: Pat<(i32 (int_hexagon_S2_storew_locked (I32:$Rs), (I32:$Rt))),
1256          (i32 (C2_tfrpr (S2_storew_locked (I32:$Rs), (I32:$Rt))))>;
1257 def: Pat<(i32 (int_hexagon_S4_stored_locked (I32:$Rs), (I64:$Rt))),
1258          (i32 (C2_tfrpr (S4_stored_locked (I32:$Rs), (I64:$Rt))))>;
1259
1260 /********************************************************************
1261 *            ST
1262 *********************************************************************/
1263
1264 class T_stb_pat <InstHexagon MI, Intrinsic IntID, PatLeaf Val>
1265   : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru),
1266         (MI I32:$Rs, Val:$Rt, I32:$Ru)>;
1267
1268 def : T_stb_pat <S2_storerh_pbr_pseudo, int_hexagon_brev_sth,   I32>;
1269 def : T_stb_pat <S2_storerb_pbr_pseudo, int_hexagon_brev_stb,   I32>;
1270 def : T_stb_pat <S2_storeri_pbr_pseudo, int_hexagon_brev_stw,   I32>;
1271 def : T_stb_pat <S2_storerf_pbr_pseudo, int_hexagon_brev_sthhi, I32>;
1272 def : T_stb_pat <S2_storerd_pbr_pseudo, int_hexagon_brev_std,   I64>;
1273
1274 class T_stc_pat <InstHexagon MI, Intrinsic IntID, PatLeaf Imm, PatLeaf Val>
1275   : Pat<(IntID I32:$Rs, Val:$Rt, I32:$Ru, Imm:$s),
1276         (MI I32:$Rs, Val:$Rt, I32:$Ru, Imm:$s)>;
1277
1278 def: T_stc_pat<S2_storerb_pci_pseudo, int_hexagon_circ_stb,   s4_0ImmPred, I32>;
1279 def: T_stc_pat<S2_storerh_pci_pseudo, int_hexagon_circ_sth,   s4_1ImmPred, I32>;
1280 def: T_stc_pat<S2_storeri_pci_pseudo, int_hexagon_circ_stw,   s4_2ImmPred, I32>;
1281 def: T_stc_pat<S2_storerd_pci_pseudo, int_hexagon_circ_std,   s4_3ImmPred, I64>;
1282 def: T_stc_pat<S2_storerf_pci_pseudo, int_hexagon_circ_sthhi, s4_1ImmPred, I32>;
1283
1284 include "HexagonIntrinsicsV3.td"
1285 include "HexagonIntrinsicsV4.td"
1286 include "HexagonIntrinsicsV5.td"