From 94e9831662a5824b2cc403cba23829ae61616a29 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Fri, 21 Mar 2008 22:16:49 +0000 Subject: [PATCH] re PR target/27946 (double to long long and back to double stores to the stack) 2008-03-21 Andrew Pinski PR target/27947 * config/rs6000/rs6000.md (floatdidf2): Discouraging fprs and encouraging but not allowing gprs for input; change the input constraint to !f#r. (fix_truncdfdi2): Discouraging fprs and encouraging but not allowing gprs for output; change the output constraint to !f#r. 2008-03-21 Andrew Pinski PR target/27947 * gcc.target/powerpc/ppc64-double-1.c: New testcase. From-SVN: r133438 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/rs6000/rs6000.md | 6 +++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/powerpc/ppc64-double-1.c | 11 +++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/ppc64-double-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d2ad8f..b26a46a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2008-03-21 Andrew Pinski + + PR target/27947 + * config/rs6000/rs6000.md (floatdidf2): Discouraging fprs and + encouraging but not allowing gprs for input; + change the input constraint to !f#r. + (fix_truncdfdi2): Discouraging fprs and encouraging but not allowing + gprs for output; + change the output constraint to !f#r. + 2008-03-21 Uros Bizjak PR target/13958 diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 777a1ec..cac5fd1 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -6126,7 +6126,7 @@ (define_insn "floatdidf2" [(set (match_operand:DF 0 "gpc_reg_operand" "=f") - (float:DF (match_operand:DI 1 "gpc_reg_operand" "*f")))] + (float:DF (match_operand:DI 1 "gpc_reg_operand" "!f#r")))] "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS" "fcfid %0,%1" [(set_attr "type" "fp")]) @@ -6173,7 +6173,7 @@ "") (define_insn "fix_truncdfdi2" - [(set (match_operand:DI 0 "gpc_reg_operand" "=*f") + [(set (match_operand:DI 0 "gpc_reg_operand" "=!f#r") (fix:DI (match_operand:DF 1 "gpc_reg_operand" "f")))] "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS" "fctidz %0,%1" @@ -6202,7 +6202,7 @@ ;; from double rounding. (define_insn_and_split "floatdisf2_internal1" [(set (match_operand:SF 0 "gpc_reg_operand" "=f") - (float:SF (match_operand:DI 1 "gpc_reg_operand" "*f"))) + (float:SF (match_operand:DI 1 "gpc_reg_operand" "!f#r"))) (clobber (match_scratch:DF 2 "=f"))] "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS" "#" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad3e1ab..9b650a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-03-21 Andrew Pinski + + PR target/27947 + * gcc.target/powerpc/ppc64-double-1.c: New testcase. + 2008-03-21 Thomas Koenig PR libfortran/32972 diff --git a/gcc/testsuite/gcc.target/powerpc/ppc64-double-1.c b/gcc/testsuite/gcc.target/powerpc/ppc64-double-1.c new file mode 100644 index 0000000..6672b10 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/ppc64-double-1.c @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-O2 -mpowerpc64" } +// { dg-final { scan-assembler-not "stfd" } } + +// The register allocator should have allocated the temporary long long value in a floating point register. + +double +d2ll2d (double d) +{ + return (double)(long long)d; +} -- 2.7.4