OSDN Git Service

2010-12-30 Kai Tietz <kai.tietz@onevision.com>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / fma4-vector.c
1 /* Test that the compiler properly optimizes floating point multiply and add
2    instructions vector into vfmaddps on FMA4 systems.  */
3
4 /* { dg-do compile } */
5 /* { dg-require-effective-target lp64 } */
6 /* { dg-options "-O2 -mfma4 -ftree-vectorize -mtune=generic" } */
7
8 extern void exit (int);
9
10 typedef float     __m128  __attribute__ ((__vector_size__ (16), __may_alias__));
11 typedef double    __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
12
13 #define SIZE 10240
14
15 union {
16   __m128 f_align;
17   __m128d d_align;
18   float f[SIZE];
19   double d[SIZE];
20 } a, b, c, d;
21
22 void
23 flt_mul_add (void)
24 {
25   int i;
26
27   for (i = 0; i < SIZE; i++)
28     a.f[i] = (b.f[i] * c.f[i]) + d.f[i];
29 }
30
31 void
32 dbl_mul_add (void)
33 {
34   int i;
35
36   for (i = 0; i < SIZE; i++)
37     a.d[i] = (b.d[i] * c.d[i]) + d.d[i];
38 }
39
40 void
41 flt_mul_sub (void)
42 {
43   int i;
44
45   for (i = 0; i < SIZE; i++)
46     a.f[i] = (b.f[i] * c.f[i]) - d.f[i];
47 }
48
49 void
50 dbl_mul_sub (void)
51 {
52   int i;
53
54   for (i = 0; i < SIZE; i++)
55     a.d[i] = (b.d[i] * c.d[i]) - d.d[i];
56 }
57
58 void
59 flt_neg_mul_add (void)
60 {
61   int i;
62
63   for (i = 0; i < SIZE; i++)
64     a.f[i] = (-(b.f[i] * c.f[i])) + d.f[i];
65 }
66
67 void
68 dbl_neg_mul_add (void)
69 {
70   int i;
71
72   for (i = 0; i < SIZE; i++)
73     a.d[i] = (-(b.d[i] * c.d[i])) + d.d[i];
74 }
75
76 int main ()
77 {
78   flt_mul_add ();
79   flt_mul_sub ();
80   flt_neg_mul_add ();
81
82   dbl_mul_add ();
83   dbl_mul_sub ();
84   dbl_neg_mul_add ();
85   exit (0);
86 }
87
88 /* { dg-final { scan-assembler "vfmaddps" } } */
89 /* { dg-final { scan-assembler "vfmaddpd" } } */
90 /* { dg-final { scan-assembler "vfmsubps" } } */
91 /* { dg-final { scan-assembler "vfmsubpd" } } */
92 /* { dg-final { scan-assembler "vfnmaddps" } } */
93 /* { dg-final { scan-assembler "vfnmaddpd" } } */