diff mbox series

rs6000: Various fixes for the new fpscr builtins (PR87509)

Message ID 3d5f9e372c33ead60dbafbf8ddc6734e6af09955.1538703077.git.segher@kernel.crashing.org
State New
Headers show
Series rs6000: Various fixes for the new fpscr builtins (PR87509) | expand

Commit Message

Segher Boessenkool Oct. 5, 2018, 10:47 a.m. UTC
With these fixes all testcases test clean for me, both on
powerpc64-linux {-m32,-m64} and on powerpc64le-linux, with all
relevant -mcpu= settings.

Committing to trunk.

The generated code (esp. for -m32) isn't optimal yet, but if we do
not allow SImode in FPRs this isn't easy to solve.  So first this,
correctness, and optimisation can follow later :-)


2018-10-05  Segher Boessenkool  <segher@kernel.crashing.org>

	PR target/87509
	* config/rs6000/rs6000-builtin.def (RS6000_BUILTIN_SET_FPSCR_DRN): Use
	RS6000_BTM_DFP.
	* config/rs6000/rs6000.md (rs6000_set_fpscr_rn): Require the operand
	to be DImode.  When using mffscrn, force the operand to a register.

gcc/testsuite/
	PR target/87509
	* gcc.target/powerpc/test_fpscr_drn_builtin.c: Use hard_dfp instead
	of dfp_hw.  Don't include <altivec.h>.
	* gcc.target/powerpc/test_fpscr_drn_builtin_error.c: Ditto.  Require
	lp64.
	* gcc.target/powerpc/test_fpscr_rn_builtin.c: Don't include <altivec.h>.
	* gcc.target/powerpc/test_mffsl.c: Ditto.

---
 gcc/config/rs6000/rs6000-builtin.def                            | 2 +-
 gcc/config/rs6000/rs6000.md                                     | 7 +++----
 gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin.c       | 4 +---
 gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin_error.c | 6 ++----
 gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin.c        | 2 --
 gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin_error.c  | 2 --
 gcc/testsuite/gcc.target/powerpc/test_mffsl.c                   | 2 --
 7 files changed, 7 insertions(+), 18 deletions(-)
diff mbox series

Patch

diff --git a/gcc/config/rs6000/rs6000-builtin.def b/gcc/config/rs6000/rs6000-builtin.def
index 976c36b..ec0528a 100644
--- a/gcc/config/rs6000/rs6000-builtin.def
+++ b/gcc/config/rs6000/rs6000-builtin.def
@@ -2510,7 +2510,7 @@  RS6000_BUILTIN_X (RS6000_BUILTIN_SET_FPSCR_RN, "__builtin_set_fpscr_rn",
 		  CODE_FOR_rs6000_set_fpscr_rn)
 
 RS6000_BUILTIN_X (RS6000_BUILTIN_SET_FPSCR_DRN, "__builtin_set_fpscr_drn",
-		  RS6000_BTM_ALWAYS,
+		  RS6000_BTM_DFP,
 		  RS6000_BTC_MISC | RS6000_BTM_64BIT | RS6000_BTC_UNARY
 		  | RS6000_BTC_VOID,
 		  CODE_FOR_rs6000_set_fpscr_drn)
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index ad78f2d..ed09211 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -5849,7 +5849,7 @@  (define_insn "rs6000_mffscdrn"
   [(set_attr "type" "fp")])
 
 (define_expand "rs6000_set_fpscr_rn"
- [(match_operand 0 "reg_or_cint_operand")]
+ [(match_operand:DI 0 "reg_or_cint_operand")]
   "TARGET_HARD_FLOAT"
 {
   rtx tmp_df = gen_reg_rtx (DFmode);
@@ -5858,9 +5858,8 @@  (define_expand "rs6000_set_fpscr_rn"
      new rounding mode bits from operands[0][62:63] into FPSCR[62:63].  */
   if (TARGET_P9_MISC)
     {
-      rtx src_df = gen_reg_rtx (DImode);
-
-      src_df = simplify_gen_subreg (DFmode, operands[0], DImode, 0);
+      rtx src_df = force_reg (DImode, operands[0]);
+      src_df = simplify_gen_subreg (DFmode, src_df, DImode, 0);
       emit_insn (gen_rs6000_mffscrn (tmp_df, src_df));
       DONE;
     }
diff --git a/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin.c b/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin.c
index 685bf97..00b11f8 100644
--- a/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin.c
+++ b/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin.c
@@ -1,9 +1,7 @@ 
 /* { dg-do run { target { powerpc*-*-* &&  lp64 } } } */
-/* { dg-require-effective-target dfp_hw } */
+/* { dg-require-effective-target hard_dfp } */
 /* { dg-options "-O2 -std=c99" } */
 
-#include <altivec.h>
-
 #ifdef DEBUG
 #include <stdio.h>
 #endif
diff --git a/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin_error.c b/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin_error.c
index 58453f0..028ab0b 100644
--- a/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin_error.c
+++ b/gcc/testsuite/gcc.target/powerpc/test_fpscr_drn_builtin_error.c
@@ -1,9 +1,7 @@ 
-/* { dg-do compile { target powerpc*-*-* } } */
-/* { dg-require-effective-target dfp_hw } */
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-require-effective-target hard_dfp } */
 /* { dg-options "-O2 -std=c99" } */
 
-#include <altivec.h>
-
 int main ()
 {
 
diff --git a/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin.c b/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin.c
index be05dcf..0d0d3f0 100644
--- a/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin.c
+++ b/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin.c
@@ -1,8 +1,6 @@ 
 /* { dg-do run { target { powerpc*-*-* } } } */
 /* { dg-options "-O2 -std=c99" } */
 
-#include <altivec.h>
-
 #ifdef DEBUG
 #include <stdio.h>
 #endif
diff --git a/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin_error.c b/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin_error.c
index a529ce6..aea6509 100644
--- a/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin_error.c
+++ b/gcc/testsuite/gcc.target/powerpc/test_fpscr_rn_builtin_error.c
@@ -1,8 +1,6 @@ 
 /* { dg-do compile { target powerpc*-*-* } } */
 /* { dg-options "-O2 -std=c99" } */
 
-#include <altivec.h>
-
 int main ()
 {
 
diff --git a/gcc/testsuite/gcc.target/powerpc/test_mffsl.c b/gcc/testsuite/gcc.target/powerpc/test_mffsl.c
index 278dfbf..93a8ec2 100644
--- a/gcc/testsuite/gcc.target/powerpc/test_mffsl.c
+++ b/gcc/testsuite/gcc.target/powerpc/test_mffsl.c
@@ -1,8 +1,6 @@ 
 /* { dg-do run { target { powerpc*-*-* } } } */
 /* { dg-options "-O2 -std=c99" } */
 
-#include <altivec.h>
-
 #ifdef DEBUG
 #include <stdio.h>
 #endif