[Xtensa] Implement Windowed Register Option. (#124656)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-cvt-fp-to-int.ll
blob3ae0089d409d0e90b42fbe94ec1239a5a8e294c4
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 -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
6 target triple = "aarch64-unknown-linux-gnu"
8 define i32 @f16_to_s32(half %x) {
9 ; CHECK-LABEL: f16_to_s32:
10 ; CHECK:       // %bb.0: // %entry
11 ; CHECK-NEXT:    ptrue p0.s
12 ; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
13 ; CHECK-NEXT:    fcvtzs z0.s, p0/m, z0.h
14 ; CHECK-NEXT:    fmov w0, s0
15 ; CHECK-NEXT:    ret
17 ; NONEON-NOSVE-LABEL: f16_to_s32:
18 ; NONEON-NOSVE:       // %bb.0: // %entry
19 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
20 ; NONEON-NOSVE-NEXT:    fcvtzs w0, s0
21 ; NONEON-NOSVE-NEXT:    ret
22   entry:
23   %cvt = fptosi half %x to i32
24   ret i32 %cvt
27 define i64 @f16_to_s64(half %x) {
28 ; CHECK-LABEL: f16_to_s64:
29 ; CHECK:       // %bb.0: // %entry
30 ; CHECK-NEXT:    ptrue p0.d
31 ; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
32 ; CHECK-NEXT:    fcvtzs z0.d, p0/m, z0.h
33 ; CHECK-NEXT:    fmov x0, d0
34 ; CHECK-NEXT:    ret
36 ; NONEON-NOSVE-LABEL: f16_to_s64:
37 ; NONEON-NOSVE:       // %bb.0: // %entry
38 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
39 ; NONEON-NOSVE-NEXT:    fcvtzs x0, s0
40 ; NONEON-NOSVE-NEXT:    ret
41   entry:
42   %cvt = fptosi half %x to i64
43   ret i64 %cvt
46 define i32 @f32_to_s32(float %x) {
47 ; CHECK-LABEL: f32_to_s32:
48 ; CHECK:       // %bb.0: // %entry
49 ; CHECK-NEXT:    ptrue p0.s
50 ; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
51 ; CHECK-NEXT:    fcvtzs z0.s, p0/m, z0.s
52 ; CHECK-NEXT:    fmov w0, s0
53 ; CHECK-NEXT:    ret
55 ; NONEON-NOSVE-LABEL: f32_to_s32:
56 ; NONEON-NOSVE:       // %bb.0: // %entry
57 ; NONEON-NOSVE-NEXT:    fcvtzs w0, s0
58 ; NONEON-NOSVE-NEXT:    ret
59   entry:
60   %cvt = fptosi float %x to i32
61   ret i32 %cvt
64 define i64 @f32_to_s64(float %x) {
65 ; CHECK-LABEL: f32_to_s64:
66 ; CHECK:       // %bb.0: // %entry
67 ; CHECK-NEXT:    ptrue p0.d
68 ; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
69 ; CHECK-NEXT:    fcvtzs z0.d, p0/m, z0.s
70 ; CHECK-NEXT:    fmov x0, d0
71 ; CHECK-NEXT:    ret
73 ; NONEON-NOSVE-LABEL: f32_to_s64:
74 ; NONEON-NOSVE:       // %bb.0: // %entry
75 ; NONEON-NOSVE-NEXT:    fcvtzs x0, s0
76 ; NONEON-NOSVE-NEXT:    ret
77   entry:
78   %cvt = fptosi float %x to i64
79   ret i64 %cvt
82 define i32 @f64_to_s32(double %x) {
83 ; CHECK-LABEL: f64_to_s32:
84 ; CHECK:       // %bb.0: // %entry
85 ; CHECK-NEXT:    fcvtzs w0, d0
86 ; CHECK-NEXT:    ret
88 ; NONEON-NOSVE-LABEL: f64_to_s32:
89 ; NONEON-NOSVE:       // %bb.0: // %entry
90 ; NONEON-NOSVE-NEXT:    fcvtzs w0, d0
91 ; NONEON-NOSVE-NEXT:    ret
92   entry:
93   %cvt = fptosi double %x to i32
94   ret i32 %cvt
97 define i64 @f64_to_s64(double %x) {
98 ; CHECK-LABEL: f64_to_s64:
99 ; CHECK:       // %bb.0: // %entry
100 ; CHECK-NEXT:    ptrue p0.d
101 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
102 ; CHECK-NEXT:    fcvtzs z0.d, p0/m, z0.d
103 ; CHECK-NEXT:    fmov x0, d0
104 ; CHECK-NEXT:    ret
106 ; NONEON-NOSVE-LABEL: f64_to_s64:
107 ; NONEON-NOSVE:       // %bb.0: // %entry
108 ; NONEON-NOSVE-NEXT:    fcvtzs x0, d0
109 ; NONEON-NOSVE-NEXT:    ret
110   entry:
111   %cvt = fptosi double %x to i64
112   ret i64 %cvt
115 define i32 @f16_to_u32(half %x) {
116 ; CHECK-LABEL: f16_to_u32:
117 ; CHECK:       // %bb.0: // %entry
118 ; CHECK-NEXT:    ptrue p0.s
119 ; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
120 ; CHECK-NEXT:    fcvtzu z0.s, p0/m, z0.h
121 ; CHECK-NEXT:    fmov w0, s0
122 ; CHECK-NEXT:    ret
124 ; NONEON-NOSVE-LABEL: f16_to_u32:
125 ; NONEON-NOSVE:       // %bb.0: // %entry
126 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
127 ; NONEON-NOSVE-NEXT:    fcvtzu w0, s0
128 ; NONEON-NOSVE-NEXT:    ret
129   entry:
130   %cvt = fptoui half %x to i32
131   ret i32 %cvt
134 define i64 @f16_to_u64(half %x) {
135 ; CHECK-LABEL: f16_to_u64:
136 ; CHECK:       // %bb.0: // %entry
137 ; CHECK-NEXT:    ptrue p0.d
138 ; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
139 ; CHECK-NEXT:    fcvtzu z0.d, p0/m, z0.h
140 ; CHECK-NEXT:    fmov x0, d0
141 ; CHECK-NEXT:    ret
143 ; NONEON-NOSVE-LABEL: f16_to_u64:
144 ; NONEON-NOSVE:       // %bb.0: // %entry
145 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
146 ; NONEON-NOSVE-NEXT:    fcvtzu x0, s0
147 ; NONEON-NOSVE-NEXT:    ret
148   entry:
149   %cvt = fptoui half %x to i64
150   ret i64 %cvt
153 define i32 @f32_to_u32(float %x) {
154 ; CHECK-LABEL: f32_to_u32:
155 ; CHECK:       // %bb.0: // %entry
156 ; CHECK-NEXT:    ptrue p0.s
157 ; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
158 ; CHECK-NEXT:    fcvtzu z0.s, p0/m, z0.s
159 ; CHECK-NEXT:    fmov w0, s0
160 ; CHECK-NEXT:    ret
162 ; NONEON-NOSVE-LABEL: f32_to_u32:
163 ; NONEON-NOSVE:       // %bb.0: // %entry
164 ; NONEON-NOSVE-NEXT:    fcvtzu w0, s0
165 ; NONEON-NOSVE-NEXT:    ret
166   entry:
167   %cvt = fptoui float %x to i32
168   ret i32 %cvt
171 define i64 @f32_to_u64(float %x) {
172 ; CHECK-LABEL: f32_to_u64:
173 ; CHECK:       // %bb.0: // %entry
174 ; CHECK-NEXT:    ptrue p0.d
175 ; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
176 ; CHECK-NEXT:    fcvtzu z0.d, p0/m, z0.s
177 ; CHECK-NEXT:    fmov x0, d0
178 ; CHECK-NEXT:    ret
180 ; NONEON-NOSVE-LABEL: f32_to_u64:
181 ; NONEON-NOSVE:       // %bb.0: // %entry
182 ; NONEON-NOSVE-NEXT:    fcvtzu x0, s0
183 ; NONEON-NOSVE-NEXT:    ret
184   entry:
185   %cvt = fptoui float %x to i64
186   ret i64 %cvt
189 define i32 @f64_to_u32(double %x) {
190 ; CHECK-LABEL: f64_to_u32:
191 ; CHECK:       // %bb.0: // %entry
192 ; CHECK-NEXT:    fcvtzu w0, d0
193 ; CHECK-NEXT:    ret
195 ; NONEON-NOSVE-LABEL: f64_to_u32:
196 ; NONEON-NOSVE:       // %bb.0: // %entry
197 ; NONEON-NOSVE-NEXT:    fcvtzu w0, d0
198 ; NONEON-NOSVE-NEXT:    ret
199   entry:
200   %cvt = fptoui double %x to i32
201   ret i32 %cvt
204 define i64 @f64_to_u64(double %x) {
205 ; CHECK-LABEL: f64_to_u64:
206 ; CHECK:       // %bb.0: // %entry
207 ; CHECK-NEXT:    ptrue p0.d
208 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
209 ; CHECK-NEXT:    fcvtzu z0.d, p0/m, z0.d
210 ; CHECK-NEXT:    fmov x0, d0
211 ; CHECK-NEXT:    ret
213 ; NONEON-NOSVE-LABEL: f64_to_u64:
214 ; NONEON-NOSVE:       // %bb.0: // %entry
215 ; NONEON-NOSVE-NEXT:    fcvtzu x0, d0
216 ; NONEON-NOSVE-NEXT:    ret
217   entry:
218   %cvt = fptoui double %x to i64
219   ret i64 %cvt
222 define i32 @strict_convert_signed(double %x) {
223 ; CHECK-LABEL: strict_convert_signed:
224 ; CHECK:       // %bb.0: // %entry
225 ; CHECK-NEXT:    fcvtzs w0, d0
226 ; CHECK-NEXT:    ret
228 ; NONEON-NOSVE-LABEL: strict_convert_signed:
229 ; NONEON-NOSVE:       // %bb.0: // %entry
230 ; NONEON-NOSVE-NEXT:    fcvtzs w0, d0
231 ; NONEON-NOSVE-NEXT:    ret
232   entry:
233   %cvt = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %x, metadata !"fpexcept.strict") #0
234   ret i32 %cvt
237 define i32 @strict_convert_unsigned(float %x) {
238 ; CHECK-LABEL: strict_convert_unsigned:
239 ; CHECK:       // %bb.0: // %entry
240 ; CHECK-NEXT:    fcvtzu w0, s0
241 ; CHECK-NEXT:    ret
243 ; NONEON-NOSVE-LABEL: strict_convert_unsigned:
244 ; NONEON-NOSVE:       // %bb.0: // %entry
245 ; NONEON-NOSVE-NEXT:    fcvtzu w0, s0
246 ; NONEON-NOSVE-NEXT:    ret
247   entry:
248   %cvt = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %x, metadata !"fpexcept.strict") #0
249   ret i32 %cvt
252 attributes #0 = { strictfp }