From 385361c961c1eaba01a77801eb50f20c0fe5b81a Mon Sep 17 00:00:00 2001 From: macro Date: Wed, 20 Nov 2013 17:16:48 +0000 Subject: [PATCH] * config/mips/mips.h (ISA_HAS_FP_RECIP_RSQRT): New macro. * config/mips/mips.c (mips_rtx_costs)
: Check for ISA_HAS_FP_RECIP_RSQRT rather than ISA_HAS_FP4. * config/mips/mips.md (recip_condition): Remove mode attribute. (div3): Use ISA_HAS_FP_RECIP_RSQRT rather than . (*recip3, *rsqrta, *rsqrtb): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205129 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/mips/mips.c | 2 +- gcc/config/mips/mips.h | 15 +++++++++++++++ gcc/config/mips/mips.md | 18 +++++------------- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a2ea53ef06..c93f358ffa2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-11-20 Maciej W. Rozycki + + * config/mips/mips.h (ISA_HAS_FP_RECIP_RSQRT): New macro. + * config/mips/mips.c (mips_rtx_costs)
: Check for + ISA_HAS_FP_RECIP_RSQRT rather than ISA_HAS_FP4. + * config/mips/mips.md (recip_condition): Remove mode attribute. + (div3): Use ISA_HAS_FP_RECIP_RSQRT rather than + . + (*recip3, *rsqrta, *rsqrtb): Likewise. + 2013-11-20 Eric Botcazou PR target/59207 diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index d06d5747081..0aeb35aa6d6 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -3972,7 +3972,7 @@ mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED, case DIV: /* Check for a reciprocal. */ if (float_mode_p - && ISA_HAS_FP4 + && ISA_HAS_FP_RECIP_RSQRT (mode) && flag_unsafe_math_optimizations && XEXP (x, 0) == CONST1_RTX (mode)) { diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 11687b8a053..97df9003000 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -921,6 +921,21 @@ struct mips_cpu_info { 'c = -((a * b) [+-] c)'. */ #define ISA_HAS_NMADD3_NMSUB3 TARGET_LOONGSON_2EF +/* ISA has floating-point RECIP.fmt and RSQRT.fmt instructions. The + MIPS64 rev. 1 ISA says that RECIP.D and RSQRT.D are unpredictable when + doubles are stored in pairs of FPRs, so for safety's sake, we apply + this restriction to the MIPS IV ISA too. */ +#define ISA_HAS_FP_RECIP_RSQRT(MODE) \ + ((((ISA_HAS_FP4 || ISA_MIPS32R2) \ + && ((MODE) == SFmode \ + || ((TARGET_FLOAT64 \ + || ISA_MIPS32R2 \ + || ISA_MIPS64R2) \ + && (MODE) == DFmode))) \ + || (TARGET_SB1 \ + && (MODE) == V2SFmode)) \ + && !TARGET_MIPS16) + /* ISA has count leading zeroes/ones instruction (not implemented). */ #define ISA_HAS_CLZ_CLO ((ISA_MIPS32 \ || ISA_MIPS32R2 \ diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 6991f203df4..d3ad83cf96b 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -881,15 +881,6 @@ (define_mode_attr sqrt_condition [(SF "!ISA_MIPS1") (DF "!ISA_MIPS1") (V2SF "TARGET_SB1")]) -;; This attribute gives the conditions under which RECIP.fmt and RSQRT.fmt -;; instructions can be used. The MIPS32 and MIPS64 ISAs say that RECIP.D -;; and RSQRT.D are unpredictable when doubles are stored in pairs of FPRs, -;; so for safety's sake, we apply this restriction to all targets. -(define_mode_attr recip_condition - [(SF "ISA_HAS_FP4") - (DF "ISA_HAS_FP4 && TARGET_FLOAT64") - (V2SF "TARGET_SB1")]) - ;; This code iterator allows signed and unsigned widening multiplications ;; to use the same template. (define_code_iterator any_extend [sign_extend zero_extend]) @@ -2501,7 +2492,8 @@ "" { if (const_1_operand (operands[1], mode)) - if (!( && flag_unsafe_math_optimizations)) + if (!(ISA_HAS_FP_RECIP_RSQRT (mode) + && flag_unsafe_math_optimizations)) operands[1] = force_reg (mode, operands[1]); }) @@ -2539,7 +2531,7 @@ [(set (match_operand:ANYF 0 "register_operand" "=f") (div:ANYF (match_operand:ANYF 1 "const_1_operand" "") (match_operand:ANYF 2 "register_operand" "f")))] - " && flag_unsafe_math_optimizations" + "ISA_HAS_FP_RECIP_RSQRT (mode) && flag_unsafe_math_optimizations" { if (TARGET_FIX_SB1) return "recip.\t%0,%2\;mov.\t%0,%0"; @@ -2674,7 +2666,7 @@ [(set (match_operand:ANYF 0 "register_operand" "=f") (div:ANYF (match_operand:ANYF 1 "const_1_operand" "") (sqrt:ANYF (match_operand:ANYF 2 "register_operand" "f"))))] - " && flag_unsafe_math_optimizations" + "ISA_HAS_FP_RECIP_RSQRT (mode) && flag_unsafe_math_optimizations" { if (TARGET_FIX_SB1) return "rsqrt.\t%0,%2\;mov.\t%0,%0"; @@ -2692,7 +2684,7 @@ [(set (match_operand:ANYF 0 "register_operand" "=f") (sqrt:ANYF (div:ANYF (match_operand:ANYF 1 "const_1_operand" "") (match_operand:ANYF 2 "register_operand" "f"))))] - " && flag_unsafe_math_optimizations" + "ISA_HAS_FP_RECIP_RSQRT (mode) && flag_unsafe_math_optimizations" { if (TARGET_FIX_SB1) return "rsqrt.\t%0,%2\;mov.\t%0,%0"; -- 2.11.4.GIT