Commit 5791f55d by Kyrylo Tkachov Committed by Kyrylo Tkachov

[ARM] Refactor MOVW/MOVT fusion logic to allow extension

	* config/arm/arm.c (arm_sets_movw_movt_fusible_p): New function.
	(aarch_macro_fusion_pair_p): Use above to avoid early return.

From-SVN: r239771
parent 209ca542
2016-08-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/arm.c (arm_sets_movw_movt_fusible_p): New function.
(aarch_macro_fusion_pair_p): Use above to avoid early return.
2016-08-26 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Martin Jambhor <mjambor@suse.cz>
......
......@@ -29914,35 +29914,17 @@ arm_macro_fusion_p (void)
return current_tune->fusible_ops != tune_params::FUSE_NOTHING;
}
/* Return true if the two back-to-back sets PREV_SET, CURR_SET are suitable
for MOVW / MOVT macro fusion. */
static bool
aarch_macro_fusion_pair_p (rtx_insn* prev, rtx_insn* curr)
arm_sets_movw_movt_fusible_p (rtx prev_set, rtx curr_set)
{
rtx set_dest;
rtx prev_set = single_set (prev);
rtx curr_set = single_set (curr);
if (!prev_set
|| !curr_set)
return false;
if (any_condjump_p (curr))
return false;
if (!arm_macro_fusion_p ())
return false;
if (current_tune->fusible_ops & tune_params::FUSE_AES_AESMC
&& aarch_crypto_can_dual_issue (prev, curr))
return true;
if (current_tune->fusible_ops & tune_params::FUSE_MOVW_MOVT)
{
/* We are trying to fuse
movw imm / movt imm
instructions as a group that gets scheduled together. */
set_dest = SET_DEST (curr_set);
rtx set_dest = SET_DEST (curr_set);
if (GET_MODE (set_dest) != SImode)
return false;
......@@ -29959,6 +29941,7 @@ aarch_macro_fusion_pair_p (rtx_insn* prev, rtx_insn* curr)
curr (movt) == (set (reg r0)
(lo_sum (reg r1)
(symbol_ref ("SYM")))) */
if (GET_CODE (set_dest) == ZERO_EXTRACT)
{
if (CONST_INT_P (SET_SRC (curr_set))
......@@ -29967,6 +29950,7 @@ aarch_macro_fusion_pair_p (rtx_insn* prev, rtx_insn* curr)
&& REG_P (SET_DEST (prev_set))
&& REGNO (XEXP (set_dest, 0)) == REGNO (SET_DEST (prev_set)))
return true;
}
else if (GET_CODE (SET_SRC (curr_set)) == LO_SUM
&& REG_P (SET_DEST (curr_set))
......@@ -29974,7 +29958,34 @@ aarch_macro_fusion_pair_p (rtx_insn* prev, rtx_insn* curr)
&& GET_CODE (SET_SRC (prev_set)) == HIGH
&& REGNO (SET_DEST (curr_set)) == REGNO (SET_DEST (prev_set)))
return true;
}
return false;
}
static bool
aarch_macro_fusion_pair_p (rtx_insn* prev, rtx_insn* curr)
{
rtx prev_set = single_set (prev);
rtx curr_set = single_set (curr);
if (!prev_set
|| !curr_set)
return false;
if (any_condjump_p (curr))
return false;
if (!arm_macro_fusion_p ())
return false;
if (current_tune->fusible_ops & tune_params::FUSE_AES_AESMC
&& aarch_crypto_can_dual_issue (prev, curr))
return true;
if (current_tune->fusible_ops & tune_params::FUSE_MOVW_MOVT
&& arm_sets_movw_movt_fusible_p (prev_set, curr_set))
return true;
return false;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment