OSDN Git Service

c7197c452127a09fff9c635c6247826f1648e0f7
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / ssse3-phaddw.c
1 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
2 /* { dg-require-effective-target ssse3 } */
3 /* { dg-options "-O2 -mssse3" } */
4 #include <tmmintrin.h>
5 #include <stdlib.h>
6 #include "../../gcc.dg/i386-cpuid.h"
7 #include "ssse3-vals.h"
8
9 static void ssse3_test (void);
10
11 int
12 main ()
13 {
14   unsigned long cpu_facilities;
15  
16   cpu_facilities = i386_cpuid_ecx ();
17
18   /* Run SSSE3 test only if host has SSSE3 support.  */
19   if ((cpu_facilities & bit_SSSE3))
20     ssse3_test ();
21
22   exit (0);
23 }
24
25 /* Test the 64-bit form */
26 static void
27 ssse3_test_phaddw (int *i1, int *i2, int *r)
28 {
29   __m64 t1 = *(__m64 *) i1;
30   __m64 t2 = *(__m64 *) i2;
31   *(__m64 *) r = _mm_hadd_pi16 (t1, t2);
32   _mm_empty ();
33 }
34
35 /* Test the 128-bit form */
36 static void
37 ssse3_test_phaddw128 (int *i1, int *i2, int *r)
38 {
39   /* Assumes incoming pointers are 16-byte aligned */
40   __m128i t1 = *(__m128i *) i1;
41   __m128i t2 = *(__m128i *) i2;
42   *(__m128i *) r = _mm_hadd_epi16 (t1, t2);
43 }
44
45 /* Routine to manually compute the results */
46 static void
47 compute_correct_result(int *i1, int *i2, int *r)
48 {
49   short *s1 = (short *) i1;
50   short *s2 = (short *) i2;
51   short *sout = (short *) r;
52   int i;
53
54   for (i = 0; i < 4; i++)
55     sout[i] = s1[2 * i] + s1[2 * i + 1];
56
57   for (i = 0; i < 4; i++)
58     sout[i + 4] = s2[2 * i] + s2[2 * i + 1];
59 }
60
61 static void
62 ssse3_test (void)
63 {
64   int i;
65   int r [4] __attribute__ ((aligned(16)));
66   int ck [4];
67   int fail = 0;
68
69   for (i = 0; i < 256; i += 8)
70     {
71       /* Manually compute the result */
72       compute_correct_result (&vals[i + 0], &vals[i + 4], ck);
73
74       /* Run the 64-bit tests */
75       ssse3_test_phaddw (&vals[i + 0], &vals[i + 2], &r[0]);
76       ssse3_test_phaddw (&vals[i + 4], &vals[i + 6], &r[2]);
77       fail += chk_128 (ck, r);
78
79       /* Run the 128-bit tests */
80       ssse3_test_phaddw128 (&vals[i + 0], &vals[i + 4], r);
81       fail += chk_128 (ck, r);
82     }
83
84   if (fail != 0)
85     abort ();
86 }