From 88a060b3248cf7c92960fe648d245c3e60c1df5e Mon Sep 17 00:00:00 2001 From: sje Date: Thu, 21 May 2009 23:53:02 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147783 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/ChangeLog | 8 +++ gcc/testsuite/gcc.target/ia64/mfused-madd-vect.c | 33 +++++++++++ gcc/testsuite/gcc.target/ia64/mfused-madd.c | 64 ++++++++++++++++++++++ .../gcc.target/ia64/mno-fused-madd-vect.c | 31 +++++++++++ gcc/testsuite/gcc.target/ia64/mno-fused-madd.c | 64 ++++++++++++++++++++++ 5 files changed, 200 insertions(+) create mode 100644 gcc/testsuite/gcc.target/ia64/mfused-madd-vect.c create mode 100644 gcc/testsuite/gcc.target/ia64/mfused-madd.c create mode 100644 gcc/testsuite/gcc.target/ia64/mno-fused-madd-vect.c create mode 100644 gcc/testsuite/gcc.target/ia64/mno-fused-madd.c 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 + + 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 * 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); } -- 2.7.4