Add AMD SSE5 support; Add iterator over function arguments; Add stdarg_p, prototype_p...
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse5-fma.c
blob598cda03c04c1b19108ca418b4d34909ad51d85f
1 /* Test that the compiler properly optimizes floating point multiply and add
2 instructions into fmaddss, fmsubss, fnmaddss, fnmsubss on SSE5 systems. */
4 /* { dg-do compile { target x86_64-*-*} } */
5 /* { dg-options "-O2 -msse5 -mfused-madd" } */
7 extern void exit (int);
9 float
10 flt_mul_add (float a, float b, float c)
12 return (a * b) + c;
15 double
16 dbl_mul_add (double a, double b, double c)
18 return (a * b) + c;
21 float
22 flt_mul_sub (float a, float b, float c)
24 return (a * b) - c;
27 double
28 dbl_mul_sub (double a, double b, double c)
30 return (a * b) - c;
33 float
34 flt_neg_mul_add (float a, float b, float c)
36 return (-(a * b)) + c;
39 double
40 dbl_neg_mul_add (double a, double b, double c)
42 return (-(a * b)) + c;
45 float
46 flt_neg_mul_sub (float a, float b, float c)
48 return (-(a * b)) - c;
51 double
52 dbl_neg_mul_sub (double a, double b, double c)
54 return (-(a * b)) - c;
57 float f[10] = { 2, 3, 4 };
58 double d[10] = { 2, 3, 4 };
60 int main ()
62 f[3] = flt_mul_add (f[0], f[1], f[2]);
63 f[4] = flt_mul_sub (f[0], f[1], f[2]);
64 f[5] = flt_neg_mul_add (f[0], f[1], f[2]);
65 f[6] = flt_neg_mul_sub (f[0], f[1], f[2]);
67 d[3] = dbl_mul_add (d[0], d[1], d[2]);
68 d[4] = dbl_mul_sub (d[0], d[1], d[2]);
69 d[5] = dbl_neg_mul_add (d[0], d[1], d[2]);
70 d[6] = dbl_neg_mul_sub (d[0], d[1], d[2]);
71 exit (0);
74 /* { dg-final { scan-assembler "fmaddss" } } */
75 /* { dg-final { scan-assembler "fmaddsd" } } */
76 /* { dg-final { scan-assembler "fmsubss" } } */
77 /* { dg-final { scan-assembler "fmsubsd" } } */
78 /* { dg-final { scan-assembler "fnmaddss" } } */
79 /* { dg-final { scan-assembler "fnmaddsd" } } */
80 /* { dg-final { scan-assembler "fnmsubss" } } */
81 /* { dg-final { scan-assembler "fnmsubsd" } } */