[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / Hexagon / autohvx / mulh.ll
blobe6e9a06291baad7df4f6f470cb9ce2df6668ed56
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=hexagon -mattr=+hvxv60,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V60 %s
3 ; RUN: llc -march=hexagon -mattr=+hvxv65,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V65 %s
4 ; RUN: llc -march=hexagon -mattr=+hvxv69,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V69 %s
6 define <64 x i16> @mulhs16(<64 x i16> %a0, <64 x i16> %a1) #0 {
7 ; V60-LABEL: mulhs16:
8 ; V60:       // %bb.0:
9 ; V60-NEXT:    {
10 ; V60-NEXT:     v1:0.w = vmpy(v1.h,v0.h)
11 ; V60-NEXT:    }
12 ; V60-NEXT:    {
13 ; V60-NEXT:     r7 = #124
14 ; V60-NEXT:    }
15 ; V60-NEXT:    {
16 ; V60-NEXT:     v1:0 = vshuff(v1,v0,r7)
17 ; V60-NEXT:    }
18 ; V60-NEXT:    {
19 ; V60-NEXT:     v0.h = vpacko(v1.w,v0.w)
20 ; V60-NEXT:    }
21 ; V60-NEXT:    {
22 ; V60-NEXT:     jumpr r31
23 ; V60-NEXT:    }
25 ; V65-LABEL: mulhs16:
26 ; V65:       // %bb.0:
27 ; V65-NEXT:    {
28 ; V65-NEXT:     v1:0.w = vmpy(v1.h,v0.h)
29 ; V65-NEXT:    }
30 ; V65-NEXT:    {
31 ; V65-NEXT:     r7 = #124
32 ; V65-NEXT:    }
33 ; V65-NEXT:    {
34 ; V65-NEXT:     v1:0 = vshuff(v1,v0,r7)
35 ; V65-NEXT:    }
36 ; V65-NEXT:    {
37 ; V65-NEXT:     v0.h = vpacko(v1.w,v0.w)
38 ; V65-NEXT:    }
39 ; V65-NEXT:    {
40 ; V65-NEXT:     jumpr r31
41 ; V65-NEXT:    }
43 ; V69-LABEL: mulhs16:
44 ; V69:       // %bb.0:
45 ; V69-NEXT:    {
46 ; V69-NEXT:     v1:0.w = vmpy(v1.h,v0.h)
47 ; V69-NEXT:    }
48 ; V69-NEXT:    {
49 ; V69-NEXT:     r7 = #124
50 ; V69-NEXT:    }
51 ; V69-NEXT:    {
52 ; V69-NEXT:     v1:0 = vshuff(v1,v0,r7)
53 ; V69-NEXT:    }
54 ; V69-NEXT:    {
55 ; V69-NEXT:     v0.h = vpacko(v1.w,v0.w)
56 ; V69-NEXT:    }
57 ; V69-NEXT:    {
58 ; V69-NEXT:     jumpr r31
59 ; V69-NEXT:    }
60   %v0 = sext <64 x i16> %a0 to <64 x i32>
61   %v1 = sext <64 x i16> %a1 to <64 x i32>
62   %v2 = mul <64 x i32> %v0, %v1
63   %v3 = lshr <64 x i32> %v2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
64   %v4 = trunc <64 x i32> %v3 to <64 x i16>
65   ret <64 x i16> %v4
68 define <64 x i16> @mulhu16(<64 x i16> %a0, <64 x i16> %a1) #0 {
69 ; V60-LABEL: mulhu16:
70 ; V60:       // %bb.0:
71 ; V60-NEXT:    {
72 ; V60-NEXT:     v1:0.uw = vmpy(v1.uh,v0.uh)
73 ; V60-NEXT:    }
74 ; V60-NEXT:    {
75 ; V60-NEXT:     r7 = #124
76 ; V60-NEXT:    }
77 ; V60-NEXT:    {
78 ; V60-NEXT:     v1:0 = vshuff(v1,v0,r7)
79 ; V60-NEXT:    }
80 ; V60-NEXT:    {
81 ; V60-NEXT:     v0.h = vpacko(v1.w,v0.w)
82 ; V60-NEXT:    }
83 ; V60-NEXT:    {
84 ; V60-NEXT:     jumpr r31
85 ; V60-NEXT:    }
87 ; V65-LABEL: mulhu16:
88 ; V65:       // %bb.0:
89 ; V65-NEXT:    {
90 ; V65-NEXT:     v1:0.uw = vmpy(v1.uh,v0.uh)
91 ; V65-NEXT:    }
92 ; V65-NEXT:    {
93 ; V65-NEXT:     r7 = #124
94 ; V65-NEXT:    }
95 ; V65-NEXT:    {
96 ; V65-NEXT:     v1:0 = vshuff(v1,v0,r7)
97 ; V65-NEXT:    }
98 ; V65-NEXT:    {
99 ; V65-NEXT:     v0.h = vpacko(v1.w,v0.w)
100 ; V65-NEXT:    }
101 ; V65-NEXT:    {
102 ; V65-NEXT:     jumpr r31
103 ; V65-NEXT:    }
105 ; V69-LABEL: mulhu16:
106 ; V69:       // %bb.0:
107 ; V69-NEXT:    {
108 ; V69-NEXT:     v0.uh = vmpy(v0.uh,v1.uh):>>16
109 ; V69-NEXT:    }
110 ; V69-NEXT:    {
111 ; V69-NEXT:     jumpr r31
112 ; V69-NEXT:    }
113   %v0 = zext <64 x i16> %a0 to <64 x i32>
114   %v1 = zext <64 x i16> %a1 to <64 x i32>
115   %v2 = mul <64 x i32> %v0, %v1
116   %v3 = lshr <64 x i32> %v2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
117   %v4 = trunc <64 x i32> %v3 to <64 x i16>
118   ret <64 x i16> %v4
121 define <32 x i32> @mulhs32(<32 x i32> %a0, <32 x i32> %a1) #0 {
122 ; V60-LABEL: mulhs32:
123 ; V60:       // %bb.0:
124 ; V60-NEXT:    {
125 ; V60-NEXT:     r0 = #16
126 ; V60-NEXT:    }
127 ; V60-NEXT:    {
128 ; V60-NEXT:     v2.w = vmpye(v1.w,v0.uh)
129 ; V60-NEXT:    }
130 ; V60-NEXT:    {
131 ; V60-NEXT:     v31.w = vasr(v0.w,r0)
132 ; V60-NEXT:    }
133 ; V60-NEXT:    {
134 ; V60-NEXT:     v3.w = vasr(v1.w,r0)
135 ; V60-NEXT:    }
136 ; V60-NEXT:    {
137 ; V60-NEXT:     v5:4.w = vmpy(v31.h,v1.uh)
138 ; V60-NEXT:    }
139 ; V60-NEXT:    {
140 ; V60-NEXT:     v31:30.w = vmpy(v31.h,v3.h)
141 ; V60-NEXT:    }
142 ; V60-NEXT:    {
143 ; V60-NEXT:     v7:6.w = vadd(v2.uh,v4.uh)
144 ; V60-NEXT:    }
145 ; V60-NEXT:    {
146 ; V60-NEXT:     v29:28.w = vadd(v2.h,v4.h)
147 ; V60-NEXT:    }
148 ; V60-NEXT:    {
149 ; V60-NEXT:     v29.w += vasr(v6.w,r0)
150 ; V60-NEXT:    }
151 ; V60-NEXT:    {
152 ; V60-NEXT:     v0.w = vadd(v29.w,v30.w)
153 ; V60-NEXT:    }
154 ; V60-NEXT:    {
155 ; V60-NEXT:     jumpr r31
156 ; V60-NEXT:    }
158 ; V65-LABEL: mulhs32:
159 ; V65:       // %bb.0:
160 ; V65-NEXT:    {
161 ; V65-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
162 ; V65-NEXT:    }
163 ; V65-NEXT:    {
164 ; V65-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
165 ; V65-NEXT:    }
166 ; V65-NEXT:    {
167 ; V65-NEXT:     v0 = v3
168 ; V65-NEXT:    }
169 ; V65-NEXT:    {
170 ; V65-NEXT:     jumpr r31
171 ; V65-NEXT:    }
173 ; V69-LABEL: mulhs32:
174 ; V69:       // %bb.0:
175 ; V69-NEXT:    {
176 ; V69-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
177 ; V69-NEXT:    }
178 ; V69-NEXT:    {
179 ; V69-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
180 ; V69-NEXT:    }
181 ; V69-NEXT:    {
182 ; V69-NEXT:     v0 = v3
183 ; V69-NEXT:    }
184 ; V69-NEXT:    {
185 ; V69-NEXT:     jumpr r31
186 ; V69-NEXT:    }
187   %v0 = sext <32 x i32> %a0 to <32 x i64>
188   %v1 = sext <32 x i32> %a1 to <32 x i64>
189   %v2 = mul <32 x i64> %v0, %v1
190   %v3 = lshr <32 x i64> %v2, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>
191   %v4 = trunc <32 x i64> %v3 to <32 x i32>
192   ret <32 x i32> %v4
195 define <32 x i32> @mulhu32(<32 x i32> %a0, <32 x i32> %a1) #0 {
196 ; V60-LABEL: mulhu32:
197 ; V60:       // %bb.0:
198 ; V60-NEXT:    {
199 ; V60-NEXT:     r0 = ##33686018
200 ; V60-NEXT:    }
201 ; V60-NEXT:    {
202 ; V60-NEXT:     v3:2.uw = vmpy(v0.uh,v1.uh)
203 ; V60-NEXT:    }
204 ; V60-NEXT:    {
205 ; V60-NEXT:     r2 = #16
206 ; V60-NEXT:    }
207 ; V60-NEXT:    {
208 ; V60-NEXT:     v4 = vsplat(r0)
209 ; V60-NEXT:    }
210 ; V60-NEXT:    {
211 ; V60-NEXT:     v2.uw = vlsr(v2.uw,r2)
212 ; V60-NEXT:    }
213 ; V60-NEXT:    {
214 ; V60-NEXT:     v31 = vdelta(v1,v4)
215 ; V60-NEXT:    }
216 ; V60-NEXT:    {
217 ; V60-NEXT:     v1:0.uw = vmpy(v0.uh,v31.uh)
218 ; V60-NEXT:    }
219 ; V60-NEXT:    {
220 ; V60-NEXT:     v1:0.w = vadd(v1.uh,v0.uh)
221 ; V60-NEXT:    }
222 ; V60-NEXT:    {
223 ; V60-NEXT:     v0.w = vadd(v0.w,v2.w)
224 ; V60-NEXT:    }
225 ; V60-NEXT:    {
226 ; V60-NEXT:     v1.w += vasr(v0.w,r2)
227 ; V60-NEXT:    }
228 ; V60-NEXT:    {
229 ; V60-NEXT:     v0.w = vadd(v3.w,v1.w)
230 ; V60-NEXT:    }
231 ; V60-NEXT:    {
232 ; V60-NEXT:     jumpr r31
233 ; V60-NEXT:    }
235 ; V65-LABEL: mulhu32:
236 ; V65:       // %bb.0:
237 ; V65-NEXT:    {
238 ; V65-NEXT:     v2 = vxor(v2,v2)
239 ; V65-NEXT:    }
240 ; V65-NEXT:    {
241 ; V65-NEXT:     v5:4 = vmpye(v0.w,v1.uh)
242 ; V65-NEXT:    }
243 ; V65-NEXT:    {
244 ; V65-NEXT:     q0 = vcmp.gt(v2.w,v0.w)
245 ; V65-NEXT:    }
246 ; V65-NEXT:    {
247 ; V65-NEXT:     q1 = vcmp.gt(v2.w,v1.w)
248 ; V65-NEXT:    }
249 ; V65-NEXT:    {
250 ; V65-NEXT:     v5:4 += vmpyo(v0.w,v1.h)
251 ; V65-NEXT:    }
252 ; V65-NEXT:    {
253 ; V65-NEXT:     v31 = vand(q0,v1)
254 ; V65-NEXT:    }
255 ; V65-NEXT:    {
256 ; V65-NEXT:     if (q1) v31.w += v0.w
257 ; V65-NEXT:    }
258 ; V65-NEXT:    {
259 ; V65-NEXT:     v0.w = vadd(v5.w,v31.w)
260 ; V65-NEXT:    }
261 ; V65-NEXT:    {
262 ; V65-NEXT:     jumpr r31
263 ; V65-NEXT:    }
265 ; V69-LABEL: mulhu32:
266 ; V69:       // %bb.0:
267 ; V69-NEXT:    {
268 ; V69-NEXT:     v2 = vxor(v2,v2)
269 ; V69-NEXT:    }
270 ; V69-NEXT:    {
271 ; V69-NEXT:     v5:4 = vmpye(v0.w,v1.uh)
272 ; V69-NEXT:    }
273 ; V69-NEXT:    {
274 ; V69-NEXT:     q0 = vcmp.gt(v2.w,v0.w)
275 ; V69-NEXT:    }
276 ; V69-NEXT:    {
277 ; V69-NEXT:     q1 = vcmp.gt(v2.w,v1.w)
278 ; V69-NEXT:    }
279 ; V69-NEXT:    {
280 ; V69-NEXT:     v5:4 += vmpyo(v0.w,v1.h)
281 ; V69-NEXT:    }
282 ; V69-NEXT:    {
283 ; V69-NEXT:     v31 = vand(q0,v1)
284 ; V69-NEXT:    }
285 ; V69-NEXT:    {
286 ; V69-NEXT:     if (q1) v31.w += v0.w
287 ; V69-NEXT:    }
288 ; V69-NEXT:    {
289 ; V69-NEXT:     v0.w = vadd(v5.w,v31.w)
290 ; V69-NEXT:    }
291 ; V69-NEXT:    {
292 ; V69-NEXT:     jumpr r31
293 ; V69-NEXT:    }
294   %v0 = zext <32 x i32> %a0 to <32 x i64>
295   %v1 = zext <32 x i32> %a1 to <32 x i64>
296   %v2 = mul <32 x i64> %v0, %v1
297   %v3 = lshr <32 x i64> %v2, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>
298   %v4 = trunc <32 x i64> %v3 to <32 x i32>
299   ret <32 x i32> %v4
302 attributes #0 = { nounwind memory(none) }