Skip to content

Commit c81d5b1

Browse files
committed
[X86] Add scalar test coverage for ISD::AVG nodes on 32 and 64-bit targets
1 parent c6b6e18 commit c81d5b1

File tree

4 files changed

+1060
-0
lines changed

4 files changed

+1060
-0
lines changed
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefixes=X86
3+
; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefixes=X64
4+
5+
;
6+
; fixed avg(x,y) = sub(or(x,y),ashr(xor(x,y),1))
7+
;
8+
; ext avg(x,y) = trunc(ashr(add(sext(x),sext(y),1),1))
9+
;
10+
11+
define i8 @test_fixed_i8(i8 %a0, i8 %a1) nounwind {
12+
; X86-LABEL: test_fixed_i8:
13+
; X86: # %bb.0:
14+
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
15+
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx
16+
; X86-NEXT: movl %edx, %eax
17+
; X86-NEXT: orb %cl, %al
18+
; X86-NEXT: xorb %cl, %dl
19+
; X86-NEXT: sarb %dl
20+
; X86-NEXT: subb %dl, %al
21+
; X86-NEXT: retl
22+
;
23+
; X64-LABEL: test_fixed_i8:
24+
; X64: # %bb.0:
25+
; X64-NEXT: movl %edi, %eax
26+
; X64-NEXT: orb %sil, %al
27+
; X64-NEXT: xorb %sil, %dil
28+
; X64-NEXT: sarb %dil
29+
; X64-NEXT: subb %dil, %al
30+
; X64-NEXT: retq
31+
%or = or i8 %a0, %a1
32+
%xor = xor i8 %a0, %a1
33+
%shift = ashr i8 %xor, 1
34+
%res = sub i8 %or, %shift
35+
ret i8 %res
36+
}
37+
38+
define i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {
39+
; X86-LABEL: test_ext_i8:
40+
; X86: # %bb.0:
41+
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
42+
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx
43+
; X86-NEXT: movl %edx, %eax
44+
; X86-NEXT: orb %cl, %al
45+
; X86-NEXT: xorb %cl, %dl
46+
; X86-NEXT: sarb %dl
47+
; X86-NEXT: subb %dl, %al
48+
; X86-NEXT: retl
49+
;
50+
; X64-LABEL: test_ext_i8:
51+
; X64: # %bb.0:
52+
; X64-NEXT: movl %edi, %eax
53+
; X64-NEXT: orb %sil, %al
54+
; X64-NEXT: xorb %sil, %dil
55+
; X64-NEXT: sarb %dil
56+
; X64-NEXT: subb %dil, %al
57+
; X64-NEXT: retq
58+
%x0 = sext i8 %a0 to i16
59+
%x1 = sext i8 %a1 to i16
60+
%sum = add i16 %x0, %x1
61+
%sum1 = add i16 %sum, 1
62+
%shift = ashr i16 %sum1, 1
63+
%res = trunc i16 %shift to i8
64+
ret i8 %res
65+
}
66+
67+
define i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {
68+
; X86-LABEL: test_fixed_i16:
69+
; X86: # %bb.0:
70+
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
71+
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx
72+
; X86-NEXT: movl %edx, %eax
73+
; X86-NEXT: orl %ecx, %eax
74+
; X86-NEXT: xorl %ecx, %edx
75+
; X86-NEXT: movswl %dx, %ecx
76+
; X86-NEXT: sarl %ecx
77+
; X86-NEXT: subl %ecx, %eax
78+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
79+
; X86-NEXT: retl
80+
;
81+
; X64-LABEL: test_fixed_i16:
82+
; X64: # %bb.0:
83+
; X64-NEXT: movl %edi, %eax
84+
; X64-NEXT: orl %esi, %eax
85+
; X64-NEXT: xorl %esi, %edi
86+
; X64-NEXT: movswl %di, %ecx
87+
; X64-NEXT: sarl %ecx
88+
; X64-NEXT: subl %ecx, %eax
89+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
90+
; X64-NEXT: retq
91+
%or = or i16 %a0, %a1
92+
%xor = xor i16 %a0, %a1
93+
%shift = ashr i16 %xor, 1
94+
%res = sub i16 %or, %shift
95+
ret i16 %res
96+
}
97+
98+
define i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {
99+
; X86-LABEL: test_ext_i16:
100+
; X86: # %bb.0:
101+
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
102+
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx
103+
; X86-NEXT: movl %edx, %eax
104+
; X86-NEXT: orl %ecx, %eax
105+
; X86-NEXT: xorl %ecx, %edx
106+
; X86-NEXT: movswl %dx, %ecx
107+
; X86-NEXT: sarl %ecx
108+
; X86-NEXT: subl %ecx, %eax
109+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
110+
; X86-NEXT: retl
111+
;
112+
; X64-LABEL: test_ext_i16:
113+
; X64: # %bb.0:
114+
; X64-NEXT: movl %edi, %eax
115+
; X64-NEXT: orl %esi, %eax
116+
; X64-NEXT: xorl %esi, %edi
117+
; X64-NEXT: movswl %di, %ecx
118+
; X64-NEXT: sarl %ecx
119+
; X64-NEXT: subl %ecx, %eax
120+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
121+
; X64-NEXT: retq
122+
%x0 = sext i16 %a0 to i32
123+
%x1 = sext i16 %a1 to i32
124+
%sum = add i32 %x0, %x1
125+
%sum1 = add i32 %sum, 1
126+
%shift = ashr i32 %sum1, 1
127+
%res = trunc i32 %shift to i16
128+
ret i16 %res
129+
}
130+
131+
define i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {
132+
; X86-LABEL: test_fixed_i32:
133+
; X86: # %bb.0:
134+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
135+
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
136+
; X86-NEXT: movl %edx, %eax
137+
; X86-NEXT: orl %ecx, %eax
138+
; X86-NEXT: xorl %ecx, %edx
139+
; X86-NEXT: sarl %edx
140+
; X86-NEXT: subl %edx, %eax
141+
; X86-NEXT: retl
142+
;
143+
; X64-LABEL: test_fixed_i32:
144+
; X64: # %bb.0:
145+
; X64-NEXT: movl %edi, %eax
146+
; X64-NEXT: orl %esi, %eax
147+
; X64-NEXT: xorl %esi, %edi
148+
; X64-NEXT: sarl %edi
149+
; X64-NEXT: subl %edi, %eax
150+
; X64-NEXT: retq
151+
%or = or i32 %a0, %a1
152+
%xor = xor i32 %a1, %a0
153+
%shift = ashr i32 %xor, 1
154+
%res = sub i32 %or, %shift
155+
ret i32 %res
156+
}
157+
158+
define i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {
159+
; X86-LABEL: test_ext_i32:
160+
; X86: # %bb.0:
161+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
162+
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
163+
; X86-NEXT: movl %edx, %eax
164+
; X86-NEXT: orl %ecx, %eax
165+
; X86-NEXT: xorl %ecx, %edx
166+
; X86-NEXT: sarl %edx
167+
; X86-NEXT: subl %edx, %eax
168+
; X86-NEXT: retl
169+
;
170+
; X64-LABEL: test_ext_i32:
171+
; X64: # %bb.0:
172+
; X64-NEXT: movl %edi, %eax
173+
; X64-NEXT: orl %esi, %eax
174+
; X64-NEXT: xorl %esi, %edi
175+
; X64-NEXT: sarl %edi
176+
; X64-NEXT: subl %edi, %eax
177+
; X64-NEXT: retq
178+
%x0 = sext i32 %a0 to i64
179+
%x1 = sext i32 %a1 to i64
180+
%sum = add i64 %x0, %x1
181+
%sum1 = add i64 %sum, 1
182+
%shift = ashr i64 %sum1, 1
183+
%res = trunc i64 %shift to i32
184+
ret i32 %res
185+
}
186+
187+
define i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {
188+
; X86-LABEL: test_fixed_i64:
189+
; X86: # %bb.0:
190+
; X86-NEXT: pushl %ebx
191+
; X86-NEXT: pushl %edi
192+
; X86-NEXT: pushl %esi
193+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
194+
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
195+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
196+
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
197+
; X86-NEXT: movl %eax, %edi
198+
; X86-NEXT: xorl %ecx, %edi
199+
; X86-NEXT: movl %edx, %ebx
200+
; X86-NEXT: xorl %esi, %ebx
201+
; X86-NEXT: shrdl $1, %ebx, %edi
202+
; X86-NEXT: orl %esi, %edx
203+
; X86-NEXT: sarl %ebx
204+
; X86-NEXT: orl %ecx, %eax
205+
; X86-NEXT: subl %edi, %eax
206+
; X86-NEXT: sbbl %ebx, %edx
207+
; X86-NEXT: popl %esi
208+
; X86-NEXT: popl %edi
209+
; X86-NEXT: popl %ebx
210+
; X86-NEXT: retl
211+
;
212+
; X64-LABEL: test_fixed_i64:
213+
; X64: # %bb.0:
214+
; X64-NEXT: movq %rdi, %rax
215+
; X64-NEXT: orq %rsi, %rax
216+
; X64-NEXT: xorq %rsi, %rdi
217+
; X64-NEXT: sarq %rdi
218+
; X64-NEXT: subq %rdi, %rax
219+
; X64-NEXT: retq
220+
%or = or i64 %a0, %a1
221+
%xor = xor i64 %a1, %a0
222+
%shift = ashr i64 %xor, 1
223+
%res = sub i64 %or, %shift
224+
ret i64 %res
225+
}
226+
227+
define i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {
228+
; X86-LABEL: test_ext_i64:
229+
; X86: # %bb.0:
230+
; X86-NEXT: pushl %ebx
231+
; X86-NEXT: pushl %edi
232+
; X86-NEXT: pushl %esi
233+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
234+
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
235+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
236+
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
237+
; X86-NEXT: movl %eax, %edi
238+
; X86-NEXT: xorl %ecx, %edi
239+
; X86-NEXT: movl %edx, %ebx
240+
; X86-NEXT: xorl %esi, %ebx
241+
; X86-NEXT: shrdl $1, %ebx, %edi
242+
; X86-NEXT: orl %esi, %edx
243+
; X86-NEXT: sarl %ebx
244+
; X86-NEXT: orl %ecx, %eax
245+
; X86-NEXT: subl %edi, %eax
246+
; X86-NEXT: sbbl %ebx, %edx
247+
; X86-NEXT: popl %esi
248+
; X86-NEXT: popl %edi
249+
; X86-NEXT: popl %ebx
250+
; X86-NEXT: retl
251+
;
252+
; X64-LABEL: test_ext_i64:
253+
; X64: # %bb.0:
254+
; X64-NEXT: movq %rdi, %rax
255+
; X64-NEXT: orq %rsi, %rax
256+
; X64-NEXT: xorq %rsi, %rdi
257+
; X64-NEXT: sarq %rdi
258+
; X64-NEXT: subq %rdi, %rax
259+
; X64-NEXT: retq
260+
%x0 = sext i64 %a0 to i128
261+
%x1 = sext i64 %a1 to i128
262+
%sum = add i128 %x0, %x1
263+
%sum1 = add i128 %sum, 1
264+
%shift = ashr i128 %sum1, 1
265+
%res = trunc i128 %shift to i64
266+
ret i64 %res
267+
}

0 commit comments

Comments
 (0)