xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-llrint.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+v,+f,+d -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV32
4; RUN: llc -mtriple=riscv64 -mattr=+v,+f,+d -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV64
6
7define <1 x i64> @llrint_v1i64_v1f32(<1 x float> %x) {
8; RV32-LABEL: llrint_v1i64_v1f32:
9; RV32:       # %bb.0:
10; RV32-NEXT:    addi sp, sp, -16
11; RV32-NEXT:    .cfi_def_cfa_offset 16
12; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
13; RV32-NEXT:    .cfi_offset ra, -4
14; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
15; RV32-NEXT:    vfmv.f.s fa0, v8
16; RV32-NEXT:    call llrintf
17; RV32-NEXT:    sw a0, 0(sp)
18; RV32-NEXT:    sw a1, 4(sp)
19; RV32-NEXT:    mv a0, sp
20; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
21; RV32-NEXT:    vlse64.v v8, (a0), zero
22; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23; RV32-NEXT:    .cfi_restore ra
24; RV32-NEXT:    addi sp, sp, 16
25; RV32-NEXT:    .cfi_def_cfa_offset 0
26; RV32-NEXT:    ret
27;
28; RV64-LABEL: llrint_v1i64_v1f32:
29; RV64:       # %bb.0:
30; RV64-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
31; RV64-NEXT:    vfmv.f.s fa5, v8
32; RV64-NEXT:    fcvt.l.s a0, fa5
33; RV64-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
34; RV64-NEXT:    vmv.s.x v8, a0
35; RV64-NEXT:    ret
36  %a = call <1 x i64> @llvm.llrint.v1i64.v1f32(<1 x float> %x)
37  ret <1 x i64> %a
38}
39declare <1 x i64> @llvm.llrint.v1i64.v1f32(<1 x float>)
40
41define <2 x i64> @llrint_v2i64_v2f32(<2 x float> %x) {
42; RV32-LABEL: llrint_v2i64_v2f32:
43; RV32:       # %bb.0:
44; RV32-NEXT:    addi sp, sp, -32
45; RV32-NEXT:    .cfi_def_cfa_offset 32
46; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
47; RV32-NEXT:    .cfi_offset ra, -4
48; RV32-NEXT:    csrr a0, vlenb
49; RV32-NEXT:    slli a0, a0, 1
50; RV32-NEXT:    sub sp, sp, a0
51; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 2 * vlenb
52; RV32-NEXT:    addi a0, sp, 16
53; RV32-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
54; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
55; RV32-NEXT:    vfmv.f.s fa0, v8
56; RV32-NEXT:    call llrintf
57; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
58; RV32-NEXT:    vmv.v.x v8, a0
59; RV32-NEXT:    vslide1down.vx v8, v8, a1
60; RV32-NEXT:    csrr a0, vlenb
61; RV32-NEXT:    add a0, sp, a0
62; RV32-NEXT:    addi a0, a0, 16
63; RV32-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
64; RV32-NEXT:    addi a0, sp, 16
65; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
66; RV32-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
67; RV32-NEXT:    vslidedown.vi v8, v8, 1
68; RV32-NEXT:    vfmv.f.s fa0, v8
69; RV32-NEXT:    call llrintf
70; RV32-NEXT:    csrr a2, vlenb
71; RV32-NEXT:    add a2, sp, a2
72; RV32-NEXT:    addi a2, a2, 16
73; RV32-NEXT:    vl1r.v v8, (a2) # Unknown-size Folded Reload
74; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
75; RV32-NEXT:    vslide1down.vx v8, v8, a0
76; RV32-NEXT:    vslide1down.vx v8, v8, a1
77; RV32-NEXT:    csrr a0, vlenb
78; RV32-NEXT:    slli a0, a0, 1
79; RV32-NEXT:    add sp, sp, a0
80; RV32-NEXT:    .cfi_def_cfa sp, 32
81; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
82; RV32-NEXT:    .cfi_restore ra
83; RV32-NEXT:    addi sp, sp, 32
84; RV32-NEXT:    .cfi_def_cfa_offset 0
85; RV32-NEXT:    ret
86;
87; RV64-LABEL: llrint_v2i64_v2f32:
88; RV64:       # %bb.0:
89; RV64-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
90; RV64-NEXT:    vslidedown.vi v9, v8, 1
91; RV64-NEXT:    vfmv.f.s fa5, v8
92; RV64-NEXT:    fcvt.l.s a0, fa5
93; RV64-NEXT:    vfmv.f.s fa5, v9
94; RV64-NEXT:    fcvt.l.s a1, fa5
95; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
96; RV64-NEXT:    vmv.v.x v8, a0
97; RV64-NEXT:    vslide1down.vx v8, v8, a1
98; RV64-NEXT:    ret
99  %a = call <2 x i64> @llvm.llrint.v2i64.v2f32(<2 x float> %x)
100  ret <2 x i64> %a
101}
102declare <2 x i64> @llvm.llrint.v2i64.v2f32(<2 x float>)
103
104define <3 x i64> @llrint_v3i64_v3f32(<3 x float> %x) {
105; RV32-LABEL: llrint_v3i64_v3f32:
106; RV32:       # %bb.0:
107; RV32-NEXT:    addi sp, sp, -32
108; RV32-NEXT:    .cfi_def_cfa_offset 32
109; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
110; RV32-NEXT:    .cfi_offset ra, -4
111; RV32-NEXT:    csrr a0, vlenb
112; RV32-NEXT:    slli a1, a0, 1
113; RV32-NEXT:    add a0, a1, a0
114; RV32-NEXT:    sub sp, sp, a0
115; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x03, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 3 * vlenb
116; RV32-NEXT:    csrr a0, vlenb
117; RV32-NEXT:    slli a0, a0, 1
118; RV32-NEXT:    add a0, sp, a0
119; RV32-NEXT:    addi a0, a0, 16
120; RV32-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
121; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
122; RV32-NEXT:    vfmv.f.s fa0, v8
123; RV32-NEXT:    call llrintf
124; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
125; RV32-NEXT:    vmv.v.x v8, a0
126; RV32-NEXT:    vslide1down.vx v8, v8, a1
127; RV32-NEXT:    addi a0, sp, 16
128; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
129; RV32-NEXT:    csrr a0, vlenb
130; RV32-NEXT:    slli a0, a0, 1
131; RV32-NEXT:    add a0, sp, a0
132; RV32-NEXT:    addi a0, a0, 16
133; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
134; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
135; RV32-NEXT:    vslidedown.vi v8, v8, 1
136; RV32-NEXT:    vfmv.f.s fa0, v8
137; RV32-NEXT:    call llrintf
138; RV32-NEXT:    addi a2, sp, 16
139; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
140; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
141; RV32-NEXT:    vslide1down.vx v8, v8, a0
142; RV32-NEXT:    vslide1down.vx v8, v8, a1
143; RV32-NEXT:    addi a0, sp, 16
144; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
145; RV32-NEXT:    csrr a0, vlenb
146; RV32-NEXT:    slli a0, a0, 1
147; RV32-NEXT:    add a0, sp, a0
148; RV32-NEXT:    addi a0, a0, 16
149; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
150; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
151; RV32-NEXT:    vslidedown.vi v8, v8, 2
152; RV32-NEXT:    vfmv.f.s fa0, v8
153; RV32-NEXT:    call llrintf
154; RV32-NEXT:    addi a2, sp, 16
155; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
156; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
157; RV32-NEXT:    vslide1down.vx v8, v8, a0
158; RV32-NEXT:    vslide1down.vx v8, v8, a1
159; RV32-NEXT:    addi a0, sp, 16
160; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
161; RV32-NEXT:    csrr a0, vlenb
162; RV32-NEXT:    slli a0, a0, 1
163; RV32-NEXT:    add a0, sp, a0
164; RV32-NEXT:    addi a0, a0, 16
165; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
166; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
167; RV32-NEXT:    vslidedown.vi v8, v8, 3
168; RV32-NEXT:    vfmv.f.s fa0, v8
169; RV32-NEXT:    call llrintf
170; RV32-NEXT:    addi a2, sp, 16
171; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
172; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
173; RV32-NEXT:    vslide1down.vx v8, v8, a0
174; RV32-NEXT:    vslide1down.vx v8, v8, a1
175; RV32-NEXT:    csrr a0, vlenb
176; RV32-NEXT:    slli a1, a0, 1
177; RV32-NEXT:    add a0, a1, a0
178; RV32-NEXT:    add sp, sp, a0
179; RV32-NEXT:    .cfi_def_cfa sp, 32
180; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
181; RV32-NEXT:    .cfi_restore ra
182; RV32-NEXT:    addi sp, sp, 32
183; RV32-NEXT:    .cfi_def_cfa_offset 0
184; RV32-NEXT:    ret
185;
186; RV64-LABEL: llrint_v3i64_v3f32:
187; RV64:       # %bb.0:
188; RV64-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
189; RV64-NEXT:    vslidedown.vi v9, v8, 1
190; RV64-NEXT:    vfmv.f.s fa5, v8
191; RV64-NEXT:    vslidedown.vi v10, v8, 2
192; RV64-NEXT:    vslidedown.vi v8, v8, 3
193; RV64-NEXT:    fcvt.l.s a0, fa5
194; RV64-NEXT:    vfmv.f.s fa5, v9
195; RV64-NEXT:    fcvt.l.s a1, fa5
196; RV64-NEXT:    vfmv.f.s fa5, v10
197; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
198; RV64-NEXT:    vmv.v.x v10, a0
199; RV64-NEXT:    fcvt.l.s a0, fa5
200; RV64-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
201; RV64-NEXT:    vfmv.f.s fa5, v8
202; RV64-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
203; RV64-NEXT:    vslide1down.vx v8, v10, a1
204; RV64-NEXT:    vslide1down.vx v8, v8, a0
205; RV64-NEXT:    fcvt.l.s a0, fa5
206; RV64-NEXT:    vslide1down.vx v8, v8, a0
207; RV64-NEXT:    ret
208  %a = call <3 x i64> @llvm.llrint.v3i64.v3f32(<3 x float> %x)
209  ret <3 x i64> %a
210}
211declare <3 x i64> @llvm.llrint.v3i64.v3f32(<3 x float>)
212
213define <4 x i64> @llrint_v4i64_v4f32(<4 x float> %x) {
214; RV32-LABEL: llrint_v4i64_v4f32:
215; RV32:       # %bb.0:
216; RV32-NEXT:    addi sp, sp, -32
217; RV32-NEXT:    .cfi_def_cfa_offset 32
218; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
219; RV32-NEXT:    .cfi_offset ra, -4
220; RV32-NEXT:    csrr a0, vlenb
221; RV32-NEXT:    slli a1, a0, 1
222; RV32-NEXT:    add a0, a1, a0
223; RV32-NEXT:    sub sp, sp, a0
224; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x03, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 3 * vlenb
225; RV32-NEXT:    csrr a0, vlenb
226; RV32-NEXT:    slli a0, a0, 1
227; RV32-NEXT:    add a0, sp, a0
228; RV32-NEXT:    addi a0, a0, 16
229; RV32-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
230; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
231; RV32-NEXT:    vfmv.f.s fa0, v8
232; RV32-NEXT:    call llrintf
233; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
234; RV32-NEXT:    vmv.v.x v8, a0
235; RV32-NEXT:    vslide1down.vx v8, v8, a1
236; RV32-NEXT:    addi a0, sp, 16
237; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
238; RV32-NEXT:    csrr a0, vlenb
239; RV32-NEXT:    slli a0, a0, 1
240; RV32-NEXT:    add a0, sp, a0
241; RV32-NEXT:    addi a0, a0, 16
242; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
243; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
244; RV32-NEXT:    vslidedown.vi v8, v8, 1
245; RV32-NEXT:    vfmv.f.s fa0, v8
246; RV32-NEXT:    call llrintf
247; RV32-NEXT:    addi a2, sp, 16
248; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
249; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
250; RV32-NEXT:    vslide1down.vx v8, v8, a0
251; RV32-NEXT:    vslide1down.vx v8, v8, a1
252; RV32-NEXT:    addi a0, sp, 16
253; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
254; RV32-NEXT:    csrr a0, vlenb
255; RV32-NEXT:    slli a0, a0, 1
256; RV32-NEXT:    add a0, sp, a0
257; RV32-NEXT:    addi a0, a0, 16
258; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
259; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
260; RV32-NEXT:    vslidedown.vi v8, v8, 2
261; RV32-NEXT:    vfmv.f.s fa0, v8
262; RV32-NEXT:    call llrintf
263; RV32-NEXT:    addi a2, sp, 16
264; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
265; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
266; RV32-NEXT:    vslide1down.vx v8, v8, a0
267; RV32-NEXT:    vslide1down.vx v8, v8, a1
268; RV32-NEXT:    addi a0, sp, 16
269; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
270; RV32-NEXT:    csrr a0, vlenb
271; RV32-NEXT:    slli a0, a0, 1
272; RV32-NEXT:    add a0, sp, a0
273; RV32-NEXT:    addi a0, a0, 16
274; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
275; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
276; RV32-NEXT:    vslidedown.vi v8, v8, 3
277; RV32-NEXT:    vfmv.f.s fa0, v8
278; RV32-NEXT:    call llrintf
279; RV32-NEXT:    addi a2, sp, 16
280; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
281; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
282; RV32-NEXT:    vslide1down.vx v8, v8, a0
283; RV32-NEXT:    vslide1down.vx v8, v8, a1
284; RV32-NEXT:    csrr a0, vlenb
285; RV32-NEXT:    slli a1, a0, 1
286; RV32-NEXT:    add a0, a1, a0
287; RV32-NEXT:    add sp, sp, a0
288; RV32-NEXT:    .cfi_def_cfa sp, 32
289; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
290; RV32-NEXT:    .cfi_restore ra
291; RV32-NEXT:    addi sp, sp, 32
292; RV32-NEXT:    .cfi_def_cfa_offset 0
293; RV32-NEXT:    ret
294;
295; RV64-LABEL: llrint_v4i64_v4f32:
296; RV64:       # %bb.0:
297; RV64-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
298; RV64-NEXT:    vslidedown.vi v9, v8, 1
299; RV64-NEXT:    vfmv.f.s fa5, v8
300; RV64-NEXT:    vslidedown.vi v10, v8, 2
301; RV64-NEXT:    vslidedown.vi v8, v8, 3
302; RV64-NEXT:    fcvt.l.s a0, fa5
303; RV64-NEXT:    vfmv.f.s fa5, v9
304; RV64-NEXT:    fcvt.l.s a1, fa5
305; RV64-NEXT:    vfmv.f.s fa5, v10
306; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
307; RV64-NEXT:    vmv.v.x v10, a0
308; RV64-NEXT:    fcvt.l.s a0, fa5
309; RV64-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
310; RV64-NEXT:    vfmv.f.s fa5, v8
311; RV64-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
312; RV64-NEXT:    vslide1down.vx v8, v10, a1
313; RV64-NEXT:    vslide1down.vx v8, v8, a0
314; RV64-NEXT:    fcvt.l.s a0, fa5
315; RV64-NEXT:    vslide1down.vx v8, v8, a0
316; RV64-NEXT:    ret
317  %a = call <4 x i64> @llvm.llrint.v4i64.v4f32(<4 x float> %x)
318  ret <4 x i64> %a
319}
320declare <4 x i64> @llvm.llrint.v4i64.v4f32(<4 x float>)
321
322define <8 x i64> @llrint_v8i64_v8f32(<8 x float> %x) {
323; RV32-LABEL: llrint_v8i64_v8f32:
324; RV32:       # %bb.0:
325; RV32-NEXT:    addi sp, sp, -208
326; RV32-NEXT:    .cfi_def_cfa_offset 208
327; RV32-NEXT:    sw ra, 204(sp) # 4-byte Folded Spill
328; RV32-NEXT:    sw s0, 200(sp) # 4-byte Folded Spill
329; RV32-NEXT:    .cfi_offset ra, -4
330; RV32-NEXT:    .cfi_offset s0, -8
331; RV32-NEXT:    addi s0, sp, 208
332; RV32-NEXT:    .cfi_def_cfa s0, 0
333; RV32-NEXT:    csrr a0, vlenb
334; RV32-NEXT:    slli a0, a0, 1
335; RV32-NEXT:    sub sp, sp, a0
336; RV32-NEXT:    andi sp, sp, -64
337; RV32-NEXT:    addi a0, sp, 192
338; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
339; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
340; RV32-NEXT:    vfmv.f.s fa0, v8
341; RV32-NEXT:    call llrintf
342; RV32-NEXT:    sw a0, 64(sp)
343; RV32-NEXT:    sw a1, 68(sp)
344; RV32-NEXT:    addi a0, sp, 192
345; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
346; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
347; RV32-NEXT:    vslidedown.vi v8, v8, 7
348; RV32-NEXT:    vfmv.f.s fa0, v8
349; RV32-NEXT:    call llrintf
350; RV32-NEXT:    sw a0, 120(sp)
351; RV32-NEXT:    sw a1, 124(sp)
352; RV32-NEXT:    addi a0, sp, 192
353; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
354; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
355; RV32-NEXT:    vslidedown.vi v8, v8, 6
356; RV32-NEXT:    vfmv.f.s fa0, v8
357; RV32-NEXT:    call llrintf
358; RV32-NEXT:    sw a0, 112(sp)
359; RV32-NEXT:    sw a1, 116(sp)
360; RV32-NEXT:    addi a0, sp, 192
361; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
362; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
363; RV32-NEXT:    vslidedown.vi v8, v8, 5
364; RV32-NEXT:    vfmv.f.s fa0, v8
365; RV32-NEXT:    call llrintf
366; RV32-NEXT:    sw a0, 104(sp)
367; RV32-NEXT:    sw a1, 108(sp)
368; RV32-NEXT:    addi a0, sp, 192
369; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
370; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
371; RV32-NEXT:    vslidedown.vi v8, v8, 4
372; RV32-NEXT:    vfmv.f.s fa0, v8
373; RV32-NEXT:    call llrintf
374; RV32-NEXT:    sw a0, 96(sp)
375; RV32-NEXT:    sw a1, 100(sp)
376; RV32-NEXT:    addi a0, sp, 192
377; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
378; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
379; RV32-NEXT:    vslidedown.vi v8, v8, 3
380; RV32-NEXT:    vfmv.f.s fa0, v8
381; RV32-NEXT:    call llrintf
382; RV32-NEXT:    sw a0, 88(sp)
383; RV32-NEXT:    sw a1, 92(sp)
384; RV32-NEXT:    addi a0, sp, 192
385; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
386; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
387; RV32-NEXT:    vslidedown.vi v8, v8, 2
388; RV32-NEXT:    vfmv.f.s fa0, v8
389; RV32-NEXT:    call llrintf
390; RV32-NEXT:    sw a0, 80(sp)
391; RV32-NEXT:    sw a1, 84(sp)
392; RV32-NEXT:    addi a0, sp, 192
393; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
394; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
395; RV32-NEXT:    vslidedown.vi v8, v8, 1
396; RV32-NEXT:    vfmv.f.s fa0, v8
397; RV32-NEXT:    call llrintf
398; RV32-NEXT:    sw a0, 72(sp)
399; RV32-NEXT:    sw a1, 76(sp)
400; RV32-NEXT:    addi a0, sp, 64
401; RV32-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
402; RV32-NEXT:    vle32.v v8, (a0)
403; RV32-NEXT:    addi sp, s0, -208
404; RV32-NEXT:    .cfi_def_cfa sp, 208
405; RV32-NEXT:    lw ra, 204(sp) # 4-byte Folded Reload
406; RV32-NEXT:    lw s0, 200(sp) # 4-byte Folded Reload
407; RV32-NEXT:    .cfi_restore ra
408; RV32-NEXT:    .cfi_restore s0
409; RV32-NEXT:    addi sp, sp, 208
410; RV32-NEXT:    .cfi_def_cfa_offset 0
411; RV32-NEXT:    ret
412;
413; RV64-LABEL: llrint_v8i64_v8f32:
414; RV64:       # %bb.0:
415; RV64-NEXT:    addi sp, sp, -128
416; RV64-NEXT:    .cfi_def_cfa_offset 128
417; RV64-NEXT:    sd ra, 120(sp) # 8-byte Folded Spill
418; RV64-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
419; RV64-NEXT:    .cfi_offset ra, -8
420; RV64-NEXT:    .cfi_offset s0, -16
421; RV64-NEXT:    addi s0, sp, 128
422; RV64-NEXT:    .cfi_def_cfa s0, 0
423; RV64-NEXT:    andi sp, sp, -64
424; RV64-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
425; RV64-NEXT:    vfmv.f.s fa5, v8
426; RV64-NEXT:    vslidedown.vi v10, v8, 7
427; RV64-NEXT:    fcvt.l.s a0, fa5
428; RV64-NEXT:    vfmv.f.s fa5, v10
429; RV64-NEXT:    vslidedown.vi v10, v8, 6
430; RV64-NEXT:    fcvt.l.s a1, fa5
431; RV64-NEXT:    vfmv.f.s fa5, v10
432; RV64-NEXT:    vslidedown.vi v10, v8, 5
433; RV64-NEXT:    fcvt.l.s a2, fa5
434; RV64-NEXT:    vfmv.f.s fa5, v10
435; RV64-NEXT:    vslidedown.vi v10, v8, 4
436; RV64-NEXT:    fcvt.l.s a3, fa5
437; RV64-NEXT:    vfmv.f.s fa5, v10
438; RV64-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
439; RV64-NEXT:    vslidedown.vi v9, v8, 3
440; RV64-NEXT:    vslidedown.vi v10, v8, 2
441; RV64-NEXT:    vslidedown.vi v8, v8, 1
442; RV64-NEXT:    fcvt.l.s a4, fa5
443; RV64-NEXT:    vfmv.f.s fa5, v9
444; RV64-NEXT:    fcvt.l.s a5, fa5
445; RV64-NEXT:    vfmv.f.s fa5, v10
446; RV64-NEXT:    fcvt.l.s a6, fa5
447; RV64-NEXT:    vfmv.f.s fa5, v8
448; RV64-NEXT:    sd a4, 32(sp)
449; RV64-NEXT:    sd a3, 40(sp)
450; RV64-NEXT:    sd a2, 48(sp)
451; RV64-NEXT:    sd a1, 56(sp)
452; RV64-NEXT:    fcvt.l.s a1, fa5
453; RV64-NEXT:    sd a0, 0(sp)
454; RV64-NEXT:    sd a1, 8(sp)
455; RV64-NEXT:    sd a6, 16(sp)
456; RV64-NEXT:    sd a5, 24(sp)
457; RV64-NEXT:    mv a0, sp
458; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
459; RV64-NEXT:    vle64.v v8, (a0)
460; RV64-NEXT:    addi sp, s0, -128
461; RV64-NEXT:    .cfi_def_cfa sp, 128
462; RV64-NEXT:    ld ra, 120(sp) # 8-byte Folded Reload
463; RV64-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
464; RV64-NEXT:    .cfi_restore ra
465; RV64-NEXT:    .cfi_restore s0
466; RV64-NEXT:    addi sp, sp, 128
467; RV64-NEXT:    .cfi_def_cfa_offset 0
468; RV64-NEXT:    ret
469  %a = call <8 x i64> @llvm.llrint.v8i64.v8f32(<8 x float> %x)
470  ret <8 x i64> %a
471}
472declare <8 x i64> @llvm.llrint.v8i64.v8f32(<8 x float>)
473
474define <16 x i64> @llrint_v16i64_v16f32(<16 x float> %x) {
475; RV32-LABEL: llrint_v16i64_v16f32:
476; RV32:       # %bb.0:
477; RV32-NEXT:    addi sp, sp, -400
478; RV32-NEXT:    .cfi_def_cfa_offset 400
479; RV32-NEXT:    sw ra, 396(sp) # 4-byte Folded Spill
480; RV32-NEXT:    sw s0, 392(sp) # 4-byte Folded Spill
481; RV32-NEXT:    .cfi_offset ra, -4
482; RV32-NEXT:    .cfi_offset s0, -8
483; RV32-NEXT:    addi s0, sp, 400
484; RV32-NEXT:    .cfi_def_cfa s0, 0
485; RV32-NEXT:    csrr a0, vlenb
486; RV32-NEXT:    slli a0, a0, 2
487; RV32-NEXT:    sub sp, sp, a0
488; RV32-NEXT:    andi sp, sp, -128
489; RV32-NEXT:    addi a0, sp, 384
490; RV32-NEXT:    vs4r.v v8, (a0) # Unknown-size Folded Spill
491; RV32-NEXT:    addi a0, sp, 64
492; RV32-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
493; RV32-NEXT:    vse32.v v8, (a0)
494; RV32-NEXT:    flw fa0, 124(sp)
495; RV32-NEXT:    call llrintf
496; RV32-NEXT:    sw a0, 248(sp)
497; RV32-NEXT:    sw a1, 252(sp)
498; RV32-NEXT:    flw fa0, 120(sp)
499; RV32-NEXT:    call llrintf
500; RV32-NEXT:    sw a0, 240(sp)
501; RV32-NEXT:    sw a1, 244(sp)
502; RV32-NEXT:    flw fa0, 116(sp)
503; RV32-NEXT:    call llrintf
504; RV32-NEXT:    sw a0, 232(sp)
505; RV32-NEXT:    sw a1, 236(sp)
506; RV32-NEXT:    flw fa0, 112(sp)
507; RV32-NEXT:    call llrintf
508; RV32-NEXT:    sw a0, 224(sp)
509; RV32-NEXT:    sw a1, 228(sp)
510; RV32-NEXT:    flw fa0, 108(sp)
511; RV32-NEXT:    call llrintf
512; RV32-NEXT:    sw a0, 216(sp)
513; RV32-NEXT:    sw a1, 220(sp)
514; RV32-NEXT:    flw fa0, 104(sp)
515; RV32-NEXT:    call llrintf
516; RV32-NEXT:    sw a0, 208(sp)
517; RV32-NEXT:    sw a1, 212(sp)
518; RV32-NEXT:    flw fa0, 100(sp)
519; RV32-NEXT:    call llrintf
520; RV32-NEXT:    sw a0, 200(sp)
521; RV32-NEXT:    sw a1, 204(sp)
522; RV32-NEXT:    flw fa0, 96(sp)
523; RV32-NEXT:    call llrintf
524; RV32-NEXT:    sw a0, 192(sp)
525; RV32-NEXT:    sw a1, 196(sp)
526; RV32-NEXT:    addi a0, sp, 384
527; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
528; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
529; RV32-NEXT:    vfmv.f.s fa0, v8
530; RV32-NEXT:    call llrintf
531; RV32-NEXT:    sw a0, 128(sp)
532; RV32-NEXT:    sw a1, 132(sp)
533; RV32-NEXT:    addi a0, sp, 384
534; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
535; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
536; RV32-NEXT:    vslidedown.vi v8, v8, 3
537; RV32-NEXT:    vfmv.f.s fa0, v8
538; RV32-NEXT:    call llrintf
539; RV32-NEXT:    sw a0, 152(sp)
540; RV32-NEXT:    sw a1, 156(sp)
541; RV32-NEXT:    addi a0, sp, 384
542; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
543; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
544; RV32-NEXT:    vslidedown.vi v8, v8, 2
545; RV32-NEXT:    vfmv.f.s fa0, v8
546; RV32-NEXT:    call llrintf
547; RV32-NEXT:    sw a0, 144(sp)
548; RV32-NEXT:    sw a1, 148(sp)
549; RV32-NEXT:    addi a0, sp, 384
550; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
551; RV32-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
552; RV32-NEXT:    vslidedown.vi v8, v8, 1
553; RV32-NEXT:    vfmv.f.s fa0, v8
554; RV32-NEXT:    call llrintf
555; RV32-NEXT:    sw a0, 136(sp)
556; RV32-NEXT:    sw a1, 140(sp)
557; RV32-NEXT:    addi a0, sp, 384
558; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
559; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
560; RV32-NEXT:    vslidedown.vi v8, v8, 7
561; RV32-NEXT:    vfmv.f.s fa0, v8
562; RV32-NEXT:    call llrintf
563; RV32-NEXT:    sw a0, 184(sp)
564; RV32-NEXT:    sw a1, 188(sp)
565; RV32-NEXT:    addi a0, sp, 384
566; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
567; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
568; RV32-NEXT:    vslidedown.vi v8, v8, 6
569; RV32-NEXT:    vfmv.f.s fa0, v8
570; RV32-NEXT:    call llrintf
571; RV32-NEXT:    sw a0, 176(sp)
572; RV32-NEXT:    sw a1, 180(sp)
573; RV32-NEXT:    addi a0, sp, 384
574; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
575; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
576; RV32-NEXT:    vslidedown.vi v8, v8, 5
577; RV32-NEXT:    vfmv.f.s fa0, v8
578; RV32-NEXT:    call llrintf
579; RV32-NEXT:    sw a0, 168(sp)
580; RV32-NEXT:    sw a1, 172(sp)
581; RV32-NEXT:    addi a0, sp, 384
582; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
583; RV32-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
584; RV32-NEXT:    vslidedown.vi v8, v8, 4
585; RV32-NEXT:    vfmv.f.s fa0, v8
586; RV32-NEXT:    call llrintf
587; RV32-NEXT:    sw a0, 160(sp)
588; RV32-NEXT:    sw a1, 164(sp)
589; RV32-NEXT:    li a0, 32
590; RV32-NEXT:    addi a1, sp, 128
591; RV32-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
592; RV32-NEXT:    vle32.v v8, (a1)
593; RV32-NEXT:    addi sp, s0, -400
594; RV32-NEXT:    .cfi_def_cfa sp, 400
595; RV32-NEXT:    lw ra, 396(sp) # 4-byte Folded Reload
596; RV32-NEXT:    lw s0, 392(sp) # 4-byte Folded Reload
597; RV32-NEXT:    .cfi_restore ra
598; RV32-NEXT:    .cfi_restore s0
599; RV32-NEXT:    addi sp, sp, 400
600; RV32-NEXT:    .cfi_def_cfa_offset 0
601; RV32-NEXT:    ret
602;
603; RV64-LABEL: llrint_v16i64_v16f32:
604; RV64:       # %bb.0:
605; RV64-NEXT:    addi sp, sp, -384
606; RV64-NEXT:    .cfi_def_cfa_offset 384
607; RV64-NEXT:    sd ra, 376(sp) # 8-byte Folded Spill
608; RV64-NEXT:    sd s0, 368(sp) # 8-byte Folded Spill
609; RV64-NEXT:    .cfi_offset ra, -8
610; RV64-NEXT:    .cfi_offset s0, -16
611; RV64-NEXT:    addi s0, sp, 384
612; RV64-NEXT:    .cfi_def_cfa s0, 0
613; RV64-NEXT:    andi sp, sp, -128
614; RV64-NEXT:    addi a0, sp, 64
615; RV64-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
616; RV64-NEXT:    vse32.v v8, (a0)
617; RV64-NEXT:    flw fa5, 124(sp)
618; RV64-NEXT:    vfmv.f.s fa4, v8
619; RV64-NEXT:    vsetivli zero, 1, e32, m1, ta, ma
620; RV64-NEXT:    vslidedown.vi v10, v8, 3
621; RV64-NEXT:    vslidedown.vi v11, v8, 2
622; RV64-NEXT:    fcvt.l.s a0, fa5
623; RV64-NEXT:    sd a0, 248(sp)
624; RV64-NEXT:    flw fa5, 120(sp)
625; RV64-NEXT:    vslidedown.vi v12, v8, 1
626; RV64-NEXT:    fcvt.l.s a0, fa4
627; RV64-NEXT:    vfmv.f.s fa4, v10
628; RV64-NEXT:    fcvt.l.s a1, fa5
629; RV64-NEXT:    sd a1, 240(sp)
630; RV64-NEXT:    flw fa5, 116(sp)
631; RV64-NEXT:    vsetivli zero, 1, e32, m2, ta, ma
632; RV64-NEXT:    vslidedown.vi v14, v8, 7
633; RV64-NEXT:    fcvt.l.s a1, fa4
634; RV64-NEXT:    vfmv.f.s fa4, v11
635; RV64-NEXT:    fcvt.l.s a2, fa5
636; RV64-NEXT:    sd a2, 232(sp)
637; RV64-NEXT:    flw fa5, 112(sp)
638; RV64-NEXT:    fcvt.l.s a2, fa4
639; RV64-NEXT:    vfmv.f.s fa4, v12
640; RV64-NEXT:    vslidedown.vi v10, v8, 6
641; RV64-NEXT:    fcvt.l.s a3, fa5
642; RV64-NEXT:    sd a3, 224(sp)
643; RV64-NEXT:    flw fa5, 108(sp)
644; RV64-NEXT:    fcvt.l.s a3, fa4
645; RV64-NEXT:    vfmv.f.s fa4, v14
646; RV64-NEXT:    vslidedown.vi v12, v8, 5
647; RV64-NEXT:    fcvt.l.s a4, fa5
648; RV64-NEXT:    sd a4, 216(sp)
649; RV64-NEXT:    flw fa5, 104(sp)
650; RV64-NEXT:    fcvt.l.s a4, fa4
651; RV64-NEXT:    vfmv.f.s fa4, v10
652; RV64-NEXT:    fcvt.l.s a5, fa4
653; RV64-NEXT:    fcvt.l.s a6, fa5
654; RV64-NEXT:    sd a6, 208(sp)
655; RV64-NEXT:    flw fa5, 100(sp)
656; RV64-NEXT:    vfmv.f.s fa4, v12
657; RV64-NEXT:    fcvt.l.s a6, fa4
658; RV64-NEXT:    vslidedown.vi v8, v8, 4
659; RV64-NEXT:    fcvt.l.s a7, fa5
660; RV64-NEXT:    vfmv.f.s fa5, v8
661; RV64-NEXT:    sd a7, 200(sp)
662; RV64-NEXT:    fcvt.l.s a7, fa5
663; RV64-NEXT:    flw fa5, 96(sp)
664; RV64-NEXT:    sd a0, 128(sp)
665; RV64-NEXT:    sd a3, 136(sp)
666; RV64-NEXT:    sd a2, 144(sp)
667; RV64-NEXT:    sd a1, 152(sp)
668; RV64-NEXT:    sd a7, 160(sp)
669; RV64-NEXT:    sd a6, 168(sp)
670; RV64-NEXT:    sd a5, 176(sp)
671; RV64-NEXT:    sd a4, 184(sp)
672; RV64-NEXT:    fcvt.l.s a0, fa5
673; RV64-NEXT:    sd a0, 192(sp)
674; RV64-NEXT:    addi a0, sp, 128
675; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
676; RV64-NEXT:    vle64.v v8, (a0)
677; RV64-NEXT:    addi sp, s0, -384
678; RV64-NEXT:    .cfi_def_cfa sp, 384
679; RV64-NEXT:    ld ra, 376(sp) # 8-byte Folded Reload
680; RV64-NEXT:    ld s0, 368(sp) # 8-byte Folded Reload
681; RV64-NEXT:    .cfi_restore ra
682; RV64-NEXT:    .cfi_restore s0
683; RV64-NEXT:    addi sp, sp, 384
684; RV64-NEXT:    .cfi_def_cfa_offset 0
685; RV64-NEXT:    ret
686  %a = call <16 x i64> @llvm.llrint.v16i64.v16f32(<16 x float> %x)
687  ret <16 x i64> %a
688}
689declare <16 x i64> @llvm.llrint.v16i64.v16f32(<16 x float>)
690
691define <1 x i64> @llrint_v1i64_v1f64(<1 x double> %x) {
692; RV32-LABEL: llrint_v1i64_v1f64:
693; RV32:       # %bb.0:
694; RV32-NEXT:    addi sp, sp, -16
695; RV32-NEXT:    .cfi_def_cfa_offset 16
696; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
697; RV32-NEXT:    .cfi_offset ra, -4
698; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
699; RV32-NEXT:    vfmv.f.s fa0, v8
700; RV32-NEXT:    call llrint
701; RV32-NEXT:    sw a0, 0(sp)
702; RV32-NEXT:    sw a1, 4(sp)
703; RV32-NEXT:    mv a0, sp
704; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
705; RV32-NEXT:    vlse64.v v8, (a0), zero
706; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
707; RV32-NEXT:    .cfi_restore ra
708; RV32-NEXT:    addi sp, sp, 16
709; RV32-NEXT:    .cfi_def_cfa_offset 0
710; RV32-NEXT:    ret
711;
712; RV64-LABEL: llrint_v1i64_v1f64:
713; RV64:       # %bb.0:
714; RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
715; RV64-NEXT:    vfmv.f.s fa5, v8
716; RV64-NEXT:    fcvt.l.d a0, fa5
717; RV64-NEXT:    vmv.s.x v8, a0
718; RV64-NEXT:    ret
719  %a = call <1 x i64> @llvm.llrint.v1i64.v1f64(<1 x double> %x)
720  ret <1 x i64> %a
721}
722declare <1 x i64> @llvm.llrint.v1i64.v1f64(<1 x double>)
723
724define <2 x i64> @llrint_v2i64_v2f64(<2 x double> %x) {
725; RV32-LABEL: llrint_v2i64_v2f64:
726; RV32:       # %bb.0:
727; RV32-NEXT:    addi sp, sp, -32
728; RV32-NEXT:    .cfi_def_cfa_offset 32
729; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
730; RV32-NEXT:    .cfi_offset ra, -4
731; RV32-NEXT:    csrr a0, vlenb
732; RV32-NEXT:    slli a0, a0, 1
733; RV32-NEXT:    sub sp, sp, a0
734; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 2 * vlenb
735; RV32-NEXT:    addi a0, sp, 16
736; RV32-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
737; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
738; RV32-NEXT:    vfmv.f.s fa0, v8
739; RV32-NEXT:    call llrint
740; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
741; RV32-NEXT:    vmv.v.x v8, a0
742; RV32-NEXT:    vslide1down.vx v8, v8, a1
743; RV32-NEXT:    csrr a0, vlenb
744; RV32-NEXT:    add a0, sp, a0
745; RV32-NEXT:    addi a0, a0, 16
746; RV32-NEXT:    vs1r.v v8, (a0) # Unknown-size Folded Spill
747; RV32-NEXT:    addi a0, sp, 16
748; RV32-NEXT:    vl1r.v v8, (a0) # Unknown-size Folded Reload
749; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
750; RV32-NEXT:    vslidedown.vi v8, v8, 1
751; RV32-NEXT:    vfmv.f.s fa0, v8
752; RV32-NEXT:    call llrint
753; RV32-NEXT:    csrr a2, vlenb
754; RV32-NEXT:    add a2, sp, a2
755; RV32-NEXT:    addi a2, a2, 16
756; RV32-NEXT:    vl1r.v v8, (a2) # Unknown-size Folded Reload
757; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
758; RV32-NEXT:    vslide1down.vx v8, v8, a0
759; RV32-NEXT:    vslide1down.vx v8, v8, a1
760; RV32-NEXT:    csrr a0, vlenb
761; RV32-NEXT:    slli a0, a0, 1
762; RV32-NEXT:    add sp, sp, a0
763; RV32-NEXT:    .cfi_def_cfa sp, 32
764; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
765; RV32-NEXT:    .cfi_restore ra
766; RV32-NEXT:    addi sp, sp, 32
767; RV32-NEXT:    .cfi_def_cfa_offset 0
768; RV32-NEXT:    ret
769;
770; RV64-LABEL: llrint_v2i64_v2f64:
771; RV64:       # %bb.0:
772; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
773; RV64-NEXT:    vslidedown.vi v9, v8, 1
774; RV64-NEXT:    vfmv.f.s fa5, v8
775; RV64-NEXT:    fcvt.l.d a0, fa5
776; RV64-NEXT:    vfmv.f.s fa5, v9
777; RV64-NEXT:    fcvt.l.d a1, fa5
778; RV64-NEXT:    vmv.v.x v8, a0
779; RV64-NEXT:    vslide1down.vx v8, v8, a1
780; RV64-NEXT:    ret
781  %a = call <2 x i64> @llvm.llrint.v2i64.v2f64(<2 x double> %x)
782  ret <2 x i64> %a
783}
784declare <2 x i64> @llvm.llrint.v2i64.v2f64(<2 x double>)
785
786define <4 x i64> @llrint_v4i64_v4f64(<4 x double> %x) {
787; RV32-LABEL: llrint_v4i64_v4f64:
788; RV32:       # %bb.0:
789; RV32-NEXT:    addi sp, sp, -32
790; RV32-NEXT:    .cfi_def_cfa_offset 32
791; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
792; RV32-NEXT:    .cfi_offset ra, -4
793; RV32-NEXT:    csrr a0, vlenb
794; RV32-NEXT:    slli a0, a0, 2
795; RV32-NEXT:    sub sp, sp, a0
796; RV32-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x20, 0x22, 0x11, 0x04, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32 + 4 * vlenb
797; RV32-NEXT:    csrr a0, vlenb
798; RV32-NEXT:    slli a0, a0, 1
799; RV32-NEXT:    add a0, sp, a0
800; RV32-NEXT:    addi a0, a0, 16
801; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
802; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
803; RV32-NEXT:    vfmv.f.s fa0, v8
804; RV32-NEXT:    call llrint
805; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
806; RV32-NEXT:    vmv.v.x v8, a0
807; RV32-NEXT:    vslide1down.vx v8, v8, a1
808; RV32-NEXT:    addi a0, sp, 16
809; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
810; RV32-NEXT:    csrr a0, vlenb
811; RV32-NEXT:    slli a0, a0, 1
812; RV32-NEXT:    add a0, sp, a0
813; RV32-NEXT:    addi a0, a0, 16
814; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
815; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
816; RV32-NEXT:    vslidedown.vi v8, v8, 1
817; RV32-NEXT:    vfmv.f.s fa0, v8
818; RV32-NEXT:    call llrint
819; RV32-NEXT:    addi a2, sp, 16
820; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
821; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
822; RV32-NEXT:    vslide1down.vx v8, v8, a0
823; RV32-NEXT:    vslide1down.vx v8, v8, a1
824; RV32-NEXT:    addi a0, sp, 16
825; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
826; RV32-NEXT:    csrr a0, vlenb
827; RV32-NEXT:    slli a0, a0, 1
828; RV32-NEXT:    add a0, sp, a0
829; RV32-NEXT:    addi a0, a0, 16
830; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
831; RV32-NEXT:    vsetivli zero, 1, e64, m2, ta, ma
832; RV32-NEXT:    vslidedown.vi v8, v8, 2
833; RV32-NEXT:    vfmv.f.s fa0, v8
834; RV32-NEXT:    call llrint
835; RV32-NEXT:    addi a2, sp, 16
836; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
837; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
838; RV32-NEXT:    vslide1down.vx v8, v8, a0
839; RV32-NEXT:    vslide1down.vx v8, v8, a1
840; RV32-NEXT:    addi a0, sp, 16
841; RV32-NEXT:    vs2r.v v8, (a0) # Unknown-size Folded Spill
842; RV32-NEXT:    csrr a0, vlenb
843; RV32-NEXT:    slli a0, a0, 1
844; RV32-NEXT:    add a0, sp, a0
845; RV32-NEXT:    addi a0, a0, 16
846; RV32-NEXT:    vl2r.v v8, (a0) # Unknown-size Folded Reload
847; RV32-NEXT:    vsetivli zero, 1, e64, m2, ta, ma
848; RV32-NEXT:    vslidedown.vi v8, v8, 3
849; RV32-NEXT:    vfmv.f.s fa0, v8
850; RV32-NEXT:    call llrint
851; RV32-NEXT:    addi a2, sp, 16
852; RV32-NEXT:    vl2r.v v8, (a2) # Unknown-size Folded Reload
853; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
854; RV32-NEXT:    vslide1down.vx v8, v8, a0
855; RV32-NEXT:    vslide1down.vx v8, v8, a1
856; RV32-NEXT:    csrr a0, vlenb
857; RV32-NEXT:    slli a0, a0, 2
858; RV32-NEXT:    add sp, sp, a0
859; RV32-NEXT:    .cfi_def_cfa sp, 32
860; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
861; RV32-NEXT:    .cfi_restore ra
862; RV32-NEXT:    addi sp, sp, 32
863; RV32-NEXT:    .cfi_def_cfa_offset 0
864; RV32-NEXT:    ret
865;
866; RV64-LABEL: llrint_v4i64_v4f64:
867; RV64:       # %bb.0:
868; RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
869; RV64-NEXT:    vslidedown.vi v10, v8, 1
870; RV64-NEXT:    vfmv.f.s fa5, v8
871; RV64-NEXT:    vsetivli zero, 1, e64, m2, ta, ma
872; RV64-NEXT:    vslidedown.vi v12, v8, 2
873; RV64-NEXT:    vslidedown.vi v8, v8, 3
874; RV64-NEXT:    fcvt.l.d a0, fa5
875; RV64-NEXT:    vfmv.f.s fa5, v10
876; RV64-NEXT:    fcvt.l.d a1, fa5
877; RV64-NEXT:    vfmv.f.s fa5, v12
878; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
879; RV64-NEXT:    vmv.v.x v10, a0
880; RV64-NEXT:    fcvt.l.d a0, fa5
881; RV64-NEXT:    vfmv.f.s fa5, v8
882; RV64-NEXT:    vslide1down.vx v8, v10, a1
883; RV64-NEXT:    vslide1down.vx v8, v8, a0
884; RV64-NEXT:    fcvt.l.d a0, fa5
885; RV64-NEXT:    vslide1down.vx v8, v8, a0
886; RV64-NEXT:    ret
887  %a = call <4 x i64> @llvm.llrint.v4i64.v4f64(<4 x double> %x)
888  ret <4 x i64> %a
889}
890declare <4 x i64> @llvm.llrint.v4i64.v4f64(<4 x double>)
891
892define <8 x i64> @llrint_v8i64_v8f64(<8 x double> %x) {
893; RV32-LABEL: llrint_v8i64_v8f64:
894; RV32:       # %bb.0:
895; RV32-NEXT:    addi sp, sp, -272
896; RV32-NEXT:    .cfi_def_cfa_offset 272
897; RV32-NEXT:    sw ra, 268(sp) # 4-byte Folded Spill
898; RV32-NEXT:    sw s0, 264(sp) # 4-byte Folded Spill
899; RV32-NEXT:    .cfi_offset ra, -4
900; RV32-NEXT:    .cfi_offset s0, -8
901; RV32-NEXT:    addi s0, sp, 272
902; RV32-NEXT:    .cfi_def_cfa s0, 0
903; RV32-NEXT:    csrr a0, vlenb
904; RV32-NEXT:    slli a0, a0, 2
905; RV32-NEXT:    sub sp, sp, a0
906; RV32-NEXT:    andi sp, sp, -64
907; RV32-NEXT:    addi a0, sp, 256
908; RV32-NEXT:    vs4r.v v8, (a0) # Unknown-size Folded Spill
909; RV32-NEXT:    addi a0, sp, 64
910; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
911; RV32-NEXT:    vse64.v v8, (a0)
912; RV32-NEXT:    fld fa0, 120(sp)
913; RV32-NEXT:    call llrint
914; RV32-NEXT:    sw a0, 184(sp)
915; RV32-NEXT:    sw a1, 188(sp)
916; RV32-NEXT:    fld fa0, 112(sp)
917; RV32-NEXT:    call llrint
918; RV32-NEXT:    sw a0, 176(sp)
919; RV32-NEXT:    sw a1, 180(sp)
920; RV32-NEXT:    fld fa0, 104(sp)
921; RV32-NEXT:    call llrint
922; RV32-NEXT:    sw a0, 168(sp)
923; RV32-NEXT:    sw a1, 172(sp)
924; RV32-NEXT:    fld fa0, 96(sp)
925; RV32-NEXT:    call llrint
926; RV32-NEXT:    sw a0, 160(sp)
927; RV32-NEXT:    sw a1, 164(sp)
928; RV32-NEXT:    addi a0, sp, 256
929; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
930; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
931; RV32-NEXT:    vfmv.f.s fa0, v8
932; RV32-NEXT:    call llrint
933; RV32-NEXT:    sw a0, 128(sp)
934; RV32-NEXT:    sw a1, 132(sp)
935; RV32-NEXT:    addi a0, sp, 256
936; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
937; RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
938; RV32-NEXT:    vslidedown.vi v8, v8, 1
939; RV32-NEXT:    vfmv.f.s fa0, v8
940; RV32-NEXT:    call llrint
941; RV32-NEXT:    sw a0, 136(sp)
942; RV32-NEXT:    sw a1, 140(sp)
943; RV32-NEXT:    addi a0, sp, 256
944; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
945; RV32-NEXT:    vsetivli zero, 1, e64, m2, ta, ma
946; RV32-NEXT:    vslidedown.vi v8, v8, 3
947; RV32-NEXT:    vfmv.f.s fa0, v8
948; RV32-NEXT:    call llrint
949; RV32-NEXT:    sw a0, 152(sp)
950; RV32-NEXT:    sw a1, 156(sp)
951; RV32-NEXT:    addi a0, sp, 256
952; RV32-NEXT:    vl4r.v v8, (a0) # Unknown-size Folded Reload
953; RV32-NEXT:    vsetivli zero, 1, e64, m2, ta, ma
954; RV32-NEXT:    vslidedown.vi v8, v8, 2
955; RV32-NEXT:    vfmv.f.s fa0, v8
956; RV32-NEXT:    call llrint
957; RV32-NEXT:    sw a0, 144(sp)
958; RV32-NEXT:    sw a1, 148(sp)
959; RV32-NEXT:    addi a0, sp, 128
960; RV32-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
961; RV32-NEXT:    vle32.v v8, (a0)
962; RV32-NEXT:    addi sp, s0, -272
963; RV32-NEXT:    .cfi_def_cfa sp, 272
964; RV32-NEXT:    lw ra, 268(sp) # 4-byte Folded Reload
965; RV32-NEXT:    lw s0, 264(sp) # 4-byte Folded Reload
966; RV32-NEXT:    .cfi_restore ra
967; RV32-NEXT:    .cfi_restore s0
968; RV32-NEXT:    addi sp, sp, 272
969; RV32-NEXT:    .cfi_def_cfa_offset 0
970; RV32-NEXT:    ret
971;
972; RV64-LABEL: llrint_v8i64_v8f64:
973; RV64:       # %bb.0:
974; RV64-NEXT:    addi sp, sp, -192
975; RV64-NEXT:    .cfi_def_cfa_offset 192
976; RV64-NEXT:    sd ra, 184(sp) # 8-byte Folded Spill
977; RV64-NEXT:    sd s0, 176(sp) # 8-byte Folded Spill
978; RV64-NEXT:    .cfi_offset ra, -8
979; RV64-NEXT:    .cfi_offset s0, -16
980; RV64-NEXT:    addi s0, sp, 192
981; RV64-NEXT:    .cfi_def_cfa s0, 0
982; RV64-NEXT:    andi sp, sp, -64
983; RV64-NEXT:    mv a0, sp
984; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
985; RV64-NEXT:    vse64.v v8, (a0)
986; RV64-NEXT:    fld fa5, 56(sp)
987; RV64-NEXT:    vfmv.f.s fa4, v8
988; RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
989; RV64-NEXT:    vslidedown.vi v10, v8, 1
990; RV64-NEXT:    fcvt.l.d a0, fa4
991; RV64-NEXT:    fcvt.l.d a1, fa5
992; RV64-NEXT:    sd a1, 120(sp)
993; RV64-NEXT:    fld fa5, 48(sp)
994; RV64-NEXT:    vfmv.f.s fa4, v10
995; RV64-NEXT:    vsetivli zero, 1, e64, m2, ta, ma
996; RV64-NEXT:    vslidedown.vi v10, v8, 3
997; RV64-NEXT:    fcvt.l.d a1, fa4
998; RV64-NEXT:    fcvt.l.d a2, fa5
999; RV64-NEXT:    sd a2, 112(sp)
1000; RV64-NEXT:    fld fa5, 40(sp)
1001; RV64-NEXT:    vfmv.f.s fa4, v10
1002; RV64-NEXT:    fcvt.l.d a2, fa4
1003; RV64-NEXT:    vslidedown.vi v8, v8, 2
1004; RV64-NEXT:    fcvt.l.d a3, fa5
1005; RV64-NEXT:    vfmv.f.s fa5, v8
1006; RV64-NEXT:    sd a3, 104(sp)
1007; RV64-NEXT:    fcvt.l.d a3, fa5
1008; RV64-NEXT:    fld fa5, 32(sp)
1009; RV64-NEXT:    sd a0, 64(sp)
1010; RV64-NEXT:    sd a1, 72(sp)
1011; RV64-NEXT:    sd a3, 80(sp)
1012; RV64-NEXT:    sd a2, 88(sp)
1013; RV64-NEXT:    fcvt.l.d a0, fa5
1014; RV64-NEXT:    sd a0, 96(sp)
1015; RV64-NEXT:    addi a0, sp, 64
1016; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1017; RV64-NEXT:    vle64.v v8, (a0)
1018; RV64-NEXT:    addi sp, s0, -192
1019; RV64-NEXT:    .cfi_def_cfa sp, 192
1020; RV64-NEXT:    ld ra, 184(sp) # 8-byte Folded Reload
1021; RV64-NEXT:    ld s0, 176(sp) # 8-byte Folded Reload
1022; RV64-NEXT:    .cfi_restore ra
1023; RV64-NEXT:    .cfi_restore s0
1024; RV64-NEXT:    addi sp, sp, 192
1025; RV64-NEXT:    .cfi_def_cfa_offset 0
1026; RV64-NEXT:    ret
1027  %a = call <8 x i64> @llvm.llrint.v8i64.v8f64(<8 x double> %x)
1028  ret <8 x i64> %a
1029}
1030declare <8 x i64> @llvm.llrint.v8i64.v8f64(<8 x double>)
1031