[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / rot16.ll
blob5a1a8da3c677bf7d6ad0f33507f3f7c374c17d33
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64
5 define i16 @foo(i16 %x, i16 %y, i16 %z) nounwind {
6 ; X32-LABEL: foo:
7 ; X32:       # %bb.0:
8 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
9 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
10 ; X32-NEXT:    rolw %cl, %ax
11 ; X32-NEXT:    retl
13 ; X64-LABEL: foo:
14 ; X64:       # %bb.0:
15 ; X64-NEXT:    movl %edx, %ecx
16 ; X64-NEXT:    movl %edi, %eax
17 ; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
18 ; X64-NEXT:    rolw %cl, %ax
19 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
20 ; X64-NEXT:    retq
21         %t0 = shl i16 %x, %z
22         %t1 = sub i16 16, %z
23         %t2 = lshr i16 %x, %t1
24         %t3 = or i16 %t2, %t0
25         ret i16 %t3
28 define i16 @bar(i16 %x, i16 %y, i16 %z) nounwind {
29 ; X32-LABEL: bar:
30 ; X32:       # %bb.0:
31 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
32 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
33 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
34 ; X32-NEXT:    andb $15, %cl
35 ; X32-NEXT:    shldw %cl, %dx, %ax
36 ; X32-NEXT:    retl
38 ; X64-LABEL: bar:
39 ; X64:       # %bb.0:
40 ; X64-NEXT:    movl %edx, %ecx
41 ; X64-NEXT:    movl %esi, %eax
42 ; X64-NEXT:    andb $15, %cl
43 ; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
44 ; X64-NEXT:    shldw %cl, %di, %ax
45 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
46 ; X64-NEXT:    retq
47         %t0 = shl i16 %y, %z
48         %t1 = sub i16 16, %z
49         %t2 = lshr i16 %x, %t1
50         %t3 = or i16 %t2, %t0
51         ret i16 %t3
54 define i16 @un(i16 %x, i16 %y, i16 %z) nounwind {
55 ; X32-LABEL: un:
56 ; X32:       # %bb.0:
57 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
58 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
59 ; X32-NEXT:    rorw %cl, %ax
60 ; X32-NEXT:    retl
62 ; X64-LABEL: un:
63 ; X64:       # %bb.0:
64 ; X64-NEXT:    movl %edx, %ecx
65 ; X64-NEXT:    movl %edi, %eax
66 ; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
67 ; X64-NEXT:    rorw %cl, %ax
68 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
69 ; X64-NEXT:    retq
70         %t0 = lshr i16 %x, %z
71         %t1 = sub i16 16, %z
72         %t2 = shl i16 %x, %t1
73         %t3 = or i16 %t2, %t0
74         ret i16 %t3
77 define i16 @bu(i16 %x, i16 %y, i16 %z) nounwind {
78 ; X32-LABEL: bu:
79 ; X32:       # %bb.0:
80 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
81 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
82 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
83 ; X32-NEXT:    andb $15, %cl
84 ; X32-NEXT:    shrdw %cl, %dx, %ax
85 ; X32-NEXT:    retl
87 ; X64-LABEL: bu:
88 ; X64:       # %bb.0:
89 ; X64-NEXT:    movl %edx, %ecx
90 ; X64-NEXT:    movl %esi, %eax
91 ; X64-NEXT:    andb $15, %cl
92 ; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
93 ; X64-NEXT:    shrdw %cl, %di, %ax
94 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
95 ; X64-NEXT:    retq
96         %t0 = lshr i16 %y, %z
97         %t1 = sub i16 16, %z
98         %t2 = shl i16 %x, %t1
99         %t3 = or i16 %t2, %t0
100         ret i16 %t3
103 define i16 @xfoo(i16 %x, i16 %y, i16 %z) nounwind {
104 ; X32-LABEL: xfoo:
105 ; X32:       # %bb.0:
106 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
107 ; X32-NEXT:    rolw $5, %ax
108 ; X32-NEXT:    retl
110 ; X64-LABEL: xfoo:
111 ; X64:       # %bb.0:
112 ; X64-NEXT:    movl %edi, %eax
113 ; X64-NEXT:    rolw $5, %ax
114 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
115 ; X64-NEXT:    retq
116         %t0 = lshr i16 %x, 11
117         %t1 = shl i16 %x, 5
118         %t2 = or i16 %t0, %t1
119         ret i16 %t2
122 define i16 @xbar(i16 %x, i16 %y, i16 %z) nounwind {
123 ; X32-LABEL: xbar:
124 ; X32:       # %bb.0:
125 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
126 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
127 ; X32-NEXT:    shldw $5, %cx, %ax
128 ; X32-NEXT:    retl
130 ; X64-LABEL: xbar:
131 ; X64:       # %bb.0:
132 ; X64-NEXT:    movl %esi, %eax
133 ; X64-NEXT:    shldw $5, %di, %ax
134 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
135 ; X64-NEXT:    retq
136         %t0 = shl i16 %y, 5
137         %t1 = lshr i16 %x, 11
138         %t2 = or i16 %t0, %t1
139         ret i16 %t2
142 define i16 @xun(i16 %x, i16 %y, i16 %z) nounwind {
143 ; X32-LABEL: xun:
144 ; X32:       # %bb.0:
145 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
146 ; X32-NEXT:    rolw $11, %ax
147 ; X32-NEXT:    retl
149 ; X64-LABEL: xun:
150 ; X64:       # %bb.0:
151 ; X64-NEXT:    movl %edi, %eax
152 ; X64-NEXT:    rolw $11, %ax
153 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
154 ; X64-NEXT:    retq
155         %t0 = lshr i16 %x, 5
156         %t1 = shl i16 %x, 11
157         %t2 = or i16 %t0, %t1
158         ret i16 %t2
161 define i16 @xbu(i16 %x, i16 %y, i16 %z) nounwind {
162 ; X32-LABEL: xbu:
163 ; X32:       # %bb.0:
164 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
165 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
166 ; X32-NEXT:    shldw $11, %cx, %ax
167 ; X32-NEXT:    retl
169 ; X64-LABEL: xbu:
170 ; X64:       # %bb.0:
171 ; X64-NEXT:    movl %edi, %eax
172 ; X64-NEXT:    shldw $11, %si, %ax
173 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
174 ; X64-NEXT:    retq
175         %t0 = lshr i16 %y, 5
176         %t1 = shl i16 %x, 11
177         %t2 = or i16 %t0, %t1
178         ret i16 %t2
181 define i32 @rot16_demandedbits(i32 %x, i32 %y) nounwind {
182 ; X32-LABEL: rot16_demandedbits:
183 ; X32:       # %bb.0:
184 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
185 ; X32-NEXT:    movl %eax, %ecx
186 ; X32-NEXT:    shrl $11, %ecx
187 ; X32-NEXT:    shll $5, %eax
188 ; X32-NEXT:    orl %ecx, %eax
189 ; X32-NEXT:    movzwl %ax, %eax
190 ; X32-NEXT:    retl
192 ; X64-LABEL: rot16_demandedbits:
193 ; X64:       # %bb.0:
194 ; X64-NEXT:    movl %edi, %eax
195 ; X64-NEXT:    shrl $11, %eax
196 ; X64-NEXT:    shll $5, %edi
197 ; X64-NEXT:    orl %eax, %edi
198 ; X64-NEXT:    movzwl %di, %eax
199 ; X64-NEXT:    retq
200         %t0 = lshr i32 %x, 11
201         %t1 = shl i32 %x, 5
202         %t2 = or i32 %t0, %t1
203         %t3 = and i32 %t2, 65535
204         ret i32 %t3
207 define i16 @rot16_trunc(i32 %x, i32 %y) nounwind {
208 ; X32-LABEL: rot16_trunc:
209 ; X32:       # %bb.0:
210 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
211 ; X32-NEXT:    movl %eax, %ecx
212 ; X32-NEXT:    shrl $11, %ecx
213 ; X32-NEXT:    shll $5, %eax
214 ; X32-NEXT:    orl %ecx, %eax
215 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
216 ; X32-NEXT:    retl
218 ; X64-LABEL: rot16_trunc:
219 ; X64:       # %bb.0:
220 ; X64-NEXT:    movl %edi, %eax
221 ; X64-NEXT:    movl %edi, %ecx
222 ; X64-NEXT:    shrl $11, %ecx
223 ; X64-NEXT:    shll $5, %eax
224 ; X64-NEXT:    orl %ecx, %eax
225 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
226 ; X64-NEXT:    retq
227         %t0 = lshr i32 %x, 11
228         %t1 = shl i32 %x, 5
229         %t2 = or i32 %t0, %t1
230         %t3 = trunc i32 %t2 to i16
231         ret i16 %t3