From nobody Mon Feb 9 15:28:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1770182753; cv=none; d=zohomail.com; s=zohoarc; b=hjYUkSxNruUMGkiLMz89MTrsCsnH1O0st8pOCf33uSR/Zkc33bejDTG5plUTU4n8Gsvv2r31r6XaK5y0BplCcHYYHvDEfc6uGWBUFZw+RNeD94aPH1ogv24I7t6M95yNnzakdqecB2VKtmIRwJjJpdK7FszyNAhMeXpMMkeKCqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770182753; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=QAkc222DnVlZAYEVs59TD8Lx74BTiYYPg03o07EYwlg=; b=Ql/AvZjaW9xH4rYduvDBbaJYVsl6rasTnDdLg5i6gzZ9tPo72s4B2v8hfTDNZbgKHLBFQzWalFGTdfUniprgCciqAFzte/GBdBkTvvZzB5AjNaKCEOG4WCCIgn5N/1HhI9bD0ZWtfeNH8eV0PY/yPoYgja69ivyIDHNUhQ5irIs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770182753088712.4837287505989; Tue, 3 Feb 2026 21:25:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnVO5-0000WB-LT; Wed, 04 Feb 2026 00:25:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnVO1-0000Ve-56 for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:09 -0500 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnVNy-0003Gm-VG for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:08 -0500 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-2a7b23dd036so31239355ad.3 for ; Tue, 03 Feb 2026 21:25:06 -0800 (PST) Received: from stoup.. (bg30dhzlx7lnyrq74wrz.ip6.superloop.au. [2401:d002:dc0f:2100:1bc:fe1e:491:928e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933965c3esm10062015ad.67.2026.02.03.21.25.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:25:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770182705; x=1770787505; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QAkc222DnVlZAYEVs59TD8Lx74BTiYYPg03o07EYwlg=; b=vccjlMeAtLwVZHPl6vxalGSYV9XVAck6jWkX0Bp31lZTk79h3Ow/c/LXa8Dq5U8lzx o09VE8CROgYZ3EfagQMEeYlbmnTwT2yyrnLjER4w3iQX2f0dRyim8wfRcxPyzU0GGiZg YkWF+kGT2IAvZQfGQn6FxbtuGp7oRYrRbrI7YaoJs9Ku5Z/gpYGQie1IW0T+EYwGEAlp NJVeaPKrbWz1P/Xocpb806+6Qi3Ekp4pkuncmHEI8tOTFJuTiQo/Qu9tDq1/G6epohBb 2wcJzkdZZkQK6xYk2Iq51pTNVksrST70CmEtl+WdrXDHHzNiUtzqeJcF/bndPPcL6t1X B6Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770182705; x=1770787505; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=QAkc222DnVlZAYEVs59TD8Lx74BTiYYPg03o07EYwlg=; b=wdO211GWXXq+/t+e+39FN+a6Y+l0TZZZ+jUbIjC8s6FnIlskYlGUlG5Vgi8RvjIdyi RlwI0DBwJYyvvvCy6MaqEq/408izhOqY5bxbqUu7v6U0QqUGzRshGE1RQ7Ad+U1/IU30 5Rq1Ixp/bGLHDg6fMtKsARDHfYBSwC/RqVs0UmHJKzhMvxND0qrDk4S8j2qvg7ppC1N8 gqz+UoaUAGORwt14C2cJ+Ri8VgFHMJ18l7f0W/9KLmLf240ZB3lrSpCUxwtXLYKQX8XD xpdp9bD+CpSCPTD6RI6TmE4ecv7zoWqeNDepPqAHcaDKn/Zg+Il739hTL+YiJuQbv82n Wvfw== X-Gm-Message-State: AOJu0YwVJPRS8gKAbT+HdI4Lto2zzO5frCoMUpxCJ+DTIRKOxGrAHsDd 9OL7oRHcNFf/rAeTdvDHPpEN4aKRndAjYsAWgX98+LDIOl7QnoxYc76iB5qnR5MUemmAJ0kr2cp ZIXlaYdM= X-Gm-Gg: AZuq6aK9sXNtHOgh1MBBB2QEPC1kHyZjBu7hlNuvzxgwUucd6bjetqfeXVywRbg+KqJ cU+cglqvHbl0i76Fg5cJdWSi39JcaJFHH0XzMKCJ47Yh6MTc13GjFHOAZqwKsABN9W0PfAplUBp ywE5X73OCTYlJsVfMpa+i0xAAOTDzC42bLVoqEiFfPVNynZxAPVaLgLluH6z0T9TwxpWO6a3Eby ot7JPUusQRXFpZNisu/gC3ZfjjuhAx5+XLJ/1KVhAqlev1dNHO9wfnwTWx2fQPWFNnirhWtKiyf w08xOYYbckGdJ4Fjpyr+c18HNhj5XBAS+yjAca2/J0eEJ6kFfzbnzvg2buzo5QAWF347YhBTBhe f8UeOx+Cg+b7uX+ZFylD4+X/5g6spKsKFlCGe8/M0OQmmeYvcdR+ADLc/wXnYRcIXqcrhtZT01H 4+b1feqitaWx8lw8Lp5P0UBtoq/Ffc9IoXKDjP7XPQMyEzfiWWgUpNIWiC3s4= X-Received: by 2002:a17:903:191:b0:2a9:57b:2c9f with SMTP id d9443c01a7336-2a93413512cmr18167645ad.58.1770182704968; Tue, 03 Feb 2026 21:25:04 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com Subject: [PATCH v2 1/6] tcg/optimize: Lower unsupported deposit during optimize Date: Wed, 4 Feb 2026 15:24:51 +1000 Message-ID: <20260204052456.970605-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260204052456.970605-1-richard.henderson@linaro.org> References: <20260204052456.970605-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1770182754922158500 Content-Type: text/plain; charset="utf-8" The expansions that we chose in tcg-op.c may be less than optimial. Delay lowering until optimize, so that we have propagated constants and have computed known zero/one masks. Signed-off-by: Richard Henderson --- tcg/optimize.c | 194 +++++++++++++++++++++++++++++++++++++++++++------ tcg/tcg-op.c | 113 ++-------------------------- 2 files changed, 178 insertions(+), 129 deletions(-) diff --git a/tcg/optimize.c b/tcg/optimize.c index 801a0a2c68..890c8068fb 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -1652,12 +1652,17 @@ static bool fold_ctpop(OptContext *ctx, TCGOp *op) =20 static bool fold_deposit(OptContext *ctx, TCGOp *op) { - TempOptInfo *t1 =3D arg_info(op->args[1]); - TempOptInfo *t2 =3D arg_info(op->args[2]); + TCGArg ret =3D op->args[0]; + TCGArg arg1 =3D op->args[1]; + TCGArg arg2 =3D op->args[2]; int ofs =3D op->args[3]; int len =3D op->args[4]; - int width =3D 8 * tcg_type_size(ctx->type); - uint64_t z_mask, o_mask, s_mask; + TempOptInfo *t1 =3D arg_info(arg1); + TempOptInfo *t2 =3D arg_info(arg2); + int width; + uint64_t z_mask, o_mask, s_mask, type_mask, len_mask; + TCGOp *op2; + bool valid; =20 if (ti_is_const(t1) && ti_is_const(t2)) { return tcg_opt_gen_movi(ctx, op, op->args[0], @@ -1665,35 +1670,182 @@ static bool fold_deposit(OptContext *ctx, TCGOp *o= p) ti_const_val(t2))); } =20 - /* Inserting a value into zero at offset 0. */ - if (ti_is_const_val(t1, 0) && ofs =3D=3D 0) { - uint64_t mask =3D MAKE_64BIT_MASK(0, len); + width =3D 8 * tcg_type_size(ctx->type); + type_mask =3D MAKE_64BIT_MASK(0, width); + len_mask =3D MAKE_64BIT_MASK(0, len); =20 + /* Inserting all-zero into a value. */ + if ((t2->z_mask & len_mask) =3D=3D 0) { op->opc =3D INDEX_op_and; - op->args[1] =3D op->args[2]; - op->args[2] =3D arg_new_constant(ctx, mask); + op->args[2] =3D arg_new_constant(ctx, ~(len_mask << ofs)); return fold_and(ctx, op); } =20 - /* Inserting zero into a value. */ - if (ti_is_const_val(t2, 0)) { - uint64_t mask =3D deposit64(-1, ofs, len, 0); - - op->opc =3D INDEX_op_and; - op->args[2] =3D arg_new_constant(ctx, mask); - return fold_and(ctx, op); + /* Inserting all-one into a value. */ + if ((t2->o_mask & len_mask) =3D=3D len_mask) { + op->opc =3D INDEX_op_or; + op->args[2] =3D arg_new_constant(ctx, len_mask << ofs); + return fold_or(ctx, op); } =20 - /* The s_mask from the top portion of the deposit is still valid. */ - if (ofs + len =3D=3D width) { - s_mask =3D t2->s_mask << ofs; - } else { - s_mask =3D t1->s_mask & ~MAKE_64BIT_MASK(0, ofs + len); + valid =3D TCG_TARGET_deposit_valid(ctx->type, ofs, len); + + /* Lower invalid deposit of constant as AND + OR. */ + if (!valid && ti_is_const(t2)) { + uint64_t ins_val =3D (ti_const_val(t2) & len_mask) << ofs; + + op2 =3D opt_insert_before(ctx, op, INDEX_op_and, 3); + op2->args[0] =3D ret; + op2->args[1] =3D arg1; + op2->args[2] =3D arg_new_constant(ctx, ~(len_mask << ofs)); + fold_and(ctx, op2); + + op->opc =3D INDEX_op_or; + op->args[1] =3D ret; + op->args[2] =3D arg_new_constant(ctx, ins_val); + return fold_or(ctx, op); } =20 + /* + * Compute result masks before calling other fold_* subroutines + * which could modify the masks of our inputs. + */ z_mask =3D deposit64(t1->z_mask, ofs, len, t2->z_mask); o_mask =3D deposit64(t1->o_mask, ofs, len, t2->o_mask); + if (ofs + len < width) { + s_mask =3D t1->s_mask & ~MAKE_64BIT_MASK(0, ofs + len); + } else { + s_mask =3D t2->s_mask << ofs; + } =20 + /* Inserting a value into zero. */ + if (ti_is_const_val(t1, 0)) { + uint64_t need_mask; + + /* Always lower deposit into zero at 0 as AND. */ + if (ofs =3D=3D 0) { + op->opc =3D INDEX_op_and; + op->args[1] =3D arg2; + op->args[2] =3D arg_new_constant(ctx, len_mask); + return fold_and(ctx, op); + } + + /* + * If the portion of the value outside len that remains after + * shifting is zero, we can elide the mask and just shift. + */ + need_mask =3D t2->z_mask & ~len_mask; + need_mask =3D (need_mask << ofs) & type_mask; + if (!need_mask) { + op->opc =3D INDEX_op_shl; + op->args[1] =3D arg2; + op->args[2] =3D arg_new_constant(ctx, ofs); + goto done; + } + + /* Lower invalid deposit into zero as AND + SHL or SHL + AND. */ + if (!valid) { + if (TCG_TARGET_extract_valid(ctx->type, 0, ofs + len) && + !TCG_TARGET_extract_valid(ctx->type, 0, len)) { + op2 =3D opt_insert_before(ctx, op, INDEX_op_shl, 3); + op2->args[0] =3D ret; + op2->args[1] =3D arg2; + op2->args[2] =3D arg_new_constant(ctx, ofs); + + op->opc =3D INDEX_op_extract; + op->args[1] =3D ret; + op->args[2] =3D 0; + op->args[3] =3D ofs + len; + goto done; + } + + op2 =3D opt_insert_before(ctx, op, INDEX_op_and, 3); + op2->args[0] =3D ret; + op2->args[1] =3D arg2; + op2->args[2] =3D arg_new_constant(ctx, len_mask); + fold_and(ctx, op2); + + op->opc =3D INDEX_op_shl; + op->args[1] =3D ret; + op->args[2] =3D arg_new_constant(ctx, ofs); + goto done; + } + } + + /* After special cases, lower invalid deposit. */ + if (!valid) { + TCGArg tmp; + bool has_ext2 =3D tcg_op_supported(INDEX_op_extract2, ctx->type, 0= ); + bool has_rotl =3D tcg_op_supported(INDEX_op_rotl, ctx->type, 0); + + /* + * ret =3D arg2:arg1 >> len + * ret =3D rotl(ret, len) + */ + if (ofs =3D=3D 0 && has_ext2 && has_rotl) { + op2 =3D opt_insert_before(ctx, op, INDEX_op_extract2, 4); + op2->args[0] =3D ret; + op2->args[1] =3D arg1; + op2->args[2] =3D arg2; + op2->args[3] =3D len; + + op->opc =3D INDEX_op_rotl; + op->args[1] =3D ret; + op->args[2] =3D arg_new_constant(ctx, len); + goto done; + } + + /* + * tmp =3D arg1 << len + * ret =3D arg2:tmp >> len + */ + if (ofs + len =3D=3D width && has_ext2) { + tmp =3D ret =3D=3D arg2 ? arg_new_temp(ctx) : ret; + + op2 =3D opt_insert_before(ctx, op, INDEX_op_shl, 4); + op2->args[0] =3D tmp; + op2->args[1] =3D arg1; + op2->args[2] =3D arg_new_constant(ctx, len); + + op->opc =3D INDEX_op_extract2; + op->args[0] =3D ret; + op->args[1] =3D tmp; + op->args[2] =3D arg2; + op->args[3] =3D len; + goto done; + } + + /* + * tmp =3D arg2 & mask + * ret =3D arg1 & ~(mask << ofs) + * tmp =3D tmp << ofs + * ret =3D ret | tmp + */ + tmp =3D arg_new_temp(ctx); + + op2 =3D opt_insert_before(ctx, op, INDEX_op_and, 3); + op2->args[0] =3D tmp; + op2->args[1] =3D arg2; + op2->args[2] =3D arg_new_constant(ctx, len_mask); + fold_and(ctx, op2); + + op2 =3D opt_insert_before(ctx, op, INDEX_op_shl, 3); + op2->args[0] =3D tmp; + op2->args[1] =3D tmp; + op2->args[2] =3D arg_new_constant(ctx, ofs); + + op2 =3D opt_insert_before(ctx, op, INDEX_op_and, 3); + op2->args[0] =3D ret; + op2->args[1] =3D arg1; + op2->args[2] =3D arg_new_constant(ctx, ~(len_mask << ofs)); + fold_and(ctx, op2); + + op->opc =3D INDEX_op_or; + op->args[1] =3D ret; + op->args[2] =3D tmp; + } + + done: return fold_masks_zos(ctx, op, z_mask, o_mask, s_mask); } =20 diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 8d67acc4fc..96f72ba381 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -876,9 +876,6 @@ void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int= 32_t arg2) void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2, unsigned int ofs, unsigned int len) { - uint32_t mask; - TCGv_i32 t1; - tcg_debug_assert(ofs < 32); tcg_debug_assert(len > 0); tcg_debug_assert(len <=3D 32); @@ -886,39 +883,9 @@ void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, = TCGv_i32 arg2, =20 if (len =3D=3D 32) { tcg_gen_mov_i32(ret, arg2); - return; - } - if (TCG_TARGET_deposit_valid(TCG_TYPE_I32, ofs, len)) { - tcg_gen_op5ii_i32(INDEX_op_deposit, ret, arg1, arg2, ofs, len); - return; - } - - t1 =3D tcg_temp_ebb_new_i32(); - - if (tcg_op_supported(INDEX_op_extract2, TCG_TYPE_I32, 0)) { - if (ofs + len =3D=3D 32) { - tcg_gen_shli_i32(t1, arg1, len); - tcg_gen_extract2_i32(ret, t1, arg2, len); - goto done; - } - if (ofs =3D=3D 0) { - tcg_gen_extract2_i32(ret, arg1, arg2, len); - tcg_gen_rotli_i32(ret, ret, len); - goto done; - } - } - - mask =3D (1u << len) - 1; - if (ofs + len < 32) { - tcg_gen_andi_i32(t1, arg2, mask); - tcg_gen_shli_i32(t1, t1, ofs); } else { - tcg_gen_shli_i32(t1, arg2, ofs); + tcg_gen_op5ii_i32(INDEX_op_deposit, ret, arg1, arg2, ofs, len); } - tcg_gen_andi_i32(ret, arg1, ~(mask << ofs)); - tcg_gen_or_i32(ret, ret, t1); - done: - tcg_temp_free_i32(t1); } =20 void tcg_gen_deposit_z_i32(TCGv_i32 ret, TCGv_i32 arg, @@ -932,28 +899,10 @@ void tcg_gen_deposit_z_i32(TCGv_i32 ret, TCGv_i32 arg, if (ofs + len =3D=3D 32) { tcg_gen_shli_i32(ret, arg, ofs); } else if (ofs =3D=3D 0) { - tcg_gen_andi_i32(ret, arg, (1u << len) - 1); - } else if (TCG_TARGET_deposit_valid(TCG_TYPE_I32, ofs, len)) { + tcg_gen_extract_i32(ret, arg, 0, len); + } else { TCGv_i32 zero =3D tcg_constant_i32(0); tcg_gen_op5ii_i32(INDEX_op_deposit, ret, zero, arg, ofs, len); - } else { - /* - * To help two-operand hosts we prefer to zero-extend first, - * which allows ARG to stay live. - */ - if (TCG_TARGET_extract_valid(TCG_TYPE_I32, 0, len)) { - tcg_gen_extract_i32(ret, arg, 0, len); - tcg_gen_shli_i32(ret, ret, ofs); - return; - } - /* Otherwise prefer zero-extension over AND for code size. */ - if (TCG_TARGET_extract_valid(TCG_TYPE_I32, 0, ofs + len)) { - tcg_gen_shli_i32(ret, arg, ofs); - tcg_gen_extract_i32(ret, ret, 0, ofs + len); - return; - } - tcg_gen_andi_i32(ret, arg, (1u << len) - 1); - tcg_gen_shli_i32(ret, ret, ofs); } } =20 @@ -2148,9 +2097,6 @@ void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, i= nt64_t arg2) void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2, unsigned int ofs, unsigned int len) { - uint64_t mask; - TCGv_i64 t1; - tcg_debug_assert(ofs < 64); tcg_debug_assert(len > 0); tcg_debug_assert(len <=3D 64); @@ -2158,40 +2104,9 @@ void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1= , TCGv_i64 arg2, =20 if (len =3D=3D 64) { tcg_gen_mov_i64(ret, arg2); - return; - } - - if (TCG_TARGET_deposit_valid(TCG_TYPE_I64, ofs, len)) { - tcg_gen_op5ii_i64(INDEX_op_deposit, ret, arg1, arg2, ofs, len); - return; - } - - t1 =3D tcg_temp_ebb_new_i64(); - - if (tcg_op_supported(INDEX_op_extract2, TCG_TYPE_I64, 0)) { - if (ofs + len =3D=3D 64) { - tcg_gen_shli_i64(t1, arg1, len); - tcg_gen_extract2_i64(ret, t1, arg2, len); - goto done; - } - if (ofs =3D=3D 0) { - tcg_gen_extract2_i64(ret, arg1, arg2, len); - tcg_gen_rotli_i64(ret, ret, len); - goto done; - } - } - - mask =3D (1ull << len) - 1; - if (ofs + len < 64) { - tcg_gen_andi_i64(t1, arg2, mask); - tcg_gen_shli_i64(t1, t1, ofs); } else { - tcg_gen_shli_i64(t1, arg2, ofs); + tcg_gen_op5ii_i64(INDEX_op_deposit, ret, arg1, arg2, ofs, len); } - tcg_gen_andi_i64(ret, arg1, ~(mask << ofs)); - tcg_gen_or_i64(ret, ret, t1); - done: - tcg_temp_free_i64(t1); } =20 void tcg_gen_deposit_z_i64(TCGv_i64 ret, TCGv_i64 arg, @@ -2206,27 +2121,9 @@ void tcg_gen_deposit_z_i64(TCGv_i64 ret, TCGv_i64 ar= g, tcg_gen_shli_i64(ret, arg, ofs); } else if (ofs =3D=3D 0) { tcg_gen_andi_i64(ret, arg, (1ull << len) - 1); - } else if (TCG_TARGET_deposit_valid(TCG_TYPE_I64, ofs, len)) { + } else { TCGv_i64 zero =3D tcg_constant_i64(0); tcg_gen_op5ii_i64(INDEX_op_deposit, ret, zero, arg, ofs, len); - } else { - /* - * To help two-operand hosts we prefer to zero-extend first, - * which allows ARG to stay live. - */ - if (TCG_TARGET_extract_valid(TCG_TYPE_I64, 0, len)) { - tcg_gen_extract_i64(ret, arg, 0, len); - tcg_gen_shli_i64(ret, ret, ofs); - return; - } - /* Otherwise prefer zero-extension over AND for code size. */ - if (TCG_TARGET_extract_valid(TCG_TYPE_I64, 0, ofs + len)) { - tcg_gen_shli_i64(ret, arg, ofs); - tcg_gen_extract_i64(ret, ret, 0, ofs + len); - return; - } - tcg_gen_andi_i64(ret, arg, (1ull << len) - 1); - tcg_gen_shli_i64(ret, ret, ofs); } } =20 --=20 2.43.0 From nobody Mon Feb 9 15:28:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1770182797; cv=none; d=zohomail.com; s=zohoarc; b=ZeJxNbbLR9noJDC3d+0cljyi8rwmCyCbK5ccvJA0Hle8Y67o3BJvgbOuRdgJGcOlS+cy55sUiBNW5/2NQWV9wtgyIMN0DtUQD1UVkjloSSAMNh70q4LGGIq+RKYDaZetsn3zHyyqREhMqrXB4+wa6I5EeRTfHha+VsdBXZp9Pj8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770182797; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Aa9mZAXen3GNDGFdJHfEPbpr07SEJ40e/xyiM/mpQH8=; b=l9xU1HYINhZ5meNc0E63SMjQadUREx1ArCdYS6v3BcfZo9MX8T0eCZW6xc/uAMt4oHohaCslkrKlFmt4z06cwR95rKBz7FUVnswYj82cXxY4eOwjQThgmM/u8IsihOFuHIXM5z+9tVrzbaUK3SjWCAtGdA9iz+/+C2j9t+hsV6A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770182797097769.5862578898989; Tue, 3 Feb 2026 21:26:37 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnVO8-0000Zh-TI; Wed, 04 Feb 2026 00:25:16 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnVO2-0000Vo-RG for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:11 -0500 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnVO1-0003HD-0d for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:10 -0500 Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-3530715386cso4756484a91.2 for ; Tue, 03 Feb 2026 21:25:08 -0800 (PST) Received: from stoup.. (bg30dhzlx7lnyrq74wrz.ip6.superloop.au. [2401:d002:dc0f:2100:1bc:fe1e:491:928e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933965c3esm10062015ad.67.2026.02.03.21.25.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:25:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770182708; x=1770787508; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Aa9mZAXen3GNDGFdJHfEPbpr07SEJ40e/xyiM/mpQH8=; b=bASyJfjlHoRAy+6kI3xSDUSNrSzYYfZd98VvzbxmrfaKRd8NO9cofmE1tFA3iGzFic QeG755C1Afk5R+U6yhEc0+hT/9KHwhv3aYy2yawD+iHuR9JS4a7k09VC3i73nRQ9iP1U ifObuum5PhgSxRjtBW+7Gjyz+QP1rnlM2N8CZ/30KrYFupkRem4nBIeEuJlgwkDmMEqi 3LDjM3nDPV5XcOnaQjcp3MCEJgVO+uWRSMtBXTnd2giP9mtm2w3elNAjzQkQWZQEYX7P 82kuxQojaDdpz+mgdwaHn2BxqXf3l8y/b0mx1DZkuQQ4kC/MTjRYOqdrZqRsvCu9vMTO 2wkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770182708; x=1770787508; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Aa9mZAXen3GNDGFdJHfEPbpr07SEJ40e/xyiM/mpQH8=; b=Pk3EvNdHI2ofUCsjZroW7Pd4MHIfSIgsrgMpZ2017dTRTCkghmBprRWw13mwSY64lD AqGoG/JWs/bnOHOkYw60SYCheIqlIPawxBGjUPcO+2AqI4MrAInWIo6SqIyzOne6FWd8 lIDBF4bfKes3BtbYgqxa0uKYr6lA62fDUaT37RzK8e44JbjPK3Stsj9O5TA4D6bBPz7O ElH9I35pkp5lGa2AjP4N1guB1B/a86W2MK8wo/R1YleizV704KMJnguha3Nswbhuesu6 uNwKupzlYirZhHLF3eAEqsGBL+JzXWh9vVrxkx7SOYXQS0MSmR1/BpsRtNqjsxs8/edU QJEg== X-Gm-Message-State: AOJu0Yx2iZjUrpZhfbrTSBglxL8MWVCkwT33FN98dvxVs/3W/fY379Ez fy8hLNWQq5Mu7I7+gGN8TdESUmJwM414jnE2nbxjD9TquwzHYeocqAFiQ9yI9HunXHJS94S4aX5 jsB9s1WY= X-Gm-Gg: AZuq6aLMs/X/l9Dm8EU0eAdCGqf7qJrjD//1bEJroccb5S5HZAYDzMN813rgN9bL3Gh H+wXkQyLgUgHo6WUgRyhmRMabme6+y6mchcA9PPTt5j3zD+dMEC0KXQRJmeRutMAco7k+0Olz4T odMAFGzEyVFD26LSSota1XoIueyIJq+QBkt3yp6ZrR2IHCeTxgcbe1BcjGRF7M4fjbdGVob1zMu cCD1UieOEWLeGIPcg1frcDCdIGHNxxeejTthTU4XumDYaDSawidCgwtjeVZ/W4fN9Ze+z4ZQ6Hj kcjC4p3jG/T3Ee+5Zl0TzWSlv+Kh0BuciDiFDwMCmL5jvAm6bTadVbtQ2N4ahTiTPRZxammmxQ5 Vpa/8sYluuwYtOCFQ9KehaZLGLUQxeTggYjKbOs2BDhYQ4yUNo+S968Dit9dWw397qTLHYtU+B0 kLzYt1B7I0L6lkBAEu6/W5Fy0G03+UdBSSXfjrqhCulEOjYLCBvOc2bjd4CJg= X-Received: by 2002:a17:90b:1643:b0:345:badf:f1b7 with SMTP id 98e67ed59e1d1-354871db4e8mr1497664a91.28.1770182707562; Tue, 03 Feb 2026 21:25:07 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, Manos Pitsidianakis Subject: [PATCH v2 2/6] tcg/optimize: Lower unsupported extract2 during optimize Date: Wed, 4 Feb 2026 15:24:52 +1000 Message-ID: <20260204052456.970605-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260204052456.970605-1-richard.henderson@linaro.org> References: <20260204052456.970605-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1031; envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x1031.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1770182799859154100 Content-Type: text/plain; charset="utf-8" The expansions that we chose in tcg-op.c may be less than optimial. Delay lowering until optimize, so that we have propagated constants and have computed known zero/one masks. Reviewed-by: Manos Pitsidianakis Signed-off-by: Richard Henderson --- tcg/optimize.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++---- tcg/tcg-op.c | 9 ++------ 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/tcg/optimize.c b/tcg/optimize.c index 890c8068fb..e6a16921c9 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -1933,21 +1933,74 @@ static bool fold_extract2(OptContext *ctx, TCGOp *o= p) uint64_t z2 =3D t2->z_mask; uint64_t o1 =3D t1->o_mask; uint64_t o2 =3D t2->o_mask; + uint64_t zr, or; int shr =3D op->args[3]; + int shl; =20 if (ctx->type =3D=3D TCG_TYPE_I32) { z1 =3D (uint32_t)z1 >> shr; o1 =3D (uint32_t)o1 >> shr; - z2 =3D (uint64_t)((int32_t)z2 << (32 - shr)); - o2 =3D (uint64_t)((int32_t)o2 << (32 - shr)); + shl =3D 32 - shr; + z2 =3D (uint64_t)((int32_t)z2 << shl); + o2 =3D (uint64_t)((int32_t)o2 << shl); } else { z1 >>=3D shr; o1 >>=3D shr; - z2 <<=3D 64 - shr; - o2 <<=3D 64 - shr; + shl =3D 64 - shr; + z2 <<=3D shl; + o2 <<=3D shl; + } + zr =3D z1 | z2; + or =3D o1 | o2; + + if (zr =3D=3D or) { + return tcg_opt_gen_movi(ctx, op, op->args[0], zr); } =20 - return fold_masks_zo(ctx, op, z1 | z2, o1 | o2); + if (z2 =3D=3D 0) { + /* High part zeros folds to simple right shift. */ + op->opc =3D INDEX_op_shr; + op->args[2] =3D arg_new_constant(ctx, shr); + } else if (z1 =3D=3D 0) { + /* Low part zeros folds to simple left shift. */ + op->opc =3D INDEX_op_shl; + op->args[1] =3D op->args[2]; + op->args[2] =3D arg_new_constant(ctx, shl); + } else if (!tcg_op_supported(INDEX_op_extract2, ctx->type, 0)) { + TCGArg tmp =3D arg_new_temp(ctx); + TCGOp *op2 =3D opt_insert_before(ctx, op, INDEX_op_shr, 3); + + op2->args[0] =3D tmp; + op2->args[1] =3D op->args[1]; + op2->args[2] =3D arg_new_constant(ctx, shr); + + if (TCG_TARGET_deposit_valid(ctx->type, shl, shr)) { + /* + * Deposit has more arguments than extract2, + * so we need to create a new TCGOp. + */ + op2 =3D opt_insert_before(ctx, op, INDEX_op_deposit, 5); + op2->args[0] =3D op->args[0]; + op2->args[1] =3D tmp; + op2->args[2] =3D op->args[2]; + op2->args[3] =3D shl; + op2->args[4] =3D shr; + + tcg_op_remove(ctx->tcg, op); + op =3D op2; + } else { + op2 =3D opt_insert_before(ctx, op, INDEX_op_shl, 3); + op2->args[0] =3D op->args[0]; + op2->args[1] =3D op->args[2]; + op2->args[2] =3D arg_new_constant(ctx, shl); + + op->opc =3D INDEX_op_or; + op->args[1] =3D op->args[0]; + op->args[2] =3D tmp; + } + } + + return fold_masks_zo(ctx, op, zr, or); } =20 static bool fold_exts(OptContext *ctx, TCGOp *op) diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 96f72ba381..8a4fd14ad5 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -1000,13 +1000,8 @@ void tcg_gen_extract2_i32(TCGv_i32 ret, TCGv_i32 al,= TCGv_i32 ah, tcg_gen_mov_i32(ret, ah); } else if (al =3D=3D ah) { tcg_gen_rotri_i32(ret, al, ofs); - } else if (tcg_op_supported(INDEX_op_extract2, TCG_TYPE_I32, 0)) { - tcg_gen_op4i_i32(INDEX_op_extract2, ret, al, ah, ofs); } else { - TCGv_i32 t0 =3D tcg_temp_ebb_new_i32(); - tcg_gen_shri_i32(t0, al, ofs); - tcg_gen_deposit_i32(ret, t0, ah, 32 - ofs, ofs); - tcg_temp_free_i32(t0); + tcg_gen_op4i_i32(INDEX_op_extract2, ret, al, ah, ofs); } } =20 @@ -2221,7 +2216,7 @@ void tcg_gen_extract2_i64(TCGv_i64 ret, TCGv_i64 al, = TCGv_i64 ah, tcg_gen_mov_i64(ret, ah); } else if (al =3D=3D ah) { tcg_gen_rotri_i64(ret, al, ofs); - } else if (tcg_op_supported(INDEX_op_extract2, TCG_TYPE_I64, 0)) { + } else if (TCG_TARGET_REG_BITS =3D=3D 64) { tcg_gen_op4i_i64(INDEX_op_extract2, ret, al, ah, ofs); } else { TCGv_i64 t0 =3D tcg_temp_ebb_new_i64(); --=20 2.43.0 From nobody Mon Feb 9 15:28:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1770182801; cv=none; d=zohomail.com; s=zohoarc; b=L1PwszxNDHwAB0jJf9mN9tVrCNEE6HTqrMG7gGp1J4PqkiGsbrVQizjdpqcQLqemxAL91UuVuFRy8MmuuihrydTT3QA2/PodQ4JTueJF8Z7ykh1UZTp0RggPccYPW10AlClco2GtiLLhuT1aBGjCCcGv2pJ6uUzri4xnIyhMOZQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770182801; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=dVPzdCnFdmlrffK3fWEylRJxEnVHNoCcDL2ufRITdLk=; b=lpTh9vz7dfLZ6elBPGmlHC8V7THt+lly+VsuTHZ6eqrVwbYdDFdjj3VMoKgo2UKzdehSaPXErT/121hmzLqIAqC2FpmwqM9P/ipLfVdDeoprsR+X4MLidl4gGETD+3ngfAn2l77Qg+I2Jce98vJouCatTwKekrwFY2+W4CAbjCE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770182801763503.445370360094; Tue, 3 Feb 2026 21:26:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnVOA-0000aw-D1; Wed, 04 Feb 2026 00:25:18 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnVO5-0000WM-Vw for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:15 -0500 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnVO3-0003Hb-NJ for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:13 -0500 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-2a7bceb6cd0so44539695ad.1 for ; Tue, 03 Feb 2026 21:25:11 -0800 (PST) Received: from stoup.. (bg30dhzlx7lnyrq74wrz.ip6.superloop.au. [2401:d002:dc0f:2100:1bc:fe1e:491:928e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933965c3esm10062015ad.67.2026.02.03.21.25.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:25:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770182710; x=1770787510; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dVPzdCnFdmlrffK3fWEylRJxEnVHNoCcDL2ufRITdLk=; b=mAGwcJVV3AZyBnUopcmnMWZgHWWOVsDfim1V0/hGmM56h6RSpd1KeatcGa2le4uPKr heLYme1cxbj3I+XR8ZcX++ZwSnF15qCSUGeabMt6tp4ChHitVW/RqzEubVM0n3AXgRzA Q+3iPapHbbG+qlT7Vo5XJpgSjKkiPE9bVUQpFmxvuh6sk3ao07ACtTeEMjuFJPlkhMwM EAVWT6lMgAjQOGCgtfIS/tAcN2T7g5e541Ch0mKY+XGV1DHLBMYXcsO6LijyQvoynO6F VveuJthYVIpRQH2c8i0GaP09xUS94uiARpXiY+X6wv1a34nFOGBNRCUopK4uHGc+kJPc Ov4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770182710; x=1770787510; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dVPzdCnFdmlrffK3fWEylRJxEnVHNoCcDL2ufRITdLk=; b=TEQFgpgAoTKr3t3QQxFWFM6ZVdFtCQmK81zidI52P3eyqcvbrYw5VmGDqh22esbDY+ H6PFyiq63XmrH34/nFqSf2LxJMCGk2P9V/GaykOfD4bRjbYdiXdGkxJQbbfnVFlzrQuK YNSaCT4XT7XrcbeICreIz0J3H7EdxqBYhcwQIKE8KGXoPHE54rLVIqDU8xyUkB9hPNgK 8mln3AxC4FOnvuaRAyowNpGLPK9cC3CK64j2o5r5yPfC6VreOPQZ2B/J1amEzRE3tWYJ QJEEoEXxYjf8zwFXRD6eBZhIob+c2vVGfjAdr06onYPACxZ4uKOHjsluHxOxs+uNUSQB 6yEg== X-Gm-Message-State: AOJu0YyzVOrdOhFLM0VfPOlHz53ElIqdIQKZpp5JMceFFpq0cJ8UUy15 6OtQPqHABX/HYiKF1vraeVMD0qGnoZuY+TordM4v84uWh881tD40dtfGXafjb1FEr+8TbNIvuVH nqZXkgAo= X-Gm-Gg: AZuq6aJX3tgUG2Eenv5M6D3xXBu209kWOzDFoeyQYqH8ZKjNnKXfpdcE3SsMXMR57+R fqEQG7pQg7hl4IfVh/HlF+Wv0grfCOmTcJfiA9jHo+NrLuoWJor5q+e+3KaOZe5mTipkMmAEeL/ lSQ7cFi1+dvaJy6r/G657SUqvamxYCTNQ6Hm88+fI31YgBYRCwrCMoeGBlfFsfLGpvBCrj40sx0 MdZvpK9lO559ueyXRN+7+jOOVI+tOvWj5jZagHlhOjUe1y7cdCeUC/l0ThtctnLeWnl19zgy0pZ hxUKhbQZRcUnkw4ExMSUYP12a990mq4riq/b+8yTkCw2ii3OsMTsfO06vn/vhM9IRjbyVSQkr5/ axFT0DmtqJGLbedvKMzobyDWIFCo7uaVCdbvojKPJEWZE6HfChDbS2+chy5JMz2JHQOeo3bE3QJ M+eKNjzORwpVSeCIfMjYHpeqCt+Cqzj7lBN6MUtUuyJ59CXb1IXeN7Chxzl6omCx52nZyIag== X-Received: by 2002:a17:902:d4d2:b0:2a9:328a:d6a with SMTP id d9443c01a7336-2a934124589mr18071295ad.59.1770182710202; Tue, 03 Feb 2026 21:25:10 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com Subject: [PATCH v2 3/6] tcg: Expand missing rotri with extract2 Date: Wed, 4 Feb 2026 15:24:53 +1000 Message-ID: <20260204052456.970605-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260204052456.970605-1-richard.henderson@linaro.org> References: <20260204052456.970605-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::634; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x634.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1770182803908154100 Content-Type: text/plain; charset="utf-8" Use extract2 to implement rotri. To make this easier, redefine rotli in terms of rotri, rather than the reverse. Signed-off-by: Richard Henderson --- tcg/tcg-op.c | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 8a4fd14ad5..078adce610 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -826,23 +826,12 @@ void tcg_gen_rotl_i32(TCGv_i32 ret, TCGv_i32 arg1, TC= Gv_i32 arg2) void tcg_gen_rotli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) { tcg_debug_assert(arg2 >=3D 0 && arg2 < 32); - /* some cases can be optimized here */ if (arg2 =3D=3D 0) { tcg_gen_mov_i32(ret, arg1); } else if (tcg_op_supported(INDEX_op_rotl, TCG_TYPE_I32, 0)) { - TCGv_i32 t0 =3D tcg_constant_i32(arg2); - tcg_gen_op3_i32(INDEX_op_rotl, ret, arg1, t0); - } else if (tcg_op_supported(INDEX_op_rotr, TCG_TYPE_I32, 0)) { - TCGv_i32 t0 =3D tcg_constant_i32(32 - arg2); - tcg_gen_op3_i32(INDEX_op_rotr, ret, arg1, t0); + tcg_gen_op3_i32(INDEX_op_rotl, ret, arg1, tcg_constant_i32(arg2)); } else { - TCGv_i32 t0 =3D tcg_temp_ebb_new_i32(); - TCGv_i32 t1 =3D tcg_temp_ebb_new_i32(); - tcg_gen_shli_i32(t0, arg1, arg2); - tcg_gen_shri_i32(t1, arg1, 32 - arg2); - tcg_gen_or_i32(ret, t0, t1); - tcg_temp_free_i32(t0); - tcg_temp_free_i32(t1); + tcg_gen_rotri_i32(ret, arg1, -arg2 & 31); } } =20 @@ -870,7 +859,16 @@ void tcg_gen_rotr_i32(TCGv_i32 ret, TCGv_i32 arg1, TCG= v_i32 arg2) void tcg_gen_rotri_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) { tcg_debug_assert(arg2 >=3D 0 && arg2 < 32); - tcg_gen_rotli_i32(ret, arg1, -arg2 & 31); + if (arg2 =3D=3D 0) { + tcg_gen_mov_i32(ret, arg1); + } else if (tcg_op_supported(INDEX_op_rotr, TCG_TYPE_I32, 0)) { + tcg_gen_op3_i32(INDEX_op_rotr, ret, arg1, tcg_constant_i32(arg2)); + } else if (tcg_op_supported(INDEX_op_rotl, TCG_TYPE_I32, 0)) { + tcg_gen_op3_i32(INDEX_op_rotl, ret, arg1, tcg_constant_i32(32 - ar= g2)); + } else { + /* Do not recurse with the rotri simplification. */ + tcg_gen_op4i_i32(INDEX_op_extract2, ret, arg1, arg1, arg2); + } } =20 void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2, @@ -2042,23 +2040,12 @@ void tcg_gen_rotl_i64(TCGv_i64 ret, TCGv_i64 arg1, = TCGv_i64 arg2) void tcg_gen_rotli_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) { tcg_debug_assert(arg2 >=3D 0 && arg2 < 64); - /* some cases can be optimized here */ if (arg2 =3D=3D 0) { tcg_gen_mov_i64(ret, arg1); } else if (tcg_op_supported(INDEX_op_rotl, TCG_TYPE_I64, 0)) { - TCGv_i64 t0 =3D tcg_constant_i64(arg2); - tcg_gen_op3_i64(INDEX_op_rotl, ret, arg1, t0); - } else if (tcg_op_supported(INDEX_op_rotr, TCG_TYPE_I64, 0)) { - TCGv_i64 t0 =3D tcg_constant_i64(64 - arg2); - tcg_gen_op3_i64(INDEX_op_rotr, ret, arg1, t0); + tcg_gen_op3_i64(INDEX_op_rotl, ret, arg1, tcg_constant_i64(arg2)); } else { - TCGv_i64 t0 =3D tcg_temp_ebb_new_i64(); - TCGv_i64 t1 =3D tcg_temp_ebb_new_i64(); - tcg_gen_shli_i64(t0, arg1, arg2); - tcg_gen_shri_i64(t1, arg1, 64 - arg2); - tcg_gen_or_i64(ret, t0, t1); - tcg_temp_free_i64(t0); - tcg_temp_free_i64(t1); + tcg_gen_rotri_i64(ret, arg1, -arg2 & 63); } } =20 @@ -2086,7 +2073,16 @@ void tcg_gen_rotr_i64(TCGv_i64 ret, TCGv_i64 arg1, T= CGv_i64 arg2) void tcg_gen_rotri_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) { tcg_debug_assert(arg2 >=3D 0 && arg2 < 64); - tcg_gen_rotli_i64(ret, arg1, -arg2 & 63); + if (arg2 =3D=3D 0) { + tcg_gen_mov_i64(ret, arg1); + } else if (tcg_op_supported(INDEX_op_rotr, TCG_TYPE_I64, 0)) { + tcg_gen_op3_i64(INDEX_op_rotr, ret, arg1, tcg_constant_i64(arg2)); + } else if (tcg_op_supported(INDEX_op_rotl, TCG_TYPE_I64, 0)) { + tcg_gen_op3_i64(INDEX_op_rotl, ret, arg1, tcg_constant_i64(64 - ar= g2)); + } else { + /* Do not recurse with the rotri simplification. */ + tcg_gen_op4i_i64(INDEX_op_extract2, ret, arg1, arg1, arg2); + } } =20 void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2, --=20 2.43.0 From nobody Mon Feb 9 15:28:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1770182754; cv=none; d=zohomail.com; s=zohoarc; b=W2Nw4UVMJOX0TriTtzqo9rbXo4t69L1iZzOsBFjoiyrHLJc6jyFsVpiY7JN77mVk+L7lLwOrcoPy6A0dXhLofTWxa1v3NCPnsczn765X4issCezgE8Xnz5zYkIyTy5no7Xc8PamyYIxMNgfJ4Sm6qzECMT3hBYkhH0Rc1CEJWHw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770182754; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=9zcY1K2Qnk7na8oyBT2MIg9u80DbSZ14l8lXIlhE+Y4=; b=FZ/Wf1Jsq0isC5sJ2yr+SPEuQ2MDIRzEAecjLZBnv9/Rk1Dh5klEpDtNZMss4Ofvp75PRzXHQM2jFkwOib8n4rX2yckX9+rZtgyoVbfvFAYP5bybx4zVm8rFF3ferEz1o6s/h8QuDVIOTGvpMV4+iHOjlCA3I7Z4/yNbwgpFok0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770182754587628.84258121798; Tue, 3 Feb 2026 21:25:54 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnVOC-0000f3-K2; Wed, 04 Feb 2026 00:25:20 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnVO8-0000Wm-33 for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:16 -0500 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnVO6-0003Hv-KW for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:15 -0500 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-2a09757004cso52218205ad.3 for ; Tue, 03 Feb 2026 21:25:14 -0800 (PST) Received: from stoup.. (bg30dhzlx7lnyrq74wrz.ip6.superloop.au. [2401:d002:dc0f:2100:1bc:fe1e:491:928e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933965c3esm10062015ad.67.2026.02.03.21.25.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:25:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770182713; x=1770787513; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9zcY1K2Qnk7na8oyBT2MIg9u80DbSZ14l8lXIlhE+Y4=; b=ODNdHC3dItB+be71Y31PHVTiJNs37z4AgWFunN9emqji+3OJ9RHfQ6/V7RwgvyM9IC Kur3FnC+E5A6f+59DW5j2+rofjjoFZF1hpJcZY3igctvaXnyPCQqpkqv4EoNCmKfKthA IpopmZvUsHH5IIakiS9IL7UEBZ3UE7PhFqORlNWtR7wBHWMcKKu44Yb7QtTl1WLtSHVe yuUtgB/2R/9CPR9edsnKAEnGYPyFDVQQLqPFeCLeNFS0CxMUCjH1tbDrD3UGKWen1dkY ShQyQwMBkR0XKKTyE2+AfOAWT2lmQGYQYaSke5IVxXcwMQszXeEL2DC8FaMmr9pYNdV/ mR2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770182713; x=1770787513; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=9zcY1K2Qnk7na8oyBT2MIg9u80DbSZ14l8lXIlhE+Y4=; b=SneK3GThOW5PKtsD49L6gO8554pmufHy+VdLchDtot4yjAPpoFpcZoafHbJeE+6mtT AwW39lBoXvDjTTvgWJuqk2Rb3ZGoqGXg+0FwHacanL9spUJ9HQQKOAxpFoKXWkL5pBx8 rRs0G87iiEfSRVo8jwmUud9Uqu5Sv3zQUNgdY5hGqxdFe/EMYppz9TfTshATWDauIv+g veZKbV6gTYECqWHYuJ4GVPP7j5bp1d2ZF4ZRUqRU7T8fKijJ8AnNmhYit5cRO3QXApUg q5RTz8uFK1YWgBXc6mlkA2ZHXhQDbH6xqCBezap7ZkFnF2wH3sr6fw/DZGvM4v1khkYL 1uaw== X-Gm-Message-State: AOJu0Yw1rtvfhl4gtQILK32M5NjQINhe+H9vyZon6tEzV9dgaaZeXF6Y 2n4wZkWfe0HLdnisHNc9PO7wU5FFKlrT5ZN/hZZCSmvfsWSngref8nO+eLrINinmr5KCq4Oye5H m7BAbGIU= X-Gm-Gg: AZuq6aJlTwIVhrc9t1mKto6Yy960TuOG0oc/HH6ilw8WvuaNdk/Z2UvLg4OoFIF0tpl ylDbSI5wH1Q5DUpO86IgqMevU/LZTvLb4AKCkmlmWL8hTJ9oFgSFY0bEpR0R4JJwf+l6goy9EPQ xXwT6DkZzMpDJrKH/+FGrFfsnD0QKz6hDvg7ltc7XDGgF00nnNbpuTGqswjgoPJ0vmfItSa4J8l MIqHnzo4mTjj/MDNkz9rWZJsBVtxDBAGXgPSQ03KlioinS21W18IHIHDpRBaY7ta3xcIjwhKJ2G /zGUcFUdErTQxwP3CjlG005Ptfd28ULcLjwY8pj57Cy2QfypDzPVoUwqZVIcax8rSrqsu5PAJdJ 3wqDOCw+xnm1JapUIqvPR51sxsC6rQu9FALcqkDJQa9cj+okcubZbXIGnTcZdznkKBCVGuFXXru aM8uKpXvBqEZAcAcKvoDeE+78LvgaTYm5OOn0FrJbWYOcLP8woLs9w6gymE6E= X-Received: by 2002:a17:903:15c7:b0:2a7:6cdc:7f14 with SMTP id d9443c01a7336-2a93412686bmr17940015ad.60.1770182713135; Tue, 03 Feb 2026 21:25:13 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com Subject: [PATCH v2 4/6] tcg: Add tcg_op_imm_match Date: Wed, 4 Feb 2026 15:24:54 +1000 Message-ID: <20260204052456.970605-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260204052456.970605-1-richard.henderson@linaro.org> References: <20260204052456.970605-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62b; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1770182757223154100 Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini Create a function to test whether the second operand of a binary operation allows a given immediate. Signed-off-by: Paolo Bonzini [rth: Split out from a larger patch; keep the declaration internal.] Signed-off-by: Richard Henderson --- tcg/tcg-internal.h | 5 +++++ tcg/tcg.c | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h index 2cbfb5d5ca..c1ce50998e 100644 --- a/tcg/tcg-internal.h +++ b/tcg/tcg-internal.h @@ -94,4 +94,9 @@ TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op, TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op, TCGOpcode, TCGType, unsigned nargs); =20 +/* + * For a binary opcode OP, return true if the second input operand allows = IMM. + */ +bool tcg_op_imm_match(TCGOpcode op, TCGType type, tcg_target_ulong imm); + #endif /* TCG_INTERNAL_H */ diff --git a/tcg/tcg.c b/tcg/tcg.c index e7bf4dad4e..778268f5cd 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -3391,11 +3391,9 @@ static void process_constraint_sets(void) } } =20 -static const TCGArgConstraint *opcode_args_ct(const TCGOp *op) +static const TCGArgConstraint *op_args_ct(TCGOpcode opc, TCGType type, + unsigned flags) { - TCGOpcode opc =3D op->opc; - TCGType type =3D TCGOP_TYPE(op); - unsigned flags =3D TCGOP_FLAGS(op); const TCGOpDef *def =3D &tcg_op_defs[opc]; const TCGOutOp *outop =3D all_outop[opc]; TCGConstraintSetIndex con_set; @@ -3422,6 +3420,21 @@ static const TCGArgConstraint *opcode_args_ct(const = TCGOp *op) return all_cts[con_set]; } =20 +static const TCGArgConstraint *opcode_args_ct(const TCGOp *op) +{ + return op_args_ct(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op)); +} + +bool tcg_op_imm_match(TCGOpcode opc, TCGType type, tcg_target_ulong imm) +{ + const TCGArgConstraint *args_ct =3D op_args_ct(opc, type, 0); + const TCGOpDef *def =3D &tcg_op_defs[opc]; + + tcg_debug_assert(def->nb_oargs =3D=3D 1); + tcg_debug_assert(def->nb_iargs =3D=3D 2); + return tcg_target_const_match(imm, args_ct[2].ct, type, 0, 0); +} + static void remove_label_use(TCGOp *op, int idx) { TCGLabel *label =3D arg_label(op->args[idx]); --=20 2.43.0 From nobody Mon Feb 9 15:28:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1770182797; cv=none; d=zohomail.com; s=zohoarc; b=XChDBKvHcxCMUrZHGtcOab/rWVsQw0pOXXOMligmNxzBiZdLqIMb4JFqtDnUwtMiRfPMxMmuCXQ/6P5kc6D6UhasbyTbSZYkJyVid1RjJnoviT0BokjDD1dKeTwdjcWvLB+4eVIDsyFNaNf+Ab2G+gGTBjlgo5prtS9NBubJRr0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770182797; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fqXpo9wXtolgQ7gzPRkCZdp1OA2hHW5gDfgPCkKiZr8=; b=AWAxVDWlOWQNtywlNE+A28L6FM+5auzBlrc0GVe49Uw5huLtCQQaRfImv22lecVRDKgmOV70s0nIl2gbzkwghdWROoHtV6cHXDbbuui9GK0ljSyX0eWXiBeR6x0KLLJBva6qiW12eoorFaCGnyudMVgQzoOEcfwk7Bh6vFvkSaU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770182797162197.3016511109032; Tue, 3 Feb 2026 21:26:37 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnVOD-0000fv-Bl; Wed, 04 Feb 2026 00:25:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnVOA-0000b9-Qn for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:19 -0500 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnVO8-0003IN-UO for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:18 -0500 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-2a76f90872cso34061555ad.3 for ; Tue, 03 Feb 2026 21:25:16 -0800 (PST) Received: from stoup.. (bg30dhzlx7lnyrq74wrz.ip6.superloop.au. [2401:d002:dc0f:2100:1bc:fe1e:491:928e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933965c3esm10062015ad.67.2026.02.03.21.25.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:25:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770182715; x=1770787515; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fqXpo9wXtolgQ7gzPRkCZdp1OA2hHW5gDfgPCkKiZr8=; b=ZLjuJnIbovKUBt8tOWWPip3VsIYcyKuhcnKLhyaYXgpVzIf/R2rbw6o7XGsTCZ5A1y DfidmvmyusoxcWTpZSQa/YoTy+3roRxq0ydKe0H/dH5qSKF/P+6jHOH7MPucq68JquAd 4V+oMqXv4VRfdB3hwSvTeeNemBh+O3Lfm1iN9Y41480twcZF+HB0Gmze2g7Pv2j3C5kd G0RiBgoYWh5VQCtp5eo5i6O5UrBLHNaW44S8XqdHdcqeIs0Hhl1DJSxFTnKGMbDbR46W rd2xeDMoP19YL+OCMc3qyOh0R/LotkJcYdLbYQEa2HnXDua9+6kiMgICpn1tZxIkMohq Q50Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770182715; x=1770787515; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=fqXpo9wXtolgQ7gzPRkCZdp1OA2hHW5gDfgPCkKiZr8=; b=Ajxwlm7KRpEuAIn2FYzzrDQS77rtx0YS9hdUd6fkx8DKDbKFNXs1mWgwkCdW01woon ABZ841sb1QC5k+oJaFZokUY+2SMfmnlCMJptv5P8k56et9KULNSiaU0l+YyVVRlFzGHm 6q/lrRA3DqhUh6R8R/MzxAuyQ3zCgHFnw0nYBYjv+uDO2zq9/3Mn0L4eUW9CHzIpO5nY uNdjsyu8xILZ6boIJNfzB+YSlYABqQM/GDvlACUyYL16X1DNCL5u4s67FXKsfLRwCRh0 t5HquTXaF4zlpkyS/dj/OW2JLzwRJmcQApKO8crr7c8UOT3fJzK4Gd7TN8NTNMVDLxWf dcGQ== X-Gm-Message-State: AOJu0Yz2QSIOvsiB7lRa+iJaLBLT9zH4i1/PZXba4BbSZfYOudgmGbeG cNdBKK3pNdg/muA22Of1VDh6J6TUzEjJunX9szI9wnsFgJBoWw75J5rPsAAA7OeJlHh93rZ8x9J CKorBaCw= X-Gm-Gg: AZuq6aI1jmFNEyFC0FGG7BeF6gq/uhNKA1oRe+rXy/0vWwqGXXUnXAAoxQvbVDFLEOf eUcLHhco1/zYwIBDAZumejYwQqQNY7k1emFJmNqzKDgYsYZxavOKtBghd5Mfp0WjC4OoOX+NzWf HLF/eMnPVoZbW6jjGni0HXTMuAUpTN7Qai28QJC6FI3LCCHsDcfAyEkIId41oPL9vVw9uY/D4WV E6wjjT4PNCxa9fldOlWpHnxonO796l+zcCoILj57kvhJPLLdp6lRMiCc3jeIATjau/ccd83sGSM TVVCaIS5cW5ye85uH7UKYjLYyHTtkk8x74xPw5NSa3Yk3S7UErOQZpiINV/lwJwkH9DhyszEO4c YlQWxp7deuFvY54cEjV/U5XEDQwZ1bYgocLQHLx237foKUU3omb3+ZasLdZkEzXrLHtEnXldCu7 rBVhaVumXyv4/Ld9n7pL+XbRGw35TaykO6vHBLkvEHxgdmL5Li9mLZoZulU6Q= X-Received: by 2002:a17:902:c411:b0:2a7:9b6e:33df with SMTP id d9443c01a7336-2a933fb25a4mr20097635ad.35.1770182715405; Tue, 03 Feb 2026 21:25:15 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com Subject: [PATCH v2 5/6] tcg: target-dependent lowering of extract to shr/and Date: Wed, 4 Feb 2026 15:24:55 +1000 Message-ID: <20260204052456.970605-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260204052456.970605-1-richard.henderson@linaro.org> References: <20260204052456.970605-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::630; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x630.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1770182797834154100 Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini Instead of assuming only small immediates are available for AND, consult the backend in order to decide between SHL/SHR and SHR/AND. Signed-off-by: Paolo Bonzini [rth: Split from a larger patch] Signed-off-by: Richard Henderson --- tcg/tcg-op.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 078adce610..263d208002 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -907,6 +907,8 @@ void tcg_gen_deposit_z_i32(TCGv_i32 ret, TCGv_i32 arg, void tcg_gen_extract_i32(TCGv_i32 ret, TCGv_i32 arg, unsigned int ofs, unsigned int len) { + uint32_t mask; + tcg_debug_assert(ofs < 32); tcg_debug_assert(len > 0); tcg_debug_assert(len <=3D 32); @@ -922,8 +924,10 @@ void tcg_gen_extract_i32(TCGv_i32 ret, TCGv_i32 arg, tcg_gen_op4ii_i32(INDEX_op_extract, ret, arg, ofs, len); return; } + + mask =3D (1u << len) - 1; if (ofs =3D=3D 0) { - tcg_gen_andi_i32(ret, arg, (1u << len) - 1); + tcg_gen_andi_i32(ret, arg, mask); return; } =20 @@ -934,18 +938,12 @@ void tcg_gen_extract_i32(TCGv_i32 ret, TCGv_i32 arg, return; } =20 - /* ??? Ideally we'd know what values are available for immediate AND. - Assume that 8 bits are available, plus the special case of 16, - so that we get ext8u, ext16u. */ - switch (len) { - case 1 ... 8: case 16: + if (tcg_op_imm_match(INDEX_op_and, TCG_TYPE_I32, mask)) { tcg_gen_shri_i32(ret, arg, ofs); - tcg_gen_andi_i32(ret, ret, (1u << len) - 1); - break; - default: + tcg_gen_andi_i32(ret, ret, mask); + } else { tcg_gen_shli_i32(ret, arg, 32 - len - ofs); tcg_gen_shri_i32(ret, ret, 32 - len); - break; } } =20 @@ -2121,6 +2119,8 @@ void tcg_gen_deposit_z_i64(TCGv_i64 ret, TCGv_i64 arg, void tcg_gen_extract_i64(TCGv_i64 ret, TCGv_i64 arg, unsigned int ofs, unsigned int len) { + uint64_t mask; + tcg_debug_assert(ofs < 64); tcg_debug_assert(len > 0); tcg_debug_assert(len <=3D 64); @@ -2136,8 +2136,10 @@ void tcg_gen_extract_i64(TCGv_i64 ret, TCGv_i64 arg, tcg_gen_op4ii_i64(INDEX_op_extract, ret, arg, ofs, len); return; } + + mask =3D (1ull << len) - 1; if (ofs =3D=3D 0) { - tcg_gen_andi_i64(ret, arg, (1ull << len) - 1); + tcg_gen_andi_i64(ret, arg, mask); return; } =20 @@ -2148,18 +2150,12 @@ void tcg_gen_extract_i64(TCGv_i64 ret, TCGv_i64 arg, return; } =20 - /* ??? Ideally we'd know what values are available for immediate AND. - Assume that 8 bits are available, plus the special cases of 16 and = 32, - so that we get ext8u, ext16u, and ext32u. */ - switch (len) { - case 1 ... 8: case 16: case 32: + if (tcg_op_imm_match(INDEX_op_and, TCG_TYPE_I64, mask)) { tcg_gen_shri_i64(ret, arg, ofs); - tcg_gen_andi_i64(ret, ret, (1ull << len) - 1); - break; - default: + tcg_gen_andi_i64(ret, ret, mask); + } else { tcg_gen_shli_i64(ret, arg, 64 - len - ofs); tcg_gen_shri_i64(ret, ret, 64 - len); - break; } } =20 --=20 2.43.0 From nobody Mon Feb 9 15:28:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1770182763; cv=none; d=zohomail.com; s=zohoarc; b=h/ePtr6CEIZOuaG6wzZ1jS5nr2BnJg2IIDF24+do9kZrobhSy8JN2gxVGwXvpShB9v5DJCa86pvn8FTx4daY5kAW1EerIVGlT2JABzW3Hhe+Se3kIP0Mj6m5o5gMNRGmpzKNh9mFPqVz+V0jy4cQanG3mrXfxcbmf9yG8wSEDYI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770182763; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zxW6ZiuEeW+vZBq1IBt0ZaD6GqcKeynApzi+LWFfJmc=; b=eJetTCijAaaip6WdF6Nvi6AqLmoAgOYWCmoqWGxoRHYPIReTMvMgqHxKpxCVeX7Z8v6Ff/0i1tqk700X0hJTn5W/El/EkOmp5L3KOO6W3z5GEmloIyq9HPH88nFz77CADD/4Zi8cs1DDCq/oLa6iC4DmXeps/w2TF8jo0i0lsws= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770182763208400.45537811815336; Tue, 3 Feb 2026 21:26:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnVOF-0000g8-2h; Wed, 04 Feb 2026 00:25:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnVOC-0000fc-Qx for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:20 -0500 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnVOB-0003In-8i for qemu-devel@nongnu.org; Wed, 04 Feb 2026 00:25:20 -0500 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-2a90055b9e9so1775815ad.1 for ; Tue, 03 Feb 2026 21:25:18 -0800 (PST) Received: from stoup.. (bg30dhzlx7lnyrq74wrz.ip6.superloop.au. [2401:d002:dc0f:2100:1bc:fe1e:491:928e]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933965c3esm10062015ad.67.2026.02.03.21.25.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:25:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770182718; x=1770787518; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zxW6ZiuEeW+vZBq1IBt0ZaD6GqcKeynApzi+LWFfJmc=; b=SFS8+4BvJied8Tyl6kazA6sLAZui7cmkoUv03SlfqgY8XfHqFLUifBOgMj5UE/Ig/T SkgGFqsVr2bkamf1btuk3hubQynOTEld1TLOugIfkUsN+CQmXOKa+btUWYuX3ZmhBYmA iw87b7fICt35phx1nBkV8IGX0qL9xPJm7JEumE5J6trq09v3y5/qHE0db6uMvuqOVErV DpCkrBFrLwQBrscAMEWrAezCdwoSd0WNV2SMLx73aCXs18fqIqY+UnKL9uZ0vCg9QpmM a3odpmc0ltLtzMEYrLECt3elDLBJGXp4tP91u64L1VliKIA5zBPE2SBuroFHC5xfKPnb 6xFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770182718; x=1770787518; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zxW6ZiuEeW+vZBq1IBt0ZaD6GqcKeynApzi+LWFfJmc=; b=bfp7HDtlDAwPif8gKBW/t1el19uHfZRYDLdHkvvDAC+xJlL7ZrcxsnXcH06A9ewdvB pexjD7KTZPiNyhNv6ynW9ORPIagUaPTClwvaIIU5jKDNP99Ra4vHdBY9YW0NaF4m5ns7 lSVRCCXA6+kwp3dK5IZO2NMxm7UF8Mja8ql4uuFux3UF38r9urin4Cw3APuGt0iI1VE2 7ibrJduutZn3ujsoTRLXPua7tuJ00O31jyNheNUb7av3pEZQCdT/7wjZ8BPQ6x/a2RXx K4bn/R6VihR7O/9NyB8spiqjhWS5Qbbos7N0UBxt9AU2ImO51ZykAdmidJY5eA4xVHnn iSWw== X-Gm-Message-State: AOJu0YzDrlfEb1BVQ3Na9BDPAK7UOKN+DqCDNpqnB88D7WvmUBgPUJYF VSGTKm0ddZ0PjKaDjPxuml9qFeeHi3shJr0M8BKLMqIxZmfNwNV4W3aSWlYdU2MXJRDgZlVe+cP oN8wPuR4= X-Gm-Gg: AZuq6aJvwPz2hNwwcDpcroo8NfuHLsU8Ir2/BJoUvZGGd8sf9Dsczn2ghKoTn75TRZ8 w0JBmHfvXQoEYITMU6+A2rJ+4dUFjZUkwJz0Wtq1w/aNKetGmpjIfmR1qL7ldFRtw2cX6FxqlPY XbpebR/M26MQQB6z3JApUYXln52lWufDDWqUgTvi5ETNjjxUSHyPALvQgyWWsSXg6MVwIqWN1Ky b1p4hS/QrVeRd1o8daDGllGH7HtKxNiPilK+uMm2KhcxUz0ObdhpQN8arKSIvXKnxEWSeTa1CUR xxuWSETRC274g1owOU7BbqdVVDXfrfAA3AF9jYbo6m7GmqLS+1t91nRmH6EFs3qXOTBbdEsDnds V7NR3c0sRgUf5eEVLMY2ltAwk1UzK/mdy2nrps4lNWt8goECQsjAKHSvxeHXBDpN/+yJc8HMnKt LOBEqlEv8MEEOqkHZGhWml+U+tIrAnJUNzdFKOkxdnkhM2ft7MqFd2BxycS9I= X-Received: by 2002:a17:903:b47:b0:2a7:c340:4c3d with SMTP id d9443c01a7336-2a933bb8b15mr18895755ad.13.1770182717772; Tue, 03 Feb 2026 21:25:17 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com Subject: [PATCH v2 6/6] tcg/optimize: possibly expand deposit into zero with shifts Date: Wed, 4 Feb 2026 15:24:56 +1000 Message-ID: <20260204052456.970605-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260204052456.970605-1-richard.henderson@linaro.org> References: <20260204052456.970605-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62f; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1770182764878158500 Content-Type: text/plain; charset="utf-8" Use tcg_op_imm_match to choose between expanding with AND+SHL vs SHL+SHR. Suggested-by: Paolo Bonzini Signed-off-by: Richard Henderson --- tcg/optimize.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/tcg/optimize.c b/tcg/optimize.c index e6a16921c9..2944c5a748 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -1743,10 +1743,17 @@ static bool fold_deposit(OptContext *ctx, TCGOp *op) goto done; } =20 - /* Lower invalid deposit into zero as AND + SHL or SHL + AND. */ + /* Lower invalid deposit into zero. */ if (!valid) { - if (TCG_TARGET_extract_valid(ctx->type, 0, ofs + len) && - !TCG_TARGET_extract_valid(ctx->type, 0, len)) { + if (TCG_TARGET_extract_valid(ctx->type, 0, len)) { + /* EXTRACT (at 0) + SHL */ + op2 =3D opt_insert_before(ctx, op, INDEX_op_extract, 4); + op2->args[0] =3D ret; + op2->args[1] =3D arg2; + op2->args[2] =3D 0; + op2->args[3] =3D len; + } else if (TCG_TARGET_extract_valid(ctx->type, 0, ofs + len)) { + /* SHL + EXTRACT (at 0) */ op2 =3D opt_insert_before(ctx, op, INDEX_op_shl, 3); op2->args[0] =3D ret; op2->args[1] =3D arg2; @@ -1757,14 +1764,29 @@ static bool fold_deposit(OptContext *ctx, TCGOp *op) op->args[2] =3D 0; op->args[3] =3D ofs + len; goto done; + } else if (tcg_op_imm_match(INDEX_op_and, ctx->type, len_mask)= ) { + /* AND + SHL */ + op2 =3D opt_insert_before(ctx, op, INDEX_op_and, 3); + op2->args[0] =3D ret; + op2->args[1] =3D arg2; + op2->args[2] =3D arg_new_constant(ctx, len_mask); + } else { + /* SHL + SHR */ + int shl =3D width - len; + int shr =3D width - len - ofs; + + op2 =3D opt_insert_before(ctx, op, INDEX_op_shl, 3); + op2->args[0] =3D ret; + op2->args[1] =3D arg2; + op2->args[2] =3D arg_new_constant(ctx, shl); + + op->opc =3D INDEX_op_shr; + op->args[1] =3D ret; + op->args[2] =3D arg_new_constant(ctx, shr); + goto done; } =20 - op2 =3D opt_insert_before(ctx, op, INDEX_op_and, 3); - op2->args[0] =3D ret; - op2->args[1] =3D arg2; - op2->args[2] =3D arg_new_constant(ctx, len_mask); - fold_and(ctx, op2); - + /* Finish the (EXTRACT|AND) + SHL cases. */ op->opc =3D INDEX_op_shl; op->args[1] =3D ret; op->args[2] =3D arg_new_constant(ctx, ofs); --=20 2.43.0