[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-intrinsics-bfloat.ll
blob7d1e63e23a2ce5d8a66fbb33b9a9d10789f2608f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+bf16 < %s | FileCheck %s
5 ; BFDOT
8 define <vscale x 4 x float> @bfdot_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
9 ; CHECK-LABEL: bfdot_f32:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    bfdot z0.s, z1.h, z2.h
12 ; CHECK-NEXT:    ret
13   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfdot(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c)
14   ret <vscale x 4 x float> %out
17 define <vscale x 4 x float> @bfdot_lane_0_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
18 ; CHECK-LABEL: bfdot_lane_0_f32:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    bfdot z0.s, z1.h, z2.h[0]
21 ; CHECK-NEXT:    ret
22   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfdot.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 0)
23   ret <vscale x 4 x float> %out
26 define <vscale x 4 x float> @bfdot_lane_1_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
27 ; CHECK-LABEL: bfdot_lane_1_f32:
28 ; CHECK:       // %bb.0:
29 ; CHECK-NEXT:    bfdot z0.s, z1.h, z2.h[1]
30 ; CHECK-NEXT:    ret
31   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfdot.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 1)
32   ret <vscale x 4 x float> %out
35 define <vscale x 4 x float> @bfdot_lane_2_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
36 ; CHECK-LABEL: bfdot_lane_2_f32:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    bfdot z0.s, z1.h, z2.h[2]
39 ; CHECK-NEXT:    ret
40   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfdot.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 2)
41   ret <vscale x 4 x float> %out
44 define <vscale x 4 x float> @bfdot_lane_3_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
45 ; CHECK-LABEL: bfdot_lane_3_f32:
46 ; CHECK:       // %bb.0:
47 ; CHECK-NEXT:    bfdot z0.s, z1.h, z2.h[3]
48 ; CHECK-NEXT:    ret
49   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfdot.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 3)
50   ret <vscale x 4 x float> %out
54 ; BFMLALB
57 define <vscale x 4 x float> @bfmlalb_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
58 ; CHECK-LABEL: bfmlalb_f32:
59 ; CHECK:       // %bb.0:
60 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h
61 ; CHECK-NEXT:    ret
62   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c)
63   ret <vscale x 4 x float> %out
66 define <vscale x 4 x float> @bfmlalb_lane_0_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
67 ; CHECK-LABEL: bfmlalb_lane_0_f32:
68 ; CHECK:       // %bb.0:
69 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[0]
70 ; CHECK-NEXT:    ret
71   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 0)
72   ret <vscale x 4 x float> %out
75 define <vscale x 4 x float> @bfmlalb_lane_1_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
76 ; CHECK-LABEL: bfmlalb_lane_1_f32:
77 ; CHECK:       // %bb.0:
78 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[1]
79 ; CHECK-NEXT:    ret
80   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 1)
81   ret <vscale x 4 x float> %out
84 define <vscale x 4 x float> @bfmlalb_lane_2_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
85 ; CHECK-LABEL: bfmlalb_lane_2_f32:
86 ; CHECK:       // %bb.0:
87 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[2]
88 ; CHECK-NEXT:    ret
89   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 2)
90   ret <vscale x 4 x float> %out
93 define <vscale x 4 x float> @bfmlalb_lane_3_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
94 ; CHECK-LABEL: bfmlalb_lane_3_f32:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[3]
97 ; CHECK-NEXT:    ret
98   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 3)
99   ret <vscale x 4 x float> %out
102 define <vscale x 4 x float> @bfmlalb_lane_4_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
103 ; CHECK-LABEL: bfmlalb_lane_4_f32:
104 ; CHECK:       // %bb.0:
105 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[4]
106 ; CHECK-NEXT:    ret
107   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 4)
108   ret <vscale x 4 x float> %out
111 define <vscale x 4 x float> @bfmlalb_lane_5_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
112 ; CHECK-LABEL: bfmlalb_lane_5_f32:
113 ; CHECK:       // %bb.0:
114 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[5]
115 ; CHECK-NEXT:    ret
116   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 5)
117   ret <vscale x 4 x float> %out
120 define <vscale x 4 x float> @bfmlalb_lane_6_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
121 ; CHECK-LABEL: bfmlalb_lane_6_f32:
122 ; CHECK:       // %bb.0:
123 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[6]
124 ; CHECK-NEXT:    ret
125   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 6)
126   ret <vscale x 4 x float> %out
129 define <vscale x 4 x float> @bfmlalb_lane_7_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
130 ; CHECK-LABEL: bfmlalb_lane_7_f32:
131 ; CHECK:       // %bb.0:
132 ; CHECK-NEXT:    bfmlalb z0.s, z1.h, z2.h[7]
133 ; CHECK-NEXT:    ret
134   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 7)
135   ret <vscale x 4 x float> %out
139 ; BFMLALT
142 define <vscale x 4 x float> @bfmlalt_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
143 ; CHECK-LABEL: bfmlalt_f32:
144 ; CHECK:       // %bb.0:
145 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h
146 ; CHECK-NEXT:    ret
147   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c)
148   ret <vscale x 4 x float> %out
151 define <vscale x 4 x float> @bfmlalt_lane_0_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
152 ; CHECK-LABEL: bfmlalt_lane_0_f32:
153 ; CHECK:       // %bb.0:
154 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[0]
155 ; CHECK-NEXT:    ret
156   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 0)
157   ret <vscale x 4 x float> %out
160 define <vscale x 4 x float> @bfmlalt_lane_1_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
161 ; CHECK-LABEL: bfmlalt_lane_1_f32:
162 ; CHECK:       // %bb.0:
163 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[1]
164 ; CHECK-NEXT:    ret
165   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 1)
166   ret <vscale x 4 x float> %out
169 define <vscale x 4 x float> @bfmlalt_lane_2_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
170 ; CHECK-LABEL: bfmlalt_lane_2_f32:
171 ; CHECK:       // %bb.0:
172 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[2]
173 ; CHECK-NEXT:    ret
174   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 2)
175   ret <vscale x 4 x float> %out
178 define <vscale x 4 x float> @bfmlalt_lane_3_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
179 ; CHECK-LABEL: bfmlalt_lane_3_f32:
180 ; CHECK:       // %bb.0:
181 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[3]
182 ; CHECK-NEXT:    ret
183   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 3)
184   ret <vscale x 4 x float> %out
187 define <vscale x 4 x float> @bfmlalt_lane_4_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
188 ; CHECK-LABEL: bfmlalt_lane_4_f32:
189 ; CHECK:       // %bb.0:
190 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[4]
191 ; CHECK-NEXT:    ret
192   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 4)
193   ret <vscale x 4 x float> %out
196 define <vscale x 4 x float> @bfmlalt_lane_5_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
197 ; CHECK-LABEL: bfmlalt_lane_5_f32:
198 ; CHECK:       // %bb.0:
199 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[5]
200 ; CHECK-NEXT:    ret
201   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 5)
202   ret <vscale x 4 x float> %out
205 define <vscale x 4 x float> @bfmlalt_lane_6_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
206 ; CHECK-LABEL: bfmlalt_lane_6_f32:
207 ; CHECK:       // %bb.0:
208 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[6]
209 ; CHECK-NEXT:    ret
210   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 6)
211   ret <vscale x 4 x float> %out
214 define <vscale x 4 x float> @bfmlalt_lane_7_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
215 ; CHECK-LABEL: bfmlalt_lane_7_f32:
216 ; CHECK:       // %bb.0:
217 ; CHECK-NEXT:    bfmlalt z0.s, z1.h, z2.h[7]
218 ; CHECK-NEXT:    ret
219   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c, i32 7)
220   ret <vscale x 4 x float> %out
224 ; BFMMLA
227 define <vscale x 4 x float> @bfmmla_f32(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c) nounwind {
228 ; CHECK-LABEL: bfmmla_f32:
229 ; CHECK:       // %bb.0:
230 ; CHECK-NEXT:    bfmmla z0.s, z1.h, z2.h
231 ; CHECK-NEXT:    ret
232   %out = call <vscale x 4 x float> @llvm.aarch64.sve.bfmmla(<vscale x 4 x float> %a, <vscale x 8 x bfloat> %b, <vscale x 8 x bfloat> %c)
233   ret <vscale x 4 x float> %out
237 ; BFCVT
240 define <vscale x 8 x bfloat> @fcvt_bf16_f32(<vscale x 8 x bfloat> %a, <vscale x 8 x i1> %pg, <vscale x 4 x float> %b) nounwind {
241 ; CHECK-LABEL: fcvt_bf16_f32:
242 ; CHECK:       // %bb.0:
243 ; CHECK-NEXT:    bfcvt z0.h, p0/m, z1.s
244 ; CHECK-NEXT:    ret
245   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32(<vscale x 8 x bfloat> %a, <vscale x 8 x i1> %pg, <vscale x 4 x float> %b)
246   ret <vscale x 8 x bfloat> %out
250 ; BFCVTNT
253 define <vscale x 8 x bfloat> @fcvtnt_bf16_f32(<vscale x 8 x bfloat> %a, <vscale x 8 x i1> %pg, <vscale x 4 x float> %b) nounwind {
254 ; CHECK-LABEL: fcvtnt_bf16_f32:
255 ; CHECK:       // %bb.0:
256 ; CHECK-NEXT:    bfcvtnt z0.h, p0/m, z1.s
257 ; CHECK-NEXT:    ret
258   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvtnt.bf16f32(<vscale x 8 x bfloat> %a, <vscale x 8 x i1> %pg, <vscale x 4 x float> %b)
259   ret <vscale x 8 x bfloat> %out
262 declare <vscale x 4 x float> @llvm.aarch64.sve.bfdot(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
263 declare <vscale x 4 x float> @llvm.aarch64.sve.bfdot.lane.v2(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>, i32)
264 declare <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
265 declare <vscale x 4 x float> @llvm.aarch64.sve.bfmlalb.lane.v2(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>, i32)
266 declare <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
267 declare <vscale x 4 x float> @llvm.aarch64.sve.bfmlalt.lane.v2(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>, i32)
268 declare <vscale x 4 x float> @llvm.aarch64.sve.bfmmla(<vscale x 4 x float>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
269 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32(<vscale x 8 x bfloat>, <vscale x 8 x i1>, <vscale x 4 x float>)
270 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvtnt.bf16f32(<vscale x 8 x bfloat>, <vscale x 8 x i1>, <vscale x 4 x float>)