1 /* { dg-do compile } */
2 /* { dg-options "-O -fno-pie" } */
3 /* { dg-require-effective-target lp64 } */
4
5 #include <stdbool.h>
6 #include <stdint.h>
7
my_uadd_overflow(uint32_t a,uint32_t b,uint32_t * res)8 bool my_uadd_overflow (uint32_t a, uint32_t b, uint32_t *res)
9 {
10 return __builtin_add_overflow (a, b, res);
11 }
12
my_usub_overflow(uint32_t a,uint32_t b,uint32_t * res)13 bool my_usub_overflow (uint32_t a, uint32_t b, uint32_t *res)
14 {
15 return __builtin_sub_overflow (a, b, res);
16 }
17
my_uneg_overflow(uint32_t a,uint32_t * res)18 bool my_uneg_overflow (uint32_t a, uint32_t *res)
19 {
20 return __builtin_sub_overflow (0, a, res);
21 }
22
my_add_overflow(int32_t a,int32_t b,int32_t * res)23 bool my_add_overflow (int32_t a, int32_t b, int32_t *res)
24 {
25 return __builtin_add_overflow (a, b, res);
26 }
27
my_sub_overflow(int32_t a,int32_t b,int32_t * res)28 bool my_sub_overflow (int32_t a, int32_t b, int32_t *res)
29 {
30 return __builtin_sub_overflow (a, b, res);
31 }
32
my_neg_overflow(int32_t a,int32_t * res)33 bool my_neg_overflow (int32_t a, int32_t *res)
34 {
35 return __builtin_sub_overflow (0, a, res);
36 }
37
38 /* { dg-final { scan-assembler-times "addcc\t%" 2 } } */
39 /* { dg-final { scan-assembler-times "subcc\t%" 4 } } */
40 /* { dg-final { scan-assembler-times "addx\t%" 3 } } */
41 /* { dg-final { scan-assembler-times "bvs" 3 } } */
42 /* { dg-final { scan-assembler-not "cmp\t%" } } */
43 /* { dg-final { scan-assembler-not "save\t%" } } */
44