/* { dg-do run } */
/* { dg-require-effective-target sse2 } */
/* { dg-options "-O3 -msse2" } */

#ifndef CHECK_H
#define CHECK_H "sse2-check.h"
#endif

#ifndef TEST
#define TEST sse2_test
#endif

#include CHECK_H

#include <stdlib.h>

#define N 512
static short a1[N], a2[N], a3[N];
static unsigned short b1[N], b2[N], b3[N];
static int c1[N], c2[N], c3[N];
static unsigned int d1[N], d2[N], d3[N];
static long long e1[N], e2[N], e3[N];
static unsigned long long g1[N], g2[N], g3[N];

__attribute__((noinline, noclone)) void
f1 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    a1[i] = a2[i] * a3[i];
}

__attribute__((noinline, noclone)) void
f2 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    b1[i] = b2[i] * b3[i];
}

__attribute__((noinline, noclone)) void
f3 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    c1[i] = c2[i] * c3[i];
}

__attribute__((noinline, noclone)) void
f4 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    d1[i] = d2[i] * d3[i];
}

__attribute__((noinline, noclone)) void
f5 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    e1[i] = e2[i] * e3[i];
}

__attribute__((noinline, noclone)) void
f6 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    g1[i] = g2[i] * g3[i];
}

__attribute__((noinline, noclone)) void
f7 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    c1[i] = a2[i] * a3[i];
}

__attribute__((noinline, noclone)) void
f8 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    d1[i] = (unsigned int) b2[i] * b3[i];
}

__attribute__((noinline, noclone)) void
f9 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    e1[i] = (long long) c2[i] * (long long) c3[i];
}

__attribute__((noinline, noclone)) void
f10 (void)
{
  int i;
  for (i = 0; i < N; ++i)
    g1[i] = (unsigned long long) d2[i] * (unsigned long long) d3[i];
}

__attribute__((noinline, noclone)) int
f11 (void)
{
  int i, r = 0;
  for (i = 0; i < N; ++i)
    r += a2[i] * a3[i];
  return r;
}

__attribute__((noinline, noclone)) unsigned int
f12 (void)
{
  int i;
  unsigned r = 0;
  for (i = 0; i < N; ++i)
    r += (unsigned int) b2[i] * b3[i];
  return r;
}

__attribute__((noinline, noclone)) long long
f13 (void)
{
  int i;
  long long r = 0;
  for (i = 0; i < N; ++i)
    r += (long long) c2[i] * (long long) c3[i];
  return r;
}

__attribute__((noinline, noclone)) unsigned long long
f14 (void)
{
  int i;
  unsigned long long r = 0;
  for (i = 0; i < N; ++i)
    r += (unsigned long long) d2[i] * (unsigned long long) d3[i];
  return r;
}

static void
TEST (void)
{
  int i;
  int s1 = 0;
  unsigned int s2 = 0;
  long long s3 = 0;
  unsigned long long s4 = 0;
  for (i = 0; i < N; ++i)
    {
      asm volatile ("" : : "r" (&s1) : "memory");
      asm volatile ("" : : "r" (&s2) : "memory");
      asm volatile ("" : : "r" (&s3) : "memory");
      asm volatile ("" : : "r" (&s4) : "memory");
      b2[i] = (int) rand ();
      b3[i] = (int) rand ();
      a2[i] = b2[i];
      a3[i] = b3[i];
      d2[i] = (((int) rand ()) << 16) | b2[i];
      d3[i] = (((int) rand ()) << 16) | b3[i];
      c2[i] = d2[i];
      c3[i] = d3[i];
      s1 += a2[i] * a3[i];
      s2 += (unsigned int) b2[i] * b3[i];
      s3 += (long long) c2[i] * (long long) c3[i];
      s4 += (unsigned long long) d2[i] * (unsigned long long) d3[i];
    }
  f1 ();
  f2 ();
  f3 ();
  f4 ();
  f5 ();
  f6 ();
  for (i = 0; i < N; ++i)
    {
      if (a1[i] != (short) (a2[i] * a3[i]))
	abort ();
      if (b1[i] != (unsigned short) (b2[i] * b3[i]))
	abort ();
      if (c1[i] != c2[i] * c3[i])
	abort ();
      if (d1[i] != d2[i] * d3[i])
	abort ();
      if (e1[i] != e2[i] * e3[i])
	abort ();
      if (g1[i] != g2[i] * g3[i])
	abort ();
    }
  f7 ();
  f8 ();
  f9 ();
  f10 ();
  for (i = 0; i < N; ++i)
    {
      if (c1[i] != a2[i] * a3[i])
	abort ();
      if (d1[i] != b2[i] * b3[i])
	abort ();
      if (e1[i] != (long long) c2[i] * (long long) c3[i])
	abort ();
      if (g1[i] != (unsigned long long) d2[i] * (unsigned long long) d3[i])
	abort ();
    }
  if (f11 () != s1 || f12 () != s2 || f13 () != s3 || f14 () != s4)
    abort ();
}
