1234285Sdim//===-- HexagonIntrinsics.td - Instruction intrinsics ------*- tablegen -*-===//
2234285Sdim//
3234285Sdim//                     The LLVM Compiler Infrastructure
4234285Sdim//
5234285Sdim// This file is distributed under the University of Illinois Open Source
6234285Sdim// License. See LICENSE.TXT for details.
7234285Sdim//
8234285Sdim//===----------------------------------------------------------------------===//
9234285Sdim// This is populated based on the following specs:
10234285Sdim// Hexagon V2 Architecture
11234285Sdim// Application-Level Specification
12234285Sdim// 80-V9418-8 Rev. B
13234285Sdim// March 4, 2008
14234285Sdim//===----------------------------------------------------------------------===//
15234285Sdim
16234285Sdim//
17234285Sdim// ALU 32 types.
18234285Sdim//
19234285Sdim
20234285Sdimclass qi_ALU32_sisi<string opc, Intrinsic IntID>
21234285Sdim  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
22234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
23234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
24234285Sdim
25234285Sdimclass qi_ALU32_sis10<string opc, Intrinsic IntID>
26234285Sdim  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
27234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
28234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
29234285Sdim
30234285Sdimclass qi_ALU32_sis8<string opc, Intrinsic IntID>
31234285Sdim  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2),
32234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
33234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
34234285Sdim
35234285Sdimclass qi_ALU32_siu8<string opc, Intrinsic IntID>
36234285Sdim  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u8Imm:$src2),
37234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
38234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
39234285Sdim
40234285Sdimclass qi_ALU32_siu9<string opc, Intrinsic IntID>
41234285Sdim  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u9Imm:$src2),
42234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
43234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
44234285Sdim
45234285Sdimclass si_ALU32_qisisi<string opc, Intrinsic IntID>
46234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
47234285Sdim                                      IntRegs:$src3),
48234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
49234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
50234285Sdim                                        IntRegs:$src3))]>;
51234285Sdim
52234285Sdimclass si_ALU32_qis8si<string opc, Intrinsic IntID>
53234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2,
54234285Sdim                                       IntRegs:$src3),
55234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, $src3)")),
56234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2,
57234285Sdim                                        IntRegs:$src3))]>;
58234285Sdim
59234285Sdimclass si_ALU32_qisis8<string opc, Intrinsic IntID>
60234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
61234285Sdim                                       s8Imm:$src3),
62234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
63234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
64234285Sdim                                        imm:$src3))]>;
65234285Sdim
66234285Sdimclass si_ALU32_qis8s8<string opc, Intrinsic IntID>
67234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2, s8Imm:$src3),
68234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
69234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;
70234285Sdim
71234285Sdimclass si_ALU32_sisi<string opc, Intrinsic IntID>
72234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
73234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
74234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
75234285Sdim
76234285Sdimclass si_ALU32_sisi_sat<string opc, Intrinsic IntID>
77234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
78234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
79234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
80234285Sdim
81234285Sdimclass si_ALU32_sisi_rnd<string opc, Intrinsic IntID>
82234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
83234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
84234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
85234285Sdim
86234285Sdimclass si_ALU32_sis16<string opc, Intrinsic IntID>
87234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s16Imm:$src2),
88234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
89234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
90234285Sdim
91234285Sdimclass si_ALU32_sis10<string opc, Intrinsic IntID>
92234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
93234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
94234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
95234285Sdim
96234285Sdimclass si_ALU32_s10si<string opc, Intrinsic IntID>
97234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins s10Imm:$src1, IntRegs:$src2),
98234285Sdim             !strconcat("$dst = ", !strconcat(opc , "(#$src1, $src2)")),
99234285Sdim             [(set IntRegs:$dst, (IntID imm:$src1, IntRegs:$src2))]>;
100234285Sdim
101234285Sdimclass si_lo_ALU32_siu16<string opc, Intrinsic IntID>
102234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
103234285Sdim             !strconcat("$dst.l = ", !strconcat(opc , "#$src2")),
104234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
105234285Sdim
106234285Sdimclass si_hi_ALU32_siu16<string opc, Intrinsic IntID>
107234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
108234285Sdim             !strconcat("$dst.h = ", !strconcat(opc , "#$src2")),
109234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
110234285Sdim
111234285Sdimclass si_ALU32_s16<string opc, Intrinsic IntID>
112234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins s16Imm:$src1),
113234285Sdim             !strconcat("$dst = ", !strconcat(opc , "#$src1")),
114234285Sdim             [(set IntRegs:$dst, (IntID imm:$src1))]>;
115234285Sdim
116234285Sdimclass di_ALU32_s8<string opc, Intrinsic IntID>
117234285Sdim  : ALU32_rr<(outs DoubleRegs:$dst), (ins s8Imm:$src1),
118234285Sdim             !strconcat("$dst = ", !strconcat(opc , "#$src1")),
119234285Sdim             [(set DoubleRegs:$dst, (IntID imm:$src1))]>;
120234285Sdim
121234285Sdimclass di_ALU64_di<string opc, Intrinsic IntID>
122234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
123234285Sdim             !strconcat("$dst = ", !strconcat(opc , "$src")),
124234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
125234285Sdim
126234285Sdimclass si_ALU32_si<string opc, Intrinsic IntID>
127234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
128234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src)")),
129234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
130234285Sdim
131234285Sdimclass si_ALU32_si_tfr<string opc, Intrinsic IntID>
132234285Sdim  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
133234285Sdim             !strconcat("$dst = ", !strconcat(opc , "$src")),
134234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
135234285Sdim
136234285Sdim//
137234285Sdim// ALU 64 types.
138234285Sdim//
139234285Sdim
140234285Sdimclass si_ALU64_si_sat<string opc, Intrinsic IntID>
141234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
142234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
143234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
144234285Sdim
145234285Sdimclass si_ALU64_didi<string opc, Intrinsic IntID>
146234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
147234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
148234285Sdim             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
149234285Sdim
150234285Sdimclass di_ALU64_sidi<string opc, Intrinsic IntID>
151234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
152234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
153234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;
154234285Sdim
155234285Sdimclass di_ALU64_didi<string opc, Intrinsic IntID>
156234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
157234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
158234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
159234285Sdim                                           DoubleRegs:$src2))]>;
160234285Sdim
161234285Sdimclass di_ALU64_qididi<string opc, Intrinsic IntID>
162234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2,
163234285Sdim                                          DoubleRegs:$src3),
164234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
165234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2,
166234285Sdim                                           DoubleRegs:$src3))]>;
167234285Sdim
168234285Sdimclass di_ALU64_sisi<string opc, Intrinsic IntID>
169234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
170234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
171234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
172234285Sdim
173234285Sdimclass di_ALU64_didi_sat<string opc, Intrinsic IntID>
174234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
175234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
176234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
177234285Sdim                                           DoubleRegs:$src2))]>;
178234285Sdim
179234285Sdimclass di_ALU64_didi_rnd<string opc, Intrinsic IntID>
180234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
181234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
182234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
183234285Sdim                                           DoubleRegs:$src2))]>;
184234285Sdim
185234285Sdimclass di_ALU64_didi_crnd<string opc, Intrinsic IntID>
186234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
187234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd")),
188234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
189234285Sdim                                           DoubleRegs:$src2))]>;
190234285Sdim
191234285Sdimclass di_ALU64_didi_rnd_sat<string opc, Intrinsic IntID>
192234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
193234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
194234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
195234285Sdim                                           DoubleRegs:$src2))]>;
196234285Sdim
197234285Sdimclass di_ALU64_didi_crnd_sat<string opc, Intrinsic IntID>
198234285Sdim  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
199234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd:sat")),
200234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
201234285Sdim                                           DoubleRegs:$src2))]>;
202234285Sdim
203234285Sdimclass qi_ALU64_didi<string opc, Intrinsic IntID>
204234285Sdim  : ALU64_rr<(outs PredRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
205234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
206234285Sdim             [(set PredRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
207234285Sdim
208234285Sdimclass si_ALU64_sisi<string opc, Intrinsic IntID>
209234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
210234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
211234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
212234285Sdim
213234285Sdimclass si_ALU64_sisi_sat_lh<string opc, Intrinsic IntID>
214234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
215234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
216234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
217234285Sdim
218234285Sdimclass si_ALU64_sisi_l16_sat_hh<string opc, Intrinsic IntID>
219234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
220234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
221234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
222234285Sdim
223234285Sdimclass si_ALU64_sisi_l16_sat_lh<string opc, Intrinsic IntID>
224234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
225234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
226234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
227234285Sdim
228234285Sdimclass si_ALU64_sisi_l16_sat_hl<string opc, Intrinsic IntID>
229234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
230234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
231234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
232234285Sdim
233234285Sdimclass si_ALU64_sisi_l16_sat_ll<string opc, Intrinsic IntID>
234234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
235234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
236234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
237234285Sdim
238234285Sdimclass si_ALU64_sisi_l16_hh<string opc, Intrinsic IntID>
239234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
240234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
241234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
242234285Sdim
243234285Sdimclass si_ALU64_sisi_l16_hl<string opc, Intrinsic IntID>
244234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
245234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
246234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
247234285Sdim
248234285Sdimclass si_ALU64_sisi_l16_lh<string opc, Intrinsic IntID>
249234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
250234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
251234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
252234285Sdim
253234285Sdimclass si_ALU64_sisi_l16_ll<string opc, Intrinsic IntID>
254234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
255234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
256234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
257234285Sdim
258234285Sdimclass si_ALU64_sisi_h16_sat_hh<string opc, Intrinsic IntID>
259234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
260234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
261234285Sdim                                              "($src1.H, $src2.H):sat:<<16")),
262234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
263234285Sdim
264234285Sdimclass si_ALU64_sisi_h16_sat_lh<string opc, Intrinsic IntID>
265234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
266234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
267234285Sdim                                              "($src1.L, $src2.H):sat:<<16")),
268234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
269234285Sdim
270234285Sdimclass si_ALU64_sisi_h16_sat_hl<string opc, Intrinsic IntID>
271234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
272234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
273234285Sdim                                              "($src1.H, $src2.L):sat:<<16")),
274234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
275234285Sdim
276234285Sdimclass si_ALU64_sisi_h16_sat_ll<string opc, Intrinsic IntID>
277234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
278234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
279234285Sdim                                              "($src1.L, $src2.L):sat:<<16")),
280234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
281234285Sdim
282234285Sdimclass si_ALU64_sisi_h16_hh<string opc, Intrinsic IntID>
283234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
284234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<16")),
285234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
286234285Sdim
287234285Sdimclass si_ALU64_sisi_h16_hl<string opc, Intrinsic IntID>
288234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
289234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<16")),
290234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
291234285Sdim
292234285Sdimclass si_ALU64_sisi_h16_lh<string opc, Intrinsic IntID>
293234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
294234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<16")),
295234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
296234285Sdim
297234285Sdimclass si_ALU64_sisi_h16_ll<string opc, Intrinsic IntID>
298234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
299234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<16")),
300234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
301234285Sdim
302234285Sdimclass si_ALU64_sisi_lh<string opc, Intrinsic IntID>
303234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
304234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
305234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
306234285Sdim
307234285Sdimclass si_ALU64_sisi_ll<string opc, Intrinsic IntID>
308234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
309234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
310234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
311234285Sdim
312234285Sdimclass si_ALU64_sisi_sat<string opc, Intrinsic IntID>
313234285Sdim  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
314234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
315234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
316234285Sdim
317234285Sdim//
318234285Sdim// SInst classes.
319234285Sdim//
320234285Sdim
321234285Sdimclass qi_SInst_qi<string opc, Intrinsic IntID>
322234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
323234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src)")),
324234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
325234285Sdim
326234285Sdimclass qi_SInst_qi_pxfer<string opc, Intrinsic IntID>
327234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
328234285Sdim             !strconcat("$dst = ", !strconcat(opc , "$src")),
329234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
330234285Sdim
331234285Sdimclass qi_SInst_qiqi<string opc, Intrinsic IntID>
332234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
333234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
334234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
335234285Sdim
336234285Sdimclass qi_SInst_qiqi_neg<string opc, Intrinsic IntID>
337234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
338234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, !$src2)")),
339234285Sdim             [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
340234285Sdim
341234285Sdimclass di_SInst_di<string opc, Intrinsic IntID>
342234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
343234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src)")),
344234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
345234285Sdim
346234285Sdimclass di_SInst_di_sat<string opc, Intrinsic IntID>
347234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
348234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
349234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
350234285Sdim
351234285Sdimclass si_SInst_di<string opc, Intrinsic IntID>
352234285Sdim  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
353234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src)")),
354234285Sdim          [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;
355234285Sdim
356234285Sdimclass si_SInst_di_sat<string opc, Intrinsic IntID>
357234285Sdim  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
358234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
359234285Sdim          [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;
360234285Sdim
361234285Sdimclass di_SInst_disi<string opc, Intrinsic IntID>
362234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
363234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
364234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
365234285Sdim
366234285Sdimclass di_SInst_didi<string opc, Intrinsic IntID>
367234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
368234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
369234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
370234285Sdim
371234285Sdimclass di_SInst_si<string opc, Intrinsic IntID>
372234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1),
373234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1)")),
374234285Sdim          [(set DoubleRegs:$dst, (IntID IntRegs:$src1))]>;
375234285Sdim
376234285Sdimclass si_SInst_sisiu3<string opc, Intrinsic IntID>
377234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u3Imm:$src3),
378234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
379234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
380234285Sdim                                     imm:$src3))]>;
381234285Sdim
382234285Sdimclass si_SInst_diu5<string opc, Intrinsic IntID>
383234285Sdim  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, u5Imm:$src2),
384234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
385234285Sdim          [(set IntRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;
386234285Sdim
387234285Sdimclass si_SInst_disi<string opc, Intrinsic IntID>
388234285Sdim  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
389234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
390234285Sdim          [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
391234285Sdim
392234285Sdimclass si_SInst_sidi<string opc, Intrinsic IntID>
393234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
394234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
395234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;
396234285Sdim
397234285Sdimclass di_SInst_disisi<string opc, Intrinsic IntID>
398234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2,
399234285Sdim                                       IntRegs:$src3),
400234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
401234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2,
402234285Sdim                                        IntRegs:$src3))]>;
403234285Sdim
404234285Sdimclass di_SInst_sisi<string opc, Intrinsic IntID>
405234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
406234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
407234285Sdim          [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
408234285Sdim
409234285Sdimclass qi_SInst_siu5<string opc, Intrinsic IntID>
410234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
411234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
412234285Sdim          [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
413234285Sdim
414234285Sdimclass qi_SInst_siu6<string opc, Intrinsic IntID>
415234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u6Imm:$src2),
416234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
417234285Sdim          [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
418234285Sdim
419234285Sdimclass qi_SInst_sisi<string opc, Intrinsic IntID>
420234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
421234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
422234285Sdim          [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
423234285Sdim
424234285Sdimclass si_SInst_si<string opc, Intrinsic IntID>
425234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
426234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src)")),
427234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
428234285Sdim
429234285Sdimclass si_SInst_si_sat<string opc, Intrinsic IntID>
430234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
431234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
432234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
433234285Sdim
434234285Sdimclass di_SInst_qi<string opc, Intrinsic IntID>
435234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src),
436234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src)")),
437234285Sdim          [(set DoubleRegs:$dst, (IntID IntRegs:$src))]>;
438234285Sdim
439234285Sdimclass si_SInst_qi<string opc, Intrinsic IntID>
440234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
441234285Sdim          !strconcat("$dst = ", !strconcat(opc , "$src")),
442234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
443234285Sdim
444234285Sdimclass si_SInst_qiqi<string opc, Intrinsic IntID>
445234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
446234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
447234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
448234285Sdim
449234285Sdimclass qi_SInst_si<string opc, Intrinsic IntID>
450234285Sdim  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
451234285Sdim          !strconcat("$dst = ", !strconcat(opc , "$src")),
452234285Sdim          [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
453234285Sdim
454234285Sdimclass si_SInst_sisi<string opc, Intrinsic IntID>
455234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
456234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
457234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
458234285Sdim
459234285Sdimclass di_SInst_diu6<string opc, Intrinsic IntID>
460234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2),
461234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
462234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;
463234285Sdim
464234285Sdimclass si_SInst_siu5<string opc, Intrinsic IntID>
465234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
466234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
467234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
468234285Sdim
469234285Sdimclass si_SInst_siu5_rnd<string opc, Intrinsic IntID>
470234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
471234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2):rnd")),
472234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
473234285Sdim
474234285Sdimclass si_SInst_siu5u5<string opc, Intrinsic IntID>
475234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2, u5Imm:$src3),
476234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
477234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;
478234285Sdim
479234285Sdimclass si_SInst_sisisi_acc<string opc, Intrinsic IntID>
480234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
481234285Sdim                                        IntRegs:$src2),
482234285Sdim              !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
483234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
484234285Sdim                                         IntRegs:$src2))],
485234285Sdim              "$dst2 = $dst">;
486234285Sdim
487234285Sdimclass si_SInst_sisisi_nac<string opc, Intrinsic IntID>
488234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
489234285Sdim                                        IntRegs:$src2),
490234285Sdim              !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
491234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
492234285Sdim                                         IntRegs:$src2))],
493234285Sdim              "$dst2 = $dst">;
494234285Sdim
495234285Sdimclass di_SInst_didisi_acc<string opc, Intrinsic IntID>
496234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
497234285Sdim                                           IntRegs:$src2),
498234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
499234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
500234285Sdim                                             DoubleRegs:$src1,
501234285Sdim                                             IntRegs:$src2))],
502234285Sdim               "$dst2 = $dst">;
503234285Sdim
504234285Sdimclass di_SInst_didisi_nac<string opc, Intrinsic IntID>
505234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
506234285Sdim                                           IntRegs:$src2),
507234285Sdim          !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
508234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
509234285Sdim                                        DoubleRegs:$src1, IntRegs:$src2))],
510234285Sdim          "$dst2 = $dst">;
511234285Sdim
512234285Sdimclass si_SInst_sisiu5u5<string opc, Intrinsic IntID>
513234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
514234285Sdim                                        u5Imm:$src2, u5Imm:$src3),
515234285Sdim              !strconcat("$dst = ", !strconcat(opc ,
516234285Sdim                                               "($src1, #$src2, #$src3)")),
517234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
518234285Sdim                                         imm:$src2, imm:$src3))],
519234285Sdim              "$dst2 = $dst">;
520234285Sdim
521234285Sdimclass si_SInst_sisidi<string opc, Intrinsic IntID>
522234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
523234285Sdim                                        DoubleRegs:$src2),
524234285Sdim              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
525234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
526234285Sdim                                         DoubleRegs:$src2))],
527234285Sdim              "$dst2 = $dst">;
528234285Sdim
529234285Sdimclass di_SInst_didiu6u6<string opc, Intrinsic IntID>
530234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
531234285Sdim                                           u6Imm:$src2, u6Imm:$src3),
532234285Sdim              !strconcat("$dst = ", !strconcat(opc ,
533234285Sdim                                               "($src1, #$src2, #$src3)")),
534234285Sdim              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
535234285Sdim                                            imm:$src2, imm:$src3))],
536234285Sdim              "$dst2 = $dst">;
537234285Sdim
538234285Sdimclass di_SInst_dididi<string opc, Intrinsic IntID>
539234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
540234285Sdim                                           DoubleRegs:$src2),
541234285Sdim              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
542234285Sdim              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
543234285Sdim                                            DoubleRegs:$src1,
544234285Sdim                                            DoubleRegs:$src2))],
545234285Sdim              "$dst2 = $dst">;
546234285Sdim
547234285Sdimclass di_SInst_diu6u6<string opc, Intrinsic IntID>
548234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2,
549234285Sdim                                       u6Imm:$src3),
550234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
551234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2,
552234285Sdim                                        imm:$src3))]>;
553234285Sdim
554234285Sdimclass di_SInst_didiqi<string opc, Intrinsic IntID>
555234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
556234285Sdim                                       IntRegs:$src3),
557234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
558234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
559234285Sdim                                        IntRegs:$src3))]>;
560234285Sdim
561234285Sdimclass di_SInst_didiu3<string opc, Intrinsic IntID>
562234285Sdim  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
563234285Sdim                                       u3Imm:$src3),
564234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
565234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
566234285Sdim                                        imm:$src3))]>;
567234285Sdim
568234285Sdimclass di_SInst_didisi_or<string opc, Intrinsic IntID>
569234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
570234285Sdim                                           IntRegs:$src2),
571234285Sdim          !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
572234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
573234285Sdim                                        IntRegs:$src2))],
574234285Sdim          "$dst2 = $dst">;
575234285Sdim
576234285Sdimclass di_SInst_didisi_and<string opc, Intrinsic IntID>
577234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
578234285Sdim                                           IntRegs:$src2),
579234285Sdim          !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
580234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
581234285Sdim                                        IntRegs:$src2))],
582234285Sdim          "$dst2 = $dst">;
583234285Sdim
584234285Sdimclass di_SInst_didiu6_and<string opc, Intrinsic IntID>
585234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
586234285Sdim                                           u6Imm:$src2),
587234285Sdim          !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
588234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
589234285Sdim                                        imm:$src2))],
590234285Sdim          "$dst2 = $dst">;
591234285Sdim
592234285Sdimclass di_SInst_didiu6_or<string opc, Intrinsic IntID>
593234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
594234285Sdim                                           u6Imm:$src2),
595234285Sdim          !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
596234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
597234285Sdim                                        imm:$src2))],
598234285Sdim          "$dst2 = $dst">;
599234285Sdim
600234285Sdimclass di_SInst_didiu6_xor<string opc, Intrinsic IntID>
601234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
602234285Sdim                                           u6Imm:$src2),
603234285Sdim          !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
604234285Sdim          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
605234285Sdim                                        imm:$src2))],
606234285Sdim          "$dst2 = $dst">;
607234285Sdim
608234285Sdimclass si_SInst_sisisi_and<string opc, Intrinsic IntID>
609234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
610234285Sdim                                        IntRegs:$src2),
611234285Sdim              !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
612234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
613234285Sdim                                         IntRegs:$src2))],
614234285Sdim              "$dst2 = $dst">;
615234285Sdim
616234285Sdimclass si_SInst_sisisi_or<string opc, Intrinsic IntID>
617234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
618234285Sdim                                        IntRegs:$src2),
619234285Sdim              !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
620234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
621234285Sdim                                         IntRegs:$src2))],
622234285Sdim              "$dst2 = $dst">;
623234285Sdim
624234285Sdim
625234285Sdimclass si_SInst_sisiu5_and<string opc, Intrinsic IntID>
626234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
627234285Sdim                                        u5Imm:$src2),
628234285Sdim              !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
629234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
630234285Sdim                                         imm:$src2))],
631234285Sdim              "$dst2 = $dst">;
632234285Sdim
633234285Sdimclass si_SInst_sisiu5_or<string opc, Intrinsic IntID>
634234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
635234285Sdim                                        u5Imm:$src2),
636234285Sdim              !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
637234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
638234285Sdim                                         imm:$src2))],
639234285Sdim              "$dst2 = $dst">;
640234285Sdim
641234285Sdimclass si_SInst_sisiu5_xor<string opc, Intrinsic IntID>
642234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
643234285Sdim                                        u5Imm:$src2),
644234285Sdim              !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
645234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
646234285Sdim                                         imm:$src2))],
647234285Sdim              "$dst2 = $dst">;
648234285Sdim
649234285Sdimclass si_SInst_sisiu5_acc<string opc, Intrinsic IntID>
650234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
651234285Sdim                                        u5Imm:$src2),
652234285Sdim              !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
653234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
654234285Sdim                                         imm:$src2))],
655234285Sdim              "$dst2 = $dst">;
656234285Sdim
657234285Sdimclass si_SInst_sisiu5_nac<string opc, Intrinsic IntID>
658234285Sdim  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
659234285Sdim                                        u5Imm:$src2),
660234285Sdim              !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
661234285Sdim              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
662234285Sdim                                         imm:$src2))],
663234285Sdim              "$dst2 = $dst">;
664234285Sdim
665234285Sdimclass di_SInst_didiu6_acc<string opc, Intrinsic IntID>
666234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
667234285Sdim                                           u5Imm:$src2),
668234285Sdim              !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
669234285Sdim              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
670234285Sdim                                            DoubleRegs:$src1, imm:$src2))],
671234285Sdim              "$dst2 = $dst">;
672234285Sdim
673234285Sdimclass di_SInst_didiu6_nac<string opc, Intrinsic IntID>
674234285Sdim  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
675234285Sdim                                           u5Imm:$src2),
676234285Sdim              !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
677234285Sdim              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
678234285Sdim                                            imm:$src2))],
679234285Sdim              "$dst2 = $dst">;
680234285Sdim
681234285Sdim
682234285Sdim//
683234285Sdim// MInst classes.
684234285Sdim//
685234285Sdim
686234285Sdimclass di_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
687234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
688234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
689234285Sdim                                                "($src1.H, $src2.H):<<1:rnd")),
690234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
691234285Sdim
692234285Sdimclass di_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
693234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
694234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
695234285Sdim                                                "($src1.H, $src2.H):rnd")),
696234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
697234285Sdim
698234285Sdimclass di_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
699234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
700234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
701234285Sdim                                                "($src1.H, $src2.L):<<1:rnd")),
702234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
703234285Sdim
704234285Sdimclass di_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
705234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
706234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
707234285Sdim                                                "($src1.H, $src2.L):rnd")),
708234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
709234285Sdim
710234285Sdimclass di_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
711234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
712234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
713234285Sdim                                                "($src1.L, $src2.H):<<1:rnd")),
714234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
715234285Sdim
716234285Sdimclass di_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
717234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
718234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
719234285Sdim                                                "($src1.L, $src2.H):rnd")),
720234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
721234285Sdim
722234285Sdimclass di_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
723234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
724234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
725234285Sdim                                                "($src1.L, $src2.L):<<1:rnd")),
726234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
727234285Sdim
728234285Sdimclass di_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
729234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
730234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
731234285Sdim                                                "($src1.L, $src2.L):rnd")),
732234285Sdim               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
733234285Sdim
734234285Sdimclass di_MInst_disisi_acc<string opc, Intrinsic IntID>
735234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
736234285Sdim                                           IntRegs:$src2),
737234285Sdim             !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
738234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
739234285Sdim                                           IntRegs:$src2))],
740234285Sdim             "$dst2 = $dst">;
741234285Sdim
742234285Sdimclass di_MInst_disisi_nac<string opc, Intrinsic IntID>
743234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
744234285Sdim                                           IntRegs:$src2),
745234285Sdim             !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
746234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
747234285Sdim                                           IntRegs:$src2))],
748234285Sdim             "$dst2 = $dst">;
749234285Sdim
750234285Sdimclass di_MInst_disisi_acc_sat<string opc, Intrinsic IntID>
751234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
752234285Sdim                                           IntRegs:$src2),
753234285Sdim             !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
754234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
755234285Sdim                                           IntRegs:$src2))],
756234285Sdim             "$dst2 = $dst">;
757234285Sdim
758234285Sdimclass di_MInst_disisi_nac_sat<string opc, Intrinsic IntID>
759234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
760234285Sdim                                           IntRegs:$src2),
761234285Sdim             !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2):sat")),
762234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
763234285Sdim                                           IntRegs:$src2))],
764234285Sdim             "$dst2 = $dst">;
765234285Sdim
766234285Sdimclass di_MInst_disisi_acc_sat_conj<string opc, Intrinsic IntID>
767234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
768234285Sdim                                           IntRegs:$src2),
769234285Sdim             !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*):sat")),
770234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
771234285Sdim                                           IntRegs:$src2))],
772234285Sdim             "$dst2 = $dst">;
773234285Sdim
774234285Sdimclass di_MInst_disisi_nac_sat_conj<string opc, Intrinsic IntID>
775234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
776234285Sdim                                           IntRegs:$src2),
777234285Sdim             !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2*):sat")),
778234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
779234285Sdim                                           IntRegs:$src2))],
780234285Sdim             "$dst2 = $dst">;
781234285Sdim
782234285Sdimclass di_MInst_disisi_nac_s1_sat<string opc, Intrinsic IntID>
783234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
784234285Sdim                                           IntRegs:$src2),
785234285Sdim             !strconcat("$dst -= ", !strconcat(opc ,
786234285Sdim                                               "($src1, $src2):<<1:sat")),
787234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
788234285Sdim                                           IntRegs:$src2))],
789234285Sdim             "$dst2 = $dst">;
790234285Sdim
791234285Sdimclass di_MInst_disisi_acc_s1_sat_conj<string opc, Intrinsic IntID>
792234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
793234285Sdim                                           IntRegs:$src2),
794234285Sdim             !strconcat("$dst += ", !strconcat(opc ,
795234285Sdim                                               "($src1, $src2*):<<1:sat")),
796234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
797234285Sdim                                           IntRegs:$src2))],
798234285Sdim             "$dst2 = $dst">;
799234285Sdim
800234285Sdimclass di_MInst_disisi_nac_s1_sat_conj<string opc, Intrinsic IntID>
801234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
802234285Sdim                                           IntRegs:$src2),
803234285Sdim             !strconcat("$dst -= ", !strconcat(opc ,
804234285Sdim                                               "($src1, $src2*):<<1:sat")),
805234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
806234285Sdim                                           IntRegs:$src2))],
807234285Sdim             "$dst2 = $dst">;
808234285Sdim
809234285Sdimclass di_MInst_s8s8<string opc, Intrinsic IntID>
810234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins s8Imm:$src1, s8Imm:$src2),
811234285Sdim             !strconcat("$dst = ", !strconcat(opc , "(#$src1, #$src2)")),
812234285Sdim             [(set DoubleRegs:$dst, (IntID imm:$src1, imm:$src2))]>;
813234285Sdim
814245431Sdimclass si_MInst_sis9<string opc, Intrinsic IntID>
815245431Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s9Imm:$src2),
816245431Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
817245431Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
818245431Sdim
819234285Sdimclass si_MInst_sisi<string opc, Intrinsic IntID>
820234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
821234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
822234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
823234285Sdim
824234285Sdimclass di_MInst_sisi_hh<string opc, Intrinsic IntID>
825234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
826234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
827234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
828234285Sdim
829234285Sdimclass di_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
830234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
831234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
832234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
833234285Sdim
834234285Sdimclass di_MInst_sisi_lh<string opc, Intrinsic IntID>
835234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
836234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
837234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
838234285Sdim
839234285Sdimclass di_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
840234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
841234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
842234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
843234285Sdim
844234285Sdimclass di_MInst_sisi_hl<string opc, Intrinsic IntID>
845234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
846234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
847234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
848234285Sdim
849234285Sdimclass di_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
850234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
851234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
852234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
853234285Sdim
854234285Sdimclass di_MInst_sisi_ll<string opc, Intrinsic IntID>
855234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
856234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
857234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
858234285Sdim
859234285Sdimclass di_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
860234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
861234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
862234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
863234285Sdim
864234285Sdim
865234285Sdimclass si_MInst_sisi_hh<string opc, Intrinsic IntID>
866234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
867234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
868234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
869234285Sdim
870234285Sdimclass si_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
871234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
872234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
873234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
874234285Sdim
875234285Sdimclass si_MInst_sisi_lh<string opc, Intrinsic IntID>
876234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
877234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
878234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
879234285Sdim
880234285Sdimclass si_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
881234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
882234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
883234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
884234285Sdim
885234285Sdimclass si_MInst_sisi_hl<string opc, Intrinsic IntID>
886234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
887234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
888234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
889234285Sdim
890234285Sdimclass si_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
891234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
892234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
893234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
894234285Sdim
895234285Sdimclass si_MInst_sisi_ll<string opc, Intrinsic IntID>
896234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
897234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
898234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
899234285Sdim
900234285Sdimclass si_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
901234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
902234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
903234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
904234285Sdim
905234285Sdimclass si_MInst_sisi_up<string opc, Intrinsic IntID>
906234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
907234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
908234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
909234285Sdim
910234285Sdimclass di_MInst_didi<string opc, Intrinsic IntID>
911234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
912234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
913234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
914234285Sdim                                           DoubleRegs:$src2))]>;
915234285Sdim
916234285Sdimclass di_MInst_didi_conj<string opc, Intrinsic IntID>
917234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
918234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*)")),
919234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
920234285Sdim                                           DoubleRegs:$src2))]>;
921234285Sdim
922234285Sdimclass di_MInst_sisi_s1_sat_conj<string opc, Intrinsic IntID>
923234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
924234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
925234285Sdim                                              "($src1, $src2*):<<1:sat")),
926234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
927234285Sdim
928234285Sdimclass di_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
929234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
930234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
931234285Sdim                                              "($src1, $src2):<<1:rnd:sat")),
932234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
933234285Sdim                                           DoubleRegs:$src2))]>;
934234285Sdim
935234285Sdimclass di_MInst_didi_sat<string opc, Intrinsic IntID>
936234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
937234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
938234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
939234285Sdim                                           DoubleRegs:$src2))]>;
940234285Sdim
941234285Sdimclass di_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
942234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
943234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
944234285Sdim                                              "($src1, $src2):rnd:sat")),
945234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
946234285Sdim                                           DoubleRegs:$src2))]>;
947234285Sdim
948234285Sdimclass si_SInst_sisi_sat<string opc, Intrinsic IntID>
949234285Sdim  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
950234285Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
951234285Sdim          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
952234285Sdim
953245431Sdimclass si_SInst_didi_sat<string opc, Intrinsic IntID>
954245431Sdim  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
955245431Sdim          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
956245431Sdim          [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
957245431Sdim
958245431Sdimclass si_SInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
959245431Sdim  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
960245431Sdim             !strconcat("$dst = ", !strconcat(opc ,
961245431Sdim                                              "($src1, $src2):<<1:rnd:sat")),
962245431Sdim             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
963245431Sdim
964234285Sdimclass si_MInst_sisi_s1_rnd_sat<string opc, Intrinsic IntID>
965234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
966234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
967234285Sdim                                              "($src1, $src2):<<1:rnd:sat")),
968234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
969234285Sdim
970234285Sdimclass si_MInst_sisi_l_s1_rnd_sat<string opc, Intrinsic IntID>
971234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
972234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
973234285Sdim                                              "($src1, $src2.L):<<1:rnd:sat")),
974234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
975234285Sdim
976234285Sdimclass si_MInst_sisi_h_s1_rnd_sat<string opc, Intrinsic IntID>
977234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
978234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
979234285Sdim                                              "($src1, $src2.H):<<1:rnd:sat")),
980234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
981234285Sdim
982234285Sdimclass si_MInst_sisi_rnd_sat_conj<string opc, Intrinsic IntID>
983234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
984234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
985234285Sdim                                              "($src1, $src2*):rnd:sat")),
986234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
987234285Sdim
988234285Sdimclass si_MInst_sisi_s1_rnd_sat_conj<string opc, Intrinsic IntID>
989234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
990234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
991234285Sdim                                              "($src1, $src2*):<<1:rnd:sat")),
992234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
993234285Sdim
994234285Sdimclass si_MInst_sisi_rnd_sat<string opc, Intrinsic IntID>
995234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
996234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
997234285Sdim                                              "($src1, $src2):rnd:sat")),
998234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
999234285Sdim
1000234285Sdimclass si_MInst_sisi_rnd<string opc, Intrinsic IntID>
1001234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1002234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
1003234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1004234285Sdim
1005234285Sdimclass si_MInst_sisisi_xacc<string opc, Intrinsic IntID>
1006234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1007234285Sdim                                        IntRegs:$src3),
1008234285Sdim             !strconcat("$dst ^= ", !strconcat(opc , "($src2, $src3)")),
1009234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1010234285Sdim                                        IntRegs:$src3))],
1011234285Sdim             "$dst2 = $dst">;
1012234285Sdim
1013234285Sdimclass si_MInst_sisisi_acc<string opc, Intrinsic IntID>
1014234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1015234285Sdim                                        IntRegs:$src3),
1016234285Sdim             !strconcat("$dst += ", !strconcat(opc , "($src2, $src3)")),
1017234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1018234285Sdim                                        IntRegs:$src3))],
1019234285Sdim             "$dst2 = $dst">;
1020234285Sdim
1021234285Sdimclass si_MInst_sisisi_nac<string opc, Intrinsic IntID>
1022234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1023234285Sdim                                        IntRegs:$src3),
1024234285Sdim             !strconcat("$dst -= ", !strconcat(opc , "($src2, $src3)")),
1025234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1026234285Sdim                                        IntRegs:$src3))],
1027234285Sdim             "$dst2 = $dst">;
1028234285Sdim
1029234285Sdimclass si_MInst_sisis8_acc<string opc, Intrinsic IntID>
1030234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1031234285Sdim                                        s8Imm:$src3),
1032234285Sdim             !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
1033234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1034234285Sdim                                        imm:$src3))],
1035234285Sdim             "$dst2 = $dst">;
1036234285Sdim
1037234285Sdimclass si_MInst_sisis8_nac<string opc, Intrinsic IntID>
1038234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1039234285Sdim                                        s8Imm:$src3),
1040234285Sdim             !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
1041234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1042234285Sdim                                        imm:$src3))],
1043234285Sdim             "$dst2 = $dst">;
1044234285Sdim
1045234285Sdimclass si_MInst_sisiu4u5<string opc, Intrinsic IntID>
1046234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1047234285Sdim                                        u4Imm:$src2, u5Imm:$src3),
1048234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1049234285Sdim                                                "($src1, #$src2, #$src3)")),
1050234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1051234285Sdim                                          imm:$src2, imm:$src3))],
1052234285Sdim               "$dst2 = $dst">;
1053234285Sdim
1054234285Sdimclass si_MInst_sisiu8_acc<string opc, Intrinsic IntID>
1055234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1056234285Sdim                                        u8Imm:$src3),
1057234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
1058234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1059234285Sdim                                          imm:$src3))],
1060234285Sdim               "$dst2 = $dst">;
1061234285Sdim
1062234285Sdimclass si_MInst_sisiu8_nac<string opc, Intrinsic IntID>
1063234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1064234285Sdim                                        u8Imm:$src3),
1065234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
1066234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1067234285Sdim                                          imm:$src3))],
1068234285Sdim               "$dst2 = $dst">;
1069234285Sdim
1070234285Sdimclass si_MInst_sisisi_acc_hh<string opc, Intrinsic IntID>
1071234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1072234285Sdim                                        IntRegs:$src2),
1073234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
1074234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1075234285Sdim                                          IntRegs:$src2))],
1076234285Sdim               "$dst2 = $dst">;
1077234285Sdim
1078234285Sdimclass si_MInst_sisisi_acc_sat_lh<string opc, Intrinsic IntID>
1079234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1080234285Sdim                                        IntRegs:$src2),
1081234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1082234285Sdim                                                 "($src1.L, $src2.H):sat")),
1083234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1084234285Sdim                                          IntRegs:$src2))],
1085234285Sdim               "$dst2 = $dst">;
1086234285Sdim
1087234285Sdimclass si_MInst_sisisi_acc_sat_lh_s1<string opc, Intrinsic IntID>
1088234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1089234285Sdim                                        IntRegs:$src2),
1090234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1091234285Sdim                                                 "($src1.L, $src2.H):<<1:sat")),
1092234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1093234285Sdim                                          IntRegs:$src2))],
1094234285Sdim               "$dst2 = $dst">;
1095234285Sdim
1096234285Sdimclass si_MInst_sisisi_acc_sat_hh<string opc, Intrinsic IntID>
1097234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1098234285Sdim                                        IntRegs:$src2),
1099234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1100234285Sdim                                                 "($src1.H, $src2.H):sat")),
1101234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1102234285Sdim                                          IntRegs:$src2))],
1103234285Sdim               "$dst2 = $dst">;
1104234285Sdim
1105234285Sdimclass si_MInst_sisisi_acc_sat_hh_s1<string opc, Intrinsic IntID>
1106234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1107234285Sdim                                        IntRegs:$src2),
1108234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1109234285Sdim                                                 "($src1.H, $src2.H):<<1:sat")),
1110234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1111234285Sdim                                          IntRegs:$src2))],
1112234285Sdim               "$dst2 = $dst">;
1113234285Sdim
1114234285Sdimclass si_MInst_sisisi_acc_hh_s1<string opc, Intrinsic IntID>
1115234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1116234285Sdim                                        IntRegs:$src2),
1117234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1118234285Sdim                                                 "($src1.H, $src2.H):<<1")),
1119234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1120234285Sdim                                          IntRegs:$src2))],
1121234285Sdim               "$dst2 = $dst">;
1122234285Sdim
1123234285Sdimclass si_MInst_sisisi_nac_hh<string opc, Intrinsic IntID>
1124234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1125234285Sdim                                        IntRegs:$src2),
1126234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
1127234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1128234285Sdim                                          IntRegs:$src2))],
1129234285Sdim               "$dst2 = $dst">;
1130234285Sdim
1131234285Sdimclass si_MInst_sisisi_nac_sat_hh_s1<string opc, Intrinsic IntID>
1132234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1133234285Sdim                                        IntRegs:$src2),
1134234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1135234285Sdim                                                 "($src1.H, $src2.H):<<1:sat")),
1136234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1137234285Sdim                                          IntRegs:$src2))],
1138234285Sdim               "$dst2 = $dst">;
1139234285Sdim
1140234285Sdimclass si_MInst_sisisi_nac_sat_hh<string opc, Intrinsic IntID>
1141234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1142234285Sdim                                        IntRegs:$src2),
1143234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1144234285Sdim                                                 "($src1.H, $src2.H):sat")),
1145234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1146234285Sdim                                          IntRegs:$src2))],
1147234285Sdim               "$dst2 = $dst">;
1148234285Sdim
1149234285Sdimclass si_MInst_sisisi_nac_sat_hl_s1<string opc, Intrinsic IntID>
1150234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1151234285Sdim                                        IntRegs:$src2),
1152234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1153234285Sdim                                                 "($src1.H, $src2.L):<<1:sat")),
1154234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1155234285Sdim                                          IntRegs:$src2))],
1156234285Sdim               "$dst2 = $dst">;
1157234285Sdim
1158234285Sdimclass si_MInst_sisisi_nac_sat_hl<string opc, Intrinsic IntID>
1159234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1160234285Sdim                                        IntRegs:$src2),
1161234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1162234285Sdim                                                 "($src1.H, $src2.L):sat")),
1163234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1164234285Sdim                                          IntRegs:$src2))],
1165234285Sdim               "$dst2 = $dst">;
1166234285Sdim
1167234285Sdimclass si_MInst_sisisi_nac_sat_lh_s1<string opc, Intrinsic IntID>
1168234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1169234285Sdim                                        IntRegs:$src2),
1170234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1171234285Sdim                                                 "($src1.L, $src2.H):<<1:sat")),
1172234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1173234285Sdim                                          IntRegs:$src2))],
1174234285Sdim               "$dst2 = $dst">;
1175234285Sdim
1176234285Sdimclass si_MInst_sisisi_nac_sat_lh<string opc, Intrinsic IntID>
1177234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1178234285Sdim                                        IntRegs:$src2),
1179234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1180234285Sdim                                                 "($src1.L, $src2.H):sat")),
1181234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1182234285Sdim                                          IntRegs:$src2))],
1183234285Sdim               "$dst2 = $dst">;
1184234285Sdim
1185234285Sdimclass si_MInst_sisisi_nac_sat_ll_s1<string opc, Intrinsic IntID>
1186234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1187234285Sdim                                        IntRegs:$src2),
1188234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1189234285Sdim                                                 "($src1.L, $src2.L):<<1:sat")),
1190234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1191234285Sdim                                          IntRegs:$src2))],
1192234285Sdim               "$dst2 = $dst">;
1193234285Sdim
1194234285Sdimclass si_MInst_sisisi_nac_sat_ll<string opc, Intrinsic IntID>
1195234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1196234285Sdim                                        IntRegs:$src2),
1197234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1198234285Sdim                                                 "($src1.L, $src2.L):sat")),
1199234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1200234285Sdim                                          IntRegs:$src2))],
1201234285Sdim               "$dst2 = $dst">;
1202234285Sdim
1203234285Sdimclass si_MInst_sisisi_nac_hh_s1<string opc, Intrinsic IntID>
1204234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1205234285Sdim                                        IntRegs:$src2),
1206234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1207234285Sdim                                                 "($src1.H, $src2.H):<<1")),
1208234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1209234285Sdim                                          IntRegs:$src2))],
1210234285Sdim               "$dst2 = $dst">;
1211234285Sdim
1212234285Sdimclass si_MInst_sisisi_acc_hl<string opc, Intrinsic IntID>
1213234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1214234285Sdim                                        IntRegs:$src2),
1215234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
1216234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1217234285Sdim                                          IntRegs:$src2))],
1218234285Sdim               "$dst2 = $dst">;
1219234285Sdim
1220234285Sdimclass si_MInst_sisisi_acc_hl_s1<string opc, Intrinsic IntID>
1221234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1222234285Sdim                                        IntRegs:$src2),
1223234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1224234285Sdim                                                 "($src1.H, $src2.L):<<1")),
1225234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1226234285Sdim                                          IntRegs:$src2))],
1227234285Sdim               "$dst2 = $dst">;
1228234285Sdim
1229234285Sdimclass si_MInst_sisisi_nac_hl<string opc, Intrinsic IntID>
1230234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1231234285Sdim                                        IntRegs:$src2),
1232234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
1233234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1234234285Sdim                                          IntRegs:$src2))],
1235234285Sdim               "$dst2 = $dst">;
1236234285Sdim
1237234285Sdimclass si_MInst_sisisi_nac_hl_s1<string opc, Intrinsic IntID>
1238234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1239234285Sdim                                        IntRegs:$src2),
1240234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1241234285Sdim                                                 "($src1.H, $src2.L):<<1")),
1242234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1243234285Sdim                                          IntRegs:$src2))],
1244234285Sdim               "$dst2 = $dst">;
1245234285Sdim
1246234285Sdimclass si_MInst_sisisi_acc_lh<string opc, Intrinsic IntID>
1247234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1248234285Sdim                                        IntRegs:$src2),
1249234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
1250234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1251234285Sdim                                          IntRegs:$src2))],
1252234285Sdim               "$dst2 = $dst">;
1253234285Sdim
1254234285Sdimclass si_MInst_sisisi_acc_lh_s1<string opc, Intrinsic IntID>
1255234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1256234285Sdim                                        IntRegs:$src2),
1257234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1258234285Sdim                                                 "($src1.L, $src2.H):<<1")),
1259234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1260234285Sdim                                          IntRegs:$src2))],
1261234285Sdim               "$dst2 = $dst">;
1262234285Sdim
1263234285Sdimclass si_MInst_sisisi_nac_lh<string opc, Intrinsic IntID>
1264234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1265234285Sdim                                        IntRegs:$src2),
1266234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
1267234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1268234285Sdim                                          IntRegs:$src2))],
1269234285Sdim               "$dst2 = $dst">;
1270234285Sdim
1271234285Sdimclass si_MInst_sisisi_nac_lh_s1<string opc, Intrinsic IntID>
1272234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1273234285Sdim                                        IntRegs:$src2),
1274234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1275234285Sdim                                                 "($src1.L, $src2.H):<<1")),
1276234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1277234285Sdim                                          IntRegs:$src2))],
1278234285Sdim               "$dst2 = $dst">;
1279234285Sdim
1280234285Sdimclass si_MInst_sisisi_acc_ll<string opc, Intrinsic IntID>
1281234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1282234285Sdim                                        IntRegs:$src2),
1283234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
1284234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1285234285Sdim                                          IntRegs:$src2))],
1286234285Sdim               "$dst2 = $dst">;
1287234285Sdim
1288234285Sdimclass si_MInst_sisisi_acc_ll_s1<string opc, Intrinsic IntID>
1289234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1290234285Sdim                                        IntRegs:$src2),
1291234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1292234285Sdim                                                 "($src1.L, $src2.L):<<1")),
1293234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1294234285Sdim                                          IntRegs:$src2))],
1295234285Sdim               "$dst2 = $dst">;
1296234285Sdim
1297234285Sdimclass si_MInst_sisisi_acc_sat_ll_s1<string opc, Intrinsic IntID>
1298234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1299234285Sdim                                        IntRegs:$src2),
1300234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1301234285Sdim                                                 "($src1.L, $src2.L):<<1:sat")),
1302234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1303234285Sdim                                          IntRegs:$src2))],
1304234285Sdim               "$dst2 = $dst">;
1305234285Sdim
1306234285Sdimclass si_MInst_sisisi_acc_sat_hl_s1<string opc, Intrinsic IntID>
1307234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1308234285Sdim                                        IntRegs:$src2),
1309234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1310234285Sdim                                                 "($src1.H, $src2.L):<<1:sat")),
1311234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1312234285Sdim                                          IntRegs:$src2))],
1313234285Sdim               "$dst2 = $dst">;
1314234285Sdim
1315234285Sdimclass si_MInst_sisisi_acc_sat_ll<string opc, Intrinsic IntID>
1316234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1317234285Sdim                                        IntRegs:$src2),
1318234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1319234285Sdim                                                 "($src1.L, $src2.L):sat")),
1320234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1321234285Sdim                                          IntRegs:$src2))],
1322234285Sdim               "$dst2 = $dst">;
1323234285Sdim
1324234285Sdimclass si_MInst_sisisi_acc_sat_hl<string opc, Intrinsic IntID>
1325234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1326234285Sdim                                        IntRegs:$src2),
1327234285Sdim               !strconcat("$dst += ", !strconcat(opc ,
1328234285Sdim                                                 "($src1.H, $src2.L):sat")),
1329234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1330234285Sdim                                          IntRegs:$src2))],
1331234285Sdim               "$dst2 = $dst">;
1332234285Sdim
1333234285Sdimclass si_MInst_sisisi_nac_ll<string opc, Intrinsic IntID>
1334234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1335234285Sdim                                        IntRegs:$src2),
1336234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
1337234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1338234285Sdim                                          IntRegs:$src2))],
1339234285Sdim               "$dst2 = $dst">;
1340234285Sdim
1341234285Sdimclass si_MInst_sisisi_nac_ll_s1<string opc, Intrinsic IntID>
1342234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1343234285Sdim                                        IntRegs:$src2),
1344234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1345234285Sdim                                                 "($src1.L, $src2.L):<<1")),
1346234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1347234285Sdim                                          IntRegs:$src2))],
1348234285Sdim               "$dst2 = $dst">;
1349234285Sdim
1350234285Sdimclass si_MInst_sisisi_nac_hh_sat<string opc, Intrinsic IntID>
1351234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1352234285Sdim                                        IntRegs:$src2),
1353234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1354234285Sdim                                                 "($src1.H, $src2.H):sat")),
1355234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1356234285Sdim                                          IntRegs:$src2))],
1357234285Sdim               "$dst2 = $dst">;
1358234285Sdim
1359234285Sdimclass si_MInst_sisisi_nac_hh_s1_sat<string opc, Intrinsic IntID>
1360234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1361234285Sdim                                        IntRegs:$src2),
1362234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1363234285Sdim                                                 "($src1.H, $src2.H):<<1:sat")),
1364234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1365234285Sdim                                          IntRegs:$src2))],
1366234285Sdim               "$dst2 = $dst">;
1367234285Sdim
1368234285Sdimclass si_MInst_sisisi_nac_hl_sat<string opc, Intrinsic IntID>
1369234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1370234285Sdim                                        IntRegs:$src2),
1371234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1372234285Sdim                                                 "($src1.H, $src2.L):sat")),
1373234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1374234285Sdim                                          IntRegs:$src2))],
1375234285Sdim               "$dst2 = $dst">;
1376234285Sdim
1377234285Sdimclass si_MInst_sisisi_nac_hl_s1_sat<string opc, Intrinsic IntID>
1378234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1379234285Sdim                                        IntRegs:$src2),
1380234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1381234285Sdim                                                 "($src1.H, $src2.L):<<1:sat")),
1382234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1383234285Sdim                                          IntRegs:$src2))],
1384234285Sdim               "$dst2 = $dst">;
1385234285Sdim
1386234285Sdimclass si_MInst_sisisi_nac_lh_sat<string opc, Intrinsic IntID>
1387234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1388234285Sdim                                        IntRegs:$src2),
1389234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1390234285Sdim                                                 "($src1.L, $src2.H):sat")),
1391234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1392234285Sdim                                          IntRegs:$src2))],
1393234285Sdim               "$dst2 = $dst">;
1394234285Sdim
1395234285Sdimclass si_MInst_sisisi_nac_lh_s1_sat<string opc, Intrinsic IntID>
1396234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1397234285Sdim                                        IntRegs:$src2),
1398234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1399234285Sdim                                                 "($src1.L, $src2.H):<<1:sat")),
1400234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1401234285Sdim                                          IntRegs:$src2))],
1402234285Sdim               "$dst2 = $dst">;
1403234285Sdim
1404234285Sdimclass si_MInst_sisisi_nac_ll_sat<string opc, Intrinsic IntID>
1405234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1406234285Sdim                                        IntRegs:$src2),
1407234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1408234285Sdim                                                 "($src1.L, $src2.L):sat")),
1409234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1410234285Sdim                                          IntRegs:$src2))],
1411234285Sdim               "$dst2 = $dst">;
1412234285Sdim
1413234285Sdimclass si_MInst_sisisi_nac_ll_s1_sat<string opc, Intrinsic IntID>
1414234285Sdim  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1415234285Sdim                                        IntRegs:$src2),
1416234285Sdim               !strconcat("$dst -= ", !strconcat(opc ,
1417234285Sdim                                                 "($src1.L, $src2.L):<<1:sat")),
1418234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1419234285Sdim                                          IntRegs:$src2))],
1420234285Sdim               "$dst2 = $dst">;
1421234285Sdim
1422234285Sdimclass di_ALU32_sisi<string opc, Intrinsic IntID>
1423234285Sdim  : ALU32_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1424234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1425234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1426234285Sdim
1427234285Sdimclass di_MInst_sisi<string opc, Intrinsic IntID>
1428234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1429234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1430234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1431234285Sdim
1432234285Sdimclass di_MInst_sisi_sat<string opc, Intrinsic IntID>
1433234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1434234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
1435234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1436234285Sdim
1437234285Sdimclass di_MInst_sisi_sat_conj<string opc, Intrinsic IntID>
1438234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1439234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*):sat")),
1440234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1441234285Sdim
1442234285Sdimclass di_MInst_sisi_s1_sat<string opc, Intrinsic IntID>
1443234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1444234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
1445234285Sdim             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1446234285Sdim
1447234285Sdimclass di_MInst_didi_s1_sat<string opc, Intrinsic IntID>
1448234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1449234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
1450234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1451234285Sdim                                           DoubleRegs:$src2))]>;
1452234285Sdim
1453234285Sdimclass si_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
1454234285Sdim  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1455234285Sdim             !strconcat("$dst = ", !strconcat(opc ,
1456234285Sdim                                              "($src1, $src2):<<1:rnd:sat")),
1457234285Sdim             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
1458234285Sdim
1459234285Sdimclass si_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
1460234285Sdim  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1461234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
1462234285Sdim             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
1463234285Sdim
1464234285Sdimclass si_MInst_sisi_sat_hh<string opc, Intrinsic IntID>
1465234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1466234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
1467234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1468234285Sdim
1469234285Sdimclass si_MInst_sisi_sat_hh_s1<string opc, Intrinsic IntID>
1470234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1471234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1472234285Sdim                                                "($src1.H, $src2.H):<<1:sat")),
1473234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1474234285Sdim
1475234285Sdimclass si_MInst_sisi_sat_hl<string opc, Intrinsic IntID>
1476234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1477234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
1478234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1479234285Sdim
1480234285Sdimclass si_MInst_sisi_sat_hl_s1<string opc, Intrinsic IntID>
1481234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1482234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1483234285Sdim                                                "($src1.H, $src2.L):<<1:sat")),
1484234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1485234285Sdim
1486234285Sdimclass si_MInst_sisi_sat_lh<string opc, Intrinsic IntID>
1487234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1488234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
1489234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1490234285Sdim
1491234285Sdimclass si_MInst_sisi_sat_lh_s1<string opc, Intrinsic IntID>
1492234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1493234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1494234285Sdim                                                "($src1.L, $src2.H):<<1:sat")),
1495234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1496234285Sdim
1497234285Sdimclass si_MInst_sisi_sat_ll<string opc, Intrinsic IntID>
1498234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1499234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
1500234285Sdim             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1501234285Sdim
1502234285Sdimclass si_MInst_sisi_sat_ll_s1<string opc, Intrinsic IntID>
1503234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1504234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1505234285Sdim                                                "($src1.L, $src2.L):<<1:sat")),
1506234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1507234285Sdim
1508234285Sdimclass si_MInst_sisi_sat_rnd_hh<string opc, Intrinsic IntID>
1509234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1510234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1511234285Sdim                                                "($src1.H, $src2.H):rnd:sat")),
1512234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1513234285Sdim
1514234285Sdimclass si_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
1515234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1516234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1517234285Sdim                                                "($src1.H, $src2.H):rnd")),
1518234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1519234285Sdim
1520234285Sdimclass si_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
1521234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1522234285Sdim               !strconcat("$dst = ", !strconcat(opc ,
1523234285Sdim                                                "($src1.H, $src2.H):<<1:rnd")),
1524234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1525234285Sdim
1526234285Sdimclass si_MInst_sisi_sat_rnd_hh_s1<string opc, Intrinsic IntID>
1527234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1528234285Sdim               !strconcat("$dst = ",
1529234285Sdim                          !strconcat(opc ,
1530234285Sdim                                     "($src1.H, $src2.H):<<1:rnd:sat")),
1531234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1532234285Sdim
1533234285Sdimclass si_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
1534234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1535234285Sdim               !strconcat("$dst = ",
1536234285Sdim                          !strconcat(opc , "($src1.H, $src2.L):rnd")),
1537234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1538234285Sdim
1539234285Sdimclass si_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
1540234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1541234285Sdim               !strconcat("$dst = ",
1542234285Sdim                          !strconcat(opc , "($src1.H, $src2.L):<<1:rnd")),
1543234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1544234285Sdim
1545234285Sdimclass si_MInst_sisi_sat_rnd_hl<string opc, Intrinsic IntID>
1546234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1547234285Sdim               !strconcat("$dst = ",
1548234285Sdim                          !strconcat(opc , "($src1.H, $src2.L):rnd:sat")),
1549234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1550234285Sdim
1551234285Sdimclass si_MInst_sisi_sat_rnd_hl_s1<string opc, Intrinsic IntID>
1552234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1553234285Sdim               !strconcat("$dst = ",
1554234285Sdim                          !strconcat(opc , "($src1.H, $src2.L):<<1:rnd:sat")),
1555234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1556234285Sdim
1557234285Sdimclass si_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
1558234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1559234285Sdim               !strconcat("$dst = ",
1560234285Sdim                          !strconcat(opc , "($src1.L, $src2.H):rnd")),
1561234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1562234285Sdim
1563234285Sdimclass si_MInst_sisi_sat_rnd_lh<string opc, Intrinsic IntID>
1564234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1565234285Sdim               !strconcat("$dst = ",
1566234285Sdim                          !strconcat(opc , "($src1.L, $src2.H):rnd:sat")),
1567234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1568234285Sdim
1569234285Sdimclass si_MInst_sisi_sat_rnd_lh_s1<string opc, Intrinsic IntID>
1570234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1571234285Sdim               !strconcat("$dst = ",
1572234285Sdim                          !strconcat(opc , "($src1.L, $src2.H):<<1:rnd:sat")),
1573234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1574234285Sdim
1575234285Sdimclass si_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
1576234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1577234285Sdim               !strconcat("$dst = ",
1578234285Sdim                          !strconcat(opc , "($src1.L, $src2.H):<<1:rnd")),
1579234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1580234285Sdim
1581234285Sdimclass si_MInst_sisi_sat_rnd_ll<string opc, Intrinsic IntID>
1582234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1583234285Sdim               !strconcat("$dst = ",
1584234285Sdim                          !strconcat(opc , "($src1.L, $src2.L):rnd:sat")),
1585234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1586234285Sdim
1587234285Sdimclass si_MInst_sisi_sat_rnd_ll_s1<string opc, Intrinsic IntID>
1588234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1589234285Sdim               !strconcat("$dst = ",
1590234285Sdim                          !strconcat(opc , "($src1.L, $src2.L):<<1:rnd:sat")),
1591234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1592234285Sdim
1593234285Sdimclass si_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
1594234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1595234285Sdim               !strconcat("$dst = ",
1596234285Sdim                          !strconcat(opc , "($src1.L, $src2.L):rnd")),
1597234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1598234285Sdim
1599234285Sdimclass si_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
1600234285Sdim  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1601234285Sdim               !strconcat("$dst = ",
1602234285Sdim                          !strconcat(opc , "($src1.L, $src2.L):<<1:rnd")),
1603234285Sdim               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1604234285Sdim
1605234285Sdimclass di_MInst_dididi_acc_sat<string opc, Intrinsic IntID>
1606234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
1607234285Sdim                                           DoubleRegs:$src1, DoubleRegs:$src2),
1608234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
1609234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1610234285Sdim                                             DoubleRegs:$src1,
1611234285Sdim                                             DoubleRegs:$src2))],
1612234285Sdim               "$dst2 = $dst">;
1613234285Sdim
1614234285Sdimclass di_MInst_dididi_acc_rnd_sat<string opc, Intrinsic IntID>
1615234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1616234285Sdim                                           DoubleRegs:$src2),
1617234285Sdim               !strconcat("$dst += ",
1618234285Sdim                          !strconcat(opc , "($src1, $src2):rnd:sat")),
1619234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1620234285Sdim                                             DoubleRegs:$src1,
1621234285Sdim                                             DoubleRegs:$src2))],
1622234285Sdim               "$dst2 = $dst">;
1623234285Sdim
1624245431Sdimclass di_MInst_dididi_acc_s1<string opc, Intrinsic IntID>
1625245431Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
1626245431Sdim                                           DoubleRegs:$src1,
1627245431Sdim                                           DoubleRegs:$src2),
1628245431Sdim               !strconcat("$dst += ",
1629245431Sdim                          !strconcat(opc , "($src1, $src2):<<1")),
1630245431Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1631245431Sdim                                             DoubleRegs:$src1,
1632245431Sdim                                             DoubleRegs:$src2))],
1633245431Sdim               "$dst2 = $dst">;
1634245431Sdim
1635245431Sdim
1636234285Sdimclass di_MInst_dididi_acc_s1_sat<string opc, Intrinsic IntID>
1637234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
1638234285Sdim                                           DoubleRegs:$src1,
1639234285Sdim                                           DoubleRegs:$src2),
1640234285Sdim               !strconcat("$dst += ",
1641234285Sdim                          !strconcat(opc , "($src1, $src2):<<1:sat")),
1642234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1643234285Sdim                                             DoubleRegs:$src1,
1644234285Sdim                                             DoubleRegs:$src2))],
1645234285Sdim               "$dst2 = $dst">;
1646234285Sdim
1647234285Sdimclass di_MInst_dididi_acc_s1_rnd_sat<string opc, Intrinsic IntID>
1648234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1649234285Sdim                                           DoubleRegs:$src2),
1650234285Sdim               !strconcat("$dst += ",
1651234285Sdim                          !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
1652234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1653234285Sdim                                             DoubleRegs:$src1,
1654234285Sdim                                             DoubleRegs:$src2))],
1655234285Sdim               "$dst2 = $dst">;
1656234285Sdim
1657234285Sdimclass di_MInst_dididi_acc<string opc, Intrinsic IntID>
1658234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1659234285Sdim                                           DoubleRegs:$src2),
1660234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
1661234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1662234285Sdim                                             DoubleRegs:$src1,
1663234285Sdim                                             DoubleRegs:$src2))],
1664234285Sdim               "$dst2 = $dst">;
1665234285Sdim
1666234285Sdimclass di_MInst_dididi_acc_conj<string opc, Intrinsic IntID>
1667234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1668234285Sdim                                           DoubleRegs:$src2),
1669234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*)")),
1670234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1671234285Sdim                                             DoubleRegs:$src1,
1672234285Sdim                                             DoubleRegs:$src2))],
1673234285Sdim               "$dst2 = $dst">;
1674234285Sdim
1675234285Sdimclass di_MInst_disisi_acc_hh<string opc, Intrinsic IntID>
1676234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1677234285Sdim                                           IntRegs:$src2),
1678234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
1679234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1680234285Sdim                                             IntRegs:$src2))],
1681234285Sdim               "$dst2 = $dst">;
1682234285Sdim
1683234285Sdimclass di_MInst_disisi_acc_hl<string opc, Intrinsic IntID>
1684234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1685234285Sdim                                           IntRegs:$src2),
1686234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
1687234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1688234285Sdim                                             IntRegs:$src2))],
1689234285Sdim               "$dst2 = $dst">;
1690234285Sdim
1691234285Sdimclass di_MInst_disisi_acc_lh<string opc, Intrinsic IntID>
1692234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1693234285Sdim                                           IntRegs:$src2),
1694234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
1695234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1696234285Sdim                                             IntRegs:$src2))],
1697234285Sdim               "$dst2 = $dst">;
1698234285Sdim
1699234285Sdimclass di_MInst_disisi_acc_ll<string opc, Intrinsic IntID>
1700234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1701234285Sdim                                           IntRegs:$src2),
1702234285Sdim               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
1703234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1704234285Sdim                                             IntRegs:$src2))],
1705234285Sdim               "$dst2 = $dst">;
1706234285Sdim
1707234285Sdimclass di_MInst_disisi_acc_hh_s1<string opc, Intrinsic IntID>
1708234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1709234285Sdim                                           IntRegs:$src2),
1710234285Sdim               !strconcat("$dst += ",
1711234285Sdim                          !strconcat(opc , "($src1.H, $src2.H):<<1")),
1712234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1713234285Sdim                                             IntRegs:$src2))],
1714234285Sdim               "$dst2 = $dst">;
1715234285Sdim
1716234285Sdimclass di_MInst_disisi_acc_hl_s1<string opc, Intrinsic IntID>
1717234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1718234285Sdim                                           IntRegs:$src2),
1719234285Sdim               !strconcat("$dst += ",
1720234285Sdim                          !strconcat(opc , "($src1.H, $src2.L):<<1")),
1721234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1722234285Sdim                                             IntRegs:$src2))],
1723234285Sdim               "$dst2 = $dst">;
1724234285Sdim
1725234285Sdimclass di_MInst_disisi_acc_lh_s1<string opc, Intrinsic IntID>
1726234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1727234285Sdim                                           IntRegs:$src2),
1728234285Sdim               !strconcat("$dst += ",
1729234285Sdim                          !strconcat(opc , "($src1.L, $src2.H):<<1")),
1730234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1731234285Sdim                                             IntRegs:$src2))],
1732234285Sdim               "$dst2 = $dst">;
1733234285Sdim
1734234285Sdimclass di_MInst_disisi_acc_ll_s1<string opc, Intrinsic IntID>
1735234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1736234285Sdim                                           IntRegs:$src2),
1737234285Sdim               !strconcat("$dst += ",
1738234285Sdim                          !strconcat(opc , "($src1.L, $src2.L):<<1")),
1739234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1740234285Sdim                                             IntRegs:$src2))],
1741234285Sdim               "$dst2 = $dst">;
1742234285Sdim
1743234285Sdimclass di_MInst_disisi_nac_hh<string opc, Intrinsic IntID>
1744234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1745234285Sdim                                           IntRegs:$src2),
1746234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
1747234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1748234285Sdim                                             IntRegs:$src2))],
1749234285Sdim               "$dst2 = $dst">;
1750234285Sdim
1751234285Sdimclass di_MInst_disisi_nac_hl<string opc, Intrinsic IntID>
1752234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1753234285Sdim                                           IntRegs:$src2),
1754234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
1755234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1756234285Sdim                                             IntRegs:$src2))],
1757234285Sdim               "$dst2 = $dst">;
1758234285Sdim
1759234285Sdimclass di_MInst_disisi_nac_lh<string opc, Intrinsic IntID>
1760234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1761234285Sdim                                           IntRegs:$src2),
1762234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
1763234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1764234285Sdim                                             IntRegs:$src2))],
1765234285Sdim               "$dst2 = $dst">;
1766234285Sdim
1767234285Sdimclass di_MInst_disisi_nac_ll<string opc, Intrinsic IntID>
1768234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1769234285Sdim                                           IntRegs:$src2),
1770234285Sdim               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
1771234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1772234285Sdim                                             IntRegs:$src2))],
1773234285Sdim               "$dst2 = $dst">;
1774234285Sdim
1775234285Sdimclass di_MInst_disisi_nac_hh_s1<string opc, Intrinsic IntID>
1776234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1777234285Sdim                                           IntRegs:$src2),
1778234285Sdim               !strconcat("$dst -= ",
1779234285Sdim                          !strconcat(opc , "($src1.H, $src2.H):<<1")),
1780234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1781234285Sdim                                             IntRegs:$src2))],
1782234285Sdim               "$dst2 = $dst">;
1783234285Sdim
1784234285Sdimclass di_MInst_disisi_nac_hl_s1<string opc, Intrinsic IntID>
1785234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1786234285Sdim                                           IntRegs:$src2),
1787234285Sdim               !strconcat("$dst -= ",
1788234285Sdim                          !strconcat(opc , "($src1.H, $src2.L):<<1")),
1789234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1790234285Sdim                                             IntRegs:$src2))],
1791234285Sdim               "$dst2 = $dst">;
1792234285Sdim
1793234285Sdimclass di_MInst_disisi_nac_lh_s1<string opc, Intrinsic IntID>
1794234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1795234285Sdim                                           IntRegs:$src2),
1796234285Sdim               !strconcat("$dst -= ",
1797234285Sdim                          !strconcat(opc , "($src1.L, $src2.H):<<1")),
1798234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1799234285Sdim                                             IntRegs:$src2))],
1800234285Sdim               "$dst2 = $dst">;
1801234285Sdim
1802234285Sdimclass di_MInst_disisi_nac_ll_s1<string opc, Intrinsic IntID>
1803234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1804234285Sdim                                           IntRegs:$src2),
1805234285Sdim               !strconcat("$dst -= ",
1806234285Sdim                          !strconcat(opc , "($src1.L, $src2.L):<<1")),
1807234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1808234285Sdim                                             IntRegs:$src2))],
1809234285Sdim               "$dst2 = $dst">;
1810234285Sdim
1811234285Sdimclass di_MInst_disisi_acc_s1_sat<string opc, Intrinsic IntID>
1812234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1813234285Sdim                                           IntRegs:$src2),
1814234285Sdim               !strconcat("$dst += ",
1815234285Sdim                          !strconcat(opc , "($src1, $src2):<<1:sat")),
1816234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1817234285Sdim                                             IntRegs:$src2))],
1818234285Sdim               "$dst2 = $dst">;
1819234285Sdim
1820234285Sdimclass di_MInst_disi_s1_sat<string opc, Intrinsic IntID>
1821234285Sdim  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
1822234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
1823234285Sdim             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
1824234285Sdim
1825234285Sdimclass di_MInst_didisi_acc_s1_sat<string opc, Intrinsic IntID>
1826234285Sdim  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1827234285Sdim                                           IntRegs:$src2),
1828234285Sdim               !strconcat("$dst += ",
1829234285Sdim                          !strconcat(opc , "($src1, $src2):<<1:sat")),
1830234285Sdim               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1831234285Sdim                                             DoubleRegs:$src1,
1832234285Sdim                                             IntRegs:$src2))],
1833234285Sdim               "$dst2 = $dst">;
1834234285Sdim
1835234285Sdimclass si_MInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
1836234285Sdim  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
1837234285Sdim             !strconcat("$dst = ",
1838234285Sdim                        !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
1839234285Sdim             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
1840234285Sdim
1841234285Sdimclass si_MInst_didi<string opc, Intrinsic IntID>
1842234285Sdim  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1843234285Sdim             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1844234285Sdim             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
1845234285Sdim
1846245431Sdim//
1847245431Sdim// LDInst classes.
1848245431Sdim//
1849245431Sdimlet mayLoad = 1, neverHasSideEffects = 1 in
1850245431Sdimclass di_LDInstPI_diu4<string opc, Intrinsic IntID>
1851245431Sdim  : LDInstPI<(outs IntRegs:$dst, DoubleRegs:$dst2),
1852245431Sdim           (ins IntRegs:$src1, IntRegs:$src2, CRRegs:$src3, s4Imm:$offset),
1853245431Sdim           "$dst2 = memd($src1++#$offset:circ($src3))",
1854245431Sdim           [],
1855245431Sdim           "$src1 = $dst">;
1856234285Sdim
1857234285Sdim/********************************************************************
1858234285Sdim*            ALU32/ALU                                              *
1859234285Sdim*********************************************************************/
1860234285Sdim
1861234285Sdim// ALU32 / ALU / Add.
1862245431Sdimdef HEXAGON_A2_add:
1863234285Sdim  si_ALU32_sisi                   <"add",      int_hexagon_A2_add>;
1864245431Sdimdef HEXAGON_A2_addi:
1865234285Sdim  si_ALU32_sis16                  <"add",      int_hexagon_A2_addi>;
1866234285Sdim
1867234285Sdim// ALU32 / ALU / Logical operations.
1868245431Sdimdef HEXAGON_A2_and:
1869234285Sdim  si_ALU32_sisi                   <"and",      int_hexagon_A2_and>;
1870245431Sdimdef HEXAGON_A2_andir:
1871234285Sdim  si_ALU32_sis10                  <"and",      int_hexagon_A2_andir>;
1872245431Sdimdef HEXAGON_A2_not:
1873234285Sdim  si_ALU32_si                     <"not",      int_hexagon_A2_not>;
1874245431Sdimdef HEXAGON_A2_or:
1875234285Sdim  si_ALU32_sisi                   <"or",       int_hexagon_A2_or>;
1876245431Sdimdef HEXAGON_A2_orir:
1877234285Sdim  si_ALU32_sis10                  <"or",       int_hexagon_A2_orir>;
1878245431Sdimdef HEXAGON_A2_xor:
1879234285Sdim  si_ALU32_sisi                   <"xor",      int_hexagon_A2_xor>;
1880234285Sdim
1881234285Sdim// ALU32 / ALU / Negate.
1882245431Sdimdef HEXAGON_A2_neg:
1883234285Sdim  si_ALU32_si                     <"neg",      int_hexagon_A2_neg>;
1884234285Sdim
1885234285Sdim// ALU32 / ALU / Subtract.
1886245431Sdimdef HEXAGON_A2_sub:
1887234285Sdim  si_ALU32_sisi                   <"sub",      int_hexagon_A2_sub>;
1888245431Sdimdef HEXAGON_A2_subri:
1889234285Sdim  si_ALU32_s10si                  <"sub",      int_hexagon_A2_subri>;
1890234285Sdim
1891234285Sdim// ALU32 / ALU / Transfer Immediate.
1892245431Sdimdef HEXAGON_A2_tfril:
1893234285Sdim  si_lo_ALU32_siu16               <"",         int_hexagon_A2_tfril>;
1894245431Sdimdef HEXAGON_A2_tfrih:
1895234285Sdim  si_hi_ALU32_siu16               <"",         int_hexagon_A2_tfrih>;
1896245431Sdimdef HEXAGON_A2_tfrsi:
1897234285Sdim  si_ALU32_s16                    <"",         int_hexagon_A2_tfrsi>;
1898245431Sdimdef HEXAGON_A2_tfrpi:
1899234285Sdim  di_ALU32_s8                     <"",         int_hexagon_A2_tfrpi>;
1900234285Sdim
1901234285Sdim// ALU32 / ALU / Transfer Register.
1902245431Sdimdef HEXAGON_A2_tfr:
1903234285Sdim  si_ALU32_si_tfr                  <"",        int_hexagon_A2_tfr>;
1904234285Sdim
1905234285Sdim/********************************************************************
1906234285Sdim*            ALU32/PERM                                             *
1907234285Sdim*********************************************************************/
1908234285Sdim
1909234285Sdim// ALU32 / PERM / Combine.
1910245431Sdimdef HEXAGON_A2_combinew:
1911234285Sdim  di_ALU32_sisi                   <"combine",  int_hexagon_A2_combinew>;
1912245431Sdimdef HEXAGON_A2_combine_hh:
1913234285Sdim  si_MInst_sisi_hh                <"combine",  int_hexagon_A2_combine_hh>;
1914245431Sdimdef HEXAGON_A2_combine_lh:
1915234285Sdim  si_MInst_sisi_lh                <"combine",  int_hexagon_A2_combine_lh>;
1916245431Sdimdef HEXAGON_A2_combine_hl:
1917234285Sdim  si_MInst_sisi_hl                <"combine",  int_hexagon_A2_combine_hl>;
1918245431Sdimdef HEXAGON_A2_combine_ll:
1919234285Sdim  si_MInst_sisi_ll                <"combine",  int_hexagon_A2_combine_ll>;
1920245431Sdimdef HEXAGON_A2_combineii:
1921234285Sdim  di_MInst_s8s8                   <"combine",  int_hexagon_A2_combineii>;
1922234285Sdim
1923234285Sdim// ALU32 / PERM / Mux.
1924245431Sdimdef HEXAGON_C2_mux:
1925234285Sdim  si_ALU32_qisisi                 <"mux",      int_hexagon_C2_mux>;
1926245431Sdimdef HEXAGON_C2_muxri:
1927234285Sdim  si_ALU32_qis8si                 <"mux",      int_hexagon_C2_muxri>;
1928245431Sdimdef HEXAGON_C2_muxir:
1929234285Sdim  si_ALU32_qisis8                 <"mux",      int_hexagon_C2_muxir>;
1930245431Sdimdef HEXAGON_C2_muxii:
1931234285Sdim  si_ALU32_qis8s8                 <"mux",      int_hexagon_C2_muxii>;
1932234285Sdim
1933234285Sdim// ALU32 / PERM / Shift halfword.
1934245431Sdimdef HEXAGON_A2_aslh:
1935234285Sdim  si_ALU32_si                     <"aslh",     int_hexagon_A2_aslh>;
1936245431Sdimdef HEXAGON_A2_asrh:
1937234285Sdim  si_ALU32_si                     <"asrh",     int_hexagon_A2_asrh>;
1938234285Sdimdef SI_to_SXTHI_asrh:
1939234285Sdim  si_ALU32_si                     <"asrh",     int_hexagon_SI_to_SXTHI_asrh>;
1940234285Sdim
1941234285Sdim// ALU32 / PERM / Sign/zero extend.
1942245431Sdimdef HEXAGON_A2_sxth:
1943234285Sdim  si_ALU32_si                     <"sxth",     int_hexagon_A2_sxth>;
1944245431Sdimdef HEXAGON_A2_sxtb:
1945234285Sdim  si_ALU32_si                     <"sxtb",     int_hexagon_A2_sxtb>;
1946245431Sdimdef HEXAGON_A2_zxth:
1947234285Sdim  si_ALU32_si                     <"zxth",     int_hexagon_A2_zxth>;
1948245431Sdimdef HEXAGON_A2_zxtb:
1949234285Sdim  si_ALU32_si                     <"zxtb",     int_hexagon_A2_zxtb>;
1950234285Sdim
1951234285Sdim/********************************************************************
1952234285Sdim*            ALU32/PRED                                             *
1953234285Sdim*********************************************************************/
1954234285Sdim
1955234285Sdim// ALU32 / PRED / Compare.
1956245431Sdimdef HEXAGON_C2_cmpeq:
1957234285Sdim  qi_ALU32_sisi                   <"cmp.eq",   int_hexagon_C2_cmpeq>;
1958245431Sdimdef HEXAGON_C2_cmpeqi:
1959234285Sdim  qi_ALU32_sis10                  <"cmp.eq",   int_hexagon_C2_cmpeqi>;
1960245431Sdimdef HEXAGON_C2_cmpgei:
1961234285Sdim  qi_ALU32_sis8                   <"cmp.ge",   int_hexagon_C2_cmpgei>;
1962245431Sdimdef HEXAGON_C2_cmpgeui:
1963234285Sdim  qi_ALU32_siu8                   <"cmp.geu",  int_hexagon_C2_cmpgeui>;
1964245431Sdimdef HEXAGON_C2_cmpgt:
1965234285Sdim  qi_ALU32_sisi                   <"cmp.gt",   int_hexagon_C2_cmpgt>;
1966245431Sdimdef HEXAGON_C2_cmpgti:
1967234285Sdim  qi_ALU32_sis10                  <"cmp.gt",   int_hexagon_C2_cmpgti>;
1968245431Sdimdef HEXAGON_C2_cmpgtu:
1969234285Sdim  qi_ALU32_sisi                   <"cmp.gtu",  int_hexagon_C2_cmpgtu>;
1970245431Sdimdef HEXAGON_C2_cmpgtui:
1971234285Sdim  qi_ALU32_siu9                   <"cmp.gtu",  int_hexagon_C2_cmpgtui>;
1972245431Sdimdef HEXAGON_C2_cmplt:
1973234285Sdim  qi_ALU32_sisi                   <"cmp.lt",   int_hexagon_C2_cmplt>;
1974245431Sdimdef HEXAGON_C2_cmpltu:
1975234285Sdim  qi_ALU32_sisi                   <"cmp.ltu",  int_hexagon_C2_cmpltu>;
1976234285Sdim
1977234285Sdim/********************************************************************
1978234285Sdim*            ALU32/VH                                               *
1979234285Sdim*********************************************************************/
1980234285Sdim
1981234285Sdim// ALU32 / VH / Vector add halfwords.
1982234285Sdim// Rd32=vadd[u]h(Rs32,Rt32:sat]
1983245431Sdimdef HEXAGON_A2_svaddh:
1984234285Sdim  si_ALU32_sisi                   <"vaddh",    int_hexagon_A2_svaddh>;
1985245431Sdimdef HEXAGON_A2_svaddhs:
1986234285Sdim  si_ALU32_sisi_sat               <"vaddh",    int_hexagon_A2_svaddhs>;
1987245431Sdimdef HEXAGON_A2_svadduhs:
1988234285Sdim  si_ALU32_sisi_sat               <"vadduh",   int_hexagon_A2_svadduhs>;
1989234285Sdim
1990234285Sdim// ALU32 / VH / Vector average halfwords.
1991245431Sdimdef HEXAGON_A2_svavgh:
1992234285Sdim  si_ALU32_sisi                   <"vavgh",    int_hexagon_A2_svavgh>;
1993245431Sdimdef HEXAGON_A2_svavghs:
1994234285Sdim  si_ALU32_sisi_rnd               <"vavgh",    int_hexagon_A2_svavghs>;
1995245431Sdimdef HEXAGON_A2_svnavgh:
1996234285Sdim  si_ALU32_sisi                   <"vnavgh",   int_hexagon_A2_svnavgh>;
1997234285Sdim
1998234285Sdim// ALU32 / VH / Vector subtract halfwords.
1999245431Sdimdef HEXAGON_A2_svsubh:
2000234285Sdim  si_ALU32_sisi                   <"vsubh",    int_hexagon_A2_svsubh>;
2001245431Sdimdef HEXAGON_A2_svsubhs:
2002234285Sdim  si_ALU32_sisi_sat               <"vsubh",    int_hexagon_A2_svsubhs>;
2003245431Sdimdef HEXAGON_A2_svsubuhs:
2004234285Sdim  si_ALU32_sisi_sat               <"vsubuh",   int_hexagon_A2_svsubuhs>;
2005234285Sdim
2006234285Sdim/********************************************************************
2007234285Sdim*            ALU64/ALU                                              *
2008234285Sdim*********************************************************************/
2009234285Sdim
2010234285Sdim// ALU64 / ALU / Add.
2011245431Sdimdef HEXAGON_A2_addp:
2012234285Sdim  di_ALU64_didi                   <"add",      int_hexagon_A2_addp>;
2013245431Sdimdef HEXAGON_A2_addsat:
2014234285Sdim  si_ALU64_sisi_sat               <"add",      int_hexagon_A2_addsat>;
2015234285Sdim
2016234285Sdim// ALU64 / ALU / Add halfword.
2017234285Sdim// Even though the definition says hl, it should be lh -
2018234285Sdim//so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
2019245431Sdimdef HEXAGON_A2_addh_l16_hl:
2020234285Sdim  si_ALU64_sisi_l16_lh            <"add",      int_hexagon_A2_addh_l16_hl>;
2021245431Sdimdef HEXAGON_A2_addh_l16_ll:
2022234285Sdim  si_ALU64_sisi_l16_ll            <"add",      int_hexagon_A2_addh_l16_ll>;
2023234285Sdim
2024245431Sdimdef HEXAGON_A2_addh_l16_sat_hl:
2025234285Sdim  si_ALU64_sisi_l16_sat_lh        <"add",      int_hexagon_A2_addh_l16_sat_hl>;
2026245431Sdimdef HEXAGON_A2_addh_l16_sat_ll:
2027234285Sdim  si_ALU64_sisi_l16_sat_ll        <"add",      int_hexagon_A2_addh_l16_sat_ll>;
2028234285Sdim
2029245431Sdimdef HEXAGON_A2_addh_h16_hh:
2030234285Sdim  si_ALU64_sisi_h16_hh            <"add",      int_hexagon_A2_addh_h16_hh>;
2031245431Sdimdef HEXAGON_A2_addh_h16_hl:
2032234285Sdim  si_ALU64_sisi_h16_hl            <"add",      int_hexagon_A2_addh_h16_hl>;
2033245431Sdimdef HEXAGON_A2_addh_h16_lh:
2034234285Sdim  si_ALU64_sisi_h16_lh            <"add",      int_hexagon_A2_addh_h16_lh>;
2035245431Sdimdef HEXAGON_A2_addh_h16_ll:
2036234285Sdim  si_ALU64_sisi_h16_ll            <"add",      int_hexagon_A2_addh_h16_ll>;
2037234285Sdim
2038245431Sdimdef HEXAGON_A2_addh_h16_sat_hh:
2039234285Sdim  si_ALU64_sisi_h16_sat_hh        <"add",      int_hexagon_A2_addh_h16_sat_hh>;
2040245431Sdimdef HEXAGON_A2_addh_h16_sat_hl:
2041234285Sdim  si_ALU64_sisi_h16_sat_hl        <"add",      int_hexagon_A2_addh_h16_sat_hl>;
2042245431Sdimdef HEXAGON_A2_addh_h16_sat_lh:
2043234285Sdim  si_ALU64_sisi_h16_sat_lh        <"add",      int_hexagon_A2_addh_h16_sat_lh>;
2044245431Sdimdef HEXAGON_A2_addh_h16_sat_ll:
2045234285Sdim  si_ALU64_sisi_h16_sat_ll        <"add",      int_hexagon_A2_addh_h16_sat_ll>;
2046234285Sdim
2047234285Sdim// ALU64 / ALU / Compare.
2048245431Sdimdef HEXAGON_C2_cmpeqp:
2049234285Sdim  qi_ALU64_didi                   <"cmp.eq",   int_hexagon_C2_cmpeqp>;
2050245431Sdimdef HEXAGON_C2_cmpgtp:
2051234285Sdim  qi_ALU64_didi                   <"cmp.gt",   int_hexagon_C2_cmpgtp>;
2052245431Sdimdef HEXAGON_C2_cmpgtup:
2053234285Sdim  qi_ALU64_didi                   <"cmp.gtu",  int_hexagon_C2_cmpgtup>;
2054234285Sdim
2055234285Sdim// ALU64 / ALU / Logical operations.
2056245431Sdimdef HEXAGON_A2_andp:
2057234285Sdim  di_ALU64_didi                   <"and",      int_hexagon_A2_andp>;
2058245431Sdimdef HEXAGON_A2_orp:
2059234285Sdim  di_ALU64_didi                   <"or",       int_hexagon_A2_orp>;
2060245431Sdimdef HEXAGON_A2_xorp:
2061234285Sdim  di_ALU64_didi                   <"xor",      int_hexagon_A2_xorp>;
2062234285Sdim
2063234285Sdim// ALU64 / ALU / Maximum.
2064245431Sdimdef HEXAGON_A2_max:
2065234285Sdim  si_ALU64_sisi                   <"max",      int_hexagon_A2_max>;
2066245431Sdimdef HEXAGON_A2_maxu:
2067234285Sdim  si_ALU64_sisi                   <"maxu",     int_hexagon_A2_maxu>;
2068234285Sdim
2069234285Sdim// ALU64 / ALU / Minimum.
2070245431Sdimdef HEXAGON_A2_min:
2071234285Sdim  si_ALU64_sisi                   <"min",      int_hexagon_A2_min>;
2072245431Sdimdef HEXAGON_A2_minu:
2073234285Sdim  si_ALU64_sisi                   <"minu",     int_hexagon_A2_minu>;
2074234285Sdim
2075234285Sdim// ALU64 / ALU / Subtract.
2076245431Sdimdef HEXAGON_A2_subp:
2077234285Sdim  di_ALU64_didi                   <"sub",      int_hexagon_A2_subp>;
2078245431Sdimdef HEXAGON_A2_subsat:
2079234285Sdim  si_ALU64_sisi_sat               <"sub",      int_hexagon_A2_subsat>;
2080234285Sdim
2081234285Sdim// ALU64 / ALU / Subtract halfword.
2082234285Sdim// Even though the definition says hl, it should be lh -
2083234285Sdim//so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
2084245431Sdimdef HEXAGON_A2_subh_l16_hl:
2085234285Sdim  si_ALU64_sisi_l16_lh            <"sub",      int_hexagon_A2_subh_l16_hl>;
2086245431Sdimdef HEXAGON_A2_subh_l16_ll:
2087234285Sdim  si_ALU64_sisi_l16_ll            <"sub",      int_hexagon_A2_subh_l16_ll>;
2088234285Sdim
2089245431Sdimdef HEXAGON_A2_subh_l16_sat_hl:
2090234285Sdim  si_ALU64_sisi_l16_sat_lh        <"sub",      int_hexagon_A2_subh_l16_sat_hl>;
2091245431Sdimdef HEXAGON_A2_subh_l16_sat_ll:
2092234285Sdim  si_ALU64_sisi_l16_sat_ll        <"sub",      int_hexagon_A2_subh_l16_sat_ll>;
2093234285Sdim
2094245431Sdimdef HEXAGON_A2_subh_h16_hh:
2095234285Sdim  si_ALU64_sisi_h16_hh            <"sub",      int_hexagon_A2_subh_h16_hh>;
2096245431Sdimdef HEXAGON_A2_subh_h16_hl:
2097234285Sdim  si_ALU64_sisi_h16_hl            <"sub",      int_hexagon_A2_subh_h16_hl>;
2098245431Sdimdef HEXAGON_A2_subh_h16_lh:
2099234285Sdim  si_ALU64_sisi_h16_lh            <"sub",      int_hexagon_A2_subh_h16_lh>;
2100245431Sdimdef HEXAGON_A2_subh_h16_ll:
2101234285Sdim  si_ALU64_sisi_h16_ll            <"sub",      int_hexagon_A2_subh_h16_ll>;
2102234285Sdim
2103245431Sdimdef HEXAGON_A2_subh_h16_sat_hh:
2104234285Sdim  si_ALU64_sisi_h16_sat_hh        <"sub",      int_hexagon_A2_subh_h16_sat_hh>;
2105245431Sdimdef HEXAGON_A2_subh_h16_sat_hl:
2106234285Sdim  si_ALU64_sisi_h16_sat_hl        <"sub",      int_hexagon_A2_subh_h16_sat_hl>;
2107245431Sdimdef HEXAGON_A2_subh_h16_sat_lh:
2108234285Sdim  si_ALU64_sisi_h16_sat_lh        <"sub",      int_hexagon_A2_subh_h16_sat_lh>;
2109245431Sdimdef HEXAGON_A2_subh_h16_sat_ll:
2110234285Sdim  si_ALU64_sisi_h16_sat_ll        <"sub",      int_hexagon_A2_subh_h16_sat_ll>;
2111234285Sdim
2112234285Sdim// ALU64 / ALU / Transfer register.
2113245431Sdimdef HEXAGON_A2_tfrp:
2114234285Sdim  di_ALU64_di                     <"",         int_hexagon_A2_tfrp>;
2115234285Sdim
2116234285Sdim/********************************************************************
2117234285Sdim*            ALU64/BIT                                              *
2118234285Sdim*********************************************************************/
2119234285Sdim
2120234285Sdim// ALU64 / BIT / Masked parity.
2121245431Sdimdef HEXAGON_S2_parityp:
2122234285Sdim  si_ALU64_didi                   <"parity",   int_hexagon_S2_parityp>;
2123234285Sdim
2124234285Sdim/********************************************************************
2125234285Sdim*            ALU64/PERM                                             *
2126234285Sdim*********************************************************************/
2127234285Sdim
2128234285Sdim// ALU64 / PERM / Vector pack high and low halfwords.
2129245431Sdimdef HEXAGON_S2_packhl:
2130234285Sdim  di_ALU64_sisi                   <"packhl",   int_hexagon_S2_packhl>;
2131234285Sdim
2132234285Sdim/********************************************************************
2133234285Sdim*            ALU64/VB                                               *
2134234285Sdim*********************************************************************/
2135234285Sdim
2136234285Sdim// ALU64 / VB / Vector add unsigned bytes.
2137245431Sdimdef HEXAGON_A2_vaddub:
2138234285Sdim  di_ALU64_didi                   <"vaddub",   int_hexagon_A2_vaddub>;
2139245431Sdimdef HEXAGON_A2_vaddubs:
2140234285Sdim  di_ALU64_didi_sat               <"vaddub",   int_hexagon_A2_vaddubs>;
2141234285Sdim
2142234285Sdim// ALU64 / VB / Vector average unsigned bytes.
2143245431Sdimdef HEXAGON_A2_vavgub:
2144234285Sdim  di_ALU64_didi                   <"vavgub",   int_hexagon_A2_vavgub>;
2145245431Sdimdef HEXAGON_A2_vavgubr:
2146234285Sdim  di_ALU64_didi_rnd               <"vavgub",   int_hexagon_A2_vavgubr>;
2147234285Sdim
2148234285Sdim// ALU64 / VB / Vector compare unsigned bytes.
2149245431Sdimdef HEXAGON_A2_vcmpbeq:
2150234285Sdim  qi_ALU64_didi                   <"vcmpb.eq", int_hexagon_A2_vcmpbeq>;
2151245431Sdimdef HEXAGON_A2_vcmpbgtu:
2152234285Sdim  qi_ALU64_didi                   <"vcmpb.gtu",int_hexagon_A2_vcmpbgtu>;
2153234285Sdim
2154234285Sdim// ALU64 / VB / Vector maximum/minimum unsigned bytes.
2155245431Sdimdef HEXAGON_A2_vmaxub:
2156234285Sdim  di_ALU64_didi                   <"vmaxub",   int_hexagon_A2_vmaxub>;
2157245431Sdimdef HEXAGON_A2_vminub:
2158234285Sdim  di_ALU64_didi                   <"vminub",   int_hexagon_A2_vminub>;
2159234285Sdim
2160234285Sdim// ALU64 / VB / Vector subtract unsigned bytes.
2161245431Sdimdef HEXAGON_A2_vsubub:
2162234285Sdim  di_ALU64_didi                   <"vsubub",   int_hexagon_A2_vsubub>;
2163245431Sdimdef HEXAGON_A2_vsububs:
2164234285Sdim  di_ALU64_didi_sat               <"vsubub",   int_hexagon_A2_vsububs>;
2165234285Sdim
2166234285Sdim// ALU64 / VB / Vector mux.
2167245431Sdimdef HEXAGON_C2_vmux:
2168234285Sdim  di_ALU64_qididi                 <"vmux",     int_hexagon_C2_vmux>;
2169234285Sdim
2170234285Sdim
2171234285Sdim/********************************************************************
2172234285Sdim*            ALU64/VH                                               *
2173234285Sdim*********************************************************************/
2174234285Sdim
2175234285Sdim// ALU64 / VH / Vector add halfwords.
2176234285Sdim// Rdd64=vadd[u]h(Rss64,Rtt64:sat]
2177245431Sdimdef HEXAGON_A2_vaddh:
2178234285Sdim  di_ALU64_didi                   <"vaddh",    int_hexagon_A2_vaddh>;
2179245431Sdimdef HEXAGON_A2_vaddhs:
2180234285Sdim  di_ALU64_didi_sat               <"vaddh",    int_hexagon_A2_vaddhs>;
2181245431Sdimdef HEXAGON_A2_vadduhs:
2182234285Sdim  di_ALU64_didi_sat               <"vadduh",   int_hexagon_A2_vadduhs>;
2183234285Sdim
2184234285Sdim// ALU64 / VH / Vector average halfwords.
2185234285Sdim// Rdd64=v[n]avg[u]h(Rss64,Rtt64:rnd/:crnd][:sat]
2186245431Sdimdef HEXAGON_A2_vavgh:
2187234285Sdim  di_ALU64_didi                   <"vavgh",    int_hexagon_A2_vavgh>;
2188245431Sdimdef HEXAGON_A2_vavghcr:
2189234285Sdim  di_ALU64_didi_crnd              <"vavgh",    int_hexagon_A2_vavghcr>;
2190245431Sdimdef HEXAGON_A2_vavghr:
2191234285Sdim  di_ALU64_didi_rnd               <"vavgh",    int_hexagon_A2_vavghr>;
2192245431Sdimdef HEXAGON_A2_vavguh:
2193234285Sdim  di_ALU64_didi                   <"vavguh",   int_hexagon_A2_vavguh>;
2194245431Sdimdef HEXAGON_A2_vavguhr:
2195234285Sdim  di_ALU64_didi_rnd               <"vavguh",   int_hexagon_A2_vavguhr>;
2196245431Sdimdef HEXAGON_A2_vnavgh:
2197234285Sdim  di_ALU64_didi                   <"vnavgh",   int_hexagon_A2_vnavgh>;
2198245431Sdimdef HEXAGON_A2_vnavghcr:
2199234285Sdim  di_ALU64_didi_crnd_sat          <"vnavgh",   int_hexagon_A2_vnavghcr>;
2200245431Sdimdef HEXAGON_A2_vnavghr:
2201234285Sdim  di_ALU64_didi_rnd_sat           <"vnavgh",   int_hexagon_A2_vnavghr>;
2202234285Sdim
2203234285Sdim// ALU64 / VH / Vector compare halfwords.
2204245431Sdimdef HEXAGON_A2_vcmpheq:
2205234285Sdim  qi_ALU64_didi                   <"vcmph.eq", int_hexagon_A2_vcmpheq>;
2206245431Sdimdef HEXAGON_A2_vcmphgt:
2207234285Sdim  qi_ALU64_didi                   <"vcmph.gt", int_hexagon_A2_vcmphgt>;
2208245431Sdimdef HEXAGON_A2_vcmphgtu:
2209234285Sdim  qi_ALU64_didi                   <"vcmph.gtu",int_hexagon_A2_vcmphgtu>;
2210234285Sdim
2211234285Sdim// ALU64 / VH / Vector maximum halfwords.
2212245431Sdimdef HEXAGON_A2_vmaxh:
2213234285Sdim  di_ALU64_didi                   <"vmaxh",    int_hexagon_A2_vmaxh>;
2214245431Sdimdef HEXAGON_A2_vmaxuh:
2215234285Sdim  di_ALU64_didi                   <"vmaxuh",   int_hexagon_A2_vmaxuh>;
2216234285Sdim
2217234285Sdim// ALU64 / VH / Vector minimum halfwords.
2218245431Sdimdef HEXAGON_A2_vminh:
2219234285Sdim  di_ALU64_didi                   <"vminh",    int_hexagon_A2_vminh>;
2220245431Sdimdef HEXAGON_A2_vminuh:
2221234285Sdim  di_ALU64_didi                   <"vminuh",   int_hexagon_A2_vminuh>;
2222234285Sdim
2223234285Sdim// ALU64 / VH / Vector subtract halfwords.
2224245431Sdimdef HEXAGON_A2_vsubh:
2225234285Sdim  di_ALU64_didi                   <"vsubh",    int_hexagon_A2_vsubh>;
2226245431Sdimdef HEXAGON_A2_vsubhs:
2227234285Sdim  di_ALU64_didi_sat               <"vsubh",    int_hexagon_A2_vsubhs>;
2228245431Sdimdef HEXAGON_A2_vsubuhs:
2229234285Sdim  di_ALU64_didi_sat               <"vsubuh",   int_hexagon_A2_vsubuhs>;
2230234285Sdim
2231234285Sdim
2232234285Sdim/********************************************************************
2233234285Sdim*            ALU64/VW                                               *
2234234285Sdim*********************************************************************/
2235234285Sdim
2236234285Sdim// ALU64 / VW / Vector add words.
2237234285Sdim// Rdd32=vaddw(Rss32,Rtt32)[:sat]
2238245431Sdimdef HEXAGON_A2_vaddw:
2239234285Sdim  di_ALU64_didi                   <"vaddw",    int_hexagon_A2_vaddw>;
2240245431Sdimdef HEXAGON_A2_vaddws:
2241234285Sdim  di_ALU64_didi_sat               <"vaddw",   int_hexagon_A2_vaddws>;
2242234285Sdim
2243234285Sdim// ALU64 / VW / Vector average words.
2244245431Sdimdef HEXAGON_A2_vavguw:
2245234285Sdim  di_ALU64_didi                   <"vavguw",   int_hexagon_A2_vavguw>;
2246245431Sdimdef HEXAGON_A2_vavguwr:
2247234285Sdim  di_ALU64_didi_rnd               <"vavguw",   int_hexagon_A2_vavguwr>;
2248245431Sdimdef HEXAGON_A2_vavgw:
2249234285Sdim  di_ALU64_didi                   <"vavgw",    int_hexagon_A2_vavgw>;
2250245431Sdimdef HEXAGON_A2_vavgwcr:
2251234285Sdim  di_ALU64_didi_crnd              <"vavgw",    int_hexagon_A2_vavgwcr>;
2252245431Sdimdef HEXAGON_A2_vavgwr:
2253234285Sdim  di_ALU64_didi_rnd               <"vavgw",    int_hexagon_A2_vavgwr>;
2254245431Sdimdef HEXAGON_A2_vnavgw:
2255234285Sdim  di_ALU64_didi                   <"vnavgw",   int_hexagon_A2_vnavgw>;
2256245431Sdimdef HEXAGON_A2_vnavgwcr:
2257234285Sdim  di_ALU64_didi_crnd_sat          <"vnavgw",   int_hexagon_A2_vnavgwcr>;
2258245431Sdimdef HEXAGON_A2_vnavgwr:
2259234285Sdim  di_ALU64_didi_rnd_sat           <"vnavgw",   int_hexagon_A2_vnavgwr>;
2260234285Sdim
2261234285Sdim// ALU64 / VW / Vector compare words.
2262245431Sdimdef HEXAGON_A2_vcmpweq:
2263234285Sdim  qi_ALU64_didi                   <"vcmpw.eq", int_hexagon_A2_vcmpweq>;
2264245431Sdimdef HEXAGON_A2_vcmpwgt:
2265234285Sdim  qi_ALU64_didi                   <"vcmpw.gt", int_hexagon_A2_vcmpwgt>;
2266245431Sdimdef HEXAGON_A2_vcmpwgtu:
2267234285Sdim  qi_ALU64_didi                   <"vcmpw.gtu",int_hexagon_A2_vcmpwgtu>;
2268234285Sdim
2269234285Sdim// ALU64 / VW / Vector maximum words.
2270245431Sdimdef HEXAGON_A2_vmaxw:
2271234285Sdim  di_ALU64_didi                   <"vmaxw",    int_hexagon_A2_vmaxw>;
2272245431Sdimdef HEXAGON_A2_vmaxuw:
2273234285Sdim  di_ALU64_didi                   <"vmaxuw",   int_hexagon_A2_vmaxuw>;
2274234285Sdim
2275234285Sdim// ALU64 / VW / Vector minimum words.
2276245431Sdimdef HEXAGON_A2_vminw:
2277234285Sdim  di_ALU64_didi                   <"vminw",    int_hexagon_A2_vminw>;
2278245431Sdimdef HEXAGON_A2_vminuw:
2279234285Sdim  di_ALU64_didi                   <"vminuw",   int_hexagon_A2_vminuw>;
2280234285Sdim
2281234285Sdim// ALU64 / VW / Vector subtract words.
2282245431Sdimdef HEXAGON_A2_vsubw:
2283234285Sdim  di_ALU64_didi                   <"vsubw",    int_hexagon_A2_vsubw>;
2284245431Sdimdef HEXAGON_A2_vsubws:
2285234285Sdim  di_ALU64_didi_sat               <"vsubw",    int_hexagon_A2_vsubws>;
2286234285Sdim
2287234285Sdim
2288234285Sdim/********************************************************************
2289234285Sdim*            CR                                                     *
2290234285Sdim*********************************************************************/
2291234285Sdim
2292234285Sdim// CR / Logical reductions on predicates.
2293245431Sdimdef HEXAGON_C2_all8:
2294234285Sdim  qi_SInst_qi                     <"all8",     int_hexagon_C2_all8>;
2295245431Sdimdef HEXAGON_C2_any8:
2296234285Sdim  qi_SInst_qi                     <"any8",     int_hexagon_C2_any8>;
2297234285Sdim
2298234285Sdim// CR / Logical operations on predicates.
2299245431Sdimdef HEXAGON_C2_pxfer_map:
2300234285Sdim  qi_SInst_qi_pxfer               <"",         int_hexagon_C2_pxfer_map>;
2301245431Sdimdef HEXAGON_C2_and:
2302234285Sdim  qi_SInst_qiqi                   <"and",      int_hexagon_C2_and>;
2303245431Sdimdef HEXAGON_C2_andn:
2304234285Sdim  qi_SInst_qiqi_neg               <"and",      int_hexagon_C2_andn>;
2305245431Sdimdef HEXAGON_C2_not:
2306234285Sdim  qi_SInst_qi                     <"not",      int_hexagon_C2_not>;
2307245431Sdimdef HEXAGON_C2_or:
2308234285Sdim  qi_SInst_qiqi                   <"or",       int_hexagon_C2_or>;
2309245431Sdimdef HEXAGON_C2_orn:
2310234285Sdim  qi_SInst_qiqi_neg               <"or",       int_hexagon_C2_orn>;
2311245431Sdimdef HEXAGON_C2_xor:
2312234285Sdim  qi_SInst_qiqi                   <"xor",      int_hexagon_C2_xor>;
2313234285Sdim
2314234285Sdim
2315234285Sdim/********************************************************************
2316234285Sdim*            MTYPE/ALU                                              *
2317234285Sdim*********************************************************************/
2318234285Sdim
2319234285Sdim// MTYPE / ALU / Add and accumulate.
2320245431Sdimdef HEXAGON_M2_acci:
2321234285Sdim  si_MInst_sisisi_acc             <"add",      int_hexagon_M2_acci>;
2322245431Sdimdef HEXAGON_M2_accii:
2323234285Sdim  si_MInst_sisis8_acc             <"add",      int_hexagon_M2_accii>;
2324245431Sdimdef HEXAGON_M2_nacci:
2325234285Sdim  si_MInst_sisisi_nac             <"add",      int_hexagon_M2_nacci>;
2326245431Sdimdef HEXAGON_M2_naccii:
2327234285Sdim  si_MInst_sisis8_nac             <"add",      int_hexagon_M2_naccii>;
2328234285Sdim
2329234285Sdim// MTYPE / ALU / Subtract and accumulate.
2330245431Sdimdef HEXAGON_M2_subacc:
2331234285Sdim  si_MInst_sisisi_acc             <"sub",      int_hexagon_M2_subacc>;
2332234285Sdim
2333234285Sdim// MTYPE / ALU / Vector absolute difference.
2334245431Sdimdef HEXAGON_M2_vabsdiffh:
2335234285Sdim  di_MInst_didi                   <"vabsdiffh",int_hexagon_M2_vabsdiffh>;
2336245431Sdimdef HEXAGON_M2_vabsdiffw:
2337234285Sdim  di_MInst_didi                   <"vabsdiffw",int_hexagon_M2_vabsdiffw>;
2338234285Sdim
2339234285Sdim// MTYPE / ALU / XOR and xor with destination.
2340245431Sdimdef HEXAGON_M2_xor_xacc:
2341234285Sdim  si_MInst_sisisi_xacc            <"xor",      int_hexagon_M2_xor_xacc>;
2342234285Sdim
2343234285Sdim
2344234285Sdim/********************************************************************
2345234285Sdim*            MTYPE/COMPLEX                                          *
2346234285Sdim*********************************************************************/
2347234285Sdim
2348234285Sdim// MTYPE / COMPLEX / Complex multiply.
2349234285Sdim// Rdd[-+]=cmpy(Rs, Rt:<<1]:sat
2350245431Sdimdef HEXAGON_M2_cmpys_s1:
2351234285Sdim  di_MInst_sisi_s1_sat            <"cmpy",     int_hexagon_M2_cmpys_s1>;
2352245431Sdimdef HEXAGON_M2_cmpys_s0:
2353234285Sdim  di_MInst_sisi_sat               <"cmpy",     int_hexagon_M2_cmpys_s0>;
2354245431Sdimdef HEXAGON_M2_cmpysc_s1:
2355234285Sdim  di_MInst_sisi_s1_sat_conj       <"cmpy",     int_hexagon_M2_cmpysc_s1>;
2356245431Sdimdef HEXAGON_M2_cmpysc_s0:
2357234285Sdim  di_MInst_sisi_sat_conj          <"cmpy",     int_hexagon_M2_cmpysc_s0>;
2358234285Sdim
2359245431Sdimdef HEXAGON_M2_cmacs_s1:
2360234285Sdim  di_MInst_disisi_acc_s1_sat      <"cmpy",     int_hexagon_M2_cmacs_s1>;
2361245431Sdimdef HEXAGON_M2_cmacs_s0:
2362234285Sdim  di_MInst_disisi_acc_sat         <"cmpy",     int_hexagon_M2_cmacs_s0>;
2363245431Sdimdef HEXAGON_M2_cmacsc_s1:
2364234285Sdim  di_MInst_disisi_acc_s1_sat_conj <"cmpy",     int_hexagon_M2_cmacsc_s1>;
2365245431Sdimdef HEXAGON_M2_cmacsc_s0:
2366234285Sdim  di_MInst_disisi_acc_sat_conj    <"cmpy",     int_hexagon_M2_cmacsc_s0>;
2367234285Sdim
2368245431Sdimdef HEXAGON_M2_cnacs_s1:
2369234285Sdim  di_MInst_disisi_nac_s1_sat      <"cmpy",     int_hexagon_M2_cnacs_s1>;
2370245431Sdimdef HEXAGON_M2_cnacs_s0:
2371234285Sdim  di_MInst_disisi_nac_sat         <"cmpy",     int_hexagon_M2_cnacs_s0>;
2372245431Sdimdef HEXAGON_M2_cnacsc_s1:
2373234285Sdim  di_MInst_disisi_nac_s1_sat_conj <"cmpy",     int_hexagon_M2_cnacsc_s1>;
2374245431Sdimdef HEXAGON_M2_cnacsc_s0:
2375234285Sdim  di_MInst_disisi_nac_sat_conj    <"cmpy",     int_hexagon_M2_cnacsc_s0>;
2376234285Sdim
2377234285Sdim// MTYPE / COMPLEX / Complex multiply real or imaginary.
2378245431Sdimdef HEXAGON_M2_cmpyr_s0:
2379234285Sdim  di_MInst_sisi                   <"cmpyr",    int_hexagon_M2_cmpyr_s0>;
2380245431Sdimdef HEXAGON_M2_cmacr_s0:
2381234285Sdim  di_MInst_disisi_acc             <"cmpyr",    int_hexagon_M2_cmacr_s0>;
2382234285Sdim
2383245431Sdimdef HEXAGON_M2_cmpyi_s0:
2384234285Sdim  di_MInst_sisi                   <"cmpyi",    int_hexagon_M2_cmpyi_s0>;
2385245431Sdimdef HEXAGON_M2_cmaci_s0:
2386234285Sdim  di_MInst_disisi_acc             <"cmpyi",    int_hexagon_M2_cmaci_s0>;
2387234285Sdim
2388234285Sdim// MTYPE / COMPLEX / Complex multiply with round and pack.
2389234285Sdim// Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat
2390245431Sdimdef HEXAGON_M2_cmpyrs_s0:
2391234285Sdim  si_MInst_sisi_rnd_sat           <"cmpy",     int_hexagon_M2_cmpyrs_s0>;
2392245431Sdimdef HEXAGON_M2_cmpyrs_s1:
2393234285Sdim  si_MInst_sisi_s1_rnd_sat        <"cmpy",     int_hexagon_M2_cmpyrs_s1>;
2394234285Sdim
2395245431Sdimdef HEXAGON_M2_cmpyrsc_s0:
2396234285Sdim  si_MInst_sisi_rnd_sat_conj      <"cmpy",     int_hexagon_M2_cmpyrsc_s0>;
2397245431Sdimdef HEXAGON_M2_cmpyrsc_s1:
2398234285Sdim  si_MInst_sisi_s1_rnd_sat_conj   <"cmpy",     int_hexagon_M2_cmpyrsc_s1>;
2399234285Sdim
2400234285Sdim//MTYPE / COMPLEX / Vector complex multiply real or imaginary.
2401245431Sdimdef HEXAGON_M2_vcmpy_s0_sat_i:
2402234285Sdim  di_MInst_didi_sat               <"vcmpyi",   int_hexagon_M2_vcmpy_s0_sat_i>;
2403245431Sdimdef HEXAGON_M2_vcmpy_s1_sat_i:
2404234285Sdim  di_MInst_didi_s1_sat            <"vcmpyi",   int_hexagon_M2_vcmpy_s1_sat_i>;
2405234285Sdim
2406245431Sdimdef HEXAGON_M2_vcmpy_s0_sat_r:
2407234285Sdim  di_MInst_didi_sat               <"vcmpyr",   int_hexagon_M2_vcmpy_s0_sat_r>;
2408245431Sdimdef HEXAGON_M2_vcmpy_s1_sat_r:
2409234285Sdim  di_MInst_didi_s1_sat            <"vcmpyr",   int_hexagon_M2_vcmpy_s1_sat_r>;
2410234285Sdim
2411245431Sdimdef HEXAGON_M2_vcmac_s0_sat_i:
2412234285Sdim  di_MInst_dididi_acc_sat         <"vcmpyi",   int_hexagon_M2_vcmac_s0_sat_i>;
2413245431Sdimdef HEXAGON_M2_vcmac_s0_sat_r:
2414234285Sdim  di_MInst_dididi_acc_sat         <"vcmpyr",   int_hexagon_M2_vcmac_s0_sat_r>;
2415234285Sdim
2416234285Sdim//MTYPE / COMPLEX / Vector reduce complex multiply real or imaginary.
2417245431Sdimdef HEXAGON_M2_vrcmpyi_s0:
2418234285Sdim  di_MInst_didi                   <"vrcmpyi",  int_hexagon_M2_vrcmpyi_s0>;
2419245431Sdimdef HEXAGON_M2_vrcmpyr_s0:
2420234285Sdim  di_MInst_didi                   <"vrcmpyr",  int_hexagon_M2_vrcmpyr_s0>;
2421234285Sdim
2422245431Sdimdef HEXAGON_M2_vrcmpyi_s0c:
2423234285Sdim  di_MInst_didi_conj              <"vrcmpyi",  int_hexagon_M2_vrcmpyi_s0c>;
2424245431Sdimdef HEXAGON_M2_vrcmpyr_s0c:
2425234285Sdim  di_MInst_didi_conj              <"vrcmpyr",  int_hexagon_M2_vrcmpyr_s0c>;
2426234285Sdim
2427245431Sdimdef HEXAGON_M2_vrcmaci_s0:
2428234285Sdim  di_MInst_dididi_acc             <"vrcmpyi",  int_hexagon_M2_vrcmaci_s0>;
2429245431Sdimdef HEXAGON_M2_vrcmacr_s0:
2430234285Sdim  di_MInst_dididi_acc             <"vrcmpyr",  int_hexagon_M2_vrcmacr_s0>;
2431234285Sdim
2432245431Sdimdef HEXAGON_M2_vrcmaci_s0c:
2433234285Sdim  di_MInst_dididi_acc_conj        <"vrcmpyi",  int_hexagon_M2_vrcmaci_s0c>;
2434245431Sdimdef HEXAGON_M2_vrcmacr_s0c:
2435234285Sdim  di_MInst_dididi_acc_conj        <"vrcmpyr",  int_hexagon_M2_vrcmacr_s0c>;
2436234285Sdim
2437234285Sdim
2438234285Sdim/********************************************************************
2439234285Sdim*            MTYPE/MPYH                                             *
2440234285Sdim*********************************************************************/
2441234285Sdim
2442234285Sdim// MTYPE / MPYH / Multiply and use lower result.
2443245431Sdim//def HEXAGON_M2_mpysmi:
2444245431Sdim//FIXME: Hexagon_M2_mpysmi should really by of the type si_MInst_sim9,
2445245431Sdim// not si_MInst_sis9 - but for now, we will use s9.
2446245431Sdim// def Hexagon_M2_mpysmi:
2447234285Sdim//  si_MInst_sim9                   <"mpyi",     int_hexagon_M2_mpysmi>;
2448245431Sdimdef Hexagon_M2_mpysmi:
2449245431Sdim  si_MInst_sis9                   <"mpyi",     int_hexagon_M2_mpysmi>;
2450245431Sdimdef HEXAGON_M2_mpyi:
2451234285Sdim  si_MInst_sisi                   <"mpyi",     int_hexagon_M2_mpyi>;
2452245431Sdimdef HEXAGON_M2_mpyui:
2453234285Sdim  si_MInst_sisi                   <"mpyui",    int_hexagon_M2_mpyui>;
2454245431Sdimdef HEXAGON_M2_macsip:
2455234285Sdim  si_MInst_sisiu8_acc             <"mpyi",     int_hexagon_M2_macsip>;
2456245431Sdimdef HEXAGON_M2_maci:
2457234285Sdim  si_MInst_sisisi_acc             <"mpyi",     int_hexagon_M2_maci>;
2458245431Sdimdef HEXAGON_M2_macsin:
2459234285Sdim  si_MInst_sisiu8_nac             <"mpyi",     int_hexagon_M2_macsin>;
2460234285Sdim
2461234285Sdim// MTYPE / MPYH / Multiply word by half (32x16).
2462234285Sdim//Rdd[+]=vmpywoh(Rss,Rtt)[:<<1][:rnd][:sat]
2463234285Sdim//Rdd[+]=vmpyweh(Rss,Rtt)[:<<1][:rnd][:sat]
2464245431Sdimdef HEXAGON_M2_mmpyl_rs1:
2465234285Sdim  di_MInst_didi_s1_rnd_sat        <"vmpyweh",  int_hexagon_M2_mmpyl_rs1>;
2466245431Sdimdef HEXAGON_M2_mmpyl_s1:
2467234285Sdim  di_MInst_didi_s1_sat            <"vmpyweh",  int_hexagon_M2_mmpyl_s1>;
2468245431Sdimdef HEXAGON_M2_mmpyl_rs0:
2469234285Sdim  di_MInst_didi_rnd_sat           <"vmpyweh",  int_hexagon_M2_mmpyl_rs0>;
2470245431Sdimdef HEXAGON_M2_mmpyl_s0:
2471234285Sdim  di_MInst_didi_sat               <"vmpyweh",  int_hexagon_M2_mmpyl_s0>;
2472245431Sdimdef HEXAGON_M2_mmpyh_rs1:
2473234285Sdim  di_MInst_didi_s1_rnd_sat        <"vmpywoh",  int_hexagon_M2_mmpyh_rs1>;
2474245431Sdimdef HEXAGON_M2_mmpyh_s1:
2475234285Sdim  di_MInst_didi_s1_sat            <"vmpywoh",  int_hexagon_M2_mmpyh_s1>;
2476245431Sdimdef HEXAGON_M2_mmpyh_rs0:
2477234285Sdim  di_MInst_didi_rnd_sat           <"vmpywoh",  int_hexagon_M2_mmpyh_rs0>;
2478245431Sdimdef HEXAGON_M2_mmpyh_s0:
2479234285Sdim  di_MInst_didi_sat               <"vmpywoh",  int_hexagon_M2_mmpyh_s0>;
2480245431Sdimdef HEXAGON_M2_mmacls_rs1:
2481234285Sdim  di_MInst_dididi_acc_s1_rnd_sat  <"vmpyweh",  int_hexagon_M2_mmacls_rs1>;
2482245431Sdimdef HEXAGON_M2_mmacls_s1:
2483234285Sdim  di_MInst_dididi_acc_s1_sat      <"vmpyweh",  int_hexagon_M2_mmacls_s1>;
2484245431Sdimdef HEXAGON_M2_mmacls_rs0:
2485234285Sdim  di_MInst_dididi_acc_rnd_sat     <"vmpyweh",  int_hexagon_M2_mmacls_rs0>;
2486245431Sdimdef HEXAGON_M2_mmacls_s0:
2487234285Sdim  di_MInst_dididi_acc_sat         <"vmpyweh",  int_hexagon_M2_mmacls_s0>;
2488245431Sdimdef HEXAGON_M2_mmachs_rs1:
2489234285Sdim  di_MInst_dididi_acc_s1_rnd_sat  <"vmpywoh",  int_hexagon_M2_mmachs_rs1>;
2490245431Sdimdef HEXAGON_M2_mmachs_s1:
2491234285Sdim  di_MInst_dididi_acc_s1_sat      <"vmpywoh",  int_hexagon_M2_mmachs_s1>;
2492245431Sdimdef HEXAGON_M2_mmachs_rs0:
2493234285Sdim  di_MInst_dididi_acc_rnd_sat     <"vmpywoh",  int_hexagon_M2_mmachs_rs0>;
2494245431Sdimdef HEXAGON_M2_mmachs_s0:
2495234285Sdim  di_MInst_dididi_acc_sat         <"vmpywoh",  int_hexagon_M2_mmachs_s0>;
2496234285Sdim
2497234285Sdim// MTYPE / MPYH / Multiply word by unsigned half (32x16).
2498234285Sdim//Rdd[+]=vmpywouh(Rss,Rtt)[:<<1][:rnd][:sat]
2499234285Sdim//Rdd[+]=vmpyweuh(Rss,Rtt)[:<<1][:rnd][:sat]
2500245431Sdimdef HEXAGON_M2_mmpyul_rs1:
2501234285Sdim  di_MInst_didi_s1_rnd_sat        <"vmpyweuh", int_hexagon_M2_mmpyul_rs1>;
2502245431Sdimdef HEXAGON_M2_mmpyul_s1:
2503234285Sdim  di_MInst_didi_s1_sat            <"vmpyweuh", int_hexagon_M2_mmpyul_s1>;
2504245431Sdimdef HEXAGON_M2_mmpyul_rs0:
2505234285Sdim  di_MInst_didi_rnd_sat           <"vmpyweuh", int_hexagon_M2_mmpyul_rs0>;
2506245431Sdimdef HEXAGON_M2_mmpyul_s0:
2507234285Sdim  di_MInst_didi_sat               <"vmpyweuh", int_hexagon_M2_mmpyul_s0>;
2508245431Sdimdef HEXAGON_M2_mmpyuh_rs1:
2509234285Sdim  di_MInst_didi_s1_rnd_sat        <"vmpywouh", int_hexagon_M2_mmpyuh_rs1>;
2510245431Sdimdef HEXAGON_M2_mmpyuh_s1:
2511234285Sdim  di_MInst_didi_s1_sat            <"vmpywouh", int_hexagon_M2_mmpyuh_s1>;
2512245431Sdimdef HEXAGON_M2_mmpyuh_rs0:
2513234285Sdim  di_MInst_didi_rnd_sat           <"vmpywouh", int_hexagon_M2_mmpyuh_rs0>;
2514245431Sdimdef HEXAGON_M2_mmpyuh_s0:
2515234285Sdim  di_MInst_didi_sat               <"vmpywouh", int_hexagon_M2_mmpyuh_s0>;
2516245431Sdimdef HEXAGON_M2_mmaculs_rs1:
2517234285Sdim  di_MInst_dididi_acc_s1_rnd_sat  <"vmpyweuh", int_hexagon_M2_mmaculs_rs1>;
2518245431Sdimdef HEXAGON_M2_mmaculs_s1:
2519234285Sdim  di_MInst_dididi_acc_s1_sat      <"vmpyweuh", int_hexagon_M2_mmaculs_s1>;
2520245431Sdimdef HEXAGON_M2_mmaculs_rs0:
2521234285Sdim  di_MInst_dididi_acc_rnd_sat     <"vmpyweuh", int_hexagon_M2_mmaculs_rs0>;
2522245431Sdimdef HEXAGON_M2_mmaculs_s0:
2523234285Sdim  di_MInst_dididi_acc_sat         <"vmpyweuh", int_hexagon_M2_mmaculs_s0>;
2524245431Sdimdef HEXAGON_M2_mmacuhs_rs1:
2525234285Sdim  di_MInst_dididi_acc_s1_rnd_sat  <"vmpywouh", int_hexagon_M2_mmacuhs_rs1>;
2526245431Sdimdef HEXAGON_M2_mmacuhs_s1:
2527234285Sdim  di_MInst_dididi_acc_s1_sat      <"vmpywouh", int_hexagon_M2_mmacuhs_s1>;
2528245431Sdimdef HEXAGON_M2_mmacuhs_rs0:
2529234285Sdim  di_MInst_dididi_acc_rnd_sat     <"vmpywouh", int_hexagon_M2_mmacuhs_rs0>;
2530245431Sdimdef HEXAGON_M2_mmacuhs_s0:
2531234285Sdim  di_MInst_dididi_acc_sat         <"vmpywouh", int_hexagon_M2_mmacuhs_s0>;
2532234285Sdim
2533234285Sdim// MTYPE / MPYH / Multiply and use upper result.
2534245431Sdimdef HEXAGON_M2_hmmpyh_rs1:
2535234285Sdim  si_MInst_sisi_h_s1_rnd_sat      <"mpy",      int_hexagon_M2_hmmpyh_rs1>;
2536245431Sdimdef HEXAGON_M2_hmmpyl_rs1:
2537234285Sdim  si_MInst_sisi_l_s1_rnd_sat      <"mpy",      int_hexagon_M2_hmmpyl_rs1>;
2538245431Sdimdef HEXAGON_M2_mpy_up:
2539234285Sdim  si_MInst_sisi                   <"mpy",      int_hexagon_M2_mpy_up>;
2540245431Sdimdef HEXAGON_M2_dpmpyss_rnd_s0:
2541234285Sdim  si_MInst_sisi_rnd               <"mpy",      int_hexagon_M2_dpmpyss_rnd_s0>;
2542245431Sdimdef HEXAGON_M2_mpyu_up:
2543234285Sdim  si_MInst_sisi                   <"mpyu",     int_hexagon_M2_mpyu_up>;
2544234285Sdim
2545234285Sdim// MTYPE / MPYH / Multiply and use full result.
2546245431Sdimdef HEXAGON_M2_dpmpyuu_s0:
2547234285Sdim  di_MInst_sisi                   <"mpyu",     int_hexagon_M2_dpmpyuu_s0>;
2548245431Sdimdef HEXAGON_M2_dpmpyuu_acc_s0:
2549234285Sdim  di_MInst_disisi_acc             <"mpyu",     int_hexagon_M2_dpmpyuu_acc_s0>;
2550245431Sdimdef HEXAGON_M2_dpmpyuu_nac_s0:
2551234285Sdim  di_MInst_disisi_nac             <"mpyu",     int_hexagon_M2_dpmpyuu_nac_s0>;
2552245431Sdimdef HEXAGON_M2_dpmpyss_s0:
2553234285Sdim  di_MInst_sisi                   <"mpy",      int_hexagon_M2_dpmpyss_s0>;
2554245431Sdimdef HEXAGON_M2_dpmpyss_acc_s0:
2555234285Sdim  di_MInst_disisi_acc             <"mpy",      int_hexagon_M2_dpmpyss_acc_s0>;
2556245431Sdimdef HEXAGON_M2_dpmpyss_nac_s0:
2557234285Sdim  di_MInst_disisi_nac             <"mpy",      int_hexagon_M2_dpmpyss_nac_s0>;
2558234285Sdim
2559234285Sdim
2560234285Sdim/********************************************************************
2561234285Sdim*            MTYPE/MPYS                                             *
2562234285Sdim*********************************************************************/
2563234285Sdim
2564234285Sdim// MTYPE / MPYS / Scalar 16x16 multiply signed.
2565234285Sdim//Rd=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]|
2566234285Sdim//          [:<<0[:rnd|:sat|:rnd:sat]|:<<1[:rnd|:sat|:rnd:sat]]]
2567245431Sdimdef HEXAGON_M2_mpy_hh_s0:
2568234285Sdim  si_MInst_sisi_hh                <"mpy",     int_hexagon_M2_mpy_hh_s0>;
2569245431Sdimdef HEXAGON_M2_mpy_hh_s1:
2570234285Sdim  si_MInst_sisi_hh_s1             <"mpy",     int_hexagon_M2_mpy_hh_s1>;
2571245431Sdimdef HEXAGON_M2_mpy_rnd_hh_s1:
2572234285Sdim  si_MInst_sisi_rnd_hh_s1         <"mpy",     int_hexagon_M2_mpy_rnd_hh_s1>;
2573245431Sdimdef HEXAGON_M2_mpy_sat_rnd_hh_s1:
2574234285Sdim  si_MInst_sisi_sat_rnd_hh_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_hh_s1>;
2575245431Sdimdef HEXAGON_M2_mpy_sat_hh_s1:
2576234285Sdim  si_MInst_sisi_sat_hh_s1         <"mpy",     int_hexagon_M2_mpy_sat_hh_s1>;
2577245431Sdimdef HEXAGON_M2_mpy_rnd_hh_s0:
2578234285Sdim  si_MInst_sisi_rnd_hh            <"mpy",     int_hexagon_M2_mpy_rnd_hh_s0>;
2579245431Sdimdef HEXAGON_M2_mpy_sat_rnd_hh_s0:
2580234285Sdim  si_MInst_sisi_sat_rnd_hh        <"mpy",     int_hexagon_M2_mpy_sat_rnd_hh_s0>;
2581245431Sdimdef HEXAGON_M2_mpy_sat_hh_s0:
2582234285Sdim  si_MInst_sisi_sat_hh            <"mpy",     int_hexagon_M2_mpy_sat_hh_s0>;
2583234285Sdim
2584245431Sdimdef HEXAGON_M2_mpy_hl_s0:
2585234285Sdim  si_MInst_sisi_hl                <"mpy",     int_hexagon_M2_mpy_hl_s0>;
2586245431Sdimdef HEXAGON_M2_mpy_hl_s1:
2587234285Sdim  si_MInst_sisi_hl_s1             <"mpy",     int_hexagon_M2_mpy_hl_s1>;
2588245431Sdimdef HEXAGON_M2_mpy_rnd_hl_s1:
2589234285Sdim  si_MInst_sisi_rnd_hl_s1         <"mpy",     int_hexagon_M2_mpy_rnd_hl_s1>;
2590245431Sdimdef HEXAGON_M2_mpy_sat_rnd_hl_s1:
2591234285Sdim  si_MInst_sisi_sat_rnd_hl_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_hl_s1>;
2592245431Sdimdef HEXAGON_M2_mpy_sat_hl_s1:
2593234285Sdim  si_MInst_sisi_sat_hl_s1         <"mpy",     int_hexagon_M2_mpy_sat_hl_s1>;
2594245431Sdimdef HEXAGON_M2_mpy_rnd_hl_s0:
2595234285Sdim  si_MInst_sisi_rnd_hl            <"mpy",     int_hexagon_M2_mpy_rnd_hl_s0>;
2596245431Sdimdef HEXAGON_M2_mpy_sat_rnd_hl_s0:
2597234285Sdim  si_MInst_sisi_sat_rnd_hl        <"mpy",     int_hexagon_M2_mpy_sat_rnd_hl_s0>;
2598245431Sdimdef HEXAGON_M2_mpy_sat_hl_s0:
2599234285Sdim  si_MInst_sisi_sat_hl            <"mpy",     int_hexagon_M2_mpy_sat_hl_s0>;
2600234285Sdim
2601245431Sdimdef HEXAGON_M2_mpy_lh_s0:
2602234285Sdim  si_MInst_sisi_lh                <"mpy",     int_hexagon_M2_mpy_lh_s0>;
2603245431Sdimdef HEXAGON_M2_mpy_lh_s1:
2604234285Sdim  si_MInst_sisi_lh_s1             <"mpy",     int_hexagon_M2_mpy_lh_s1>;
2605245431Sdimdef HEXAGON_M2_mpy_rnd_lh_s1:
2606234285Sdim  si_MInst_sisi_rnd_lh_s1         <"mpy",     int_hexagon_M2_mpy_rnd_lh_s1>;
2607245431Sdimdef HEXAGON_M2_mpy_sat_rnd_lh_s1:
2608234285Sdim  si_MInst_sisi_sat_rnd_lh_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_lh_s1>;
2609245431Sdimdef HEXAGON_M2_mpy_sat_lh_s1:
2610234285Sdim  si_MInst_sisi_sat_lh_s1         <"mpy",     int_hexagon_M2_mpy_sat_lh_s1>;
2611245431Sdimdef HEXAGON_M2_mpy_rnd_lh_s0:
2612234285Sdim  si_MInst_sisi_rnd_lh            <"mpy",     int_hexagon_M2_mpy_rnd_lh_s0>;
2613245431Sdimdef HEXAGON_M2_mpy_sat_rnd_lh_s0:
2614234285Sdim  si_MInst_sisi_sat_rnd_lh        <"mpy",     int_hexagon_M2_mpy_sat_rnd_lh_s0>;
2615245431Sdimdef HEXAGON_M2_mpy_sat_lh_s0:
2616234285Sdim  si_MInst_sisi_sat_lh            <"mpy",     int_hexagon_M2_mpy_sat_lh_s0>;
2617234285Sdim
2618245431Sdimdef HEXAGON_M2_mpy_ll_s0:
2619234285Sdim  si_MInst_sisi_ll                <"mpy",     int_hexagon_M2_mpy_ll_s0>;
2620245431Sdimdef HEXAGON_M2_mpy_ll_s1:
2621234285Sdim  si_MInst_sisi_ll_s1             <"mpy",     int_hexagon_M2_mpy_ll_s1>;
2622245431Sdimdef HEXAGON_M2_mpy_rnd_ll_s1:
2623234285Sdim  si_MInst_sisi_rnd_ll_s1         <"mpy",     int_hexagon_M2_mpy_rnd_ll_s1>;
2624245431Sdimdef HEXAGON_M2_mpy_sat_rnd_ll_s1:
2625234285Sdim  si_MInst_sisi_sat_rnd_ll_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_ll_s1>;
2626245431Sdimdef HEXAGON_M2_mpy_sat_ll_s1:
2627234285Sdim  si_MInst_sisi_sat_ll_s1         <"mpy",     int_hexagon_M2_mpy_sat_ll_s1>;
2628245431Sdimdef HEXAGON_M2_mpy_rnd_ll_s0:
2629234285Sdim  si_MInst_sisi_rnd_ll            <"mpy",     int_hexagon_M2_mpy_rnd_ll_s0>;
2630245431Sdimdef HEXAGON_M2_mpy_sat_rnd_ll_s0:
2631234285Sdim  si_MInst_sisi_sat_rnd_ll        <"mpy",     int_hexagon_M2_mpy_sat_rnd_ll_s0>;
2632245431Sdimdef HEXAGON_M2_mpy_sat_ll_s0:
2633234285Sdim  si_MInst_sisi_sat_ll            <"mpy",     int_hexagon_M2_mpy_sat_ll_s0>;
2634234285Sdim
2635234285Sdim//Rdd=mpy(Rs.[H|L],Rt.[H|L])[[:<<0|:<<1]|[:<<0:rnd|:<<1:rnd]]
2636245431Sdimdef HEXAGON_M2_mpyd_hh_s0:
2637234285Sdim  di_MInst_sisi_hh                <"mpy",     int_hexagon_M2_mpyd_hh_s0>;
2638245431Sdimdef HEXAGON_M2_mpyd_hh_s1:
2639234285Sdim  di_MInst_sisi_hh_s1             <"mpy",     int_hexagon_M2_mpyd_hh_s1>;
2640245431Sdimdef HEXAGON_M2_mpyd_rnd_hh_s1:
2641234285Sdim  di_MInst_sisi_rnd_hh_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_hh_s1>;
2642245431Sdimdef HEXAGON_M2_mpyd_rnd_hh_s0:
2643234285Sdim  di_MInst_sisi_rnd_hh            <"mpy",     int_hexagon_M2_mpyd_rnd_hh_s0>;
2644234285Sdim
2645245431Sdimdef HEXAGON_M2_mpyd_hl_s0:
2646234285Sdim  di_MInst_sisi_hl                <"mpy",     int_hexagon_M2_mpyd_hl_s0>;
2647245431Sdimdef HEXAGON_M2_mpyd_hl_s1:
2648234285Sdim  di_MInst_sisi_hl_s1             <"mpy",     int_hexagon_M2_mpyd_hl_s1>;
2649245431Sdimdef HEXAGON_M2_mpyd_rnd_hl_s1:
2650234285Sdim  di_MInst_sisi_rnd_hl_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_hl_s1>;
2651245431Sdimdef HEXAGON_M2_mpyd_rnd_hl_s0:
2652234285Sdim  di_MInst_sisi_rnd_hl            <"mpy",     int_hexagon_M2_mpyd_rnd_hl_s0>;
2653234285Sdim
2654245431Sdimdef HEXAGON_M2_mpyd_lh_s0:
2655234285Sdim  di_MInst_sisi_lh                <"mpy",     int_hexagon_M2_mpyd_lh_s0>;
2656245431Sdimdef HEXAGON_M2_mpyd_lh_s1:
2657234285Sdim  di_MInst_sisi_lh_s1             <"mpy",     int_hexagon_M2_mpyd_lh_s1>;
2658245431Sdimdef HEXAGON_M2_mpyd_rnd_lh_s1:
2659234285Sdim  di_MInst_sisi_rnd_lh_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_lh_s1>;
2660245431Sdimdef HEXAGON_M2_mpyd_rnd_lh_s0:
2661234285Sdim  di_MInst_sisi_rnd_lh            <"mpy",     int_hexagon_M2_mpyd_rnd_lh_s0>;
2662234285Sdim
2663245431Sdimdef HEXAGON_M2_mpyd_ll_s0:
2664234285Sdim  di_MInst_sisi_ll                <"mpy",     int_hexagon_M2_mpyd_ll_s0>;
2665245431Sdimdef HEXAGON_M2_mpyd_ll_s1:
2666234285Sdim  di_MInst_sisi_ll_s1             <"mpy",     int_hexagon_M2_mpyd_ll_s1>;
2667245431Sdimdef HEXAGON_M2_mpyd_rnd_ll_s1:
2668234285Sdim  di_MInst_sisi_rnd_ll_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_ll_s1>;
2669245431Sdimdef HEXAGON_M2_mpyd_rnd_ll_s0:
2670234285Sdim  di_MInst_sisi_rnd_ll            <"mpy",     int_hexagon_M2_mpyd_rnd_ll_s0>;
2671234285Sdim
2672234285Sdim//Rx+=mpy(Rs.[H|L],Rt.[H|L])[[[:<<0|:<<1]|[:<<0:sat|:<<1:sat]]
2673245431Sdimdef HEXAGON_M2_mpy_acc_hh_s0:
2674234285Sdim  si_MInst_sisisi_acc_hh            <"mpy",  int_hexagon_M2_mpy_acc_hh_s0>;
2675245431Sdimdef HEXAGON_M2_mpy_acc_hh_s1:
2676234285Sdim  si_MInst_sisisi_acc_hh_s1         <"mpy",  int_hexagon_M2_mpy_acc_hh_s1>;
2677245431Sdimdef HEXAGON_M2_mpy_acc_sat_hh_s1:
2678234285Sdim  si_MInst_sisisi_acc_sat_hh_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_hh_s1>;
2679245431Sdimdef HEXAGON_M2_mpy_acc_sat_hh_s0:
2680234285Sdim  si_MInst_sisisi_acc_sat_hh        <"mpy",  int_hexagon_M2_mpy_acc_sat_hh_s0>;
2681234285Sdim
2682245431Sdimdef HEXAGON_M2_mpy_acc_hl_s0:
2683234285Sdim  si_MInst_sisisi_acc_hl            <"mpy",  int_hexagon_M2_mpy_acc_hl_s0>;
2684245431Sdimdef HEXAGON_M2_mpy_acc_hl_s1:
2685234285Sdim  si_MInst_sisisi_acc_hl_s1         <"mpy",  int_hexagon_M2_mpy_acc_hl_s1>;
2686245431Sdimdef HEXAGON_M2_mpy_acc_sat_hl_s1:
2687234285Sdim  si_MInst_sisisi_acc_sat_hl_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_hl_s1>;
2688245431Sdimdef HEXAGON_M2_mpy_acc_sat_hl_s0:
2689234285Sdim  si_MInst_sisisi_acc_sat_hl        <"mpy",  int_hexagon_M2_mpy_acc_sat_hl_s0>;
2690234285Sdim
2691245431Sdimdef HEXAGON_M2_mpy_acc_lh_s0:
2692234285Sdim  si_MInst_sisisi_acc_lh            <"mpy",  int_hexagon_M2_mpy_acc_lh_s0>;
2693245431Sdimdef HEXAGON_M2_mpy_acc_lh_s1:
2694234285Sdim  si_MInst_sisisi_acc_lh_s1         <"mpy",  int_hexagon_M2_mpy_acc_lh_s1>;
2695245431Sdimdef HEXAGON_M2_mpy_acc_sat_lh_s1:
2696234285Sdim  si_MInst_sisisi_acc_sat_lh_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_lh_s1>;
2697245431Sdimdef HEXAGON_M2_mpy_acc_sat_lh_s0:
2698234285Sdim  si_MInst_sisisi_acc_sat_lh        <"mpy",  int_hexagon_M2_mpy_acc_sat_lh_s0>;
2699234285Sdim
2700245431Sdimdef HEXAGON_M2_mpy_acc_ll_s0:
2701234285Sdim  si_MInst_sisisi_acc_ll            <"mpy",  int_hexagon_M2_mpy_acc_ll_s0>;
2702245431Sdimdef HEXAGON_M2_mpy_acc_ll_s1:
2703234285Sdim  si_MInst_sisisi_acc_ll_s1         <"mpy",  int_hexagon_M2_mpy_acc_ll_s1>;
2704245431Sdimdef HEXAGON_M2_mpy_acc_sat_ll_s1:
2705234285Sdim  si_MInst_sisisi_acc_sat_ll_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_ll_s1>;
2706245431Sdimdef HEXAGON_M2_mpy_acc_sat_ll_s0:
2707234285Sdim  si_MInst_sisisi_acc_sat_ll        <"mpy",  int_hexagon_M2_mpy_acc_sat_ll_s0>;
2708234285Sdim
2709234285Sdim//Rx-=mpy(Rs.[H|L],Rt.[H|L])[[[:<<0|:<<1]|[:<<0:sat|:<<1:sat]]
2710245431Sdimdef HEXAGON_M2_mpy_nac_hh_s0:
2711234285Sdim  si_MInst_sisisi_nac_hh            <"mpy",  int_hexagon_M2_mpy_nac_hh_s0>;
2712245431Sdimdef HEXAGON_M2_mpy_nac_hh_s1:
2713234285Sdim  si_MInst_sisisi_nac_hh_s1         <"mpy",  int_hexagon_M2_mpy_nac_hh_s1>;
2714245431Sdimdef HEXAGON_M2_mpy_nac_sat_hh_s1:
2715234285Sdim  si_MInst_sisisi_nac_sat_hh_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_hh_s1>;
2716245431Sdimdef HEXAGON_M2_mpy_nac_sat_hh_s0:
2717234285Sdim  si_MInst_sisisi_nac_sat_hh        <"mpy",  int_hexagon_M2_mpy_nac_sat_hh_s0>;
2718234285Sdim
2719245431Sdimdef HEXAGON_M2_mpy_nac_hl_s0:
2720234285Sdim  si_MInst_sisisi_nac_hl            <"mpy",  int_hexagon_M2_mpy_nac_hl_s0>;
2721245431Sdimdef HEXAGON_M2_mpy_nac_hl_s1:
2722234285Sdim  si_MInst_sisisi_nac_hl_s1         <"mpy",  int_hexagon_M2_mpy_nac_hl_s1>;
2723245431Sdimdef HEXAGON_M2_mpy_nac_sat_hl_s1:
2724234285Sdim  si_MInst_sisisi_nac_sat_hl_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_hl_s1>;
2725245431Sdimdef HEXAGON_M2_mpy_nac_sat_hl_s0:
2726234285Sdim  si_MInst_sisisi_nac_sat_hl        <"mpy",  int_hexagon_M2_mpy_nac_sat_hl_s0>;
2727234285Sdim
2728245431Sdimdef HEXAGON_M2_mpy_nac_lh_s0:
2729234285Sdim  si_MInst_sisisi_nac_lh            <"mpy",  int_hexagon_M2_mpy_nac_lh_s0>;
2730245431Sdimdef HEXAGON_M2_mpy_nac_lh_s1:
2731234285Sdim  si_MInst_sisisi_nac_lh_s1         <"mpy",  int_hexagon_M2_mpy_nac_lh_s1>;
2732245431Sdimdef HEXAGON_M2_mpy_nac_sat_lh_s1:
2733234285Sdim  si_MInst_sisisi_nac_sat_lh_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_lh_s1>;
2734245431Sdimdef HEXAGON_M2_mpy_nac_sat_lh_s0:
2735234285Sdim  si_MInst_sisisi_nac_sat_lh        <"mpy",  int_hexagon_M2_mpy_nac_sat_lh_s0>;
2736234285Sdim
2737245431Sdimdef HEXAGON_M2_mpy_nac_ll_s0:
2738234285Sdim  si_MInst_sisisi_nac_ll            <"mpy",  int_hexagon_M2_mpy_nac_ll_s0>;
2739245431Sdimdef HEXAGON_M2_mpy_nac_ll_s1:
2740234285Sdim  si_MInst_sisisi_nac_ll_s1         <"mpy",  int_hexagon_M2_mpy_nac_ll_s1>;
2741245431Sdimdef HEXAGON_M2_mpy_nac_sat_ll_s1:
2742234285Sdim  si_MInst_sisisi_nac_sat_ll_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_ll_s1>;
2743245431Sdimdef HEXAGON_M2_mpy_nac_sat_ll_s0:
2744234285Sdim  si_MInst_sisisi_nac_sat_ll        <"mpy",  int_hexagon_M2_mpy_nac_sat_ll_s0>;
2745234285Sdim
2746234285Sdim//Rx+=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]
2747245431Sdimdef HEXAGON_M2_mpyd_acc_hh_s0:
2748234285Sdim  di_MInst_disisi_acc_hh          <"mpy",    int_hexagon_M2_mpyd_acc_hh_s0>;
2749245431Sdimdef HEXAGON_M2_mpyd_acc_hh_s1:
2750234285Sdim  di_MInst_disisi_acc_hh_s1       <"mpy",    int_hexagon_M2_mpyd_acc_hh_s1>;
2751234285Sdim
2752245431Sdimdef HEXAGON_M2_mpyd_acc_hl_s0:
2753234285Sdim  di_MInst_disisi_acc_hl          <"mpy",    int_hexagon_M2_mpyd_acc_hl_s0>;
2754245431Sdimdef HEXAGON_M2_mpyd_acc_hl_s1:
2755234285Sdim  di_MInst_disisi_acc_hl_s1       <"mpy",    int_hexagon_M2_mpyd_acc_hl_s1>;
2756234285Sdim
2757245431Sdimdef HEXAGON_M2_mpyd_acc_lh_s0:
2758234285Sdim  di_MInst_disisi_acc_lh          <"mpy",    int_hexagon_M2_mpyd_acc_lh_s0>;
2759245431Sdimdef HEXAGON_M2_mpyd_acc_lh_s1:
2760234285Sdim  di_MInst_disisi_acc_lh_s1       <"mpy",    int_hexagon_M2_mpyd_acc_lh_s1>;
2761234285Sdim
2762245431Sdimdef HEXAGON_M2_mpyd_acc_ll_s0:
2763234285Sdim  di_MInst_disisi_acc_ll          <"mpy",    int_hexagon_M2_mpyd_acc_ll_s0>;
2764245431Sdimdef HEXAGON_M2_mpyd_acc_ll_s1:
2765234285Sdim  di_MInst_disisi_acc_ll_s1       <"mpy",    int_hexagon_M2_mpyd_acc_ll_s1>;
2766234285Sdim
2767234285Sdim//Rx-=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]
2768245431Sdimdef HEXAGON_M2_mpyd_nac_hh_s0:
2769234285Sdim  di_MInst_disisi_nac_hh          <"mpy",    int_hexagon_M2_mpyd_nac_hh_s0>;
2770245431Sdimdef HEXAGON_M2_mpyd_nac_hh_s1:
2771234285Sdim  di_MInst_disisi_nac_hh_s1       <"mpy",    int_hexagon_M2_mpyd_nac_hh_s1>;
2772234285Sdim
2773245431Sdimdef HEXAGON_M2_mpyd_nac_hl_s0:
2774234285Sdim  di_MInst_disisi_nac_hl          <"mpy",    int_hexagon_M2_mpyd_nac_hl_s0>;
2775245431Sdimdef HEXAGON_M2_mpyd_nac_hl_s1:
2776234285Sdim  di_MInst_disisi_nac_hl_s1       <"mpy",    int_hexagon_M2_mpyd_nac_hl_s1>;
2777234285Sdim
2778245431Sdimdef HEXAGON_M2_mpyd_nac_lh_s0:
2779234285Sdim  di_MInst_disisi_nac_lh          <"mpy",    int_hexagon_M2_mpyd_nac_lh_s0>;
2780245431Sdimdef HEXAGON_M2_mpyd_nac_lh_s1:
2781234285Sdim  di_MInst_disisi_nac_lh_s1       <"mpy",    int_hexagon_M2_mpyd_nac_lh_s1>;
2782234285Sdim
2783245431Sdimdef HEXAGON_M2_mpyd_nac_ll_s0:
2784234285Sdim  di_MInst_disisi_nac_ll          <"mpy",    int_hexagon_M2_mpyd_nac_ll_s0>;
2785245431Sdimdef HEXAGON_M2_mpyd_nac_ll_s1:
2786234285Sdim  di_MInst_disisi_nac_ll_s1       <"mpy",    int_hexagon_M2_mpyd_nac_ll_s1>;
2787234285Sdim
2788234285Sdim// MTYPE / MPYS / Scalar 16x16 multiply unsigned.
2789234285Sdim//Rd=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
2790245431Sdimdef HEXAGON_M2_mpyu_hh_s0:
2791234285Sdim  si_MInst_sisi_hh                <"mpyu",    int_hexagon_M2_mpyu_hh_s0>;
2792245431Sdimdef HEXAGON_M2_mpyu_hh_s1:
2793234285Sdim  si_MInst_sisi_hh_s1             <"mpyu",    int_hexagon_M2_mpyu_hh_s1>;
2794245431Sdimdef HEXAGON_M2_mpyu_hl_s0:
2795234285Sdim  si_MInst_sisi_hl                <"mpyu",    int_hexagon_M2_mpyu_hl_s0>;
2796245431Sdimdef HEXAGON_M2_mpyu_hl_s1:
2797234285Sdim  si_MInst_sisi_hl_s1             <"mpyu",    int_hexagon_M2_mpyu_hl_s1>;
2798245431Sdimdef HEXAGON_M2_mpyu_lh_s0:
2799234285Sdim  si_MInst_sisi_lh                <"mpyu",    int_hexagon_M2_mpyu_lh_s0>;
2800245431Sdimdef HEXAGON_M2_mpyu_lh_s1:
2801234285Sdim  si_MInst_sisi_lh_s1             <"mpyu",    int_hexagon_M2_mpyu_lh_s1>;
2802245431Sdimdef HEXAGON_M2_mpyu_ll_s0:
2803234285Sdim  si_MInst_sisi_ll                <"mpyu",    int_hexagon_M2_mpyu_ll_s0>;
2804245431Sdimdef HEXAGON_M2_mpyu_ll_s1:
2805234285Sdim  si_MInst_sisi_ll_s1             <"mpyu",    int_hexagon_M2_mpyu_ll_s1>;
2806234285Sdim
2807234285Sdim//Rdd=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
2808245431Sdimdef HEXAGON_M2_mpyud_hh_s0:
2809234285Sdim  di_MInst_sisi_hh                <"mpyu",    int_hexagon_M2_mpyud_hh_s0>;
2810245431Sdimdef HEXAGON_M2_mpyud_hh_s1:
2811234285Sdim  di_MInst_sisi_hh_s1             <"mpyu",    int_hexagon_M2_mpyud_hh_s1>;
2812245431Sdimdef HEXAGON_M2_mpyud_hl_s0:
2813234285Sdim  di_MInst_sisi_hl                <"mpyu",    int_hexagon_M2_mpyud_hl_s0>;
2814245431Sdimdef HEXAGON_M2_mpyud_hl_s1:
2815234285Sdim  di_MInst_sisi_hl_s1             <"mpyu",    int_hexagon_M2_mpyud_hl_s1>;
2816245431Sdimdef HEXAGON_M2_mpyud_lh_s0:
2817234285Sdim  di_MInst_sisi_lh                <"mpyu",    int_hexagon_M2_mpyud_lh_s0>;
2818245431Sdimdef HEXAGON_M2_mpyud_lh_s1:
2819234285Sdim  di_MInst_sisi_lh_s1             <"mpyu",    int_hexagon_M2_mpyud_lh_s1>;
2820245431Sdimdef HEXAGON_M2_mpyud_ll_s0:
2821234285Sdim  di_MInst_sisi_ll                <"mpyu",    int_hexagon_M2_mpyud_ll_s0>;
2822245431Sdimdef HEXAGON_M2_mpyud_ll_s1:
2823234285Sdim  di_MInst_sisi_ll_s1             <"mpyu",    int_hexagon_M2_mpyud_ll_s1>;
2824234285Sdim
2825234285Sdim//Rd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
2826245431Sdimdef HEXAGON_M2_mpyu_acc_hh_s0:
2827234285Sdim  si_MInst_sisisi_acc_hh            <"mpyu",    int_hexagon_M2_mpyu_acc_hh_s0>;
2828245431Sdimdef HEXAGON_M2_mpyu_acc_hh_s1:
2829234285Sdim  si_MInst_sisisi_acc_hh_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_hh_s1>;
2830245431Sdimdef HEXAGON_M2_mpyu_acc_hl_s0:
2831234285Sdim  si_MInst_sisisi_acc_hl            <"mpyu",    int_hexagon_M2_mpyu_acc_hl_s0>;
2832245431Sdimdef HEXAGON_M2_mpyu_acc_hl_s1:
2833234285Sdim  si_MInst_sisisi_acc_hl_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_hl_s1>;
2834245431Sdimdef HEXAGON_M2_mpyu_acc_lh_s0:
2835234285Sdim  si_MInst_sisisi_acc_lh            <"mpyu",    int_hexagon_M2_mpyu_acc_lh_s0>;
2836245431Sdimdef HEXAGON_M2_mpyu_acc_lh_s1:
2837234285Sdim  si_MInst_sisisi_acc_lh_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_lh_s1>;
2838245431Sdimdef HEXAGON_M2_mpyu_acc_ll_s0:
2839234285Sdim  si_MInst_sisisi_acc_ll            <"mpyu",    int_hexagon_M2_mpyu_acc_ll_s0>;
2840245431Sdimdef HEXAGON_M2_mpyu_acc_ll_s1:
2841234285Sdim  si_MInst_sisisi_acc_ll_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_ll_s1>;
2842234285Sdim
2843234285Sdim//Rd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
2844245431Sdimdef HEXAGON_M2_mpyu_nac_hh_s0:
2845234285Sdim  si_MInst_sisisi_nac_hh            <"mpyu",    int_hexagon_M2_mpyu_nac_hh_s0>;
2846245431Sdimdef HEXAGON_M2_mpyu_nac_hh_s1:
2847234285Sdim  si_MInst_sisisi_nac_hh_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_hh_s1>;
2848245431Sdimdef HEXAGON_M2_mpyu_nac_hl_s0:
2849234285Sdim  si_MInst_sisisi_nac_hl            <"mpyu",    int_hexagon_M2_mpyu_nac_hl_s0>;
2850245431Sdimdef HEXAGON_M2_mpyu_nac_hl_s1:
2851234285Sdim  si_MInst_sisisi_nac_hl_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_hl_s1>;
2852245431Sdimdef HEXAGON_M2_mpyu_nac_lh_s0:
2853234285Sdim  si_MInst_sisisi_nac_lh            <"mpyu",    int_hexagon_M2_mpyu_nac_lh_s0>;
2854245431Sdimdef HEXAGON_M2_mpyu_nac_lh_s1:
2855234285Sdim  si_MInst_sisisi_nac_lh_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_lh_s1>;
2856245431Sdimdef HEXAGON_M2_mpyu_nac_ll_s0:
2857234285Sdim  si_MInst_sisisi_nac_ll            <"mpyu",    int_hexagon_M2_mpyu_nac_ll_s0>;
2858245431Sdimdef HEXAGON_M2_mpyu_nac_ll_s1:
2859234285Sdim  si_MInst_sisisi_nac_ll_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_ll_s1>;
2860234285Sdim
2861234285Sdim//Rdd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
2862245431Sdimdef HEXAGON_M2_mpyud_acc_hh_s0:
2863234285Sdim  di_MInst_disisi_acc_hh            <"mpyu", int_hexagon_M2_mpyud_acc_hh_s0>;
2864245431Sdimdef HEXAGON_M2_mpyud_acc_hh_s1:
2865234285Sdim  di_MInst_disisi_acc_hh_s1         <"mpyu", int_hexagon_M2_mpyud_acc_hh_s1>;
2866245431Sdimdef HEXAGON_M2_mpyud_acc_hl_s0:
2867234285Sdim  di_MInst_disisi_acc_hl            <"mpyu", int_hexagon_M2_mpyud_acc_hl_s0>;
2868245431Sdimdef HEXAGON_M2_mpyud_acc_hl_s1:
2869234285Sdim  di_MInst_disisi_acc_hl_s1         <"mpyu", int_hexagon_M2_mpyud_acc_hl_s1>;
2870245431Sdimdef HEXAGON_M2_mpyud_acc_lh_s0:
2871234285Sdim  di_MInst_disisi_acc_lh            <"mpyu", int_hexagon_M2_mpyud_acc_lh_s0>;
2872245431Sdimdef HEXAGON_M2_mpyud_acc_lh_s1:
2873234285Sdim  di_MInst_disisi_acc_lh_s1         <"mpyu", int_hexagon_M2_mpyud_acc_lh_s1>;
2874245431Sdimdef HEXAGON_M2_mpyud_acc_ll_s0:
2875234285Sdim  di_MInst_disisi_acc_ll            <"mpyu", int_hexagon_M2_mpyud_acc_ll_s0>;
2876245431Sdimdef HEXAGON_M2_mpyud_acc_ll_s1:
2877234285Sdim  di_MInst_disisi_acc_ll_s1         <"mpyu", int_hexagon_M2_mpyud_acc_ll_s1>;
2878234285Sdim
2879234285Sdim//Rdd-=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
2880245431Sdimdef HEXAGON_M2_mpyud_nac_hh_s0:
2881234285Sdim  di_MInst_disisi_nac_hh            <"mpyu", int_hexagon_M2_mpyud_nac_hh_s0>;
2882245431Sdimdef HEXAGON_M2_mpyud_nac_hh_s1:
2883234285Sdim  di_MInst_disisi_nac_hh_s1         <"mpyu", int_hexagon_M2_mpyud_nac_hh_s1>;
2884245431Sdimdef HEXAGON_M2_mpyud_nac_hl_s0:
2885234285Sdim  di_MInst_disisi_nac_hl            <"mpyu", int_hexagon_M2_mpyud_nac_hl_s0>;
2886245431Sdimdef HEXAGON_M2_mpyud_nac_hl_s1:
2887234285Sdim  di_MInst_disisi_nac_hl_s1         <"mpyu", int_hexagon_M2_mpyud_nac_hl_s1>;
2888245431Sdimdef HEXAGON_M2_mpyud_nac_lh_s0:
2889234285Sdim  di_MInst_disisi_nac_lh            <"mpyu", int_hexagon_M2_mpyud_nac_lh_s0>;
2890245431Sdimdef HEXAGON_M2_mpyud_nac_lh_s1:
2891234285Sdim  di_MInst_disisi_nac_lh_s1         <"mpyu", int_hexagon_M2_mpyud_nac_lh_s1>;
2892245431Sdimdef HEXAGON_M2_mpyud_nac_ll_s0:
2893234285Sdim  di_MInst_disisi_nac_ll            <"mpyu", int_hexagon_M2_mpyud_nac_ll_s0>;
2894245431Sdimdef HEXAGON_M2_mpyud_nac_ll_s1:
2895234285Sdim  di_MInst_disisi_nac_ll_s1         <"mpyu", int_hexagon_M2_mpyud_nac_ll_s1>;
2896234285Sdim
2897234285Sdim
2898234285Sdim/********************************************************************
2899234285Sdim*            MTYPE/VB                                               *
2900234285Sdim*********************************************************************/
2901234285Sdim
2902234285Sdim// MTYPE / VB / Vector reduce add unsigned bytes.
2903245431Sdimdef HEXAGON_A2_vraddub:
2904234285Sdim  di_MInst_didi                   <"vraddub", int_hexagon_A2_vraddub>;
2905245431Sdimdef HEXAGON_A2_vraddub_acc:
2906234285Sdim  di_MInst_dididi_acc             <"vraddub", int_hexagon_A2_vraddub_acc>;
2907234285Sdim
2908234285Sdim// MTYPE / VB / Vector sum of absolute differences unsigned bytes.
2909245431Sdimdef HEXAGON_A2_vrsadub:
2910234285Sdim  di_MInst_didi                   <"vrsadub", int_hexagon_A2_vrsadub>;
2911245431Sdimdef HEXAGON_A2_vrsadub_acc:
2912234285Sdim  di_MInst_dididi_acc             <"vrsadub", int_hexagon_A2_vrsadub_acc>;
2913234285Sdim
2914234285Sdim/********************************************************************
2915234285Sdim*            MTYPE/VH                                               *
2916234285Sdim*********************************************************************/
2917234285Sdim
2918234285Sdim// MTYPE / VH / Vector dual multiply.
2919245431Sdimdef HEXAGON_M2_vdmpys_s1:
2920234285Sdim  di_MInst_didi_s1_sat            <"vdmpy",   int_hexagon_M2_vdmpys_s1>;
2921245431Sdimdef HEXAGON_M2_vdmpys_s0:
2922234285Sdim  di_MInst_didi_sat               <"vdmpy",   int_hexagon_M2_vdmpys_s0>;
2923245431Sdimdef HEXAGON_M2_vdmacs_s1:
2924234285Sdim  di_MInst_dididi_acc_s1_sat      <"vdmpy",   int_hexagon_M2_vdmacs_s1>;
2925245431Sdimdef HEXAGON_M2_vdmacs_s0:
2926234285Sdim  di_MInst_dididi_acc_sat         <"vdmpy",   int_hexagon_M2_vdmacs_s0>;
2927234285Sdim
2928234285Sdim// MTYPE / VH / Vector dual multiply with round and pack.
2929245431Sdimdef HEXAGON_M2_vdmpyrs_s0:
2930234285Sdim  si_MInst_didi_rnd_sat           <"vdmpy",   int_hexagon_M2_vdmpyrs_s0>;
2931245431Sdimdef HEXAGON_M2_vdmpyrs_s1:
2932234285Sdim  si_MInst_didi_s1_rnd_sat        <"vdmpy",   int_hexagon_M2_vdmpyrs_s1>;
2933234285Sdim
2934234285Sdim// MTYPE / VH / Vector multiply even halfwords.
2935245431Sdimdef HEXAGON_M2_vmpy2es_s1:
2936234285Sdim  di_MInst_didi_s1_sat            <"vmpyeh",  int_hexagon_M2_vmpy2es_s1>;
2937245431Sdimdef HEXAGON_M2_vmpy2es_s0:
2938234285Sdim  di_MInst_didi_sat               <"vmpyeh",  int_hexagon_M2_vmpy2es_s0>;
2939245431Sdimdef HEXAGON_M2_vmac2es:
2940234285Sdim  di_MInst_dididi_acc             <"vmpyeh",  int_hexagon_M2_vmac2es>;
2941245431Sdimdef HEXAGON_M2_vmac2es_s1:
2942234285Sdim  di_MInst_dididi_acc_s1_sat      <"vmpyeh",  int_hexagon_M2_vmac2es_s1>;
2943245431Sdimdef HEXAGON_M2_vmac2es_s0:
2944234285Sdim  di_MInst_dididi_acc_sat         <"vmpyeh",  int_hexagon_M2_vmac2es_s0>;
2945234285Sdim
2946234285Sdim// MTYPE / VH / Vector multiply halfwords.
2947245431Sdimdef HEXAGON_M2_vmpy2s_s0:
2948234285Sdim  di_MInst_sisi_sat               <"vmpyh",   int_hexagon_M2_vmpy2s_s0>;
2949245431Sdimdef HEXAGON_M2_vmpy2s_s1:
2950234285Sdim  di_MInst_sisi_s1_sat            <"vmpyh",   int_hexagon_M2_vmpy2s_s1>;
2951245431Sdimdef HEXAGON_M2_vmac2:
2952234285Sdim  di_MInst_disisi_acc             <"vmpyh",   int_hexagon_M2_vmac2>;
2953245431Sdimdef HEXAGON_M2_vmac2s_s0:
2954234285Sdim  di_MInst_disisi_acc_sat         <"vmpyh",   int_hexagon_M2_vmac2s_s0>;
2955245431Sdimdef HEXAGON_M2_vmac2s_s1:
2956234285Sdim  di_MInst_disisi_acc_s1_sat      <"vmpyh",   int_hexagon_M2_vmac2s_s1>;
2957234285Sdim
2958234285Sdim// MTYPE / VH / Vector multiply halfwords with round and pack.
2959245431Sdimdef HEXAGON_M2_vmpy2s_s0pack:
2960234285Sdim  si_MInst_sisi_rnd_sat           <"vmpyh",   int_hexagon_M2_vmpy2s_s0pack>;
2961245431Sdimdef HEXAGON_M2_vmpy2s_s1pack:
2962234285Sdim  si_MInst_sisi_s1_rnd_sat        <"vmpyh",   int_hexagon_M2_vmpy2s_s1pack>;
2963234285Sdim
2964234285Sdim// MTYPE / VH / Vector reduce multiply halfwords.
2965234285Sdim// Rxx32+=vrmpyh(Rss32,Rtt32)
2966245431Sdimdef HEXAGON_M2_vrmpy_s0:
2967234285Sdim  di_MInst_didi                   <"vrmpyh",  int_hexagon_M2_vrmpy_s0>;
2968245431Sdimdef HEXAGON_M2_vrmac_s0:
2969234285Sdim  di_MInst_dididi_acc             <"vrmpyh",  int_hexagon_M2_vrmac_s0>;
2970234285Sdim
2971234285Sdim
2972234285Sdim/********************************************************************
2973234285Sdim*            STYPE/ALU                                              *
2974234285Sdim*********************************************************************/
2975234285Sdim
2976234285Sdim// STYPE / ALU / Absolute value.
2977245431Sdimdef HEXAGON_A2_abs:
2978234285Sdim  si_SInst_si                     <"abs",     int_hexagon_A2_abs>;
2979245431Sdimdef HEXAGON_A2_absp:
2980234285Sdim  di_SInst_di                     <"abs",     int_hexagon_A2_absp>;
2981245431Sdimdef HEXAGON_A2_abssat:
2982234285Sdim  si_SInst_si_sat                 <"abs",     int_hexagon_A2_abssat>;
2983234285Sdim
2984234285Sdim// STYPE / ALU / Negate.
2985245431Sdimdef HEXAGON_A2_negp:
2986234285Sdim  di_SInst_di                     <"neg",     int_hexagon_A2_negp>;
2987245431Sdimdef HEXAGON_A2_negsat:
2988234285Sdim  si_SInst_si_sat                 <"neg",     int_hexagon_A2_negsat>;
2989234285Sdim
2990234285Sdim// STYPE / ALU / Logical Not.
2991245431Sdimdef HEXAGON_A2_notp:
2992234285Sdim  di_SInst_di                     <"not",     int_hexagon_A2_notp>;
2993234285Sdim
2994234285Sdim// STYPE / ALU / Sign extend word to doubleword.
2995245431Sdimdef HEXAGON_A2_sxtw:
2996234285Sdim  di_SInst_si                     <"sxtw",     int_hexagon_A2_sxtw>;
2997234285Sdim
2998234285Sdim
2999234285Sdim/********************************************************************
3000234285Sdim*            STYPE/BIT                                              *
3001234285Sdim*********************************************************************/
3002234285Sdim
3003234285Sdim// STYPE / BIT / Count leading.
3004245431Sdimdef HEXAGON_S2_cl0:
3005234285Sdim  si_SInst_si                     <"cl0",     int_hexagon_S2_cl0>;
3006245431Sdimdef HEXAGON_S2_cl0p:
3007234285Sdim  si_SInst_di                     <"cl0",     int_hexagon_S2_cl0p>;
3008245431Sdimdef HEXAGON_S2_cl1:
3009234285Sdim  si_SInst_si                     <"cl1",     int_hexagon_S2_cl1>;
3010245431Sdimdef HEXAGON_S2_cl1p:
3011234285Sdim  si_SInst_di                     <"cl1",     int_hexagon_S2_cl1p>;
3012245431Sdimdef HEXAGON_S2_clb:
3013234285Sdim  si_SInst_si                     <"clb",     int_hexagon_S2_clb>;
3014245431Sdimdef HEXAGON_S2_clbp:
3015234285Sdim  si_SInst_di                     <"clb",     int_hexagon_S2_clbp>;
3016245431Sdimdef HEXAGON_S2_clbnorm:
3017234285Sdim  si_SInst_si                     <"normamt", int_hexagon_S2_clbnorm>;
3018234285Sdim
3019234285Sdim// STYPE / BIT / Count trailing.
3020245431Sdimdef HEXAGON_S2_ct0:
3021234285Sdim  si_SInst_si                     <"ct0",     int_hexagon_S2_ct0>;
3022245431Sdimdef HEXAGON_S2_ct1:
3023234285Sdim  si_SInst_si                     <"ct1",     int_hexagon_S2_ct1>;
3024234285Sdim
3025234285Sdim// STYPE / BIT / Compare bit mask.
3026245431Sdimdef Hexagon_C2_bitsclr:
3027234285Sdim  qi_SInst_sisi                   <"bitsclr", int_hexagon_C2_bitsclr>;
3028245431Sdimdef Hexagon_C2_bitsclri:
3029234285Sdim  qi_SInst_siu6                   <"bitsclr", int_hexagon_C2_bitsclri>;
3030245431Sdimdef Hexagon_C2_bitsset:
3031234285Sdim  qi_SInst_sisi                   <"bitsset", int_hexagon_C2_bitsset>;
3032234285Sdim
3033234285Sdim// STYPE / BIT / Extract unsigned.
3034234285Sdim// Rd[d][32/64]=extractu(Rs[s],Rt[t],[imm])
3035245431Sdimdef HEXAGON_S2_extractu:
3036234285Sdim  si_SInst_siu5u5                 <"extractu",int_hexagon_S2_extractu>;
3037245431Sdimdef HEXAGON_S2_extractu_rp:
3038234285Sdim  si_SInst_sidi                   <"extractu",int_hexagon_S2_extractu_rp>;
3039245431Sdimdef HEXAGON_S2_extractup:
3040234285Sdim  di_SInst_diu6u6                 <"extractu",int_hexagon_S2_extractup>;
3041245431Sdimdef HEXAGON_S2_extractup_rp:
3042234285Sdim  di_SInst_didi                   <"extractu",int_hexagon_S2_extractup_rp>;
3043234285Sdim
3044234285Sdim// STYPE / BIT / Insert bitfield.
3045245431Sdimdef Hexagon_S2_insert:
3046234285Sdim  si_SInst_sisiu5u5               <"insert",  int_hexagon_S2_insert>;
3047245431Sdimdef Hexagon_S2_insert_rp:
3048234285Sdim  si_SInst_sisidi                 <"insert",  int_hexagon_S2_insert_rp>;
3049245431Sdimdef Hexagon_S2_insertp:
3050234285Sdim  di_SInst_didiu6u6               <"insert",  int_hexagon_S2_insertp>;
3051245431Sdimdef Hexagon_S2_insertp_rp:
3052234285Sdim  di_SInst_dididi                 <"insert",  int_hexagon_S2_insertp_rp>;
3053234285Sdim
3054234285Sdim// STYPE / BIT / Innterleave/deinterleave.
3055245431Sdimdef Hexagon_S2_interleave:
3056234285Sdim  di_SInst_di                     <"interleave", int_hexagon_S2_interleave>;
3057245431Sdimdef Hexagon_S2_deinterleave:
3058234285Sdim  di_SInst_di                     <"deinterleave", int_hexagon_S2_deinterleave>;
3059234285Sdim
3060234285Sdim// STYPE / BIT / Linear feedback-shift Iteration.
3061245431Sdimdef Hexagon_S2_lfsp:
3062234285Sdim  di_SInst_didi                   <"lfs",     int_hexagon_S2_lfsp>;
3063234285Sdim
3064234285Sdim// STYPE / BIT / Bit reverse.
3065245431Sdimdef Hexagon_S2_brev:
3066234285Sdim  si_SInst_si                     <"brev",    int_hexagon_S2_brev>;
3067234285Sdim
3068234285Sdim// STYPE / BIT / Set/Clear/Toggle Bit.
3069245431Sdimdef HEXAGON_S2_setbit_i:
3070234285Sdim  si_SInst_siu5                   <"setbit",  int_hexagon_S2_setbit_i>;
3071245431Sdimdef HEXAGON_S2_togglebit_i:
3072234285Sdim  si_SInst_siu5                   <"togglebit", int_hexagon_S2_togglebit_i>;
3073245431Sdimdef HEXAGON_S2_clrbit_i:
3074234285Sdim  si_SInst_siu5                   <"clrbit",  int_hexagon_S2_clrbit_i>;
3075245431Sdimdef HEXAGON_S2_setbit_r:
3076234285Sdim  si_SInst_sisi                   <"setbit",  int_hexagon_S2_setbit_r>;
3077245431Sdimdef HEXAGON_S2_togglebit_r:
3078234285Sdim  si_SInst_sisi                   <"togglebit", int_hexagon_S2_togglebit_r>;
3079245431Sdimdef HEXAGON_S2_clrbit_r:
3080234285Sdim  si_SInst_sisi                   <"clrbit",  int_hexagon_S2_clrbit_r>;
3081234285Sdim
3082234285Sdim// STYPE / BIT / Test Bit.
3083245431Sdimdef HEXAGON_S2_tstbit_i:
3084234285Sdim  qi_SInst_siu5                   <"tstbit",  int_hexagon_S2_tstbit_i>;
3085245431Sdimdef HEXAGON_S2_tstbit_r:
3086234285Sdim  qi_SInst_sisi                   <"tstbit",  int_hexagon_S2_tstbit_r>;
3087234285Sdim
3088234285Sdim
3089234285Sdim/********************************************************************
3090234285Sdim*            STYPE/COMPLEX                                          *
3091234285Sdim*********************************************************************/
3092234285Sdim
3093234285Sdim// STYPE / COMPLEX / Vector Complex conjugate.
3094245431Sdimdef HEXAGON_A2_vconj:
3095234285Sdim  di_SInst_di_sat                 <"vconj",   int_hexagon_A2_vconj>;
3096234285Sdim
3097234285Sdim// STYPE / COMPLEX / Vector Complex rotate.
3098245431Sdimdef HEXAGON_S2_vcrotate:
3099234285Sdim  di_SInst_disi                   <"vcrotate",int_hexagon_S2_vcrotate>;
3100234285Sdim
3101234285Sdim
3102234285Sdim/********************************************************************
3103234285Sdim*            STYPE/PERM                                             *
3104234285Sdim*********************************************************************/
3105234285Sdim
3106234285Sdim// STYPE / PERM / Saturate.
3107245431Sdimdef HEXAGON_A2_sat:
3108234285Sdim  si_SInst_di                     <"sat",     int_hexagon_A2_sat>;
3109245431Sdimdef HEXAGON_A2_satb:
3110234285Sdim  si_SInst_si                     <"satb",    int_hexagon_A2_satb>;
3111245431Sdimdef HEXAGON_A2_sath:
3112234285Sdim  si_SInst_si                     <"sath",    int_hexagon_A2_sath>;
3113245431Sdimdef HEXAGON_A2_satub:
3114234285Sdim  si_SInst_si                     <"satub",   int_hexagon_A2_satub>;
3115245431Sdimdef HEXAGON_A2_satuh:
3116234285Sdim  si_SInst_si                     <"satuh",   int_hexagon_A2_satuh>;
3117234285Sdim
3118234285Sdim// STYPE / PERM / Swizzle bytes.
3119245431Sdimdef HEXAGON_A2_swiz:
3120234285Sdim  si_SInst_si                     <"swiz",    int_hexagon_A2_swiz>;
3121234285Sdim
3122234285Sdim// STYPE / PERM / Vector align.
3123234285Sdim// Need custom lowering
3124245431Sdimdef HEXAGON_S2_valignib:
3125234285Sdim  di_SInst_didiu3                 <"valignb", int_hexagon_S2_valignib>;
3126245431Sdimdef HEXAGON_S2_valignrb:
3127234285Sdim  di_SInst_didiqi                 <"valignb", int_hexagon_S2_valignrb>;
3128234285Sdim
3129234285Sdim// STYPE / PERM / Vector round and pack.
3130245431Sdimdef HEXAGON_S2_vrndpackwh:
3131234285Sdim  si_SInst_di                     <"vrndwh",  int_hexagon_S2_vrndpackwh>;
3132245431Sdimdef HEXAGON_S2_vrndpackwhs:
3133234285Sdim  si_SInst_di_sat                 <"vrndwh",  int_hexagon_S2_vrndpackwhs>;
3134234285Sdim
3135234285Sdim// STYPE / PERM / Vector saturate and pack.
3136245431Sdimdef HEXAGON_S2_svsathb:
3137234285Sdim  si_SInst_si                     <"vsathb",  int_hexagon_S2_svsathb>;
3138245431Sdimdef HEXAGON_S2_vsathb:
3139234285Sdim  si_SInst_di                     <"vsathb",  int_hexagon_S2_vsathb>;
3140245431Sdimdef HEXAGON_S2_svsathub:
3141234285Sdim  si_SInst_si                     <"vsathub", int_hexagon_S2_svsathub>;
3142245431Sdimdef HEXAGON_S2_vsathub:
3143234285Sdim  si_SInst_di                     <"vsathub", int_hexagon_S2_vsathub>;
3144245431Sdimdef HEXAGON_S2_vsatwh:
3145234285Sdim  si_SInst_di                     <"vsatwh",  int_hexagon_S2_vsatwh>;
3146245431Sdimdef HEXAGON_S2_vsatwuh:
3147234285Sdim  si_SInst_di                     <"vsatwuh", int_hexagon_S2_vsatwuh>;
3148234285Sdim
3149234285Sdim// STYPE / PERM / Vector saturate without pack.
3150245431Sdimdef HEXAGON_S2_vsathb_nopack:
3151234285Sdim  di_SInst_di                     <"vsathb",  int_hexagon_S2_vsathb_nopack>;
3152245431Sdimdef HEXAGON_S2_vsathub_nopack:
3153234285Sdim  di_SInst_di                     <"vsathub", int_hexagon_S2_vsathub_nopack>;
3154245431Sdimdef HEXAGON_S2_vsatwh_nopack:
3155234285Sdim  di_SInst_di                     <"vsatwh",  int_hexagon_S2_vsatwh_nopack>;
3156245431Sdimdef HEXAGON_S2_vsatwuh_nopack:
3157234285Sdim  di_SInst_di                     <"vsatwuh", int_hexagon_S2_vsatwuh_nopack>;
3158234285Sdim
3159234285Sdim// STYPE / PERM / Vector shuffle.
3160245431Sdimdef HEXAGON_S2_shuffeb:
3161234285Sdim  di_SInst_didi                   <"shuffeb", int_hexagon_S2_shuffeb>;
3162245431Sdimdef HEXAGON_S2_shuffeh:
3163234285Sdim  di_SInst_didi                   <"shuffeh", int_hexagon_S2_shuffeh>;
3164245431Sdimdef HEXAGON_S2_shuffob:
3165234285Sdim  di_SInst_didi                   <"shuffob", int_hexagon_S2_shuffob>;
3166245431Sdimdef HEXAGON_S2_shuffoh:
3167234285Sdim  di_SInst_didi                   <"shuffoh", int_hexagon_S2_shuffoh>;
3168234285Sdim
3169234285Sdim// STYPE / PERM / Vector splat bytes.
3170245431Sdimdef HEXAGON_S2_vsplatrb:
3171234285Sdim  si_SInst_si                     <"vsplatb", int_hexagon_S2_vsplatrb>;
3172234285Sdim
3173234285Sdim// STYPE / PERM / Vector splat halfwords.
3174245431Sdimdef HEXAGON_S2_vsplatrh:
3175234285Sdim  di_SInst_si                     <"vsplath", int_hexagon_S2_vsplatrh>;
3176234285Sdim
3177234285Sdim// STYPE / PERM / Vector splice.
3178245431Sdimdef Hexagon_S2_vsplicerb:
3179234285Sdim  di_SInst_didiqi                 <"vspliceb",int_hexagon_S2_vsplicerb>;
3180245431Sdimdef Hexagon_S2_vspliceib:
3181234285Sdim  di_SInst_didiu3                 <"vspliceb",int_hexagon_S2_vspliceib>;
3182234285Sdim
3183234285Sdim// STYPE / PERM / Sign extend.
3184245431Sdimdef HEXAGON_S2_vsxtbh:
3185234285Sdim  di_SInst_si                     <"vsxtbh",  int_hexagon_S2_vsxtbh>;
3186245431Sdimdef HEXAGON_S2_vsxthw:
3187234285Sdim  di_SInst_si                     <"vsxthw",  int_hexagon_S2_vsxthw>;
3188234285Sdim
3189234285Sdim// STYPE / PERM / Truncate.
3190245431Sdimdef HEXAGON_S2_vtrunehb:
3191234285Sdim  si_SInst_di                     <"vtrunehb",int_hexagon_S2_vtrunehb>;
3192245431Sdimdef HEXAGON_S2_vtrunohb:
3193234285Sdim  si_SInst_di                     <"vtrunohb",int_hexagon_S2_vtrunohb>;
3194245431Sdimdef HEXAGON_S2_vtrunewh:
3195234285Sdim  di_SInst_didi                   <"vtrunewh",int_hexagon_S2_vtrunewh>;
3196245431Sdimdef HEXAGON_S2_vtrunowh:
3197234285Sdim  di_SInst_didi                   <"vtrunowh",int_hexagon_S2_vtrunowh>;
3198234285Sdim
3199234285Sdim// STYPE / PERM / Zero extend.
3200245431Sdimdef HEXAGON_S2_vzxtbh:
3201234285Sdim  di_SInst_si                     <"vzxtbh",  int_hexagon_S2_vzxtbh>;
3202245431Sdimdef HEXAGON_S2_vzxthw:
3203234285Sdim  di_SInst_si                     <"vzxthw",  int_hexagon_S2_vzxthw>;
3204234285Sdim
3205234285Sdim
3206234285Sdim/********************************************************************
3207234285Sdim*            STYPE/PRED                                             *
3208234285Sdim*********************************************************************/
3209234285Sdim
3210234285Sdim// STYPE / PRED / Mask generate from predicate.
3211245431Sdimdef HEXAGON_C2_mask:
3212234285Sdim  di_SInst_qi                     <"mask",   int_hexagon_C2_mask>;
3213234285Sdim
3214234285Sdim// STYPE / PRED / Predicate transfer.
3215245431Sdimdef HEXAGON_C2_tfrpr:
3216234285Sdim  si_SInst_qi                     <"",       int_hexagon_C2_tfrpr>;
3217245431Sdimdef HEXAGON_C2_tfrrp:
3218234285Sdim  qi_SInst_si                     <"",       int_hexagon_C2_tfrrp>;
3219234285Sdim
3220234285Sdim// STYPE / PRED / Viterbi pack even and odd predicate bits.
3221245431Sdimdef HEXAGON_C2_vitpack:
3222234285Sdim  si_SInst_qiqi                   <"vitpack",int_hexagon_C2_vitpack>;
3223234285Sdim
3224234285Sdim
3225234285Sdim/********************************************************************
3226234285Sdim*            STYPE/SHIFT                                            *
3227234285Sdim*********************************************************************/
3228234285Sdim
3229234285Sdim// STYPE / SHIFT / Shift by immediate.
3230245431Sdimdef HEXAGON_S2_asl_i_r:
3231234285Sdim  si_SInst_siu5                   <"asl",     int_hexagon_S2_asl_i_r>;
3232245431Sdimdef HEXAGON_S2_asr_i_r:
3233234285Sdim  si_SInst_siu5                   <"asr",     int_hexagon_S2_asr_i_r>;
3234245431Sdimdef HEXAGON_S2_lsr_i_r:
3235234285Sdim  si_SInst_siu5                   <"lsr",     int_hexagon_S2_lsr_i_r>;
3236245431Sdimdef HEXAGON_S2_asl_i_p:
3237234285Sdim  di_SInst_diu6                   <"asl",     int_hexagon_S2_asl_i_p>;
3238245431Sdimdef HEXAGON_S2_asr_i_p:
3239234285Sdim  di_SInst_diu6                   <"asr",     int_hexagon_S2_asr_i_p>;
3240245431Sdimdef HEXAGON_S2_lsr_i_p:
3241234285Sdim  di_SInst_diu6                   <"lsr",     int_hexagon_S2_lsr_i_p>;
3242234285Sdim
3243234285Sdim// STYPE / SHIFT / Shift by immediate and accumulate.
3244245431Sdimdef HEXAGON_S2_asl_i_r_acc:
3245234285Sdim  si_SInst_sisiu5_acc             <"asl",     int_hexagon_S2_asl_i_r_acc>;
3246245431Sdimdef HEXAGON_S2_asr_i_r_acc:
3247234285Sdim  si_SInst_sisiu5_acc             <"asr",     int_hexagon_S2_asr_i_r_acc>;
3248245431Sdimdef HEXAGON_S2_lsr_i_r_acc:
3249234285Sdim  si_SInst_sisiu5_acc             <"lsr",     int_hexagon_S2_lsr_i_r_acc>;
3250245431Sdimdef HEXAGON_S2_asl_i_r_nac:
3251234285Sdim  si_SInst_sisiu5_nac             <"asl",     int_hexagon_S2_asl_i_r_nac>;
3252245431Sdimdef HEXAGON_S2_asr_i_r_nac:
3253234285Sdim  si_SInst_sisiu5_nac             <"asr",     int_hexagon_S2_asr_i_r_nac>;
3254245431Sdimdef HEXAGON_S2_lsr_i_r_nac:
3255234285Sdim  si_SInst_sisiu5_nac             <"lsr",     int_hexagon_S2_lsr_i_r_nac>;
3256245431Sdimdef HEXAGON_S2_asl_i_p_acc:
3257234285Sdim  di_SInst_didiu6_acc             <"asl",     int_hexagon_S2_asl_i_p_acc>;
3258245431Sdimdef HEXAGON_S2_asr_i_p_acc:
3259234285Sdim  di_SInst_didiu6_acc             <"asr",     int_hexagon_S2_asr_i_p_acc>;
3260245431Sdimdef HEXAGON_S2_lsr_i_p_acc:
3261234285Sdim  di_SInst_didiu6_acc             <"lsr",     int_hexagon_S2_lsr_i_p_acc>;
3262245431Sdimdef HEXAGON_S2_asl_i_p_nac:
3263234285Sdim  di_SInst_didiu6_nac             <"asl",     int_hexagon_S2_asl_i_p_nac>;
3264245431Sdimdef HEXAGON_S2_asr_i_p_nac:
3265234285Sdim  di_SInst_didiu6_nac             <"asr",     int_hexagon_S2_asr_i_p_nac>;
3266245431Sdimdef HEXAGON_S2_lsr_i_p_nac:
3267234285Sdim  di_SInst_didiu6_nac             <"lsr",     int_hexagon_S2_lsr_i_p_nac>;
3268234285Sdim
3269234285Sdim// STYPE / SHIFT / Shift by immediate and add.
3270245431Sdimdef HEXAGON_S2_addasl_rrri:
3271234285Sdim  si_SInst_sisiu3                 <"addasl",  int_hexagon_S2_addasl_rrri>;
3272234285Sdim
3273234285Sdim// STYPE / SHIFT / Shift by immediate and logical.
3274245431Sdimdef HEXAGON_S2_asl_i_r_and:
3275234285Sdim  si_SInst_sisiu5_and             <"asl",     int_hexagon_S2_asl_i_r_and>;
3276245431Sdimdef HEXAGON_S2_asr_i_r_and:
3277234285Sdim  si_SInst_sisiu5_and             <"asr",     int_hexagon_S2_asr_i_r_and>;
3278245431Sdimdef HEXAGON_S2_lsr_i_r_and:
3279234285Sdim  si_SInst_sisiu5_and             <"lsr",     int_hexagon_S2_lsr_i_r_and>;
3280234285Sdim
3281245431Sdimdef HEXAGON_S2_asl_i_r_xacc:
3282234285Sdim  si_SInst_sisiu5_xor             <"asl",     int_hexagon_S2_asl_i_r_xacc>;
3283245431Sdimdef HEXAGON_S2_lsr_i_r_xacc:
3284234285Sdim  si_SInst_sisiu5_xor             <"lsr",     int_hexagon_S2_lsr_i_r_xacc>;
3285234285Sdim
3286245431Sdimdef HEXAGON_S2_asl_i_r_or:
3287234285Sdim  si_SInst_sisiu5_or              <"asl",     int_hexagon_S2_asl_i_r_or>;
3288245431Sdimdef HEXAGON_S2_asr_i_r_or:
3289234285Sdim  si_SInst_sisiu5_or              <"asr",     int_hexagon_S2_asr_i_r_or>;
3290245431Sdimdef HEXAGON_S2_lsr_i_r_or:
3291234285Sdim  si_SInst_sisiu5_or              <"lsr",     int_hexagon_S2_lsr_i_r_or>;
3292234285Sdim
3293245431Sdimdef HEXAGON_S2_asl_i_p_and:
3294234285Sdim  di_SInst_didiu6_and             <"asl",     int_hexagon_S2_asl_i_p_and>;
3295245431Sdimdef HEXAGON_S2_asr_i_p_and:
3296234285Sdim  di_SInst_didiu6_and             <"asr",     int_hexagon_S2_asr_i_p_and>;
3297245431Sdimdef HEXAGON_S2_lsr_i_p_and:
3298234285Sdim  di_SInst_didiu6_and             <"lsr",     int_hexagon_S2_lsr_i_p_and>;
3299234285Sdim
3300245431Sdimdef HEXAGON_S2_asl_i_p_xacc:
3301234285Sdim  di_SInst_didiu6_xor             <"asl",     int_hexagon_S2_asl_i_p_xacc>;
3302245431Sdimdef HEXAGON_S2_lsr_i_p_xacc:
3303234285Sdim  di_SInst_didiu6_xor             <"lsr",     int_hexagon_S2_lsr_i_p_xacc>;
3304234285Sdim
3305245431Sdimdef HEXAGON_S2_asl_i_p_or:
3306234285Sdim  di_SInst_didiu6_or              <"asl",     int_hexagon_S2_asl_i_p_or>;
3307245431Sdimdef HEXAGON_S2_asr_i_p_or:
3308234285Sdim  di_SInst_didiu6_or              <"asr",     int_hexagon_S2_asr_i_p_or>;
3309245431Sdimdef HEXAGON_S2_lsr_i_p_or:
3310234285Sdim  di_SInst_didiu6_or              <"lsr",     int_hexagon_S2_lsr_i_p_or>;
3311234285Sdim
3312234285Sdim// STYPE / SHIFT / Shift right by immediate with rounding.
3313245431Sdimdef HEXAGON_S2_asr_i_r_rnd:
3314234285Sdim  si_SInst_siu5_rnd               <"asr",     int_hexagon_S2_asr_i_r_rnd>;
3315245431Sdimdef HEXAGON_S2_asr_i_r_rnd_goodsyntax:
3316234285Sdim  si_SInst_siu5              <"asrrnd",  int_hexagon_S2_asr_i_r_rnd_goodsyntax>;
3317234285Sdim
3318234285Sdim// STYPE / SHIFT / Shift left by immediate with saturation.
3319245431Sdimdef HEXAGON_S2_asl_i_r_sat:
3320234285Sdim  si_SInst_sisi_sat               <"asl",     int_hexagon_S2_asl_i_r_sat>;
3321234285Sdim
3322234285Sdim// STYPE / SHIFT / Shift by register.
3323245431Sdimdef HEXAGON_S2_asl_r_r:
3324234285Sdim  si_SInst_sisi                   <"asl",     int_hexagon_S2_asl_r_r>;
3325245431Sdimdef HEXAGON_S2_asr_r_r:
3326234285Sdim  si_SInst_sisi                   <"asr",     int_hexagon_S2_asr_r_r>;
3327245431Sdimdef HEXAGON_S2_lsl_r_r:
3328234285Sdim  si_SInst_sisi                   <"lsl",     int_hexagon_S2_lsl_r_r>;
3329245431Sdimdef HEXAGON_S2_lsr_r_r:
3330234285Sdim  si_SInst_sisi                   <"lsr",     int_hexagon_S2_lsr_r_r>;
3331245431Sdimdef HEXAGON_S2_asl_r_p:
3332234285Sdim  di_SInst_disi                   <"asl",     int_hexagon_S2_asl_r_p>;
3333245431Sdimdef HEXAGON_S2_asr_r_p:
3334234285Sdim  di_SInst_disi                   <"asr",     int_hexagon_S2_asr_r_p>;
3335245431Sdimdef HEXAGON_S2_lsl_r_p:
3336234285Sdim  di_SInst_disi                   <"lsl",     int_hexagon_S2_lsl_r_p>;
3337245431Sdimdef HEXAGON_S2_lsr_r_p:
3338234285Sdim  di_SInst_disi                   <"lsr",     int_hexagon_S2_lsr_r_p>;
3339234285Sdim
3340234285Sdim// STYPE / SHIFT / Shift by register and accumulate.
3341245431Sdimdef HEXAGON_S2_asl_r_r_acc:
3342234285Sdim  si_SInst_sisisi_acc             <"asl",     int_hexagon_S2_asl_r_r_acc>;
3343245431Sdimdef HEXAGON_S2_asr_r_r_acc:
3344234285Sdim  si_SInst_sisisi_acc             <"asr",     int_hexagon_S2_asr_r_r_acc>;
3345245431Sdimdef HEXAGON_S2_lsl_r_r_acc:
3346234285Sdim  si_SInst_sisisi_acc             <"lsl",     int_hexagon_S2_lsl_r_r_acc>;
3347245431Sdimdef HEXAGON_S2_lsr_r_r_acc:
3348234285Sdim  si_SInst_sisisi_acc             <"lsr",     int_hexagon_S2_lsr_r_r_acc>;
3349245431Sdimdef HEXAGON_S2_asl_r_p_acc:
3350234285Sdim  di_SInst_didisi_acc             <"asl",     int_hexagon_S2_asl_r_p_acc>;
3351245431Sdimdef HEXAGON_S2_asr_r_p_acc:
3352234285Sdim  di_SInst_didisi_acc             <"asr",     int_hexagon_S2_asr_r_p_acc>;
3353245431Sdimdef HEXAGON_S2_lsl_r_p_acc:
3354234285Sdim  di_SInst_didisi_acc             <"lsl",     int_hexagon_S2_lsl_r_p_acc>;
3355245431Sdimdef HEXAGON_S2_lsr_r_p_acc:
3356234285Sdim  di_SInst_didisi_acc             <"lsr",     int_hexagon_S2_lsr_r_p_acc>;
3357234285Sdim
3358245431Sdimdef HEXAGON_S2_asl_r_r_nac:
3359234285Sdim  si_SInst_sisisi_nac             <"asl",     int_hexagon_S2_asl_r_r_nac>;
3360245431Sdimdef HEXAGON_S2_asr_r_r_nac:
3361234285Sdim  si_SInst_sisisi_nac             <"asr",     int_hexagon_S2_asr_r_r_nac>;
3362245431Sdimdef HEXAGON_S2_lsl_r_r_nac:
3363234285Sdim  si_SInst_sisisi_nac             <"lsl",     int_hexagon_S2_lsl_r_r_nac>;
3364245431Sdimdef HEXAGON_S2_lsr_r_r_nac:
3365234285Sdim  si_SInst_sisisi_nac             <"lsr",     int_hexagon_S2_lsr_r_r_nac>;
3366245431Sdimdef HEXAGON_S2_asl_r_p_nac:
3367234285Sdim  di_SInst_didisi_nac             <"asl",     int_hexagon_S2_asl_r_p_nac>;
3368245431Sdimdef HEXAGON_S2_asr_r_p_nac:
3369234285Sdim  di_SInst_didisi_nac             <"asr",     int_hexagon_S2_asr_r_p_nac>;
3370245431Sdimdef HEXAGON_S2_lsl_r_p_nac:
3371234285Sdim  di_SInst_didisi_nac             <"lsl",     int_hexagon_S2_lsl_r_p_nac>;
3372245431Sdimdef HEXAGON_S2_lsr_r_p_nac:
3373234285Sdim  di_SInst_didisi_nac             <"lsr",     int_hexagon_S2_lsr_r_p_nac>;
3374234285Sdim
3375234285Sdim// STYPE / SHIFT / Shift by register and logical.
3376245431Sdimdef HEXAGON_S2_asl_r_r_and:
3377234285Sdim  si_SInst_sisisi_and             <"asl",     int_hexagon_S2_asl_r_r_and>;
3378245431Sdimdef HEXAGON_S2_asr_r_r_and:
3379234285Sdim  si_SInst_sisisi_and             <"asr",     int_hexagon_S2_asr_r_r_and>;
3380245431Sdimdef HEXAGON_S2_lsl_r_r_and:
3381234285Sdim  si_SInst_sisisi_and             <"lsl",     int_hexagon_S2_lsl_r_r_and>;
3382245431Sdimdef HEXAGON_S2_lsr_r_r_and:
3383234285Sdim  si_SInst_sisisi_and             <"lsr",     int_hexagon_S2_lsr_r_r_and>;
3384234285Sdim
3385245431Sdimdef HEXAGON_S2_asl_r_r_or:
3386234285Sdim  si_SInst_sisisi_or              <"asl",     int_hexagon_S2_asl_r_r_or>;
3387245431Sdimdef HEXAGON_S2_asr_r_r_or:
3388234285Sdim  si_SInst_sisisi_or              <"asr",     int_hexagon_S2_asr_r_r_or>;
3389245431Sdimdef HEXAGON_S2_lsl_r_r_or:
3390234285Sdim  si_SInst_sisisi_or              <"lsl",     int_hexagon_S2_lsl_r_r_or>;
3391245431Sdimdef HEXAGON_S2_lsr_r_r_or:
3392234285Sdim  si_SInst_sisisi_or              <"lsr",     int_hexagon_S2_lsr_r_r_or>;
3393234285Sdim
3394245431Sdimdef HEXAGON_S2_asl_r_p_and:
3395234285Sdim  di_SInst_didisi_and             <"asl",     int_hexagon_S2_asl_r_p_and>;
3396245431Sdimdef HEXAGON_S2_asr_r_p_and:
3397234285Sdim  di_SInst_didisi_and             <"asr",     int_hexagon_S2_asr_r_p_and>;
3398245431Sdimdef HEXAGON_S2_lsl_r_p_and:
3399234285Sdim  di_SInst_didisi_and             <"lsl",     int_hexagon_S2_lsl_r_p_and>;
3400245431Sdimdef HEXAGON_S2_lsr_r_p_and:
3401234285Sdim  di_SInst_didisi_and             <"lsr",     int_hexagon_S2_lsr_r_p_and>;
3402234285Sdim
3403245431Sdimdef HEXAGON_S2_asl_r_p_or:
3404234285Sdim  di_SInst_didisi_or              <"asl",     int_hexagon_S2_asl_r_p_or>;
3405245431Sdimdef HEXAGON_S2_asr_r_p_or:
3406234285Sdim  di_SInst_didisi_or              <"asr",     int_hexagon_S2_asr_r_p_or>;
3407245431Sdimdef HEXAGON_S2_lsl_r_p_or:
3408234285Sdim  di_SInst_didisi_or              <"lsl",     int_hexagon_S2_lsl_r_p_or>;
3409245431Sdimdef HEXAGON_S2_lsr_r_p_or:
3410234285Sdim  di_SInst_didisi_or              <"lsr",     int_hexagon_S2_lsr_r_p_or>;
3411234285Sdim
3412234285Sdim// STYPE / SHIFT / Shift by register with saturation.
3413245431Sdimdef HEXAGON_S2_asl_r_r_sat:
3414234285Sdim  si_SInst_sisi_sat               <"asl",     int_hexagon_S2_asl_r_r_sat>;
3415245431Sdimdef HEXAGON_S2_asr_r_r_sat:
3416234285Sdim  si_SInst_sisi_sat               <"asr",     int_hexagon_S2_asr_r_r_sat>;
3417234285Sdim
3418234285Sdim// STYPE / SHIFT / Table Index.
3419245431Sdimdef Hexagon_S2_tableidxb_goodsyntax:
3420234285Sdim  si_MInst_sisiu4u5          <"tableidxb",int_hexagon_S2_tableidxb_goodsyntax>;
3421245431Sdimdef Hexagon_S2_tableidxd_goodsyntax:
3422234285Sdim  si_MInst_sisiu4u5          <"tableidxd",int_hexagon_S2_tableidxd_goodsyntax>;
3423245431Sdimdef Hexagon_S2_tableidxh_goodsyntax:
3424234285Sdim  si_MInst_sisiu4u5          <"tableidxh",int_hexagon_S2_tableidxh_goodsyntax>;
3425245431Sdimdef Hexagon_S2_tableidxw_goodsyntax:
3426234285Sdim  si_MInst_sisiu4u5          <"tableidxw",int_hexagon_S2_tableidxw_goodsyntax>;
3427234285Sdim
3428234285Sdim
3429234285Sdim/********************************************************************
3430234285Sdim*            STYPE/VH                                               *
3431234285Sdim*********************************************************************/
3432234285Sdim
3433234285Sdim// STYPE / VH / Vector absolute value halfwords.
3434234285Sdim// Rdd64=vabsh(Rss64)
3435245431Sdimdef HEXAGON_A2_vabsh:
3436234285Sdim  di_SInst_di                     <"vabsh",   int_hexagon_A2_vabsh>;
3437245431Sdimdef HEXAGON_A2_vabshsat:
3438234285Sdim  di_SInst_di_sat                 <"vabsh",   int_hexagon_A2_vabshsat>;
3439234285Sdim
3440234285Sdim// STYPE / VH / Vector shift halfwords by immediate.
3441234285Sdim// Rdd64=v[asl/asr/lsr]h(Rss64,Rt32)
3442245431Sdimdef HEXAGON_S2_asl_i_vh:
3443234285Sdim  di_SInst_disi                   <"vaslh",   int_hexagon_S2_asl_i_vh>;
3444245431Sdimdef HEXAGON_S2_asr_i_vh:
3445234285Sdim  di_SInst_disi                   <"vasrh",   int_hexagon_S2_asr_i_vh>;
3446245431Sdimdef HEXAGON_S2_lsr_i_vh:
3447234285Sdim  di_SInst_disi                   <"vlsrh",   int_hexagon_S2_lsr_i_vh>;
3448234285Sdim
3449234285Sdim// STYPE / VH / Vector shift halfwords by register.
3450234285Sdim// Rdd64=v[asl/asr/lsl/lsr]w(Rss64,Rt32)
3451245431Sdimdef HEXAGON_S2_asl_r_vh:
3452234285Sdim  di_SInst_disi                   <"vaslh",   int_hexagon_S2_asl_r_vh>;
3453245431Sdimdef HEXAGON_S2_asr_r_vh:
3454234285Sdim  di_SInst_disi                   <"vasrh",   int_hexagon_S2_asr_r_vh>;
3455245431Sdimdef HEXAGON_S2_lsl_r_vh:
3456234285Sdim  di_SInst_disi                   <"vlslh",   int_hexagon_S2_lsl_r_vh>;
3457245431Sdimdef HEXAGON_S2_lsr_r_vh:
3458234285Sdim  di_SInst_disi                   <"vlsrh",   int_hexagon_S2_lsr_r_vh>;
3459234285Sdim
3460234285Sdim
3461234285Sdim/********************************************************************
3462234285Sdim*            STYPE/VW                                               *
3463234285Sdim*********************************************************************/
3464234285Sdim
3465234285Sdim// STYPE / VW / Vector absolute value words.
3466245431Sdimdef HEXAGON_A2_vabsw:
3467234285Sdim  di_SInst_di                     <"vabsw",   int_hexagon_A2_vabsw>;
3468245431Sdimdef HEXAGON_A2_vabswsat:
3469234285Sdim  di_SInst_di_sat                 <"vabsw",   int_hexagon_A2_vabswsat>;
3470234285Sdim
3471234285Sdim// STYPE / VW / Vector shift words by immediate.
3472234285Sdim// Rdd64=v[asl/vsl]w(Rss64,Rt32)
3473245431Sdimdef HEXAGON_S2_asl_i_vw:
3474234285Sdim  di_SInst_disi                   <"vaslw",   int_hexagon_S2_asl_i_vw>;
3475245431Sdimdef HEXAGON_S2_asr_i_vw:
3476234285Sdim  di_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_i_vw>;
3477245431Sdimdef HEXAGON_S2_lsr_i_vw:
3478234285Sdim  di_SInst_disi                   <"vlsrw",   int_hexagon_S2_lsr_i_vw>;
3479234285Sdim
3480234285Sdim// STYPE / VW / Vector shift words by register.
3481234285Sdim// Rdd64=v[asl/vsl]w(Rss64,Rt32)
3482245431Sdimdef HEXAGON_S2_asl_r_vw:
3483234285Sdim  di_SInst_disi                   <"vaslw",   int_hexagon_S2_asl_r_vw>;
3484245431Sdimdef HEXAGON_S2_asr_r_vw:
3485234285Sdim  di_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_r_vw>;
3486245431Sdimdef HEXAGON_S2_lsl_r_vw:
3487234285Sdim  di_SInst_disi                   <"vlslw",   int_hexagon_S2_lsl_r_vw>;
3488245431Sdimdef HEXAGON_S2_lsr_r_vw:
3489234285Sdim  di_SInst_disi                   <"vlsrw",   int_hexagon_S2_lsr_r_vw>;
3490234285Sdim
3491234285Sdim// STYPE / VW / Vector shift words with truncate and pack.
3492245431Sdimdef HEXAGON_S2_asr_r_svw_trun:
3493234285Sdim  si_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_r_svw_trun>;
3494245431Sdimdef HEXAGON_S2_asr_i_svw_trun:
3495234285Sdim  si_SInst_diu5                   <"vasrw",   int_hexagon_S2_asr_i_svw_trun>;
3496234285Sdim
3497245431Sdim// LD / Circular loads.
3498245431Sdimdef HEXAGON_circ_ldd:
3499245431Sdim  di_LDInstPI_diu4                <"circ_ldd", int_hexagon_circ_ldd>;
3500245431Sdim
3501234285Sdiminclude "HexagonIntrinsicsV3.td"
3502234285Sdiminclude "HexagonIntrinsicsV4.td"
3503245431Sdiminclude "HexagonIntrinsicsV5.td"
3504