1  /* { dg-do compile } */
       2  /* { dg-require-effective-target lp64 } */
       3  /* { dg-options "-O -fno-pie -mno-vis3 -mno-vis4" } */
       4  
       5  #include <stdbool.h>
       6  #include <stdint.h>
       7  
       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  
      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  
      18  bool my_uneg_overflow (uint64_t a, uint64_t *res)
      19  {
      20    return __builtin_sub_overflow (0, a, res);
      21  }
      22  
      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  
      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  
      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 "movlu\t%" 1 } } */
      41  /* { dg-final { scan-assembler-times "blu" 2 } } */
      42  /* { dg-final { scan-assembler-times "bvs" 3 } } */
      43  /* { dg-final { scan-assembler-not "cmp\t%" } } */
      44  /* { dg-final { scan-assembler-not "save\t%" } } */