/* { dg-do run } */ /* { dg-options "-O3 -march=z13 -mzarch --save-temps" } */ #include #include int __attribute__((noinline,noclone)) sadd (int a, int b, int *res) { return __builtin_sadd_overflow(a, b, res); } int __attribute__((noinline,noclone)) ssub (int a, int b, int *res) { return __builtin_ssub_overflow(a, b, res); } int __attribute__((noinline,noclone)) saddl (long a, long b, long *res) { return __builtin_saddl_overflow(a, b, res); } int __attribute__((noinline,noclone)) ssubl (long a, long b, long *res) { return __builtin_ssubl_overflow(a, b, res); } int __attribute__((noinline,noclone)) saddll (long long a, long long b, long long *res) { return __builtin_saddll_overflow(a, b, res); } int __attribute__((noinline,noclone)) ssubll (long long a, long long b, long long *res) { return __builtin_ssubll_overflow(a, b, res); } /* With the attribute at least main always uses the same instructions regardless of the -march setting. This is necessary for the scan-assembler-times directive below. */ int __attribute__ ((target("arch=z10"))) main () { int ret = 0; int result; long lresult; long long llresult; ret += !!sadd (INT_MAX, 1, &result); ret += !!ssub (INT_MIN, 1, &result); ret += !!saddl (LONG_MAX, 1, &lresult); ret += !!ssubl (LONG_MIN, 1, &lresult); ret += !!saddll (LLONG_MAX, 1, &llresult); ret += !!ssubll (LLONG_MIN, 1, &llresult); if (ret != 6) __builtin_abort (); return 0; } /* Check that no compare or bitop instructions are emitted. */ /* { dg-final { scan-assembler-not "\tcr" } } */ /* { dg-final { scan-assembler-not "\txr" } } */ /* { dg-final { scan-assembler-not "\tnr" } } */ /* { dg-final { scan-assembler-not "\tcgr" } } */ /* { dg-final { scan-assembler-not "\txgr" } } */ /* { dg-final { scan-assembler-not "\tngr" } } */ /* On 31 bit the long long variants use risbgn to merge the 32 bit regs into a 64 bit reg. */ /* { dg-final { scan-assembler-not "\trisbg" { target { lp64 } } } } */ /* Just one for the ret != 6 comparison. */ /* { dg-final { scan-assembler-times "ci" 1 } } */ /* { dg-final { scan-assembler-times "\tlochio\t" 6 { target { ! lp64 } } } } */ /* { dg-final { scan-assembler-times "\tlocghio\t" 6 { target lp64 } } } */