OSDN Git Service

* gcc.target/i386/i386.exp (check_effective_target_ssse3): New.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / ssse3-pmaddubsw.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_pmaddubsw (int *i1, int *i2, int *r)
28 {
29   __m64 t1 = *(__m64 *) i1;
30   __m64 t2 = *(__m64 *) i2;
31   *(__m64 *) r = _mm_maddubs_pi16 (t1, t2);
32   _mm_empty ();
33 }
34
35 /* Test the 128-bit form */
36 static void
37 ssse3_test_pmaddubsw128 (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_maddubs_epi16 (t1, t2);
43 }
44
45 static short
46 signed_saturate_to_word(int x)
47 {
48   if (x > (int) 0x7fff)
49     return 0x7fff;
50
51   if (x < (int) 0xffff8000)
52     return 0x8000;
53
54   return (short) x;
55 }
56
57 /* Routine to manually compute the results */
58 static void
59 compute_correct_result (int *i1, int *i2, int *r)
60 {
61   unsigned char *ub1 = (unsigned char *) i1;
62   char *sb2 = (char *) i2;
63   short *sout = (short *) r;
64   int t0;
65   int i;
66
67   for (i = 0; i < 8; i++)
68     { 
69       t0 = ((int) ub1[2 * i] * (int) sb2[2 * i] +
70             (int) ub1[2 * i + 1] * (int) sb2[2 * i + 1]);
71       sout[i] = signed_saturate_to_word (t0);
72     }
73 }
74
75 static void
76 ssse3_test (void)
77 {
78   int i;
79   int r [4] __attribute__ ((aligned(16)));
80   int ck [4];
81   int fail = 0;
82
83   for (i = 0; i < 256; i += 8)
84     {
85       /* Manually compute the result */
86       compute_correct_result (&vals[i + 0], &vals[i + 4], ck);
87
88       /* Run the 64-bit tests */
89       ssse3_test_pmaddubsw (&vals[i + 0], &vals[i + 4], &r[0]);
90       ssse3_test_pmaddubsw (&vals[i + 2], &vals[i + 6], &r[2]);
91       fail += chk_128 (ck, r);
92
93       /* Run the 128-bit tests */
94       ssse3_test_pmaddubsw128 (&vals[i + 0], &vals[i + 4], r);
95       fail += chk_128 (ck, r);
96     }
97
98   if (fail != 0)
99     abort ();
100 }