[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / fptosi-constant.ll
blob7baeff3246e5df65b2df0e240287cc85151cef5f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
4 ; Check constant FP to signed integer conversions that overflow the integer type.
6 define i32 @constant_v2f64_to_i32() {
7 ; CHECK-LABEL: constant_v2f64_to_i32:
8 ; CHECK:       # %bb.0:
9 ; CHECK-NEXT:    cvtsd2si {{.*}}(%rip), %eax
10 ; CHECK-NEXT:    retq
11   %r = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 5.0e+09, double undef>)
12   ret i32 %r
15 define i32 @constant_v2f64_to_i32_round_to_zero() {
16 ; CHECK-LABEL: constant_v2f64_to_i32_round_to_zero:
17 ; CHECK:       # %bb.0:
18 ; CHECK-NEXT:    cvttsd2si {{.*}}(%rip), %eax
19 ; CHECK-NEXT:    retq
20   %r = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 5.0e+09, double undef>)
21   ret i32 %r
24 define i64 @constant_v2f64_to_i64() {
25 ; CHECK-LABEL: constant_v2f64_to_i64:
26 ; CHECK:       # %bb.0:
27 ; CHECK-NEXT:    cvtsd2si {{.*}}(%rip), %rax
28 ; CHECK-NEXT:    retq
29   %r = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 5.0e+19, double undef>)
30   ret i64 %r
33 define i64 @constant_v2f64_to_i64_round_to_zero() {
34 ; CHECK-LABEL: constant_v2f64_to_i64_round_to_zero:
35 ; CHECK:       # %bb.0:
36 ; CHECK-NEXT:    cvttsd2si {{.*}}(%rip), %rax
37 ; CHECK-NEXT:    retq
38   %r = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 5.0e+19, double undef>)
39   ret i64 %r
42 define <4 x i32> @constant_v2f64_to_v4i32() {
43 ; CHECK-LABEL: constant_v2f64_to_v4i32:
44 ; CHECK:       # %bb.0:
45 ; CHECK-NEXT:    cvtpd2dq {{.*}}(%rip), %xmm0
46 ; CHECK-NEXT:    retq
47   %r = call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> <double 5.0e+09, double 5.0e+09>)
48   ret <4 x i32> %r
51 define <4 x i32> @constant_v2f64_to_v4i32_round_to_zero() {
52 ; CHECK-LABEL: constant_v2f64_to_v4i32_round_to_zero:
53 ; CHECK:       # %bb.0:
54 ; CHECK-NEXT:    cvttpd2dq {{.*}}(%rip), %xmm0
55 ; CHECK-NEXT:    retq
56   %r = call <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double> <double 5.0e+09, double 5.0e+09>)
57   ret <4 x i32> %r
60 define i32 @constant_v4f32_to_i32() {
61 ; CHECK-LABEL: constant_v4f32_to_i32:
62 ; CHECK:       # %bb.0:
63 ; CHECK-NEXT:    cvtss2si {{.*}}(%rip), %eax
64 ; CHECK-NEXT:    retq
65   %r = call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 5.0e+09, float undef, float undef, float undef>)
66   ret i32 %r
69 define i32 @constant_v4f32_to_i32_round_to_zero() {
70 ; CHECK-LABEL: constant_v4f32_to_i32_round_to_zero:
71 ; CHECK:       # %bb.0:
72 ; CHECK-NEXT:    cvttss2si {{.*}}(%rip), %eax
73 ; CHECK-NEXT:    retq
74   %r = call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 5.0e+09, float undef, float undef, float undef>)
75   ret i32 %r
78 ; 9223372036854775808.0 = 0x8000000000000000
80 define i64 @constant_v4f32_to_i64() {
81 ; CHECK-LABEL: constant_v4f32_to_i64:
82 ; CHECK:       # %bb.0:
83 ; CHECK-NEXT:    cvtss2si {{.*}}(%rip), %rax
84 ; CHECK-NEXT:    retq
85   %r = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 9223372036854775808.0, float undef, float undef, float undef>)
86   ret i64 %r
89 define i64 @constant_v4f32_to_i64_round_to_zero() {
90 ; CHECK-LABEL: constant_v4f32_to_i64_round_to_zero:
91 ; CHECK:       # %bb.0:
92 ; CHECK-NEXT:    cvttss2si {{.*}}(%rip), %rax
93 ; CHECK-NEXT:    retq
94   %r = call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 9223372036854775808.0, float undef, float undef, float undef>)
95   ret i64 %r
98 define <4 x i32> @constant_v4f32_to_v4i32() {
99 ; CHECK-LABEL: constant_v4f32_to_v4i32:
100 ; CHECK:       # %bb.0:
101 ; CHECK-NEXT:    cvtps2dq {{.*}}(%rip), %xmm0
102 ; CHECK-NEXT:    retq
103   %r = call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> <float 5.0e+09, float 5.0e+09, float 5.0e+09, float 5.0e+09>)
104   ret <4 x i32> %r
107 define <4 x i32> @constant_v4f32_to_v4i32_round_to_zero() {
108 ; CHECK-LABEL: constant_v4f32_to_v4i32_round_to_zero:
109 ; CHECK:       # %bb.0:
110 ; CHECK-NEXT:    cvttps2dq {{.*}}(%rip), %xmm0
111 ; CHECK-NEXT:    retq
112   %r = call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> <float 5.0e+09, float 5.0e+09, float 5.0e+09, float 5.0e+09>)
113   ret <4 x i32> %r
116 declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>)
117 declare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>)
119 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>)
120 declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>)
122 declare <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double>)
123 declare <4 x i32> @llvm.x86.sse2.cvttpd2dq(<2 x double>)
125 declare i32 @llvm.x86.sse.cvtss2si(<4 x float>)
126 declare i32 @llvm.x86.sse.cvttss2si(<4 x float>)
128 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>)
129 declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>)
131 declare <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float>)
132 declare <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float>)