1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=X64,SSE
3; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx | FileCheck %s --check-prefixes=X64,AVX,AVX1
4; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx2 | FileCheck %s --check-prefixes=X64,AVX,AVX2
5; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86
6
7; The i1 parameter is not codegen-relevant right now.
8
9declare i8 @llvm.abs.i8(i8, i1)
10declare i16 @llvm.abs.i16(i16, i1)
11declare i24 @llvm.abs.i24(i24, i1)
12declare i32 @llvm.abs.i32(i32, i1)
13declare i64 @llvm.abs.i64(i64, i1)
14declare i128 @llvm.abs.i128(i128, i1)
15
16declare <1 x i32> @llvm.abs.v1i32(<1 x i32>, i1)
17declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1)
18declare <3 x i32> @llvm.abs.v3i32(<3 x i32>, i1)
19declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)
20declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)
21
22declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)
23declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
24
25define i8 @test_i8(i8 %a) nounwind {
26; X64-LABEL: test_i8:
27; X64:       # %bb.0:
28; X64-NEXT:    # kill: def $edi killed $edi def $rdi
29; X64-NEXT:    movl %edi, %ecx
30; X64-NEXT:    sarb $7, %cl
31; X64-NEXT:    leal (%rdi,%rcx), %eax
32; X64-NEXT:    xorb %cl, %al
33; X64-NEXT:    # kill: def $al killed $al killed $eax
34; X64-NEXT:    retq
35;
36; X86-LABEL: test_i8:
37; X86:       # %bb.0:
38; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
39; X86-NEXT:    movl %eax, %ecx
40; X86-NEXT:    sarb $7, %cl
41; X86-NEXT:    addb %cl, %al
42; X86-NEXT:    xorb %cl, %al
43; X86-NEXT:    retl
44  %r = call i8 @llvm.abs.i8(i8 %a, i1 false)
45  ret i8 %r
46}
47
48define i16 @test_i16(i16 %a) nounwind {
49; X64-LABEL: test_i16:
50; X64:       # %bb.0:
51; X64-NEXT:    movl %edi, %eax
52; X64-NEXT:    negw %ax
53; X64-NEXT:    cmovsw %di, %ax
54; X64-NEXT:    retq
55;
56; X86-LABEL: test_i16:
57; X86:       # %bb.0:
58; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
59; X86-NEXT:    movl %ecx, %eax
60; X86-NEXT:    negw %ax
61; X86-NEXT:    cmovsw %cx, %ax
62; X86-NEXT:    retl
63  %r = call i16 @llvm.abs.i16(i16 %a, i1 false)
64  ret i16 %r
65}
66
67define i24 @test_i24(i24 %a) nounwind {
68; X64-LABEL: test_i24:
69; X64:       # %bb.0:
70; X64-NEXT:    shll $8, %edi
71; X64-NEXT:    sarl $8, %edi
72; X64-NEXT:    movl %edi, %eax
73; X64-NEXT:    negl %eax
74; X64-NEXT:    cmovsl %edi, %eax
75; X64-NEXT:    retq
76;
77; X86-LABEL: test_i24:
78; X86:       # %bb.0:
79; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
80; X86-NEXT:    shll $8, %ecx
81; X86-NEXT:    sarl $8, %ecx
82; X86-NEXT:    movl %ecx, %eax
83; X86-NEXT:    negl %eax
84; X86-NEXT:    cmovsl %ecx, %eax
85; X86-NEXT:    retl
86  %r = call i24 @llvm.abs.i24(i24 %a, i1 false)
87  ret i24 %r
88}
89
90define i32 @test_i32(i32 %a) nounwind {
91; X64-LABEL: test_i32:
92; X64:       # %bb.0:
93; X64-NEXT:    movl %edi, %eax
94; X64-NEXT:    negl %eax
95; X64-NEXT:    cmovsl %edi, %eax
96; X64-NEXT:    retq
97;
98; X86-LABEL: test_i32:
99; X86:       # %bb.0:
100; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
101; X86-NEXT:    movl %ecx, %eax
102; X86-NEXT:    negl %eax
103; X86-NEXT:    cmovsl %ecx, %eax
104; X86-NEXT:    retl
105  %r = call i32 @llvm.abs.i32(i32 %a, i1 false)
106  ret i32 %r
107}
108
109define i64 @test_i64(i64 %a) nounwind {
110; X64-LABEL: test_i64:
111; X64:       # %bb.0:
112; X64-NEXT:    movq %rdi, %rax
113; X64-NEXT:    negq %rax
114; X64-NEXT:    cmovsq %rdi, %rax
115; X64-NEXT:    retq
116;
117; X86-LABEL: test_i64:
118; X86:       # %bb.0:
119; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
120; X86-NEXT:    movl %edx, %ecx
121; X86-NEXT:    sarl $31, %ecx
122; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
123; X86-NEXT:    addl %ecx, %eax
124; X86-NEXT:    adcl %ecx, %edx
125; X86-NEXT:    xorl %ecx, %edx
126; X86-NEXT:    xorl %ecx, %eax
127; X86-NEXT:    retl
128  %r = call i64 @llvm.abs.i64(i64 %a, i1 false)
129  ret i64 %r
130}
131
132define i128 @test_i128(i128 %a) nounwind {
133; X64-LABEL: test_i128:
134; X64:       # %bb.0:
135; X64-NEXT:    movq %rdi, %rax
136; X64-NEXT:    movq %rsi, %rdx
137; X64-NEXT:    sarq $63, %rdx
138; X64-NEXT:    addq %rdx, %rax
139; X64-NEXT:    adcq %rdx, %rsi
140; X64-NEXT:    xorq %rdx, %rax
141; X64-NEXT:    xorq %rsi, %rdx
142; X64-NEXT:    retq
143;
144; X86-LABEL: test_i128:
145; X86:       # %bb.0:
146; X86-NEXT:    pushl %ebx
147; X86-NEXT:    pushl %edi
148; X86-NEXT:    pushl %esi
149; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
150; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
151; X86-NEXT:    movl %ecx, %edx
152; X86-NEXT:    sarl $31, %edx
153; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
154; X86-NEXT:    addl %edx, %esi
155; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
156; X86-NEXT:    adcl %edx, %edi
157; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
158; X86-NEXT:    adcl %edx, %ebx
159; X86-NEXT:    adcl %edx, %ecx
160; X86-NEXT:    xorl %edx, %ecx
161; X86-NEXT:    xorl %edx, %ebx
162; X86-NEXT:    xorl %edx, %edi
163; X86-NEXT:    xorl %edx, %esi
164; X86-NEXT:    movl %esi, (%eax)
165; X86-NEXT:    movl %edi, 4(%eax)
166; X86-NEXT:    movl %ebx, 8(%eax)
167; X86-NEXT:    movl %ecx, 12(%eax)
168; X86-NEXT:    popl %esi
169; X86-NEXT:    popl %edi
170; X86-NEXT:    popl %ebx
171; X86-NEXT:    retl $4
172  %r = call i128 @llvm.abs.i128(i128 %a, i1 false)
173  ret i128 %r
174}
175
176define <1 x i32> @test_v1i32(<1 x i32> %a) nounwind {
177; X64-LABEL: test_v1i32:
178; X64:       # %bb.0:
179; X64-NEXT:    movl %edi, %eax
180; X64-NEXT:    negl %eax
181; X64-NEXT:    cmovsl %edi, %eax
182; X64-NEXT:    retq
183;
184; X86-LABEL: test_v1i32:
185; X86:       # %bb.0:
186; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
187; X86-NEXT:    movl %ecx, %eax
188; X86-NEXT:    negl %eax
189; X86-NEXT:    cmovsl %ecx, %eax
190; X86-NEXT:    retl
191  %r = call <1 x i32> @llvm.abs.v1i32(<1 x i32> %a, i1 false)
192  ret <1 x i32> %r
193}
194
195define <2 x i32> @test_v2i32(<2 x i32> %a) nounwind {
196; SSE-LABEL: test_v2i32:
197; SSE:       # %bb.0:
198; SSE-NEXT:    movdqa %xmm0, %xmm1
199; SSE-NEXT:    psrad $31, %xmm1
200; SSE-NEXT:    paddd %xmm1, %xmm0
201; SSE-NEXT:    pxor %xmm1, %xmm0
202; SSE-NEXT:    retq
203;
204; AVX-LABEL: test_v2i32:
205; AVX:       # %bb.0:
206; AVX-NEXT:    vpabsd %xmm0, %xmm0
207; AVX-NEXT:    retq
208;
209; X86-LABEL: test_v2i32:
210; X86:       # %bb.0:
211; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
212; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
213; X86-NEXT:    movl %edx, %eax
214; X86-NEXT:    negl %eax
215; X86-NEXT:    cmovsl %edx, %eax
216; X86-NEXT:    movl %ecx, %edx
217; X86-NEXT:    negl %edx
218; X86-NEXT:    cmovsl %ecx, %edx
219; X86-NEXT:    retl
220  %r = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %a, i1 false)
221  ret <2 x i32> %r
222}
223
224define <3 x i32> @test_v3i32(<3 x i32> %a) nounwind {
225; SSE-LABEL: test_v3i32:
226; SSE:       # %bb.0:
227; SSE-NEXT:    movdqa %xmm0, %xmm1
228; SSE-NEXT:    psrad $31, %xmm1
229; SSE-NEXT:    paddd %xmm1, %xmm0
230; SSE-NEXT:    pxor %xmm1, %xmm0
231; SSE-NEXT:    retq
232;
233; AVX-LABEL: test_v3i32:
234; AVX:       # %bb.0:
235; AVX-NEXT:    vpabsd %xmm0, %xmm0
236; AVX-NEXT:    retq
237;
238; X86-LABEL: test_v3i32:
239; X86:       # %bb.0:
240; X86-NEXT:    pushl %esi
241; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
242; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
243; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
244; X86-NEXT:    movl %edx, %eax
245; X86-NEXT:    negl %eax
246; X86-NEXT:    cmovsl %edx, %eax
247; X86-NEXT:    movl %ecx, %edx
248; X86-NEXT:    negl %edx
249; X86-NEXT:    cmovsl %ecx, %edx
250; X86-NEXT:    movl %esi, %ecx
251; X86-NEXT:    negl %ecx
252; X86-NEXT:    cmovsl %esi, %ecx
253; X86-NEXT:    popl %esi
254; X86-NEXT:    retl
255  %r = call <3 x i32> @llvm.abs.v3i32(<3 x i32> %a, i1 false)
256  ret <3 x i32> %r
257}
258
259define <4 x i32> @test_v4i32(<4 x i32> %a) nounwind {
260; SSE-LABEL: test_v4i32:
261; SSE:       # %bb.0:
262; SSE-NEXT:    movdqa %xmm0, %xmm1
263; SSE-NEXT:    psrad $31, %xmm1
264; SSE-NEXT:    paddd %xmm1, %xmm0
265; SSE-NEXT:    pxor %xmm1, %xmm0
266; SSE-NEXT:    retq
267;
268; AVX-LABEL: test_v4i32:
269; AVX:       # %bb.0:
270; AVX-NEXT:    vpabsd %xmm0, %xmm0
271; AVX-NEXT:    retq
272;
273; X86-LABEL: test_v4i32:
274; X86:       # %bb.0:
275; X86-NEXT:    pushl %ebx
276; X86-NEXT:    pushl %edi
277; X86-NEXT:    pushl %esi
278; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
279; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
280; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
281; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
282; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
283; X86-NEXT:    movl %ebx, %edx
284; X86-NEXT:    negl %edx
285; X86-NEXT:    cmovsl %ebx, %edx
286; X86-NEXT:    movl %edi, %ebx
287; X86-NEXT:    negl %ebx
288; X86-NEXT:    cmovsl %edi, %ebx
289; X86-NEXT:    movl %esi, %edi
290; X86-NEXT:    negl %edi
291; X86-NEXT:    cmovsl %esi, %edi
292; X86-NEXT:    movl %ecx, %esi
293; X86-NEXT:    negl %esi
294; X86-NEXT:    cmovsl %ecx, %esi
295; X86-NEXT:    movl %esi, 12(%eax)
296; X86-NEXT:    movl %edi, 8(%eax)
297; X86-NEXT:    movl %ebx, 4(%eax)
298; X86-NEXT:    movl %edx, (%eax)
299; X86-NEXT:    popl %esi
300; X86-NEXT:    popl %edi
301; X86-NEXT:    popl %ebx
302; X86-NEXT:    retl $4
303  %r = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a, i1 false)
304  ret <4 x i32> %r
305}
306
307define <8 x i32> @test_v8i32(<8 x i32> %a) nounwind {
308; SSE-LABEL: test_v8i32:
309; SSE:       # %bb.0:
310; SSE-NEXT:    movdqa %xmm0, %xmm2
311; SSE-NEXT:    psrad $31, %xmm2
312; SSE-NEXT:    paddd %xmm2, %xmm0
313; SSE-NEXT:    pxor %xmm2, %xmm0
314; SSE-NEXT:    movdqa %xmm1, %xmm2
315; SSE-NEXT:    psrad $31, %xmm2
316; SSE-NEXT:    paddd %xmm2, %xmm1
317; SSE-NEXT:    pxor %xmm2, %xmm1
318; SSE-NEXT:    retq
319;
320; AVX1-LABEL: test_v8i32:
321; AVX1:       # %bb.0:
322; AVX1-NEXT:    vpabsd %xmm0, %xmm1
323; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
324; AVX1-NEXT:    vpabsd %xmm0, %xmm0
325; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
326; AVX1-NEXT:    retq
327;
328; AVX2-LABEL: test_v8i32:
329; AVX2:       # %bb.0:
330; AVX2-NEXT:    vpabsd %ymm0, %ymm0
331; AVX2-NEXT:    retq
332;
333; X86-LABEL: test_v8i32:
334; X86:       # %bb.0:
335; X86-NEXT:    pushl %ebp
336; X86-NEXT:    pushl %ebx
337; X86-NEXT:    pushl %edi
338; X86-NEXT:    pushl %esi
339; X86-NEXT:    subl $8, %esp
340; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
341; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
342; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
343; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
344; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
345; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
346; X86-NEXT:    movl %edx, %ecx
347; X86-NEXT:    negl %ecx
348; X86-NEXT:    cmovsl %edx, %ecx
349; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
350; X86-NEXT:    movl %esi, %ecx
351; X86-NEXT:    negl %ecx
352; X86-NEXT:    cmovsl %esi, %ecx
353; X86-NEXT:    movl %ecx, (%esp) # 4-byte Spill
354; X86-NEXT:    movl %ebx, %esi
355; X86-NEXT:    negl %esi
356; X86-NEXT:    cmovsl %ebx, %esi
357; X86-NEXT:    movl %ebp, %ebx
358; X86-NEXT:    negl %ebx
359; X86-NEXT:    cmovsl %ebp, %ebx
360; X86-NEXT:    movl %edi, %ebp
361; X86-NEXT:    negl %ebp
362; X86-NEXT:    cmovsl %edi, %ebp
363; X86-NEXT:    movl %eax, %edi
364; X86-NEXT:    negl %edi
365; X86-NEXT:    cmovsl %eax, %edi
366; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
367; X86-NEXT:    movl %ecx, %eax
368; X86-NEXT:    negl %eax
369; X86-NEXT:    cmovsl %ecx, %eax
370; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
371; X86-NEXT:    movl %edx, %ecx
372; X86-NEXT:    negl %ecx
373; X86-NEXT:    cmovsl %edx, %ecx
374; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
375; X86-NEXT:    movl %ecx, 28(%edx)
376; X86-NEXT:    movl %eax, 24(%edx)
377; X86-NEXT:    movl %edi, 20(%edx)
378; X86-NEXT:    movl %ebp, 16(%edx)
379; X86-NEXT:    movl %ebx, 12(%edx)
380; X86-NEXT:    movl %esi, 8(%edx)
381; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
382; X86-NEXT:    movl %eax, 4(%edx)
383; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
384; X86-NEXT:    movl %eax, (%edx)
385; X86-NEXT:    movl %edx, %eax
386; X86-NEXT:    addl $8, %esp
387; X86-NEXT:    popl %esi
388; X86-NEXT:    popl %edi
389; X86-NEXT:    popl %ebx
390; X86-NEXT:    popl %ebp
391; X86-NEXT:    retl $4
392  %r = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %a, i1 false)
393  ret <8 x i32> %r
394}
395
396define <8 x i16> @test_v8i16(<8 x i16> %a) nounwind {
397; SSE-LABEL: test_v8i16:
398; SSE:       # %bb.0:
399; SSE-NEXT:    pxor %xmm1, %xmm1
400; SSE-NEXT:    psubw %xmm0, %xmm1
401; SSE-NEXT:    pmaxsw %xmm1, %xmm0
402; SSE-NEXT:    retq
403;
404; AVX-LABEL: test_v8i16:
405; AVX:       # %bb.0:
406; AVX-NEXT:    vpabsw %xmm0, %xmm0
407; AVX-NEXT:    retq
408;
409; X86-LABEL: test_v8i16:
410; X86:       # %bb.0:
411; X86-NEXT:    pushl %ebp
412; X86-NEXT:    pushl %ebx
413; X86-NEXT:    pushl %edi
414; X86-NEXT:    pushl %esi
415; X86-NEXT:    pushl %eax
416; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
417; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edi
418; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ebp
419; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ebx
420; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %esi
421; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
422; X86-NEXT:    movl %edx, %ecx
423; X86-NEXT:    negw %cx
424; X86-NEXT:    cmovsw %dx, %cx
425; X86-NEXT:    movw %cx, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill
426; X86-NEXT:    movl %esi, %ecx
427; X86-NEXT:    negw %cx
428; X86-NEXT:    cmovsw %si, %cx
429; X86-NEXT:    movw %cx, (%esp) # 2-byte Spill
430; X86-NEXT:    movl %ebx, %esi
431; X86-NEXT:    negw %si
432; X86-NEXT:    cmovsw %bx, %si
433; X86-NEXT:    movl %ebp, %ebx
434; X86-NEXT:    negw %bx
435; X86-NEXT:    cmovsw %bp, %bx
436; X86-NEXT:    movl %edi, %ebp
437; X86-NEXT:    negw %bp
438; X86-NEXT:    cmovsw %di, %bp
439; X86-NEXT:    movl %eax, %edi
440; X86-NEXT:    negw %di
441; X86-NEXT:    cmovsw %ax, %di
442; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
443; X86-NEXT:    movl %ecx, %eax
444; X86-NEXT:    negw %ax
445; X86-NEXT:    cmovsw %cx, %ax
446; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
447; X86-NEXT:    movl %edx, %ecx
448; X86-NEXT:    negw %cx
449; X86-NEXT:    cmovsw %dx, %cx
450; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
451; X86-NEXT:    movw %cx, 14(%edx)
452; X86-NEXT:    movw %ax, 12(%edx)
453; X86-NEXT:    movw %di, 10(%edx)
454; X86-NEXT:    movw %bp, 8(%edx)
455; X86-NEXT:    movw %bx, 6(%edx)
456; X86-NEXT:    movw %si, 4(%edx)
457; X86-NEXT:    movzwl (%esp), %eax # 2-byte Folded Reload
458; X86-NEXT:    movw %ax, 2(%edx)
459; X86-NEXT:    movzwl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 2-byte Folded Reload
460; X86-NEXT:    movw %ax, (%edx)
461; X86-NEXT:    movl %edx, %eax
462; X86-NEXT:    addl $4, %esp
463; X86-NEXT:    popl %esi
464; X86-NEXT:    popl %edi
465; X86-NEXT:    popl %ebx
466; X86-NEXT:    popl %ebp
467; X86-NEXT:    retl $4
468  %r = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %a, i1 false)
469  ret <8 x i16> %r
470}
471
472define <16 x i8> @test_v16i8(<16 x i8> %a) nounwind {
473; SSE-LABEL: test_v16i8:
474; SSE:       # %bb.0:
475; SSE-NEXT:    pxor %xmm1, %xmm1
476; SSE-NEXT:    psubb %xmm0, %xmm1
477; SSE-NEXT:    pminub %xmm1, %xmm0
478; SSE-NEXT:    retq
479;
480; AVX-LABEL: test_v16i8:
481; AVX:       # %bb.0:
482; AVX-NEXT:    vpabsb %xmm0, %xmm0
483; AVX-NEXT:    retq
484;
485; X86-LABEL: test_v16i8:
486; X86:       # %bb.0:
487; X86-NEXT:    pushl %ebx
488; X86-NEXT:    pushl %esi
489; X86-NEXT:    subl $12, %esp
490; X86-NEXT:    movb {{[0-9]+}}(%esp), %bh
491; X86-NEXT:    movb {{[0-9]+}}(%esp), %bl
492; X86-NEXT:    movb {{[0-9]+}}(%esp), %dh
493; X86-NEXT:    movb {{[0-9]+}}(%esp), %ch
494; X86-NEXT:    movb {{[0-9]+}}(%esp), %ah
495; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl
496; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
497; X86-NEXT:    movb %cl, %al
498; X86-NEXT:    sarb $7, %al
499; X86-NEXT:    addb %al, %cl
500; X86-NEXT:    xorb %al, %cl
501; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
502; X86-NEXT:    movb %dl, %al
503; X86-NEXT:    sarb $7, %al
504; X86-NEXT:    addb %al, %dl
505; X86-NEXT:    xorb %al, %dl
506; X86-NEXT:    movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
507; X86-NEXT:    movb %ah, %al
508; X86-NEXT:    sarb $7, %al
509; X86-NEXT:    addb %al, %ah
510; X86-NEXT:    xorb %al, %ah
511; X86-NEXT:    movb %ah, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
512; X86-NEXT:    movb %ch, %al
513; X86-NEXT:    sarb $7, %al
514; X86-NEXT:    addb %al, %ch
515; X86-NEXT:    xorb %al, %ch
516; X86-NEXT:    movb %ch, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
517; X86-NEXT:    movb %dh, %al
518; X86-NEXT:    sarb $7, %al
519; X86-NEXT:    addb %al, %dh
520; X86-NEXT:    xorb %al, %dh
521; X86-NEXT:    movb %dh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
522; X86-NEXT:    movl %ebx, %eax
523; X86-NEXT:    sarb $7, %al
524; X86-NEXT:    addb %al, %bl
525; X86-NEXT:    xorb %al, %bl
526; X86-NEXT:    movb %bl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
527; X86-NEXT:    movb %bh, %al
528; X86-NEXT:    sarb $7, %al
529; X86-NEXT:    addb %al, %bh
530; X86-NEXT:    xorb %al, %bh
531; X86-NEXT:    movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
532; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
533; X86-NEXT:    movl %ecx, %eax
534; X86-NEXT:    sarb $7, %al
535; X86-NEXT:    addb %al, %cl
536; X86-NEXT:    xorb %al, %cl
537; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
538; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
539; X86-NEXT:    movl %ecx, %eax
540; X86-NEXT:    sarb $7, %al
541; X86-NEXT:    addb %al, %cl
542; X86-NEXT:    xorb %al, %cl
543; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
544; X86-NEXT:    movb {{[0-9]+}}(%esp), %bh
545; X86-NEXT:    movb %bh, %al
546; X86-NEXT:    sarb $7, %al
547; X86-NEXT:    addb %al, %bh
548; X86-NEXT:    xorb %al, %bh
549; X86-NEXT:    movb {{[0-9]+}}(%esp), %bl
550; X86-NEXT:    movl %ebx, %eax
551; X86-NEXT:    sarb $7, %al
552; X86-NEXT:    addb %al, %bl
553; X86-NEXT:    xorb %al, %bl
554; X86-NEXT:    movb {{[0-9]+}}(%esp), %dh
555; X86-NEXT:    movb %dh, %al
556; X86-NEXT:    sarb $7, %al
557; X86-NEXT:    addb %al, %dh
558; X86-NEXT:    xorb %al, %dh
559; X86-NEXT:    movb {{[0-9]+}}(%esp), %ch
560; X86-NEXT:    movb %ch, %al
561; X86-NEXT:    sarb $7, %al
562; X86-NEXT:    addb %al, %ch
563; X86-NEXT:    xorb %al, %ch
564; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl
565; X86-NEXT:    movl %edx, %eax
566; X86-NEXT:    sarb $7, %al
567; X86-NEXT:    addb %al, %dl
568; X86-NEXT:    xorb %al, %dl
569; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
570; X86-NEXT:    movl %ecx, %eax
571; X86-NEXT:    sarb $7, %al
572; X86-NEXT:    addb %al, %cl
573; X86-NEXT:    xorb %al, %cl
574; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
575; X86-NEXT:    movb %al, %ah
576; X86-NEXT:    sarb $7, %ah
577; X86-NEXT:    addb %ah, %al
578; X86-NEXT:    xorb %ah, %al
579; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
580; X86-NEXT:    movb %al, 15(%esi)
581; X86-NEXT:    movb %cl, 14(%esi)
582; X86-NEXT:    movb %dl, 13(%esi)
583; X86-NEXT:    movb %ch, 12(%esi)
584; X86-NEXT:    movb %dh, 11(%esi)
585; X86-NEXT:    movb %bl, 10(%esi)
586; X86-NEXT:    movb %bh, 9(%esi)
587; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
588; X86-NEXT:    movb %al, 8(%esi)
589; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
590; X86-NEXT:    movb %al, 7(%esi)
591; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
592; X86-NEXT:    movb %al, 6(%esi)
593; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
594; X86-NEXT:    movb %al, 5(%esi)
595; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
596; X86-NEXT:    movb %al, 4(%esi)
597; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
598; X86-NEXT:    movb %al, 3(%esi)
599; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
600; X86-NEXT:    movb %al, 2(%esi)
601; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
602; X86-NEXT:    movb %al, 1(%esi)
603; X86-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Reload
604; X86-NEXT:    movb %al, (%esi)
605; X86-NEXT:    movl %esi, %eax
606; X86-NEXT:    addl $12, %esp
607; X86-NEXT:    popl %esi
608; X86-NEXT:    popl %ebx
609; X86-NEXT:    retl $4
610  %r = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %a, i1 false)
611  ret <16 x i8> %r
612}
613