From 6e0d3dbd56a6df602c7195efa2e1080445e18107 Mon Sep 17 00:00:00 2001 From: kkojima Date: Fri, 19 Dec 2014 04:53:57 +0000 Subject: [PATCH] * [SH] Add splitter to addsi3_compact. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218891 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/config/sh/predicates.md | 13 +++++++++++++ gcc/config/sh/sh.md | 29 ++++++++++++++++++++++------- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 255b8dbd61f..a9741366392 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2014-12-19 Kaz Kojima + * config/sh/predicates.md (arith_or_int_operand): New predicate. + * config/sh/sh.md (addsi3): Use arith_or_int_operand for operand 2. + Return fail if operands[0] and operands[1] are overlap when + operands[2] is integer constant. + (*addsi3_compact): Make it define_insn_and_split which splits + reg0 := reg1 + constant to reg0 = constant and reg0 := reg0 + reg1. + +2014-12-19 Kaz Kojima + * config/sh/sh-protos.h (sh_movsf_ie_ra_split_p): Declare. * config/sh/sh.c (sh_movsf_ie_ra_split_p): New function. * config/sh/sh.md (movsi_ie): Use "mr" constraint for the 8-th diff --git a/gcc/config/sh/predicates.md b/gcc/config/sh/predicates.md index 152056ae360..8772332bac1 100644 --- a/gcc/config/sh/predicates.md +++ b/gcc/config/sh/predicates.md @@ -182,6 +182,19 @@ return 0; }) +;; Likewise arith_operand but always permits const_int. +(define_predicate "arith_or_int_operand" + (match_code "subreg,reg,const_int,const_vector") +{ + if (arith_operand (op, mode)) + return 1; + + if (CONST_INT_P (op)) + return 1; + + return 0; +}) + ;; Returns 1 if OP is a valid source operand for a compare insn. (define_predicate "arith_reg_or_0_operand" (match_code "subreg,reg,const_int,const_vector") diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 76f5c4ad1ab..a74e17f151f 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -2020,11 +2020,16 @@ (define_expand "addsi3" [(set (match_operand:SI 0 "arith_reg_operand" "") (plus:SI (match_operand:SI 1 "arith_operand" "") - (match_operand:SI 2 "arith_operand" "")))] + (match_operand:SI 2 "arith_or_int_operand" "")))] "" { if (TARGET_SHMEDIA) operands[1] = force_reg (SImode, operands[1]); + else if (! arith_operand (operands[2], SImode)) + { + if (reg_overlap_mentioned_p (operands[0], operands[1])) + FAIL; + } }) (define_insn "addsi3_media" @@ -2051,12 +2056,22 @@ [(set_attr "type" "arith_media") (set_attr "highpart" "ignore")]) -(define_insn "*addsi3_compact" - [(set (match_operand:SI 0 "arith_reg_dest" "=r") - (plus:SI (match_operand:SI 1 "arith_operand" "%0") - (match_operand:SI 2 "arith_operand" "rI08")))] - "TARGET_SH1" - "add %2,%0" +(define_insn_and_split "*addsi3_compact" + [(set (match_operand:SI 0 "arith_reg_dest" "=r,&r") + (plus:SI (match_operand:SI 1 "arith_operand" "%0,r") + (match_operand:SI 2 "arith_or_int_operand" "rI08,rn")))] + "TARGET_SH1 + && (rtx_equal_p (operands[0], operands[1]) + && arith_operand (operands[2], SImode)) + || ! reg_overlap_mentioned_p (operands[0], operands[1])" + "@ + add %2,%0 + #" + "reload_completed + && ! reg_overlap_mentioned_p (operands[0], operands[1])" + [(set (match_dup 0) (match_dup 2)) + (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))] + "" [(set_attr "type" "arith")]) ;; ------------------------------------------------------------------------- -- 2.11.4.GIT