Hello! ix86_split_long_move operates on general hard registers only. Introduce and use predicates that allow only these regs (in addition to memory and/or immediate operands).
No functional changes. 2016-12-06 Uros Bizjak <ubiz...@gmail.com> * config/i386/predicates.md (general_gr_operand): New predicate. * config/i386/i386.md (TImode and DImode push_operand splitter): Use general_gr_operand. Macroize using DWI mode macro. (TImode and DImode nonimmediate_operand splitter): Use nonimmediate_gr_operand and general_gr_operand. Macroize using DWI mode macro. (TF/XF/DFmode push_operand splitter): Use general_gr_operand. (TFmode nonimmediate_operand splitter): Use nonimmediate_gr_operand and general_gr_operand. (XFmode nonimmediate_operand splitter): Ditto. (DFmode nonimmediate_operand splitter): Ditto. * config/i386/mmx.md (MMXMODE nonimmediate_operand splitter): Ditto. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline SVN. Uros.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 773f29b..f2248a5 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -1749,10 +1749,9 @@ (set_attr "mode" "<MODE>")]) (define_split - [(set (match_operand:TI 0 "push_operand") - (match_operand:TI 1 "general_operand"))] - "TARGET_64BIT && reload_completed - && !SSE_REG_P (operands[1])" + [(set (match_operand:DWI 0 "push_operand") + (match_operand:DWI 1 "general_gr_operand"))] + "reload_completed" [(const_int 0)] "ix86_split_long_move (operands); DONE;") @@ -1814,14 +1813,6 @@ GEN_INT (4))); }) -(define_split - [(set (match_operand:DI 0 "push_operand") - (match_operand:DI 1 "general_operand"))] - "!TARGET_64BIT && reload_completed - && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))" - [(const_int 0)] - "ix86_split_long_move (operands); DONE;") - (define_insn "*pushsi2" [(set (match_operand:SI 0 "push_operand" "=<") (match_operand:SI 1 "general_no_elim_operand" "ri*m"))] @@ -2150,14 +2141,6 @@ ] (const_string "TI")))]) -(define_split - [(set (match_operand:TI 0 "nonimmediate_operand") - (match_operand:TI 1 "general_operand"))] - "reload_completed - && !SSE_REG_P (operands[0]) && !SSE_REG_P (operands[1])" - [(const_int 0)] - "ix86_split_long_move (operands); DONE;") - (define_insn "*movdi_internal" [(set (match_operand:DI 0 "nonimmediate_operand" "=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,m,?r ,?r,?*Yi,?*Ym,?*Yi,*k,*k ,*r,*m") @@ -2333,15 +2316,9 @@ (const_string "*")))]) (define_split - [(set (match_operand:DI 0 "nonimmediate_operand") - (match_operand:DI 1 "general_operand"))] - "!TARGET_64BIT && reload_completed - && !(MMX_REG_P (operands[0]) - || SSE_REG_P (operands[0]) - || MASK_REG_P (operands[0])) - && !(MMX_REG_P (operands[1]) - || SSE_REG_P (operands[1]) - || MASK_REG_P (operands[1]))" + [(set (match_operand:DWI 0 "nonimmediate_gr_operand") + (match_operand:DWI 1 "general_gr_operand"))] + "reload_completed" [(const_int 0)] "ix86_split_long_move (operands); DONE;") @@ -3098,12 +3075,11 @@ (define_split [(set (match_operand 0 "push_operand") - (match_operand 1 "general_operand"))] + (match_operand 1 "general_gr_operand"))] "reload_completed && (GET_MODE (operands[0]) == TFmode || GET_MODE (operands[0]) == XFmode - || GET_MODE (operands[0]) == DFmode) - && !ANY_FP_REG_P (operands[1])" + || GET_MODE (operands[0]) == DFmode)" [(const_int 0)] "ix86_split_long_move (operands); DONE;") @@ -3197,10 +3173,9 @@ (const_string "TI")))]) (define_split - [(set (match_operand:TF 0 "nonimmediate_operand") - (match_operand:TF 1 "general_operand"))] - "reload_completed - && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))" + [(set (match_operand:TF 0 "nonimmediate_gr_operand") + (match_operand:TF 1 "general_gr_operand"))] + "reload_completed" [(const_int 0)] "ix86_split_long_move (operands); DONE;") @@ -3271,10 +3246,9 @@ (const_string "*")))]) (define_split - [(set (match_operand:XF 0 "nonimmediate_operand") - (match_operand:XF 1 "general_operand"))] - "reload_completed - && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))" + [(set (match_operand:XF 0 "nonimmediate_gr_operand") + (match_operand:XF 1 "general_gr_operand"))] + "reload_completed" [(const_int 0)] "ix86_split_long_move (operands); DONE;") @@ -3474,10 +3448,9 @@ (const_string "*")))]) (define_split - [(set (match_operand:DF 0 "nonimmediate_operand") - (match_operand:DF 1 "general_operand"))] - "!TARGET_64BIT && reload_completed - && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))" + [(set (match_operand:DF 0 "nonimmediate_gr_operand") + (match_operand:DF 1 "general_gr_operand"))] + "!TARGET_64BIT && reload_completed" [(const_int 0)] "ix86_split_long_move (operands); DONE;") diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index 9992233..37e6a28 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -205,11 +205,9 @@ (const_string "DI")))]) (define_split - [(set (match_operand:MMXMODE 0 "nonimmediate_operand") - (match_operand:MMXMODE 1 "general_operand"))] - "!TARGET_64BIT && reload_completed - && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0])) - && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))" + [(set (match_operand:MMXMODE 0 "nonimmediate_gr_operand") + (match_operand:MMXMODE 1 "general_gr_operand"))] + "!TARGET_64BIT && reload_completed" [(const_int 0)] "ix86_split_long_move (operands); DONE;") diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 5956690..4c45df6 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -38,6 +38,12 @@ (match_test "GENERAL_REGNO_P (REGNO (op))") (match_operand 0 "nonimmediate_operand"))) +;; True if the operand is a general operand with GENERAL class register. +(define_predicate "general_gr_operand" + (if_then_else (match_code "reg") + (match_test "GENERAL_REGNO_P (REGNO (op))") + (match_operand 0 "general_operand"))) + ;; True if the operand is an MMX register. (define_predicate "mmx_reg_operand" (and (match_code "reg")