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