From 7d7f98613870188607167cb9fa744c739a8b5054 Mon Sep 17 00:00:00 2001 From: ktkachov Date: Mon, 24 Nov 2014 11:26:04 +0000 Subject: [PATCH] [AArch64][3/5] Implement fusion of MOVK+MOVK * config/aarch64/aarch64.c (AARCH64_FUSE_MOVK_MOVK): Define. (cortexa53_tunings): Specify AARCH64_FUSE_MOVK_MOVK in fuseable_ops. (cortexa57_tunings): Likewise. (aarch_macro_fusion_pair_p): Handle AARCH64_FUSE_MOVK_MOVK. Change-Id: If72a2fb863da2091fed07361e4f105c32a2bf8c1 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218013 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/aarch64/aarch64.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95ba9ad..44f31dc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-11-24 Kyrylo Tkachov + * config/aarch64/aarch64.c (AARCH64_FUSE_MOVK_MOVK): Define. + (cortexa53_tunings): Specify AARCH64_FUSE_MOVK_MOVK in fuseable_ops. + (cortexa57_tunings): Likewise. + (aarch_macro_fusion_pair_p): Handle AARCH64_FUSE_MOVK_MOVK. + +2014-11-24 Kyrylo Tkachov + * sched-deps.c (sched_macro_fuse_insns): Do not check modified_in_p in the not conditional jump case. * doc/tm.texi (TARGET_SCHED_MACRO_FUSION_PAIR_P): Update description. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 3e18c0a..149d8c8 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -268,6 +268,7 @@ static const struct cpu_vector_cost cortexa57_vector_cost = #define AARCH64_FUSE_NOTHING (0) #define AARCH64_FUSE_MOV_MOVK (1 << 0) #define AARCH64_FUSE_ADRP_ADD (1 << 1) +#define AARCH64_FUSE_MOVK_MOVK (1 << 2) #if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007 __extension__ @@ -291,7 +292,7 @@ static const struct tune_params cortexa53_tunings = &generic_vector_cost, NAMED_PARAM (memmov_cost, 4), NAMED_PARAM (issue_rate, 2), - NAMED_PARAM (fuseable_ops, (AARCH64_FUSE_MOV_MOVK | AARCH64_FUSE_ADRP_ADD)) + NAMED_PARAM (fuseable_ops, (AARCH64_FUSE_MOV_MOVK | AARCH64_FUSE_ADRP_ADD | AARCH64_FUSE_MOVK_MOVK)) }; static const struct tune_params cortexa57_tunings = @@ -302,7 +303,7 @@ static const struct tune_params cortexa57_tunings = &cortexa57_vector_cost, NAMED_PARAM (memmov_cost, 4), NAMED_PARAM (issue_rate, 3), - NAMED_PARAM (fuseable_ops, (AARCH64_FUSE_MOV_MOVK | AARCH64_FUSE_ADRP_ADD)) + NAMED_PARAM (fuseable_ops, (AARCH64_FUSE_MOV_MOVK | AARCH64_FUSE_ADRP_ADD | AARCH64_FUSE_MOVK_MOVK)) }; /* A processor implementing AArch64. */ @@ -9419,6 +9420,36 @@ aarch_macro_fusion_pair_p (rtx prev, rtx curr) } } + if (simple_sets_p + && (aarch64_tune_params->fuseable_ops & AARCH64_FUSE_MOVK_MOVK)) + { + + /* We're trying to match: + prev (movk) == (set (zero_extract (reg r0) + (const_int 16) + (const_int 32)) + (const_int imm16_1)) + curr (movk) == (set (zero_extract (reg r0) + (const_int 16) + (const_int 48)) + (const_int imm16_2)) */ + + if (GET_CODE (SET_DEST (prev_set)) == ZERO_EXTRACT + && GET_CODE (SET_DEST (curr_set)) == ZERO_EXTRACT + && REG_P (XEXP (SET_DEST (prev_set), 0)) + && REG_P (XEXP (SET_DEST (curr_set), 0)) + && REGNO (XEXP (SET_DEST (prev_set), 0)) + == REGNO (XEXP (SET_DEST (curr_set), 0)) + && CONST_INT_P (XEXP (SET_DEST (prev_set), 2)) + && CONST_INT_P (XEXP (SET_DEST (curr_set), 2)) + && INTVAL (XEXP (SET_DEST (prev_set), 2)) == 32 + && INTVAL (XEXP (SET_DEST (curr_set), 2)) == 48 + && CONST_INT_P (SET_SRC (prev_set)) + && CONST_INT_P (SET_SRC (curr_set))) + return true; + + } + return false; } -- 2.7.4