From: Aurelien Jarno <aurelien@aurel32.net>
To: Richard Henderson <rth@twiddle.net>
Cc: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v3 02/20] tcg-arm: Handle negated constant arguments to and/sub
Date: Fri, 29 Mar 2013 17:53:55 +0100 [thread overview]
Message-ID: <20130329165355.GI5000@ohm.aurel32.net> (raw)
In-Reply-To: <1364484781-15561-3-git-send-email-rth@twiddle.net>
On Thu, Mar 28, 2013 at 08:32:43AM -0700, Richard Henderson wrote:
> This greatly improves code generation for addition of small
> negative constants.
>
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
> tcg/arm/tcg-target.c | 41 +++++++++++++++++++++++++++++++++++------
> 1 file changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c
> index 9972792..f470caa 100644
> --- a/tcg/arm/tcg-target.c
> +++ b/tcg/arm/tcg-target.c
> @@ -147,6 +147,7 @@ static void patch_reloc(uint8_t *code_ptr, int type,
>
> #define TCG_CT_CONST_ARM 0x100
> #define TCG_CT_CONST_INV 0x200
> +#define TCG_CT_CONST_NEG 0x400
>
> /* parse target specific constraints */
> static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
> @@ -161,6 +162,9 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
> case 'K':
> ct->ct |= TCG_CT_CONST_INV;
> break;
> + case 'N': /* The gcc constraint letter is L, already used here. */
> + ct->ct |= TCG_CT_CONST_NEG;
> + break;
>
> case 'r':
> ct->ct |= TCG_CT_REG;
> @@ -291,6 +295,8 @@ static inline int tcg_target_const_match(tcg_target_long val,
> return 1;
> } else if ((ct & TCG_CT_CONST_INV) && check_fit_imm(~val)) {
> return 1;
> + } else if ((ct & TCG_CT_CONST_NEG) && check_fit_imm(-val)) {
> + return 1;
> } else {
> return 0;
> }
> @@ -512,6 +518,27 @@ static void tcg_out_dat_rIK(TCGContext *s, int cond, int opc, int opinv,
> }
> }
>
> +static void tcg_out_dat_rIN(TCGContext *s, int cond, int opc, int opneg,
> + TCGArg dst, TCGArg lhs, TCGArg rhs,
> + bool rhs_is_const)
> +{
> + /* Emit either the reg,imm or reg,reg form of a data-processing insn.
> + * rhs must satisfy the "rIN" constraint.
> + */
> + if (rhs_is_const) {
> + int rot = encode_imm(rhs);
> + if (rot < 0) {
> + rhs = -rhs;
> + rot = encode_imm(rhs);
> + assert(rot >= 0);
> + opc = opneg;
> + }
> + tcg_out_dat_imm(s, cond, opc, dst, lhs, rotl(rhs, rot) | (rot << 7));
> + } else {
> + tcg_out_dat_reg(s, cond, opc, dst, lhs, rhs, SHIFT_IMM_LSL(0));
> + }
> +}
> +
> static inline void tcg_out_mul32(TCGContext *s,
> int cond, int rd, int rs, int rm)
> {
> @@ -1634,11 +1661,13 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
> ARITH_MOV, args[0], 0, args[3], const_args[3]);
> break;
> case INDEX_op_add_i32:
> - c = ARITH_ADD;
> - goto gen_arith;
> + tcg_out_dat_rIN(s, COND_AL, ARITH_ADD, ARITH_SUB,
> + args[0], args[1], args[2], const_args[2]);
> + break;
> case INDEX_op_sub_i32:
> - c = ARITH_SUB;
> - goto gen_arith;
> + tcg_out_dat_rIN(s, COND_AL, ARITH_SUB, ARITH_ADD,
> + args[0], args[1], args[2], const_args[2]);
> + break;
> case INDEX_op_and_i32:
> tcg_out_dat_rIK(s, COND_AL, ARITH_AND, ARITH_BIC,
> args[0], args[1], args[2], const_args[2]);
> @@ -1829,8 +1858,8 @@ static const TCGTargetOpDef arm_op_defs[] = {
> { INDEX_op_st_i32, { "r", "r" } },
>
> /* TODO: "r", "r", "ri" */
> - { INDEX_op_add_i32, { "r", "r", "rI" } },
> - { INDEX_op_sub_i32, { "r", "r", "rI" } },
> + { INDEX_op_add_i32, { "r", "r", "rIN" } },
> + { INDEX_op_sub_i32, { "r", "r", "rIN" } },
> { INDEX_op_mul_i32, { "r", "r", "r" } },
> { INDEX_op_mulu2_i32, { "r", "r", "r", "r" } },
> { INDEX_op_muls2_i32, { "r", "r", "r", "r" } },
Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
--
Aurelien Jarno GPG: 1024D/F1BCDB73
aurelien@aurel32.net http://www.aurel32.net
next prev parent reply other threads:[~2013-03-29 16:54 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-28 15:32 [Qemu-devel] [PATCH v3 00/20] tcg-arm improvements Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 01/20] tcg-arm: Use bic to implement and with constant Richard Henderson
2013-03-29 16:53 ` Aurelien Jarno
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 02/20] tcg-arm: Handle negated constant arguments to and/sub Richard Henderson
2013-03-29 16:53 ` Aurelien Jarno [this message]
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 03/20] tcg-arm: Allow constant first argument to sub Richard Henderson
2013-03-29 16:58 ` Aurelien Jarno
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 04/20] tcg-arm: Use tcg_out_dat_rIN for compares Richard Henderson
2013-03-29 16:58 ` Aurelien Jarno
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 05/20] tcg-arm: Handle constant arguments to add2/sub2 Richard Henderson
2013-03-28 15:56 ` Peter Maydell
2013-03-28 16:04 ` Richard Henderson
2013-03-28 16:09 ` Laurent Desnogues
2013-03-28 16:16 ` Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 06/20] tcg-arm: Improve constant generation Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 07/20] tcg-arm: Fold epilogue into INDEX_op_exit_tb Richard Henderson
2013-03-28 16:05 ` Peter Maydell
2013-03-28 16:12 ` Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 08/20] tcg-arm: Implement deposit for armv7 Richard Henderson
2013-03-28 16:15 ` Peter Maydell
2013-03-28 16:22 ` Richard Henderson
2013-03-28 16:59 ` Peter Maydell
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 09/20] tcg-arm: Implement division instructions Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 10/20] tcg-arm: Use TCG_REG_TMP name for the tcg temporary Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 11/20] tcg-arm: Use R12 " Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 12/20] tcg-arm: Cleanup multiply subroutines Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 13/20] tcg-arm: Cleanup tcg_out_goto_label Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 14/20] tcg-arm: Cleanup goto_tb handling Richard Henderson
2013-03-28 20:09 ` Aurelien Jarno
2013-03-28 20:48 ` Richard Henderson
2013-03-29 6:50 ` Aurelien Jarno
2013-03-29 15:06 ` Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 15/20] tcg-arm: Cleanup most primitive load store subroutines Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 16/20] tcg-arm: Fix local stack frame Richard Henderson
2013-03-29 16:50 ` Aurelien Jarno
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 17/20] tcg-arm: Split out tcg_out_tlb_read Richard Henderson
2013-03-28 15:32 ` [Qemu-devel] [PATCH v3 18/20] tcg-arm: Improve scheduling of tcg_out_tlb_read Richard Henderson
2013-03-28 15:33 ` [Qemu-devel] [PATCH v3 19/20] tcg-arm: Use movi32 + blx for calls on v7 Richard Henderson
2013-03-28 15:33 ` [Qemu-devel] [PATCH v3 20/20] tcg-arm: Convert to CONFIG_QEMU_LDST_OPTIMIZATION Richard Henderson
2013-03-28 16:44 ` Peter Maydell
2013-03-28 17:46 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130329165355.GI5000@ohm.aurel32.net \
--to=aurelien@aurel32.net \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.