1 ; RUN: llc < %s -mtriple=ve -mattr=+vpu | FileCheck %s
3 ;;; Test vector broadcast intrinsic instructions
6 ;;; We test VLD*rrl, VLD*irl, VLD*rrl_v, and VLD*irl_v instructions.
8 ; Function Attrs: nounwind
9 define void @vbrdd_vsl(double %0, ptr %1) {
10 ; CHECK-LABEL: vbrdd_vsl:
12 ; CHECK-NEXT: lea %s2, 256
14 ; CHECK-NEXT: vbrd %v0, %s0
16 ; CHECK-NEXT: vst %v0, 8, %s1
18 ; CHECK-NEXT: b.l.t (, %s10)
19 %3 = tail call fast <256 x double> @llvm.ve.vl.vbrdd.vsl(double %0, i32 256)
20 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
24 ; Function Attrs: nounwind readnone
25 declare <256 x double> @llvm.ve.vl.vbrdd.vsl(double, i32)
27 ; Function Attrs: nounwind
28 define void @vbrdd_vsvl(double %0, ptr %1) {
29 ; CHECK-LABEL: vbrdd_vsvl:
31 ; CHECK-NEXT: lea %s2, 256
33 ; CHECK-NEXT: vld %v0, 8, %s1
34 ; CHECK-NEXT: vbrd %v0, %s0
35 ; CHECK-NEXT: vst %v0, 8, %s1
36 ; CHECK-NEXT: b.l.t (, %s10)
37 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
38 %4 = tail call fast <256 x double> @llvm.ve.vl.vbrdd.vsvl(double %0, <256 x double> %3, i32 256)
39 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
43 ; Function Attrs: nounwind readonly
44 declare <256 x double> @llvm.ve.vl.vld.vssl(i64, ptr, i32)
46 ; Function Attrs: nounwind readnone
47 declare <256 x double> @llvm.ve.vl.vbrdd.vsvl(double, <256 x double>, i32)
49 ; Function Attrs: nounwind writeonly
50 declare void @llvm.ve.vl.vst.vssl(<256 x double>, i64, ptr, i32)
52 ; Function Attrs: nounwind
53 define void @vbrdd_vsmvl(double %0, ptr %1) {
54 ; CHECK-LABEL: vbrdd_vsmvl:
56 ; CHECK-NEXT: lea %s2, 256
58 ; CHECK-NEXT: vld %v0, 8, %s1
59 ; CHECK-NEXT: lea.sl %s3, 1138753536
60 ; CHECK-NEXT: fcmp.d %s4, %s0, %s3
61 ; CHECK-NEXT: fsub.d %s3, %s0, %s3
62 ; CHECK-NEXT: cvt.l.d.rz %s3, %s3
63 ; CHECK-NEXT: xor %s3, %s3, (1)1
64 ; CHECK-NEXT: cvt.l.d.rz %s5, %s0
65 ; CHECK-NEXT: cmov.d.lt %s3, %s5, %s4
66 ; CHECK-NEXT: lvm %vm1, 3, %s3
67 ; CHECK-NEXT: vbrd %v0, %s0, %vm1
68 ; CHECK-NEXT: vst %v0, 8, %s1
69 ; CHECK-NEXT: b.l.t (, %s10)
70 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
71 %4 = fptoui double %0 to i64
72 %5 = tail call <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1> undef, i64 3, i64 %4)
73 %6 = tail call fast <256 x double> @llvm.ve.vl.vbrdd.vsmvl(double %0, <256 x i1> %5, <256 x double> %3, i32 256)
74 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %6, i64 8, ptr %1, i32 256)
78 ; Function Attrs: nounwind readnone
79 declare <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1>, i64, i64)
81 ; Function Attrs: nounwind readnone
82 declare <256 x double> @llvm.ve.vl.vbrdd.vsmvl(double, <256 x i1>, <256 x double>, i32)
84 ; Function Attrs: nounwind
85 define void @vbrdl_vsl(i64 %0, ptr %1) {
86 ; CHECK-LABEL: vbrdl_vsl:
88 ; CHECK-NEXT: lea %s2, 256
90 ; CHECK-NEXT: vbrd %v0, %s0
92 ; CHECK-NEXT: vst %v0, 8, %s1
94 ; CHECK-NEXT: b.l.t (, %s10)
95 %3 = tail call fast <256 x double> @llvm.ve.vl.vbrdl.vsl(i64 %0, i32 256)
96 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
100 ; Function Attrs: nounwind readnone
101 declare <256 x double> @llvm.ve.vl.vbrdl.vsl(i64, i32)
103 ; Function Attrs: nounwind
104 define void @vbrdl_vsvl(i64 %0, ptr %1) {
105 ; CHECK-LABEL: vbrdl_vsvl:
107 ; CHECK-NEXT: lea %s2, 256
108 ; CHECK-NEXT: lvl %s2
109 ; CHECK-NEXT: vld %v0, 8, %s1
110 ; CHECK-NEXT: vbrd %v0, %s0
111 ; CHECK-NEXT: vst %v0, 8, %s1
112 ; CHECK-NEXT: b.l.t (, %s10)
113 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
114 %4 = tail call fast <256 x double> @llvm.ve.vl.vbrdl.vsvl(i64 %0, <256 x double> %3, i32 256)
115 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
119 ; Function Attrs: nounwind readnone
120 declare <256 x double> @llvm.ve.vl.vbrdl.vsvl(i64, <256 x double>, i32)
122 ; Function Attrs: nounwind
123 define void @vbrdl_vsmvl(i64 %0, ptr %1) {
124 ; CHECK-LABEL: vbrdl_vsmvl:
126 ; CHECK-NEXT: lea %s2, 256
127 ; CHECK-NEXT: lvl %s2
128 ; CHECK-NEXT: vld %v0, 8, %s1
129 ; CHECK-NEXT: lvm %vm1, 3, %s0
130 ; CHECK-NEXT: vbrd %v0, %s0, %vm1
131 ; CHECK-NEXT: vst %v0, 8, %s1
132 ; CHECK-NEXT: b.l.t (, %s10)
133 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
134 %4 = tail call <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1> undef, i64 3, i64 %0)
135 %5 = tail call fast <256 x double> @llvm.ve.vl.vbrdl.vsmvl(i64 %0, <256 x i1> %4, <256 x double> %3, i32 256)
136 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %5, i64 8, ptr %1, i32 256)
140 ; Function Attrs: nounwind readnone
141 declare <256 x double> @llvm.ve.vl.vbrdl.vsmvl(i64, <256 x i1>, <256 x double>, i32)
143 ; Function Attrs: nounwind
144 define void @vbrdl_imm_vsl(i64 %0, ptr %1) {
145 ; CHECK-LABEL: vbrdl_imm_vsl:
147 ; CHECK-NEXT: lea %s0, 256
148 ; CHECK-NEXT: lvl %s0
149 ; CHECK-NEXT: vbrd %v0, 31
151 ; CHECK-NEXT: vst %v0, 8, %s1
152 ; CHECK-NEXT: #NO_APP
153 ; CHECK-NEXT: b.l.t (, %s10)
154 %3 = tail call fast <256 x double> @llvm.ve.vl.vbrdl.vsl(i64 31, i32 256)
155 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
159 ; Function Attrs: nounwind
160 define void @vbrdl_imm_vsvl(i64 %0, ptr %1) {
161 ; CHECK-LABEL: vbrdl_imm_vsvl:
163 ; CHECK-NEXT: lea %s0, 256
164 ; CHECK-NEXT: lvl %s0
165 ; CHECK-NEXT: vld %v0, 8, %s1
166 ; CHECK-NEXT: vbrd %v0, 31
167 ; CHECK-NEXT: vst %v0, 8, %s1
168 ; CHECK-NEXT: b.l.t (, %s10)
169 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
170 %4 = tail call fast <256 x double> @llvm.ve.vl.vbrdl.vsvl(i64 31, <256 x double> %3, i32 256)
171 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
175 ; Function Attrs: nounwind
176 define void @vbrdl_imm_vsmvl(i64 %0, ptr %1) {
177 ; CHECK-LABEL: vbrdl_imm_vsmvl:
179 ; CHECK-NEXT: lea %s2, 256
180 ; CHECK-NEXT: lvl %s2
181 ; CHECK-NEXT: vld %v0, 8, %s1
182 ; CHECK-NEXT: lvm %vm1, 3, %s0
183 ; CHECK-NEXT: vbrd %v0, 31, %vm1
184 ; CHECK-NEXT: vst %v0, 8, %s1
185 ; CHECK-NEXT: b.l.t (, %s10)
186 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
187 %4 = tail call <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1> undef, i64 3, i64 %0)
188 %5 = tail call fast <256 x double> @llvm.ve.vl.vbrdl.vsmvl(i64 31, <256 x i1> %4, <256 x double> %3, i32 256)
189 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %5, i64 8, ptr %1, i32 256)
193 ; Function Attrs: nounwind
194 define void @vbrds_vsl(float %0, ptr %1) {
195 ; CHECK-LABEL: vbrds_vsl:
197 ; CHECK-NEXT: lea %s2, 256
198 ; CHECK-NEXT: lvl %s2
199 ; CHECK-NEXT: vbrdu %v0, %s0
201 ; CHECK-NEXT: vst %v0, 8, %s1
202 ; CHECK-NEXT: #NO_APP
203 ; CHECK-NEXT: b.l.t (, %s10)
204 %3 = tail call fast <256 x double> @llvm.ve.vl.vbrds.vsl(float %0, i32 256)
205 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
209 ; Function Attrs: nounwind readnone
210 declare <256 x double> @llvm.ve.vl.vbrds.vsl(float, i32)
212 ; Function Attrs: nounwind
213 define void @vbrds_vsvl(float %0, ptr %1) {
214 ; CHECK-LABEL: vbrds_vsvl:
216 ; CHECK-NEXT: lea %s2, 256
217 ; CHECK-NEXT: lvl %s2
218 ; CHECK-NEXT: vld %v0, 8, %s1
219 ; CHECK-NEXT: vbrdu %v0, %s0
220 ; CHECK-NEXT: vst %v0, 8, %s1
221 ; CHECK-NEXT: b.l.t (, %s10)
222 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
223 %4 = tail call fast <256 x double> @llvm.ve.vl.vbrds.vsvl(float %0, <256 x double> %3, i32 256)
224 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
228 ; Function Attrs: nounwind readnone
229 declare <256 x double> @llvm.ve.vl.vbrds.vsvl(float, <256 x double>, i32)
231 ; Function Attrs: nounwind
232 define void @vbrds_vsmvl(float %0, ptr %1) {
233 ; CHECK-LABEL: vbrds_vsmvl:
235 ; CHECK-NEXT: lea %s2, 256
236 ; CHECK-NEXT: lvl %s2
237 ; CHECK-NEXT: vld %v0, 8, %s1
238 ; CHECK-NEXT: lea.sl %s3, 1593835520
239 ; CHECK-NEXT: fcmp.s %s4, %s0, %s3
240 ; CHECK-NEXT: fsub.s %s3, %s0, %s3
241 ; CHECK-NEXT: cvt.d.s %s3, %s3
242 ; CHECK-NEXT: cvt.l.d.rz %s3, %s3
243 ; CHECK-NEXT: xor %s3, %s3, (1)1
244 ; CHECK-NEXT: cvt.d.s %s5, %s0
245 ; CHECK-NEXT: cvt.l.d.rz %s5, %s5
246 ; CHECK-NEXT: cmov.s.lt %s3, %s5, %s4
247 ; CHECK-NEXT: lvm %vm1, 3, %s3
248 ; CHECK-NEXT: vbrdu %v0, %s0, %vm1
249 ; CHECK-NEXT: vst %v0, 8, %s1
250 ; CHECK-NEXT: b.l.t (, %s10)
251 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
252 %4 = fptoui float %0 to i64
253 %5 = tail call <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1> undef, i64 3, i64 %4)
254 %6 = tail call fast <256 x double> @llvm.ve.vl.vbrds.vsmvl(float %0, <256 x i1> %5, <256 x double> %3, i32 256)
255 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %6, i64 8, ptr %1, i32 256)
259 ; Function Attrs: nounwind readnone
260 declare <256 x double> @llvm.ve.vl.vbrds.vsmvl(float, <256 x i1>, <256 x double>, i32)
262 ; Function Attrs: nounwind
263 define void @vbrdw_vsl(i32 signext %0, ptr %1) {
264 ; CHECK-LABEL: vbrdw_vsl:
266 ; CHECK-NEXT: and %s0, %s0, (32)0
267 ; CHECK-NEXT: lea %s2, 256
268 ; CHECK-NEXT: lvl %s2
269 ; CHECK-NEXT: vbrdl %v0, %s0
271 ; CHECK-NEXT: vst %v0, 8, %s1
272 ; CHECK-NEXT: #NO_APP
273 ; CHECK-NEXT: b.l.t (, %s10)
274 %3 = tail call fast <256 x double> @llvm.ve.vl.vbrdw.vsl(i32 %0, i32 256)
275 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
279 ; Function Attrs: nounwind readnone
280 declare <256 x double> @llvm.ve.vl.vbrdw.vsl(i32, i32)
282 ; Function Attrs: nounwind
283 define void @vbrdw_vsvl(i32 signext %0, ptr %1) {
284 ; CHECK-LABEL: vbrdw_vsvl:
286 ; CHECK-NEXT: lea %s2, 256
287 ; CHECK-NEXT: lvl %s2
288 ; CHECK-NEXT: vld %v0, 8, %s1
289 ; CHECK-NEXT: and %s0, %s0, (32)0
290 ; CHECK-NEXT: vbrdl %v0, %s0
291 ; CHECK-NEXT: vst %v0, 8, %s1
292 ; CHECK-NEXT: b.l.t (, %s10)
293 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
294 %4 = tail call fast <256 x double> @llvm.ve.vl.vbrdw.vsvl(i32 %0, <256 x double> %3, i32 256)
295 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
299 ; Function Attrs: nounwind readnone
300 declare <256 x double> @llvm.ve.vl.vbrdw.vsvl(i32, <256 x double>, i32)
302 ; Function Attrs: nounwind
303 define void @vbrdw_vsmvl(i32 signext %0, ptr %1) {
304 ; CHECK-LABEL: vbrdw_vsmvl:
306 ; CHECK-NEXT: lea %s2, 256
307 ; CHECK-NEXT: lvl %s2
308 ; CHECK-NEXT: vld %v0, 8, %s1
309 ; CHECK-NEXT: and %s3, %s0, (32)0
310 ; CHECK-NEXT: lvm %vm1, 3, %s0
311 ; CHECK-NEXT: vbrdl %v0, %s3, %vm1
312 ; CHECK-NEXT: vst %v0, 8, %s1
313 ; CHECK-NEXT: b.l.t (, %s10)
314 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
315 %4 = sext i32 %0 to i64
316 %5 = tail call <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1> undef, i64 3, i64 %4)
317 %6 = tail call fast <256 x double> @llvm.ve.vl.vbrdw.vsmvl(i32 %0, <256 x i1> %5, <256 x double> %3, i32 256)
318 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %6, i64 8, ptr %1, i32 256)
322 ; Function Attrs: nounwind readnone
323 declare <256 x double> @llvm.ve.vl.vbrdw.vsmvl(i32, <256 x i1>, <256 x double>, i32)
325 ; Function Attrs: nounwind
326 define void @vbrdw_imm_vsl(i32 signext %0, ptr %1) {
327 ; CHECK-LABEL: vbrdw_imm_vsl:
329 ; CHECK-NEXT: lea %s0, 256
330 ; CHECK-NEXT: lvl %s0
331 ; CHECK-NEXT: vbrdl %v0, 31
333 ; CHECK-NEXT: vst %v0, 8, %s1
334 ; CHECK-NEXT: #NO_APP
335 ; CHECK-NEXT: b.l.t (, %s10)
336 %3 = tail call fast <256 x double> @llvm.ve.vl.vbrdw.vsl(i32 31, i32 256)
337 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
341 ; Function Attrs: nounwind
342 define void @vbrdw_imm_vsvl(i32 signext %0, ptr %1) {
343 ; CHECK-LABEL: vbrdw_imm_vsvl:
345 ; CHECK-NEXT: lea %s0, 256
346 ; CHECK-NEXT: lvl %s0
347 ; CHECK-NEXT: vld %v0, 8, %s1
348 ; CHECK-NEXT: vbrdl %v0, 31
349 ; CHECK-NEXT: vst %v0, 8, %s1
350 ; CHECK-NEXT: b.l.t (, %s10)
351 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
352 %4 = tail call fast <256 x double> @llvm.ve.vl.vbrdw.vsvl(i32 31, <256 x double> %3, i32 256)
353 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
357 ; Function Attrs: nounwind
358 define void @vbrdw_imm_vsmvl(i32 signext %0, ptr %1) {
359 ; CHECK-LABEL: vbrdw_imm_vsmvl:
361 ; CHECK-NEXT: lea %s2, 256
362 ; CHECK-NEXT: lvl %s2
363 ; CHECK-NEXT: vld %v0, 8, %s1
364 ; CHECK-NEXT: lvm %vm1, 3, %s0
365 ; CHECK-NEXT: vbrdl %v0, 31, %vm1
366 ; CHECK-NEXT: vst %v0, 8, %s1
367 ; CHECK-NEXT: b.l.t (, %s10)
368 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
369 %4 = sext i32 %0 to i64
370 %5 = tail call <256 x i1> @llvm.ve.vl.lvm.mmss(<256 x i1> undef, i64 3, i64 %4)
371 %6 = tail call fast <256 x double> @llvm.ve.vl.vbrdw.vsmvl(i32 31, <256 x i1> %5, <256 x double> %3, i32 256)
372 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %6, i64 8, ptr %1, i32 256)
376 ; Function Attrs: nounwind
377 define void @pvbrd_vsl(i64 %0, ptr %1) {
378 ; CHECK-LABEL: pvbrd_vsl:
380 ; CHECK-NEXT: lea %s2, 256
381 ; CHECK-NEXT: lvl %s2
382 ; CHECK-NEXT: pvbrd %v0, %s0
384 ; CHECK-NEXT: vst %v0, 8, %s1
385 ; CHECK-NEXT: #NO_APP
386 ; CHECK-NEXT: b.l.t (, %s10)
387 %3 = tail call fast <256 x double> @llvm.ve.vl.pvbrd.vsl(i64 %0, i32 256)
388 tail call void asm sideeffect "vst ${0:v}, 8, $1", "v,r"(<256 x double> %3, ptr %1)
392 ; Function Attrs: nounwind readnone
393 declare <256 x double> @llvm.ve.vl.pvbrd.vsl(i64, i32)
395 ; Function Attrs: nounwind
396 define void @pvbrd_vsvl(i64 %0, ptr %1) {
397 ; CHECK-LABEL: pvbrd_vsvl:
399 ; CHECK-NEXT: lea %s2, 256
400 ; CHECK-NEXT: lvl %s2
401 ; CHECK-NEXT: vld %v0, 8, %s1
402 ; CHECK-NEXT: pvbrd %v0, %s0
403 ; CHECK-NEXT: vst %v0, 8, %s1
404 ; CHECK-NEXT: b.l.t (, %s10)
405 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
406 %4 = tail call fast <256 x double> @llvm.ve.vl.pvbrd.vsvl(i64 %0, <256 x double> %3, i32 256)
407 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %4, i64 8, ptr %1, i32 256)
411 ; Function Attrs: nounwind readnone
412 declare <256 x double> @llvm.ve.vl.pvbrd.vsvl(i64, <256 x double>, i32)
414 ; Function Attrs: nounwind
415 define void @pvbrd_vsMvl(i64 %0, ptr %1) {
416 ; CHECK-LABEL: pvbrd_vsMvl:
418 ; CHECK-NEXT: lea %s2, 256
419 ; CHECK-NEXT: lvl %s2
420 ; CHECK-NEXT: vld %v0, 8, %s1
421 ; CHECK-NEXT: lvm %vm3, 1, %s0
422 ; CHECK-NEXT: lvm %vm2, 2, %s0
423 ; CHECK-NEXT: pvbrd %v0, %s0, %vm2
424 ; CHECK-NEXT: vst %v0, 8, %s1
425 ; CHECK-NEXT: b.l.t (, %s10)
426 %3 = tail call fast <256 x double> @llvm.ve.vl.vld.vssl(i64 8, ptr %1, i32 256)
427 %4 = tail call <512 x i1> @llvm.ve.vl.lvm.MMss(<512 x i1> undef, i64 1, i64 %0)
428 %5 = tail call <512 x i1> @llvm.ve.vl.lvm.MMss(<512 x i1> %4, i64 6, i64 %0)
429 %6 = tail call fast <256 x double> @llvm.ve.vl.pvbrd.vsMvl(i64 %0, <512 x i1> %5, <256 x double> %3, i32 256)
430 tail call void @llvm.ve.vl.vst.vssl(<256 x double> %6, i64 8, ptr %1, i32 256)
434 ; Function Attrs: nounwind readnone
435 declare <512 x i1> @llvm.ve.vl.lvm.MMss(<512 x i1>, i64, i64)
437 ; Function Attrs: nounwind readnone
438 declare <256 x double> @llvm.ve.vl.pvbrd.vsMvl(i64, <512 x i1>, <256 x double>, i32)