diff options
author | Steve Ellcey <sje@cup.hp.com> | 2009-05-21 23:53:02 +0000 |
---|---|---|
committer | Steve Ellcey <sje@gcc.gnu.org> | 2009-05-21 23:53:02 +0000 |
commit | 265b3b8dbd88b4fbd169ddd5c1cac032b7aabc90 (patch) | |
tree | ab6565c7a4c07fed17855bb1bc150d33ab611656 | |
parent | 583ca921109ebfe8e40a3b74412ec7fec4669783 (diff) | |
download | gcc-265b3b8dbd88b4fbd169ddd5c1cac032b7aabc90.zip gcc-265b3b8dbd88b4fbd169ddd5c1cac032b7aabc90.tar.gz gcc-265b3b8dbd88b4fbd169ddd5c1cac032b7aabc90.tar.bz2 |
re PR target/37846 (Option -mno-fused-madd should be supported on IA-64)
PR target/37846
* gcc.target/ia64/mfused-madd-vect.c: New test.
* gcc.target/ia64/mfused-madd.c: New test.
* gcc.target/ia64/mno-fused-madd-vect.c: New test.
* gcc.target/ia64/mno-fused-madd.c: New test.
From-SVN: r147783
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/ia64/mfused-madd-vect.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/ia64/mfused-madd.c | 64 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/ia64/mno-fused-madd-vect.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/ia64/mno-fused-madd.c | 64 |
5 files changed, 200 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f4f035..1005e18 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-05-21 Steve Ellcey <sje@cup.hp.com> + + PR target/37846 + * gcc.target/ia64/mfused-madd-vect.c: New test. + * gcc.target/ia64/mfused-madd.c: New test. + * gcc.target/ia64/mno-fused-madd-vect.c: New test. + * gcc.target/ia64/mno-fused-madd.c: New test. + 2009-05-21 H.J. Lu <hongjiu.lu@intel.com> * gcc.target/i386/movbe-1.c: New. diff --git a/gcc/testsuite/gcc.target/ia64/mfused-madd-vect.c b/gcc/testsuite/gcc.target/ia64/mfused-madd-vect.c new file mode 100644 index 0000000..e166e85 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/mfused-madd-vect.c @@ -0,0 +1,33 @@ +/* { dg-do compile */ +/* { dg-options "-O2 -ftree-vectorize" } */ +/* { dg-final { scan-assembler-not "fpmpy" } } */ + +/* fpma and fpms will show in either way because there are no + specific vector add/sub instructions. So we just check for fpmpy. */ + +#define N 16 +extern bar(float *, float *, float *, float *); +void foo() +{ + int i; + float a[N], b[N], c[N], d[N]; + bar(a,b,c,d); + for (i = 0; i < N; i++) { + a[i] = b[i] + c[i] * d[i]; + } + bar(a,b,c,d); +#if 0 + for (i = 0; i < N; i++) { + a[i] = b[i] - c[i] * d[i]; + } + bar(a,b,c,d); +#endif + for (i = 0; i < N; i++) { + a[i] = b[i] * c[i] + d[i]; + } + bar(a,b,c,d); + for (i = 0; i < N; i++) { + a[i] = b[i] * c[i] - d[i]; + } + bar(a,b,c,d); +} diff --git a/gcc/testsuite/gcc.target/ia64/mfused-madd.c b/gcc/testsuite/gcc.target/ia64/mfused-madd.c new file mode 100644 index 0000000..8ecb31f --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/mfused-madd.c @@ -0,0 +1,64 @@ +/* { dg-do compile */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "fmpy" } } */ +/* { dg-final { scan-assembler-not "fadd" } } */ +/* { dg-final { scan-assembler-not "fsub" } } */ +/* { dg-final { scan-assembler "fma" } } */ +/* { dg-final { scan-assembler "fms" } } */ +/* { dg-final { scan-assembler "fnma" } } */ + +float foo01(float a, float b, float c) {return (a + b * c);} +float foo02(float a, float b, float c) {return (a - b * c);} +float foo03(float a, float b, float c) {return (a * b + c);} +float foo04(float a, float b, float c) {return (a * b - c);} + +double foo05(double a, double b, double c) {return (a + b * c);} +double foo06(double a, double b, double c) {return (a - b * c);} +double foo07(double a, double b, double c) {return (a * b + c);} +double foo08(double a, double b, double c) {return (a * b - c);} + +__float80 foo09(__float80 a, __float80 b, __float80 c) {return (a + b * c);} +__float80 foo10(__float80 a, __float80 b, __float80 c) {return (a - b * c);} +__float80 foo11(__float80 a, __float80 b, __float80 c) {return (a * b + c);} +__float80 foo12(__float80 a, __float80 b, __float80 c) {return (a * b - c);} + + + +float foo20(double a, double b, double c) {return (float) (a + b * c);} +float foo21(double a, double b, double c) {return (float) (a - b * c);} +float foo22(double a, double b, double c) {return (float) (a * b + c);} +float foo23(double a, double b, double c) {return (float) (a * b - c);} + +float foo24(__float80 a, __float80 b, __float80 c) {return (float) (a + b * c);} +float foo25(__float80 a, __float80 b, __float80 c) {return (float) (a - b * c);} +float foo26(__float80 a, __float80 b, __float80 c) {return (float) (a * b + c);} +float foo27(__float80 a, __float80 b, __float80 c) {return (float) (a * b - c);} + +double foo28(__float80 a, __float80 b, __float80 c) {return (double) (a + b * c);} +double foo29(__float80 a, __float80 b, __float80 c) {return (double) (a - b * c);} +double foo30(__float80 a, __float80 b, __float80 c) {return (double) (a * b + c);} +double foo31(__float80 a, __float80 b, __float80 c) {return (double) (a * b - c);} + + +float foo001(float a, float b, double c) { return (a + b * c); } +float foo002(float a, float b, double c) { return (a - b * c); } + +float foo005(float a, double b, double c) { return (a + b * c); } +float foo006(float a, double b, double c) { return (a - b * c); } +float foo007(float a, double b, double c) { return (a * b + c); } +float foo008(float a, double b, double c) { return (a * b - c); } + +double foo009(double a, float b, double c) { return (a + b * c); } +double foo010(double a, float b, double c) { return (a - b * c); } +double foo011(double a, float b, double c) { return (a * b + c); } +double foo012(double a, float b, double c) { return (a * b - c); } + +float foo013(float a, double b, __float80 c) { return (a + b * c); } +float foo014(float a, double b, __float80 c) { return (a - b * c); } +float foo017(double a, float b, __float80 c) { return (a + b * c); } +float foo018(double a, float b, __float80 c) { return (a - b * c); } + +float foo021(float a, __float80 b, double c) { return (a + b * c); } +float foo022(float a, __float80 b, double c) { return (a - b * c); } +float foo023(float a, __float80 b, double c) { return (a * b + c); } +float foo024(float a, __float80 b, double c) { return (a * b - c); } diff --git a/gcc/testsuite/gcc.target/ia64/mno-fused-madd-vect.c b/gcc/testsuite/gcc.target/ia64/mno-fused-madd-vect.c new file mode 100644 index 0000000..0e24bf6 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/mno-fused-madd-vect.c @@ -0,0 +1,31 @@ +/* { dg-do compile */ +/* { dg-options "-O2 -mno-fused-madd -ftree-vectorize" } */ +/* { dg-final { scan-assembler "fpmpy" } } */ + +/* fpma and fpms will show in either way because there are no + specific vector add/sub instructions. So we just check for fpmpy. */ + +#define N 16 +extern bar(float *, float *, float *, float *); +void foo() +{ + int i; + float a[N], b[N], c[N], d[N]; + bar(a,b,c,d); + for (i = 0; i < N; i++) { + a[i] = b[i] + c[i] * d[i]; + } + bar(a,b,c,d); + for (i = 0; i < N; i++) { + a[i] = b[i] - c[i] * d[i]; + } + bar(a,b,c,d); + for (i = 0; i < N; i++) { + a[i] = b[i] * c[i] + d[i]; + } + bar(a,b,c,d); + for (i = 0; i < N; i++) { + a[i] = b[i] * c[i] - d[i]; + } + bar(a,b,c,d); +} diff --git a/gcc/testsuite/gcc.target/ia64/mno-fused-madd.c b/gcc/testsuite/gcc.target/ia64/mno-fused-madd.c new file mode 100644 index 0000000..d8ccc94 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/mno-fused-madd.c @@ -0,0 +1,64 @@ +/* { dg-do compile */ +/* { dg-options "-O2 -mno-fused-madd" } */ +/* { dg-final { scan-assembler-not "fma" } } */ +/* { dg-final { scan-assembler-not "fms" } } */ +/* { dg-final { scan-assembler-not "fnma" } } */ +/* { dg-final { scan-assembler "fmpy" } } */ +/* { dg-final { scan-assembler "fadd" } } */ +/* { dg-final { scan-assembler "fsub" } } */ + +float foo01(float a, float b, float c) {return (a + b * c);} +float foo02(float a, float b, float c) {return (a - b * c);} +float foo03(float a, float b, float c) {return (a * b + c);} +float foo04(float a, float b, float c) {return (a * b - c);} + +double foo05(double a, double b, double c) {return (a + b * c);} +double foo06(double a, double b, double c) {return (a - b * c);} +double foo07(double a, double b, double c) {return (a * b + c);} +double foo08(double a, double b, double c) {return (a * b - c);} + +__float80 foo09(__float80 a, __float80 b, __float80 c) {return (a + b * c);} +__float80 foo10(__float80 a, __float80 b, __float80 c) {return (a - b * c);} +__float80 foo11(__float80 a, __float80 b, __float80 c) {return (a * b + c);} +__float80 foo12(__float80 a, __float80 b, __float80 c) {return (a * b - c);} + + + +float foo20(double a, double b, double c) {return (float) (a + b * c);} +float foo21(double a, double b, double c) {return (float) (a - b * c);} +float foo22(double a, double b, double c) {return (float) (a * b + c);} +float foo23(double a, double b, double c) {return (float) (a * b - c);} + +float foo24(__float80 a, __float80 b, __float80 c) {return (float) (a + b * c);} +float foo25(__float80 a, __float80 b, __float80 c) {return (float) (a - b * c);} +float foo26(__float80 a, __float80 b, __float80 c) {return (float) (a * b + c);} +float foo27(__float80 a, __float80 b, __float80 c) {return (float) (a * b - c);} + +double foo28(__float80 a, __float80 b, __float80 c) {return (double) (a + b * c);} +double foo29(__float80 a, __float80 b, __float80 c) {return (double) (a - b * c);} +double foo30(__float80 a, __float80 b, __float80 c) {return (double) (a * b + c);} +double foo31(__float80 a, __float80 b, __float80 c) {return (double) (a * b - c);} + + +float foo001(float a, float b, double c) { return (a + b * c); } +float foo002(float a, float b, double c) { return (a - b * c); } + +float foo005(float a, double b, double c) { return (a + b * c); } +float foo006(float a, double b, double c) { return (a - b * c); } +float foo007(float a, double b, double c) { return (a * b + c); } +float foo008(float a, double b, double c) { return (a * b - c); } + +double foo009(double a, float b, double c) { return (a + b * c); } +double foo010(double a, float b, double c) { return (a - b * c); } +double foo011(double a, float b, double c) { return (a * b + c); } +double foo012(double a, float b, double c) { return (a * b - c); } + +float foo013(float a, double b, __float80 c) { return (a + b * c); } +float foo014(float a, double b, __float80 c) { return (a - b * c); } +float foo017(double a, float b, __float80 c) { return (a + b * c); } +float foo018(double a, float b, __float80 c) { return (a - b * c); } + +float foo021(float a, __float80 b, double c) { return (a + b * c); } +float foo022(float a, __float80 b, double c) { return (a - b * c); } +float foo023(float a, __float80 b, double c) { return (a * b + c); } +float foo024(float a, __float80 b, double c) { return (a * b - c); } |