1 /* { dg-do run { target { ! ia32 } } } */
2 /* { dg-options "-madx -O2" } */
3 /* { dg-require-effective-target adx } */
4 
5 #include <x86intrin.h>
6 #include "adx-check.h"
7 
8 static void
adx_test(void)9 adx_test (void)
10 {
11   volatile unsigned char c;
12   unsigned long long x;
13   volatile unsigned long long y, sum_ref;
14 
15   c = 0;
16   x = y = 0xFFFFFFFFFFFFFFFFLL;
17   sum_ref = 0xFFFFFFFFFFFFFFFELL;
18 
19   /* X = 0xFFFFFFFFFFFFFFFF, Y = 0xFFFFFFFFFFFFFFFF, C = 0.  */
20   c = _addcarryx_u64 (c, x, y, &x);
21   /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
22   c = _addcarryx_u64 (c, x, y, &x);
23   /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
24 
25   if (x != sum_ref)
26     abort ();
27 
28   c = 0;
29   x = y = 0xFFFFFFFFFFFFFFFFLL;
30   sum_ref = 0xFFFFFFFFFFFFFFFELL;
31 
32   /* X = 0xFFFFFFFFFFFFFFFF, Y = 0xFFFFFFFFFFFFFFFF, C = 0.  */
33   c = _addcarry_u64 (c, x, y, &x);
34   /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
35   c = _addcarry_u64 (c, x, y, &x);
36   /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
37 
38   if (x != sum_ref)
39     abort ();
40 
41   c = 0;
42   x = 1LL;
43   y = 0LL;
44   sum_ref = 0x0LL;
45 
46   /* X = 0x0000000000000001, Y = 0x0000000000000000, C = 0.  */
47   c = _subborrow_u64 (c, y, x, &x);
48   /* X = 0xFFFFFFFFFFFFFFFF, Y = 0x0000000000000000, C = 1.  */
49   c = _subborrow_u64 (c, y, x, &x);
50   /* X = 0x0000000000000000, Y = 0x0000000000000000, C = 1.  */
51 
52   if (x != sum_ref)
53     abort ();
54 }
55