xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp2i-sat.ll (revision 1cb599835ccf7ee8b2d1d5a7f3107e19a26fc6f5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
4
5define void @fp2si_v2f32_v2i32(ptr %x, ptr %y) {
6; CHECK-LABEL: fp2si_v2f32_v2i32:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
9; CHECK-NEXT:    vle32.v v8, (a0)
10; CHECK-NEXT:    vmfne.vv v0, v8, v8
11; CHECK-NEXT:    vfcvt.rtz.x.f.v v8, v8
12; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
13; CHECK-NEXT:    vse32.v v8, (a1)
14; CHECK-NEXT:    ret
15  %a = load <2 x float>, ptr %x
16  %d = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float> %a)
17  store <2 x i32> %d, ptr %y
18  ret void
19}
20declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f32(<2 x float>)
21
22define void @fp2ui_v2f32_v2i32(ptr %x, ptr %y) {
23; CHECK-LABEL: fp2ui_v2f32_v2i32:
24; CHECK:       # %bb.0:
25; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
26; CHECK-NEXT:    vle32.v v8, (a0)
27; CHECK-NEXT:    vmfne.vv v0, v8, v8
28; CHECK-NEXT:    vfcvt.rtz.xu.f.v v8, v8
29; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
30; CHECK-NEXT:    vse32.v v8, (a1)
31; CHECK-NEXT:    ret
32  %a = load <2 x float>, ptr %x
33  %d = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float> %a)
34  store <2 x i32> %d, ptr %y
35  ret void
36}
37declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f32(<2 x float>)
38
39define void @fp2si_v8f32_v8i32(ptr %x, ptr %y) {
40;
41; CHECK-LABEL: fp2si_v8f32_v8i32:
42; CHECK:       # %bb.0:
43; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
44; CHECK-NEXT:    vle32.v v8, (a0)
45; CHECK-NEXT:    vmfne.vv v0, v8, v8
46; CHECK-NEXT:    vfcvt.rtz.x.f.v v8, v8
47; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
48; CHECK-NEXT:    vse32.v v8, (a1)
49; CHECK-NEXT:    ret
50  %a = load <8 x float>, ptr %x
51  %d = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float> %a)
52  store <8 x i32> %d, ptr %y
53  ret void
54}
55declare <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float>)
56
57define void @fp2ui_v8f32_v8i32(ptr %x, ptr %y) {
58;
59; CHECK-LABEL: fp2ui_v8f32_v8i32:
60; CHECK:       # %bb.0:
61; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
62; CHECK-NEXT:    vle32.v v8, (a0)
63; CHECK-NEXT:    vmfne.vv v0, v8, v8
64; CHECK-NEXT:    vfcvt.rtz.x.f.v v8, v8
65; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
66; CHECK-NEXT:    vse32.v v8, (a1)
67; CHECK-NEXT:    ret
68  %a = load <8 x float>, ptr %x
69  %d = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f32(<8 x float> %a)
70  store <8 x i32> %d, ptr %y
71  ret void
72}
73declare <8 x i32> @llvm.fptoui.sat.v8i32.v8f32(<8 x float>)
74
75define void @fp2si_v2f32_v2i64(ptr %x, ptr %y) {
76; CHECK-LABEL: fp2si_v2f32_v2i64:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
79; CHECK-NEXT:    vle32.v v8, (a0)
80; CHECK-NEXT:    vmfne.vv v0, v8, v8
81; CHECK-NEXT:    vfwcvt.rtz.x.f.v v9, v8
82; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
83; CHECK-NEXT:    vmerge.vim v8, v9, 0, v0
84; CHECK-NEXT:    vse64.v v8, (a1)
85; CHECK-NEXT:    ret
86  %a = load <2 x float>, ptr %x
87  %d = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f32(<2 x float> %a)
88  store <2 x i64> %d, ptr %y
89  ret void
90}
91declare <2 x i64> @llvm.fptosi.sat.v2i64.v2f32(<2 x float>)
92
93define void @fp2ui_v2f32_v2i64(ptr %x, ptr %y) {
94; CHECK-LABEL: fp2ui_v2f32_v2i64:
95; CHECK:       # %bb.0:
96; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
97; CHECK-NEXT:    vle32.v v8, (a0)
98; CHECK-NEXT:    vmfne.vv v0, v8, v8
99; CHECK-NEXT:    vfwcvt.rtz.xu.f.v v9, v8
100; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
101; CHECK-NEXT:    vmerge.vim v8, v9, 0, v0
102; CHECK-NEXT:    vse64.v v8, (a1)
103; CHECK-NEXT:    ret
104  %a = load <2 x float>, ptr %x
105  %d = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f32(<2 x float> %a)
106  store <2 x i64> %d, ptr %y
107  ret void
108}
109declare <2 x i64> @llvm.fptoui.sat.v2i64.v2f32(<2 x float>)
110
111define void @fp2si_v8f32_v8i64(ptr %x, ptr %y) {
112;
113; CHECK-LABEL: fp2si_v8f32_v8i64:
114; CHECK:       # %bb.0:
115; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
116; CHECK-NEXT:    vle32.v v8, (a0)
117; CHECK-NEXT:    vmfne.vv v0, v8, v8
118; CHECK-NEXT:    vfwcvt.rtz.x.f.v v12, v8
119; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
120; CHECK-NEXT:    vmerge.vim v8, v12, 0, v0
121; CHECK-NEXT:    vse64.v v8, (a1)
122; CHECK-NEXT:    ret
123  %a = load <8 x float>, ptr %x
124  %d = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f32(<8 x float> %a)
125  store <8 x i64> %d, ptr %y
126  ret void
127}
128declare <8 x i64> @llvm.fptosi.sat.v8i64.v8f32(<8 x float>)
129
130define void @fp2ui_v8f32_v8i64(ptr %x, ptr %y) {
131;
132; CHECK-LABEL: fp2ui_v8f32_v8i64:
133; CHECK:       # %bb.0:
134; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
135; CHECK-NEXT:    vle32.v v8, (a0)
136; CHECK-NEXT:    vmfne.vv v0, v8, v8
137; CHECK-NEXT:    vfwcvt.rtz.xu.f.v v12, v8
138; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
139; CHECK-NEXT:    vmerge.vim v8, v12, 0, v0
140; CHECK-NEXT:    vse64.v v8, (a1)
141; CHECK-NEXT:    ret
142  %a = load <8 x float>, ptr %x
143  %d = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f32(<8 x float> %a)
144  store <8 x i64> %d, ptr %y
145  ret void
146}
147declare <8 x i64> @llvm.fptoui.sat.v8i64.v8f32(<8 x float>)
148
149define void @fp2si_v2f16_v2i64(ptr %x, ptr %y) {
150; CHECK-LABEL: fp2si_v2f16_v2i64:
151; CHECK:       # %bb.0:
152; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
153; CHECK-NEXT:    vle16.v v8, (a0)
154; CHECK-NEXT:    vmfne.vv v0, v8, v8
155; CHECK-NEXT:    vfwcvt.f.f.v v9, v8
156; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
157; CHECK-NEXT:    vfwcvt.rtz.x.f.v v8, v9
158; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
159; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
160; CHECK-NEXT:    vse64.v v8, (a1)
161; CHECK-NEXT:    ret
162  %a = load <2 x half>, ptr %x
163  %d = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> %a)
164  store <2 x i64> %d, ptr %y
165  ret void
166}
167declare <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half>)
168
169define void @fp2ui_v2f16_v2i64(ptr %x, ptr %y) {
170; CHECK-LABEL: fp2ui_v2f16_v2i64:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
173; CHECK-NEXT:    vle16.v v8, (a0)
174; CHECK-NEXT:    vmfne.vv v0, v8, v8
175; CHECK-NEXT:    vfwcvt.f.f.v v9, v8
176; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
177; CHECK-NEXT:    vfwcvt.rtz.xu.f.v v8, v9
178; CHECK-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
179; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
180; CHECK-NEXT:    vse64.v v8, (a1)
181; CHECK-NEXT:    ret
182  %a = load <2 x half>, ptr %x
183  %d = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> %a)
184  store <2 x i64> %d, ptr %y
185  ret void
186}
187declare <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half>)
188
189define void @fp2si_v2f64_v2i8(ptr %x, ptr %y) {
190; CHECK-LABEL: fp2si_v2f64_v2i8:
191; CHECK:       # %bb.0:
192; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
193; CHECK-NEXT:    vle64.v v8, (a0)
194; CHECK-NEXT:    vmfne.vv v0, v8, v8
195; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
196; CHECK-NEXT:    vfncvt.rtz.x.f.w v9, v8
197; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
198; CHECK-NEXT:    vnclip.wi v8, v9, 0
199; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
200; CHECK-NEXT:    vnclip.wi v8, v8, 0
201; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
202; CHECK-NEXT:    vse8.v v8, (a1)
203; CHECK-NEXT:    ret
204  %a = load <2 x double>, ptr %x
205  %d = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f64(<2 x double> %a)
206  store <2 x i8> %d, ptr %y
207  ret void
208}
209declare <2 x i8> @llvm.fptosi.sat.v2i8.v2f64(<2 x double>)
210
211define void @fp2ui_v2f64_v2i8(ptr %x, ptr %y) {
212; CHECK-LABEL: fp2ui_v2f64_v2i8:
213; CHECK:       # %bb.0:
214; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
215; CHECK-NEXT:    vle64.v v8, (a0)
216; CHECK-NEXT:    vmfne.vv v0, v8, v8
217; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
218; CHECK-NEXT:    vfncvt.rtz.xu.f.w v9, v8
219; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
220; CHECK-NEXT:    vnclipu.wi v8, v9, 0
221; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
222; CHECK-NEXT:    vnclipu.wi v8, v8, 0
223; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
224; CHECK-NEXT:    vse8.v v8, (a1)
225; CHECK-NEXT:    ret
226  %a = load <2 x double>, ptr %x
227  %d = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f64(<2 x double> %a)
228  store <2 x i8> %d, ptr %y
229  ret void
230}
231declare <2 x i8> @llvm.fptoui.sat.v2i8.v2f64(<2 x double>)
232
233define void @fp2si_v8f64_v8i8(ptr %x, ptr %y) {
234;
235; CHECK-LABEL: fp2si_v8f64_v8i8:
236; CHECK:       # %bb.0:
237; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
238; CHECK-NEXT:    vle64.v v8, (a0)
239; CHECK-NEXT:    vmfne.vv v0, v8, v8
240; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
241; CHECK-NEXT:    vfncvt.rtz.x.f.w v12, v8
242; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
243; CHECK-NEXT:    vnclip.wi v8, v12, 0
244; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
245; CHECK-NEXT:    vnclip.wi v8, v8, 0
246; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
247; CHECK-NEXT:    vse8.v v8, (a1)
248; CHECK-NEXT:    ret
249  %a = load <8 x double>, ptr %x
250  %d = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f64(<8 x double> %a)
251  store <8 x i8> %d, ptr %y
252  ret void
253}
254declare <8 x i8> @llvm.fptosi.sat.v8i8.v8f64(<8 x double>)
255
256define void @fp2ui_v8f64_v8i8(ptr %x, ptr %y) {
257;
258; CHECK-LABEL: fp2ui_v8f64_v8i8:
259; CHECK:       # %bb.0:
260; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
261; CHECK-NEXT:    vle64.v v8, (a0)
262; CHECK-NEXT:    vmfne.vv v0, v8, v8
263; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
264; CHECK-NEXT:    vfncvt.rtz.xu.f.w v12, v8
265; CHECK-NEXT:    vsetvli zero, zero, e16, m1, ta, ma
266; CHECK-NEXT:    vnclipu.wi v8, v12, 0
267; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
268; CHECK-NEXT:    vnclipu.wi v8, v8, 0
269; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
270; CHECK-NEXT:    vse8.v v8, (a1)
271; CHECK-NEXT:    ret
272  %a = load <8 x double>, ptr %x
273  %d = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f64(<8 x double> %a)
274  store <8 x i8> %d, ptr %y
275  ret void
276}
277declare <8 x i8> @llvm.fptoui.sat.v8i8.v8f64(<8 x double> %a)
278
279define void @fp2si_v2f64_v2i32(ptr %x, ptr %y) {
280; CHECK-LABEL: fp2si_v2f64_v2i32:
281; CHECK:       # %bb.0:
282; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
283; CHECK-NEXT:    vle64.v v8, (a0)
284; CHECK-NEXT:    vmfne.vv v0, v8, v8
285; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
286; CHECK-NEXT:    vfncvt.rtz.x.f.w v9, v8
287; CHECK-NEXT:    vmerge.vim v8, v9, 0, v0
288; CHECK-NEXT:    vse32.v v8, (a1)
289; CHECK-NEXT:    ret
290  %a = load <2 x double>, ptr %x
291  %d = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double> %a)
292  store <2 x i32> %d, ptr %y
293  ret void
294}
295declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f64(<2 x double>)
296
297define void @fp2ui_v2f64_v2i32(ptr %x, ptr %y) {
298; CHECK-LABEL: fp2ui_v2f64_v2i32:
299; CHECK:       # %bb.0:
300; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
301; CHECK-NEXT:    vle64.v v8, (a0)
302; CHECK-NEXT:    vmfne.vv v0, v8, v8
303; CHECK-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
304; CHECK-NEXT:    vfncvt.rtz.xu.f.w v9, v8
305; CHECK-NEXT:    vmerge.vim v8, v9, 0, v0
306; CHECK-NEXT:    vse32.v v8, (a1)
307; CHECK-NEXT:    ret
308  %a = load <2 x double>, ptr %x
309  %d = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double> %a)
310  store <2 x i32> %d, ptr %y
311  ret void
312}
313declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f64(<2 x double>)
314;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
315; RV32: {{.*}}
316; RV64: {{.*}}
317