xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-cvt-fp-int-fp.ll (revision ca98a3d9bbc254cbb7f028866a7d2077b7994ee8)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s
3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4; RUN: llc -mattr=+sme2p2 -force-streaming-compatible < %s | FileCheck %s --check-prefix=USE-NEON-NO-GPRS
5; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
6
7target triple = "aarch64-unknown-linux-gnu"
8
9define double @t1(double %x) {
10; CHECK-LABEL: t1:
11; CHECK:       // %bb.0: // %entry
12; CHECK-NEXT:    ptrue p0.d
13; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
14; CHECK-NEXT:    fcvtzs z0.d, p0/m, z0.d
15; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
16; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
17; CHECK-NEXT:    ret
18;
19; USE-NEON-NO-GPRS-LABEL: t1:
20; USE-NEON-NO-GPRS:       // %bb.0: // %entry
21; USE-NEON-NO-GPRS-NEXT:    fcvtzs d0, d0
22; USE-NEON-NO-GPRS-NEXT:    scvtf d0, d0
23; USE-NEON-NO-GPRS-NEXT:    ret
24;
25; NONEON-NOSVE-LABEL: t1:
26; NONEON-NOSVE:       // %bb.0: // %entry
27; NONEON-NOSVE-NEXT:    fcvtzs x8, d0
28; NONEON-NOSVE-NEXT:    scvtf d0, x8
29; NONEON-NOSVE-NEXT:    ret
30entry:
31  %conv = fptosi double %x to i64
32  %conv1 = sitofp i64 %conv to double
33  ret double %conv1
34}
35
36define float @t2(float %x) {
37; CHECK-LABEL: t2:
38; CHECK:       // %bb.0: // %entry
39; CHECK-NEXT:    ptrue p0.s
40; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
41; CHECK-NEXT:    fcvtzs z0.s, p0/m, z0.s
42; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
43; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
44; CHECK-NEXT:    ret
45;
46; USE-NEON-NO-GPRS-LABEL: t2:
47; USE-NEON-NO-GPRS:       // %bb.0: // %entry
48; USE-NEON-NO-GPRS-NEXT:    fcvtzs s0, s0
49; USE-NEON-NO-GPRS-NEXT:    scvtf s0, s0
50; USE-NEON-NO-GPRS-NEXT:    ret
51;
52; NONEON-NOSVE-LABEL: t2:
53; NONEON-NOSVE:       // %bb.0: // %entry
54; NONEON-NOSVE-NEXT:    fcvtzs w8, s0
55; NONEON-NOSVE-NEXT:    scvtf s0, w8
56; NONEON-NOSVE-NEXT:    ret
57entry:
58  %conv = fptosi float %x to i32
59  %conv1 = sitofp i32 %conv to float
60  ret float %conv1
61}
62
63define half @t3(half %x)  {
64; CHECK-LABEL: t3:
65; CHECK:       // %bb.0: // %entry
66; CHECK-NEXT:    ptrue p0.s
67; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
68; CHECK-NEXT:    fcvtzs z0.s, p0/m, z0.h
69; CHECK-NEXT:    scvtf z0.h, p0/m, z0.s
70; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
71; CHECK-NEXT:    ret
72;
73; NONEON-NOSVE-LABEL: t3:
74; NONEON-NOSVE:       // %bb.0: // %entry
75; NONEON-NOSVE-NEXT:    fcvt s0, h0
76; NONEON-NOSVE-NEXT:    fcvtzs w8, s0
77; NONEON-NOSVE-NEXT:    scvtf s0, w8
78; NONEON-NOSVE-NEXT:    fcvt h0, s0
79; NONEON-NOSVE-NEXT:    ret
80entry:
81  %conv = fptosi half %x to i32
82  %conv1 = sitofp i32 %conv to half
83  ret half %conv1
84}
85
86define double @t4(double %x) {
87; CHECK-LABEL: t4:
88; CHECK:       // %bb.0: // %entry
89; CHECK-NEXT:    ptrue p0.d
90; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
91; CHECK-NEXT:    fcvtzu z0.d, p0/m, z0.d
92; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
93; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
94; CHECK-NEXT:    ret
95;
96; USE-NEON-NO-GPRS-LABEL: t4:
97; USE-NEON-NO-GPRS:       // %bb.0: // %entry
98; USE-NEON-NO-GPRS-NEXT:    fcvtzu d0, d0
99; USE-NEON-NO-GPRS-NEXT:    ucvtf d0, d0
100; USE-NEON-NO-GPRS-NEXT:    ret
101;
102; NONEON-NOSVE-LABEL: t4:
103; NONEON-NOSVE:       // %bb.0: // %entry
104; NONEON-NOSVE-NEXT:    fcvtzu x8, d0
105; NONEON-NOSVE-NEXT:    ucvtf d0, x8
106; NONEON-NOSVE-NEXT:    ret
107entry:
108  %conv = fptoui double %x to i64
109  %conv1 = uitofp i64 %conv to double
110  ret double %conv1
111}
112
113define float @t5(float %x) {
114; CHECK-LABEL: t5:
115; CHECK:       // %bb.0: // %entry
116; CHECK-NEXT:    ptrue p0.s
117; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
118; CHECK-NEXT:    fcvtzu z0.s, p0/m, z0.s
119; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
120; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
121; CHECK-NEXT:    ret
122;
123; USE-NEON-NO-GPRS-LABEL: t5:
124; USE-NEON-NO-GPRS:       // %bb.0: // %entry
125; USE-NEON-NO-GPRS-NEXT:    fcvtzu s0, s0
126; USE-NEON-NO-GPRS-NEXT:    ucvtf s0, s0
127; USE-NEON-NO-GPRS-NEXT:    ret
128;
129; NONEON-NOSVE-LABEL: t5:
130; NONEON-NOSVE:       // %bb.0: // %entry
131; NONEON-NOSVE-NEXT:    fcvtzu w8, s0
132; NONEON-NOSVE-NEXT:    ucvtf s0, w8
133; NONEON-NOSVE-NEXT:    ret
134entry:
135  %conv = fptoui float %x to i32
136  %conv1 = uitofp i32 %conv to float
137  ret float %conv1
138}
139
140define half @t6(half %x)  {
141; CHECK-LABEL: t6:
142; CHECK:       // %bb.0: // %entry
143; CHECK-NEXT:    ptrue p0.s
144; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
145; CHECK-NEXT:    fcvtzu z0.s, p0/m, z0.h
146; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
147; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
148; CHECK-NEXT:    ret
149;
150; NONEON-NOSVE-LABEL: t6:
151; NONEON-NOSVE:       // %bb.0: // %entry
152; NONEON-NOSVE-NEXT:    fcvt s0, h0
153; NONEON-NOSVE-NEXT:    fcvtzu w8, s0
154; NONEON-NOSVE-NEXT:    ucvtf s0, w8
155; NONEON-NOSVE-NEXT:    fcvt h0, s0
156; NONEON-NOSVE-NEXT:    ret
157entry:
158  %conv = fptoui half %x to i32
159  %conv1 = uitofp i32 %conv to half
160  ret half %conv1
161}
162