[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / shift-and.ll
blobf1f508c225d02f9b03b12121c455f7ce719d5326
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-unknown-unknown   | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64
5 define i32 @t1(i32 %t, i32 %val) nounwind {
6 ; X32-LABEL: t1:
7 ; X32:       # BB#0:
8 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
9 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
10 ; X32-NEXT:    shll %cl, %eax
11 ; X32-NEXT:    retl
13 ; X64-LABEL: t1:
14 ; X64:       # BB#0:
15 ; X64-NEXT:    movl %edi, %ecx
16 ; X64-NEXT:    shll %cl, %esi
17 ; X64-NEXT:    movl %esi, %eax
18 ; X64-NEXT:    retq
19        %shamt = and i32 %t, 31
20        %res = shl i32 %val, %shamt
21        ret i32 %res
24 define i32 @t2(i32 %t, i32 %val) nounwind {
25 ; X32-LABEL: t2:
26 ; X32:       # BB#0:
27 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
28 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
29 ; X32-NEXT:    shll %cl, %eax
30 ; X32-NEXT:    retl
32 ; X64-LABEL: t2:
33 ; X64:       # BB#0:
34 ; X64-NEXT:    movl %edi, %ecx
35 ; X64-NEXT:    shll %cl, %esi
36 ; X64-NEXT:    movl %esi, %eax
37 ; X64-NEXT:    retq
38        %shamt = and i32 %t, 63
39        %res = shl i32 %val, %shamt
40        ret i32 %res
43 @X = internal global i16 0
45 define void @t3(i16 %t) nounwind {
46 ; X32-LABEL: t3:
47 ; X32:       # BB#0:
48 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
49 ; X32-NEXT:    sarw %cl, X
50 ; X32-NEXT:    retl
52 ; X64-LABEL: t3:
53 ; X64:       # BB#0:
54 ; X64-NEXT:    movl %edi, %ecx
55 ; X64-NEXT:    sarw %cl, {{.*}}(%rip)
56 ; X64-NEXT:    retq
57        %shamt = and i16 %t, 31
58        %tmp = load i16, i16* @X
59        %tmp1 = ashr i16 %tmp, %shamt
60        store i16 %tmp1, i16* @X
61        ret void
64 define i64 @t4(i64 %t, i64 %val) nounwind {
65 ; X32-LABEL: t4:
66 ; X32:       # BB#0:
67 ; X32-NEXT:    pushl %esi
68 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
69 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
70 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
71 ; X32-NEXT:    movl %esi, %edx
72 ; X32-NEXT:    shrl %cl, %edx
73 ; X32-NEXT:    shrdl %cl, %esi, %eax
74 ; X32-NEXT:    testb $32, %cl
75 ; X32-NEXT:    je .LBB3_2
76 ; X32-NEXT:  # BB#1:
77 ; X32-NEXT:    movl %edx, %eax
78 ; X32-NEXT:    xorl %edx, %edx
79 ; X32-NEXT:  .LBB3_2:
80 ; X32-NEXT:    popl %esi
81 ; X32-NEXT:    retl
83 ; X64-LABEL: t4:
84 ; X64:       # BB#0:
85 ; X64-NEXT:    movl %edi, %ecx
86 ; X64-NEXT:    shrq %cl, %rsi
87 ; X64-NEXT:    movq %rsi, %rax
88 ; X64-NEXT:    retq
89        %shamt = and i64 %t, 63
90        %res = lshr i64 %val, %shamt
91        ret i64 %res
94 define i64 @t5(i64 %t, i64 %val) nounwind {
95 ; X32-LABEL: t5:
96 ; X32:       # BB#0:
97 ; X32-NEXT:    pushl %esi
98 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
99 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
100 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
101 ; X32-NEXT:    movl %esi, %edx
102 ; X32-NEXT:    shrl %cl, %edx
103 ; X32-NEXT:    shrdl %cl, %esi, %eax
104 ; X32-NEXT:    testb $32, %cl
105 ; X32-NEXT:    je .LBB4_2
106 ; X32-NEXT:  # BB#1:
107 ; X32-NEXT:    movl %edx, %eax
108 ; X32-NEXT:    xorl %edx, %edx
109 ; X32-NEXT:  .LBB4_2:
110 ; X32-NEXT:    popl %esi
111 ; X32-NEXT:    retl
113 ; X64-LABEL: t5:
114 ; X64:       # BB#0:
115 ; X64-NEXT:    movl %edi, %ecx
116 ; X64-NEXT:    shrq %cl, %rsi
117 ; X64-NEXT:    movq %rsi, %rax
118 ; X64-NEXT:    retq
119        %shamt = and i64 %t, 191
120        %res = lshr i64 %val, %shamt
121        ret i64 %res
124 define void @t5ptr(i64 %t, i64* %ptr) nounwind {
125 ; X32-LABEL: t5ptr:
126 ; X32:       # BB#0:
127 ; X32-NEXT:    pushl %edi
128 ; X32-NEXT:    pushl %esi
129 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
130 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
131 ; X32-NEXT:    movl (%eax), %edx
132 ; X32-NEXT:    movl 4(%eax), %edi
133 ; X32-NEXT:    movl %edi, %esi
134 ; X32-NEXT:    shrl %cl, %esi
135 ; X32-NEXT:    shrdl %cl, %edi, %edx
136 ; X32-NEXT:    testb $32, %cl
137 ; X32-NEXT:    je .LBB5_2
138 ; X32-NEXT:  # BB#1:
139 ; X32-NEXT:    movl %esi, %edx
140 ; X32-NEXT:    xorl %esi, %esi
141 ; X32-NEXT:  .LBB5_2:
142 ; X32-NEXT:    movl %esi, 4(%eax)
143 ; X32-NEXT:    movl %edx, (%eax)
144 ; X32-NEXT:    popl %esi
145 ; X32-NEXT:    popl %edi
146 ; X32-NEXT:    retl
148 ; X64-LABEL: t5ptr:
149 ; X64:       # BB#0:
150 ; X64-NEXT:    movl %edi, %ecx
151 ; X64-NEXT:    shrq %cl, (%rsi)
152 ; X64-NEXT:    retq
153        %shamt = and i64 %t, 191
154        %tmp = load i64, i64* %ptr
155        %tmp1 = lshr i64 %tmp, %shamt
156        store i64 %tmp1, i64* %ptr
157        ret void
161 ; rdar://11866926
162 define i64 @t6(i64 %key, i64* nocapture %val) nounwind {
163 ; X32-LABEL: t6:
164 ; X32:       # BB#0:
165 ; X32-NEXT:    pushl %edi
166 ; X32-NEXT:    pushl %esi
167 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
168 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
169 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
170 ; X32-NEXT:    shrdl $3, %eax, %esi
171 ; X32-NEXT:    movl %eax, %edi
172 ; X32-NEXT:    shrl $3, %edi
173 ; X32-NEXT:    movl (%ecx), %eax
174 ; X32-NEXT:    movl 4(%ecx), %edx
175 ; X32-NEXT:    addl $-1, %eax
176 ; X32-NEXT:    adcl $-1, %edx
177 ; X32-NEXT:    andl %esi, %eax
178 ; X32-NEXT:    andl %edi, %edx
179 ; X32-NEXT:    popl %esi
180 ; X32-NEXT:    popl %edi
181 ; X32-NEXT:    retl
183 ; X64-LABEL: t6:
184 ; X64:       # BB#0:
185 ; X64-NEXT:    shrq $3, %rdi
186 ; X64-NEXT:    movq (%rsi), %rax
187 ; X64-NEXT:    decq %rax
188 ; X64-NEXT:    andq %rdi, %rax
189 ; X64-NEXT:    retq
190   %shr = lshr i64 %key, 3
191   %1 = load i64, i64* %val, align 8
192   %sub = add i64 %1, 2305843009213693951
193   %and = and i64 %sub, %shr
194   ret i64 %and
197 define i64 @big_mask_constant(i64 %x) nounwind {
198 ; X32-LABEL: big_mask_constant:
199 ; X32:       # BB#0:
200 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
201 ; X32-NEXT:    andl $4, %eax
202 ; X32-NEXT:    shll $25, %eax
203 ; X32-NEXT:    xorl %edx, %edx
204 ; X32-NEXT:    retl
206 ; X64-LABEL: big_mask_constant:
207 ; X64:       # BB#0:
208 ; X64-NEXT:    shrq $7, %rdi
209 ; X64-NEXT:    andl $134217728, %edi # imm = 0x8000000
210 ; X64-NEXT:    movq %rdi, %rax
211 ; X64-NEXT:    retq
212   %and = and i64 %x, 17179869184 ; 0x400000000
213   %sh = lshr i64 %and, 7
214   ret i64 %sh