• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
4
5define 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
15;
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
29}
30
31define 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
40;
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
51}
52
53define 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
64;
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
77}
78
79define 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
88;
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
99}
100
101define 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
111;
112; X64-LABEL: test_sdivrem_sext_ah:
113; X64:       # %bb.0:
114; X64-NEXT:    movl %edi, %eax
115; X64-NEXT:    cbtw
116; X64-NEXT:    idivb %sil
117; X64-NEXT:    movsbl %ah, %ecx
118; X64-NEXT:    movb %al, {{.*}}(%rip)
119; X64-NEXT:    movl %ecx, %eax
120; X64-NEXT:    retq
121  %div = sdiv i8 %x, %y
122  store i8 %div, i8* @z
123  %1 = srem i8 %x, %y
124  ret i8 %1
125}
126
127define signext i8 @test_srem_sext_ah(i8 %x, i8 %y) {
128; X32-LABEL: test_srem_sext_ah:
129; X32:       # %bb.0:
130; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
131; X32-NEXT:    cbtw
132; X32-NEXT:    idivb {{[0-9]+}}(%esp)
133; X32-NEXT:    movsbl %ah, %eax
134; X32-NEXT:    # kill: def $al killed $al killed $eax
135; X32-NEXT:    retl
136;
137; X64-LABEL: test_srem_sext_ah:
138; X64:       # %bb.0:
139; X64-NEXT:    movl %edi, %eax
140; X64-NEXT:    cbtw
141; X64-NEXT:    idivb %sil
142; X64-NEXT:    movsbl %ah, %eax
143; X64-NEXT:    # kill: def $al killed $al killed $eax
144; X64-NEXT:    retq
145  %1 = srem i8 %x, %y
146  ret i8 %1
147}
148
149define i8 @test_srem_noext_ah(i8 %x, i8 %y) {
150; X32-LABEL: test_srem_noext_ah:
151; X32:       # %bb.0:
152; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
153; X32-NEXT:    movb {{[0-9]+}}(%esp), %cl
154; X32-NEXT:    cbtw
155; X32-NEXT:    idivb %cl
156; X32-NEXT:    movsbl %ah, %eax
157; X32-NEXT:    addb %cl, %al
158; X32-NEXT:    # kill: def $al killed $al killed $eax
159; X32-NEXT:    retl
160;
161; X64-LABEL: test_srem_noext_ah:
162; X64:       # %bb.0:
163; X64-NEXT:    movl %edi, %eax
164; X64-NEXT:    cbtw
165; X64-NEXT:    idivb %sil
166; X64-NEXT:    movsbl %ah, %eax
167; X64-NEXT:    addb %sil, %al
168; X64-NEXT:    # kill: def $al killed $al killed $eax
169; X64-NEXT:    retq
170  %1 = srem i8 %x, %y
171  %2 = add i8 %1, %y
172  ret i8 %2
173}
174
175define i64 @test_srem_sext64_ah(i8 %x, i8 %y) {
176; X32-LABEL: test_srem_sext64_ah:
177; X32:       # %bb.0:
178; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
179; X32-NEXT:    cbtw
180; X32-NEXT:    idivb {{[0-9]+}}(%esp)
181; X32-NEXT:    movsbl %ah, %eax
182; X32-NEXT:    movl %eax, %edx
183; X32-NEXT:    sarl $31, %edx
184; X32-NEXT:    retl
185;
186; X64-LABEL: test_srem_sext64_ah:
187; X64:       # %bb.0:
188; X64-NEXT:    movl %edi, %eax
189; X64-NEXT:    cbtw
190; X64-NEXT:    idivb %sil
191; X64-NEXT:    movsbl %ah, %eax
192; X64-NEXT:    cltq
193; X64-NEXT:    retq
194  %1 = srem i8 %x, %y
195  %2 = sext i8 %1 to i64
196  ret i64 %2
197}
198
199define i64 @pr25754(i8 %a, i8 %c) {
200; X32-LABEL: pr25754:
201; X32:       # %bb.0:
202; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
203; X32-NEXT:    # kill: def $eax killed $eax def $ax
204; X32-NEXT:    divb {{[0-9]+}}(%esp)
205; X32-NEXT:    movzbl %ah, %ecx
206; X32-NEXT:    movzbl %al, %eax
207; X32-NEXT:    addl %ecx, %eax
208; X32-NEXT:    xorl %edx, %edx
209; X32-NEXT:    retl
210;
211; X64-LABEL: pr25754:
212; X64:       # %bb.0:
213; X64-NEXT:    movzbl %dil, %eax
214; X64-NEXT:    # kill: def $eax killed $eax def $ax
215; X64-NEXT:    divb %sil
216; X64-NEXT:    movzbl %ah, %ecx
217; X64-NEXT:    movzbl %al, %eax
218; X64-NEXT:    addq %rcx, %rax
219; X64-NEXT:    retq
220  %r1 = urem i8 %a, %c
221  %d1 = udiv i8 %a, %c
222  %r2 = zext i8 %r1 to i64
223  %d2 = zext i8 %d1 to i64
224  %ret = add i64 %r2, %d2
225  ret i64 %ret
226}
227
228@z = external global i8
229