1 /* { dg-do compile } */
2 /* { dg-require-effective-target lp64 } */
3 /* { dg-options "-O -fno-pie -mvis3" } */
4 
5 #include <stdbool.h>
6 #include <stdint.h>
7 
my_uadd_overflow(uint64_t a,uint64_t b,uint64_t * res)8 bool my_uadd_overflow (uint64_t a, uint64_t b, uint64_t *res)
9 {
10   return __builtin_add_overflow (a, b, res);
11 }
12 
my_usub_overflow(uint64_t a,uint64_t b,uint64_t * res)13 bool my_usub_overflow (uint64_t a, uint64_t b, uint64_t *res)
14 {
15   return __builtin_sub_overflow (a, b, res);
16 }
17 
my_uneg_overflow(uint64_t a,uint64_t * res)18 bool my_uneg_overflow (uint64_t a, uint64_t *res)
19 {
20   return __builtin_sub_overflow (0, a, res);
21 }
22 
my_add_overflow(int64_t a,int64_t b,int64_t * res)23 bool my_add_overflow (int64_t a, int64_t b, int64_t *res)
24 {
25   return __builtin_add_overflow (a, b, res);
26 }
27 
my_sub_overflow(int64_t a,int64_t b,int64_t * res)28 bool my_sub_overflow (int64_t a, int64_t b, int64_t *res)
29 {
30   return __builtin_sub_overflow (a, b, res);
31 }
32 
my_neg_overflow(int64_t a,int64_t * res)33 bool my_neg_overflow (int64_t a, int64_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 "addxc\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