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
8static void
9adx_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, x, y, &x);
48  /* X = 0xFFFFFFFFFFFFFFFF, Y = 0x0000000000000000, C = 1.  */
49  c = _subborrow_u64 (c, x, y, &x);
50  /* X = 0x0000000000000000, Y = 0x0000000000000000, C = 1.  */
51
52  if (x != sum_ref)
53    abort ();
54}
55