diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2016-05-10 14:27:12 +0000 |
---|---|---|
committer | William Schmidt <wschmidt@gcc.gnu.org> | 2016-05-10 14:27:12 +0000 |
commit | 9b5ee426fcfe9d473edff34cd65f99c057799d7d (patch) | |
tree | fdda2bf4edf0cd1b0cde4657f8cfc011b53dd1a3 /gcc | |
parent | f3352cabb8c7f078862ee3c1bca06e96a6ebcfd4 (diff) | |
download | gcc-9b5ee426fcfe9d473edff34cd65f99c057799d7d.zip gcc-9b5ee426fcfe9d473edff34cd65f99c057799d7d.tar.gz gcc-9b5ee426fcfe9d473edff34cd65f99c057799d7d.tar.bz2 |
re PR target/70963 (vec_cts/vec_ctf intrinsics produce wrong results for 64-bit floating point)
[gcc]
2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR target/70963
* config/rs6000/vsx.md (vsx_xvcvdpsxds_scale): Generate correct
code for a zero scale factor.
(vsx_xvcvdpuxds_scale): Likewise.
[gcc/testsuite]
2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR target/70963
* gcc.target/powerpc/pr70963.c: New.
From-SVN: r236082
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/vsx.md | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr70963.c | 43 |
4 files changed, 73 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cab5f40..eaa9128 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + PR target/70963 + * config/rs6000/vsx.md (vsx_xvcvdpsxds_scale): Generate correct + code for a zero scale factor. + (vsx_xvcvdpuxds_scale): Likewise. + 2016-05-10 David Malcolm <dmalcolm@redhat.com> * diagnostic-show-locus.c (layout::layout): Call show_ruler diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index 508eeac..1d6e479 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -1717,10 +1717,15 @@ { rtx op0 = operands[0]; rtx op1 = operands[1]; - rtx tmp = gen_reg_rtx (V2DFmode); - int scale = INTVAL(operands[2]); - if (scale != 0) - rs6000_scale_v2df (tmp, op1, scale); + rtx tmp; + int scale = INTVAL (operands[2]); + if (scale == 0) + tmp = op1; + else + { + tmp = gen_reg_rtx (V2DFmode); + rs6000_scale_v2df (tmp, op1, scale); + } emit_insn (gen_vsx_xvcvdpsxds (op0, tmp)); DONE; }) @@ -1741,10 +1746,15 @@ { rtx op0 = operands[0]; rtx op1 = operands[1]; - rtx tmp = gen_reg_rtx (V2DFmode); - int scale = INTVAL(operands[2]); - if (scale != 0) - rs6000_scale_v2df (tmp, op1, scale); + rtx tmp; + int scale = INTVAL (operands[2]); + if (scale == 0) + tmp = op1; + else + { + tmp = gen_reg_rtx (V2DFmode); + rs6000_scale_v2df (tmp, op1, scale); + } emit_insn (gen_vsx_xvcvdpuxds (op0, tmp)); DONE; }) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c1a2135..58d0c8d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + PR target/70963 + * gcc.target/powerpc/pr70963.c: New. + 2016-05-10 David Malcolm <dmalcolm@redhat.com> * gcc.dg/plugin/diagnostic-test-show-locus-bw.c diff --git a/gcc/testsuite/gcc.target/powerpc/pr70963.c b/gcc/testsuite/gcc.target/powerpc/pr70963.c new file mode 100644 index 0000000..b5d8316 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr70963.c @@ -0,0 +1,43 @@ +/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-options "-maltivec" } */ + +#include <stdlib.h> +#include <stdio.h> +#include <altivec.h> + +static int failed; +static void test (void); + +static void check (int result, const char *name) +{ + if (!result) + { + failed++; + printf ("fail %s\n", name); + } +} + +int main (void) +{ + test (); + if (failed) + abort (); + return 0; +} + +vector double x = { 81.0, 76.0 }; +vector long long y = { 81, 76 }; + +static void test() +{ + vector long long a = vec_cts (x, 0); + vector double b = vec_ctf (a, 0); + vector long long c = __builtin_vsx_xvcvdpuxds_scale (x, 0); + vector double d = vec_ctf (c, 0); + check (vec_all_eq (a, y), "vec_cts"); + check (vec_all_eq (b, x), "vec_ctf"); + check (vec_all_eq (c, y), "xvcvdpuxds"); + check (vec_all_eq (d, x), "vec_ctf unsigned"); +} |