aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/s390/addsub-signed-overflow-2.c
blob: 8bd1a764bc686048c315b0934f43874d13e4a400 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* { 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 *res)
{
   return __builtin_sadd_overflow(a, -1, res);
}

int __attribute__((noinline,noclone))
ssub (int a, int *res)
{
   return __builtin_ssub_overflow(a, -1, res);
}


int __attribute__((noinline,noclone))
saddl (long a, long *res)
{
   return __builtin_saddl_overflow(a, -1, res);
}

int __attribute__((noinline,noclone))
ssubl (long a, long *res)
{
   return __builtin_ssubl_overflow(a, -1, res);
}


int __attribute__((noinline,noclone))
saddll (long long a, long long *res)
{
   return __builtin_saddll_overflow(a, -1, res);
}

int __attribute__((noinline,noclone))
ssubll (long long a, long long *res)
{
   return __builtin_ssubll_overflow(a, -1, 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_MIN, &result);
  ret += !!ssub (INT_MIN, &result);
  ret += !!saddl (LONG_MIN, &lresult);
  ret += !!ssubl (LONG_MIN, &lresult);
  ret += !!saddll (LLONG_MIN, &llresult);
  ret += !!ssubll (LLONG_MIN, &llresult);

  if (ret != 3)
    __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 != 3 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 } } } */