Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / fp-strict-scalar-round-fp16.ll
blob3b9798a2af582042e3aab55a5c8f42779a897db9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2  -O3 | FileCheck %s --check-prefixes=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+f16c  -O3 | FileCheck %s --check-prefixes=AVX
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f  -O3 | FileCheck %s --check-prefixes=AVX
5 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512fp16 -O3 | FileCheck %s --check-prefixes=X86
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512fp16 -O3 | FileCheck %s --check-prefixes=X64
8 declare half @llvm.experimental.constrained.ceil.f16(half, metadata)
9 declare half @llvm.experimental.constrained.floor.f16(half, metadata)
10 declare half @llvm.experimental.constrained.trunc.f16(half, metadata)
11 declare half @llvm.experimental.constrained.rint.f16(half, metadata, metadata)
12 declare half @llvm.experimental.constrained.nearbyint.f16(half, metadata, metadata)
13 declare half @llvm.experimental.constrained.roundeven.f16(half, metadata)
14 declare half @llvm.experimental.constrained.round.f16(half, metadata)
16 define half @fceil32(half %f) #0 {
17 ; SSE2-LABEL: fceil32:
18 ; SSE2:       # %bb.0:
19 ; SSE2-NEXT:    pushq %rax
20 ; SSE2-NEXT:    callq __extendhfsf2@PLT
21 ; SSE2-NEXT:    callq ceilf@PLT
22 ; SSE2-NEXT:    callq __truncsfhf2@PLT
23 ; SSE2-NEXT:    popq %rax
24 ; SSE2-NEXT:    retq
26 ; AVX-LABEL: fceil32:
27 ; AVX:       # %bb.0:
28 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
29 ; AVX-NEXT:    movzwl %ax, %eax
30 ; AVX-NEXT:    vmovd %eax, %xmm0
31 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
32 ; AVX-NEXT:    vroundss $10, %xmm0, %xmm0, %xmm0
33 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
34 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
35 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
36 ; AVX-NEXT:    vmovd %xmm0, %eax
37 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
38 ; AVX-NEXT:    retq
40 ; X86-LABEL: fceil32:
41 ; X86:       # %bb.0:
42 ; X86-NEXT:    vrndscalesh $10, {{[0-9]+}}(%esp), %xmm0, %xmm0
43 ; X86-NEXT:    retl
45 ; X64-LABEL: fceil32:
46 ; X64:       # %bb.0:
47 ; X64-NEXT:    vrndscalesh $10, %xmm0, %xmm0, %xmm0
48 ; X64-NEXT:    retq
49   %res = call half @llvm.experimental.constrained.ceil.f16(
50                         half %f, metadata !"fpexcept.strict") #0
51   ret half %res
54 define half @ffloor32(half %f) #0 {
55 ; SSE2-LABEL: ffloor32:
56 ; SSE2:       # %bb.0:
57 ; SSE2-NEXT:    pushq %rax
58 ; SSE2-NEXT:    callq __extendhfsf2@PLT
59 ; SSE2-NEXT:    callq floorf@PLT
60 ; SSE2-NEXT:    callq __truncsfhf2@PLT
61 ; SSE2-NEXT:    popq %rax
62 ; SSE2-NEXT:    retq
64 ; AVX-LABEL: ffloor32:
65 ; AVX:       # %bb.0:
66 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
67 ; AVX-NEXT:    movzwl %ax, %eax
68 ; AVX-NEXT:    vmovd %eax, %xmm0
69 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
70 ; AVX-NEXT:    vroundss $9, %xmm0, %xmm0, %xmm0
71 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
72 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
73 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
74 ; AVX-NEXT:    vmovd %xmm0, %eax
75 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
76 ; AVX-NEXT:    retq
78 ; X86-LABEL: ffloor32:
79 ; X86:       # %bb.0:
80 ; X86-NEXT:    vrndscalesh $9, {{[0-9]+}}(%esp), %xmm0, %xmm0
81 ; X86-NEXT:    retl
83 ; X64-LABEL: ffloor32:
84 ; X64:       # %bb.0:
85 ; X64-NEXT:    vrndscalesh $9, %xmm0, %xmm0, %xmm0
86 ; X64-NEXT:    retq
87   %res = call half @llvm.experimental.constrained.floor.f16(
88                         half %f, metadata !"fpexcept.strict") #0
89   ret half %res
92 define half @ftrunc32(half %f) #0 {
93 ; SSE2-LABEL: ftrunc32:
94 ; SSE2:       # %bb.0:
95 ; SSE2-NEXT:    pushq %rax
96 ; SSE2-NEXT:    callq __extendhfsf2@PLT
97 ; SSE2-NEXT:    callq truncf@PLT
98 ; SSE2-NEXT:    callq __truncsfhf2@PLT
99 ; SSE2-NEXT:    popq %rax
100 ; SSE2-NEXT:    retq
102 ; AVX-LABEL: ftrunc32:
103 ; AVX:       # %bb.0:
104 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
105 ; AVX-NEXT:    movzwl %ax, %eax
106 ; AVX-NEXT:    vmovd %eax, %xmm0
107 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
108 ; AVX-NEXT:    vroundss $11, %xmm0, %xmm0, %xmm0
109 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
110 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
111 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
112 ; AVX-NEXT:    vmovd %xmm0, %eax
113 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
114 ; AVX-NEXT:    retq
116 ; X86-LABEL: ftrunc32:
117 ; X86:       # %bb.0:
118 ; X86-NEXT:    vrndscalesh $11, {{[0-9]+}}(%esp), %xmm0, %xmm0
119 ; X86-NEXT:    retl
121 ; X64-LABEL: ftrunc32:
122 ; X64:       # %bb.0:
123 ; X64-NEXT:    vrndscalesh $11, %xmm0, %xmm0, %xmm0
124 ; X64-NEXT:    retq
125   %res = call half @llvm.experimental.constrained.trunc.f16(
126                         half %f, metadata !"fpexcept.strict") #0
127   ret half %res
130 define half @frint32(half %f) #0 {
131 ; SSE2-LABEL: frint32:
132 ; SSE2:       # %bb.0:
133 ; SSE2-NEXT:    pushq %rax
134 ; SSE2-NEXT:    callq __extendhfsf2@PLT
135 ; SSE2-NEXT:    callq rintf@PLT
136 ; SSE2-NEXT:    callq __truncsfhf2@PLT
137 ; SSE2-NEXT:    popq %rax
138 ; SSE2-NEXT:    retq
140 ; AVX-LABEL: frint32:
141 ; AVX:       # %bb.0:
142 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
143 ; AVX-NEXT:    movzwl %ax, %eax
144 ; AVX-NEXT:    vmovd %eax, %xmm0
145 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
146 ; AVX-NEXT:    vroundss $4, %xmm0, %xmm0, %xmm0
147 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
148 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
149 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
150 ; AVX-NEXT:    vmovd %xmm0, %eax
151 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
152 ; AVX-NEXT:    retq
154 ; X86-LABEL: frint32:
155 ; X86:       # %bb.0:
156 ; X86-NEXT:    vrndscalesh $4, {{[0-9]+}}(%esp), %xmm0, %xmm0
157 ; X86-NEXT:    retl
159 ; X64-LABEL: frint32:
160 ; X64:       # %bb.0:
161 ; X64-NEXT:    vrndscalesh $4, %xmm0, %xmm0, %xmm0
162 ; X64-NEXT:    retq
163   %res = call half @llvm.experimental.constrained.rint.f16(
164                         half %f,
165                         metadata !"round.dynamic", metadata !"fpexcept.strict") #0
166   ret half %res
169 define half @fnearbyint32(half %f) #0 {
170 ; SSE2-LABEL: fnearbyint32:
171 ; SSE2:       # %bb.0:
172 ; SSE2-NEXT:    pushq %rax
173 ; SSE2-NEXT:    callq __extendhfsf2@PLT
174 ; SSE2-NEXT:    callq nearbyintf@PLT
175 ; SSE2-NEXT:    callq __truncsfhf2@PLT
176 ; SSE2-NEXT:    popq %rax
177 ; SSE2-NEXT:    retq
179 ; AVX-LABEL: fnearbyint32:
180 ; AVX:       # %bb.0:
181 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
182 ; AVX-NEXT:    movzwl %ax, %eax
183 ; AVX-NEXT:    vmovd %eax, %xmm0
184 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
185 ; AVX-NEXT:    vroundss $12, %xmm0, %xmm0, %xmm0
186 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
187 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
188 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
189 ; AVX-NEXT:    vmovd %xmm0, %eax
190 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
191 ; AVX-NEXT:    retq
193 ; X86-LABEL: fnearbyint32:
194 ; X86:       # %bb.0:
195 ; X86-NEXT:    vrndscalesh $12, {{[0-9]+}}(%esp), %xmm0, %xmm0
196 ; X86-NEXT:    retl
198 ; X64-LABEL: fnearbyint32:
199 ; X64:       # %bb.0:
200 ; X64-NEXT:    vrndscalesh $12, %xmm0, %xmm0, %xmm0
201 ; X64-NEXT:    retq
202   %res = call half @llvm.experimental.constrained.nearbyint.f16(
203                         half %f,
204                         metadata !"round.dynamic", metadata !"fpexcept.strict") #0
205   ret half %res
208 define half @froundeven16(half %f) #0 {
209 ; SSE2-LABEL: froundeven16:
210 ; SSE2:       # %bb.0:
211 ; SSE2-NEXT:    pushq %rax
212 ; SSE2-NEXT:    callq __extendhfsf2@PLT
213 ; SSE2-NEXT:    callq roundevenf@PLT
214 ; SSE2-NEXT:    callq __truncsfhf2@PLT
215 ; SSE2-NEXT:    popq %rax
216 ; SSE2-NEXT:    retq
218 ; AVX-LABEL: froundeven16:
219 ; AVX:       # %bb.0:
220 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
221 ; AVX-NEXT:    movzwl %ax, %eax
222 ; AVX-NEXT:    vmovd %eax, %xmm0
223 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
224 ; AVX-NEXT:    vroundss $8, %xmm0, %xmm0, %xmm0
225 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
226 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
227 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
228 ; AVX-NEXT:    vmovd %xmm0, %eax
229 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
230 ; AVX-NEXT:    retq
232 ; X86-LABEL: froundeven16:
233 ; X86:       # %bb.0:
234 ; X86-NEXT:    vrndscalesh $8, {{[0-9]+}}(%esp), %xmm0, %xmm0
235 ; X86-NEXT:    retl
237 ; X64-LABEL: froundeven16:
238 ; X64:       # %bb.0:
239 ; X64-NEXT:    vrndscalesh $8, %xmm0, %xmm0, %xmm0
240 ; X64-NEXT:    retq
242   %res = call half @llvm.experimental.constrained.roundeven.f16(
243                         half %f, metadata !"fpexcept.strict") #0
244   ret half %res
247 define half @fround16(half %f) #0 {
248 ; SSE2-LABEL: fround16:
249 ; SSE2:       # %bb.0:
250 ; SSE2-NEXT:    pushq %rax
251 ; SSE2-NEXT:    callq __extendhfsf2@PLT
252 ; SSE2-NEXT:    callq roundf@PLT
253 ; SSE2-NEXT:    callq __truncsfhf2@PLT
254 ; SSE2-NEXT:    popq %rax
255 ; SSE2-NEXT:    retq
257 ; AVX-LABEL: fround16:
258 ; AVX:       # %bb.0:
259 ; AVX-NEXT:    pushq %rax
260 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
261 ; AVX-NEXT:    movzwl %ax, %eax
262 ; AVX-NEXT:    vmovd %eax, %xmm0
263 ; AVX-NEXT:    vcvtph2ps %xmm0, %xmm0
264 ; AVX-NEXT:    callq roundf@PLT
265 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
266 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
267 ; AVX-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
268 ; AVX-NEXT:    vmovd %xmm0, %eax
269 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
270 ; AVX-NEXT:    popq %rax
271 ; AVX-NEXT:    retq
273 ; X86-LABEL: fround16:
274 ; X86:       # %bb.0:
275 ; X86-NEXT:    subl $8, %esp
276 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
277 ; X86-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
278 ; X86-NEXT:    vmovss %xmm0, (%esp)
279 ; X86-NEXT:    calll roundf
280 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)
281 ; X86-NEXT:    wait
282 ; X86-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
283 ; X86-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0
284 ; X86-NEXT:    addl $8, %esp
285 ; X86-NEXT:    retl
287 ; X64-LABEL: fround16:
288 ; X64:       # %bb.0:
289 ; X64-NEXT:    pushq %rax
290 ; X64-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
291 ; X64-NEXT:    callq roundf@PLT
292 ; X64-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0
293 ; X64-NEXT:    popq %rax
294 ; X64-NEXT:    retq
296   %res = call half @llvm.experimental.constrained.round.f16(
297                         half %f, metadata !"fpexcept.strict") #0
298   ret half %res
301 attributes #0 = { strictfp nounwind }