xref: /llvm-project/llvm/test/CodeGen/X86/isel-fp-to-int.ll (revision e9cb44090ff7b3feda386ca1ee1252ab47c0617e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc < %s                                   -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes X64,SDAG-X64
3; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes X64,GISEL-X64
4; RUN: llc < %s                                   -mattr=+avx512f -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes AVX512,SDAG-AVX512
5; RUN: llc < %s -global-isel -global-isel-abort=1 -mattr=+avx512f -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes AVX512,GISEL-AVX512
6
7define i64 @test_double_to_ui64(double %x) {
8; SDAG-X64-LABEL: test_double_to_ui64:
9; SDAG-X64:       # %bb.0: # %entry
10; SDAG-X64-NEXT:    cvttsd2si %xmm0, %rcx
11; SDAG-X64-NEXT:    movq %rcx, %rdx
12; SDAG-X64-NEXT:    sarq $63, %rdx
13; SDAG-X64-NEXT:    subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
14; SDAG-X64-NEXT:    cvttsd2si %xmm0, %rax
15; SDAG-X64-NEXT:    andq %rdx, %rax
16; SDAG-X64-NEXT:    orq %rcx, %rax
17; SDAG-X64-NEXT:    retq
18;
19; GISEL-X64-LABEL: test_double_to_ui64:
20; GISEL-X64:       # %bb.0: # %entry
21; GISEL-X64-NEXT:    cvttsd2si %xmm0, %rcx
22; GISEL-X64-NEXT:    movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]
23; GISEL-X64-NEXT:    movapd %xmm0, %xmm2
24; GISEL-X64-NEXT:    subsd %xmm1, %xmm2
25; GISEL-X64-NEXT:    cvttsd2si %xmm2, %rdx
26; GISEL-X64-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
27; GISEL-X64-NEXT:    xorq %rdx, %rax
28; GISEL-X64-NEXT:    xorl %edx, %edx
29; GISEL-X64-NEXT:    ucomisd %xmm1, %xmm0
30; GISEL-X64-NEXT:    setb %dl
31; GISEL-X64-NEXT:    andl $1, %edx
32; GISEL-X64-NEXT:    cmovneq %rcx, %rax
33; GISEL-X64-NEXT:    retq
34;
35; AVX512-LABEL: test_double_to_ui64:
36; AVX512:       # %bb.0: # %entry
37; AVX512-NEXT:    vcvttsd2usi %xmm0, %rax
38; AVX512-NEXT:    retq
39entry:
40  %conv = fptoui double %x to i64
41  ret i64 %conv
42}
43
44define i32 @test_double_to_ui32(double %x) {
45; X64-LABEL: test_double_to_ui32:
46; X64:       # %bb.0: # %entry
47; X64-NEXT:    cvttsd2si %xmm0, %rax
48; X64-NEXT:    # kill: def $eax killed $eax killed $rax
49; X64-NEXT:    retq
50;
51; AVX512-LABEL: test_double_to_ui32:
52; AVX512:       # %bb.0: # %entry
53; AVX512-NEXT:    vcvttsd2usi %xmm0, %eax
54; AVX512-NEXT:    retq
55entry:
56  %conv = fptoui double %x to i32
57  ret i32 %conv
58}
59
60define zeroext i16 @test_double_to_ui16(double %x) {
61; X64-LABEL: test_double_to_ui16:
62; X64:       # %bb.0: # %entry
63; X64-NEXT:    cvttsd2si %xmm0, %eax
64; X64-NEXT:    # kill: def $ax killed $ax killed $eax
65; X64-NEXT:    retq
66;
67; SDAG-AVX512-LABEL: test_double_to_ui16:
68; SDAG-AVX512:       # %bb.0: # %entry
69; SDAG-AVX512-NEXT:    vcvttsd2si %xmm0, %eax
70; SDAG-AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
71; SDAG-AVX512-NEXT:    retq
72;
73; GISEL-AVX512-LABEL: test_double_to_ui16:
74; GISEL-AVX512:       # %bb.0: # %entry
75; GISEL-AVX512-NEXT:    vcvttsd2usi %xmm0, %eax
76; GISEL-AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
77; GISEL-AVX512-NEXT:    retq
78entry:
79  %conv = fptoui double %x to i16
80  ret i16 %conv
81}
82
83define zeroext i8 @test_double_to_ui8(double %x) {
84; X64-LABEL: test_double_to_ui8:
85; X64:       # %bb.0: # %entry
86; X64-NEXT:    cvttsd2si %xmm0, %eax
87; X64-NEXT:    # kill: def $al killed $al killed $eax
88; X64-NEXT:    retq
89;
90; SDAG-AVX512-LABEL: test_double_to_ui8:
91; SDAG-AVX512:       # %bb.0: # %entry
92; SDAG-AVX512-NEXT:    vcvttsd2si %xmm0, %eax
93; SDAG-AVX512-NEXT:    # kill: def $al killed $al killed $eax
94; SDAG-AVX512-NEXT:    retq
95;
96; GISEL-AVX512-LABEL: test_double_to_ui8:
97; GISEL-AVX512:       # %bb.0: # %entry
98; GISEL-AVX512-NEXT:    vcvttsd2usi %xmm0, %eax
99; GISEL-AVX512-NEXT:    # kill: def $al killed $al killed $eax
100; GISEL-AVX512-NEXT:    retq
101entry:
102  %conv = fptoui double %x to i8
103  ret i8 %conv
104}
105
106define i64 @test_float_to_ui64(float %x) {
107; SDAG-X64-LABEL: test_float_to_ui64:
108; SDAG-X64:       # %bb.0: # %entry
109; SDAG-X64-NEXT:    cvttss2si %xmm0, %rcx
110; SDAG-X64-NEXT:    movq %rcx, %rdx
111; SDAG-X64-NEXT:    sarq $63, %rdx
112; SDAG-X64-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
113; SDAG-X64-NEXT:    cvttss2si %xmm0, %rax
114; SDAG-X64-NEXT:    andq %rdx, %rax
115; SDAG-X64-NEXT:    orq %rcx, %rax
116; SDAG-X64-NEXT:    retq
117;
118; GISEL-X64-LABEL: test_float_to_ui64:
119; GISEL-X64:       # %bb.0: # %entry
120; GISEL-X64-NEXT:    cvttss2si %xmm0, %rcx
121; GISEL-X64-NEXT:    movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]
122; GISEL-X64-NEXT:    movaps %xmm0, %xmm2
123; GISEL-X64-NEXT:    subss %xmm1, %xmm2
124; GISEL-X64-NEXT:    cvttss2si %xmm2, %rdx
125; GISEL-X64-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
126; GISEL-X64-NEXT:    xorq %rdx, %rax
127; GISEL-X64-NEXT:    xorl %edx, %edx
128; GISEL-X64-NEXT:    ucomiss %xmm1, %xmm0
129; GISEL-X64-NEXT:    setb %dl
130; GISEL-X64-NEXT:    andl $1, %edx
131; GISEL-X64-NEXT:    cmovneq %rcx, %rax
132; GISEL-X64-NEXT:    retq
133;
134; AVX512-LABEL: test_float_to_ui64:
135; AVX512:       # %bb.0: # %entry
136; AVX512-NEXT:    vcvttss2usi %xmm0, %rax
137; AVX512-NEXT:    retq
138entry:
139  %conv = fptoui float %x to i64
140  ret i64 %conv
141}
142
143define i32 @test_float_to_ui32(float %x) {
144; X64-LABEL: test_float_to_ui32:
145; X64:       # %bb.0: # %entry
146; X64-NEXT:    cvttss2si %xmm0, %rax
147; X64-NEXT:    # kill: def $eax killed $eax killed $rax
148; X64-NEXT:    retq
149;
150; AVX512-LABEL: test_float_to_ui32:
151; AVX512:       # %bb.0: # %entry
152; AVX512-NEXT:    vcvttss2usi %xmm0, %eax
153; AVX512-NEXT:    retq
154entry:
155  %conv = fptoui float %x to i32
156  ret i32 %conv
157}
158
159define zeroext i16 @test_float_to_ui16(float %x) {
160; X64-LABEL: test_float_to_ui16:
161; X64:       # %bb.0: # %entry
162; X64-NEXT:    cvttss2si %xmm0, %eax
163; X64-NEXT:    # kill: def $ax killed $ax killed $eax
164; X64-NEXT:    retq
165;
166; SDAG-AVX512-LABEL: test_float_to_ui16:
167; SDAG-AVX512:       # %bb.0: # %entry
168; SDAG-AVX512-NEXT:    vcvttss2si %xmm0, %eax
169; SDAG-AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
170; SDAG-AVX512-NEXT:    retq
171;
172; GISEL-AVX512-LABEL: test_float_to_ui16:
173; GISEL-AVX512:       # %bb.0: # %entry
174; GISEL-AVX512-NEXT:    vcvttss2usi %xmm0, %eax
175; GISEL-AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
176; GISEL-AVX512-NEXT:    retq
177entry:
178  %conv = fptoui float %x to i16
179  ret i16 %conv
180}
181
182define zeroext i8 @test_float_to_ui8(float %x) {
183; X64-LABEL: test_float_to_ui8:
184; X64:       # %bb.0: # %entry
185; X64-NEXT:    cvttss2si %xmm0, %eax
186; X64-NEXT:    # kill: def $al killed $al killed $eax
187; X64-NEXT:    retq
188;
189; SDAG-AVX512-LABEL: test_float_to_ui8:
190; SDAG-AVX512:       # %bb.0: # %entry
191; SDAG-AVX512-NEXT:    vcvttss2si %xmm0, %eax
192; SDAG-AVX512-NEXT:    # kill: def $al killed $al killed $eax
193; SDAG-AVX512-NEXT:    retq
194;
195; GISEL-AVX512-LABEL: test_float_to_ui8:
196; GISEL-AVX512:       # %bb.0: # %entry
197; GISEL-AVX512-NEXT:    vcvttss2usi %xmm0, %eax
198; GISEL-AVX512-NEXT:    # kill: def $al killed $al killed $eax
199; GISEL-AVX512-NEXT:    retq
200entry:
201  %conv = fptoui float %x to i8
202  ret i8 %conv
203}
204
205define i64 @test_double_to_si64(double %x) {
206; X64-LABEL: test_double_to_si64:
207; X64:       # %bb.0: # %entry
208; X64-NEXT:    cvttsd2si %xmm0, %rax
209; X64-NEXT:    retq
210;
211; AVX512-LABEL: test_double_to_si64:
212; AVX512:       # %bb.0: # %entry
213; AVX512-NEXT:    vcvttsd2si %xmm0, %rax
214; AVX512-NEXT:    retq
215entry:
216  %conv = fptosi double %x to i64
217  ret i64 %conv
218}
219
220define i32 @test_double_to_si32(double %x) {
221; X64-LABEL: test_double_to_si32:
222; X64:       # %bb.0: # %entry
223; X64-NEXT:    cvttsd2si %xmm0, %eax
224; X64-NEXT:    retq
225;
226; AVX512-LABEL: test_double_to_si32:
227; AVX512:       # %bb.0: # %entry
228; AVX512-NEXT:    vcvttsd2si %xmm0, %eax
229; AVX512-NEXT:    retq
230entry:
231  %conv = fptosi double %x to i32
232  ret i32 %conv
233}
234
235define signext i16 @test_double_to_si16(double %x) {
236; X64-LABEL: test_double_to_si16:
237; X64:       # %bb.0: # %entry
238; X64-NEXT:    cvttsd2si %xmm0, %eax
239; X64-NEXT:    # kill: def $ax killed $ax killed $eax
240; X64-NEXT:    retq
241;
242; AVX512-LABEL: test_double_to_si16:
243; AVX512:       # %bb.0: # %entry
244; AVX512-NEXT:    vcvttsd2si %xmm0, %eax
245; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
246; AVX512-NEXT:    retq
247entry:
248  %conv = fptosi double %x to i16
249  ret i16 %conv
250}
251
252define signext i8 @test_double_to_si8(double %x) {
253; X64-LABEL: test_double_to_si8:
254; X64:       # %bb.0: # %entry
255; X64-NEXT:    cvttsd2si %xmm0, %eax
256; X64-NEXT:    # kill: def $al killed $al killed $eax
257; X64-NEXT:    retq
258;
259; AVX512-LABEL: test_double_to_si8:
260; AVX512:       # %bb.0: # %entry
261; AVX512-NEXT:    vcvttsd2si %xmm0, %eax
262; AVX512-NEXT:    # kill: def $al killed $al killed $eax
263; AVX512-NEXT:    retq
264entry:
265  %conv = fptosi double %x to i8
266  ret i8 %conv
267}
268
269define i31 @test_double_to_si31(double %x) {
270; X64-LABEL: test_double_to_si31:
271; X64:       # %bb.0: # %entry
272; X64-NEXT:    cvttsd2si %xmm0, %eax
273; X64-NEXT:    retq
274;
275; AVX512-LABEL: test_double_to_si31:
276; AVX512:       # %bb.0: # %entry
277; AVX512-NEXT:    vcvttsd2si %xmm0, %eax
278; AVX512-NEXT:    retq
279entry:
280  %conv = fptosi double %x to i31
281  ret i31 %conv
282}
283
284define i33 @test_double_to_si33(double %x) {
285; X64-LABEL: test_double_to_si33:
286; X64:       # %bb.0: # %entry
287; X64-NEXT:    cvttsd2si %xmm0, %rax
288; X64-NEXT:    retq
289;
290; AVX512-LABEL: test_double_to_si33:
291; AVX512:       # %bb.0: # %entry
292; AVX512-NEXT:    vcvttsd2si %xmm0, %rax
293; AVX512-NEXT:    retq
294entry:
295  %conv = fptosi double %x to i33
296  ret i33 %conv
297}
298
299define i64 @test_float_to_si64(float %x) {
300; X64-LABEL: test_float_to_si64:
301; X64:       # %bb.0: # %entry
302; X64-NEXT:    cvttss2si %xmm0, %rax
303; X64-NEXT:    retq
304;
305; AVX512-LABEL: test_float_to_si64:
306; AVX512:       # %bb.0: # %entry
307; AVX512-NEXT:    vcvttss2si %xmm0, %rax
308; AVX512-NEXT:    retq
309entry:
310  %conv = fptosi float %x to i64
311  ret i64 %conv
312}
313
314define i32 @test_float_to_si32(float %x) {
315; X64-LABEL: test_float_to_si32:
316; X64:       # %bb.0: # %entry
317; X64-NEXT:    cvttss2si %xmm0, %eax
318; X64-NEXT:    retq
319;
320; AVX512-LABEL: test_float_to_si32:
321; AVX512:       # %bb.0: # %entry
322; AVX512-NEXT:    vcvttss2si %xmm0, %eax
323; AVX512-NEXT:    retq
324entry:
325  %conv = fptosi float %x to i32
326  ret i32 %conv
327}
328
329define signext i16 @test_float_to_si16(float %x) {
330; X64-LABEL: test_float_to_si16:
331; X64:       # %bb.0: # %entry
332; X64-NEXT:    cvttss2si %xmm0, %eax
333; X64-NEXT:    # kill: def $ax killed $ax killed $eax
334; X64-NEXT:    retq
335;
336; AVX512-LABEL: test_float_to_si16:
337; AVX512:       # %bb.0: # %entry
338; AVX512-NEXT:    vcvttss2si %xmm0, %eax
339; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
340; AVX512-NEXT:    retq
341entry:
342  %conv = fptosi float %x to i16
343  ret i16 %conv
344}
345
346define signext i8 @test_float_to_si8(float %x) {
347; X64-LABEL: test_float_to_si8:
348; X64:       # %bb.0: # %entry
349; X64-NEXT:    cvttss2si %xmm0, %eax
350; X64-NEXT:    # kill: def $al killed $al killed $eax
351; X64-NEXT:    retq
352;
353; AVX512-LABEL: test_float_to_si8:
354; AVX512:       # %bb.0: # %entry
355; AVX512-NEXT:    vcvttss2si %xmm0, %eax
356; AVX512-NEXT:    # kill: def $al killed $al killed $eax
357; AVX512-NEXT:    retq
358entry:
359  %conv = fptosi float %x to i8
360  ret i8 %conv
361}
362
363define i31 @test_float_to_si31(float %x) {
364; X64-LABEL: test_float_to_si31:
365; X64:       # %bb.0: # %entry
366; X64-NEXT:    cvttss2si %xmm0, %eax
367; X64-NEXT:    retq
368;
369; AVX512-LABEL: test_float_to_si31:
370; AVX512:       # %bb.0: # %entry
371; AVX512-NEXT:    vcvttss2si %xmm0, %eax
372; AVX512-NEXT:    retq
373entry:
374  %conv = fptosi float %x to i31
375  ret i31 %conv
376}
377
378define i33 @test_float_to_si33(float %x) {
379; X64-LABEL: test_float_to_si33:
380; X64:       # %bb.0: # %entry
381; X64-NEXT:    cvttss2si %xmm0, %rax
382; X64-NEXT:    retq
383;
384; AVX512-LABEL: test_float_to_si33:
385; AVX512:       # %bb.0: # %entry
386; AVX512-NEXT:    vcvttss2si %xmm0, %rax
387; AVX512-NEXT:    retq
388entry:
389  %conv = fptosi float %x to i33
390  ret i33 %conv
391}
392