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
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
23 %cvt = fptosi half %x to i32
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
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
42 %cvt = fptosi half %x to i64
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
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
60 %cvt = fptosi float %x to i32
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
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
78 %cvt = fptosi float %x to i64
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
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
93 %cvt = fptosi double %x to i32
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
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
111 %cvt = fptosi double %x to i64
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
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
130 %cvt = fptoui half %x to i32
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
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
149 %cvt = fptoui half %x to i64
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
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
167 %cvt = fptoui float %x to i32
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
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
185 %cvt = fptoui float %x to i64
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
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
200 %cvt = fptoui double %x to i32
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
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
218 %cvt = fptoui double %x to i64
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
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
233 %cvt = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %x, metadata !"fpexcept.strict") #0
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
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
248 %cvt = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %x, metadata !"fpexcept.strict") #0
252 attributes #0 = { strictfp }