This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH SH] Don't switch mode around fmov (pr61195)
- From: Christian Bruel <christian dot bruel at st dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Kaz Kojima <kkojima at rr dot iij4u dot or dot jp>, Oleg Endo <oleg dot endo at t-online dot de>
- Date: Fri, 16 May 2014 11:14:31 +0200
- Subject: [PATCH SH] Don't switch mode around fmov (pr61195)
- Authentication-results: sourceware.org; auth=none
Hi,
This patch reduces the number of unnecessary PR mode switches for single
precision moves. When FPSCR.SZ is not forced. Test illustration in the patch
Regtested for sh-none-elf with -m4, (-m2a still running), bootstrapped
on sh4-linux-elf board. ok for trunk ?
Many thanks,
Christian
2014-05-16 Christian Bruel <christian.bruel@st.com>
PR target/61195
* config/sh/sh.c (movsf_ie): Unset fp_mode for fmov.
2014-05-16 Christian Bruel <christian.bruel@st.com>
PR target/61195
* gcc.target/sh/pr61195.c: New test.
Index: config/sh/sh.md
===================================================================
--- config/sh/sh.md (revision 210475)
+++ config/sh/sh.md (working copy)
@@ -8357,9 +8357,26 @@ label:
(const_int 2)
(const_int 2)
(const_int 0)])
- (set (attr "fp_mode") (if_then_else (eq_attr "fmovd" "yes")
- (const_string "single")
- (const_string "single")))])
+ (set_attr_alternative "fp_mode"
+ [(if_then_else (eq_attr "fmovd" "yes") (const_string "single") (const_string "none"))
+ (const_string "none")
+ (const_string "single")
+ (const_string "single")
+ (const_string "none")
+ (if_then_else (eq_attr "fmovd" "yes") (const_string "single") (const_string "none"))
+ (if_then_else (eq_attr "fmovd" "yes") (const_string "single") (const_string "none"))
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")
+ (const_string "none")])])
(define_split
[(set (match_operand:SF 0 "register_operand" "")
Index: testsuite/gcc.target/sh/pr61195.c
===================================================================
--- testsuite/gcc.target/sh/pr61195.c (revision 0)
+++ testsuite/gcc.target/sh/pr61195.c (working copy)
@@ -0,0 +1,19 @@
+/* Verify that we don't switch mode for single moves. */
+/* { dg-do compile } */
+/* { dg-require-effective-target hard_float } */
+/* { dg-skip-if "" { *-*-* } { "mfmovd" } { "" } } */
+/* { dg-final { scan-assembler-not "fpscr" } } */
+
+float *g;
+
+float
+foo(float f)
+{
+ return f;
+}
+
+float
+foo1(void)
+{
+ return *g;
+}