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 <seg...@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 --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 -- 1.8.3.1