1 //===-- HexagonIntrinsics.td - Instruction intrinsics ------*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 // This is populated based on the following specs:
10 // Hexagon V2 Architecture
11 // Application-Level Specification
14 //===----------------------------------------------------------------------===//
16 class T_RR_pat <InstHexagon MI, Intrinsic IntID>
17 : Pat <(IntID I32:$Rs, I32:$Rt),
18 (MI I32:$Rs, I32:$Rt)>;
20 class T_RRR_pat <InstHexagon MI, Intrinsic IntID>
21 : Pat <(IntID I32:$Rs, I32:$Rt, I32:$Ru),
22 (MI I32:$Rs, I32:$Rt, I32:$Ru)>;
24 class T_PRR_pat <InstHexagon MI, Intrinsic IntID>
25 : Pat <(IntID I64:$Rs, I32:$Rt, I32:$Ru),
26 (MI DoubleRegs:$Rs, I32:$Rt, I32:$Ru)>;
28 //===----------------------------------------------------------------------===//
29 // MPYS / Multipy signed/unsigned halfwords
30 //Rd=mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:rnd][:sat]
31 //===----------------------------------------------------------------------===//
33 def : T_RR_pat <M2_mpy_ll_s1, int_hexagon_M2_mpy_ll_s1>;
34 def : T_RR_pat <M2_mpy_ll_s0, int_hexagon_M2_mpy_ll_s0>;
35 def : T_RR_pat <M2_mpy_lh_s1, int_hexagon_M2_mpy_lh_s1>;
36 def : T_RR_pat <M2_mpy_lh_s0, int_hexagon_M2_mpy_lh_s0>;
37 def : T_RR_pat <M2_mpy_hl_s1, int_hexagon_M2_mpy_hl_s1>;
38 def : T_RR_pat <M2_mpy_hl_s0, int_hexagon_M2_mpy_hl_s0>;
39 def : T_RR_pat <M2_mpy_hh_s1, int_hexagon_M2_mpy_hh_s1>;
40 def : T_RR_pat <M2_mpy_hh_s0, int_hexagon_M2_mpy_hh_s0>;
42 def : T_RR_pat <M2_mpyu_ll_s1, int_hexagon_M2_mpyu_ll_s1>;
43 def : T_RR_pat <M2_mpyu_ll_s0, int_hexagon_M2_mpyu_ll_s0>;
44 def : T_RR_pat <M2_mpyu_lh_s1, int_hexagon_M2_mpyu_lh_s1>;
45 def : T_RR_pat <M2_mpyu_lh_s0, int_hexagon_M2_mpyu_lh_s0>;
46 def : T_RR_pat <M2_mpyu_hl_s1, int_hexagon_M2_mpyu_hl_s1>;
47 def : T_RR_pat <M2_mpyu_hl_s0, int_hexagon_M2_mpyu_hl_s0>;
48 def : T_RR_pat <M2_mpyu_hh_s1, int_hexagon_M2_mpyu_hh_s1>;
49 def : T_RR_pat <M2_mpyu_hh_s0, int_hexagon_M2_mpyu_hh_s0>;
51 def : T_RR_pat <M2_mpy_sat_ll_s1, int_hexagon_M2_mpy_sat_ll_s1>;
52 def : T_RR_pat <M2_mpy_sat_ll_s0, int_hexagon_M2_mpy_sat_ll_s0>;
53 def : T_RR_pat <M2_mpy_sat_lh_s1, int_hexagon_M2_mpy_sat_lh_s1>;
54 def : T_RR_pat <M2_mpy_sat_lh_s0, int_hexagon_M2_mpy_sat_lh_s0>;
55 def : T_RR_pat <M2_mpy_sat_hl_s1, int_hexagon_M2_mpy_sat_hl_s1>;
56 def : T_RR_pat <M2_mpy_sat_hl_s0, int_hexagon_M2_mpy_sat_hl_s0>;
57 def : T_RR_pat <M2_mpy_sat_hh_s1, int_hexagon_M2_mpy_sat_hh_s1>;
58 def : T_RR_pat <M2_mpy_sat_hh_s0, int_hexagon_M2_mpy_sat_hh_s0>;
60 def : T_RR_pat <M2_mpy_rnd_ll_s1, int_hexagon_M2_mpy_rnd_ll_s1>;
61 def : T_RR_pat <M2_mpy_rnd_ll_s0, int_hexagon_M2_mpy_rnd_ll_s0>;
62 def : T_RR_pat <M2_mpy_rnd_lh_s1, int_hexagon_M2_mpy_rnd_lh_s1>;
63 def : T_RR_pat <M2_mpy_rnd_lh_s0, int_hexagon_M2_mpy_rnd_lh_s0>;
64 def : T_RR_pat <M2_mpy_rnd_hl_s1, int_hexagon_M2_mpy_rnd_hl_s1>;
65 def : T_RR_pat <M2_mpy_rnd_hl_s0, int_hexagon_M2_mpy_rnd_hl_s0>;
66 def : T_RR_pat <M2_mpy_rnd_hh_s1, int_hexagon_M2_mpy_rnd_hh_s1>;
67 def : T_RR_pat <M2_mpy_rnd_hh_s0, int_hexagon_M2_mpy_rnd_hh_s0>;
69 def : T_RR_pat <M2_mpy_sat_rnd_ll_s1, int_hexagon_M2_mpy_sat_rnd_ll_s1>;
70 def : T_RR_pat <M2_mpy_sat_rnd_ll_s0, int_hexagon_M2_mpy_sat_rnd_ll_s0>;
71 def : T_RR_pat <M2_mpy_sat_rnd_lh_s1, int_hexagon_M2_mpy_sat_rnd_lh_s1>;
72 def : T_RR_pat <M2_mpy_sat_rnd_lh_s0, int_hexagon_M2_mpy_sat_rnd_lh_s0>;
73 def : T_RR_pat <M2_mpy_sat_rnd_hl_s1, int_hexagon_M2_mpy_sat_rnd_hl_s1>;
74 def : T_RR_pat <M2_mpy_sat_rnd_hl_s0, int_hexagon_M2_mpy_sat_rnd_hl_s0>;
75 def : T_RR_pat <M2_mpy_sat_rnd_hh_s1, int_hexagon_M2_mpy_sat_rnd_hh_s1>;
76 def : T_RR_pat <M2_mpy_sat_rnd_hh_s0, int_hexagon_M2_mpy_sat_rnd_hh_s0>;
79 //===----------------------------------------------------------------------===//
80 // MPYS / Multipy signed/unsigned halfwords and add/subtract the
81 // result from the accumulator.
82 //Rx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat]
83 //===----------------------------------------------------------------------===//
85 def : T_RRR_pat <M2_mpy_acc_ll_s1, int_hexagon_M2_mpy_acc_ll_s1>;
86 def : T_RRR_pat <M2_mpy_acc_ll_s0, int_hexagon_M2_mpy_acc_ll_s0>;
87 def : T_RRR_pat <M2_mpy_acc_lh_s1, int_hexagon_M2_mpy_acc_lh_s1>;
88 def : T_RRR_pat <M2_mpy_acc_lh_s0, int_hexagon_M2_mpy_acc_lh_s0>;
89 def : T_RRR_pat <M2_mpy_acc_hl_s1, int_hexagon_M2_mpy_acc_hl_s1>;
90 def : T_RRR_pat <M2_mpy_acc_hl_s0, int_hexagon_M2_mpy_acc_hl_s0>;
91 def : T_RRR_pat <M2_mpy_acc_hh_s1, int_hexagon_M2_mpy_acc_hh_s1>;
92 def : T_RRR_pat <M2_mpy_acc_hh_s0, int_hexagon_M2_mpy_acc_hh_s0>;
94 def : T_RRR_pat <M2_mpyu_acc_ll_s1, int_hexagon_M2_mpyu_acc_ll_s1>;
95 def : T_RRR_pat <M2_mpyu_acc_ll_s0, int_hexagon_M2_mpyu_acc_ll_s0>;
96 def : T_RRR_pat <M2_mpyu_acc_lh_s1, int_hexagon_M2_mpyu_acc_lh_s1>;
97 def : T_RRR_pat <M2_mpyu_acc_lh_s0, int_hexagon_M2_mpyu_acc_lh_s0>;
98 def : T_RRR_pat <M2_mpyu_acc_hl_s1, int_hexagon_M2_mpyu_acc_hl_s1>;
99 def : T_RRR_pat <M2_mpyu_acc_hl_s0, int_hexagon_M2_mpyu_acc_hl_s0>;
100 def : T_RRR_pat <M2_mpyu_acc_hh_s1, int_hexagon_M2_mpyu_acc_hh_s1>;
101 def : T_RRR_pat <M2_mpyu_acc_hh_s0, int_hexagon_M2_mpyu_acc_hh_s0>;
103 def : T_RRR_pat <M2_mpy_nac_ll_s1, int_hexagon_M2_mpy_nac_ll_s1>;
104 def : T_RRR_pat <M2_mpy_nac_ll_s0, int_hexagon_M2_mpy_nac_ll_s0>;
105 def : T_RRR_pat <M2_mpy_nac_lh_s1, int_hexagon_M2_mpy_nac_lh_s1>;
106 def : T_RRR_pat <M2_mpy_nac_lh_s0, int_hexagon_M2_mpy_nac_lh_s0>;
107 def : T_RRR_pat <M2_mpy_nac_hl_s1, int_hexagon_M2_mpy_nac_hl_s1>;
108 def : T_RRR_pat <M2_mpy_nac_hl_s0, int_hexagon_M2_mpy_nac_hl_s0>;
109 def : T_RRR_pat <M2_mpy_nac_hh_s1, int_hexagon_M2_mpy_nac_hh_s1>;
110 def : T_RRR_pat <M2_mpy_nac_hh_s0, int_hexagon_M2_mpy_nac_hh_s0>;
112 def : T_RRR_pat <M2_mpyu_nac_ll_s1, int_hexagon_M2_mpyu_nac_ll_s1>;
113 def : T_RRR_pat <M2_mpyu_nac_ll_s0, int_hexagon_M2_mpyu_nac_ll_s0>;
114 def : T_RRR_pat <M2_mpyu_nac_lh_s1, int_hexagon_M2_mpyu_nac_lh_s1>;
115 def : T_RRR_pat <M2_mpyu_nac_lh_s0, int_hexagon_M2_mpyu_nac_lh_s0>;
116 def : T_RRR_pat <M2_mpyu_nac_hl_s1, int_hexagon_M2_mpyu_nac_hl_s1>;
117 def : T_RRR_pat <M2_mpyu_nac_hl_s0, int_hexagon_M2_mpyu_nac_hl_s0>;
118 def : T_RRR_pat <M2_mpyu_nac_hh_s1, int_hexagon_M2_mpyu_nac_hh_s1>;
119 def : T_RRR_pat <M2_mpyu_nac_hh_s0, int_hexagon_M2_mpyu_nac_hh_s0>;
121 def : T_RRR_pat <M2_mpy_acc_sat_ll_s1, int_hexagon_M2_mpy_acc_sat_ll_s1>;
122 def : T_RRR_pat <M2_mpy_acc_sat_ll_s0, int_hexagon_M2_mpy_acc_sat_ll_s0>;
123 def : T_RRR_pat <M2_mpy_acc_sat_lh_s1, int_hexagon_M2_mpy_acc_sat_lh_s1>;
124 def : T_RRR_pat <M2_mpy_acc_sat_lh_s0, int_hexagon_M2_mpy_acc_sat_lh_s0>;
125 def : T_RRR_pat <M2_mpy_acc_sat_hl_s1, int_hexagon_M2_mpy_acc_sat_hl_s1>;
126 def : T_RRR_pat <M2_mpy_acc_sat_hl_s0, int_hexagon_M2_mpy_acc_sat_hl_s0>;
127 def : T_RRR_pat <M2_mpy_acc_sat_hh_s1, int_hexagon_M2_mpy_acc_sat_hh_s1>;
128 def : T_RRR_pat <M2_mpy_acc_sat_hh_s0, int_hexagon_M2_mpy_acc_sat_hh_s0>;
130 def : T_RRR_pat <M2_mpy_nac_sat_ll_s1, int_hexagon_M2_mpy_nac_sat_ll_s1>;
131 def : T_RRR_pat <M2_mpy_nac_sat_ll_s0, int_hexagon_M2_mpy_nac_sat_ll_s0>;
132 def : T_RRR_pat <M2_mpy_nac_sat_lh_s1, int_hexagon_M2_mpy_nac_sat_lh_s1>;
133 def : T_RRR_pat <M2_mpy_nac_sat_lh_s0, int_hexagon_M2_mpy_nac_sat_lh_s0>;
134 def : T_RRR_pat <M2_mpy_nac_sat_hl_s1, int_hexagon_M2_mpy_nac_sat_hl_s1>;
135 def : T_RRR_pat <M2_mpy_nac_sat_hl_s0, int_hexagon_M2_mpy_nac_sat_hl_s0>;
136 def : T_RRR_pat <M2_mpy_nac_sat_hh_s1, int_hexagon_M2_mpy_nac_sat_hh_s1>;
137 def : T_RRR_pat <M2_mpy_nac_sat_hh_s0, int_hexagon_M2_mpy_nac_sat_hh_s0>;
140 //===----------------------------------------------------------------------===//
141 // Multiply signed/unsigned halfwords with and without saturation and rounding
142 // into a 64-bits destination register.
143 //===----------------------------------------------------------------------===//
145 def : T_RR_pat <M2_mpyd_hh_s0, int_hexagon_M2_mpyd_hh_s0>;
146 def : T_RR_pat <M2_mpyd_hl_s0, int_hexagon_M2_mpyd_hl_s0>;
147 def : T_RR_pat <M2_mpyd_lh_s0, int_hexagon_M2_mpyd_lh_s0>;
148 def : T_RR_pat <M2_mpyd_ll_s0, int_hexagon_M2_mpyd_ll_s0>;
149 def : T_RR_pat <M2_mpyd_hh_s1, int_hexagon_M2_mpyd_hh_s1>;
150 def : T_RR_pat <M2_mpyd_hl_s1, int_hexagon_M2_mpyd_hl_s1>;
151 def : T_RR_pat <M2_mpyd_lh_s1, int_hexagon_M2_mpyd_lh_s1>;
152 def : T_RR_pat <M2_mpyd_ll_s1, int_hexagon_M2_mpyd_ll_s1>;
154 def : T_RR_pat <M2_mpyd_rnd_hh_s0, int_hexagon_M2_mpyd_rnd_hh_s0>;
155 def : T_RR_pat <M2_mpyd_rnd_hl_s0, int_hexagon_M2_mpyd_rnd_hl_s0>;
156 def : T_RR_pat <M2_mpyd_rnd_lh_s0, int_hexagon_M2_mpyd_rnd_lh_s0>;
157 def : T_RR_pat <M2_mpyd_rnd_ll_s0, int_hexagon_M2_mpyd_rnd_ll_s0>;
158 def : T_RR_pat <M2_mpyd_rnd_hh_s1, int_hexagon_M2_mpyd_rnd_hh_s1>;
159 def : T_RR_pat <M2_mpyd_rnd_hl_s1, int_hexagon_M2_mpyd_rnd_hl_s1>;
160 def : T_RR_pat <M2_mpyd_rnd_lh_s1, int_hexagon_M2_mpyd_rnd_lh_s1>;
161 def : T_RR_pat <M2_mpyd_rnd_ll_s1, int_hexagon_M2_mpyd_rnd_ll_s1>;
163 def : T_RR_pat <M2_mpyud_hh_s0, int_hexagon_M2_mpyud_hh_s0>;
164 def : T_RR_pat <M2_mpyud_hl_s0, int_hexagon_M2_mpyud_hl_s0>;
165 def : T_RR_pat <M2_mpyud_lh_s0, int_hexagon_M2_mpyud_lh_s0>;
166 def : T_RR_pat <M2_mpyud_ll_s0, int_hexagon_M2_mpyud_ll_s0>;
167 def : T_RR_pat <M2_mpyud_hh_s1, int_hexagon_M2_mpyud_hh_s1>;
168 def : T_RR_pat <M2_mpyud_hl_s1, int_hexagon_M2_mpyud_hl_s1>;
169 def : T_RR_pat <M2_mpyud_lh_s1, int_hexagon_M2_mpyud_lh_s1>;
170 def : T_RR_pat <M2_mpyud_ll_s1, int_hexagon_M2_mpyud_ll_s1>;
172 //===----------------------------------------------------------------------===//
173 // MPYS / Multipy signed/unsigned halfwords and add/subtract the
174 // result from the 64-bit destination register.
175 //Rxx [-+]= mpy[u](Rs.[H|L],Rt.[H|L])[:<<1][:sat]
176 //===----------------------------------------------------------------------===//
178 def : T_PRR_pat <M2_mpyd_acc_hh_s0, int_hexagon_M2_mpyd_acc_hh_s0>;
179 def : T_PRR_pat <M2_mpyd_acc_hl_s0, int_hexagon_M2_mpyd_acc_hl_s0>;
180 def : T_PRR_pat <M2_mpyd_acc_lh_s0, int_hexagon_M2_mpyd_acc_lh_s0>;
181 def : T_PRR_pat <M2_mpyd_acc_ll_s0, int_hexagon_M2_mpyd_acc_ll_s0>;
183 def : T_PRR_pat <M2_mpyd_acc_hh_s1, int_hexagon_M2_mpyd_acc_hh_s1>;
184 def : T_PRR_pat <M2_mpyd_acc_hl_s1, int_hexagon_M2_mpyd_acc_hl_s1>;
185 def : T_PRR_pat <M2_mpyd_acc_lh_s1, int_hexagon_M2_mpyd_acc_lh_s1>;
186 def : T_PRR_pat <M2_mpyd_acc_ll_s1, int_hexagon_M2_mpyd_acc_ll_s1>;
188 def : T_PRR_pat <M2_mpyd_nac_hh_s0, int_hexagon_M2_mpyd_nac_hh_s0>;
189 def : T_PRR_pat <M2_mpyd_nac_hl_s0, int_hexagon_M2_mpyd_nac_hl_s0>;
190 def : T_PRR_pat <M2_mpyd_nac_lh_s0, int_hexagon_M2_mpyd_nac_lh_s0>;
191 def : T_PRR_pat <M2_mpyd_nac_ll_s0, int_hexagon_M2_mpyd_nac_ll_s0>;
193 def : T_PRR_pat <M2_mpyd_nac_hh_s1, int_hexagon_M2_mpyd_nac_hh_s1>;
194 def : T_PRR_pat <M2_mpyd_nac_hl_s1, int_hexagon_M2_mpyd_nac_hl_s1>;
195 def : T_PRR_pat <M2_mpyd_nac_lh_s1, int_hexagon_M2_mpyd_nac_lh_s1>;
196 def : T_PRR_pat <M2_mpyd_nac_ll_s1, int_hexagon_M2_mpyd_nac_ll_s1>;
198 def : T_PRR_pat <M2_mpyud_acc_hh_s0, int_hexagon_M2_mpyud_acc_hh_s0>;
199 def : T_PRR_pat <M2_mpyud_acc_hl_s0, int_hexagon_M2_mpyud_acc_hl_s0>;
200 def : T_PRR_pat <M2_mpyud_acc_lh_s0, int_hexagon_M2_mpyud_acc_lh_s0>;
201 def : T_PRR_pat <M2_mpyud_acc_ll_s0, int_hexagon_M2_mpyud_acc_ll_s0>;
203 def : T_PRR_pat <M2_mpyud_acc_hh_s1, int_hexagon_M2_mpyud_acc_hh_s1>;
204 def : T_PRR_pat <M2_mpyud_acc_hl_s1, int_hexagon_M2_mpyud_acc_hl_s1>;
205 def : T_PRR_pat <M2_mpyud_acc_lh_s1, int_hexagon_M2_mpyud_acc_lh_s1>;
206 def : T_PRR_pat <M2_mpyud_acc_ll_s1, int_hexagon_M2_mpyud_acc_ll_s1>;
208 def : T_PRR_pat <M2_mpyud_nac_hh_s0, int_hexagon_M2_mpyud_nac_hh_s0>;
209 def : T_PRR_pat <M2_mpyud_nac_hl_s0, int_hexagon_M2_mpyud_nac_hl_s0>;
210 def : T_PRR_pat <M2_mpyud_nac_lh_s0, int_hexagon_M2_mpyud_nac_lh_s0>;
211 def : T_PRR_pat <M2_mpyud_nac_ll_s0, int_hexagon_M2_mpyud_nac_ll_s0>;
213 def : T_PRR_pat <M2_mpyud_nac_hh_s1, int_hexagon_M2_mpyud_nac_hh_s1>;
214 def : T_PRR_pat <M2_mpyud_nac_hl_s1, int_hexagon_M2_mpyud_nac_hl_s1>;
215 def : T_PRR_pat <M2_mpyud_nac_lh_s1, int_hexagon_M2_mpyud_nac_lh_s1>;
216 def : T_PRR_pat <M2_mpyud_nac_ll_s1, int_hexagon_M2_mpyud_nac_ll_s1>;
222 class qi_ALU32_sisi<string opc, Intrinsic IntID>
223 : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
224 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
225 [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
227 class qi_ALU32_sis10<string opc, Intrinsic IntID>
228 : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
229 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
230 [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
232 class qi_ALU32_sis8<string opc, Intrinsic IntID>
233 : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2),
234 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
235 [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
237 class qi_ALU32_siu8<string opc, Intrinsic IntID>
238 : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u8Imm:$src2),
239 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
240 [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
242 class qi_ALU32_siu9<string opc, Intrinsic IntID>
243 : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u9Imm:$src2),
244 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
245 [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
247 class si_ALU32_qisisi<string opc, Intrinsic IntID>
248 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
250 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
251 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
254 class si_ALU32_qis8si<string opc, Intrinsic IntID>
255 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2,
257 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, $src3)")),
258 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2,
261 class si_ALU32_qisis8<string opc, Intrinsic IntID>
262 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
264 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
265 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
268 class si_ALU32_qis8s8<string opc, Intrinsic IntID>
269 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2, s8Imm:$src3),
270 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
271 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;
273 class si_ALU32_sisi<string opc, Intrinsic IntID>
274 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
275 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
276 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
278 class si_ALU32_sisi_sat<string opc, Intrinsic IntID>
279 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
280 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
281 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
283 class si_ALU32_sisi_rnd<string opc, Intrinsic IntID>
284 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
285 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
286 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
288 class si_ALU32_sis16<string opc, Intrinsic IntID>
289 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s16Imm:$src2),
290 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
291 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
293 class si_ALU32_sis10<string opc, Intrinsic IntID>
294 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
295 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
296 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
298 class si_ALU32_s10si<string opc, Intrinsic IntID>
299 : ALU32_rr<(outs IntRegs:$dst), (ins s10Imm:$src1, IntRegs:$src2),
300 !strconcat("$dst = ", !strconcat(opc , "(#$src1, $src2)")),
301 [(set IntRegs:$dst, (IntID imm:$src1, IntRegs:$src2))]>;
303 class si_lo_ALU32_siu16<string opc, Intrinsic IntID>
304 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
305 !strconcat("$dst.l = ", !strconcat(opc , "#$src2")),
306 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
308 class si_hi_ALU32_siu16<string opc, Intrinsic IntID>
309 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
310 !strconcat("$dst.h = ", !strconcat(opc , "#$src2")),
311 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
313 class si_ALU32_s16<string opc, Intrinsic IntID>
314 : ALU32_rr<(outs IntRegs:$dst), (ins s16Imm:$src1),
315 !strconcat("$dst = ", !strconcat(opc , "#$src1")),
316 [(set IntRegs:$dst, (IntID imm:$src1))]>;
318 class di_ALU32_s8<string opc, Intrinsic IntID>
319 : ALU32_rr<(outs DoubleRegs:$dst), (ins s8Imm:$src1),
320 !strconcat("$dst = ", !strconcat(opc , "#$src1")),
321 [(set DoubleRegs:$dst, (IntID imm:$src1))]>;
323 class di_ALU64_di<string opc, Intrinsic IntID>
324 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
325 !strconcat("$dst = ", !strconcat(opc , "$src")),
326 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
328 class si_ALU32_si<string opc, Intrinsic IntID>
329 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
330 !strconcat("$dst = ", !strconcat(opc , "($src)")),
331 [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
333 class si_ALU32_si_tfr<string opc, Intrinsic IntID>
334 : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
335 !strconcat("$dst = ", !strconcat(opc , "$src")),
336 [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
342 class si_ALU64_si_sat<string opc, Intrinsic IntID>
343 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
344 !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
345 [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
347 class si_ALU64_didi<string opc, Intrinsic IntID>
348 : ALU64_rr<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
349 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
350 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
352 class di_ALU64_sidi<string opc, Intrinsic IntID>
353 : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
354 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
355 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;
357 class di_ALU64_didi<string opc, Intrinsic IntID>
358 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
359 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
360 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
361 DoubleRegs:$src2))]>;
363 class di_ALU64_qididi<string opc, Intrinsic IntID>
364 : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2,
366 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
367 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2,
368 DoubleRegs:$src3))]>;
370 class di_ALU64_sisi<string opc, Intrinsic IntID>
371 : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
372 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
373 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
375 class di_ALU64_didi_sat<string opc, Intrinsic IntID>
376 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
377 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
378 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
379 DoubleRegs:$src2))]>;
381 class di_ALU64_didi_rnd<string opc, Intrinsic IntID>
382 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
383 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
384 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
385 DoubleRegs:$src2))]>;
387 class di_ALU64_didi_crnd<string opc, Intrinsic IntID>
388 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
389 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd")),
390 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
391 DoubleRegs:$src2))]>;
393 class di_ALU64_didi_rnd_sat<string opc, Intrinsic IntID>
394 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
395 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
396 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
397 DoubleRegs:$src2))]>;
399 class di_ALU64_didi_crnd_sat<string opc, Intrinsic IntID>
400 : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
401 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd:sat")),
402 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
403 DoubleRegs:$src2))]>;
405 class qi_ALU64_didi<string opc, Intrinsic IntID>
406 : ALU64_rr<(outs PredRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
407 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
408 [(set PredRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
410 class si_ALU64_sisi<string opc, Intrinsic IntID>
411 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
412 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
413 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
415 class si_ALU64_sisi_sat_lh<string opc, Intrinsic IntID>
416 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
417 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
418 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
420 class si_ALU64_sisi_l16_sat_hh<string opc, Intrinsic IntID>
421 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
422 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
423 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
425 class si_ALU64_sisi_l16_sat_lh<string opc, Intrinsic IntID>
426 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
427 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
428 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
430 class si_ALU64_sisi_l16_sat_hl<string opc, Intrinsic IntID>
431 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
432 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
433 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
435 class si_ALU64_sisi_l16_sat_ll<string opc, Intrinsic IntID>
436 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
437 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
438 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
440 class si_ALU64_sisi_l16_hh<string opc, Intrinsic IntID>
441 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
442 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
443 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
445 class si_ALU64_sisi_l16_hl<string opc, Intrinsic IntID>
446 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
447 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
448 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
450 class si_ALU64_sisi_l16_lh<string opc, Intrinsic IntID>
451 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
452 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
453 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
455 class si_ALU64_sisi_l16_ll<string opc, Intrinsic IntID>
456 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
457 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
458 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
460 class si_ALU64_sisi_h16_sat_hh<string opc, Intrinsic IntID>
461 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
462 !strconcat("$dst = ", !strconcat(opc ,
463 "($src1.H, $src2.H):sat:<<16")),
464 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
466 class si_ALU64_sisi_h16_sat_lh<string opc, Intrinsic IntID>
467 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
468 !strconcat("$dst = ", !strconcat(opc ,
469 "($src1.L, $src2.H):sat:<<16")),
470 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
472 class si_ALU64_sisi_h16_sat_hl<string opc, Intrinsic IntID>
473 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
474 !strconcat("$dst = ", !strconcat(opc ,
475 "($src1.H, $src2.L):sat:<<16")),
476 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
478 class si_ALU64_sisi_h16_sat_ll<string opc, Intrinsic IntID>
479 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
480 !strconcat("$dst = ", !strconcat(opc ,
481 "($src1.L, $src2.L):sat:<<16")),
482 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
484 class si_ALU64_sisi_h16_hh<string opc, Intrinsic IntID>
485 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
486 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<16")),
487 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
489 class si_ALU64_sisi_h16_hl<string opc, Intrinsic IntID>
490 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
491 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<16")),
492 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
494 class si_ALU64_sisi_h16_lh<string opc, Intrinsic IntID>
495 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
496 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<16")),
497 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
499 class si_ALU64_sisi_h16_ll<string opc, Intrinsic IntID>
500 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
501 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<16")),
502 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
504 class si_ALU64_sisi_lh<string opc, Intrinsic IntID>
505 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
506 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
507 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
509 class si_ALU64_sisi_ll<string opc, Intrinsic IntID>
510 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
511 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
512 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
514 class si_ALU64_sisi_sat<string opc, Intrinsic IntID>
515 : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
516 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
517 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
523 class qi_SInst_qi<string opc, Intrinsic IntID>
524 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
525 !strconcat("$dst = ", !strconcat(opc , "($src)")),
526 [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
528 class qi_SInst_qi_pxfer<string opc, Intrinsic IntID>
529 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
530 !strconcat("$dst = ", !strconcat(opc , "$src")),
531 [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
533 class qi_SInst_qiqi<string opc, Intrinsic IntID>
534 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
535 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
536 [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
538 class qi_SInst_qiqi_neg<string opc, Intrinsic IntID>
539 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
540 !strconcat("$dst = ", !strconcat(opc , "($src1, !$src2)")),
541 [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
543 class di_SInst_di<string opc, Intrinsic IntID>
544 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
545 !strconcat("$dst = ", !strconcat(opc , "($src)")),
546 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
548 class di_SInst_di_sat<string opc, Intrinsic IntID>
549 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
550 !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
551 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;
553 class si_SInst_di<string opc, Intrinsic IntID>
554 : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
555 !strconcat("$dst = ", !strconcat(opc , "($src)")),
556 [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;
558 class si_SInst_di_sat<string opc, Intrinsic IntID>
559 : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
560 !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
561 [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;
563 class di_SInst_disi<string opc, Intrinsic IntID>
564 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
565 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
566 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
568 class di_SInst_didi<string opc, Intrinsic IntID>
569 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
570 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
571 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
573 class di_SInst_si<string opc, Intrinsic IntID>
574 : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1),
575 !strconcat("$dst = ", !strconcat(opc , "($src1)")),
576 [(set DoubleRegs:$dst, (IntID IntRegs:$src1))]>;
578 class si_SInst_sisiu3<string opc, Intrinsic IntID>
579 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u3Imm:$src3),
580 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
581 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
584 class si_SInst_diu5<string opc, Intrinsic IntID>
585 : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, u5Imm:$src2),
586 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
587 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;
589 class si_SInst_disi<string opc, Intrinsic IntID>
590 : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
591 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
592 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
594 class si_SInst_sidi<string opc, Intrinsic IntID>
595 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
596 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
597 [(set IntRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;
599 class di_SInst_disisi<string opc, Intrinsic IntID>
600 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2,
602 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
603 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2,
606 class di_SInst_sisi<string opc, Intrinsic IntID>
607 : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
608 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
609 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
611 class qi_SInst_siu5<string opc, Intrinsic IntID>
612 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
613 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
614 [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
616 class qi_SInst_siu6<string opc, Intrinsic IntID>
617 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u6Imm:$src2),
618 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
619 [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
621 class qi_SInst_sisi<string opc, Intrinsic IntID>
622 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
623 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
624 [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
626 class si_SInst_si<string opc, Intrinsic IntID>
627 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
628 !strconcat("$dst = ", !strconcat(opc , "($src)")),
629 [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
631 class si_SInst_si_sat<string opc, Intrinsic IntID>
632 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
633 !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
634 [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
636 class di_SInst_qi<string opc, Intrinsic IntID>
637 : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src),
638 !strconcat("$dst = ", !strconcat(opc , "($src)")),
639 [(set DoubleRegs:$dst, (IntID IntRegs:$src))]>;
641 class si_SInst_qi<string opc, Intrinsic IntID>
642 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
643 !strconcat("$dst = ", !strconcat(opc , "$src")),
644 [(set IntRegs:$dst, (IntID IntRegs:$src))]>;
646 class si_SInst_qiqi<string opc, Intrinsic IntID>
647 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
648 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
649 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
651 class qi_SInst_si<string opc, Intrinsic IntID>
652 : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
653 !strconcat("$dst = ", !strconcat(opc , "$src")),
654 [(set PredRegs:$dst, (IntID IntRegs:$src))]>;
656 class si_SInst_sisi<string opc, Intrinsic IntID>
657 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
658 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
659 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
661 class di_SInst_diu6<string opc, Intrinsic IntID>
662 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2),
663 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
664 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;
666 class si_SInst_siu5<string opc, Intrinsic IntID>
667 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
668 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
669 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
671 class si_SInst_siu5_rnd<string opc, Intrinsic IntID>
672 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
673 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2):rnd")),
674 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
676 class si_SInst_siu5u5<string opc, Intrinsic IntID>
677 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2, u5Imm:$src3),
678 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
679 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;
681 class si_SInst_sisisi_acc<string opc, Intrinsic IntID>
682 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
684 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
685 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
689 class si_SInst_sisisi_nac<string opc, Intrinsic IntID>
690 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
692 !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
693 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
697 class di_SInst_didisi_acc<string opc, Intrinsic IntID>
698 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
700 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
701 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
706 class di_SInst_didisi_nac<string opc, Intrinsic IntID>
707 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
709 !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
710 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
711 DoubleRegs:$src1, IntRegs:$src2))],
714 class si_SInst_sisiu5u5<string opc, Intrinsic IntID>
715 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
716 u5Imm:$src2, u5Imm:$src3),
717 !strconcat("$dst = ", !strconcat(opc ,
718 "($src1, #$src2, #$src3)")),
719 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
720 imm:$src2, imm:$src3))],
723 class si_SInst_sisidi<string opc, Intrinsic IntID>
724 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
726 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
727 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
731 class di_SInst_didiu6u6<string opc, Intrinsic IntID>
732 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
733 u6Imm:$src2, u6Imm:$src3),
734 !strconcat("$dst = ", !strconcat(opc ,
735 "($src1, #$src2, #$src3)")),
736 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
737 imm:$src2, imm:$src3))],
740 class di_SInst_dididi<string opc, Intrinsic IntID>
741 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
743 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
744 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
749 class di_SInst_diu6u6<string opc, Intrinsic IntID>
750 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2,
752 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
753 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2,
756 class di_SInst_didiqi<string opc, Intrinsic IntID>
757 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
759 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
760 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
763 class di_SInst_didiu3<string opc, Intrinsic IntID>
764 : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
766 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
767 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
770 class di_SInst_didisi_or<string opc, Intrinsic IntID>
771 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
773 !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
774 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
778 class di_SInst_didisi_and<string opc, Intrinsic IntID>
779 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
781 !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
782 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
786 class di_SInst_didiu6_and<string opc, Intrinsic IntID>
787 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
789 !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
790 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
794 class di_SInst_didiu6_or<string opc, Intrinsic IntID>
795 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
797 !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
798 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
802 class di_SInst_didiu6_xor<string opc, Intrinsic IntID>
803 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
805 !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
806 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
810 class si_SInst_sisisi_and<string opc, Intrinsic IntID>
811 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
813 !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
814 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
818 class si_SInst_sisisi_or<string opc, Intrinsic IntID>
819 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
821 !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
822 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
827 class si_SInst_sisiu5_and<string opc, Intrinsic IntID>
828 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
830 !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
831 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
835 class si_SInst_sisiu5_or<string opc, Intrinsic IntID>
836 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
838 !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
839 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
843 class si_SInst_sisiu5_xor<string opc, Intrinsic IntID>
844 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
846 !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
847 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
851 class si_SInst_sisiu5_acc<string opc, Intrinsic IntID>
852 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
854 !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
855 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
859 class si_SInst_sisiu5_nac<string opc, Intrinsic IntID>
860 : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
862 !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
863 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
867 class di_SInst_didiu6_acc<string opc, Intrinsic IntID>
868 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
870 !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
871 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
872 DoubleRegs:$src1, imm:$src2))],
875 class di_SInst_didiu6_nac<string opc, Intrinsic IntID>
876 : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
878 !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
879 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
888 class di_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
889 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
890 !strconcat("$dst = ", !strconcat(opc ,
891 "($src1.H, $src2.H):<<1:rnd")),
892 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
894 class di_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
895 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
896 !strconcat("$dst = ", !strconcat(opc ,
897 "($src1.H, $src2.H):rnd")),
898 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
900 class di_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
901 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
902 !strconcat("$dst = ", !strconcat(opc ,
903 "($src1.H, $src2.L):<<1:rnd")),
904 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
906 class di_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
907 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
908 !strconcat("$dst = ", !strconcat(opc ,
909 "($src1.H, $src2.L):rnd")),
910 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
912 class di_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
913 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
914 !strconcat("$dst = ", !strconcat(opc ,
915 "($src1.L, $src2.H):<<1:rnd")),
916 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
918 class di_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
919 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
920 !strconcat("$dst = ", !strconcat(opc ,
921 "($src1.L, $src2.H):rnd")),
922 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
924 class di_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
925 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
926 !strconcat("$dst = ", !strconcat(opc ,
927 "($src1.L, $src2.L):<<1:rnd")),
928 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
930 class di_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
931 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
932 !strconcat("$dst = ", !strconcat(opc ,
933 "($src1.L, $src2.L):rnd")),
934 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
936 class di_MInst_disisi_acc<string opc, Intrinsic IntID>
937 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
939 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
940 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
944 class di_MInst_disisi_nac<string opc, Intrinsic IntID>
945 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
947 !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
948 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
952 class di_MInst_disisi_acc_sat<string opc, Intrinsic IntID>
953 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
955 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
956 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
960 class di_MInst_disisi_nac_sat<string opc, Intrinsic IntID>
961 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
963 !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2):sat")),
964 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
968 class di_MInst_disisi_acc_sat_conj<string opc, Intrinsic IntID>
969 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
971 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*):sat")),
972 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
976 class di_MInst_disisi_nac_sat_conj<string opc, Intrinsic IntID>
977 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
979 !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2*):sat")),
980 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
984 class di_MInst_disisi_nac_s1_sat<string opc, Intrinsic IntID>
985 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
987 !strconcat("$dst -= ", !strconcat(opc ,
988 "($src1, $src2):<<1:sat")),
989 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
993 class di_MInst_disisi_acc_s1_sat_conj<string opc, Intrinsic IntID>
994 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
996 !strconcat("$dst += ", !strconcat(opc ,
997 "($src1, $src2*):<<1:sat")),
998 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1002 class di_MInst_disisi_nac_s1_sat_conj<string opc, Intrinsic IntID>
1003 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1005 !strconcat("$dst -= ", !strconcat(opc ,
1006 "($src1, $src2*):<<1:sat")),
1007 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1011 class di_MInst_s8s8<string opc, Intrinsic IntID>
1012 : MInst<(outs DoubleRegs:$dst), (ins s8Imm:$src1, s8Imm:$src2),
1013 !strconcat("$dst = ", !strconcat(opc , "(#$src1, #$src2)")),
1014 [(set DoubleRegs:$dst, (IntID imm:$src1, imm:$src2))]>;
1016 class si_MInst_sis9<string opc, Intrinsic IntID>
1017 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s9Imm:$src2),
1018 !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
1019 [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;
1021 class si_MInst_sisi<string opc, Intrinsic IntID>
1022 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1023 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1024 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1026 class di_MInst_sisi_hh<string opc, Intrinsic IntID>
1027 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1028 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
1029 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1031 class di_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
1032 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1033 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
1034 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1036 class di_MInst_sisi_lh<string opc, Intrinsic IntID>
1037 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1038 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
1039 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1041 class di_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
1042 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1043 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
1044 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1046 class di_MInst_sisi_hl<string opc, Intrinsic IntID>
1047 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1048 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
1049 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1051 class di_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
1052 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1053 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
1054 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1056 class di_MInst_sisi_ll<string opc, Intrinsic IntID>
1057 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1058 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
1059 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1061 class di_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
1062 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1063 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
1064 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1067 class si_MInst_sisi_hh<string opc, Intrinsic IntID>
1068 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1069 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
1070 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1072 class si_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
1073 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1074 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
1075 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1077 class si_MInst_sisi_lh<string opc, Intrinsic IntID>
1078 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1079 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
1080 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1082 class si_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
1083 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1084 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
1085 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1087 class si_MInst_sisi_hl<string opc, Intrinsic IntID>
1088 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1089 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
1090 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1092 class si_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
1093 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1094 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
1095 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1097 class si_MInst_sisi_ll<string opc, Intrinsic IntID>
1098 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1099 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
1100 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1102 class si_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
1103 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1104 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
1105 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1107 class si_MInst_sisi_up<string opc, Intrinsic IntID>
1108 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1109 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1110 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1112 class di_MInst_didi<string opc, Intrinsic IntID>
1113 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1114 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1115 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1116 DoubleRegs:$src2))]>;
1118 class di_MInst_didi_conj<string opc, Intrinsic IntID>
1119 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1120 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*)")),
1121 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1122 DoubleRegs:$src2))]>;
1124 class di_MInst_sisi_s1_sat_conj<string opc, Intrinsic IntID>
1125 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1126 !strconcat("$dst = ", !strconcat(opc ,
1127 "($src1, $src2*):<<1:sat")),
1128 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1130 class di_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
1131 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1132 !strconcat("$dst = ", !strconcat(opc ,
1133 "($src1, $src2):<<1:rnd:sat")),
1134 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1135 DoubleRegs:$src2))]>;
1137 class di_MInst_didi_sat<string opc, Intrinsic IntID>
1138 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1139 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
1140 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1141 DoubleRegs:$src2))]>;
1143 class di_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
1144 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1145 !strconcat("$dst = ", !strconcat(opc ,
1146 "($src1, $src2):rnd:sat")),
1147 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1148 DoubleRegs:$src2))]>;
1150 class si_SInst_sisi_sat<string opc, Intrinsic IntID>
1151 : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1152 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
1153 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1155 class si_SInst_didi_sat<string opc, Intrinsic IntID>
1156 : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1157 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
1158 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
1160 class si_SInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
1161 : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
1162 !strconcat("$dst = ", !strconcat(opc ,
1163 "($src1, $src2):<<1:rnd:sat")),
1164 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
1166 class si_MInst_sisi_s1_rnd_sat<string opc, Intrinsic IntID>
1167 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1168 !strconcat("$dst = ", !strconcat(opc ,
1169 "($src1, $src2):<<1:rnd:sat")),
1170 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1172 class si_MInst_sisi_l_s1_rnd_sat<string opc, Intrinsic IntID>
1173 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1174 !strconcat("$dst = ", !strconcat(opc ,
1175 "($src1, $src2.L):<<1:rnd:sat")),
1176 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1178 class si_MInst_sisi_h_s1_rnd_sat<string opc, Intrinsic IntID>
1179 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1180 !strconcat("$dst = ", !strconcat(opc ,
1181 "($src1, $src2.H):<<1:rnd:sat")),
1182 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1184 class si_MInst_sisi_rnd_sat_conj<string opc, Intrinsic IntID>
1185 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1186 !strconcat("$dst = ", !strconcat(opc ,
1187 "($src1, $src2*):rnd:sat")),
1188 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1190 class si_MInst_sisi_s1_rnd_sat_conj<string opc, Intrinsic IntID>
1191 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1192 !strconcat("$dst = ", !strconcat(opc ,
1193 "($src1, $src2*):<<1:rnd:sat")),
1194 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1196 class si_MInst_sisi_rnd_sat<string opc, Intrinsic IntID>
1197 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1198 !strconcat("$dst = ", !strconcat(opc ,
1199 "($src1, $src2):rnd:sat")),
1200 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1202 class si_MInst_sisi_rnd<string opc, Intrinsic IntID>
1203 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1204 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
1205 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1207 class si_MInst_sisisi_xacc<string opc, Intrinsic IntID>
1208 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1210 !strconcat("$dst ^= ", !strconcat(opc , "($src2, $src3)")),
1211 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1215 class si_MInst_sisisi_acc<string opc, Intrinsic IntID>
1216 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1218 !strconcat("$dst += ", !strconcat(opc , "($src2, $src3)")),
1219 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1223 class si_MInst_sisisi_nac<string opc, Intrinsic IntID>
1224 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1226 !strconcat("$dst -= ", !strconcat(opc , "($src2, $src3)")),
1227 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1231 class si_MInst_sisis8_acc<string opc, Intrinsic IntID>
1232 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1234 !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
1235 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1239 class si_MInst_sisis8_nac<string opc, Intrinsic IntID>
1240 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1242 !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
1243 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1247 class si_MInst_sisiu4u5<string opc, Intrinsic IntID>
1248 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1249 u4Imm:$src2, u5Imm:$src3),
1250 !strconcat("$dst = ", !strconcat(opc ,
1251 "($src1, #$src2, #$src3)")),
1252 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1253 imm:$src2, imm:$src3))],
1256 class si_MInst_sisiu8_acc<string opc, Intrinsic IntID>
1257 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1259 !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
1260 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1264 class si_MInst_sisiu8_nac<string opc, Intrinsic IntID>
1265 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
1267 !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
1268 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
1272 class si_MInst_sisisi_acc_hh<string opc, Intrinsic IntID>
1273 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1275 !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
1276 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1280 class si_MInst_sisisi_acc_sat_lh<string opc, Intrinsic IntID>
1281 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1283 !strconcat("$dst += ", !strconcat(opc ,
1284 "($src1.L, $src2.H):sat")),
1285 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1289 class si_MInst_sisisi_acc_sat_lh_s1<string opc, Intrinsic IntID>
1290 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1292 !strconcat("$dst += ", !strconcat(opc ,
1293 "($src1.L, $src2.H):<<1:sat")),
1294 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1298 class si_MInst_sisisi_acc_sat_hh<string opc, Intrinsic IntID>
1299 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1301 !strconcat("$dst += ", !strconcat(opc ,
1302 "($src1.H, $src2.H):sat")),
1303 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1307 class si_MInst_sisisi_acc_sat_hh_s1<string opc, Intrinsic IntID>
1308 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1310 !strconcat("$dst += ", !strconcat(opc ,
1311 "($src1.H, $src2.H):<<1:sat")),
1312 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1316 class si_MInst_sisisi_acc_hh_s1<string opc, Intrinsic IntID>
1317 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1319 !strconcat("$dst += ", !strconcat(opc ,
1320 "($src1.H, $src2.H):<<1")),
1321 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1325 class si_MInst_sisisi_nac_hh<string opc, Intrinsic IntID>
1326 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1328 !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
1329 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1333 class si_MInst_sisisi_nac_sat_hh_s1<string opc, Intrinsic IntID>
1334 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1336 !strconcat("$dst -= ", !strconcat(opc ,
1337 "($src1.H, $src2.H):<<1:sat")),
1338 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1342 class si_MInst_sisisi_nac_sat_hh<string opc, Intrinsic IntID>
1343 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1345 !strconcat("$dst -= ", !strconcat(opc ,
1346 "($src1.H, $src2.H):sat")),
1347 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1351 class si_MInst_sisisi_nac_sat_hl_s1<string opc, Intrinsic IntID>
1352 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1354 !strconcat("$dst -= ", !strconcat(opc ,
1355 "($src1.H, $src2.L):<<1:sat")),
1356 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1360 class si_MInst_sisisi_nac_sat_hl<string opc, Intrinsic IntID>
1361 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1363 !strconcat("$dst -= ", !strconcat(opc ,
1364 "($src1.H, $src2.L):sat")),
1365 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1369 class si_MInst_sisisi_nac_sat_lh_s1<string opc, Intrinsic IntID>
1370 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1372 !strconcat("$dst -= ", !strconcat(opc ,
1373 "($src1.L, $src2.H):<<1:sat")),
1374 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1378 class si_MInst_sisisi_nac_sat_lh<string opc, Intrinsic IntID>
1379 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1381 !strconcat("$dst -= ", !strconcat(opc ,
1382 "($src1.L, $src2.H):sat")),
1383 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1387 class si_MInst_sisisi_nac_sat_ll_s1<string opc, Intrinsic IntID>
1388 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1390 !strconcat("$dst -= ", !strconcat(opc ,
1391 "($src1.L, $src2.L):<<1:sat")),
1392 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1396 class si_MInst_sisisi_nac_sat_ll<string opc, Intrinsic IntID>
1397 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1399 !strconcat("$dst -= ", !strconcat(opc ,
1400 "($src1.L, $src2.L):sat")),
1401 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1405 class si_MInst_sisisi_nac_hh_s1<string opc, Intrinsic IntID>
1406 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1408 !strconcat("$dst -= ", !strconcat(opc ,
1409 "($src1.H, $src2.H):<<1")),
1410 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1414 class si_MInst_sisisi_acc_hl<string opc, Intrinsic IntID>
1415 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1417 !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
1418 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1422 class si_MInst_sisisi_acc_hl_s1<string opc, Intrinsic IntID>
1423 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1425 !strconcat("$dst += ", !strconcat(opc ,
1426 "($src1.H, $src2.L):<<1")),
1427 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1431 class si_MInst_sisisi_nac_hl<string opc, Intrinsic IntID>
1432 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1434 !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
1435 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1439 class si_MInst_sisisi_nac_hl_s1<string opc, Intrinsic IntID>
1440 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1442 !strconcat("$dst -= ", !strconcat(opc ,
1443 "($src1.H, $src2.L):<<1")),
1444 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1448 class si_MInst_sisisi_acc_lh<string opc, Intrinsic IntID>
1449 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1451 !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
1452 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1456 class si_MInst_sisisi_acc_lh_s1<string opc, Intrinsic IntID>
1457 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1459 !strconcat("$dst += ", !strconcat(opc ,
1460 "($src1.L, $src2.H):<<1")),
1461 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1465 class si_MInst_sisisi_nac_lh<string opc, Intrinsic IntID>
1466 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1468 !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
1469 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1473 class si_MInst_sisisi_nac_lh_s1<string opc, Intrinsic IntID>
1474 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1476 !strconcat("$dst -= ", !strconcat(opc ,
1477 "($src1.L, $src2.H):<<1")),
1478 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1482 class si_MInst_sisisi_acc_ll<string opc, Intrinsic IntID>
1483 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1485 !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
1486 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1490 class si_MInst_sisisi_acc_ll_s1<string opc, Intrinsic IntID>
1491 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1493 !strconcat("$dst += ", !strconcat(opc ,
1494 "($src1.L, $src2.L):<<1")),
1495 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1499 class si_MInst_sisisi_acc_sat_ll_s1<string opc, Intrinsic IntID>
1500 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1502 !strconcat("$dst += ", !strconcat(opc ,
1503 "($src1.L, $src2.L):<<1:sat")),
1504 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1508 class si_MInst_sisisi_acc_sat_hl_s1<string opc, Intrinsic IntID>
1509 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1511 !strconcat("$dst += ", !strconcat(opc ,
1512 "($src1.H, $src2.L):<<1:sat")),
1513 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1517 class si_MInst_sisisi_acc_sat_ll<string opc, Intrinsic IntID>
1518 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1520 !strconcat("$dst += ", !strconcat(opc ,
1521 "($src1.L, $src2.L):sat")),
1522 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1526 class si_MInst_sisisi_acc_sat_hl<string opc, Intrinsic IntID>
1527 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1529 !strconcat("$dst += ", !strconcat(opc ,
1530 "($src1.H, $src2.L):sat")),
1531 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1535 class si_MInst_sisisi_nac_ll<string opc, Intrinsic IntID>
1536 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1538 !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
1539 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1543 class si_MInst_sisisi_nac_ll_s1<string opc, Intrinsic IntID>
1544 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1546 !strconcat("$dst -= ", !strconcat(opc ,
1547 "($src1.L, $src2.L):<<1")),
1548 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1552 class si_MInst_sisisi_nac_hh_sat<string opc, Intrinsic IntID>
1553 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1555 !strconcat("$dst -= ", !strconcat(opc ,
1556 "($src1.H, $src2.H):sat")),
1557 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1561 class si_MInst_sisisi_nac_hh_s1_sat<string opc, Intrinsic IntID>
1562 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1564 !strconcat("$dst -= ", !strconcat(opc ,
1565 "($src1.H, $src2.H):<<1:sat")),
1566 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1570 class si_MInst_sisisi_nac_hl_sat<string opc, Intrinsic IntID>
1571 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1573 !strconcat("$dst -= ", !strconcat(opc ,
1574 "($src1.H, $src2.L):sat")),
1575 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1579 class si_MInst_sisisi_nac_hl_s1_sat<string opc, Intrinsic IntID>
1580 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1582 !strconcat("$dst -= ", !strconcat(opc ,
1583 "($src1.H, $src2.L):<<1:sat")),
1584 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1588 class si_MInst_sisisi_nac_lh_sat<string opc, Intrinsic IntID>
1589 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1591 !strconcat("$dst -= ", !strconcat(opc ,
1592 "($src1.L, $src2.H):sat")),
1593 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1597 class si_MInst_sisisi_nac_lh_s1_sat<string opc, Intrinsic IntID>
1598 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1600 !strconcat("$dst -= ", !strconcat(opc ,
1601 "($src1.L, $src2.H):<<1:sat")),
1602 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1606 class si_MInst_sisisi_nac_ll_sat<string opc, Intrinsic IntID>
1607 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1609 !strconcat("$dst -= ", !strconcat(opc ,
1610 "($src1.L, $src2.L):sat")),
1611 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1615 class si_MInst_sisisi_nac_ll_s1_sat<string opc, Intrinsic IntID>
1616 : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
1618 !strconcat("$dst -= ", !strconcat(opc ,
1619 "($src1.L, $src2.L):<<1:sat")),
1620 [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
1624 class di_ALU32_sisi<string opc, Intrinsic IntID>
1625 : ALU32_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1626 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1627 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1629 class di_MInst_sisi<string opc, Intrinsic IntID>
1630 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1631 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
1632 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1634 class di_MInst_sisi_sat<string opc, Intrinsic IntID>
1635 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1636 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
1637 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1639 class di_MInst_sisi_sat_conj<string opc, Intrinsic IntID>
1640 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1641 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*):sat")),
1642 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1644 class di_MInst_sisi_s1_sat<string opc, Intrinsic IntID>
1645 : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1646 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
1647 [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1649 class di_MInst_didi_s1_sat<string opc, Intrinsic IntID>
1650 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1651 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
1652 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
1653 DoubleRegs:$src2))]>;
1655 class si_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
1656 : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1657 !strconcat("$dst = ", !strconcat(opc ,
1658 "($src1, $src2):<<1:rnd:sat")),
1659 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
1661 class si_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
1662 : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
1663 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
1664 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
1666 class si_MInst_sisi_sat_hh<string opc, Intrinsic IntID>
1667 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1668 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
1669 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1671 class si_MInst_sisi_sat_hh_s1<string opc, Intrinsic IntID>
1672 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1673 !strconcat("$dst = ", !strconcat(opc ,
1674 "($src1.H, $src2.H):<<1:sat")),
1675 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1677 class si_MInst_sisi_sat_hl<string opc, Intrinsic IntID>
1678 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1679 !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
1680 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1682 class si_MInst_sisi_sat_hl_s1<string opc, Intrinsic IntID>
1683 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1684 !strconcat("$dst = ", !strconcat(opc ,
1685 "($src1.H, $src2.L):<<1:sat")),
1686 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1688 class si_MInst_sisi_sat_lh<string opc, Intrinsic IntID>
1689 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1690 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
1691 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1693 class si_MInst_sisi_sat_lh_s1<string opc, Intrinsic IntID>
1694 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1695 !strconcat("$dst = ", !strconcat(opc ,
1696 "($src1.L, $src2.H):<<1:sat")),
1697 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1699 class si_MInst_sisi_sat_ll<string opc, Intrinsic IntID>
1700 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1701 !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
1702 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1704 class si_MInst_sisi_sat_ll_s1<string opc, Intrinsic IntID>
1705 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1706 !strconcat("$dst = ", !strconcat(opc ,
1707 "($src1.L, $src2.L):<<1:sat")),
1708 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1710 class si_MInst_sisi_sat_rnd_hh<string opc, Intrinsic IntID>
1711 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1712 !strconcat("$dst = ", !strconcat(opc ,
1713 "($src1.H, $src2.H):rnd:sat")),
1714 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1716 class si_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
1717 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1718 !strconcat("$dst = ", !strconcat(opc ,
1719 "($src1.H, $src2.H):rnd")),
1720 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1722 class si_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
1723 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1724 !strconcat("$dst = ", !strconcat(opc ,
1725 "($src1.H, $src2.H):<<1:rnd")),
1726 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1728 class si_MInst_sisi_sat_rnd_hh_s1<string opc, Intrinsic IntID>
1729 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1730 !strconcat("$dst = ",
1732 "($src1.H, $src2.H):<<1:rnd:sat")),
1733 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1735 class si_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
1736 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1737 !strconcat("$dst = ",
1738 !strconcat(opc , "($src1.H, $src2.L):rnd")),
1739 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1741 class si_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
1742 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1743 !strconcat("$dst = ",
1744 !strconcat(opc , "($src1.H, $src2.L):<<1:rnd")),
1745 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1747 class si_MInst_sisi_sat_rnd_hl<string opc, Intrinsic IntID>
1748 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1749 !strconcat("$dst = ",
1750 !strconcat(opc , "($src1.H, $src2.L):rnd:sat")),
1751 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1753 class si_MInst_sisi_sat_rnd_hl_s1<string opc, Intrinsic IntID>
1754 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1755 !strconcat("$dst = ",
1756 !strconcat(opc , "($src1.H, $src2.L):<<1:rnd:sat")),
1757 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1759 class si_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
1760 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1761 !strconcat("$dst = ",
1762 !strconcat(opc , "($src1.L, $src2.H):rnd")),
1763 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1765 class si_MInst_sisi_sat_rnd_lh<string opc, Intrinsic IntID>
1766 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1767 !strconcat("$dst = ",
1768 !strconcat(opc , "($src1.L, $src2.H):rnd:sat")),
1769 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1771 class si_MInst_sisi_sat_rnd_lh_s1<string opc, Intrinsic IntID>
1772 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1773 !strconcat("$dst = ",
1774 !strconcat(opc , "($src1.L, $src2.H):<<1:rnd:sat")),
1775 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1777 class si_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
1778 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1779 !strconcat("$dst = ",
1780 !strconcat(opc , "($src1.L, $src2.H):<<1:rnd")),
1781 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1783 class si_MInst_sisi_sat_rnd_ll<string opc, Intrinsic IntID>
1784 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1785 !strconcat("$dst = ",
1786 !strconcat(opc , "($src1.L, $src2.L):rnd:sat")),
1787 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1789 class si_MInst_sisi_sat_rnd_ll_s1<string opc, Intrinsic IntID>
1790 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1791 !strconcat("$dst = ",
1792 !strconcat(opc , "($src1.L, $src2.L):<<1:rnd:sat")),
1793 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1795 class si_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
1796 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1797 !strconcat("$dst = ",
1798 !strconcat(opc , "($src1.L, $src2.L):rnd")),
1799 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1801 class si_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
1802 : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
1803 !strconcat("$dst = ",
1804 !strconcat(opc , "($src1.L, $src2.L):<<1:rnd")),
1805 [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;
1807 class di_MInst_dididi_acc_sat<string opc, Intrinsic IntID>
1808 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
1809 DoubleRegs:$src1, DoubleRegs:$src2),
1810 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
1811 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1813 DoubleRegs:$src2))],
1816 class di_MInst_dididi_acc_rnd_sat<string opc, Intrinsic IntID>
1817 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1819 !strconcat("$dst += ",
1820 !strconcat(opc , "($src1, $src2):rnd:sat")),
1821 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1823 DoubleRegs:$src2))],
1826 class di_MInst_dididi_acc_s1<string opc, Intrinsic IntID>
1827 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
1830 !strconcat("$dst += ",
1831 !strconcat(opc , "($src1, $src2):<<1")),
1832 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1834 DoubleRegs:$src2))],
1838 class di_MInst_dididi_acc_s1_sat<string opc, Intrinsic IntID>
1839 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
1842 !strconcat("$dst += ",
1843 !strconcat(opc , "($src1, $src2):<<1:sat")),
1844 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1846 DoubleRegs:$src2))],
1849 class di_MInst_dididi_acc_s1_rnd_sat<string opc, Intrinsic IntID>
1850 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1852 !strconcat("$dst += ",
1853 !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
1854 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1856 DoubleRegs:$src2))],
1859 class di_MInst_dididi_acc<string opc, Intrinsic IntID>
1860 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1862 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
1863 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1865 DoubleRegs:$src2))],
1868 class di_MInst_dididi_acc_conj<string opc, Intrinsic IntID>
1869 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
1871 !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*)")),
1872 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
1874 DoubleRegs:$src2))],
1877 class di_MInst_disisi_acc_hh<string opc, Intrinsic IntID>
1878 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1880 !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
1881 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1885 class di_MInst_disisi_acc_hl<string opc, Intrinsic IntID>
1886 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1888 !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
1889 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1893 class di_MInst_disisi_acc_lh<string opc, Intrinsic IntID>
1894 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1896 !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
1897 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1901 class di_MInst_disisi_acc_ll<string opc, Intrinsic IntID>
1902 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1904 !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
1905 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1909 class di_MInst_disisi_acc_hh_s1<string opc, Intrinsic IntID>
1910 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1912 !strconcat("$dst += ",
1913 !strconcat(opc , "($src1.H, $src2.H):<<1")),
1914 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1918 class di_MInst_disisi_acc_hl_s1<string opc, Intrinsic IntID>
1919 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1921 !strconcat("$dst += ",
1922 !strconcat(opc , "($src1.H, $src2.L):<<1")),
1923 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1927 class di_MInst_disisi_acc_lh_s1<string opc, Intrinsic IntID>
1928 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1930 !strconcat("$dst += ",
1931 !strconcat(opc , "($src1.L, $src2.H):<<1")),
1932 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1936 class di_MInst_disisi_acc_ll_s1<string opc, Intrinsic IntID>
1937 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1939 !strconcat("$dst += ",
1940 !strconcat(opc , "($src1.L, $src2.L):<<1")),
1941 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1945 class di_MInst_disisi_nac_hh<string opc, Intrinsic IntID>
1946 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1948 !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
1949 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1953 class di_MInst_disisi_nac_hl<string opc, Intrinsic IntID>
1954 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1956 !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
1957 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1961 class di_MInst_disisi_nac_lh<string opc, Intrinsic IntID>
1962 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1964 !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
1965 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1969 class di_MInst_disisi_nac_ll<string opc, Intrinsic IntID>
1970 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1972 !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
1973 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1977 class di_MInst_disisi_nac_hh_s1<string opc, Intrinsic IntID>
1978 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1980 !strconcat("$dst -= ",
1981 !strconcat(opc , "($src1.H, $src2.H):<<1")),
1982 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1986 class di_MInst_disisi_nac_hl_s1<string opc, Intrinsic IntID>
1987 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1989 !strconcat("$dst -= ",
1990 !strconcat(opc , "($src1.H, $src2.L):<<1")),
1991 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
1995 class di_MInst_disisi_nac_lh_s1<string opc, Intrinsic IntID>
1996 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
1998 !strconcat("$dst -= ",
1999 !strconcat(opc , "($src1.L, $src2.H):<<1")),
2000 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
2004 class di_MInst_disisi_nac_ll_s1<string opc, Intrinsic IntID>
2005 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
2007 !strconcat("$dst -= ",
2008 !strconcat(opc , "($src1.L, $src2.L):<<1")),
2009 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
2013 class di_MInst_disisi_acc_s1_sat<string opc, Intrinsic IntID>
2014 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
2016 !strconcat("$dst += ",
2017 !strconcat(opc , "($src1, $src2):<<1:sat")),
2018 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
2022 class di_MInst_disi_s1_sat<string opc, Intrinsic IntID>
2023 : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
2024 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
2025 [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
2027 class di_MInst_didisi_acc_s1_sat<string opc, Intrinsic IntID>
2028 : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
2030 !strconcat("$dst += ",
2031 !strconcat(opc , "($src1, $src2):<<1:sat")),
2032 [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
2037 class si_MInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
2038 : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
2039 !strconcat("$dst = ",
2040 !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
2041 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;
2043 class si_MInst_didi<string opc, Intrinsic IntID>
2044 : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
2045 !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
2046 [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;
2049 class T_RI_pat <InstHexagon MI, Intrinsic IntID>
2050 : Pat<(IntID (i32 IntRegs:$Rs), imm:$It),
2051 (MI IntRegs:$Rs, imm:$It)>;
2056 let mayLoad = 1, hasSideEffects = 0 in
2057 class di_LDInstPI_diu4<string opc, Intrinsic IntID>
2058 : LDInstPI<(outs IntRegs:$dst, DoubleRegs:$dst2),
2059 (ins IntRegs:$src1, IntRegs:$src2, CtrRegs:$src3, s4Imm:$offset),
2060 "$dst2 = memd($src1++#$offset:circ($src3))",
2064 /********************************************************************
2066 *********************************************************************/
2068 // ALU32 / ALU / Add.
2070 si_ALU32_sisi <"add", int_hexagon_A2_add>;
2071 def HEXAGON_A2_addi:
2072 si_ALU32_sis16 <"add", int_hexagon_A2_addi>;
2074 // ALU32 / ALU / Logical operations.
2076 si_ALU32_sisi <"and", int_hexagon_A2_and>;
2077 def HEXAGON_A2_andir:
2078 si_ALU32_sis10 <"and", int_hexagon_A2_andir>;
2080 si_ALU32_si <"not", int_hexagon_A2_not>;
2082 si_ALU32_sisi <"or", int_hexagon_A2_or>;
2083 def HEXAGON_A2_orir:
2084 si_ALU32_sis10 <"or", int_hexagon_A2_orir>;
2086 si_ALU32_sisi <"xor", int_hexagon_A2_xor>;
2088 // ALU32 / ALU / Negate.
2090 si_ALU32_si <"neg", int_hexagon_A2_neg>;
2092 // ALU32 / ALU / Subtract.
2094 si_ALU32_sisi <"sub", int_hexagon_A2_sub>;
2095 def HEXAGON_A2_subri:
2096 si_ALU32_s10si <"sub", int_hexagon_A2_subri>;
2098 // ALU32 / ALU / Transfer Immediate.
2099 def HEXAGON_A2_tfril:
2100 si_lo_ALU32_siu16 <"", int_hexagon_A2_tfril>;
2101 def HEXAGON_A2_tfrih:
2102 si_hi_ALU32_siu16 <"", int_hexagon_A2_tfrih>;
2103 def HEXAGON_A2_tfrsi:
2104 si_ALU32_s16 <"", int_hexagon_A2_tfrsi>;
2105 def HEXAGON_A2_tfrpi:
2106 di_ALU32_s8 <"", int_hexagon_A2_tfrpi>;
2108 // ALU32 / ALU / Transfer Register.
2110 si_ALU32_si_tfr <"", int_hexagon_A2_tfr>;
2112 /********************************************************************
2114 *********************************************************************/
2116 // ALU32 / PERM / Combine.
2117 def HEXAGON_A2_combinew:
2118 di_ALU32_sisi <"combine", int_hexagon_A2_combinew>;
2119 def HEXAGON_A2_combine_hh:
2120 si_MInst_sisi_hh <"combine", int_hexagon_A2_combine_hh>;
2121 def HEXAGON_A2_combine_lh:
2122 si_MInst_sisi_lh <"combine", int_hexagon_A2_combine_lh>;
2123 def HEXAGON_A2_combine_hl:
2124 si_MInst_sisi_hl <"combine", int_hexagon_A2_combine_hl>;
2125 def HEXAGON_A2_combine_ll:
2126 si_MInst_sisi_ll <"combine", int_hexagon_A2_combine_ll>;
2127 def HEXAGON_A2_combineii:
2128 di_MInst_s8s8 <"combine", int_hexagon_A2_combineii>;
2130 // ALU32 / PERM / Mux.
2132 si_ALU32_qisisi <"mux", int_hexagon_C2_mux>;
2133 def HEXAGON_C2_muxri:
2134 si_ALU32_qis8si <"mux", int_hexagon_C2_muxri>;
2135 def HEXAGON_C2_muxir:
2136 si_ALU32_qisis8 <"mux", int_hexagon_C2_muxir>;
2137 def HEXAGON_C2_muxii:
2138 si_ALU32_qis8s8 <"mux", int_hexagon_C2_muxii>;
2140 // ALU32 / PERM / Shift halfword.
2141 def HEXAGON_A2_aslh:
2142 si_ALU32_si <"aslh", int_hexagon_A2_aslh>;
2143 def HEXAGON_A2_asrh:
2144 si_ALU32_si <"asrh", int_hexagon_A2_asrh>;
2145 def SI_to_SXTHI_asrh:
2146 si_ALU32_si <"asrh", int_hexagon_SI_to_SXTHI_asrh>;
2148 // ALU32 / PERM / Sign/zero extend.
2149 def HEXAGON_A2_sxth:
2150 si_ALU32_si <"sxth", int_hexagon_A2_sxth>;
2151 def HEXAGON_A2_sxtb:
2152 si_ALU32_si <"sxtb", int_hexagon_A2_sxtb>;
2153 def HEXAGON_A2_zxth:
2154 si_ALU32_si <"zxth", int_hexagon_A2_zxth>;
2155 def HEXAGON_A2_zxtb:
2156 si_ALU32_si <"zxtb", int_hexagon_A2_zxtb>;
2158 /********************************************************************
2160 *********************************************************************/
2162 // ALU32 / PRED / Compare.
2163 def HEXAGON_C2_cmpeq:
2164 qi_ALU32_sisi <"cmp.eq", int_hexagon_C2_cmpeq>;
2165 def HEXAGON_C2_cmpeqi:
2166 qi_ALU32_sis10 <"cmp.eq", int_hexagon_C2_cmpeqi>;
2167 def HEXAGON_C2_cmpgei:
2168 qi_ALU32_sis8 <"cmp.ge", int_hexagon_C2_cmpgei>;
2169 def HEXAGON_C2_cmpgeui:
2170 qi_ALU32_siu8 <"cmp.geu", int_hexagon_C2_cmpgeui>;
2171 def HEXAGON_C2_cmpgt:
2172 qi_ALU32_sisi <"cmp.gt", int_hexagon_C2_cmpgt>;
2173 def HEXAGON_C2_cmpgti:
2174 qi_ALU32_sis10 <"cmp.gt", int_hexagon_C2_cmpgti>;
2175 def HEXAGON_C2_cmpgtu:
2176 qi_ALU32_sisi <"cmp.gtu", int_hexagon_C2_cmpgtu>;
2177 def HEXAGON_C2_cmpgtui:
2178 qi_ALU32_siu9 <"cmp.gtu", int_hexagon_C2_cmpgtui>;
2179 def HEXAGON_C2_cmplt:
2180 qi_ALU32_sisi <"cmp.lt", int_hexagon_C2_cmplt>;
2181 def HEXAGON_C2_cmpltu:
2182 qi_ALU32_sisi <"cmp.ltu", int_hexagon_C2_cmpltu>;
2184 /********************************************************************
2186 *********************************************************************/
2188 // ALU32 / VH / Vector add halfwords.
2189 // Rd32=vadd[u]h(Rs32,Rt32:sat]
2190 def HEXAGON_A2_svaddh:
2191 si_ALU32_sisi <"vaddh", int_hexagon_A2_svaddh>;
2192 def HEXAGON_A2_svaddhs:
2193 si_ALU32_sisi_sat <"vaddh", int_hexagon_A2_svaddhs>;
2194 def HEXAGON_A2_svadduhs:
2195 si_ALU32_sisi_sat <"vadduh", int_hexagon_A2_svadduhs>;
2197 // ALU32 / VH / Vector average halfwords.
2198 def HEXAGON_A2_svavgh:
2199 si_ALU32_sisi <"vavgh", int_hexagon_A2_svavgh>;
2200 def HEXAGON_A2_svavghs:
2201 si_ALU32_sisi_rnd <"vavgh", int_hexagon_A2_svavghs>;
2202 def HEXAGON_A2_svnavgh:
2203 si_ALU32_sisi <"vnavgh", int_hexagon_A2_svnavgh>;
2205 // ALU32 / VH / Vector subtract halfwords.
2206 def HEXAGON_A2_svsubh:
2207 si_ALU32_sisi <"vsubh", int_hexagon_A2_svsubh>;
2208 def HEXAGON_A2_svsubhs:
2209 si_ALU32_sisi_sat <"vsubh", int_hexagon_A2_svsubhs>;
2210 def HEXAGON_A2_svsubuhs:
2211 si_ALU32_sisi_sat <"vsubuh", int_hexagon_A2_svsubuhs>;
2213 /********************************************************************
2215 *********************************************************************/
2217 // ALU64 / ALU / Add.
2218 def HEXAGON_A2_addp:
2219 di_ALU64_didi <"add", int_hexagon_A2_addp>;
2220 def HEXAGON_A2_addsat:
2221 si_ALU64_sisi_sat <"add", int_hexagon_A2_addsat>;
2223 // ALU64 / ALU / Add halfword.
2224 // Even though the definition says hl, it should be lh -
2225 //so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
2226 def HEXAGON_A2_addh_l16_hl:
2227 si_ALU64_sisi_l16_lh <"add", int_hexagon_A2_addh_l16_hl>;
2228 def HEXAGON_A2_addh_l16_ll:
2229 si_ALU64_sisi_l16_ll <"add", int_hexagon_A2_addh_l16_ll>;
2231 def HEXAGON_A2_addh_l16_sat_hl:
2232 si_ALU64_sisi_l16_sat_lh <"add", int_hexagon_A2_addh_l16_sat_hl>;
2233 def HEXAGON_A2_addh_l16_sat_ll:
2234 si_ALU64_sisi_l16_sat_ll <"add", int_hexagon_A2_addh_l16_sat_ll>;
2236 def HEXAGON_A2_addh_h16_hh:
2237 si_ALU64_sisi_h16_hh <"add", int_hexagon_A2_addh_h16_hh>;
2238 def HEXAGON_A2_addh_h16_hl:
2239 si_ALU64_sisi_h16_hl <"add", int_hexagon_A2_addh_h16_hl>;
2240 def HEXAGON_A2_addh_h16_lh:
2241 si_ALU64_sisi_h16_lh <"add", int_hexagon_A2_addh_h16_lh>;
2242 def HEXAGON_A2_addh_h16_ll:
2243 si_ALU64_sisi_h16_ll <"add", int_hexagon_A2_addh_h16_ll>;
2245 def HEXAGON_A2_addh_h16_sat_hh:
2246 si_ALU64_sisi_h16_sat_hh <"add", int_hexagon_A2_addh_h16_sat_hh>;
2247 def HEXAGON_A2_addh_h16_sat_hl:
2248 si_ALU64_sisi_h16_sat_hl <"add", int_hexagon_A2_addh_h16_sat_hl>;
2249 def HEXAGON_A2_addh_h16_sat_lh:
2250 si_ALU64_sisi_h16_sat_lh <"add", int_hexagon_A2_addh_h16_sat_lh>;
2251 def HEXAGON_A2_addh_h16_sat_ll:
2252 si_ALU64_sisi_h16_sat_ll <"add", int_hexagon_A2_addh_h16_sat_ll>;
2254 // ALU64 / ALU / Compare.
2255 def HEXAGON_C2_cmpeqp:
2256 qi_ALU64_didi <"cmp.eq", int_hexagon_C2_cmpeqp>;
2257 def HEXAGON_C2_cmpgtp:
2258 qi_ALU64_didi <"cmp.gt", int_hexagon_C2_cmpgtp>;
2259 def HEXAGON_C2_cmpgtup:
2260 qi_ALU64_didi <"cmp.gtu", int_hexagon_C2_cmpgtup>;
2262 // ALU64 / ALU / Logical operations.
2263 def HEXAGON_A2_andp:
2264 di_ALU64_didi <"and", int_hexagon_A2_andp>;
2266 di_ALU64_didi <"or", int_hexagon_A2_orp>;
2267 def HEXAGON_A2_xorp:
2268 di_ALU64_didi <"xor", int_hexagon_A2_xorp>;
2270 // ALU64 / ALU / Maximum.
2272 si_ALU64_sisi <"max", int_hexagon_A2_max>;
2273 def HEXAGON_A2_maxu:
2274 si_ALU64_sisi <"maxu", int_hexagon_A2_maxu>;
2276 // ALU64 / ALU / Minimum.
2278 si_ALU64_sisi <"min", int_hexagon_A2_min>;
2279 def HEXAGON_A2_minu:
2280 si_ALU64_sisi <"minu", int_hexagon_A2_minu>;
2282 // ALU64 / ALU / Subtract.
2283 def HEXAGON_A2_subp:
2284 di_ALU64_didi <"sub", int_hexagon_A2_subp>;
2285 def HEXAGON_A2_subsat:
2286 si_ALU64_sisi_sat <"sub", int_hexagon_A2_subsat>;
2288 // ALU64 / ALU / Subtract halfword.
2289 // Even though the definition says hl, it should be lh -
2290 //so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
2291 def HEXAGON_A2_subh_l16_hl:
2292 si_ALU64_sisi_l16_lh <"sub", int_hexagon_A2_subh_l16_hl>;
2293 def HEXAGON_A2_subh_l16_ll:
2294 si_ALU64_sisi_l16_ll <"sub", int_hexagon_A2_subh_l16_ll>;
2296 def HEXAGON_A2_subh_l16_sat_hl:
2297 si_ALU64_sisi_l16_sat_lh <"sub", int_hexagon_A2_subh_l16_sat_hl>;
2298 def HEXAGON_A2_subh_l16_sat_ll:
2299 si_ALU64_sisi_l16_sat_ll <"sub", int_hexagon_A2_subh_l16_sat_ll>;
2301 def HEXAGON_A2_subh_h16_hh:
2302 si_ALU64_sisi_h16_hh <"sub", int_hexagon_A2_subh_h16_hh>;
2303 def HEXAGON_A2_subh_h16_hl:
2304 si_ALU64_sisi_h16_hl <"sub", int_hexagon_A2_subh_h16_hl>;
2305 def HEXAGON_A2_subh_h16_lh:
2306 si_ALU64_sisi_h16_lh <"sub", int_hexagon_A2_subh_h16_lh>;
2307 def HEXAGON_A2_subh_h16_ll:
2308 si_ALU64_sisi_h16_ll <"sub", int_hexagon_A2_subh_h16_ll>;
2310 def HEXAGON_A2_subh_h16_sat_hh:
2311 si_ALU64_sisi_h16_sat_hh <"sub", int_hexagon_A2_subh_h16_sat_hh>;
2312 def HEXAGON_A2_subh_h16_sat_hl:
2313 si_ALU64_sisi_h16_sat_hl <"sub", int_hexagon_A2_subh_h16_sat_hl>;
2314 def HEXAGON_A2_subh_h16_sat_lh:
2315 si_ALU64_sisi_h16_sat_lh <"sub", int_hexagon_A2_subh_h16_sat_lh>;
2316 def HEXAGON_A2_subh_h16_sat_ll:
2317 si_ALU64_sisi_h16_sat_ll <"sub", int_hexagon_A2_subh_h16_sat_ll>;
2319 // ALU64 / ALU / Transfer register.
2320 def HEXAGON_A2_tfrp:
2321 di_ALU64_di <"", int_hexagon_A2_tfrp>;
2323 /********************************************************************
2325 *********************************************************************/
2327 // ALU64 / BIT / Masked parity.
2328 def HEXAGON_S2_parityp:
2329 si_ALU64_didi <"parity", int_hexagon_S2_parityp>;
2331 /********************************************************************
2333 *********************************************************************/
2335 // ALU64 / PERM / Vector pack high and low halfwords.
2336 def HEXAGON_S2_packhl:
2337 di_ALU64_sisi <"packhl", int_hexagon_S2_packhl>;
2339 /********************************************************************
2341 *********************************************************************/
2343 // ALU64 / VB / Vector add unsigned bytes.
2344 def HEXAGON_A2_vaddub:
2345 di_ALU64_didi <"vaddub", int_hexagon_A2_vaddub>;
2346 def HEXAGON_A2_vaddubs:
2347 di_ALU64_didi_sat <"vaddub", int_hexagon_A2_vaddubs>;
2349 // ALU64 / VB / Vector average unsigned bytes.
2350 def HEXAGON_A2_vavgub:
2351 di_ALU64_didi <"vavgub", int_hexagon_A2_vavgub>;
2352 def HEXAGON_A2_vavgubr:
2353 di_ALU64_didi_rnd <"vavgub", int_hexagon_A2_vavgubr>;
2355 // ALU64 / VB / Vector compare unsigned bytes.
2356 def HEXAGON_A2_vcmpbeq:
2357 qi_ALU64_didi <"vcmpb.eq", int_hexagon_A2_vcmpbeq>;
2358 def HEXAGON_A2_vcmpbgtu:
2359 qi_ALU64_didi <"vcmpb.gtu",int_hexagon_A2_vcmpbgtu>;
2361 // ALU64 / VB / Vector maximum/minimum unsigned bytes.
2362 def HEXAGON_A2_vmaxub:
2363 di_ALU64_didi <"vmaxub", int_hexagon_A2_vmaxub>;
2364 def HEXAGON_A2_vminub:
2365 di_ALU64_didi <"vminub", int_hexagon_A2_vminub>;
2367 // ALU64 / VB / Vector subtract unsigned bytes.
2368 def HEXAGON_A2_vsubub:
2369 di_ALU64_didi <"vsubub", int_hexagon_A2_vsubub>;
2370 def HEXAGON_A2_vsububs:
2371 di_ALU64_didi_sat <"vsubub", int_hexagon_A2_vsububs>;
2373 // ALU64 / VB / Vector mux.
2374 def HEXAGON_C2_vmux:
2375 di_ALU64_qididi <"vmux", int_hexagon_C2_vmux>;
2378 /********************************************************************
2380 *********************************************************************/
2382 // ALU64 / VH / Vector add halfwords.
2383 // Rdd64=vadd[u]h(Rss64,Rtt64:sat]
2384 def HEXAGON_A2_vaddh:
2385 di_ALU64_didi <"vaddh", int_hexagon_A2_vaddh>;
2386 def HEXAGON_A2_vaddhs:
2387 di_ALU64_didi_sat <"vaddh", int_hexagon_A2_vaddhs>;
2388 def HEXAGON_A2_vadduhs:
2389 di_ALU64_didi_sat <"vadduh", int_hexagon_A2_vadduhs>;
2391 // ALU64 / VH / Vector average halfwords.
2392 // Rdd64=v[n]avg[u]h(Rss64,Rtt64:rnd/:crnd][:sat]
2393 def HEXAGON_A2_vavgh:
2394 di_ALU64_didi <"vavgh", int_hexagon_A2_vavgh>;
2395 def HEXAGON_A2_vavghcr:
2396 di_ALU64_didi_crnd <"vavgh", int_hexagon_A2_vavghcr>;
2397 def HEXAGON_A2_vavghr:
2398 di_ALU64_didi_rnd <"vavgh", int_hexagon_A2_vavghr>;
2399 def HEXAGON_A2_vavguh:
2400 di_ALU64_didi <"vavguh", int_hexagon_A2_vavguh>;
2401 def HEXAGON_A2_vavguhr:
2402 di_ALU64_didi_rnd <"vavguh", int_hexagon_A2_vavguhr>;
2403 def HEXAGON_A2_vnavgh:
2404 di_ALU64_didi <"vnavgh", int_hexagon_A2_vnavgh>;
2405 def HEXAGON_A2_vnavghcr:
2406 di_ALU64_didi_crnd_sat <"vnavgh", int_hexagon_A2_vnavghcr>;
2407 def HEXAGON_A2_vnavghr:
2408 di_ALU64_didi_rnd_sat <"vnavgh", int_hexagon_A2_vnavghr>;
2410 // ALU64 / VH / Vector compare halfwords.
2411 def HEXAGON_A2_vcmpheq:
2412 qi_ALU64_didi <"vcmph.eq", int_hexagon_A2_vcmpheq>;
2413 def HEXAGON_A2_vcmphgt:
2414 qi_ALU64_didi <"vcmph.gt", int_hexagon_A2_vcmphgt>;
2415 def HEXAGON_A2_vcmphgtu:
2416 qi_ALU64_didi <"vcmph.gtu",int_hexagon_A2_vcmphgtu>;
2418 // ALU64 / VH / Vector maximum halfwords.
2419 def HEXAGON_A2_vmaxh:
2420 di_ALU64_didi <"vmaxh", int_hexagon_A2_vmaxh>;
2421 def HEXAGON_A2_vmaxuh:
2422 di_ALU64_didi <"vmaxuh", int_hexagon_A2_vmaxuh>;
2424 // ALU64 / VH / Vector minimum halfwords.
2425 def HEXAGON_A2_vminh:
2426 di_ALU64_didi <"vminh", int_hexagon_A2_vminh>;
2427 def HEXAGON_A2_vminuh:
2428 di_ALU64_didi <"vminuh", int_hexagon_A2_vminuh>;
2430 // ALU64 / VH / Vector subtract halfwords.
2431 def HEXAGON_A2_vsubh:
2432 di_ALU64_didi <"vsubh", int_hexagon_A2_vsubh>;
2433 def HEXAGON_A2_vsubhs:
2434 di_ALU64_didi_sat <"vsubh", int_hexagon_A2_vsubhs>;
2435 def HEXAGON_A2_vsubuhs:
2436 di_ALU64_didi_sat <"vsubuh", int_hexagon_A2_vsubuhs>;
2439 /********************************************************************
2441 *********************************************************************/
2443 // ALU64 / VW / Vector add words.
2444 // Rdd32=vaddw(Rss32,Rtt32)[:sat]
2445 def HEXAGON_A2_vaddw:
2446 di_ALU64_didi <"vaddw", int_hexagon_A2_vaddw>;
2447 def HEXAGON_A2_vaddws:
2448 di_ALU64_didi_sat <"vaddw", int_hexagon_A2_vaddws>;
2450 // ALU64 / VW / Vector average words.
2451 def HEXAGON_A2_vavguw:
2452 di_ALU64_didi <"vavguw", int_hexagon_A2_vavguw>;
2453 def HEXAGON_A2_vavguwr:
2454 di_ALU64_didi_rnd <"vavguw", int_hexagon_A2_vavguwr>;
2455 def HEXAGON_A2_vavgw:
2456 di_ALU64_didi <"vavgw", int_hexagon_A2_vavgw>;
2457 def HEXAGON_A2_vavgwcr:
2458 di_ALU64_didi_crnd <"vavgw", int_hexagon_A2_vavgwcr>;
2459 def HEXAGON_A2_vavgwr:
2460 di_ALU64_didi_rnd <"vavgw", int_hexagon_A2_vavgwr>;
2461 def HEXAGON_A2_vnavgw:
2462 di_ALU64_didi <"vnavgw", int_hexagon_A2_vnavgw>;
2463 def HEXAGON_A2_vnavgwcr:
2464 di_ALU64_didi_crnd_sat <"vnavgw", int_hexagon_A2_vnavgwcr>;
2465 def HEXAGON_A2_vnavgwr:
2466 di_ALU64_didi_rnd_sat <"vnavgw", int_hexagon_A2_vnavgwr>;
2468 // ALU64 / VW / Vector compare words.
2469 def HEXAGON_A2_vcmpweq:
2470 qi_ALU64_didi <"vcmpw.eq", int_hexagon_A2_vcmpweq>;
2471 def HEXAGON_A2_vcmpwgt:
2472 qi_ALU64_didi <"vcmpw.gt", int_hexagon_A2_vcmpwgt>;
2473 def HEXAGON_A2_vcmpwgtu:
2474 qi_ALU64_didi <"vcmpw.gtu",int_hexagon_A2_vcmpwgtu>;
2476 // ALU64 / VW / Vector maximum words.
2477 def HEXAGON_A2_vmaxw:
2478 di_ALU64_didi <"vmaxw", int_hexagon_A2_vmaxw>;
2479 def HEXAGON_A2_vmaxuw:
2480 di_ALU64_didi <"vmaxuw", int_hexagon_A2_vmaxuw>;
2482 // ALU64 / VW / Vector minimum words.
2483 def HEXAGON_A2_vminw:
2484 di_ALU64_didi <"vminw", int_hexagon_A2_vminw>;
2485 def HEXAGON_A2_vminuw:
2486 di_ALU64_didi <"vminuw", int_hexagon_A2_vminuw>;
2488 // ALU64 / VW / Vector subtract words.
2489 def HEXAGON_A2_vsubw:
2490 di_ALU64_didi <"vsubw", int_hexagon_A2_vsubw>;
2491 def HEXAGON_A2_vsubws:
2492 di_ALU64_didi_sat <"vsubw", int_hexagon_A2_vsubws>;
2495 /********************************************************************
2497 *********************************************************************/
2499 // CR / Logical reductions on predicates.
2500 def HEXAGON_C2_all8:
2501 qi_SInst_qi <"all8", int_hexagon_C2_all8>;
2502 def HEXAGON_C2_any8:
2503 qi_SInst_qi <"any8", int_hexagon_C2_any8>;
2505 // CR / Logical operations on predicates.
2506 def HEXAGON_C2_pxfer_map:
2507 qi_SInst_qi_pxfer <"", int_hexagon_C2_pxfer_map>;
2509 qi_SInst_qiqi <"and", int_hexagon_C2_and>;
2510 def HEXAGON_C2_andn:
2511 qi_SInst_qiqi_neg <"and", int_hexagon_C2_andn>;
2513 qi_SInst_qi <"not", int_hexagon_C2_not>;
2515 qi_SInst_qiqi <"or", int_hexagon_C2_or>;
2517 qi_SInst_qiqi_neg <"or", int_hexagon_C2_orn>;
2519 qi_SInst_qiqi <"xor", int_hexagon_C2_xor>;
2522 /********************************************************************
2524 *********************************************************************/
2526 // MTYPE / ALU / Add and accumulate.
2527 def HEXAGON_M2_acci:
2528 si_MInst_sisisi_acc <"add", int_hexagon_M2_acci>;
2529 def HEXAGON_M2_accii:
2530 si_MInst_sisis8_acc <"add", int_hexagon_M2_accii>;
2531 def HEXAGON_M2_nacci:
2532 si_MInst_sisisi_nac <"add", int_hexagon_M2_nacci>;
2533 def HEXAGON_M2_naccii:
2534 si_MInst_sisis8_nac <"add", int_hexagon_M2_naccii>;
2536 // MTYPE / ALU / Subtract and accumulate.
2537 def HEXAGON_M2_subacc:
2538 si_MInst_sisisi_acc <"sub", int_hexagon_M2_subacc>;
2540 // MTYPE / ALU / Vector absolute difference.
2541 def HEXAGON_M2_vabsdiffh:
2542 di_MInst_didi <"vabsdiffh",int_hexagon_M2_vabsdiffh>;
2543 def HEXAGON_M2_vabsdiffw:
2544 di_MInst_didi <"vabsdiffw",int_hexagon_M2_vabsdiffw>;
2546 // MTYPE / ALU / XOR and xor with destination.
2547 def HEXAGON_M2_xor_xacc:
2548 si_MInst_sisisi_xacc <"xor", int_hexagon_M2_xor_xacc>;
2551 /********************************************************************
2553 *********************************************************************/
2555 // MTYPE / COMPLEX / Complex multiply.
2556 // Rdd[-+]=cmpy(Rs, Rt:<<1]:sat
2557 def HEXAGON_M2_cmpys_s1:
2558 di_MInst_sisi_s1_sat <"cmpy", int_hexagon_M2_cmpys_s1>;
2559 def HEXAGON_M2_cmpys_s0:
2560 di_MInst_sisi_sat <"cmpy", int_hexagon_M2_cmpys_s0>;
2561 def HEXAGON_M2_cmpysc_s1:
2562 di_MInst_sisi_s1_sat_conj <"cmpy", int_hexagon_M2_cmpysc_s1>;
2563 def HEXAGON_M2_cmpysc_s0:
2564 di_MInst_sisi_sat_conj <"cmpy", int_hexagon_M2_cmpysc_s0>;
2566 def HEXAGON_M2_cmacs_s1:
2567 di_MInst_disisi_acc_s1_sat <"cmpy", int_hexagon_M2_cmacs_s1>;
2568 def HEXAGON_M2_cmacs_s0:
2569 di_MInst_disisi_acc_sat <"cmpy", int_hexagon_M2_cmacs_s0>;
2570 def HEXAGON_M2_cmacsc_s1:
2571 di_MInst_disisi_acc_s1_sat_conj <"cmpy", int_hexagon_M2_cmacsc_s1>;
2572 def HEXAGON_M2_cmacsc_s0:
2573 di_MInst_disisi_acc_sat_conj <"cmpy", int_hexagon_M2_cmacsc_s0>;
2575 def HEXAGON_M2_cnacs_s1:
2576 di_MInst_disisi_nac_s1_sat <"cmpy", int_hexagon_M2_cnacs_s1>;
2577 def HEXAGON_M2_cnacs_s0:
2578 di_MInst_disisi_nac_sat <"cmpy", int_hexagon_M2_cnacs_s0>;
2579 def HEXAGON_M2_cnacsc_s1:
2580 di_MInst_disisi_nac_s1_sat_conj <"cmpy", int_hexagon_M2_cnacsc_s1>;
2581 def HEXAGON_M2_cnacsc_s0:
2582 di_MInst_disisi_nac_sat_conj <"cmpy", int_hexagon_M2_cnacsc_s0>;
2584 // MTYPE / COMPLEX / Complex multiply real or imaginary.
2585 def HEXAGON_M2_cmpyr_s0:
2586 di_MInst_sisi <"cmpyr", int_hexagon_M2_cmpyr_s0>;
2587 def HEXAGON_M2_cmacr_s0:
2588 di_MInst_disisi_acc <"cmpyr", int_hexagon_M2_cmacr_s0>;
2590 def HEXAGON_M2_cmpyi_s0:
2591 di_MInst_sisi <"cmpyi", int_hexagon_M2_cmpyi_s0>;
2592 def HEXAGON_M2_cmaci_s0:
2593 di_MInst_disisi_acc <"cmpyi", int_hexagon_M2_cmaci_s0>;
2595 // MTYPE / COMPLEX / Complex multiply with round and pack.
2596 // Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat
2597 def HEXAGON_M2_cmpyrs_s0:
2598 si_MInst_sisi_rnd_sat <"cmpy", int_hexagon_M2_cmpyrs_s0>;
2599 def HEXAGON_M2_cmpyrs_s1:
2600 si_MInst_sisi_s1_rnd_sat <"cmpy", int_hexagon_M2_cmpyrs_s1>;
2602 def HEXAGON_M2_cmpyrsc_s0:
2603 si_MInst_sisi_rnd_sat_conj <"cmpy", int_hexagon_M2_cmpyrsc_s0>;
2604 def HEXAGON_M2_cmpyrsc_s1:
2605 si_MInst_sisi_s1_rnd_sat_conj <"cmpy", int_hexagon_M2_cmpyrsc_s1>;
2607 //MTYPE / COMPLEX / Vector complex multiply real or imaginary.
2608 def HEXAGON_M2_vcmpy_s0_sat_i:
2609 di_MInst_didi_sat <"vcmpyi", int_hexagon_M2_vcmpy_s0_sat_i>;
2610 def HEXAGON_M2_vcmpy_s1_sat_i:
2611 di_MInst_didi_s1_sat <"vcmpyi", int_hexagon_M2_vcmpy_s1_sat_i>;
2613 def HEXAGON_M2_vcmpy_s0_sat_r:
2614 di_MInst_didi_sat <"vcmpyr", int_hexagon_M2_vcmpy_s0_sat_r>;
2615 def HEXAGON_M2_vcmpy_s1_sat_r:
2616 di_MInst_didi_s1_sat <"vcmpyr", int_hexagon_M2_vcmpy_s1_sat_r>;
2618 def HEXAGON_M2_vcmac_s0_sat_i:
2619 di_MInst_dididi_acc_sat <"vcmpyi", int_hexagon_M2_vcmac_s0_sat_i>;
2620 def HEXAGON_M2_vcmac_s0_sat_r:
2621 di_MInst_dididi_acc_sat <"vcmpyr", int_hexagon_M2_vcmac_s0_sat_r>;
2623 //MTYPE / COMPLEX / Vector reduce complex multiply real or imaginary.
2624 def HEXAGON_M2_vrcmpyi_s0:
2625 di_MInst_didi <"vrcmpyi", int_hexagon_M2_vrcmpyi_s0>;
2626 def HEXAGON_M2_vrcmpyr_s0:
2627 di_MInst_didi <"vrcmpyr", int_hexagon_M2_vrcmpyr_s0>;
2629 def HEXAGON_M2_vrcmpyi_s0c:
2630 di_MInst_didi_conj <"vrcmpyi", int_hexagon_M2_vrcmpyi_s0c>;
2631 def HEXAGON_M2_vrcmpyr_s0c:
2632 di_MInst_didi_conj <"vrcmpyr", int_hexagon_M2_vrcmpyr_s0c>;
2634 def HEXAGON_M2_vrcmaci_s0:
2635 di_MInst_dididi_acc <"vrcmpyi", int_hexagon_M2_vrcmaci_s0>;
2636 def HEXAGON_M2_vrcmacr_s0:
2637 di_MInst_dididi_acc <"vrcmpyr", int_hexagon_M2_vrcmacr_s0>;
2639 def HEXAGON_M2_vrcmaci_s0c:
2640 di_MInst_dididi_acc_conj <"vrcmpyi", int_hexagon_M2_vrcmaci_s0c>;
2641 def HEXAGON_M2_vrcmacr_s0c:
2642 di_MInst_dididi_acc_conj <"vrcmpyr", int_hexagon_M2_vrcmacr_s0c>;
2645 /********************************************************************
2647 *********************************************************************/
2649 // MTYPE / MPYH / Multiply and use lower result.
2650 //def HEXAGON_M2_mpysmi:
2651 //FIXME: Hexagon_M2_mpysmi should really by of the type si_MInst_sim9,
2652 // not si_MInst_sis9 - but for now, we will use s9.
2653 // def Hexagon_M2_mpysmi:
2654 // si_MInst_sim9 <"mpyi", int_hexagon_M2_mpysmi>;
2655 def Hexagon_M2_mpysmi:
2656 si_MInst_sis9 <"mpyi", int_hexagon_M2_mpysmi>;
2657 def HEXAGON_M2_mpyi:
2658 si_MInst_sisi <"mpyi", int_hexagon_M2_mpyi>;
2659 def HEXAGON_M2_mpyui:
2660 si_MInst_sisi <"mpyui", int_hexagon_M2_mpyui>;
2661 def HEXAGON_M2_macsip:
2662 si_MInst_sisiu8_acc <"mpyi", int_hexagon_M2_macsip>;
2663 def HEXAGON_M2_maci:
2664 si_MInst_sisisi_acc <"mpyi", int_hexagon_M2_maci>;
2665 def HEXAGON_M2_macsin:
2666 si_MInst_sisiu8_nac <"mpyi", int_hexagon_M2_macsin>;
2668 // MTYPE / MPYH / Multiply word by half (32x16).
2669 //Rdd[+]=vmpywoh(Rss,Rtt)[:<<1][:rnd][:sat]
2670 //Rdd[+]=vmpyweh(Rss,Rtt)[:<<1][:rnd][:sat]
2671 def HEXAGON_M2_mmpyl_rs1:
2672 di_MInst_didi_s1_rnd_sat <"vmpyweh", int_hexagon_M2_mmpyl_rs1>;
2673 def HEXAGON_M2_mmpyl_s1:
2674 di_MInst_didi_s1_sat <"vmpyweh", int_hexagon_M2_mmpyl_s1>;
2675 def HEXAGON_M2_mmpyl_rs0:
2676 di_MInst_didi_rnd_sat <"vmpyweh", int_hexagon_M2_mmpyl_rs0>;
2677 def HEXAGON_M2_mmpyl_s0:
2678 di_MInst_didi_sat <"vmpyweh", int_hexagon_M2_mmpyl_s0>;
2679 def HEXAGON_M2_mmpyh_rs1:
2680 di_MInst_didi_s1_rnd_sat <"vmpywoh", int_hexagon_M2_mmpyh_rs1>;
2681 def HEXAGON_M2_mmpyh_s1:
2682 di_MInst_didi_s1_sat <"vmpywoh", int_hexagon_M2_mmpyh_s1>;
2683 def HEXAGON_M2_mmpyh_rs0:
2684 di_MInst_didi_rnd_sat <"vmpywoh", int_hexagon_M2_mmpyh_rs0>;
2685 def HEXAGON_M2_mmpyh_s0:
2686 di_MInst_didi_sat <"vmpywoh", int_hexagon_M2_mmpyh_s0>;
2687 def HEXAGON_M2_mmacls_rs1:
2688 di_MInst_dididi_acc_s1_rnd_sat <"vmpyweh", int_hexagon_M2_mmacls_rs1>;
2689 def HEXAGON_M2_mmacls_s1:
2690 di_MInst_dididi_acc_s1_sat <"vmpyweh", int_hexagon_M2_mmacls_s1>;
2691 def HEXAGON_M2_mmacls_rs0:
2692 di_MInst_dididi_acc_rnd_sat <"vmpyweh", int_hexagon_M2_mmacls_rs0>;
2693 def HEXAGON_M2_mmacls_s0:
2694 di_MInst_dididi_acc_sat <"vmpyweh", int_hexagon_M2_mmacls_s0>;
2695 def HEXAGON_M2_mmachs_rs1:
2696 di_MInst_dididi_acc_s1_rnd_sat <"vmpywoh", int_hexagon_M2_mmachs_rs1>;
2697 def HEXAGON_M2_mmachs_s1:
2698 di_MInst_dididi_acc_s1_sat <"vmpywoh", int_hexagon_M2_mmachs_s1>;
2699 def HEXAGON_M2_mmachs_rs0:
2700 di_MInst_dididi_acc_rnd_sat <"vmpywoh", int_hexagon_M2_mmachs_rs0>;
2701 def HEXAGON_M2_mmachs_s0:
2702 di_MInst_dididi_acc_sat <"vmpywoh", int_hexagon_M2_mmachs_s0>;
2704 // MTYPE / MPYH / Multiply word by unsigned half (32x16).
2705 //Rdd[+]=vmpywouh(Rss,Rtt)[:<<1][:rnd][:sat]
2706 //Rdd[+]=vmpyweuh(Rss,Rtt)[:<<1][:rnd][:sat]
2707 def HEXAGON_M2_mmpyul_rs1:
2708 di_MInst_didi_s1_rnd_sat <"vmpyweuh", int_hexagon_M2_mmpyul_rs1>;
2709 def HEXAGON_M2_mmpyul_s1:
2710 di_MInst_didi_s1_sat <"vmpyweuh", int_hexagon_M2_mmpyul_s1>;
2711 def HEXAGON_M2_mmpyul_rs0:
2712 di_MInst_didi_rnd_sat <"vmpyweuh", int_hexagon_M2_mmpyul_rs0>;
2713 def HEXAGON_M2_mmpyul_s0:
2714 di_MInst_didi_sat <"vmpyweuh", int_hexagon_M2_mmpyul_s0>;
2715 def HEXAGON_M2_mmpyuh_rs1:
2716 di_MInst_didi_s1_rnd_sat <"vmpywouh", int_hexagon_M2_mmpyuh_rs1>;
2717 def HEXAGON_M2_mmpyuh_s1:
2718 di_MInst_didi_s1_sat <"vmpywouh", int_hexagon_M2_mmpyuh_s1>;
2719 def HEXAGON_M2_mmpyuh_rs0:
2720 di_MInst_didi_rnd_sat <"vmpywouh", int_hexagon_M2_mmpyuh_rs0>;
2721 def HEXAGON_M2_mmpyuh_s0:
2722 di_MInst_didi_sat <"vmpywouh", int_hexagon_M2_mmpyuh_s0>;
2723 def HEXAGON_M2_mmaculs_rs1:
2724 di_MInst_dididi_acc_s1_rnd_sat <"vmpyweuh", int_hexagon_M2_mmaculs_rs1>;
2725 def HEXAGON_M2_mmaculs_s1:
2726 di_MInst_dididi_acc_s1_sat <"vmpyweuh", int_hexagon_M2_mmaculs_s1>;
2727 def HEXAGON_M2_mmaculs_rs0:
2728 di_MInst_dididi_acc_rnd_sat <"vmpyweuh", int_hexagon_M2_mmaculs_rs0>;
2729 def HEXAGON_M2_mmaculs_s0:
2730 di_MInst_dididi_acc_sat <"vmpyweuh", int_hexagon_M2_mmaculs_s0>;
2731 def HEXAGON_M2_mmacuhs_rs1:
2732 di_MInst_dididi_acc_s1_rnd_sat <"vmpywouh", int_hexagon_M2_mmacuhs_rs1>;
2733 def HEXAGON_M2_mmacuhs_s1:
2734 di_MInst_dididi_acc_s1_sat <"vmpywouh", int_hexagon_M2_mmacuhs_s1>;
2735 def HEXAGON_M2_mmacuhs_rs0:
2736 di_MInst_dididi_acc_rnd_sat <"vmpywouh", int_hexagon_M2_mmacuhs_rs0>;
2737 def HEXAGON_M2_mmacuhs_s0:
2738 di_MInst_dididi_acc_sat <"vmpywouh", int_hexagon_M2_mmacuhs_s0>;
2740 // MTYPE / MPYH / Multiply and use upper result.
2741 def HEXAGON_M2_hmmpyh_rs1:
2742 si_MInst_sisi_h_s1_rnd_sat <"mpy", int_hexagon_M2_hmmpyh_rs1>;
2743 def HEXAGON_M2_hmmpyl_rs1:
2744 si_MInst_sisi_l_s1_rnd_sat <"mpy", int_hexagon_M2_hmmpyl_rs1>;
2745 def HEXAGON_M2_mpy_up:
2746 si_MInst_sisi <"mpy", int_hexagon_M2_mpy_up>;
2747 def HEXAGON_M2_dpmpyss_rnd_s0:
2748 si_MInst_sisi_rnd <"mpy", int_hexagon_M2_dpmpyss_rnd_s0>;
2749 def HEXAGON_M2_mpyu_up:
2750 si_MInst_sisi <"mpyu", int_hexagon_M2_mpyu_up>;
2752 // MTYPE / MPYH / Multiply and use full result.
2753 def HEXAGON_M2_dpmpyuu_s0:
2754 di_MInst_sisi <"mpyu", int_hexagon_M2_dpmpyuu_s0>;
2755 def HEXAGON_M2_dpmpyuu_acc_s0:
2756 di_MInst_disisi_acc <"mpyu", int_hexagon_M2_dpmpyuu_acc_s0>;
2757 def HEXAGON_M2_dpmpyuu_nac_s0:
2758 di_MInst_disisi_nac <"mpyu", int_hexagon_M2_dpmpyuu_nac_s0>;
2759 def HEXAGON_M2_dpmpyss_s0:
2760 di_MInst_sisi <"mpy", int_hexagon_M2_dpmpyss_s0>;
2761 def HEXAGON_M2_dpmpyss_acc_s0:
2762 di_MInst_disisi_acc <"mpy", int_hexagon_M2_dpmpyss_acc_s0>;
2763 def HEXAGON_M2_dpmpyss_nac_s0:
2764 di_MInst_disisi_nac <"mpy", int_hexagon_M2_dpmpyss_nac_s0>;
2766 /********************************************************************
2768 *********************************************************************/
2770 // MTYPE / VB / Vector reduce add unsigned bytes.
2771 def HEXAGON_A2_vraddub:
2772 di_MInst_didi <"vraddub", int_hexagon_A2_vraddub>;
2773 def HEXAGON_A2_vraddub_acc:
2774 di_MInst_dididi_acc <"vraddub", int_hexagon_A2_vraddub_acc>;
2776 // MTYPE / VB / Vector sum of absolute differences unsigned bytes.
2777 def HEXAGON_A2_vrsadub:
2778 di_MInst_didi <"vrsadub", int_hexagon_A2_vrsadub>;
2779 def HEXAGON_A2_vrsadub_acc:
2780 di_MInst_dididi_acc <"vrsadub", int_hexagon_A2_vrsadub_acc>;
2782 /********************************************************************
2784 *********************************************************************/
2786 // MTYPE / VH / Vector dual multiply.
2787 def HEXAGON_M2_vdmpys_s1:
2788 di_MInst_didi_s1_sat <"vdmpy", int_hexagon_M2_vdmpys_s1>;
2789 def HEXAGON_M2_vdmpys_s0:
2790 di_MInst_didi_sat <"vdmpy", int_hexagon_M2_vdmpys_s0>;
2791 def HEXAGON_M2_vdmacs_s1:
2792 di_MInst_dididi_acc_s1_sat <"vdmpy", int_hexagon_M2_vdmacs_s1>;
2793 def HEXAGON_M2_vdmacs_s0:
2794 di_MInst_dididi_acc_sat <"vdmpy", int_hexagon_M2_vdmacs_s0>;
2796 // MTYPE / VH / Vector dual multiply with round and pack.
2797 def HEXAGON_M2_vdmpyrs_s0:
2798 si_MInst_didi_rnd_sat <"vdmpy", int_hexagon_M2_vdmpyrs_s0>;
2799 def HEXAGON_M2_vdmpyrs_s1:
2800 si_MInst_didi_s1_rnd_sat <"vdmpy", int_hexagon_M2_vdmpyrs_s1>;
2802 // MTYPE / VH / Vector multiply even halfwords.
2803 def HEXAGON_M2_vmpy2es_s1:
2804 di_MInst_didi_s1_sat <"vmpyeh", int_hexagon_M2_vmpy2es_s1>;
2805 def HEXAGON_M2_vmpy2es_s0:
2806 di_MInst_didi_sat <"vmpyeh", int_hexagon_M2_vmpy2es_s0>;
2807 def HEXAGON_M2_vmac2es:
2808 di_MInst_dididi_acc <"vmpyeh", int_hexagon_M2_vmac2es>;
2809 def HEXAGON_M2_vmac2es_s1:
2810 di_MInst_dididi_acc_s1_sat <"vmpyeh", int_hexagon_M2_vmac2es_s1>;
2811 def HEXAGON_M2_vmac2es_s0:
2812 di_MInst_dididi_acc_sat <"vmpyeh", int_hexagon_M2_vmac2es_s0>;
2814 // MTYPE / VH / Vector multiply halfwords.
2815 def HEXAGON_M2_vmpy2s_s0:
2816 di_MInst_sisi_sat <"vmpyh", int_hexagon_M2_vmpy2s_s0>;
2817 def HEXAGON_M2_vmpy2s_s1:
2818 di_MInst_sisi_s1_sat <"vmpyh", int_hexagon_M2_vmpy2s_s1>;
2819 def HEXAGON_M2_vmac2:
2820 di_MInst_disisi_acc <"vmpyh", int_hexagon_M2_vmac2>;
2821 def HEXAGON_M2_vmac2s_s0:
2822 di_MInst_disisi_acc_sat <"vmpyh", int_hexagon_M2_vmac2s_s0>;
2823 def HEXAGON_M2_vmac2s_s1:
2824 di_MInst_disisi_acc_s1_sat <"vmpyh", int_hexagon_M2_vmac2s_s1>;
2826 // MTYPE / VH / Vector multiply halfwords with round and pack.
2827 def HEXAGON_M2_vmpy2s_s0pack:
2828 si_MInst_sisi_rnd_sat <"vmpyh", int_hexagon_M2_vmpy2s_s0pack>;
2829 def HEXAGON_M2_vmpy2s_s1pack:
2830 si_MInst_sisi_s1_rnd_sat <"vmpyh", int_hexagon_M2_vmpy2s_s1pack>;
2832 // MTYPE / VH / Vector reduce multiply halfwords.
2833 // Rxx32+=vrmpyh(Rss32,Rtt32)
2834 def HEXAGON_M2_vrmpy_s0:
2835 di_MInst_didi <"vrmpyh", int_hexagon_M2_vrmpy_s0>;
2836 def HEXAGON_M2_vrmac_s0:
2837 di_MInst_dididi_acc <"vrmpyh", int_hexagon_M2_vrmac_s0>;
2840 /********************************************************************
2842 *********************************************************************/
2844 // STYPE / ALU / Absolute value.
2846 si_SInst_si <"abs", int_hexagon_A2_abs>;
2847 def HEXAGON_A2_absp:
2848 di_SInst_di <"abs", int_hexagon_A2_absp>;
2849 def HEXAGON_A2_abssat:
2850 si_SInst_si_sat <"abs", int_hexagon_A2_abssat>;
2852 // STYPE / ALU / Negate.
2853 def HEXAGON_A2_negp:
2854 di_SInst_di <"neg", int_hexagon_A2_negp>;
2855 def HEXAGON_A2_negsat:
2856 si_SInst_si_sat <"neg", int_hexagon_A2_negsat>;
2858 // STYPE / ALU / Logical Not.
2859 def HEXAGON_A2_notp:
2860 di_SInst_di <"not", int_hexagon_A2_notp>;
2862 // STYPE / ALU / Sign extend word to doubleword.
2863 def HEXAGON_A2_sxtw:
2864 di_SInst_si <"sxtw", int_hexagon_A2_sxtw>;
2867 /********************************************************************
2869 *********************************************************************/
2871 // STYPE / BIT / Count leading.
2873 si_SInst_si <"cl0", int_hexagon_S2_cl0>;
2874 def HEXAGON_S2_cl0p:
2875 si_SInst_di <"cl0", int_hexagon_S2_cl0p>;
2877 si_SInst_si <"cl1", int_hexagon_S2_cl1>;
2878 def HEXAGON_S2_cl1p:
2879 si_SInst_di <"cl1", int_hexagon_S2_cl1p>;
2881 si_SInst_si <"clb", int_hexagon_S2_clb>;
2882 def HEXAGON_S2_clbp:
2883 si_SInst_di <"clb", int_hexagon_S2_clbp>;
2884 def HEXAGON_S2_clbnorm:
2885 si_SInst_si <"normamt", int_hexagon_S2_clbnorm>;
2887 // STYPE / BIT / Count trailing.
2889 si_SInst_si <"ct0", int_hexagon_S2_ct0>;
2891 si_SInst_si <"ct1", int_hexagon_S2_ct1>;
2893 // STYPE / BIT / Compare bit mask.
2894 def Hexagon_C2_bitsclr:
2895 qi_SInst_sisi <"bitsclr", int_hexagon_C2_bitsclr>;
2896 def Hexagon_C2_bitsclri:
2897 qi_SInst_siu6 <"bitsclr", int_hexagon_C2_bitsclri>;
2898 def Hexagon_C2_bitsset:
2899 qi_SInst_sisi <"bitsset", int_hexagon_C2_bitsset>;
2901 // STYPE / BIT / Extract unsigned.
2902 // Rd[d][32/64]=extractu(Rs[s],Rt[t],[imm])
2903 def HEXAGON_S2_extractu:
2904 si_SInst_siu5u5 <"extractu",int_hexagon_S2_extractu>;
2905 def HEXAGON_S2_extractu_rp:
2906 si_SInst_sidi <"extractu",int_hexagon_S2_extractu_rp>;
2907 def HEXAGON_S2_extractup:
2908 di_SInst_diu6u6 <"extractu",int_hexagon_S2_extractup>;
2909 def HEXAGON_S2_extractup_rp:
2910 di_SInst_didi <"extractu",int_hexagon_S2_extractup_rp>;
2912 // STYPE / BIT / Insert bitfield.
2913 def Hexagon_S2_insert:
2914 si_SInst_sisiu5u5 <"insert", int_hexagon_S2_insert>;
2915 def Hexagon_S2_insert_rp:
2916 si_SInst_sisidi <"insert", int_hexagon_S2_insert_rp>;
2917 def Hexagon_S2_insertp:
2918 di_SInst_didiu6u6 <"insert", int_hexagon_S2_insertp>;
2919 def Hexagon_S2_insertp_rp:
2920 di_SInst_dididi <"insert", int_hexagon_S2_insertp_rp>;
2922 // STYPE / BIT / Innterleave/deinterleave.
2923 def Hexagon_S2_interleave:
2924 di_SInst_di <"interleave", int_hexagon_S2_interleave>;
2925 def Hexagon_S2_deinterleave:
2926 di_SInst_di <"deinterleave", int_hexagon_S2_deinterleave>;
2928 // STYPE / BIT / Linear feedback-shift Iteration.
2929 def Hexagon_S2_lfsp:
2930 di_SInst_didi <"lfs", int_hexagon_S2_lfsp>;
2932 // STYPE / BIT / Bit reverse.
2933 def Hexagon_S2_brev:
2934 si_SInst_si <"brev", int_hexagon_S2_brev>;
2936 // STYPE / BIT / Set/Clear/Toggle Bit.
2937 def HEXAGON_S2_setbit_i:
2938 si_SInst_siu5 <"setbit", int_hexagon_S2_setbit_i>;
2939 def HEXAGON_S2_togglebit_i:
2940 si_SInst_siu5 <"togglebit", int_hexagon_S2_togglebit_i>;
2941 def HEXAGON_S2_clrbit_i:
2942 si_SInst_siu5 <"clrbit", int_hexagon_S2_clrbit_i>;
2943 def HEXAGON_S2_setbit_r:
2944 si_SInst_sisi <"setbit", int_hexagon_S2_setbit_r>;
2945 def HEXAGON_S2_togglebit_r:
2946 si_SInst_sisi <"togglebit", int_hexagon_S2_togglebit_r>;
2947 def HEXAGON_S2_clrbit_r:
2948 si_SInst_sisi <"clrbit", int_hexagon_S2_clrbit_r>;
2950 // STYPE / BIT / Test Bit.
2951 def HEXAGON_S2_tstbit_i:
2952 qi_SInst_siu5 <"tstbit", int_hexagon_S2_tstbit_i>;
2953 def HEXAGON_S2_tstbit_r:
2954 qi_SInst_sisi <"tstbit", int_hexagon_S2_tstbit_r>;
2957 /********************************************************************
2959 *********************************************************************/
2961 // STYPE / COMPLEX / Vector Complex conjugate.
2962 def HEXAGON_A2_vconj:
2963 di_SInst_di_sat <"vconj", int_hexagon_A2_vconj>;
2965 // STYPE / COMPLEX / Vector Complex rotate.
2966 def HEXAGON_S2_vcrotate:
2967 di_SInst_disi <"vcrotate",int_hexagon_S2_vcrotate>;
2970 /********************************************************************
2972 *********************************************************************/
2974 // STYPE / PERM / Saturate.
2976 si_SInst_di <"sat", int_hexagon_A2_sat>;
2977 def HEXAGON_A2_satb:
2978 si_SInst_si <"satb", int_hexagon_A2_satb>;
2979 def HEXAGON_A2_sath:
2980 si_SInst_si <"sath", int_hexagon_A2_sath>;
2981 def HEXAGON_A2_satub:
2982 si_SInst_si <"satub", int_hexagon_A2_satub>;
2983 def HEXAGON_A2_satuh:
2984 si_SInst_si <"satuh", int_hexagon_A2_satuh>;
2986 // STYPE / PERM / Swizzle bytes.
2987 def HEXAGON_A2_swiz:
2988 si_SInst_si <"swiz", int_hexagon_A2_swiz>;
2990 // STYPE / PERM / Vector align.
2991 // Need custom lowering
2992 def HEXAGON_S2_valignib:
2993 di_SInst_didiu3 <"valignb", int_hexagon_S2_valignib>;
2994 def HEXAGON_S2_valignrb:
2995 di_SInst_didiqi <"valignb", int_hexagon_S2_valignrb>;
2997 // STYPE / PERM / Vector round and pack.
2998 def HEXAGON_S2_vrndpackwh:
2999 si_SInst_di <"vrndwh", int_hexagon_S2_vrndpackwh>;
3000 def HEXAGON_S2_vrndpackwhs:
3001 si_SInst_di_sat <"vrndwh", int_hexagon_S2_vrndpackwhs>;
3003 // STYPE / PERM / Vector saturate and pack.
3004 def HEXAGON_S2_svsathb:
3005 si_SInst_si <"vsathb", int_hexagon_S2_svsathb>;
3006 def HEXAGON_S2_vsathb:
3007 si_SInst_di <"vsathb", int_hexagon_S2_vsathb>;
3008 def HEXAGON_S2_svsathub:
3009 si_SInst_si <"vsathub", int_hexagon_S2_svsathub>;
3010 def HEXAGON_S2_vsathub:
3011 si_SInst_di <"vsathub", int_hexagon_S2_vsathub>;
3012 def HEXAGON_S2_vsatwh:
3013 si_SInst_di <"vsatwh", int_hexagon_S2_vsatwh>;
3014 def HEXAGON_S2_vsatwuh:
3015 si_SInst_di <"vsatwuh", int_hexagon_S2_vsatwuh>;
3017 // STYPE / PERM / Vector saturate without pack.
3018 def HEXAGON_S2_vsathb_nopack:
3019 di_SInst_di <"vsathb", int_hexagon_S2_vsathb_nopack>;
3020 def HEXAGON_S2_vsathub_nopack:
3021 di_SInst_di <"vsathub", int_hexagon_S2_vsathub_nopack>;
3022 def HEXAGON_S2_vsatwh_nopack:
3023 di_SInst_di <"vsatwh", int_hexagon_S2_vsatwh_nopack>;
3024 def HEXAGON_S2_vsatwuh_nopack:
3025 di_SInst_di <"vsatwuh", int_hexagon_S2_vsatwuh_nopack>;
3027 // STYPE / PERM / Vector shuffle.
3028 def HEXAGON_S2_shuffeb:
3029 di_SInst_didi <"shuffeb", int_hexagon_S2_shuffeb>;
3030 def HEXAGON_S2_shuffeh:
3031 di_SInst_didi <"shuffeh", int_hexagon_S2_shuffeh>;
3032 def HEXAGON_S2_shuffob:
3033 di_SInst_didi <"shuffob", int_hexagon_S2_shuffob>;
3034 def HEXAGON_S2_shuffoh:
3035 di_SInst_didi <"shuffoh", int_hexagon_S2_shuffoh>;
3037 // STYPE / PERM / Vector splat bytes.
3038 def HEXAGON_S2_vsplatrb:
3039 si_SInst_si <"vsplatb", int_hexagon_S2_vsplatrb>;
3041 // STYPE / PERM / Vector splat halfwords.
3042 def HEXAGON_S2_vsplatrh:
3043 di_SInst_si <"vsplath", int_hexagon_S2_vsplatrh>;
3045 // STYPE / PERM / Vector splice.
3046 def Hexagon_S2_vsplicerb:
3047 di_SInst_didiqi <"vspliceb",int_hexagon_S2_vsplicerb>;
3048 def Hexagon_S2_vspliceib:
3049 di_SInst_didiu3 <"vspliceb",int_hexagon_S2_vspliceib>;
3051 // STYPE / PERM / Sign extend.
3052 def HEXAGON_S2_vsxtbh:
3053 di_SInst_si <"vsxtbh", int_hexagon_S2_vsxtbh>;
3054 def HEXAGON_S2_vsxthw:
3055 di_SInst_si <"vsxthw", int_hexagon_S2_vsxthw>;
3057 // STYPE / PERM / Truncate.
3058 def HEXAGON_S2_vtrunehb:
3059 si_SInst_di <"vtrunehb",int_hexagon_S2_vtrunehb>;
3060 def HEXAGON_S2_vtrunohb:
3061 si_SInst_di <"vtrunohb",int_hexagon_S2_vtrunohb>;
3062 def HEXAGON_S2_vtrunewh:
3063 di_SInst_didi <"vtrunewh",int_hexagon_S2_vtrunewh>;
3064 def HEXAGON_S2_vtrunowh:
3065 di_SInst_didi <"vtrunowh",int_hexagon_S2_vtrunowh>;
3067 // STYPE / PERM / Zero extend.
3068 def HEXAGON_S2_vzxtbh:
3069 di_SInst_si <"vzxtbh", int_hexagon_S2_vzxtbh>;
3070 def HEXAGON_S2_vzxthw:
3071 di_SInst_si <"vzxthw", int_hexagon_S2_vzxthw>;
3074 /********************************************************************
3076 *********************************************************************/
3078 // STYPE / PRED / Mask generate from predicate.
3079 def HEXAGON_C2_mask:
3080 di_SInst_qi <"mask", int_hexagon_C2_mask>;
3082 // STYPE / PRED / Predicate transfer.
3083 def HEXAGON_C2_tfrpr:
3084 si_SInst_qi <"", int_hexagon_C2_tfrpr>;
3085 def HEXAGON_C2_tfrrp:
3086 qi_SInst_si <"", int_hexagon_C2_tfrrp>;
3088 // STYPE / PRED / Viterbi pack even and odd predicate bits.
3089 def HEXAGON_C2_vitpack:
3090 si_SInst_qiqi <"vitpack",int_hexagon_C2_vitpack>;
3093 /********************************************************************
3095 *********************************************************************/
3097 // STYPE / SHIFT / Shift by immediate.
3098 def HEXAGON_S2_asl_i_r:
3099 si_SInst_siu5 <"asl", int_hexagon_S2_asl_i_r>;
3100 def HEXAGON_S2_asr_i_r:
3101 si_SInst_siu5 <"asr", int_hexagon_S2_asr_i_r>;
3102 def HEXAGON_S2_lsr_i_r:
3103 si_SInst_siu5 <"lsr", int_hexagon_S2_lsr_i_r>;
3104 def HEXAGON_S2_asl_i_p:
3105 di_SInst_diu6 <"asl", int_hexagon_S2_asl_i_p>;
3106 def HEXAGON_S2_asr_i_p:
3107 di_SInst_diu6 <"asr", int_hexagon_S2_asr_i_p>;
3108 def HEXAGON_S2_lsr_i_p:
3109 di_SInst_diu6 <"lsr", int_hexagon_S2_lsr_i_p>;
3111 // STYPE / SHIFT / Shift by immediate and accumulate.
3112 def HEXAGON_S2_asl_i_r_acc:
3113 si_SInst_sisiu5_acc <"asl", int_hexagon_S2_asl_i_r_acc>;
3114 def HEXAGON_S2_asr_i_r_acc:
3115 si_SInst_sisiu5_acc <"asr", int_hexagon_S2_asr_i_r_acc>;
3116 def HEXAGON_S2_lsr_i_r_acc:
3117 si_SInst_sisiu5_acc <"lsr", int_hexagon_S2_lsr_i_r_acc>;
3118 def HEXAGON_S2_asl_i_r_nac:
3119 si_SInst_sisiu5_nac <"asl", int_hexagon_S2_asl_i_r_nac>;
3120 def HEXAGON_S2_asr_i_r_nac:
3121 si_SInst_sisiu5_nac <"asr", int_hexagon_S2_asr_i_r_nac>;
3122 def HEXAGON_S2_lsr_i_r_nac:
3123 si_SInst_sisiu5_nac <"lsr", int_hexagon_S2_lsr_i_r_nac>;
3124 def HEXAGON_S2_asl_i_p_acc:
3125 di_SInst_didiu6_acc <"asl", int_hexagon_S2_asl_i_p_acc>;
3126 def HEXAGON_S2_asr_i_p_acc:
3127 di_SInst_didiu6_acc <"asr", int_hexagon_S2_asr_i_p_acc>;
3128 def HEXAGON_S2_lsr_i_p_acc:
3129 di_SInst_didiu6_acc <"lsr", int_hexagon_S2_lsr_i_p_acc>;
3130 def HEXAGON_S2_asl_i_p_nac:
3131 di_SInst_didiu6_nac <"asl", int_hexagon_S2_asl_i_p_nac>;
3132 def HEXAGON_S2_asr_i_p_nac:
3133 di_SInst_didiu6_nac <"asr", int_hexagon_S2_asr_i_p_nac>;
3134 def HEXAGON_S2_lsr_i_p_nac:
3135 di_SInst_didiu6_nac <"lsr", int_hexagon_S2_lsr_i_p_nac>;
3137 // STYPE / SHIFT / Shift by immediate and add.
3138 def HEXAGON_S2_addasl_rrri:
3139 si_SInst_sisiu3 <"addasl", int_hexagon_S2_addasl_rrri>;
3141 // STYPE / SHIFT / Shift by immediate and logical.
3142 def HEXAGON_S2_asl_i_r_and:
3143 si_SInst_sisiu5_and <"asl", int_hexagon_S2_asl_i_r_and>;
3144 def HEXAGON_S2_asr_i_r_and:
3145 si_SInst_sisiu5_and <"asr", int_hexagon_S2_asr_i_r_and>;
3146 def HEXAGON_S2_lsr_i_r_and:
3147 si_SInst_sisiu5_and <"lsr", int_hexagon_S2_lsr_i_r_and>;
3149 def HEXAGON_S2_asl_i_r_xacc:
3150 si_SInst_sisiu5_xor <"asl", int_hexagon_S2_asl_i_r_xacc>;
3151 def HEXAGON_S2_lsr_i_r_xacc:
3152 si_SInst_sisiu5_xor <"lsr", int_hexagon_S2_lsr_i_r_xacc>;
3154 def HEXAGON_S2_asl_i_r_or:
3155 si_SInst_sisiu5_or <"asl", int_hexagon_S2_asl_i_r_or>;
3156 def HEXAGON_S2_asr_i_r_or:
3157 si_SInst_sisiu5_or <"asr", int_hexagon_S2_asr_i_r_or>;
3158 def HEXAGON_S2_lsr_i_r_or:
3159 si_SInst_sisiu5_or <"lsr", int_hexagon_S2_lsr_i_r_or>;
3161 def HEXAGON_S2_asl_i_p_and:
3162 di_SInst_didiu6_and <"asl", int_hexagon_S2_asl_i_p_and>;
3163 def HEXAGON_S2_asr_i_p_and:
3164 di_SInst_didiu6_and <"asr", int_hexagon_S2_asr_i_p_and>;
3165 def HEXAGON_S2_lsr_i_p_and:
3166 di_SInst_didiu6_and <"lsr", int_hexagon_S2_lsr_i_p_and>;
3168 def HEXAGON_S2_asl_i_p_xacc:
3169 di_SInst_didiu6_xor <"asl", int_hexagon_S2_asl_i_p_xacc>;
3170 def HEXAGON_S2_lsr_i_p_xacc:
3171 di_SInst_didiu6_xor <"lsr", int_hexagon_S2_lsr_i_p_xacc>;
3173 def HEXAGON_S2_asl_i_p_or:
3174 di_SInst_didiu6_or <"asl", int_hexagon_S2_asl_i_p_or>;
3175 def HEXAGON_S2_asr_i_p_or:
3176 di_SInst_didiu6_or <"asr", int_hexagon_S2_asr_i_p_or>;
3177 def HEXAGON_S2_lsr_i_p_or:
3178 di_SInst_didiu6_or <"lsr", int_hexagon_S2_lsr_i_p_or>;
3180 // STYPE / SHIFT / Shift right by immediate with rounding.
3181 def HEXAGON_S2_asr_i_r_rnd:
3182 si_SInst_siu5_rnd <"asr", int_hexagon_S2_asr_i_r_rnd>;
3183 def HEXAGON_S2_asr_i_r_rnd_goodsyntax:
3184 si_SInst_siu5 <"asrrnd", int_hexagon_S2_asr_i_r_rnd_goodsyntax>;
3186 // STYPE / SHIFT / Shift left by immediate with saturation.
3187 def HEXAGON_S2_asl_i_r_sat:
3188 si_SInst_sisi_sat <"asl", int_hexagon_S2_asl_i_r_sat>;
3190 // STYPE / SHIFT / Shift by register.
3191 def HEXAGON_S2_asl_r_r:
3192 si_SInst_sisi <"asl", int_hexagon_S2_asl_r_r>;
3193 def HEXAGON_S2_asr_r_r:
3194 si_SInst_sisi <"asr", int_hexagon_S2_asr_r_r>;
3195 def HEXAGON_S2_lsl_r_r:
3196 si_SInst_sisi <"lsl", int_hexagon_S2_lsl_r_r>;
3197 def HEXAGON_S2_lsr_r_r:
3198 si_SInst_sisi <"lsr", int_hexagon_S2_lsr_r_r>;
3199 def HEXAGON_S2_asl_r_p:
3200 di_SInst_disi <"asl", int_hexagon_S2_asl_r_p>;
3201 def HEXAGON_S2_asr_r_p:
3202 di_SInst_disi <"asr", int_hexagon_S2_asr_r_p>;
3203 def HEXAGON_S2_lsl_r_p:
3204 di_SInst_disi <"lsl", int_hexagon_S2_lsl_r_p>;
3205 def HEXAGON_S2_lsr_r_p:
3206 di_SInst_disi <"lsr", int_hexagon_S2_lsr_r_p>;
3208 // STYPE / SHIFT / Shift by register and accumulate.
3209 def HEXAGON_S2_asl_r_r_acc:
3210 si_SInst_sisisi_acc <"asl", int_hexagon_S2_asl_r_r_acc>;
3211 def HEXAGON_S2_asr_r_r_acc:
3212 si_SInst_sisisi_acc <"asr", int_hexagon_S2_asr_r_r_acc>;
3213 def HEXAGON_S2_lsl_r_r_acc:
3214 si_SInst_sisisi_acc <"lsl", int_hexagon_S2_lsl_r_r_acc>;
3215 def HEXAGON_S2_lsr_r_r_acc:
3216 si_SInst_sisisi_acc <"lsr", int_hexagon_S2_lsr_r_r_acc>;
3217 def HEXAGON_S2_asl_r_p_acc:
3218 di_SInst_didisi_acc <"asl", int_hexagon_S2_asl_r_p_acc>;
3219 def HEXAGON_S2_asr_r_p_acc:
3220 di_SInst_didisi_acc <"asr", int_hexagon_S2_asr_r_p_acc>;
3221 def HEXAGON_S2_lsl_r_p_acc:
3222 di_SInst_didisi_acc <"lsl", int_hexagon_S2_lsl_r_p_acc>;
3223 def HEXAGON_S2_lsr_r_p_acc:
3224 di_SInst_didisi_acc <"lsr", int_hexagon_S2_lsr_r_p_acc>;
3226 def HEXAGON_S2_asl_r_r_nac:
3227 si_SInst_sisisi_nac <"asl", int_hexagon_S2_asl_r_r_nac>;
3228 def HEXAGON_S2_asr_r_r_nac:
3229 si_SInst_sisisi_nac <"asr", int_hexagon_S2_asr_r_r_nac>;
3230 def HEXAGON_S2_lsl_r_r_nac:
3231 si_SInst_sisisi_nac <"lsl", int_hexagon_S2_lsl_r_r_nac>;
3232 def HEXAGON_S2_lsr_r_r_nac:
3233 si_SInst_sisisi_nac <"lsr", int_hexagon_S2_lsr_r_r_nac>;
3234 def HEXAGON_S2_asl_r_p_nac:
3235 di_SInst_didisi_nac <"asl", int_hexagon_S2_asl_r_p_nac>;
3236 def HEXAGON_S2_asr_r_p_nac:
3237 di_SInst_didisi_nac <"asr", int_hexagon_S2_asr_r_p_nac>;
3238 def HEXAGON_S2_lsl_r_p_nac:
3239 di_SInst_didisi_nac <"lsl", int_hexagon_S2_lsl_r_p_nac>;
3240 def HEXAGON_S2_lsr_r_p_nac:
3241 di_SInst_didisi_nac <"lsr", int_hexagon_S2_lsr_r_p_nac>;
3243 // STYPE / SHIFT / Shift by register and logical.
3244 def HEXAGON_S2_asl_r_r_and:
3245 si_SInst_sisisi_and <"asl", int_hexagon_S2_asl_r_r_and>;
3246 def HEXAGON_S2_asr_r_r_and:
3247 si_SInst_sisisi_and <"asr", int_hexagon_S2_asr_r_r_and>;
3248 def HEXAGON_S2_lsl_r_r_and:
3249 si_SInst_sisisi_and <"lsl", int_hexagon_S2_lsl_r_r_and>;
3250 def HEXAGON_S2_lsr_r_r_and:
3251 si_SInst_sisisi_and <"lsr", int_hexagon_S2_lsr_r_r_and>;
3253 def HEXAGON_S2_asl_r_r_or:
3254 si_SInst_sisisi_or <"asl", int_hexagon_S2_asl_r_r_or>;
3255 def HEXAGON_S2_asr_r_r_or:
3256 si_SInst_sisisi_or <"asr", int_hexagon_S2_asr_r_r_or>;
3257 def HEXAGON_S2_lsl_r_r_or:
3258 si_SInst_sisisi_or <"lsl", int_hexagon_S2_lsl_r_r_or>;
3259 def HEXAGON_S2_lsr_r_r_or:
3260 si_SInst_sisisi_or <"lsr", int_hexagon_S2_lsr_r_r_or>;
3262 def HEXAGON_S2_asl_r_p_and:
3263 di_SInst_didisi_and <"asl", int_hexagon_S2_asl_r_p_and>;
3264 def HEXAGON_S2_asr_r_p_and:
3265 di_SInst_didisi_and <"asr", int_hexagon_S2_asr_r_p_and>;
3266 def HEXAGON_S2_lsl_r_p_and:
3267 di_SInst_didisi_and <"lsl", int_hexagon_S2_lsl_r_p_and>;
3268 def HEXAGON_S2_lsr_r_p_and:
3269 di_SInst_didisi_and <"lsr", int_hexagon_S2_lsr_r_p_and>;
3271 def HEXAGON_S2_asl_r_p_or:
3272 di_SInst_didisi_or <"asl", int_hexagon_S2_asl_r_p_or>;
3273 def HEXAGON_S2_asr_r_p_or:
3274 di_SInst_didisi_or <"asr", int_hexagon_S2_asr_r_p_or>;
3275 def HEXAGON_S2_lsl_r_p_or:
3276 di_SInst_didisi_or <"lsl", int_hexagon_S2_lsl_r_p_or>;
3277 def HEXAGON_S2_lsr_r_p_or:
3278 di_SInst_didisi_or <"lsr", int_hexagon_S2_lsr_r_p_or>;
3280 // STYPE / SHIFT / Shift by register with saturation.
3281 def HEXAGON_S2_asl_r_r_sat:
3282 si_SInst_sisi_sat <"asl", int_hexagon_S2_asl_r_r_sat>;
3283 def HEXAGON_S2_asr_r_r_sat:
3284 si_SInst_sisi_sat <"asr", int_hexagon_S2_asr_r_r_sat>;
3286 // STYPE / SHIFT / Table Index.
3287 def Hexagon_S2_tableidxb_goodsyntax:
3288 si_MInst_sisiu4u5 <"tableidxb",int_hexagon_S2_tableidxb_goodsyntax>;
3289 def Hexagon_S2_tableidxd_goodsyntax:
3290 si_MInst_sisiu4u5 <"tableidxd",int_hexagon_S2_tableidxd_goodsyntax>;
3291 def Hexagon_S2_tableidxh_goodsyntax:
3292 si_MInst_sisiu4u5 <"tableidxh",int_hexagon_S2_tableidxh_goodsyntax>;
3293 def Hexagon_S2_tableidxw_goodsyntax:
3294 si_MInst_sisiu4u5 <"tableidxw",int_hexagon_S2_tableidxw_goodsyntax>;
3297 /********************************************************************
3299 *********************************************************************/
3301 // STYPE / VH / Vector absolute value halfwords.
3302 // Rdd64=vabsh(Rss64)
3303 def HEXAGON_A2_vabsh:
3304 di_SInst_di <"vabsh", int_hexagon_A2_vabsh>;
3305 def HEXAGON_A2_vabshsat:
3306 di_SInst_di_sat <"vabsh", int_hexagon_A2_vabshsat>;
3308 // STYPE / VH / Vector shift halfwords by immediate.
3309 // Rdd64=v[asl/asr/lsr]h(Rss64,Rt32)
3310 def HEXAGON_S2_asl_i_vh:
3311 di_SInst_disi <"vaslh", int_hexagon_S2_asl_i_vh>;
3312 def HEXAGON_S2_asr_i_vh:
3313 di_SInst_disi <"vasrh", int_hexagon_S2_asr_i_vh>;
3314 def HEXAGON_S2_lsr_i_vh:
3315 di_SInst_disi <"vlsrh", int_hexagon_S2_lsr_i_vh>;
3317 // STYPE / VH / Vector shift halfwords by register.
3318 // Rdd64=v[asl/asr/lsl/lsr]w(Rss64,Rt32)
3319 def HEXAGON_S2_asl_r_vh:
3320 di_SInst_disi <"vaslh", int_hexagon_S2_asl_r_vh>;
3321 def HEXAGON_S2_asr_r_vh:
3322 di_SInst_disi <"vasrh", int_hexagon_S2_asr_r_vh>;
3323 def HEXAGON_S2_lsl_r_vh:
3324 di_SInst_disi <"vlslh", int_hexagon_S2_lsl_r_vh>;
3325 def HEXAGON_S2_lsr_r_vh:
3326 di_SInst_disi <"vlsrh", int_hexagon_S2_lsr_r_vh>;
3329 /********************************************************************
3331 *********************************************************************/
3333 // STYPE / VW / Vector absolute value words.
3334 def HEXAGON_A2_vabsw:
3335 di_SInst_di <"vabsw", int_hexagon_A2_vabsw>;
3336 def HEXAGON_A2_vabswsat:
3337 di_SInst_di_sat <"vabsw", int_hexagon_A2_vabswsat>;
3339 // STYPE / VW / Vector shift words by immediate.
3340 // Rdd64=v[asl/vsl]w(Rss64,Rt32)
3341 def HEXAGON_S2_asl_i_vw:
3342 di_SInst_disi <"vaslw", int_hexagon_S2_asl_i_vw>;
3343 def HEXAGON_S2_asr_i_vw:
3344 di_SInst_disi <"vasrw", int_hexagon_S2_asr_i_vw>;
3345 def HEXAGON_S2_lsr_i_vw:
3346 di_SInst_disi <"vlsrw", int_hexagon_S2_lsr_i_vw>;
3348 // STYPE / VW / Vector shift words by register.
3349 // Rdd64=v[asl/vsl]w(Rss64,Rt32)
3350 def HEXAGON_S2_asl_r_vw:
3351 di_SInst_disi <"vaslw", int_hexagon_S2_asl_r_vw>;
3352 def HEXAGON_S2_asr_r_vw:
3353 di_SInst_disi <"vasrw", int_hexagon_S2_asr_r_vw>;
3354 def HEXAGON_S2_lsl_r_vw:
3355 di_SInst_disi <"vlslw", int_hexagon_S2_lsl_r_vw>;
3356 def HEXAGON_S2_lsr_r_vw:
3357 di_SInst_disi <"vlsrw", int_hexagon_S2_lsr_r_vw>;
3359 // STYPE / VW / Vector shift words with truncate and pack.
3360 def HEXAGON_S2_asr_r_svw_trun:
3361 si_SInst_disi <"vasrw", int_hexagon_S2_asr_r_svw_trun>;
3362 def HEXAGON_S2_asr_i_svw_trun:
3363 si_SInst_diu5 <"vasrw", int_hexagon_S2_asr_i_svw_trun>;
3365 // LD / Circular loads.
3366 def HEXAGON_circ_ldd:
3367 di_LDInstPI_diu4 <"circ_ldd", int_hexagon_circ_ldd>;
3369 include "HexagonIntrinsicsV3.td"
3370 include "HexagonIntrinsicsV4.td"
3371 include "HexagonIntrinsicsV5.td"