1 /* { dg-do run { target aarch64*-*-* } } */
2 /* { dg-options "-O" } */
4 typedef signed long long int S
;
5 typedef unsigned long long int U
;
7 __attribute__ ((noinline
, noclone
))
8 U
upseu (U x
, S y
, int *ovf
)
11 *ovf
= __builtin_add_overflow (x
, y
, &res
);
15 usueu (U x
, U y
, int *ovf
)
18 *ovf
= __builtin_sub_overflow (x
, y
, &res
);
22 usseu (U x
, S y
, int *ovf
)
25 *ovf
= __builtin_sub_overflow (x
, y
, &res
);
32 for (i
= 0; i
< ((unsigned char) ~0); i
++)
33 for (j
= 0; j
< ((unsigned char) ~0); j
++)
35 U u1
= ((W
) i
<< ((8 - 1) * 8));
36 S s2
= ((W
) j
<< ((8 - 1) * 8)) + (-0x7fffffffffffffffLL
- 1);
37 U u2
= ((W
) j
<< ((8 - 1) * 8));
40 w
= ((W
) u1
) + ((W
) s2
);
41 if (upseu (u1
, s2
, &ovf
) != (U
) w
|| ovf
!= (w
!= (U
) w
))
43 w
= ((W
) u1
) - ((W
) u2
);
44 if (usueu (u1
, u2
, &ovf
) != (U
) w
|| ovf
!= (w
!= (U
) w
))
46 w
= ((W
) u1
) - ((W
) s2
);
47 if (usseu (u1
, s2
, &ovf
) != (U
) w
|| ovf
!= (w
!= (U
) w
))