1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple "i686-unknown-unknown" -emit-llvm -x c %s -o - -O3 | FileCheck %s
2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple "x86_64-unknown-unknown" -emit-llvm -x c %s -o - -O3 | FileCheck %s
3*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple "x86_64-mingw32" -emit-llvm -x c %s -o - -O3 | FileCheck %s
4*f4a2713aSLionel Sambuc
test_addcb(unsigned char x,unsigned char y,unsigned char carryin,unsigned char * z)5*f4a2713aSLionel Sambuc unsigned char test_addcb(unsigned char x, unsigned char y,
6*f4a2713aSLionel Sambuc unsigned char carryin, unsigned char *z) {
7*f4a2713aSLionel Sambuc // CHECK: @test_addcb
8*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %x, i8 %y)
9*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 1
10*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 0
11*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %{{.+}}, i8 %carryin)
12*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 1
13*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 0
14*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
15*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i8
16*f4a2713aSLionel Sambuc // CHECK: store i8 %{{.+}}, i8* %z, align 1
17*f4a2713aSLionel Sambuc
18*f4a2713aSLionel Sambuc unsigned char carryout;
19*f4a2713aSLionel Sambuc *z = __builtin_addcb(x, y, carryin, &carryout);
20*f4a2713aSLionel Sambuc
21*f4a2713aSLionel Sambuc return carryout;
22*f4a2713aSLionel Sambuc }
23*f4a2713aSLionel Sambuc
test_addcs(unsigned short x,unsigned short y,unsigned short carryin,unsigned short * z)24*f4a2713aSLionel Sambuc unsigned short test_addcs(unsigned short x, unsigned short y,
25*f4a2713aSLionel Sambuc unsigned short carryin, unsigned short *z) {
26*f4a2713aSLionel Sambuc // CHECK: @test_addcs
27*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 %x, i16 %y)
28*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 1
29*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 0
30*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 %{{.+}}, i16 %carryin)
31*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 1
32*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 0
33*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
34*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i16
35*f4a2713aSLionel Sambuc // CHECK: store i16 %{{.+}}, i16* %z, align 2
36*f4a2713aSLionel Sambuc
37*f4a2713aSLionel Sambuc unsigned short carryout;
38*f4a2713aSLionel Sambuc *z = __builtin_addcs(x, y, carryin, &carryout);
39*f4a2713aSLionel Sambuc
40*f4a2713aSLionel Sambuc return carryout;
41*f4a2713aSLionel Sambuc }
42*f4a2713aSLionel Sambuc
test_addc(unsigned x,unsigned y,unsigned carryin,unsigned * z)43*f4a2713aSLionel Sambuc unsigned test_addc(unsigned x, unsigned y, unsigned carryin, unsigned *z) {
44*f4a2713aSLionel Sambuc // CHECK: @test_addc
45*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
46*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 1
47*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 0
48*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %{{.+}}, i32 %carryin)
49*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 1
50*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 0
51*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
52*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i32
53*f4a2713aSLionel Sambuc // CHECK: store i32 %{{.+}}, i32* %z, align 4
54*f4a2713aSLionel Sambuc unsigned carryout;
55*f4a2713aSLionel Sambuc *z = __builtin_addc(x, y, carryin, &carryout);
56*f4a2713aSLionel Sambuc
57*f4a2713aSLionel Sambuc return carryout;
58*f4a2713aSLionel Sambuc }
59*f4a2713aSLionel Sambuc
test_addcl(unsigned long x,unsigned long y,unsigned long carryin,unsigned long * z)60*f4a2713aSLionel Sambuc unsigned long test_addcl(unsigned long x, unsigned long y,
61*f4a2713aSLionel Sambuc unsigned long carryin, unsigned long *z) {
62*f4a2713aSLionel Sambuc // long is i32 on i686, i64 on x86_64.
63*f4a2713aSLionel Sambuc // CHECK: @test_addcl([[UL:i32|i64]] %x
64*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { [[UL]], i1 } @llvm.uadd.with.overflow.[[UL]]([[UL]] %x, [[UL]] %y)
65*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 1
66*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 0
67*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { [[UL]], i1 } @llvm.uadd.with.overflow.[[UL]]([[UL]] %{{.+}}, [[UL]] %carryin)
68*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 1
69*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 0
70*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
71*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to [[UL]]
72*f4a2713aSLionel Sambuc // CHECK: store [[UL]] %{{.+}}, [[UL]]* %z
73*f4a2713aSLionel Sambuc unsigned long carryout;
74*f4a2713aSLionel Sambuc *z = __builtin_addcl(x, y, carryin, &carryout);
75*f4a2713aSLionel Sambuc
76*f4a2713aSLionel Sambuc return carryout;
77*f4a2713aSLionel Sambuc }
78*f4a2713aSLionel Sambuc
test_addcll(unsigned long long x,unsigned long long y,unsigned long long carryin,unsigned long long * z)79*f4a2713aSLionel Sambuc unsigned long long test_addcll(unsigned long long x, unsigned long long y,
80*f4a2713aSLionel Sambuc unsigned long long carryin,
81*f4a2713aSLionel Sambuc unsigned long long *z) {
82*f4a2713aSLionel Sambuc // CHECK: @test_addcll
83*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %x, i64 %y)
84*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 1
85*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 0
86*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %{{.+}}, i64 %carryin)
87*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 1
88*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 0
89*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
90*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i64
91*f4a2713aSLionel Sambuc // CHECK: store i64 %{{.+}}, i64* %z
92*f4a2713aSLionel Sambuc unsigned long long carryout;
93*f4a2713aSLionel Sambuc *z = __builtin_addcll(x, y, carryin, &carryout);
94*f4a2713aSLionel Sambuc
95*f4a2713aSLionel Sambuc return carryout;
96*f4a2713aSLionel Sambuc }
97*f4a2713aSLionel Sambuc
test_subcb(unsigned char x,unsigned char y,unsigned char carryin,unsigned char * z)98*f4a2713aSLionel Sambuc unsigned char test_subcb(unsigned char x, unsigned char y,
99*f4a2713aSLionel Sambuc unsigned char carryin, unsigned char *z) {
100*f4a2713aSLionel Sambuc // CHECK: @test_subcb
101*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %x, i8 %y)
102*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 1
103*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 0
104*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %{{.+}}, i8 %carryin)
105*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 1
106*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i8, i1 } %{{.+}}, 0
107*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
108*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i8
109*f4a2713aSLionel Sambuc // CHECK: store i8 %{{.+}}, i8* %z, align 1
110*f4a2713aSLionel Sambuc
111*f4a2713aSLionel Sambuc unsigned char carryout;
112*f4a2713aSLionel Sambuc *z = __builtin_subcb(x, y, carryin, &carryout);
113*f4a2713aSLionel Sambuc
114*f4a2713aSLionel Sambuc return carryout;
115*f4a2713aSLionel Sambuc }
116*f4a2713aSLionel Sambuc
test_subcs(unsigned short x,unsigned short y,unsigned short carryin,unsigned short * z)117*f4a2713aSLionel Sambuc unsigned short test_subcs(unsigned short x, unsigned short y,
118*f4a2713aSLionel Sambuc unsigned short carryin, unsigned short *z) {
119*f4a2713aSLionel Sambuc // CHECK: @test_subcs
120*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i16, i1 } @llvm.usub.with.overflow.i16(i16 %x, i16 %y)
121*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 1
122*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 0
123*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i16, i1 } @llvm.usub.with.overflow.i16(i16 %{{.+}}, i16 %carryin)
124*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 1
125*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i16, i1 } %{{.+}}, 0
126*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
127*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i16
128*f4a2713aSLionel Sambuc // CHECK: store i16 %{{.+}}, i16* %z, align 2
129*f4a2713aSLionel Sambuc
130*f4a2713aSLionel Sambuc unsigned short carryout;
131*f4a2713aSLionel Sambuc *z = __builtin_subcs(x, y, carryin, &carryout);
132*f4a2713aSLionel Sambuc
133*f4a2713aSLionel Sambuc return carryout;
134*f4a2713aSLionel Sambuc }
135*f4a2713aSLionel Sambuc
test_subc(unsigned x,unsigned y,unsigned carryin,unsigned * z)136*f4a2713aSLionel Sambuc unsigned test_subc(unsigned x, unsigned y, unsigned carryin, unsigned *z) {
137*f4a2713aSLionel Sambuc // CHECK: @test_subc
138*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %x, i32 %y)
139*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 1
140*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 0
141*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %{{.+}}, i32 %carryin)
142*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 1
143*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i32, i1 } %{{.+}}, 0
144*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
145*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i32
146*f4a2713aSLionel Sambuc // CHECK: store i32 %{{.+}}, i32* %z, align 4
147*f4a2713aSLionel Sambuc unsigned carryout;
148*f4a2713aSLionel Sambuc *z = __builtin_subc(x, y, carryin, &carryout);
149*f4a2713aSLionel Sambuc
150*f4a2713aSLionel Sambuc return carryout;
151*f4a2713aSLionel Sambuc }
152*f4a2713aSLionel Sambuc
test_subcl(unsigned long x,unsigned long y,unsigned long carryin,unsigned long * z)153*f4a2713aSLionel Sambuc unsigned long test_subcl(unsigned long x, unsigned long y,
154*f4a2713aSLionel Sambuc unsigned long carryin, unsigned long *z) {
155*f4a2713aSLionel Sambuc // CHECK: @test_subcl([[UL:i32|i64]] %x
156*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { [[UL]], i1 } @llvm.usub.with.overflow.[[UL]]([[UL]] %x, [[UL]] %y)
157*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 1
158*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 0
159*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { [[UL]], i1 } @llvm.usub.with.overflow.[[UL]]([[UL]] %{{.+}}, [[UL]] %carryin)
160*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 1
161*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { [[UL]], i1 } %{{.+}}, 0
162*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
163*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to [[UL]]
164*f4a2713aSLionel Sambuc // CHECK: store [[UL]] %{{.+}}, [[UL]]* %z
165*f4a2713aSLionel Sambuc unsigned long carryout;
166*f4a2713aSLionel Sambuc *z = __builtin_subcl(x, y, carryin, &carryout);
167*f4a2713aSLionel Sambuc
168*f4a2713aSLionel Sambuc return carryout;
169*f4a2713aSLionel Sambuc }
170*f4a2713aSLionel Sambuc
test_subcll(unsigned long long x,unsigned long long y,unsigned long long carryin,unsigned long long * z)171*f4a2713aSLionel Sambuc unsigned long long test_subcll(unsigned long long x, unsigned long long y,
172*f4a2713aSLionel Sambuc unsigned long long carryin,
173*f4a2713aSLionel Sambuc unsigned long long *z) {
174*f4a2713aSLionel Sambuc // CHECK: @test_subcll
175*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %x, i64 %y)
176*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 1
177*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 0
178*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = {{.*}} call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %{{.+}}, i64 %carryin)
179*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 1
180*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = extractvalue { i64, i1 } %{{.+}}, 0
181*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = or i1 %{{.+}}, %{{.+}}
182*f4a2713aSLionel Sambuc // CHECK: %{{.+}} = zext i1 %{{.+}} to i64
183*f4a2713aSLionel Sambuc // CHECK: store i64 %{{.+}}, i64* %z
184*f4a2713aSLionel Sambuc unsigned long long carryout;
185*f4a2713aSLionel Sambuc *z = __builtin_subcll(x, y, carryin, &carryout);
186*f4a2713aSLionel Sambuc
187*f4a2713aSLionel Sambuc return carryout;
188*f4a2713aSLionel Sambuc }
189