aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/pr108862.c
blob: 065099e4d078f40d39783862bb70ea85a4415ddb (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
/* PR target/108862 */
/* { dg-do run { target int128 } } */
/* { dg-options "-O2" } */

unsigned long long a[2] = { 0x04a13945d898c296ULL, 0x0000100000000fffULL };
unsigned long long b[4] = { 0x04a13945d898c296ULL, 0, 0, 0x0000100000000fffULL };

__attribute__((noipa)) unsigned __int128
foo (int x, unsigned long long *y, unsigned long long *z)
{
  unsigned __int128 w = 0;
  for (int i = 0; i < x; i++)
    w += (unsigned __int128)*y++ * (unsigned __int128)*z--;
  return w;
}

int
main ()
{
  unsigned __int128 x = foo (1, &a[0], &a[1]);
  unsigned __int128 y = foo (2, &b[0], &b[3]);
  if ((unsigned long long) (x >> 64) != 0x0000004a13945dd3ULL
      || (unsigned long long) x != 0x9b1c8443b3909d6aULL
      || x != y)
    __builtin_abort ();
  return 0;
}