1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86
3; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64
4
5declare i4 @llvm.sadd.sat.i4(i4, i4)
6declare i8 @llvm.sadd.sat.i8(i8, i8)
7declare i16 @llvm.sadd.sat.i16(i16, i16)
8declare i32 @llvm.sadd.sat.i32(i32, i32)
9declare i64 @llvm.sadd.sat.i64(i64, i64)
10
11define i32 @func32(i32 %x, i32 %y, i32 %z) nounwind {
12; X86-LABEL: func32:
13; X86:       # %bb.0:
14; X86-NEXT:    pushl %esi
15; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
16; X86-NEXT:    imull {{[0-9]+}}(%esp), %eax
17; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
18; X86-NEXT:    xorl %ecx, %ecx
19; X86-NEXT:    movl %eax, %esi
20; X86-NEXT:    addl %edx, %esi
21; X86-NEXT:    setns %cl
22; X86-NEXT:    addl $2147483647, %ecx # imm = 0x7FFFFFFF
23; X86-NEXT:    addl %edx, %eax
24; X86-NEXT:    cmovol %ecx, %eax
25; X86-NEXT:    popl %esi
26; X86-NEXT:    retl
27;
28; X64-LABEL: func32:
29; X64:       # %bb.0:
30; X64-NEXT:    imull %edx, %esi
31; X64-NEXT:    xorl %eax, %eax
32; X64-NEXT:    movl %edi, %ecx
33; X64-NEXT:    addl %esi, %ecx
34; X64-NEXT:    setns %al
35; X64-NEXT:    addl $2147483647, %eax # imm = 0x7FFFFFFF
36; X64-NEXT:    addl %edi, %esi
37; X64-NEXT:    cmovnol %esi, %eax
38; X64-NEXT:    retq
39  %a = mul i32 %y, %z
40  %tmp = call i32 @llvm.sadd.sat.i32(i32 %x, i32 %a)
41  ret i32 %tmp
42}
43
44define i64 @func64(i64 %x, i64 %y, i64 %z) nounwind {
45; X86-LABEL: func64:
46; X86:       # %bb.0:
47; X86-NEXT:    pushl %ebx
48; X86-NEXT:    pushl %esi
49; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
50; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
51; X86-NEXT:    addl {{[0-9]+}}(%esp), %ecx
52; X86-NEXT:    adcl {{[0-9]+}}(%esp), %esi
53; X86-NEXT:    seto %bl
54; X86-NEXT:    movl %esi, %eax
55; X86-NEXT:    sarl $31, %eax
56; X86-NEXT:    testb %bl, %bl
57; X86-NEXT:    cmovel %ecx, %eax
58; X86-NEXT:    xorl %edx, %edx
59; X86-NEXT:    testl %esi, %esi
60; X86-NEXT:    setns %dl
61; X86-NEXT:    addl $2147483647, %edx # imm = 0x7FFFFFFF
62; X86-NEXT:    testb %bl, %bl
63; X86-NEXT:    cmovel %esi, %edx
64; X86-NEXT:    popl %esi
65; X86-NEXT:    popl %ebx
66; X86-NEXT:    retl
67;
68; X64-LABEL: func64:
69; X64:       # %bb.0:
70; X64-NEXT:    xorl %ecx, %ecx
71; X64-NEXT:    movq %rdi, %rax
72; X64-NEXT:    addq %rdx, %rax
73; X64-NEXT:    setns %cl
74; X64-NEXT:    movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF
75; X64-NEXT:    addq %rcx, %rax
76; X64-NEXT:    addq %rdx, %rdi
77; X64-NEXT:    cmovnoq %rdi, %rax
78; X64-NEXT:    retq
79  %a = mul i64 %y, %z
80  %tmp = call i64 @llvm.sadd.sat.i64(i64 %x, i64 %z)
81  ret i64 %tmp
82}
83
84define signext i16 @func16(i16 signext %x, i16 signext %y, i16 signext %z) nounwind {
85; X86-LABEL: func16:
86; X86:       # %bb.0:
87; X86-NEXT:    pushl %esi
88; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
89; X86-NEXT:    imulw {{[0-9]+}}(%esp), %ax
90; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
91; X86-NEXT:    xorl %ecx, %ecx
92; X86-NEXT:    movl %eax, %esi
93; X86-NEXT:    addw %dx, %si
94; X86-NEXT:    setns %cl
95; X86-NEXT:    addl $32767, %ecx # imm = 0x7FFF
96; X86-NEXT:    addw %dx, %ax
97; X86-NEXT:    cmovol %ecx, %eax
98; X86-NEXT:    # kill: def $ax killed $ax killed $eax
99; X86-NEXT:    popl %esi
100; X86-NEXT:    retl
101;
102; X64-LABEL: func16:
103; X64:       # %bb.0:
104; X64-NEXT:    imull %edx, %esi
105; X64-NEXT:    xorl %eax, %eax
106; X64-NEXT:    movl %edi, %ecx
107; X64-NEXT:    addw %si, %cx
108; X64-NEXT:    setns %al
109; X64-NEXT:    addl $32767, %eax # imm = 0x7FFF
110; X64-NEXT:    addw %si, %di
111; X64-NEXT:    cmovnol %edi, %eax
112; X64-NEXT:    # kill: def $ax killed $ax killed $eax
113; X64-NEXT:    retq
114  %a = mul i16 %y, %z
115  %tmp = call i16 @llvm.sadd.sat.i16(i16 %x, i16 %a)
116  ret i16 %tmp
117}
118
119define signext i8 @func8(i8 signext %x, i8 signext %y, i8 signext %z) nounwind {
120; X86-LABEL: func8:
121; X86:       # %bb.0:
122; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
123; X86-NEXT:    mulb {{[0-9]+}}(%esp)
124; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl
125; X86-NEXT:    xorl %ecx, %ecx
126; X86-NEXT:    movb %al, %ah
127; X86-NEXT:    addb %dl, %ah
128; X86-NEXT:    setns %cl
129; X86-NEXT:    addl $127, %ecx
130; X86-NEXT:    addb %dl, %al
131; X86-NEXT:    movzbl %al, %eax
132; X86-NEXT:    cmovol %ecx, %eax
133; X86-NEXT:    # kill: def $al killed $al killed $eax
134; X86-NEXT:    retl
135;
136; X64-LABEL: func8:
137; X64:       # %bb.0:
138; X64-NEXT:    movl %esi, %eax
139; X64-NEXT:    # kill: def $al killed $al killed $eax
140; X64-NEXT:    mulb %dl
141; X64-NEXT:    xorl %ecx, %ecx
142; X64-NEXT:    movl %edi, %edx
143; X64-NEXT:    addb %al, %dl
144; X64-NEXT:    setns %cl
145; X64-NEXT:    addl $127, %ecx
146; X64-NEXT:    addb %al, %dil
147; X64-NEXT:    movzbl %dil, %eax
148; X64-NEXT:    cmovol %ecx, %eax
149; X64-NEXT:    # kill: def $al killed $al killed $eax
150; X64-NEXT:    retq
151  %a = mul i8 %y, %z
152  %tmp = call i8 @llvm.sadd.sat.i8(i8 %x, i8 %a)
153  ret i8 %tmp
154}
155
156define signext i4 @func4(i4 signext %x, i4 signext %y, i4 signext %z) nounwind {
157; X86-LABEL: func4:
158; X86:       # %bb.0:
159; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
160; X86-NEXT:    mulb {{[0-9]+}}(%esp)
161; X86-NEXT:    shlb $4, %al
162; X86-NEXT:    sarb $4, %al
163; X86-NEXT:    addb {{[0-9]+}}(%esp), %al
164; X86-NEXT:    movzbl %al, %ecx
165; X86-NEXT:    cmpb $7, %al
166; X86-NEXT:    movl $7, %eax
167; X86-NEXT:    cmovll %ecx, %eax
168; X86-NEXT:    cmpb $-7, %al
169; X86-NEXT:    movl $248, %ecx
170; X86-NEXT:    cmovgel %eax, %ecx
171; X86-NEXT:    movsbl %cl, %eax
172; X86-NEXT:    retl
173;
174; X64-LABEL: func4:
175; X64:       # %bb.0:
176; X64-NEXT:    movl %esi, %eax
177; X64-NEXT:    # kill: def $al killed $al killed $eax
178; X64-NEXT:    mulb %dl
179; X64-NEXT:    shlb $4, %al
180; X64-NEXT:    sarb $4, %al
181; X64-NEXT:    addb %dil, %al
182; X64-NEXT:    movzbl %al, %eax
183; X64-NEXT:    cmpb $7, %al
184; X64-NEXT:    movl $7, %ecx
185; X64-NEXT:    cmovll %eax, %ecx
186; X64-NEXT:    cmpb $-7, %cl
187; X64-NEXT:    movl $248, %eax
188; X64-NEXT:    cmovgel %ecx, %eax
189; X64-NEXT:    movsbl %al, %eax
190; X64-NEXT:    retq
191  %a = mul i4 %y, %z
192  %tmp = call i4 @llvm.sadd.sat.i4(i4 %x, i4 %a)
193  ret i4 %tmp
194}
195