[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-intrinsics-loads-ff.ll
blob96de8cc67802455b5672727f087c28084fd131c5
1 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
4 ; LDFF1B
7 define <vscale x 16 x i8> @ldff1b(<vscale x 16 x i1> %pg, i8* %a) {
8 ; CHECK-LABEL: ldff1b:
9 ; CHECK: ldff1b { z0.b }, p0/z, [x0]
10 ; CHECK-NEXT: ret
11   %load = call <vscale x 16 x i8> @llvm.aarch64.sve.ldff1.nxv16i8(<vscale x 16 x i1> %pg, i8* %a)
12   ret <vscale x 16 x i8> %load
15 define <vscale x 16 x i8> @ldff1b_reg(<vscale x 16 x i1> %pg, i8* %a, i64 %offset) {
16 ; CHECK-LABEL: ldff1b_reg:
17 ; CHECK: ldff1b { z0.b }, p0/z, [x0, x1]
18 ; CHECK-NEXT: ret
19   %base = getelementptr i8, i8* %a, i64 %offset
20   %load = call <vscale x 16 x i8> @llvm.aarch64.sve.ldff1.nxv16i8(<vscale x 16 x i1> %pg, i8* %base)
21   ret <vscale x 16 x i8> %load
24 define <vscale x 8 x i16> @ldff1b_h(<vscale x 8 x i1> %pg, i8* %a) {
25 ; CHECK-LABEL: ldff1b_h:
26 ; CHECK: ldff1b { z0.h }, p0/z, [x0]
27 ; CHECK-NEXT: ret
28   %load = call <vscale x 8 x i8> @llvm.aarch64.sve.ldff1.nxv8i8(<vscale x 8 x i1> %pg, i8* %a)
29   %res = zext <vscale x 8 x i8> %load to <vscale x 8 x i16>
30   ret <vscale x 8 x i16> %res
33 define <vscale x 8 x i16> @ldff1b_h_reg(<vscale x 8 x i1> %pg, i8* %a, i64 %offset) {
34 ; CHECK-LABEL: ldff1b_h_reg:
35 ; CHECK: ldff1b { z0.h }, p0/z, [x0, x1]
36 ; CHECK-NEXT: ret
37   %base = getelementptr i8, i8* %a, i64 %offset
38   %load = call <vscale x 8 x i8> @llvm.aarch64.sve.ldff1.nxv8i8(<vscale x 8 x i1> %pg, i8* %base)
39   %res = zext <vscale x 8 x i8> %load to <vscale x 8 x i16>
40   ret <vscale x 8 x i16> %res
43 define <vscale x 4 x i32> @ldff1b_s(<vscale x 4 x i1> %pg, i8* %a) {
44 ; CHECK-LABEL: ldff1b_s:
45 ; CHECK: ldff1b { z0.s }, p0/z, [x0]
46 ; CHECK-NEXT: ret
47   %load = call <vscale x 4 x i8> @llvm.aarch64.sve.ldff1.nxv4i8(<vscale x 4 x i1> %pg, i8* %a)
48   %res = zext <vscale x 4 x i8> %load to <vscale x 4 x i32>
49   ret <vscale x 4 x i32> %res
52 define <vscale x 4 x i32> @ldff1b_s_reg(<vscale x 4 x i1> %pg, i8* %a, i64 %offset) {
53 ; CHECK-LABEL: ldff1b_s_reg:
54 ; CHECK: ldff1b { z0.s }, p0/z, [x0, x1]
55 ; CHECK-NEXT: ret
56   %base = getelementptr i8, i8* %a, i64 %offset
57   %load = call <vscale x 4 x i8> @llvm.aarch64.sve.ldff1.nxv4i8(<vscale x 4 x i1> %pg, i8* %base)
58   %res = zext <vscale x 4 x i8> %load to <vscale x 4 x i32>
59   ret <vscale x 4 x i32> %res
62 define <vscale x 2 x i64> @ldff1b_d(<vscale x 2 x i1> %pg, i8* %a) {
63 ; CHECK-LABEL: ldff1b_d:
64 ; CHECK: ldff1b { z0.d }, p0/z, [x0]
65 ; CHECK-NEXT: ret
66   %load = call <vscale x 2 x i8> @llvm.aarch64.sve.ldff1.nxv2i8(<vscale x 2 x i1> %pg, i8* %a)
67   %res = zext <vscale x 2 x i8> %load to <vscale x 2 x i64>
68   ret <vscale x 2 x i64> %res
71 define <vscale x 2 x i64> @ldff1b_d_reg(<vscale x 2 x i1> %pg, i8* %a, i64 %offset) {
72 ; CHECK-LABEL: ldff1b_d_reg:
73 ; CHECK: ldff1b { z0.d }, p0/z, [x0, x1]
74 ; CHECK-NEXT: ret
75   %base = getelementptr i8, i8* %a, i64 %offset
76   %load = call <vscale x 2 x i8> @llvm.aarch64.sve.ldff1.nxv2i8(<vscale x 2 x i1> %pg, i8* %base)
77   %res = zext <vscale x 2 x i8> %load to <vscale x 2 x i64>
78   ret <vscale x 2 x i64> %res
82 ; LDFF1SB
85 define <vscale x 8 x i16> @ldff1sb_h(<vscale x 8 x i1> %pg, i8* %a) {
86 ; CHECK-LABEL: ldff1sb_h:
87 ; CHECK: ldff1sb { z0.h }, p0/z, [x0]
88 ; CHECK-NEXT: ret
89   %load = call <vscale x 8 x i8> @llvm.aarch64.sve.ldff1.nxv8i8(<vscale x 8 x i1> %pg, i8* %a)
90   %res = sext <vscale x 8 x i8> %load to <vscale x 8 x i16>
91   ret <vscale x 8 x i16> %res
94 define <vscale x 8 x i16> @ldff1sb_h_reg(<vscale x 8 x i1> %pg, i8* %a, i64 %offset) {
95 ; CHECK-LABEL: ldff1sb_h_reg:
96 ; CHECK: ldff1sb { z0.h }, p0/z, [x0, x1]
97 ; CHECK-NEXT: ret
98   %base = getelementptr i8, i8* %a, i64 %offset
99   %load = call <vscale x 8 x i8> @llvm.aarch64.sve.ldff1.nxv8i8(<vscale x 8 x i1> %pg, i8* %base)
100   %res = sext <vscale x 8 x i8> %load to <vscale x 8 x i16>
101   ret <vscale x 8 x i16> %res
104 define <vscale x 4 x i32> @ldff1sb_s(<vscale x 4 x i1> %pg, i8* %a) {
105 ; CHECK-LABEL: ldff1sb_s:
106 ; CHECK: ldff1sb { z0.s }, p0/z, [x0]
107 ; CHECK-NEXT: ret
108   %load = call <vscale x 4 x i8> @llvm.aarch64.sve.ldff1.nxv4i8(<vscale x 4 x i1> %pg, i8* %a)
109   %res = sext <vscale x 4 x i8> %load to <vscale x 4 x i32>
110   ret <vscale x 4 x i32> %res
113 define <vscale x 4 x i32> @ldff1sb_s_reg(<vscale x 4 x i1> %pg, i8* %a, i64 %offset) {
114 ; CHECK-LABEL: ldff1sb_s_reg:
115 ; CHECK: ldff1sb { z0.s }, p0/z, [x0, x1]
116 ; CHECK-NEXT: ret
117   %base = getelementptr i8, i8* %a, i64 %offset
118   %load = call <vscale x 4 x i8> @llvm.aarch64.sve.ldff1.nxv4i8(<vscale x 4 x i1> %pg, i8* %base)
119   %res = sext <vscale x 4 x i8> %load to <vscale x 4 x i32>
120   ret <vscale x 4 x i32> %res
123 define <vscale x 2 x i64> @ldff1sb_d(<vscale x 2 x i1> %pg, i8* %a) {
124 ; CHECK-LABEL: ldff1sb_d:
125 ; CHECK: ldff1sb { z0.d }, p0/z, [x0]
126 ; CHECK-NEXT: ret
127   %load = call <vscale x 2 x i8> @llvm.aarch64.sve.ldff1.nxv2i8(<vscale x 2 x i1> %pg, i8* %a)
128   %res = sext <vscale x 2 x i8> %load to <vscale x 2 x i64>
129   ret <vscale x 2 x i64> %res
132 define <vscale x 2 x i64> @ldff1sb_d_reg(<vscale x 2 x i1> %pg, i8* %a, i64 %offset) {
133 ; CHECK-LABEL: ldff1sb_d_reg:
134 ; CHECK: ldff1sb { z0.d }, p0/z, [x0, x1]
135 ; CHECK-NEXT: ret
136   %base = getelementptr i8, i8* %a, i64 %offset
137   %load = call <vscale x 2 x i8> @llvm.aarch64.sve.ldff1.nxv2i8(<vscale x 2 x i1> %pg, i8* %base)
138   %res = sext <vscale x 2 x i8> %load to <vscale x 2 x i64>
139   ret <vscale x 2 x i64> %res
143 ; LDFF1H
146 define <vscale x 8 x i16> @ldff1h(<vscale x 8 x i1> %pg, i16* %a) {
147 ; CHECK-LABEL: ldff1h:
148 ; CHECK: ldff1h { z0.h }, p0/z, [x0]
149 ; CHECK-NEXT: ret
150   %load = call <vscale x 8 x i16> @llvm.aarch64.sve.ldff1.nxv8i16(<vscale x 8 x i1> %pg, i16* %a)
151   ret <vscale x 8 x i16> %load
154 define <vscale x 8 x i16> @ldff1h_reg(<vscale x 8 x i1> %pg, i16* %a, i64 %offset) {
155 ; CHECK-LABEL: ldff1h_reg:
156 ; CHECK: ldff1h { z0.h }, p0/z, [x0, x1, lsl #1]
157 ; CHECK-NEXT: ret
158   %base = getelementptr i16, i16* %a, i64 %offset
159   %load = call <vscale x 8 x i16> @llvm.aarch64.sve.ldff1.nxv8i16(<vscale x 8 x i1> %pg, i16* %base)
160   ret <vscale x 8 x i16> %load
163 define <vscale x 4 x i32> @ldff1h_s(<vscale x 4 x i1> %pg, i16* %a) {
164 ; CHECK-LABEL: ldff1h_s:
165 ; CHECK: ldff1h { z0.s }, p0/z, [x0]
166 ; CHECK-NEXT: ret
167   %load = call <vscale x 4 x i16> @llvm.aarch64.sve.ldff1.nxv4i16(<vscale x 4 x i1> %pg, i16* %a)
168   %res = zext <vscale x 4 x i16> %load to <vscale x 4 x i32>
169   ret <vscale x 4 x i32> %res
172 define <vscale x 4 x i32> @ldff1h_s_reg(<vscale x 4 x i1> %pg, i16* %a, i64 %offset) {
173 ; CHECK-LABEL: ldff1h_s_reg:
174 ; CHECK: ldff1h { z0.s }, p0/z, [x0, x1, lsl #1]
175 ; CHECK-NEXT: ret
176   %base = getelementptr i16, i16* %a, i64 %offset
177   %load = call <vscale x 4 x i16> @llvm.aarch64.sve.ldff1.nxv4i16(<vscale x 4 x i1> %pg, i16* %base)
178   %res = zext <vscale x 4 x i16> %load to <vscale x 4 x i32>
179   ret <vscale x 4 x i32> %res
182 define <vscale x 2 x i64> @ldff1h_d(<vscale x 2 x i1> %pg, i16* %a) {
183 ; CHECK-LABEL: ldff1h_d:
184 ; CHECK: ldff1h { z0.d }, p0/z, [x0]
185 ; CHECK-NEXT: ret
186   %load = call <vscale x 2 x i16> @llvm.aarch64.sve.ldff1.nxv2i16(<vscale x 2 x i1> %pg, i16* %a)
187   %res = zext <vscale x 2 x i16> %load to <vscale x 2 x i64>
188   ret <vscale x 2 x i64> %res
191 define <vscale x 2 x i64> @ldff1h_d_reg(<vscale x 2 x i1> %pg, i16* %a, i64 %offset) {
192 ; CHECK-LABEL: ldff1h_d_reg:
193 ; CHECK: ldff1h { z0.d }, p0/z, [x0, x1, lsl #1]
194 ; CHECK-NEXT: ret
195   %base = getelementptr i16, i16* %a, i64 %offset
196   %load = call <vscale x 2 x i16> @llvm.aarch64.sve.ldff1.nxv2i16(<vscale x 2 x i1> %pg, i16* %base)
197   %res = zext <vscale x 2 x i16> %load to <vscale x 2 x i64>
198   ret <vscale x 2 x i64> %res
201 define <vscale x 8 x half> @ldff1h_f16(<vscale x 8 x i1> %pg, half* %a) {
202 ; CHECK-LABEL: ldff1h_f16:
203 ; CHECK: ldff1h { z0.h }, p0/z, [x0]
204 ; CHECK-NEXT: ret
205   %load = call <vscale x 8 x half> @llvm.aarch64.sve.ldff1.nxv8f16(<vscale x 8 x i1> %pg, half* %a)
206   ret <vscale x 8 x half> %load
209 define <vscale x 8 x bfloat> @ldff1h_bf16(<vscale x 8 x i1> %pg, bfloat* %a) #0 {
210 ; CHECK-LABEL: ldff1h_bf16:
211 ; CHECK: ldff1h { z0.h }, p0/z, [x0]
212 ; CHECK-NEXT: ret
213   %load = call <vscale x 8 x bfloat> @llvm.aarch64.sve.ldff1.nxv8bf16(<vscale x 8 x i1> %pg, bfloat* %a)
214   ret <vscale x 8 x bfloat> %load
217 define <vscale x 8 x half> @ldff1h_f16_reg(<vscale x 8 x i1> %pg, half* %a, i64 %offset) {
218 ; CHECK-LABEL: ldff1h_f16_reg:
219 ; CHECK: ldff1h { z0.h }, p0/z, [x0, x1, lsl #1]
220 ; CHECK-NEXT: ret
221   %base = getelementptr half, half* %a, i64 %offset
222   %load = call <vscale x 8 x half> @llvm.aarch64.sve.ldff1.nxv8f16(<vscale x 8 x i1> %pg, half* %base)
223   ret <vscale x 8 x half> %load
226 define <vscale x 8 x bfloat> @ldff1h_bf16_reg(<vscale x 8 x i1> %pg, bfloat* %a, i64 %offset) #0 {
227 ; CHECK-LABEL: ldff1h_bf16_reg:
228 ; CHECK: ldff1h { z0.h }, p0/z, [x0, x1, lsl #1]
229 ; CHECK-NEXT: ret
230   %base = getelementptr bfloat, bfloat* %a, i64 %offset
231   %load = call <vscale x 8 x bfloat> @llvm.aarch64.sve.ldff1.nxv8bf16(<vscale x 8 x i1> %pg, bfloat* %base)
232   ret <vscale x 8 x bfloat> %load
236 ; LDFF1SH
239 define <vscale x 4 x i32> @ldff1sh_s(<vscale x 4 x i1> %pg, i16* %a) {
240 ; CHECK-LABEL: ldff1sh_s:
241 ; CHECK: ldff1sh { z0.s }, p0/z, [x0]
242 ; CHECK-NEXT: ret
243   %load = call <vscale x 4 x i16> @llvm.aarch64.sve.ldff1.nxv4i16(<vscale x 4 x i1> %pg, i16* %a)
244   %res = sext <vscale x 4 x i16> %load to <vscale x 4 x i32>
245   ret <vscale x 4 x i32> %res
248 define <vscale x 4 x i32> @ldff1sh_s_reg(<vscale x 4 x i1> %pg, i16* %a, i64 %offset) {
249 ; CHECK-LABEL: ldff1sh_s_reg:
250 ; CHECK: ldff1sh { z0.s }, p0/z, [x0, x1, lsl #1]
251 ; CHECK-NEXT: ret
252   %base = getelementptr i16, i16* %a, i64 %offset
253   %load = call <vscale x 4 x i16> @llvm.aarch64.sve.ldff1.nxv4i16(<vscale x 4 x i1> %pg, i16* %base)
254   %res = sext <vscale x 4 x i16> %load to <vscale x 4 x i32>
255   ret <vscale x 4 x i32> %res
258 define <vscale x 2 x i64> @ldff1sh_d(<vscale x 2 x i1> %pg, i16* %a) {
259 ; CHECK-LABEL: ldff1sh_d:
260 ; CHECK: ldff1sh { z0.d }, p0/z, [x0]
261 ; CHECK-NEXT: ret
262   %load = call <vscale x 2 x i16> @llvm.aarch64.sve.ldff1.nxv2i16(<vscale x 2 x i1> %pg, i16* %a)
263   %res = sext <vscale x 2 x i16> %load to <vscale x 2 x i64>
264   ret <vscale x 2 x i64> %res
267 define <vscale x 2 x i64> @ldff1sh_d_reg(<vscale x 2 x i1> %pg, i16* %a, i64 %offset) {
268 ; CHECK-LABEL: ldff1sh_d_reg:
269 ; CHECK: ldff1sh { z0.d }, p0/z, [x0, x1, lsl #1]
270 ; CHECK-NEXT: ret
271   %base = getelementptr i16, i16* %a, i64 %offset
272   %load = call <vscale x 2 x i16> @llvm.aarch64.sve.ldff1.nxv2i16(<vscale x 2 x i1> %pg, i16* %base)
273   %res = sext <vscale x 2 x i16> %load to <vscale x 2 x i64>
274   ret <vscale x 2 x i64> %res
278 ; LDFF1W
281 define <vscale x 4 x i32> @ldff1w(<vscale x 4 x i1> %pg, i32* %a) {
282 ; CHECK-LABEL: ldff1w:
283 ; CHECK: ldff1w { z0.s }, p0/z, [x0]
284 ; CHECK-NEXT: ret
285   %load = call <vscale x 4 x i32> @llvm.aarch64.sve.ldff1.nxv4i32(<vscale x 4 x i1> %pg, i32* %a)
286   ret <vscale x 4 x i32> %load
289 define <vscale x 4 x i32> @ldff1w_reg(<vscale x 4 x i1> %pg, i32* %a, i64 %offset) {
290 ; CHECK-LABEL: ldff1w_reg:
291 ; CHECK: ldff1w { z0.s }, p0/z, [x0, x1, lsl #2]
292 ; CHECK-NEXT: ret
293   %base = getelementptr i32, i32* %a, i64 %offset
294   %load = call <vscale x 4 x i32> @llvm.aarch64.sve.ldff1.nxv4i32(<vscale x 4 x i1> %pg, i32* %base)
295   ret <vscale x 4 x i32> %load
298 define <vscale x 2 x i64> @ldff1w_d(<vscale x 2 x i1> %pg, i32* %a) {
299 ; CHECK-LABEL: ldff1w_d:
300 ; CHECK: ldff1w { z0.d }, p0/z, [x0]
301 ; CHECK-NEXT: ret
302   %load = call <vscale x 2 x i32> @llvm.aarch64.sve.ldff1.nxv2i32(<vscale x 2 x i1> %pg, i32* %a)
303   %res = zext <vscale x 2 x i32> %load to <vscale x 2 x i64>
304   ret <vscale x 2 x i64> %res
307 define <vscale x 2 x i64> @ldff1w_d_reg(<vscale x 2 x i1> %pg, i32* %a, i64 %offset) {
308 ; CHECK-LABEL: ldff1w_d_reg:
309 ; CHECK: ldff1w { z0.d }, p0/z, [x0, x1, lsl #2]
310 ; CHECK-NEXT: ret
311   %base = getelementptr i32, i32* %a, i64 %offset
312   %load = call <vscale x 2 x i32> @llvm.aarch64.sve.ldff1.nxv2i32(<vscale x 2 x i1> %pg, i32* %base)
313   %res = zext <vscale x 2 x i32> %load to <vscale x 2 x i64>
314   ret <vscale x 2 x i64> %res
317 define <vscale x 4 x float> @ldff1w_f32(<vscale x 4 x i1> %pg, float* %a) {
318 ; CHECK-LABEL: ldff1w_f32:
319 ; CHECK: ldff1w { z0.s }, p0/z, [x0]
320 ; CHECK-NEXT: ret
321   %load = call <vscale x 4 x float> @llvm.aarch64.sve.ldff1.nxv4f32(<vscale x 4 x i1> %pg, float* %a)
322   ret <vscale x 4 x float> %load
325 define <vscale x 4 x float> @ldff1w_f32_reg(<vscale x 4 x i1> %pg, float* %a, i64 %offset) {
326 ; CHECK-LABEL: ldff1w_f32_reg:
327 ; CHECK: ldff1w { z0.s }, p0/z, [x0, x1, lsl #2]
328 ; CHECK-NEXT: ret
329   %base = getelementptr float, float* %a, i64 %offset
330   %load = call <vscale x 4 x float> @llvm.aarch64.sve.ldff1.nxv4f32(<vscale x 4 x i1> %pg, float* %base)
331   ret <vscale x 4 x float> %load
334 define <vscale x 2 x float> @ldff1w_2f32(<vscale x 2 x i1> %pg, float* %a) {
335 ; CHECK-LABEL: ldff1w_2f32:
336 ; CHECK: ldff1w { z0.d }, p0/z, [x0]
337 ; CHECK-NEXT: ret
338   %load = call <vscale x 2 x float> @llvm.aarch64.sve.ldff1.nxv2f32(<vscale x 2 x i1> %pg, float* %a)
339   ret <vscale x 2 x float> %load
342 define <vscale x 2 x float> @ldff1w_2f32_reg(<vscale x 2 x i1> %pg, float* %a, i64 %offset) {
343 ; CHECK-LABEL: ldff1w_2f32_reg:
344 ; CHECK: ldff1w { z0.d }, p0/z, [x0, x1, lsl #2]
345 ; CHECK-NEXT: ret
346   %base = getelementptr float, float* %a, i64 %offset
347   %load = call <vscale x 2 x float> @llvm.aarch64.sve.ldff1.nxv2f32(<vscale x 2 x i1> %pg, float* %base)
348   ret <vscale x 2 x float> %load
352 ; LDFF1SW
355 define <vscale x 2 x i64> @ldff1sw_d(<vscale x 2 x i1> %pg, i32* %a) {
356 ; CHECK-LABEL: ldff1sw_d:
357 ; CHECK: ldff1sw { z0.d }, p0/z, [x0]
358 ; CHECK-NEXT: ret
359   %load = call <vscale x 2 x i32> @llvm.aarch64.sve.ldff1.nxv2i32(<vscale x 2 x i1> %pg, i32* %a)
360   %res = sext <vscale x 2 x i32> %load to <vscale x 2 x i64>
361   ret <vscale x 2 x i64> %res
364 define <vscale x 2 x i64> @ldff1sw_d_reg(<vscale x 2 x i1> %pg, i32* %a, i64 %offset) {
365 ; CHECK-LABEL: ldff1sw_d_reg:
366 ; CHECK: ldff1sw { z0.d }, p0/z, [x0, x1, lsl #2]
367 ; CHECK-NEXT: ret
368   %base = getelementptr i32, i32* %a, i64 %offset
369   %load = call <vscale x 2 x i32> @llvm.aarch64.sve.ldff1.nxv2i32(<vscale x 2 x i1> %pg, i32* %base)
370   %res = sext <vscale x 2 x i32> %load to <vscale x 2 x i64>
371   ret <vscale x 2 x i64> %res
375 ; LDFF1D
378 define <vscale x 2 x i64> @ldff1d(<vscale x 2 x i1> %pg, i64* %a) {
379 ; CHECK-LABEL: ldff1d:
380 ; CHECK: ldff1d { z0.d }, p0/z, [x0]
381 ; CHECK-NEXT: ret
382   %load = call <vscale x 2 x i64> @llvm.aarch64.sve.ldff1.nxv2i64(<vscale x 2 x i1> %pg, i64* %a)
383   ret <vscale x 2 x i64> %load
386 define <vscale x 2 x i64> @ldff1d_reg(<vscale x 2 x i1> %pg, i64* %a, i64 %offset) {
387 ; CHECK-LABEL: ldff1d_reg:
388 ; CHECK: ldff1d { z0.d }, p0/z, [x0, x1, lsl #3]
389 ; CHECK-NEXT: ret
390   %base = getelementptr i64, i64* %a, i64 %offset
391   %load = call <vscale x 2 x i64> @llvm.aarch64.sve.ldff1.nxv2i64(<vscale x 2 x i1> %pg, i64* %base)
392   ret <vscale x 2 x i64> %load
396 define <vscale x 2 x double> @ldff1d_f64(<vscale x 2 x i1> %pg, double* %a) {
397 ; CHECK-LABEL: ldff1d_f64:
398 ; CHECK: ldff1d { z0.d }, p0/z, [x0]
399 ; CHECK-NEXT: ret
400   %load = call <vscale x 2 x double> @llvm.aarch64.sve.ldff1.nxv2f64(<vscale x 2 x i1> %pg, double* %a)
401   ret <vscale x 2 x double> %load
404 define <vscale x 2 x double> @ldff1d_f64_reg(<vscale x 2 x i1> %pg, double* %a, i64 %offset) {
405 ; CHECK-LABEL: ldff1d_f64_reg:
406 ; CHECK: ldff1d { z0.d }, p0/z, [x0, x1, lsl #3]
407 ; CHECK-NEXT: ret
408   %base = getelementptr double, double* %a, i64 %offset
409   %load = call <vscale x 2 x double> @llvm.aarch64.sve.ldff1.nxv2f64(<vscale x 2 x i1> %pg, double* %base)
410   ret <vscale x 2 x double> %load
413 declare <vscale x 16 x i8> @llvm.aarch64.sve.ldff1.nxv16i8(<vscale x 16 x i1>, i8*)
415 declare <vscale x 8 x i8> @llvm.aarch64.sve.ldff1.nxv8i8(<vscale x 8 x i1>, i8*)
416 declare <vscale x 8 x i16> @llvm.aarch64.sve.ldff1.nxv8i16(<vscale x 8 x i1>, i16*)
417 declare <vscale x 8 x half> @llvm.aarch64.sve.ldff1.nxv8f16(<vscale x 8 x i1>, half*)
418 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.ldff1.nxv8bf16(<vscale x 8 x i1>, bfloat*)
420 declare <vscale x 4 x i8> @llvm.aarch64.sve.ldff1.nxv4i8(<vscale x 4 x i1>, i8*)
421 declare <vscale x 4 x i16> @llvm.aarch64.sve.ldff1.nxv4i16(<vscale x 4 x i1>, i16*)
422 declare <vscale x 4 x i32> @llvm.aarch64.sve.ldff1.nxv4i32(<vscale x 4 x i1>, i32*)
423 declare <vscale x 2 x float> @llvm.aarch64.sve.ldff1.nxv2f32(<vscale x 2 x i1>, float*)
424 declare <vscale x 4 x float> @llvm.aarch64.sve.ldff1.nxv4f32(<vscale x 4 x i1>, float*)
426 declare <vscale x 2 x i8> @llvm.aarch64.sve.ldff1.nxv2i8(<vscale x 2 x i1>, i8*)
427 declare <vscale x 2 x i16> @llvm.aarch64.sve.ldff1.nxv2i16(<vscale x 2 x i1>, i16*)
428 declare <vscale x 2 x i32> @llvm.aarch64.sve.ldff1.nxv2i32(<vscale x 2 x i1>, i32*)
429 declare <vscale x 2 x i64> @llvm.aarch64.sve.ldff1.nxv2i64(<vscale x 2 x i1>, i64*)
430 declare <vscale x 2 x double> @llvm.aarch64.sve.ldff1.nxv2f64(<vscale x 2 x i1>, double*)
432 ; +bf16 is required for the bfloat version.
433 attributes #0 = { "target-features"="+sve,+bf16" }