[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / divrem8_ext.ll
blobc141f914cfc030ae79718005b20cfbfc88577fae
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
5 define zeroext i8 @test_udivrem_zext_ah(i8 %x, i8 %y) {
6 ; X32-LABEL: test_udivrem_zext_ah:
7 ; X32:       # %bb.0:
8 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
9 ; X32-NEXT:    # kill: def $eax killed $eax def $ax
10 ; X32-NEXT:    divb {{[0-9]+}}(%esp)
11 ; X32-NEXT:    movzbl %ah, %ecx
12 ; X32-NEXT:    movb %al, z
13 ; X32-NEXT:    movl %ecx, %eax
14 ; X32-NEXT:    retl
16 ; X64-LABEL: test_udivrem_zext_ah:
17 ; X64:       # %bb.0:
18 ; X64-NEXT:    movzbl %dil, %eax
19 ; X64-NEXT:    # kill: def $eax killed $eax def $ax
20 ; X64-NEXT:    divb %sil
21 ; X64-NEXT:    movzbl %ah, %ecx
22 ; X64-NEXT:    movb %al, {{.*}}(%rip)
23 ; X64-NEXT:    movl %ecx, %eax
24 ; X64-NEXT:    retq
25   %div = udiv i8 %x, %y
26   store i8 %div, i8* @z
27   %1 = urem i8 %x, %y
28   ret i8 %1
31 define zeroext i8 @test_urem_zext_ah(i8 %x, i8 %y) {
32 ; X32-LABEL: test_urem_zext_ah:
33 ; X32:       # %bb.0:
34 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
35 ; X32-NEXT:    # kill: def $eax killed $eax def $ax
36 ; X32-NEXT:    divb {{[0-9]+}}(%esp)
37 ; X32-NEXT:    movzbl %ah, %eax
38 ; X32-NEXT:    # kill: def $al killed $al killed $eax
39 ; X32-NEXT:    retl
41 ; X64-LABEL: test_urem_zext_ah:
42 ; X64:       # %bb.0:
43 ; X64-NEXT:    movzbl %dil, %eax
44 ; X64-NEXT:    # kill: def $eax killed $eax def $ax
45 ; X64-NEXT:    divb %sil
46 ; X64-NEXT:    movzbl %ah, %eax
47 ; X64-NEXT:    # kill: def $al killed $al killed $eax
48 ; X64-NEXT:    retq
49   %1 = urem i8 %x, %y
50   ret i8 %1
53 define i8 @test_urem_noext_ah(i8 %x, i8 %y) {
54 ; X32-LABEL: test_urem_noext_ah:
55 ; X32:       # %bb.0:
56 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
57 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
58 ; X32-NEXT:    # kill: def $eax killed $eax def $ax
59 ; X32-NEXT:    divb %cl
60 ; X32-NEXT:    movzbl %ah, %eax
61 ; X32-NEXT:    addb %cl, %al
62 ; X32-NEXT:    # kill: def $al killed $al killed $eax
63 ; X32-NEXT:    retl
65 ; X64-LABEL: test_urem_noext_ah:
66 ; X64:       # %bb.0:
67 ; X64-NEXT:    movzbl %dil, %eax
68 ; X64-NEXT:    # kill: def $eax killed $eax def $ax
69 ; X64-NEXT:    divb %sil
70 ; X64-NEXT:    movzbl %ah, %eax
71 ; X64-NEXT:    addb %sil, %al
72 ; X64-NEXT:    # kill: def $al killed $al killed $eax
73 ; X64-NEXT:    retq
74   %1 = urem i8 %x, %y
75   %2 = add i8 %1, %y
76   ret i8 %2
79 define i64 @test_urem_zext64_ah(i8 %x, i8 %y) {
80 ; X32-LABEL: test_urem_zext64_ah:
81 ; X32:       # %bb.0:
82 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
83 ; X32-NEXT:    # kill: def $eax killed $eax def $ax
84 ; X32-NEXT:    divb {{[0-9]+}}(%esp)
85 ; X32-NEXT:    movzbl %ah, %eax
86 ; X32-NEXT:    xorl %edx, %edx
87 ; X32-NEXT:    retl
89 ; X64-LABEL: test_urem_zext64_ah:
90 ; X64:       # %bb.0:
91 ; X64-NEXT:    movzbl %dil, %eax
92 ; X64-NEXT:    # kill: def $eax killed $eax def $ax
93 ; X64-NEXT:    divb %sil
94 ; X64-NEXT:    movzbl %ah, %eax
95 ; X64-NEXT:    retq
96   %1 = urem i8 %x, %y
97   %2 = zext i8 %1 to i64
98   ret i64 %2
101 define signext i8 @test_sdivrem_sext_ah(i8 %x, i8 %y) {
102 ; X32-LABEL: test_sdivrem_sext_ah:
103 ; X32:       # %bb.0:
104 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
105 ; X32-NEXT:    cbtw
106 ; X32-NEXT:    idivb {{[0-9]+}}(%esp)
107 ; X32-NEXT:    movsbl %ah, %ecx
108 ; X32-NEXT:    movb %al, z
109 ; X32-NEXT:    movl %ecx, %eax
110 ; X32-NEXT:    retl
112 ; X64-LABEL: test_sdivrem_sext_ah:
113 ; X64:       # %bb.0:
114 ; X64-NEXT:    movl %edi, %eax
115 ; X64-NEXT:    # kill: def $al killed $al killed $eax
116 ; X64-NEXT:    cbtw
117 ; X64-NEXT:    idivb %sil
118 ; X64-NEXT:    movsbl %ah, %ecx
119 ; X64-NEXT:    movb %al, {{.*}}(%rip)
120 ; X64-NEXT:    movl %ecx, %eax
121 ; X64-NEXT:    retq
122   %div = sdiv i8 %x, %y
123   store i8 %div, i8* @z
124   %1 = srem i8 %x, %y
125   ret i8 %1
128 define signext i8 @test_srem_sext_ah(i8 %x, i8 %y) {
129 ; X32-LABEL: test_srem_sext_ah:
130 ; X32:       # %bb.0:
131 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
132 ; X32-NEXT:    cbtw
133 ; X32-NEXT:    idivb {{[0-9]+}}(%esp)
134 ; X32-NEXT:    movsbl %ah, %eax
135 ; X32-NEXT:    # kill: def $al killed $al killed $eax
136 ; X32-NEXT:    retl
138 ; X64-LABEL: test_srem_sext_ah:
139 ; X64:       # %bb.0:
140 ; X64-NEXT:    movl %edi, %eax
141 ; X64-NEXT:    # kill: def $al killed $al killed $eax
142 ; X64-NEXT:    cbtw
143 ; X64-NEXT:    idivb %sil
144 ; X64-NEXT:    movsbl %ah, %eax
145 ; X64-NEXT:    # kill: def $al killed $al killed $eax
146 ; X64-NEXT:    retq
147   %1 = srem i8 %x, %y
148   ret i8 %1
151 define i8 @test_srem_noext_ah(i8 %x, i8 %y) {
152 ; X32-LABEL: test_srem_noext_ah:
153 ; X32:       # %bb.0:
154 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
155 ; X32-NEXT:    cbtw
156 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
157 ; X32-NEXT:    idivb %cl
158 ; X32-NEXT:    movsbl %ah, %eax
159 ; X32-NEXT:    addb %cl, %al
160 ; X32-NEXT:    # kill: def $al killed $al killed $eax
161 ; X32-NEXT:    retl
163 ; X64-LABEL: test_srem_noext_ah:
164 ; X64:       # %bb.0:
165 ; X64-NEXT:    movl %edi, %eax
166 ; X64-NEXT:    # kill: def $al killed $al killed $eax
167 ; X64-NEXT:    cbtw
168 ; X64-NEXT:    idivb %sil
169 ; X64-NEXT:    movsbl %ah, %eax
170 ; X64-NEXT:    addb %sil, %al
171 ; X64-NEXT:    # kill: def $al killed $al killed $eax
172 ; X64-NEXT:    retq
173   %1 = srem i8 %x, %y
174   %2 = add i8 %1, %y
175   ret i8 %2
178 define i64 @test_srem_sext64_ah(i8 %x, i8 %y) {
179 ; X32-LABEL: test_srem_sext64_ah:
180 ; X32:       # %bb.0:
181 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
182 ; X32-NEXT:    cbtw
183 ; X32-NEXT:    idivb {{[0-9]+}}(%esp)
184 ; X32-NEXT:    movsbl %ah, %eax
185 ; X32-NEXT:    movl %eax, %edx
186 ; X32-NEXT:    sarl $31, %edx
187 ; X32-NEXT:    retl
189 ; X64-LABEL: test_srem_sext64_ah:
190 ; X64:       # %bb.0:
191 ; X64-NEXT:    movl %edi, %eax
192 ; X64-NEXT:    # kill: def $al killed $al killed $eax
193 ; X64-NEXT:    cbtw
194 ; X64-NEXT:    idivb %sil
195 ; X64-NEXT:    movsbl %ah, %eax
196 ; X64-NEXT:    cltq
197 ; X64-NEXT:    retq
198   %1 = srem i8 %x, %y
199   %2 = sext i8 %1 to i64
200   ret i64 %2
203 define i64 @pr25754(i8 %a, i8 %c) {
204 ; X32-LABEL: pr25754:
205 ; X32:       # %bb.0:
206 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
207 ; X32-NEXT:    # kill: def $eax killed $eax def $ax
208 ; X32-NEXT:    divb {{[0-9]+}}(%esp)
209 ; X32-NEXT:    movzbl %ah, %ecx
210 ; X32-NEXT:    movzbl %al, %eax
211 ; X32-NEXT:    addl %ecx, %eax
212 ; X32-NEXT:    xorl %edx, %edx
213 ; X32-NEXT:    retl
215 ; X64-LABEL: pr25754:
216 ; X64:       # %bb.0:
217 ; X64-NEXT:    movzbl %dil, %eax
218 ; X64-NEXT:    # kill: def $eax killed $eax def $ax
219 ; X64-NEXT:    divb %sil
220 ; X64-NEXT:    movzbl %ah, %ecx
221 ; X64-NEXT:    movzbl %al, %eax
222 ; X64-NEXT:    addq %rcx, %rax
223 ; X64-NEXT:    retq
224   %r1 = urem i8 %a, %c
225   %d1 = udiv i8 %a, %c
226   %r2 = zext i8 %r1 to i64
227   %d2 = zext i8 %d1 to i64
228   %ret = add i64 %r2, %d2
229   ret i64 %ret
232 @z = external global i8