1145983Sbrueffer/* { dg-do run } */
2147197Smarkus/* { dg-require-effective-target ssse3 } */
3145983Sbrueffer/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */
4145983Sbrueffer
5145983Sbrueffer#ifndef CHECK_H
6145983Sbrueffer#define CHECK_H "ssse3-check.h"
7145983Sbrueffer#endif
8145983Sbrueffer
9145983Sbrueffer#ifndef TEST
10145983Sbrueffer#define TEST ssse3_test
11145983Sbrueffer#endif
12145983Sbrueffer
13145983Sbrueffer#include CHECK_H
14145983Sbrueffer#include "ssse3-vals.h"
15145983Sbrueffer
16145983Sbrueffer#include <tmmintrin.h>
17145983Sbrueffer
18145983Sbrueffer#ifndef __AVX__
19145983Sbrueffer/* Test the 64-bit form */
20145983Sbruefferstatic void
21145983Sbruefferssse3_test_psignb (int *i1, int *i2, int *r)
22145983Sbrueffer{
23145983Sbrueffer  __m64 t1 = *(__m64 *) i1;
24145983Sbrueffer  __m64 t2 = *(__m64 *) i2;
25145983Sbrueffer  *(__m64 *) r = _mm_sign_pi8 (t1, t2);
26145983Sbrueffer  _mm_empty ();
27145983Sbrueffer}
28237494Siwasaki#endif
29203687Sgavin
30145983Sbrueffer/* Test the 128-bit form */
31145983Sbruefferstatic void
32145983Sbruefferssse3_test_psignb128 (int *i1, int *i2, int *r)
33147197Smarkus{
34145983Sbrueffer  /* Assumes incoming pointers are 16-byte aligned */
35157365Sbrueffer  __m128i t1 = *(__m128i *) i1;
36157365Sbrueffer  __m128i t2 = *(__m128i *) i2;
37157365Sbrueffer  *(__m128i *) r = _mm_sign_epi8 (t1, t2);
38157365Sbrueffer}
39145983Sbrueffer
40157365Sbrueffer/* Routine to manually compute the results */
41157365Sbruefferstatic void
42157365Sbrueffercompute_correct_result (int *i1, int *i2, int *r)
43157365Sbrueffer{
44157365Sbrueffer  char *b1 = (char *) i1;
45157365Sbrueffer  char *b2 = (char *) i2;
46157365Sbrueffer  char *bout = (char *) r;
47157365Sbrueffer  int i;
48145983Sbrueffer
49145983Sbrueffer  for (i = 0; i < 16; i++)
50145983Sbrueffer    if (b2[i] < 0)
51147197Smarkus      bout[i] = -b1[i];
52145983Sbrueffer    else if (b2[i] == 0)
53145983Sbrueffer      bout[i] = 0;
54147197Smarkus    else
55147197Smarkus      bout[i] = b1[i];
56147197Smarkus}
57145983Sbrueffer
58145983Sbruefferstatic void
59148967SmarkusTEST (void)
60148967Smarkus{
61148967Smarkus  int i;
62148967Smarkus  int r [4] __attribute__ ((aligned(16)));
63148967Smarkus  int ck [4];
64148967Smarkus  int fail = 0;
65148967Smarkus
66148967Smarkus  for (i = 0; i < 256; i += 8)
67148967Smarkus    {
68148967Smarkus      /* Manually compute the result */
69148967Smarkus      compute_correct_result (&vals[i + 0], &vals[i + 4], ck);
70148967Smarkus
71148967Smarkus#ifndef __AVX__
72148967Smarkus      /* Run the 64-bit tests */
73148967Smarkus      ssse3_test_psignb (&vals[i + 0], &vals[i + 4], &r[0]);
74148967Smarkus      ssse3_test_psignb (&vals[i + 2], &vals[i + 6], &r[2]);
75148967Smarkus      fail += chk_128 (ck, r);
76148967Smarkus#endif
77148967Smarkus
78148967Smarkus      /* Run the 128-bit tests */
79148967Smarkus      ssse3_test_psignb128 (&vals[i + 0], &vals[i + 4], r);
80148967Smarkus      fail += chk_128 (ck, r);
81148967Smarkus    }
82148967Smarkus
83148967Smarkus  if (fail != 0)
84148967Smarkus    abort ();
85148967Smarkus}
86148967Smarkus