From 531af98526f96ebfe856d42c0a99858c4f398e99 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Thu, 2 Jul 2020 11:50:26 -0400 Subject: [PATCH] improve m68k sqrt patch not to suppress insn on archs where it works the 60840 fpu and later, and coldfire fpus, have precision-specific sqrt instructions that get used and do the right thing. only when targeting baseline (or near-baseline) ISA does the ld80-only instruction get used, and that's all that needs to be suppressed. --- patches/gcc-5.3.0/0019-m68k-sqrt.diff | 50 ++++++++------------------- patches/gcc-6.5.0/0024-m68k-sqrt.diff | 50 ++++++++------------------- patches/gcc-7.3.0/0021-m68k-sqrt.diff | 50 ++++++++------------------- patches/gcc-8.3.0/0018-m68k-sqrt.diff | 50 ++++++++------------------- patches/gcc-9.2.0/0018-m68k-sqrt.diff | 50 ++++++++------------------- 5 files changed, 75 insertions(+), 175 deletions(-) diff --git a/patches/gcc-5.3.0/0019-m68k-sqrt.diff b/patches/gcc-5.3.0/0019-m68k-sqrt.diff index 3315939..5d46272 100644 --- a/patches/gcc-5.3.0/0019-m68k-sqrt.diff +++ b/patches/gcc-5.3.0/0019-m68k-sqrt.diff @@ -1,38 +1,18 @@ --- gcc-9.2.0.orig/gcc/config/m68k/m68k.md 2019-01-01 07:31:55.000000000 -0500 -+++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-06-30 15:56:20.061868526 -0400 -@@ -4121,35 +4121,6 @@ - return "fneg%. %1,%0"; - }) - --;; Sqrt instruction for the 68881 -- --(define_expand "sqrt2" -- [(set (match_operand:FP 0 "nonimmediate_operand" "") -- (sqrt:FP (match_operand:FP 1 "general_operand" "")))] ++++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-07-01 15:57:20.528408009 -0400 +@@ -4126,13 +4126,13 @@ + (define_expand "sqrt2" + [(set (match_operand:FP 0 "nonimmediate_operand" "") + (sqrt:FP (match_operand:FP 1 "general_operand" "")))] - "TARGET_HARD_FLOAT" -- "") -- --(define_insn "sqrt2_68881" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] -- "TARGET_68881" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.x %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) -- --(define_insn "sqrt2_cf" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fU")))] -- "TARGET_COLDFIRE_FPU" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.d %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) - ;; Absolute value instructions - ;; If using software floating point, just zero the sign bit. ++ "(TARGET_68881 && TARGET_68040) || TARGET_COLDFIRE_FPU" + "") + (define_insn "sqrt2_68881" + [(set (match_operand:FP 0 "nonimmediate_operand" "=f") + (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] +- "TARGET_68881" ++ "TARGET_68881 && TARGET_68040" + { + if (FP_REG_P (operands[1])) + return "fsqrt%.x %1,%0"; diff --git a/patches/gcc-6.5.0/0024-m68k-sqrt.diff b/patches/gcc-6.5.0/0024-m68k-sqrt.diff index 3315939..5d46272 100644 --- a/patches/gcc-6.5.0/0024-m68k-sqrt.diff +++ b/patches/gcc-6.5.0/0024-m68k-sqrt.diff @@ -1,38 +1,18 @@ --- gcc-9.2.0.orig/gcc/config/m68k/m68k.md 2019-01-01 07:31:55.000000000 -0500 -+++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-06-30 15:56:20.061868526 -0400 -@@ -4121,35 +4121,6 @@ - return "fneg%. %1,%0"; - }) - --;; Sqrt instruction for the 68881 -- --(define_expand "sqrt2" -- [(set (match_operand:FP 0 "nonimmediate_operand" "") -- (sqrt:FP (match_operand:FP 1 "general_operand" "")))] ++++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-07-01 15:57:20.528408009 -0400 +@@ -4126,13 +4126,13 @@ + (define_expand "sqrt2" + [(set (match_operand:FP 0 "nonimmediate_operand" "") + (sqrt:FP (match_operand:FP 1 "general_operand" "")))] - "TARGET_HARD_FLOAT" -- "") -- --(define_insn "sqrt2_68881" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] -- "TARGET_68881" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.x %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) -- --(define_insn "sqrt2_cf" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fU")))] -- "TARGET_COLDFIRE_FPU" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.d %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) - ;; Absolute value instructions - ;; If using software floating point, just zero the sign bit. ++ "(TARGET_68881 && TARGET_68040) || TARGET_COLDFIRE_FPU" + "") + (define_insn "sqrt2_68881" + [(set (match_operand:FP 0 "nonimmediate_operand" "=f") + (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] +- "TARGET_68881" ++ "TARGET_68881 && TARGET_68040" + { + if (FP_REG_P (operands[1])) + return "fsqrt%.x %1,%0"; diff --git a/patches/gcc-7.3.0/0021-m68k-sqrt.diff b/patches/gcc-7.3.0/0021-m68k-sqrt.diff index 3315939..5d46272 100644 --- a/patches/gcc-7.3.0/0021-m68k-sqrt.diff +++ b/patches/gcc-7.3.0/0021-m68k-sqrt.diff @@ -1,38 +1,18 @@ --- gcc-9.2.0.orig/gcc/config/m68k/m68k.md 2019-01-01 07:31:55.000000000 -0500 -+++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-06-30 15:56:20.061868526 -0400 -@@ -4121,35 +4121,6 @@ - return "fneg%. %1,%0"; - }) - --;; Sqrt instruction for the 68881 -- --(define_expand "sqrt2" -- [(set (match_operand:FP 0 "nonimmediate_operand" "") -- (sqrt:FP (match_operand:FP 1 "general_operand" "")))] ++++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-07-01 15:57:20.528408009 -0400 +@@ -4126,13 +4126,13 @@ + (define_expand "sqrt2" + [(set (match_operand:FP 0 "nonimmediate_operand" "") + (sqrt:FP (match_operand:FP 1 "general_operand" "")))] - "TARGET_HARD_FLOAT" -- "") -- --(define_insn "sqrt2_68881" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] -- "TARGET_68881" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.x %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) -- --(define_insn "sqrt2_cf" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fU")))] -- "TARGET_COLDFIRE_FPU" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.d %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) - ;; Absolute value instructions - ;; If using software floating point, just zero the sign bit. ++ "(TARGET_68881 && TARGET_68040) || TARGET_COLDFIRE_FPU" + "") + (define_insn "sqrt2_68881" + [(set (match_operand:FP 0 "nonimmediate_operand" "=f") + (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] +- "TARGET_68881" ++ "TARGET_68881 && TARGET_68040" + { + if (FP_REG_P (operands[1])) + return "fsqrt%.x %1,%0"; diff --git a/patches/gcc-8.3.0/0018-m68k-sqrt.diff b/patches/gcc-8.3.0/0018-m68k-sqrt.diff index 3315939..5d46272 100644 --- a/patches/gcc-8.3.0/0018-m68k-sqrt.diff +++ b/patches/gcc-8.3.0/0018-m68k-sqrt.diff @@ -1,38 +1,18 @@ --- gcc-9.2.0.orig/gcc/config/m68k/m68k.md 2019-01-01 07:31:55.000000000 -0500 -+++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-06-30 15:56:20.061868526 -0400 -@@ -4121,35 +4121,6 @@ - return "fneg%. %1,%0"; - }) - --;; Sqrt instruction for the 68881 -- --(define_expand "sqrt2" -- [(set (match_operand:FP 0 "nonimmediate_operand" "") -- (sqrt:FP (match_operand:FP 1 "general_operand" "")))] ++++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-07-01 15:57:20.528408009 -0400 +@@ -4126,13 +4126,13 @@ + (define_expand "sqrt2" + [(set (match_operand:FP 0 "nonimmediate_operand" "") + (sqrt:FP (match_operand:FP 1 "general_operand" "")))] - "TARGET_HARD_FLOAT" -- "") -- --(define_insn "sqrt2_68881" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] -- "TARGET_68881" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.x %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) -- --(define_insn "sqrt2_cf" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fU")))] -- "TARGET_COLDFIRE_FPU" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.d %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) - ;; Absolute value instructions - ;; If using software floating point, just zero the sign bit. ++ "(TARGET_68881 && TARGET_68040) || TARGET_COLDFIRE_FPU" + "") + (define_insn "sqrt2_68881" + [(set (match_operand:FP 0 "nonimmediate_operand" "=f") + (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] +- "TARGET_68881" ++ "TARGET_68881 && TARGET_68040" + { + if (FP_REG_P (operands[1])) + return "fsqrt%.x %1,%0"; diff --git a/patches/gcc-9.2.0/0018-m68k-sqrt.diff b/patches/gcc-9.2.0/0018-m68k-sqrt.diff index 3315939..5d46272 100644 --- a/patches/gcc-9.2.0/0018-m68k-sqrt.diff +++ b/patches/gcc-9.2.0/0018-m68k-sqrt.diff @@ -1,38 +1,18 @@ --- gcc-9.2.0.orig/gcc/config/m68k/m68k.md 2019-01-01 07:31:55.000000000 -0500 -+++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-06-30 15:56:20.061868526 -0400 -@@ -4121,35 +4121,6 @@ - return "fneg%. %1,%0"; - }) - --;; Sqrt instruction for the 68881 -- --(define_expand "sqrt2" -- [(set (match_operand:FP 0 "nonimmediate_operand" "") -- (sqrt:FP (match_operand:FP 1 "general_operand" "")))] ++++ gcc-9.2.0/gcc/config/m68k/m68k.md 2020-07-01 15:57:20.528408009 -0400 +@@ -4126,13 +4126,13 @@ + (define_expand "sqrt2" + [(set (match_operand:FP 0 "nonimmediate_operand" "") + (sqrt:FP (match_operand:FP 1 "general_operand" "")))] - "TARGET_HARD_FLOAT" -- "") -- --(define_insn "sqrt2_68881" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] -- "TARGET_68881" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.x %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) -- --(define_insn "sqrt2_cf" -- [(set (match_operand:FP 0 "nonimmediate_operand" "=f") -- (sqrt:FP (match_operand:FP 1 "general_operand" "fU")))] -- "TARGET_COLDFIRE_FPU" --{ -- if (FP_REG_P (operands[1])) -- return "fsqrt%.d %1,%0"; -- return "fsqrt%. %1,%0"; --} -- [(set_attr "type" "fsqrt")]) - ;; Absolute value instructions - ;; If using software floating point, just zero the sign bit. ++ "(TARGET_68881 && TARGET_68040) || TARGET_COLDFIRE_FPU" + "") + (define_insn "sqrt2_68881" + [(set (match_operand:FP 0 "nonimmediate_operand" "=f") + (sqrt:FP (match_operand:FP 1 "general_operand" "fm")))] +- "TARGET_68881" ++ "TARGET_68881 && TARGET_68040" + { + if (FP_REG_P (operands[1])) + return "fsqrt%.x %1,%0";