blob: ebc024795872375023b95b5ac1c5dd2f21e76422 [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-O3 -march=z13 -mzarch --save-temps" } */
#include <stddef.h>
#include <limits.h>
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 } } } */