[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / sdiv-exact.ll
blob3c238d7f1bff561b805cb71f5093a0cc03e9fb8e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64
5 define i32 @test1(i32 %x) {
6 ; X86-LABEL: test1:
7 ; X86:       # %bb.0:
8 ; X86-NEXT:    imull $-1030792151, {{[0-9]+}}(%esp), %eax # imm = 0xC28F5C29
9 ; X86-NEXT:    retl
11 ; X64-LABEL: test1:
12 ; X64:       # %bb.0:
13 ; X64-NEXT:    imull $-1030792151, %edi, %eax # imm = 0xC28F5C29
14 ; X64-NEXT:    retq
15   %div = sdiv exact i32 %x, 25
16   ret i32 %div
19 define i32 @test2(i32 %x) {
20 ; X86-LABEL: test2:
21 ; X86:       # %bb.0:
22 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
23 ; X86-NEXT:    sarl $3, %eax
24 ; X86-NEXT:    imull $-1431655765, %eax, %eax # imm = 0xAAAAAAAB
25 ; X86-NEXT:    retl
27 ; X64-LABEL: test2:
28 ; X64:       # %bb.0:
29 ; X64-NEXT:    sarl $3, %edi
30 ; X64-NEXT:    imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB
31 ; X64-NEXT:    retq
32   %div = sdiv exact i32 %x, 24
33   ret i32 %div
36 define <4 x i32> @test3(<4 x i32> %x) {
37 ; X86-LABEL: test3:
38 ; X86:       # %bb.0:
39 ; X86-NEXT:    psrad $3, %xmm0
40 ; X86-NEXT:    movdqa {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]
41 ; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
42 ; X86-NEXT:    pmuludq %xmm1, %xmm0
43 ; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
44 ; X86-NEXT:    pmuludq %xmm1, %xmm2
45 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
46 ; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
47 ; X86-NEXT:    retl
49 ; X64-LABEL: test3:
50 ; X64:       # %bb.0:
51 ; X64-NEXT:    vpsrad $3, %xmm0, %xmm0
52 ; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]
53 ; X64-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
54 ; X64-NEXT:    retq
55   %div = sdiv exact <4 x i32> %x, <i32 24, i32 24, i32 24, i32 24>
56   ret <4 x i32> %div
59 define <4 x i32> @test4(<4 x i32> %x) {
60 ; X86-LABEL: test4:
61 ; X86:       # %bb.0:
62 ; X86-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]
63 ; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
64 ; X86-NEXT:    pmuludq %xmm1, %xmm0
65 ; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
66 ; X86-NEXT:    pmuludq %xmm1, %xmm2
67 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
68 ; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
69 ; X86-NEXT:    retl
71 ; X64-LABEL: test4:
72 ; X64:       # %bb.0:
73 ; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]
74 ; X64-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
75 ; X64-NEXT:    retq
76   %div = sdiv exact <4 x i32> %x, <i32 25, i32 25, i32 25, i32 25>
77   ret <4 x i32> %div
80 define <4 x i32> @test5(<4 x i32> %x) {
81 ; X86-LABEL: test5:
82 ; X86:       # %bb.0:
83 ; X86-NEXT:    movdqa %xmm0, %xmm1
84 ; X86-NEXT:    psrad $3, %xmm1
85 ; X86-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3]
86 ; X86-NEXT:    movdqa {{.*#+}} xmm2 = [2863311531,2863311531,3264175145,3264175145]
87 ; X86-NEXT:    movaps %xmm1, %xmm0
88 ; X86-NEXT:    pmuludq %xmm2, %xmm0
89 ; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
90 ; X86-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,3,3]
91 ; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
92 ; X86-NEXT:    pmuludq %xmm1, %xmm2
93 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
94 ; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
95 ; X86-NEXT:    retl
97 ; X64-LABEL: test5:
98 ; X64:       # %bb.0:
99 ; X64-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
100 ; X64-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
101 ; X64-NEXT:    retq
102   %div = sdiv exact <4 x i32> %x, <i32 24, i32 24, i32 25, i32 25>
103   ret <4 x i32> %div
106 define <4 x i32> @test6(<4 x i32> %x) {
107 ; X86-LABEL: test6:
108 ; X86:       # %bb.0:
109 ; X86-NEXT:    movdqa %xmm0, %xmm1
110 ; X86-NEXT:    psrad $3, %xmm1
111 ; X86-NEXT:    psrad $1, %xmm0
112 ; X86-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
113 ; X86-NEXT:    movdqa {{.*#+}} xmm2 = [2863311531,2863311531,3303820997,3303820997]
114 ; X86-NEXT:    movapd %xmm0, %xmm1
115 ; X86-NEXT:    pmuludq %xmm2, %xmm1
116 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
117 ; X86-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,3,3]
118 ; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
119 ; X86-NEXT:    pmuludq %xmm0, %xmm2
120 ; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
121 ; X86-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
122 ; X86-NEXT:    movdqa %xmm1, %xmm0
123 ; X86-NEXT:    retl
125 ; X64-LABEL: test6:
126 ; X64:       # %bb.0:
127 ; X64-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
128 ; X64-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
129 ; X64-NEXT:    retq
130   %div = sdiv exact <4 x i32> %x, <i32 24, i32 24, i32 26, i32 26>
131   ret <4 x i32> %div
134 define <4 x i32> @test7(<4 x i32> %x) {
135 ; X86-LABEL: test7:
136 ; X86:       # %bb.0:
137 ; X86-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,1749801491,1749801491]
138 ; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
139 ; X86-NEXT:    pmuludq %xmm1, %xmm0
140 ; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
141 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
142 ; X86-NEXT:    pmuludq %xmm2, %xmm1
143 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
144 ; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
145 ; X86-NEXT:    retl
147 ; X64-LABEL: test7:
148 ; X64:       # %bb.0:
149 ; X64-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
150 ; X64-NEXT:    retq
151   %div = sdiv exact <4 x i32> %x, <i32 25, i32 25, i32 27, i32 27>
152   ret <4 x i32> %div
155 define <4 x i32> @test8(<4 x i32> %x) {
156 ; X86-LABEL: test8:
157 ; X86:       # %bb.0:
158 ; X86-NEXT:    movdqa %xmm0, %xmm1
159 ; X86-NEXT:    psrad $3, %xmm1
160 ; X86-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
161 ; X86-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,2863311531,2863311531]
162 ; X86-NEXT:    movapd %xmm1, %xmm0
163 ; X86-NEXT:    pmuludq %xmm2, %xmm0
164 ; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
165 ; X86-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,3,3]
166 ; X86-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
167 ; X86-NEXT:    pmuludq %xmm1, %xmm2
168 ; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
169 ; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
170 ; X86-NEXT:    retl
172 ; X64-LABEL: test8:
173 ; X64:       # %bb.0:
174 ; X64-NEXT:    vpsravd {{.*}}(%rip), %xmm0, %xmm0
175 ; X64-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
176 ; X64-NEXT:    retq
177   %div = sdiv exact <4 x i32> %x, <i32 1, i32 1, i32 24, i32 24>
178   ret <4 x i32> %div