summaryrefslogtreecommitdiff
path: root/gcc/config/sh/sh.c
diff options
context:
space:
mode:
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-19 04:51:53 +0000
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-19 04:51:53 +0000
commit90e650e55d2976e15280dea901e8a682ee87783f (patch)
treeefc586deab7e998c98127f76a9a43a385ca1c0fc /gcc/config/sh/sh.c
parentea68d4ba1b27db5bcda3f07e484d1fd0e0954ed5 (diff)
downloadgcc-90e650e55d2976e15280dea901e8a682ee87783f.tar.gz
* [SH] Modify movsi_ie and movsf_ie patterns for LRA.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218890 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/sh/sh.c')
-rw-r--r--gcc/config/sh/sh.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index b01efb09d3f..7851fe86863 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -13291,6 +13291,35 @@ sh_legitimize_address_displacement (rtx *disp, rtx *offs,
return false;
}
+/* Return true if movsf insn should be splited with an additional
+ register. */
+bool
+sh_movsf_ie_ra_split_p (rtx op0, rtx op1, rtx op2)
+{
+ /* op0 == op1 */
+ if (rtx_equal_p (op0, op1))
+ return true;
+ /* fy, FQ, reg */
+ if (GET_CODE (op1) == CONST_DOUBLE
+ && ! satisfies_constraint_G (op1)
+ && ! satisfies_constraint_H (op1)
+ && REG_P (op0)
+ && REG_P (op2))
+ return true;
+ /* f, r, y */
+ if (REG_P (op0) && FP_REGISTER_P (REGNO (op0))
+ && REG_P (op1) && GENERAL_REGISTER_P (REGNO (op1))
+ && REG_P (op2) && (REGNO (op2) == FPUL_REG))
+ return true;
+ /* r, f, y */
+ if (REG_P (op1) && FP_REGISTER_P (REGNO (op1))
+ && REG_P (op0) && GENERAL_REGISTER_P (REGNO (op0))
+ && REG_P (op2) && (REGNO (op2) == FPUL_REG))
+ return true;
+
+ return false;
+}
+
static void
sh_conditional_register_usage (void)
{