From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661035; cv=none; d=zohomail.com; s=zohoarc; b=DN1Aba1RU2neBCznRXsDUZifdtlVZZWbrfTEOhd9ssDmEuhsPx7mTMnhmgvL8z/65Y6GWf7fw0xvmlxkR22j7kxOZfhpofcaCn07Y4JlXJs7oyFop6I3j8/LBZOlWeQlzCYY7XiPOm6uwEoXXHEbkSbOjpnwqny7wTrzWKqnBx4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661035; h=Content-Transfer-Encoding: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:Cc; bh=agyvsEgRoH86yWxlKsSyP4w5XhhdItqtvJol0QfbWWA=; b=gkp2ooGqz4G81XnwP4ECtx3KwISDgti8aG2a/4Hk+LWJEgEo72ZhDDEwBi3pv3E2bDUlz8STQm180LRttO2PEBXGNjERuUFwOms1UJIUi37ZiATclVjTmQLn5+9Lkxkp74VwvrkGj2lsgNtN8prFPSlHFXngY7k/M8FV8WkfAP0= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661035582409.26035044362175; Tue, 25 Aug 2026 05:30:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHW-0004ff-It; Tue, 25 Aug 2026 08:29:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHU-0004f8-8y for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:32 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHS-0000Fk-1Q for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:31 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-460-TJhou4S5NkuqEKPoc22svg-1; Tue, 25 Aug 2026 08:29:27 -0400 Received: by mail-ej1-f70.google.com with SMTP id a640c23a62f3a-c21946c03e5so82093566b.0 for ; Tue, 25 Aug 2026 05:29:26 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2496297c7dsm1717386866b.20.2026.08.25.05.29.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660969; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=agyvsEgRoH86yWxlKsSyP4w5XhhdItqtvJol0QfbWWA=; b=WB/mFpjdBRlgp4rY2WRYGk2nc2fxFTNvB85i+mWE8SWO6TnLGB4VFuIPsouqOE8oD9onn4 qJzI/6Yd8PLfsD1WkHO3MxAZQam5sccQ8LarsbQjlAdTPq6ItuppFexx7RLuckIvEGP4/r vLn8xPY4M4pNINuNzEFn3zjByrVxy0I= X-MC-Unique: TJhou4S5NkuqEKPoc22svg-1 X-Mimecast-MFC-AGG-ID: TJhou4S5NkuqEKPoc22svg_1787660966 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660966; x=1788265766; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=agyvsEgRoH86yWxlKsSyP4w5XhhdItqtvJol0QfbWWA=; b=SKCxcrNkAnC4LbwEN3DtSIQHuT7IuffitFW5q1D+7w5lKM5YqcBWm1peRUWU538/Dh v0JSRIpuY4lOGFzUCUGKDI4n6DWCJlAbj0vXIJXvf3hP1EZlus7FydnjYPaaXnxup0Zw vjjTVJYV0//Uvm56Ma02IEQxqB8WK6qRgvavPGlkXW4IvrXLBm39pt3hXfo6rDgO6eCM t+l5oAg/v0cdNSmo8fZZUpjkSybHCHQIORdyUlAdplcpgxj8AEgojcxyi1kDHQgln+DA jSrwAmPMaEvz6/8mLSOKmQdnb2SuwcYD5qFAwoUGqMe4kX2FkBKYfblvr/rFAdKkixq4 u1CQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660966; x=1788265766; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=agyvsEgRoH86yWxlKsSyP4w5XhhdItqtvJol0QfbWWA=; b=Tg4DC8D7x+u0NNd4bn6bUKZoXPeaXxA0WUx8tiaQEZlMFl7TzITrlmMjviB0pPpWXH TgJWr6u83/uSTWbIGNArIaKxz54XXdnmaJG7cZCgVJgJz8smEUKmeHyc5Im0/Ix8pJe0 YK+2XiufSatHU8LbEVPDHP+th7fwrZsgOscwmfNixIkaVKA9qjOFlswpshNxOhpIQQdP vizwv1HK3GOYX09BFYurmHdfEohrA1PLBH6waeiHTAmGENFrFuGQ0aiGwLEu+enG5aO7 69j46HnUXj7qCfTo+THZe/jk19GX2k88MWzNTTREgdrRLThjXJnL9YjxXwudyiiI79/P 4uXg== X-Gm-Message-State: AFuF++mZzP8MFZwM/4fhDdnCx88dqEcOdIyJISjYXUGiTLM2eg68jYBA F5Vw1WCPtS/wV27DZHD7BKXFHquDHpZ6/KF1tmCdURVEMt9JcYos6RX7EMYgwMAynGTNJzPhYZw nG0clFaBTwxoZjaj8msL7StkDas2PKrVstHDVuNZL3+VnVC6QMYSPWaGikBauk8mqu04x8MhiXs 64kcOZeP4Xw4JosPhWfDq9j+9gq/0XhEYyC6SckpW4 X-Gm-Gg: AR+sD12KT+1aHb6X5z8s+FU8FznCyH5Meo8n0nEz27JxYHmjmWgIDdd1K+mDWUu+kWH APMyN4cIVozBhQtzGwHtbCYZM8zcCOzWYJgzaoCvYFY1bntTaPrzH1DWY/QFW3mOTTsLRU6m2Wx Uf3uT4mUXoKy4R/UWO4bYvGFku2vPHLepa2DxQhd1B/ZClTNv7tr1whLRDM8TVAe7ZAX88rmeOk cUf3KiSKnffM0TuslrjXmdmccUEpqBbbAWFghaV2P1iJ1i9dV/2G1V4jxh1PTQFSRzyfZbce9dK 1RJpoGrRMqaNugivH96HR24JaNyY3B1/oLS4kXY8BVsgx4Efc8T62wAEQIapYQPDsKm7WCmoNN6 HbjujWPV58+T9/B5vt9B13q6qQkP8nu4V4/6QKCAb2jF6HS07ABRRGzCcfGpg38GXgDE/cfi9UI 0lvJU= X-Received: by 2002:a17:907:9619:b0:c08:580e:899a with SMTP id a640c23a62f3a-c24e2df3d90mr623853166b.10.1787660965811; Tue, 25 Aug 2026 05:29:25 -0700 (PDT) X-Received: by 2002:a17:907:9619:b0:c08:580e:899a with SMTP id a640c23a62f3a-c24e2df3d90mr623847766b.10.1787660965289; Tue, 25 Aug 2026 05:29:25 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 01/20] target/i386/tcg: do not reuse cc_srcT Date: Tue, 25 Aug 2026 14:29:02 +0200 Message-ID: <20260825122921.431739-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661036823158500 Content-Type: text/plain; charset="utf-8" Use a different temporary for every instruction that uses it in the translation block. Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/translate.c | 6 ++++-- target/i386/tcg/emit.c.inc | 11 +++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 2115c5cd24b..d1791550772 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -342,7 +342,7 @@ static void set_cc_op_1(DisasContext *s, CCOp op, bool = dirty) tcg_gen_discard_tl(cpu_cc_src2); } if (dead & USES_CC_SRCT) { - tcg_gen_discard_tl(s->cc_srcT); + s->cc_srcT =3D NULL; } =20 if (dirty && s->cc_op =3D=3D CC_OP_DYNAMIC) { @@ -1236,6 +1236,7 @@ static void gen_lods(DisasContext *s, MemOp ot, TCGv = dshift) =20 static void gen_scas(DisasContext *s, MemOp ot, TCGv dshift) { + s->cc_srcT =3D tcg_temp_new(); gen_string_movl_A0_EDI(s); gen_op_ld_v(s, ot, s->T1, s->A0); tcg_gen_mov_tl(cpu_cc_src, s->T1); @@ -1248,6 +1249,7 @@ static void gen_scas(DisasContext *s, MemOp ot, TCGv = dshift) =20 static void gen_cmps(DisasContext *s, MemOp ot, TCGv dshift) { + s->cc_srcT =3D tcg_temp_new(); gen_string_movl_A0_EDI(s); gen_op_ld_v(s, ot, s->T1, s->A0); gen_string_movl_A0_ESI(s); @@ -3484,7 +3486,7 @@ static void i386_tr_init_disas_context(DisasContextBa= se *dcbase, CPUState *cpu) dc->T1 =3D tcg_temp_new(); dc->A0 =3D tcg_temp_new(); =20 - dc->cc_srcT =3D tcg_temp_new(); + dc->cc_srcT =3D NULL; } =20 static void i386_tr_tb_start(DisasContextBase *db, CPUState *cpu) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 473f415766f..968abd47a73 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1699,6 +1699,7 @@ static void gen_CMPccXADD(DisasContext *s, X86Decoded= Insn *decode) * - s->cc_srcT: memory operand (lhs for comparison) * - cmpv: rhs for comparison */ + s->cc_srcT =3D tcg_temp_new(); gen_set_label(label_top); gen_op_ld_v(s, ot_full, s->cc_srcT, s->A0); tcg_gen_sub_tl(s->T0, s->cc_srcT, cmpv); @@ -1800,11 +1801,12 @@ static void gen_CMPXCHG(DisasContext *s, X86Decoded= Insn *decode) dest =3D gen_op_deposit_reg_v(s, ot, R_EAX, s->T0, oldv); tcg_gen_movcond_tl(TCG_COND_NE, dest, oldv, cmpv, s->T0, dest); =20 - tcg_gen_mov_tl(s->cc_srcT, cmpv); - tcg_gen_sub_tl(cmpv, cmpv, oldv); - decode->cc_dst =3D cmpv; + s->cc_srcT =3D cmpv; + decode->cc_dst =3D tcg_temp_new(); decode->cc_src =3D oldv; decode->cc_op =3D CC_OP_SUBB + ot; + + tcg_gen_sub_tl(decode->cc_dst, cmpv, oldv); } =20 static void gen_CMPXCHG16B(DisasContext *s, X86DecodedInsn *decode) @@ -2722,7 +2724,7 @@ static void gen_NEG(DisasContext *s, X86DecodedInsn *= decode) =20 decode->cc_dst =3D s->T0; decode->cc_src =3D oldv; - tcg_gen_movi_tl(s->cc_srcT, 0); + s->cc_srcT =3D tcg_constant_tl(0); decode->cc_op =3D CC_OP_SUBB + ot; } =20 @@ -4114,6 +4116,7 @@ static void gen_SUB(DisasContext *s, X86DecodedInsn *= decode) { MemOp ot =3D decode->op[1].ot; =20 + s->cc_srcT =3D tcg_temp_new(); if (s->prefix & PREFIX_LOCK) { tcg_gen_neg_tl(s->T0, s->T1); tcg_gen_atomic_fetch_add_tl(s->cc_srcT, s->A0, s->T0, --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661113; cv=none; d=zohomail.com; s=zohoarc; b=AlZOxyriPOwniMfekSasl5gMelkHn1dH5gEMpZERoi5G4syIswoR45EIobo7t1n6JYWuxkjwaq95lZF4iC6c15B0IQcOCIRHwhTXSdoVw9fIntaUFzfcBVOBmF2Pt41Ae0zDVsZh0UdtEX+omJkjfQtbuFIhN87XAcSXUU2gX3o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661113; h=Content-Transfer-Encoding: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:Cc; bh=xcyMmZEfNzdyoJm+GiWJ/XuB8ugXsgxUdEvqfhgkWHw=; b=Q+aIgB/+WAow9uCvyz1HwJA9+4WfYcn/9YIfuxT79GtKLx4+ZYkXc6hGMw6XdRJoZa2L74HjD6F9r18gWz7UQALg0ySJHtM/OL5ivfeuAEe1Awis3PFk/zKfkXDMP+ingL6m+Li436MzDnFhjRAcyAlKO2IUCm0BqXX5HpawRb0= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661113370846.1108293576316; Tue, 25 Aug 2026 05:31:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHX-0004fj-Kn; Tue, 25 Aug 2026 08:29:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHV-0004fV-Lt for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:33 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHU-0000Gh-2s for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:33 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-294-Ns73Kp5BNWWzkI6Bl1kI6A-1; Tue, 25 Aug 2026 08:29:29 -0400 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c15ceb17a28so355740666b.3 for ; Tue, 25 Aug 2026 05:29:29 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2496296cafsm1823489266b.14.2026.08.25.05.29.26 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660971; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xcyMmZEfNzdyoJm+GiWJ/XuB8ugXsgxUdEvqfhgkWHw=; b=jGXaZCJOIlMAo4M83iqYkL+27l9TMoWTOQH5ti3LvsbC84B2/JD8cEpwRSrGAJYAEGBnFL iRTV69SIu3l5KRV8ajRzRjuPFupt+AWSbPurcmaYEuaGplO+PhucSDfQEE++md0tsnCqn2 Bd45bT3HnM4tAvj8ssuPHEMEgRw0h2U= X-MC-Unique: Ns73Kp5BNWWzkI6Bl1kI6A-1 X-Mimecast-MFC-AGG-ID: Ns73Kp5BNWWzkI6Bl1kI6A_1787660968 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660968; x=1788265768; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=xcyMmZEfNzdyoJm+GiWJ/XuB8ugXsgxUdEvqfhgkWHw=; b=NYTeg+9LJV3C3uP4+vbPKcdih6e/XjtJHgat+q0WDxPdGZU8UVAaNkxWJ5r8pMu80T OCBJYOwjz9pjwdtHAdU34uC4aNt9c4dHe+nH07qTwiHIT25E4EMMwBDUm3mGIVbGx8S8 FZ76ikUowojIy/ue8Tp90sVbLzKYR3Ev/p2shCXz7+SnWIwcme8jfZzGJGjIzOQ/WqVf +7oAUK2TXmcuIeAaWxb66C4tNuVJeWUCo8c5ddiSKRvB8160sKQm/s7JFMZcP1bSmObf ACNM5EOkBDLgOL74cbLH6mVcI7ssfV1LXlkNmeHOvwtcnlTKHHgJ95JWH82ckEcPC6cd Of8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660968; x=1788265768; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=xcyMmZEfNzdyoJm+GiWJ/XuB8ugXsgxUdEvqfhgkWHw=; b=g9PqGo3rCy+qBo8+YC1A7awkFuVYaXdayjH8TCLmvKmyMEydUI389SZevWDoxzQDuj 2fqauRqIbEQUzoGl/3bvbeHXHb9uQMuMR4tHWgis9VaG7s2JJTgnUT5DBFFPs0KSQs/q 1/WFXO562TpGWmTr7whLBt4MffL2wrKhIUidmJYCb82jGDsQLLGzvOdGw+dHg3ulkaFJ tyLZZspqfhDJF6yPKz+/3Pnw8L9YqhYT628bLUqKnuqzi7j3GQohvh8LziQcR5IiIW4h FpUbcwGb+Yik0Xcl43JNgpYyiVGYuEHmLQMHX7uPvc11HVhuri1H9ZCwLo30FciblI16 UKdQ== X-Gm-Message-State: AFuF++nGJBUV+lvZc5wPuyb4aHamPTYJdrlrh9usI5PTICd59AH0dBl0 uoz8eaFEHAGg1TypiWzwsI1dI+S+pcADEB9WOOZlBPj6tel60g2QxBP/S3ePQSp+ahc1Iqhp25o +4ciUqacvdgc3nFfz70Ci02PpWFulWV48/qNVuu3qzoudjdDeryWGstGtYFO7+PktZjYXLGc3Lx ywwbOObPdk4wxq3HjG8tf64m6jD+GkpnwB2+a3h8/5 X-Gm-Gg: AR+sD10cRef9ttZpm8WYedaT/2ShHo9oJ4iWSs22+1SghtEBe+Jr9j95NafJ+Wy5Wvu c1qQH/PElOFk4fas6ML+y+QdMlnE7YaoT8k8gK79xmKSGevYAbksGCyeVSB+X931iqnvpwsHe03 3VK12GDqWZjtwjCf63zDkckfORlipsimqP8LSXB5YZlWdNEU9xbEAULuEzlI1fjBJd77cC6jsX2 uZYCStVbvC/Fs03kxisPWh5aObjVXjqCGMUNY8lDZJP1eGZ/SKZoE0ixRRO42gcEMUndEWvZi4W EsRcEYjP0KwmRcuUI+gXI3xQoFHEpPu+tGenYB+DkynZ5VnHsGx3kal4xOO2CxTaAYRqKyedtl7 jqunjXU/NrVyzVa72xZGquJyfQhoEaa2pO/qDrGCYIvpDUZNRwq1+MgPLkJ7ztJzfLl35sCwcxf PL6+w= X-Received: by 2002:a05:6938:a08e:10b0:c21:7584:fc58 with SMTP id a640c23a62f3a-c24e5b5531emr510039866b.12.1787660968279; Tue, 25 Aug 2026 05:29:28 -0700 (PDT) X-Received: by 2002:a05:6938:a08e:10b0:c21:7584:fc58 with SMTP id a640c23a62f3a-c24e5b5531emr510033966b.12.1787660967676; Tue, 25 Aug 2026 05:29:27 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 02/20] target/i386/tcg: inline gen_ext_tl Date: Tue, 25 Aug 2026 14:29:03 +0200 Message-ID: <20260825122921.431739-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661115303158500 Content-Type: text/plain; charset="utf-8" It has been mostly replaced by tcg_gen_ext_tl(), other than for a single appearance in gen_op_j_ecx(). No need to have a separate function. Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/translate.c | 22 ++++++++-------------- target/i386/tcg/emit.c.inc | 4 ---- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index d1791550772..70f9bb42209 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -640,23 +640,17 @@ static inline void gen_string_movl_A0_EDI(DisasContex= t *s) gen_lea_v_seg(s, cpu_regs[R_EDI], R_ES, -1); } =20 -static TCGv gen_ext_tl(TCGv dst, TCGv src, MemOp size, bool sign) -{ - if (size =3D=3D MO_TL) { - return src; - } - if (!dst) { - dst =3D tcg_temp_new(); - } - tcg_gen_ext_tl(dst, src, size | (sign ? MO_SIGN : 0)); - return dst; -} - static void gen_op_j_ecx(DisasContext *s, TCGCond cond, TCGLabel *label1) { - TCGv tmp =3D gen_ext_tl(NULL, cpu_regs[R_ECX], s->aflag, false); + TCGv cmpval; + if (s->aflag =3D=3D MO_TL) { + cmpval =3D cpu_regs[R_ECX]; + } else { + cmpval =3D tcg_temp_new(); + tcg_gen_ext_tl(cmpval, cpu_regs[R_ECX], s->aflag); + } =20 - tcg_gen_brcondi_tl(cond, tmp, 0, label1); + tcg_gen_brcondi_tl(cond, cmpval, 0, label1); } =20 static inline void gen_op_jz_ecx(DisasContext *s, TCGLabel *label1) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 968abd47a73..c83ab809408 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1686,10 +1686,6 @@ static void gen_CMPccXADD(DisasContext *s, X86Decode= dInsn *decode) ot_full |=3D MO_SIGN; } =20 - /* - * cmpv will be moved to cc_src *after* cpu_regs[] is written back, so= use - * tcg_gen_ext_tl instead of gen_ext_tl. - */ tcg_gen_ext_tl(cmpv, cpu_regs[decode->op[1].n], ot_full); =20 /* --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661096; cv=none; d=zohomail.com; s=zohoarc; b=CVSZTlFXaKsx8zFVDzV/aNH5RtdS3bsGWUTV+WBw9DbGcLgtWAcX3fFGeACjqIG54/CpcooNdwZnYcm1YwhviT6eCx3Klk2efN98POntBJ1u8aJzDDaKMEJcEP1SSOP4HQioKegRVIleuO+4+3J9H1QAYUqdQOhTpIIXJpaSWKI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661096; h=Content-Transfer-Encoding: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:Cc; bh=NXXfH76IwMh9/5p8vLCuxmy9aJBgxgL/VPpjBI4iay0=; b=OR51magRMUxiJdUpx+wkrg7QMcFgtrXb1ENfqnI6czfYOy4fDwiC1bhDKyG8j5sEqFsRlVRzogt3n0xB8pTc6a6dT/pbrQtvWT/5fcoP7e9aHOB2LkywKZ6vPrgzdZHhaL03eo7C9Gkk2rfO7fP4daXLKQxu9lKBwRIQa6ouMIY= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661096440630.9254298756027; Tue, 25 Aug 2026 05:31:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHd-0004gf-26; Tue, 25 Aug 2026 08:29:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHZ-0004gH-QI for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:38 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHX-0000Hs-GM for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:37 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-486-GvL2vzI0NpiBNDO4Y4xQ2Q-1; Tue, 25 Aug 2026 08:29:31 -0400 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c20e5890680so229685166b.1 for ; Tue, 25 Aug 2026 05:29:31 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24967459aesm1682765266b.48.2026.08.25.05.29.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660974; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NXXfH76IwMh9/5p8vLCuxmy9aJBgxgL/VPpjBI4iay0=; b=DUk/OWOhj+osmxrcsCAj3A1fdoMa/2K+d9zDdxxU+CJaECmTSlkEcY5AZZjcrz8AaQSJUI dWgc80+KZwzjCAP3c1Mlis8kBgEcoaapMIdDgJFdxYb476QBqljfFA3UfExqlCLWVVw5qL x4NXsXe4vKrVP7AWUrAo90lpUhRIEhs= X-MC-Unique: GvL2vzI0NpiBNDO4Y4xQ2Q-1 X-Mimecast-MFC-AGG-ID: GvL2vzI0NpiBNDO4Y4xQ2Q_1787660971 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660971; x=1788265771; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=NXXfH76IwMh9/5p8vLCuxmy9aJBgxgL/VPpjBI4iay0=; b=RR3VWqhJethtmCTCfjYvcbuOYMUz4c1kLgt187gOropZe6weaGwzPJTSYgAJdBNemL +CU3/UCnJ1Mx7kE/MZdSKjfmTZ4wn0R1kptJBCwc+qYYTHPHZQ4peBfFPrYejajiFrro Htqrl9RSJKmkFx8s9ucGKjB0aAWMe3cX7w2R0XINBACTnKVC3M1e+2/EfLeQkWy5pTHd 9hTw7+VdE1PjsB30oYrsErE8TR1UZhfnA2x6UZ2x4XhVg6SOW0cG5ssq63/88Ccndc+r tgEWrZM0HL0SDgLhCbJ2j7mF1XcfePJGDqcIAu20KbTtXI1d3fEF7w6qc5Km57NTC+8s 3WNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660971; x=1788265771; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=NXXfH76IwMh9/5p8vLCuxmy9aJBgxgL/VPpjBI4iay0=; b=l3t9+wi5kcAjnVR/8oDhyCY7Qb1PHRC5R1mzIHTrtpVFXhgVHgbkShXKQplJvruzM0 7mHZpdR9+A0KfAX/i5lNaBQ1/1uwFu0EJwHVLyP7nwiASMLnOR/Vigv9FtmJtOAV6EXN pYGH+3qd3Kdc57PCmJ8asXN12ID3lGiHXjMfhCyeJ02biN6fTzYbmA07nta7FHKTOPoj TcZayVqAfMxSMeNfxj3bSGHT8aOTC0Fsns2b63vO1aWuFI+WT2eQ2MBnMipZ5OsJ5qBM xatL9yKCPpMC6s/ha58KgpVqfB60Hd40OyvX0+KvWmvrOpAOCGYgUIS8W6Ymc67Rvsol x8JA== X-Gm-Message-State: AFuF++nLIOpyvbtlyVi8M3xS+2r6hD3SdKum73mlGHl1KuQOahxkLQEW swZXR1K3iJ4M42n8n+ZtzYZHR1HFGunrojOh9b3FO3E2oM73U0LnyhFn9MTTGW0kfshuoO0sc3P lSwlAGMMtBt3L2PKTXHvwPr9WCThg+vPu4zkc7gkF3ldYdAUh8s5qHvDyjLp29nQL5vvS1oN78K Hkn9QjL7bGMBS5MRSDYDNnVILhjVC8jhAKRWB6LoEy X-Gm-Gg: AR+sD12osmyh4NKR9RnW46uHzi/zR4NSclYyMdop+iPteCIxJYjlZl2h7ljektdCtZy jNNFMFl3Cfx809NsFuiioDqwGGiR6IXmNORhXcQ654x8qSx9ZhsxcTglzJEwQ4+uA9LKAIPIqAi dmHL/c/dnTISngRMfTNoHd4pK9803Y/H0qzYHnIa3aQ20i5rqOGn3ZQZFPXFIQYU5nqWfCenrCl Sl90T85P68WzQpUtALW1+6fz1UXKHywA7Y/Y6AgkHoiquC/8SXFMeag9s+awCSq9RiAUKcWg397 3KGMMtQDYA2oXWvZ3Pl3e9j4gmfQsqRxe6K4b9yU76SJgMLJ2uSvXfSL1Mh7xFIAZDE/zndlucF Y6Aihxf1mCpZjzLosn6Tfjt9SpL0eQgT6PgbBV07sLvLMs0HyptNzQDVYKeO1voetF5ec4WInIF N1AC8= X-Received: by 2002:a17:907:948a:b0:c1f:922d:34c3 with SMTP id a640c23a62f3a-c24926a1c3dmr2492011766b.14.1787660970457; Tue, 25 Aug 2026 05:29:30 -0700 (PDT) X-Received: by 2002:a17:907:948a:b0:c1f:922d:34c3 with SMTP id a640c23a62f3a-c24926a1c3dmr2492005266b.14.1787660969889; Tue, 25 Aug 2026 05:29:29 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 03/20] target/i386/tcg: simplify return value of gen_prepare_cc Date: Tue, 25 Aug 2026 14:29:04 +0200 Message-ID: <20260825122921.431739-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661097450158500 Content-Type: text/plain; charset="utf-8" Always make reg2 valid, unify .use_reg2 and .no_setcond now that .use_reg2 is a misnomer. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 63 ++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 70f9bb42209..bbd1c3b7893 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -828,13 +828,21 @@ static void gen_compute_eflags(DisasContext *s) set_cc_op(s, CC_OP_EFLAGS); } =20 +typedef enum { + /* imm is valid and reg2 is a constant */ + CC_PREPARE_IMM, + /* imm is invalid */ + CC_PREPARE_REG, + /* imm and reg2 are 0, and reg is known to be 0/1 */ + CC_PREPARE_DIRECT, +} CCPrepareRHS; + typedef struct CCPrepare { TCGCond cond; TCGv reg; TCGv reg2; target_ulong imm; - bool use_reg2; - bool no_setcond; + CCPrepareRHS rhs_type; } CCPrepare; =20 static CCPrepare gen_prepare_sign_nz(TCGv src, MemOp size) @@ -871,7 +879,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) tcg_gen_ext_tl(s->cc_srcT, s->cc_srcT, size); tcg_gen_ext_tl(cpu_cc_src, cpu_cc_src, size); return (CCPrepare) { .cond =3D TCG_COND_LTU, .reg =3D s->cc_srcT, - .reg2 =3D cpu_cc_src, .use_reg2 =3D true }; + .reg2 =3D cpu_cc_src, .rhs_type =3D CC_PREPAR= E_REG }; =20 case CC_OP_ADDB ... CC_OP_ADDQ: /* (DATA_TYPE)CC_DST < (DATA_TYPE)CC_SRC */ @@ -879,7 +887,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) tcg_gen_ext_tl(cpu_cc_dst, cpu_cc_dst, size); tcg_gen_ext_tl(cpu_cc_src, cpu_cc_src, size); return (CCPrepare) { .cond =3D TCG_COND_LTU, .reg =3D cpu_cc_dst, - .reg2 =3D cpu_cc_src, .use_reg2 =3D true }; + .reg2 =3D cpu_cc_src, .rhs_type =3D CC_PREPAR= E_REG }; =20 case CC_OP_LOGICB ... CC_OP_LOGICQ: case CC_OP_POPCNT: @@ -888,7 +896,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) case CC_OP_INCB ... CC_OP_INCQ: case CC_OP_DECB ... CC_OP_DECQ: return (CCPrepare) { .cond =3D TCG_COND_NE, .reg =3D cpu_cc_src, - .no_setcond =3D true }; + .rhs_type =3D CC_PREPARE_DIRECT }; =20 case CC_OP_SHLB ... CC_OP_SHLQ: /* (CC_SRC >> (DATA_BITS - 1)) & 1 */ @@ -913,7 +921,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) case CC_OP_ADCX: case CC_OP_ADCOX: return (CCPrepare) { .cond =3D TCG_COND_NE, .reg =3D cpu_cc_dst, - .no_setcond =3D true }; + .rhs_type =3D CC_PREPARE_DIRECT }; =20 case CC_OP_EFLAGS: case CC_OP_SARB ... CC_OP_SARQ: @@ -931,7 +939,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) gen_helper_cc_compute_c(reg, cpu_cc_dst, cpu_cc_src, cpu_cc_src2, cpu_cc_op); return (CCPrepare) { .cond =3D TCG_COND_NE, .reg =3D reg, - .no_setcond =3D true }; + .rhs_type =3D CC_PREPARE_DIRECT }; } } =20 @@ -970,7 +978,7 @@ static CCPrepare gen_prepare_eflags_o(DisasContext *s, = TCGv reg) case CC_OP_ADOX: case CC_OP_ADCOX: return (CCPrepare) { .cond =3D TCG_COND_NE, .reg =3D cpu_cc_src2, - .no_setcond =3D true }; + .rhs_type =3D CC_PREPARE_DIRECT }; case CC_OP_SBB_SELF: case CC_OP_LOGICB ... CC_OP_LOGICQ: case CC_OP_POPCNT: @@ -1032,7 +1040,7 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int = b, TCGv reg) tcg_gen_ext_tl(s->cc_srcT, s->cc_srcT, size); tcg_gen_ext_tl(cpu_cc_src, cpu_cc_src, size); cc =3D (CCPrepare) { .cond =3D TCG_COND_LEU, .reg =3D s->cc_sr= cT, - .reg2 =3D cpu_cc_src, .use_reg2 =3D true }; + .reg2 =3D cpu_cc_src, .rhs_type =3D CC_PREP= ARE_REG }; break; case JCC_L: cond =3D TCG_COND_LT; @@ -1043,7 +1051,7 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int = b, TCGv reg) tcg_gen_ext_tl(s->cc_srcT, s->cc_srcT, size | MO_SIGN); tcg_gen_ext_tl(cpu_cc_src, cpu_cc_src, size | MO_SIGN); cc =3D (CCPrepare) { .cond =3D cond, .reg =3D s->cc_srcT, - .reg2 =3D cpu_cc_src, .use_reg2 =3D true }; + .reg2 =3D cpu_cc_src, .rhs_type =3D CC_PREP= ARE_REG }; break; =20 default: @@ -1128,6 +1136,9 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int = b, TCGv reg) break; } =20 + if (cc.rhs_type !=3D CC_PREPARE_REG) { + cc.reg2 =3D tcg_constant_tl(cc.imm); + } if (inv) { cc.cond =3D tcg_invert_cond(cc.cond); } @@ -1138,7 +1149,7 @@ static void gen_neg_setcc(DisasContext *s, int b, TCG= v reg) { CCPrepare cc =3D gen_prepare_cc(s, b, reg); =20 - if (cc.no_setcond) { + if (cc.rhs_type =3D=3D CC_PREPARE_DIRECT) { if (cc.cond =3D=3D TCG_COND_EQ) { tcg_gen_addi_tl(reg, cc.reg, -1); } else { @@ -1147,18 +1158,14 @@ static void gen_neg_setcc(DisasContext *s, int b, T= CGv reg) return; } =20 - if (cc.use_reg2) { - tcg_gen_negsetcond_tl(cc.cond, reg, cc.reg, cc.reg2); - } else { - tcg_gen_negsetcondi_tl(cc.cond, reg, cc.reg, cc.imm); - } + tcg_gen_negsetcond_tl(cc.cond, reg, cc.reg, cc.reg2); } =20 static void gen_setcc(DisasContext *s, int b, TCGv reg) { CCPrepare cc =3D gen_prepare_cc(s, b, reg); =20 - if (cc.no_setcond) { + if (cc.rhs_type =3D=3D CC_PREPARE_DIRECT) { if (cc.cond =3D=3D TCG_COND_EQ) { tcg_gen_xori_tl(reg, cc.reg, 1); } else { @@ -1167,11 +1174,7 @@ static void gen_setcc(DisasContext *s, int b, TCGv r= eg) return; } =20 - if (cc.use_reg2) { - tcg_gen_setcond_tl(cc.cond, reg, cc.reg, cc.reg2); - } else { - tcg_gen_setcondi_tl(cc.cond, reg, cc.reg, cc.imm); - } + tcg_gen_setcond_tl(cc.cond, reg, cc.reg, cc.reg2); } =20 static inline void gen_compute_eflags_c(DisasContext *s, TCGv reg) @@ -1185,11 +1188,7 @@ static inline void gen_jcc_noeob(DisasContext *s, in= t b, TCGLabel *l1) { CCPrepare cc =3D gen_prepare_cc(s, b, NULL); =20 - if (cc.use_reg2) { - tcg_gen_brcond_tl(cc.cond, cc.reg, cc.reg2, l1); - } else { - tcg_gen_brcondi_tl(cc.cond, cc.reg, cc.imm, l1); - } + tcg_gen_brcond_tl(cc.cond, cc.reg, cc.reg2, l1); } =20 /* Generate a conditional jump to label 'l1' according to jump opcode @@ -1206,11 +1205,7 @@ static inline void gen_jcc(DisasContext *s, int b, T= CGLabel *l1) * it's cheaper to just compute the flags)! */ gen_update_cc_op(s); - if (cc.use_reg2) { - tcg_gen_brcond_tl(cc.cond, cc.reg, cc.reg2, l1); - } else { - tcg_gen_brcondi_tl(cc.cond, cc.reg, cc.imm, l1); - } + tcg_gen_brcond_tl(cc.cond, cc.reg, cc.reg2, l1); } =20 static void gen_stos(DisasContext *s, MemOp ot, TCGv dshift) @@ -1717,10 +1712,6 @@ static void gen_cmovcc(DisasContext *s, int b, TCGv = dest, TCGv src) { CCPrepare cc =3D gen_prepare_cc(s, b, NULL); =20 - if (!cc.use_reg2) { - cc.reg2 =3D tcg_constant_tl(cc.imm); - } - tcg_gen_movcond_tl(cc.cond, dest, cc.reg, cc.reg2, src, dest); } =20 --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661021; cv=none; d=zohomail.com; s=zohoarc; b=FXLGHoncb2KK1R7gpopVyJLiK0HqAO1GJwk/BnlcUzhRsmoH3zWp19Qlk5pMoSMwLtmJGJXK0rog+9jeVfKeTS2UV5OTCiX3SN1cTrcfBIWKBZJJ3ai6+fIWAdOvzWDxNBuax4OPGfUB6MuQylTdHb/ODhWTEAiquv79msPJvlI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661021; h=Content-Transfer-Encoding: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:Cc; bh=eE17Ge5pQll+CKBZcZE4tJbV0rcAbPkHpSAYrj5d3UE=; b=U4pDsMJZyv+2++eDXpoy63E1jNxYI6vYW2HWs2wQLX/w2AED5Zo3QP7Qdx8cd49LeAgNal/MhRToPdI5jBQ4DUKZ/iKJvUZ0eSRMOB30MK0650q17h9Cw4rpnas1EpyzsERrb57TsaMqZ61alumX3hMxX40balWJ+nqPsHI30Wc= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661021292155.1819357272169; Tue, 25 Aug 2026 05:30:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHf-0004gs-1q; Tue, 25 Aug 2026 08:29:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHa-0004gO-OM for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:39 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHX-0000I1-Sr for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:38 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-271-VlfdSW4PN_-i3HPcW_xg1Q-1; Tue, 25 Aug 2026 08:29:33 -0400 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-c1670dd0f5dso157070066b.2 for ; Tue, 25 Aug 2026 05:29:33 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c25026bdb17sm115700066b.32.2026.08.25.05.29.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660974; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eE17Ge5pQll+CKBZcZE4tJbV0rcAbPkHpSAYrj5d3UE=; b=MVRcCCx8vrDd2sdDx/YsB0eMOub3CUkXSt+jIST0fHMJ9163MNGt9+lTWjPji7Oo3x9fqY KDew68HPWq+QOwzf33MIm2Gusfd4C3Zxih06GqBAhXYj8yTtRLn0VlI4wn+cUsQk+wQZUI ePlybxRqO5NerHiNNyFDIHUMiyXlu9g= X-MC-Unique: VlfdSW4PN_-i3HPcW_xg1Q-1 X-Mimecast-MFC-AGG-ID: VlfdSW4PN_-i3HPcW_xg1Q_1787660972 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660972; x=1788265772; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=eE17Ge5pQll+CKBZcZE4tJbV0rcAbPkHpSAYrj5d3UE=; b=BydEQEtbFCycFrnZ6/ohHYPAr/YCttGpkw8dRcIVGjgEQIbC6lflvAS//WVQ/fUZNT 7umfHwVH6KmcJfLlWKiT+mXO1vde4zUvtBnQ3lAzyUk+wtVxluwhK0YronXxA9r/0I71 nwxgCMDsGrZxkdCEmTRmfFwyoqFhNRu+JV2l55m2kaRM8nMb5ZXUyQIrNBOr0E1NyR56 NHIRXtofl1+m79x18paK+HGV5rTCwJXQ2nv3cEbeVorMSOOklqAjSpw4kmSW0UU3mcnU VfvjMVCz4IQs/yJ/2GTOcmjevBdIVlb+Jha3kg3MmXe4Yg9SynZrvp3pYaakqf0W0/Ce c4Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660972; x=1788265772; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=eE17Ge5pQll+CKBZcZE4tJbV0rcAbPkHpSAYrj5d3UE=; b=CVJeIZzYi5s+vWA9Ye1v5jtaXfo/5daDS86atbrCWBFLTi+UUm2soXQCLz31fzBcG7 bU+24K9+vt4dWfwuQAPZ2MAo8JA5cpviaoJFRge2CK4fr2TkcjaZPqLNZ0KbZLl+H/Ec TSrYKlpbrynG3wMyXUeMNi3f4gzhBpSHohcTmAFYdrz28Pgp8TzOv4KZEVKL0Wkvo5IM SA2hYpkRFqwCK3PAaFAYAu23QszWxzINPjcjon+PFGxYrK3D2FzI00oLLT6Lx1p+KxDO xVDUY7d3e+XH2kRe6R1ZT5w568qW4lPQRuaayZmhVei7aQwq2SKy0PjT8ZW8/O6X70tV 5XSQ== X-Gm-Message-State: AFuF++kIar3Ki5OvdQkdiu6TBZMX1E4wC+IrEFcfnHvi2aciycYsnIHB 6r/Lh2sEbuvmR0nFKSXhfgdBFHNgzNkk+rbL6eOgscYe9+blpjCjKW0OE3fzhDHYFEGBjZjiCGW 8hEKbHwURmql4crx3ahagZVdR7RiHc8Joj2/XEETzWpKyeTf1EnezchpKLRCcXxW+Oeq5AIPzTo f1/daxee21TigeK59kFtaRIXb9MFwW9+WgKCQbmBW5 X-Gm-Gg: AR+sD11BmWlCKfGW/ki0wyd4bDdSQQKrrGJZlHOU5jgaxeMvwfrL/DlAJLHlaTl1Bhx PIMZbtsa+vHasn9M/6oibtCpEEFuX7ptgUpSUn4dpfZZZ21+0PedzazFx/rSc5TZ0/GpEb2Y9Eh 8hYxFHGsR3+hDo1Nx3/nF0Fv7im7PD0zXZWRaVkQbalotHpd3lzZz9ipVj6izcYjTBJbUz1/XLt PZm9wHQpBILxhkEOGXslLGKDX7k2KGkcpTkEZC6MCIX6bxuDiLOOWq3f+ef9fabxN9T0ZKSsQPY MhtpdqH3DF4w60M4z6V2gzSeQMjaREO1nrc5/f3hY1ZPeWV5LFSNHr+0ZGk8SFCMhjCEBTvSQRO OUOIf7RjC3rsW64aWa8RFOBMmi4R6tOzMK+DP6vollx4NoSC3C3EpyaNW0wotGjTz0ldBsANxRc DIXlc= X-Received: by 2002:a17:907:c0b:b0:c24:42b1:3092 with SMTP id a640c23a62f3a-c2491e83af8mr2986998366b.15.1787660972299; Tue, 25 Aug 2026 05:29:32 -0700 (PDT) X-Received: by 2002:a17:907:c0b:b0:c24:42b1:3092 with SMTP id a640c23a62f3a-c2491e83af8mr2986992566b.15.1787660971869; Tue, 25 Aug 2026 05:29:31 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 04/20] target/i386/tcg: move check bits out of validate_vex Date: Tue, 25 Aug 2026 14:29:05 +0200 Message-ID: <20260825122921.431739-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661023530158500 Content-Type: text/plain; charset="utf-8" JMPABS will need the W0 check; move all of these checks together with the others in disas_insn. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 9c429e113de..47bc30a22fc 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2723,24 +2723,6 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) if (s->flags & HF_EM_MASK) { goto illegal; } - - if (e->check) { - if (e->check & X86_CHECK_VEX128) { - if (s->vex_l) { - goto illegal; - } - } - if (e->check & X86_CHECK_W0) { - if (s->vex_w) { - goto illegal; - } - } - if (e->check & X86_CHECK_W1) { - if (!s->vex_w) { - goto illegal; - } - } - } return true; =20 nm_exception: @@ -3000,6 +2982,15 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) goto illegal_op; } } + if ((decode.e.check & X86_CHECK_VEX128) && s->vex_l) { + goto illegal_op; + } + if ((decode.e.check & X86_CHECK_W0) && s->vex_w) { + goto illegal_op; + } + if ((decode.e.check & X86_CHECK_W1) && !s->vex_w) { + goto illegal_op; + } } =20 switch (decode.e.special) { --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661071; cv=none; d=zohomail.com; s=zohoarc; b=GoTp6JjRmdK9pOpmtUK1bALk0an3kqN53VNRHFOPRqi75VoABQUPShs7Ia9N4PQS0DSo9WlVWc3xQHI6X4h6HKumXmIhJMAnyjSNNzor3EdK8a9QSLGJswP0YIXa+moNQcczXje4Exr19/rAtHWKAmZ8IhFg4jwvhEuGq4VMuRg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661071; h=Content-Transfer-Encoding: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:Cc; bh=CctPaz35SpkBvSVYmSA+dpAk+d3UWmMos9BA4/wjDdk=; b=kggTCacKcoIS423acaQ8jlY6652vTpy8jfwtFW9veNC27TyKeyuJglTW9LOpoHdYFUAEV2dgkqqYb4ri2Kep2VFRS7IfJ/fq3p6tZ1sSHsyJsKvOIz67EgbcCQMLmj9mxwAZR93Fx356x1N89RIn0u5oalyAedfAPbI+WlQqY3g= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661071884516.0125731486468; Tue, 25 Aug 2026 05:31:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHg-0004hM-St; Tue, 25 Aug 2026 08:29:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHd-0004gl-Ec for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHb-0000JK-BL for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:41 -0400 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-447-3h1wvTaaMIm43hLR0pVCrg-1; Tue, 25 Aug 2026 08:29:36 -0400 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-c1686e23b9cso400415466b.0 for ; Tue, 25 Aug 2026 05:29:36 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24dfd91dd4sm467031366b.16.2026.08.25.05.29.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660978; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CctPaz35SpkBvSVYmSA+dpAk+d3UWmMos9BA4/wjDdk=; b=L+VlyfXDgOU5rtag1DE6PDwX1X/6dPC4PaHewLI9pO7sRwWGeCjiKoQLPf33JkSYLhjWTl ck0atYWzKnovdKsiEDGH0HCoY8Akj4InC8Y8w6VHwEhwcBxXPhOmwAN7U14BMM4uLi6BjV YRQw+0a6r7pqf8Poe2OO2k8KGTRCtZM= X-MC-Unique: 3h1wvTaaMIm43hLR0pVCrg-1 X-Mimecast-MFC-AGG-ID: 3h1wvTaaMIm43hLR0pVCrg_1787660975 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660975; x=1788265775; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=CctPaz35SpkBvSVYmSA+dpAk+d3UWmMos9BA4/wjDdk=; b=XygYgt0HMl3DhkPy8rDncTAcSOPu3fepg1xoNnowzNiV1e6YYEj/Mkp9DpKcHkgczj 7hw+i9NOoDcXaJpPmiKP149SGB1jjV/PS0piUvJpqI7wzwD0x8iw0UuZ9qFjD2puuMQH HP3JPxmqZ5D2QgYGfngLyOwaTTpMVoNObmktoLwLOvF7/zoV3ahYDDI1BSzsjflidBj4 /sXYCI1k7lrkHUefLhHPN/gVFphxUBVLtHZMr2TBvx+UFVbSRGByCjUtE30WvFBdWECD bFaiA255mApyCXkGkrM66EBcb7H0PEtTpU6LUuJ7uQbQ/pwNaQWxw6Xn8Gu6phaiPTyt XEug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660975; x=1788265775; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=CctPaz35SpkBvSVYmSA+dpAk+d3UWmMos9BA4/wjDdk=; b=BwL3yO8spw6gK33efBCIHL7RhiqlagXt0evhR4GVC67SODcnXe7rGOYggiCsfaTt+q b5U+f2SEYxXdL8iuh3xCaeR46XR/9tMTYsfn9XUOUbaJ4yXnYvG2MnbM6NefPE/H7HH9 kqIKFLztkrhT7cH954NBzkhm1kCfqeEGqTliIXsAKYCynUmn9HWyjS39HPzyhYPbU0Kl MmBOdLDwQ+/xwl2L1Tr9plLLzKHGE19FYTaOk2vW1DOn6iOdvfxq5aeyj82256LTceOE YE4tNu+tnGX64pIPD4eXn/zbSICDlWn8vUvqkyj8J+Pkjp3BJfk+giZWFS5TnlPP3o0n 9Cqw== X-Gm-Message-State: AFuF++mISwSKeAE+80aqbD2sj0IiKrHIUIbWK9USfdddC99rcDENkpRk 0FKXm4AuNqVVIswlykO0bCEUSf2qr64XEMLtsTlNwtcAjWw59u7sTeoKHOVZgzYCEllHidIasOI jpZ6TlOn/UKZZDQo9anfPTQCQDEbwhuG2Rthdfs92bSOXzBx7D3qtqokT8Dzyon0iO95YLRQa9c h+0WcYUVMP3LQeyzHBuGgzUcy3vnU8j10zLQJxRYfp X-Gm-Gg: AR+sD12eEKqVO/PguVM5SGtq+NeMauSTwN3Ur6mh15KLcwRfyJnKqacpRynZYmgzrLw ncDP7w92U5CFs/xmW8Lt3T5/9a9BDceMD+pSaj6IYOSzcSE+2JCLGL7tDDAccNnx7889lNrZg6L JTR2domDAsewP7Ho75/gy+BXeBtHMRN8ZqIdnprPQeKUJZq4Kd00jHQahhYs+LHhpdUnlcBpxgW +rIHoG5nOCNFbO6UITEBF2wfxmcQO4KjjJieYXsshRwdj9Q/GEYz/apBo3KrtOzlgnxNpg77iS+ 79E/yyb+Vp8ENu+9bTcZAhuGmXMdwXJDRhskAOCFz6muGi4/CAUektrFp6wnx8wH/XmXBfzxOOn C1+67j2EAyt0lDYu5MvBiaaXIRCB+Pls9EOWQ2lhwpyqwWx0SGE8Wziw9gaYj7vDE2mVcEplXDT dJslA= X-Received: by 2002:a17:907:60cd:b0:c24:c22c:6372 with SMTP id a640c23a62f3a-c24c22c6490mr1559742566b.5.1787660975259; Tue, 25 Aug 2026 05:29:35 -0700 (PDT) X-Received: by 2002:a17:907:60cd:b0:c24:c22c:6372 with SMTP id a640c23a62f3a-c24c22c6490mr1559726966b.5.1787660974430; Tue, 25 Aug 2026 05:29:34 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 05/20] target/i386/tcg: add APX support to XSAVE/XRSTOR Date: Tue, 25 Aug 2026 14:29:06 +0200 Message-ID: <20260825122921.431739-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661073035158500 Content-Type: text/plain; charset="utf-8" With it, add a new hidden flag that will be used to enable the REX2 prefix and EVEX map4. Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 3 ++ target/i386/tcg/tcg-cpu.h | 16 +++++++--- target/i386/helper.c | 11 +++++++ target/i386/tcg/fpu_helper.c | 59 +++++++++++++++++++++++++++++++++--- target/i386/tcg/tcg-cpu.c | 5 +-- 5 files changed, 83 insertions(+), 11 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 641f3ee5c2f..dc5d48aceea 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -191,6 +191,7 @@ typedef enum X86Seg { #define HF_MPX_IU_SHIFT 26 /* BND registers in-use */ #define HF_UMIP_SHIFT 27 /* CR4.UMIP */ #define HF_AVX_EN_SHIFT 28 /* AVX Enabled (CR4+XCR0) */ +#define HF_APX_EN_SHIFT 29 /* APX Enabled (CR4+XCR0) */ =20 #define HF_CPL_MASK (3 << HF_CPL_SHIFT) #define HF_INHIBIT_IRQ_MASK (1 << HF_INHIBIT_IRQ_SHIFT) @@ -218,6 +219,7 @@ typedef enum X86Seg { #define HF_MPX_IU_MASK (1 << HF_MPX_IU_SHIFT) #define HF_UMIP_MASK (1 << HF_UMIP_SHIFT) #define HF_AVX_EN_MASK (1 << HF_AVX_EN_SHIFT) +#define HF_APX_EN_MASK (1 << HF_APX_EN_SHIFT) =20 /* hflags2 */ =20 @@ -2759,6 +2761,7 @@ static inline bool x86_has_cpuid_0x1f(X86CPU *cpu) /* helper.c */ void x86_cpu_set_a20(X86CPU *cpu, int a20_state); void cpu_sync_avx_hflag(CPUX86State *env); +void cpu_sync_apx_hflag(CPUX86State *env); =20 typedef enum X86ASIdx { X86ASIdx_MEM =3D 0, diff --git a/target/i386/tcg/tcg-cpu.h b/target/i386/tcg/tcg-cpu.h index 85bcd61678f..451f61e2043 100644 --- a/target/i386/tcg/tcg-cpu.h +++ b/target/i386/tcg/tcg-cpu.h @@ -52,9 +52,15 @@ typedef struct X86XSaveArea { - sizeof(X86XSaveHeader) - sizeof(XSaveAVX)]; =20 - /* MPX State: */ - XSaveBNDREG bndreg_state; - XSaveBNDCSR bndcsr_state; + /* Overlapping MPX and APX States: */ + union { + struct { + XSaveBNDREG bndreg; + XSaveBNDCSR bndcsr; + } mpx_state; + XSaveAPX apx_state; + }; + /* AVX-512 State: */ XSaveOpmask opmask_state; XSaveZMM_Hi256 zmm_hi256_state; @@ -71,8 +77,8 @@ QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.mxcsr) != =3D XSAVE_MXCSR_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.fpregs) !=3D XSAVE_ST_SPAC= E_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.xmm_regs) !=3D XSAVE_XMM_S= PACE_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, avx_state) !=3D XSAVE_AVX_OFFSET); -QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, bndreg_state) !=3D XSAVE_BNDREG_O= FFSET); -QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, bndcsr_state) !=3D XSAVE_BNDCSR_O= FFSET); +QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, mpx_state.bndreg) !=3D XSAVE_BNDR= EG_OFFSET); +QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, mpx_state.bndcsr) !=3D XSAVE_BNDC= SR_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, opmask_state) !=3D XSAVE_OPMASK_O= FFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, zmm_hi256_state) !=3D XSAVE_ZMM_H= I256_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, hi16_zmm_state) !=3D XSAVE_HI16_Z= MM_OFFSET); diff --git a/target/i386/helper.c b/target/i386/helper.c index 68362141621..22d205bed66 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -36,6 +36,16 @@ #include "tcg/insn-start-words.h" #endif =20 +void cpu_sync_apx_hflag(CPUX86State *env) +{ + if ((env->cr[4] & CR4_OSXSAVE_MASK) + && (env->xcr0 & XSTATE_APX_MASK) =3D=3D XSTATE_APX_MASK) { + env->hflags |=3D HF_APX_EN_MASK; + } else{ + env->hflags &=3D ~HF_APX_EN_MASK; + } +} + void cpu_sync_avx_hflag(CPUX86State *env) { if ((env->cr[4] & CR4_OSXSAVE_MASK) @@ -250,6 +260,7 @@ void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_= cr4) =20 cpu_sync_bndcs_hflags(env); cpu_sync_avx_hflag(env); + cpu_sync_apx_hflag(env); } =20 #if !defined(CONFIG_USER_ONLY) diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c index b812125efa1..e341aefb9f0 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -2690,6 +2690,19 @@ static void do_xsave_pkru(X86Access *ac, target_ulon= g ptr) access_stq(ac, ptr, ac->env->pkru); } =20 +#ifdef TARGET_X86_64 +static void do_xsave_apx(X86Access *ac, target_ulong ptr) +{ + CPUX86State *env =3D ac->env; + int i; + + for (i =3D 16; i < 32; i++) { + access_stq(ac, ptr, env->regs[i]); + ptr +=3D 8; + } +} +#endif + static void do_fxsave(X86Access *ac, target_ulong ptr) { CPUX86State *env =3D ac->env; @@ -2754,14 +2767,19 @@ static void do_xsave_access(X86Access *ac, target_u= long ptr, uint64_t rfbm, do_xsave_ymmh(ac, ptr + XO(avx_state)); } if (opt & XSTATE_BNDREGS_MASK) { - do_xsave_bndregs(ac, ptr + XO(bndreg_state)); + do_xsave_bndregs(ac, ptr + XO(mpx_state.bndreg)); } if (opt & XSTATE_BNDCSR_MASK) { - do_xsave_bndcsr(ac, ptr + XO(bndcsr_state)); + do_xsave_bndcsr(ac, ptr + XO(mpx_state.bndcsr)); } if (opt & XSTATE_PKRU_MASK) { do_xsave_pkru(ac, ptr + XO(pkru_state)); } +#ifdef TARGET_X86_64 + if (opt & XSTATE_APX_MASK) { + do_xsave_apx(ac, ptr + XO(apx_state)); + } +#endif =20 /* Update the XSTATE_BV field. */ old_bv =3D access_ldq(ac, ptr + XO(header.xstate_bv)); @@ -2955,6 +2973,29 @@ static void do_fxrstor(X86Access *ac, target_ulong p= tr) } } =20 +#ifdef TARGET_X86_64 +static void do_xrstor_apx(X86Access *ac, target_ulong ptr) +{ + CPUX86State *env =3D ac->env; + int i; + + for (i =3D 16; i < 32; i++) { + env->regs[i] =3D access_ldq(ac, ptr); + ptr +=3D 8; + } +} + +static void do_clear_apx(X86Access *ac) +{ + CPUX86State *env =3D ac->env; + int i; + + for (i =3D 16; i < 32; i++) { + env->regs[i] =3D 0; + } +} +#endif + void helper_fxrstor(CPUX86State *env, target_ulong ptr) { uintptr_t ra =3D GETPC(); @@ -3026,7 +3067,7 @@ static void do_xrstor(X86Access *ac, target_ulong ptr, } if (rfbm & XSTATE_BNDREGS_MASK) { if (xstate_bv & XSTATE_BNDREGS_MASK) { - do_xrstor_bndregs(ac, ptr + XO(bndreg_state)); + do_xrstor_bndregs(ac, ptr + XO(mpx_state.bndreg)); env->hflags |=3D HF_MPX_IU_MASK; } else { memset(env->bnd_regs, 0, sizeof(env->bnd_regs)); @@ -3035,7 +3076,7 @@ static void do_xrstor(X86Access *ac, target_ulong ptr, } if (rfbm & XSTATE_BNDCSR_MASK) { if (xstate_bv & XSTATE_BNDCSR_MASK) { - do_xrstor_bndcsr(ac, ptr + XO(bndcsr_state)); + do_xrstor_bndcsr(ac, ptr + XO(mpx_state.bndcsr)); } else { memset(&env->bndcs_regs, 0, sizeof(env->bndcs_regs)); } @@ -3053,6 +3094,15 @@ static void do_xrstor(X86Access *ac, target_ulong pt= r, tlb_flush(cs); } } +#ifdef TARGET_X86_64 + if (rfbm & XSTATE_APX_MASK) { + if (xstate_bv & XSTATE_APX_MASK) { + do_xrstor_apx(ac, ptr + XO(apx_state)); + } else { + do_clear_apx(ac); + } + } +#endif } =20 #undef XO @@ -3228,6 +3278,7 @@ void helper_xsetbv(CPUX86State *env, uint32_t ecx, ui= nt64_t mask) env->xcr0 =3D mask; cpu_sync_bndcs_hflags(env); cpu_sync_avx_hflag(env); + cpu_sync_apx_hflag(env); return; =20 do_gpf: diff --git a/target/i386/tcg/tcg-cpu.c b/target/i386/tcg/tcg-cpu.c index 6f5dc06b3b9..2965c304e57 100644 --- a/target/i386/tcg/tcg-cpu.c +++ b/target/i386/tcg/tcg-cpu.c @@ -198,12 +198,13 @@ static void x86_tcg_cpu_xsave_init(void) XO(XSTATE_FP_BIT, legacy); XO(XSTATE_SSE_BIT, legacy); XO(XSTATE_YMM_BIT, avx_state); - XO(XSTATE_BNDREGS_BIT, bndreg_state); - XO(XSTATE_BNDCSR_BIT, bndcsr_state); + XO(XSTATE_BNDREGS_BIT, mpx_state.bndreg); + XO(XSTATE_BNDCSR_BIT, mpx_state.bndcsr); XO(XSTATE_OPMASK_BIT, opmask_state); XO(XSTATE_ZMM_Hi256_BIT, zmm_hi256_state); XO(XSTATE_Hi16_ZMM_BIT, hi16_zmm_state); XO(XSTATE_PKRU_BIT, pkru_state); + XO(XSTATE_APX_BIT, apx_state); =20 #undef XO } --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661110; cv=none; d=zohomail.com; s=zohoarc; b=iVLOKkj3tChmgbOYsLEJwQVl2NE9dEWXJS6gPgktGQbIU+DlTBf8Ykagi/8tGxcs5UfbyhES0yOrCtsjRKkJnRQndVNEMHl+/gk6PVxC9kOjFcZr2k1kahaq+erJE53GNA5RjHO99aJO2j/Um3YrXVlwLsa9Lp+SjwTBQi6xbAk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661110; h=Content-Transfer-Encoding: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:Cc; bh=BzPmt7KVQkTpe1/d3/LXdqLWTe5gTJkqbQqLF5f/EEg=; b=Y5EOEEZcxGq0+iDPXk+hf7YBzxtFboWtTjYoTnxwyJUydHSCPTheh1dW6aSmp8bAkXFQpATCpS4fDrnDMtKOTRVFWzjw992Q+9Y1epQurQLsRBk1HtRpdbl9upHuB+VoTSPbJQwBUagt98F8267nZ4K4SNiTi47CUtouhSL2DYg= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178766111057252.05935907958451; Tue, 25 Aug 2026 05:31:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHj-0004hq-4Y; Tue, 25 Aug 2026 08:29:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHd-0004gr-KI for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHb-0000Jk-Sn for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:41 -0400 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-120-mMPR4ICqMJSDBUakETW6Tw-1; Tue, 25 Aug 2026 08:29:38 -0400 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-47162f83c75so336417f8f.1 for ; Tue, 25 Aug 2026 05:29:37 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-499d633cac2sm29459815e9.2.2026.08.25.05.29.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660979; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BzPmt7KVQkTpe1/d3/LXdqLWTe5gTJkqbQqLF5f/EEg=; b=XhWl03Uk+CUfaWuhtrrfTvEsGWk9zYQ//1JER+zLxjtG7Q5C2h3CbyWR5nVjnC5yR3ui+B lgIkbyW+kVkxoz5pZJDqxi+ceR1WYs6h/6shJPHkXE+6pRGTv9tZJuvhh/eG5NTEFOktFb uQ7KW/73SiS3PurZjwt1SssjW7I4NtI= X-MC-Unique: mMPR4ICqMJSDBUakETW6Tw-1 X-Mimecast-MFC-AGG-ID: mMPR4ICqMJSDBUakETW6Tw_1787660977 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660977; x=1788265777; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=BzPmt7KVQkTpe1/d3/LXdqLWTe5gTJkqbQqLF5f/EEg=; b=uHWXnwGZKkG1LKH5O1o8YrlVPLdtqBd7TPx/mnoiMjlaIcWEUDShs1ZEQ0lgkQA9wK gA0MQlPlTK6jZhKGjlEAdTyvbuhMKIPyo1yWFNV9PNnmeJKMus36mC6LN1Q9jJ/XxiOF zRm7Xg7KmB3Fqj5nzLFxEAAUvNfF0WcMKyK+Rv+NIKy6MdQchpRGGd0sUg4vkMCHefP+ gLymhaOjmRINMzMa0/kWZu+hfYxfDdfAnXj5glbkTHWciK/8iGmjHZj91RaanHBZKXMK oDro9jjW1CFVKBaz4SehvSlpC88qJYf7dq99WJypByMMzLLHUiC6RhI0bK60AW2q1+VW LAww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660977; x=1788265777; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=BzPmt7KVQkTpe1/d3/LXdqLWTe5gTJkqbQqLF5f/EEg=; b=JCInmNuUVNj48FmJBHKvkR+I4MsI69FVmDc9T6r+YVyuKEcFRSMuHUkmXgtzXx9T8C 1N2doKreW3ifq29TSxy8mP6LfmTFxLR2OIhe/Sa2aNxz4PCjgNN0LWvxSAFQW+guEjdZ PtASMzdfyE9phEM57JZbdm5vBFDU9ZmF8ViMoD29GAGKde4YM3P1fE4qNOjvsBesgjti RuvsiiHrzdBxiCVveuTaVLb0aSL0wgWpsUSF+O5SImYnplygxfBdDF0SAOdIChobscfc /Vs2eb295Qk1q73CKuGbyd/JyhJ9l3SwTvgr9TNgzNn3dbiZmPE9FPC7ZUYHKxPDfwkD cjTw== X-Gm-Message-State: AFuF++mu2DZ5C5yxjH2TF/HtdAOmnZMSwXu8uDuuehOqrhk966GiiPjH CAK7w8OMkb9eHsf6YSGsfYyijVy6HJ4vGJT6+M8c0ZTMvLarOxVsQqkXat5QEtBCALfrUqE+qk4 rbRttB5A8T7UWl6Y80L4tT/DNFo+rvGOUzA7Ta34d8VzVBBO054pLGlKVx03diHeq1HIHIZH7TJ wX70c2AMufDZYdu7aJUaKu66MKKpCWapKi1pbLF14L X-Gm-Gg: AR+sD13HhY/gRThX+xLqp0ZrlBdceP3vVmHAkenwbQ2ClMfa3iL98o+fiF6VC/0XhVQ s3gDu8IOxk7s0LZTCxBotJbpMQlOOLzrNcRPqe9pcpTsjGaWucdvxTub0BiCimTJUx3BHTeIqjl XTXKHbAY0cU+vgRasj5bIBTpfrbofTV+FRwRP4/2DPqWYFHCYDjZ1aALcTDGjJ0TA6DSodO5itb 3YhUr+AuEey8kGPKmD56ryfpmtkxT01LKFVMoN1mN42kKGdvmFycgWJTSmHXtCsH2mEzUf/NE8R iWjTczBnJyPl4iUZGtbD07XD6GtP9nqv6Mx/DQ9vPpa6GCXK3MQ0b4yrnwEJpiumpsubqY0GPJM /XFizsiZzdrh3VSzb7Xj3vi8blZynAhG4uANB8vBHSYUS810hwqQTwmgTNCwIUVrQHQw2+tag5t B9JTk= X-Received: by 2002:a05:600c:3492:b0:499:5f80:83ac with SMTP id 5b1f17b1804b1-499d6338030mr68738235e9.7.1787660976744; Tue, 25 Aug 2026 05:29:36 -0700 (PDT) X-Received: by 2002:a05:600c:3492:b0:499:5f80:83ac with SMTP id 5b1f17b1804b1-499d6338030mr68737695e9.7.1787660976246; Tue, 25 Aug 2026 05:29:36 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 06/20] target/i386/tcg: treat VEX as disabling high-byte registers Date: Tue, 25 Aug 2026 14:29:07 +0200 Message-ID: <20260825122921.431739-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661111383158501 Content-Type: text/plain; charset="utf-8" This does not have any functional effect because the only instruction where it would make a difference is VPINSRB/VPINSRW, and they disable high-byte registers even for the non-AVX encoding. However, with APX it becomes a general property of the EVEX prefix and it makes sense to treat VEX the same way since it *does* include REX bits. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index bbd1c3b7893..d8de290acb6 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -208,7 +208,7 @@ typedef struct DisasContext { #endif =20 #ifdef TARGET_X86_64 -#define REX_PREFIX(S) (((S)->prefix & PREFIX_REX) !=3D 0) +#define REX_PREFIX(S) (((S)->prefix & (PREFIX_REX | PREFIX_VEX)) !=3D 0) #define REX_W(S) ((S)->vex_w) #define REX_R(S) ((S)->rex_r + 0) #define REX_X(S) ((S)->rex_x + 0) --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661022; cv=none; d=zohomail.com; s=zohoarc; b=Q7o3DGS8rRYP+bRpkd6EH/+Xwpd0xeTQzD2U/R9rwM67gCPS1HgT2t8YMxNu9wAzuKg6ONs8KoVpTzFe/s0XTOx4DQ46yAXFtn3GjZAezojUt5qPHQ6JJL4icRpZjn5j6V897gkzvCfREcTOkt1IHxqdGwuM63eDTQqeb/sx5g8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661022; h=Content-Transfer-Encoding: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:Cc; bh=bPtHh49RCadU+YCqGBKM+gF8JI4PmoRUuMTtDPgOW9M=; b=nO9RkW6fc4lFNhbyuyoW6yUZbJIy1xe/oTCMU/73Aa+aDeEnvK9Yv6RnSbhA0D95SnhIxUqVOF2Rzvq0fyriPn5XgPeOpYM1CZ+qqhHvUIAO4J9uwFJn4sNiDIN0q3hjUPPyuiMtxQJH6nj/IacZtEhr80ozmGwBq2D4/Tx0Vgc= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661022620605.4524980710949; Tue, 25 Aug 2026 05:30:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHm-0004iX-V7; Tue, 25 Aug 2026 08:29:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHj-0004iC-D3 for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:48 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHh-0000L6-2d for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:46 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-564-hM5Vce8VPjSjbWxos5KiYw-1; Tue, 25 Aug 2026 08:29:43 -0400 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-c2192b12cd6so438601766b.3 for ; Tue, 25 Aug 2026 05:29:41 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24968d5f59sm1729302966b.63.2026.08.25.05.29.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660984; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bPtHh49RCadU+YCqGBKM+gF8JI4PmoRUuMTtDPgOW9M=; b=NH7a0WgyYdy+mmvQmJWrviWeLJ7YozIMxr9Z+XOp4viOxIKXt3A/qZLK7P33mR+NRbwO/I hDIZnK6REcryuW2RHOSuucqRE45XwUN7ofUNAXTx/PVMlBazjHF7B24LNnYk7QFz0ATcYB easrCMqoavxBZOapikZfP2rRgMjqh0s= X-MC-Unique: hM5Vce8VPjSjbWxos5KiYw-1 X-Mimecast-MFC-AGG-ID: hM5Vce8VPjSjbWxos5KiYw_1787660981 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660981; x=1788265781; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=bPtHh49RCadU+YCqGBKM+gF8JI4PmoRUuMTtDPgOW9M=; b=W7YBxkaoUcdo13hMQEVCYuIHKBb9rBppIEQ4To8uK5zSWdXZ6Ks01TrdOo7sr6AcaD 2+fPjHf//2Afzpfd0JIgQGsTF03yHFjr94ETIZs7UK/B2Zwl4vdLH8LIt0kX8T5zFER2 5NNFiip6XXSIJZDMmVgA/N8JP/qWGZcTzhkwu1/4bNzxD6Jc8I6bLhC6/qwMEo67sfwR imVUMQYmfla+rkunSE8Mdcp08qcJ5L3tgHg1Z6mLXYMARWj+zsgPNopk9G6oQBdeYW5f zv3IFS2s2ZI0ZZ3KvQyomZ/r/nLaffivMPpOEuKAEcDRznd4JJw9pFpEGTAmo/kyTk68 o0xQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660981; x=1788265781; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=bPtHh49RCadU+YCqGBKM+gF8JI4PmoRUuMTtDPgOW9M=; b=caC9yszPXs6o37f0Psy79YcWLmPocudwQ9+Ivtdf6qc3bN27IUALGx4x0ywEYr0Ynq YpuqvitUJxzv2zEuzMoY2nORa+sM0FEfwA7nja6T9b0pdUBkTYudcrkVPhUfEDRXH2cu QD9LGJEihuQGIIDGYLJPOVqwNsnbW4DIsn79iKM9Zyl9ERV0X8jrNh9l3tJC34YUYYWu xOg+k3koO7sR/jEe+c/I+0UWSlhW17093vdtNysZyCbvn/KlHlSlg8IKJRcUcGna9G70 6Rjz2mK6ciRbEvoWCSx/ey3Psks/JC/7pc8eDdeWenhJu6W8n49ZDRCNKuWEOHPv1Htc Cj4A== X-Gm-Message-State: AFuF++nQsYQ1CDR1Cj9eW8Vkc3pvDnm1GnpwMkHv9/p57W/YJyGmrsfk ys4ZShpgWtX5xnmgnkt1omDMlVs4/W7Cwa+XT+TdOL33HGm84YujqnKn0qAmk332F5ZKEAS57sy gDsAb0C2iEyXNlwA2767X453+g36AhF0xvndzqhfqB7oSMtC77SIJM5YLgBxFnTGbdtJOiSiM5H Vy4NOLUVBEFIXDGakCUj8wfvoL7r+vICkfQZwWju1d X-Gm-Gg: AR+sD11PnhOTolMLcGDBGxwyvebG9/NCI41z2OSP60AF+qxs8At2UvVm1irDTZwFrJj H27ZSVQvTn7x1X+A+8Ns6+EvIBNC+SfSS1C5ovaxnv/LuaEUDqCNc1lEmbx9nz+NsBU8nSgoWZi 8PiCtvYbJpX+bgW4SD2oWkrhbO2cN01kpfQTcuLQlC3BHIP1+M5dDbPDuTCqQ+EDnNW6I4nh0L2 EOsQEOPiPSoGbYK+3zZMZS1Mk4QiFZLNfhh79NttkFayWPU6K3CmlabtXVit8a+4jG0BbXmH2Gr Gf4GM0YED4RL8xTsdkldPeBYjEWxR/PsQb5paB0Y1vnGJ4mWQfFueij20R+IBr0gqExM50+2gV2 TP7xqa7+HB0nCQ9ImCBhTS5w6W7G28qj3E8QaAlSfOSdTgPoMFaVGKWg4k7/6SKS6iK2UevfLQj iSBlQ= X-Received: by 2002:a17:906:4791:b0:c24:db68:ecfb with SMTP id a640c23a62f3a-c24db690609mr963378766b.11.1787660980789; Tue, 25 Aug 2026 05:29:40 -0700 (PDT) X-Received: by 2002:a17:906:4791:b0:c24:db68:ecfb with SMTP id a640c23a62f3a-c24db690609mr963368566b.11.1787660980104; Tue, 25 Aug 2026 05:29:40 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 07/20] target/i386/tcg: add definition for REX2 prefix Date: Tue, 25 Aug 2026 14:29:08 +0200 Message-ID: <20260825122921.431739-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661024765158501 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index d8de290acb6..2b94f4163d9 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -50,6 +50,7 @@ #define PREFIX_ADR 0x10 #define PREFIX_VEX 0x20 #define PREFIX_REX 0x40 +#define PREFIX_REX2 0x80 =20 #ifdef TARGET_X86_64 # define ctztl ctz64 @@ -208,7 +209,7 @@ typedef struct DisasContext { #endif =20 #ifdef TARGET_X86_64 -#define REX_PREFIX(S) (((S)->prefix & (PREFIX_REX | PREFIX_VEX)) !=3D 0) +#define REX_PREFIX(S) (((S)->prefix & (PREFIX_REX | PREFIX_REX2 | PREFIX_= VEX)) !=3D 0) #define REX_W(S) ((S)->vex_w) #define REX_R(S) ((S)->rex_r + 0) #define REX_X(S) ((S)->rex_x + 0) --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661075; cv=none; d=zohomail.com; s=zohoarc; b=VnPZX7uP0JV5lGYTewKlJn+YyvGWklXXTG43wd+pkDNpx/nsw/SKiU5dSwjX9jtuSKiR0tzdOeqKg7y4H23Ik+Wdve2dHWw6pDyicNPimUoO22XSErQ684vvf6sSKu5wBmeXPIDrXbWVXe3JurmWNw5j9zrskgM3tKca+RNCBOg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661075; h=Content-Transfer-Encoding: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:Cc; bh=KmvF/j/A1GG/fGBSSgcyXowpztKEbwaQjCcPtJOE5Wo=; b=KeiGIuIbLaHq7+I4BQS/Yw6SwXJPQBqjGUdOiSryQ/9ImuNRYCrHv4XCgHzvDiU08RSL7LTZBuhEZLLxCRpm0GgY7lfMjMAUYEfpvVTv0Q49rOL8o0VpKnuismAieUrrlLgQk47Pqz0mP+bdaUKlDIooIpDulGodqOgILb2xwfI= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661075268237.70458869684978; Tue, 25 Aug 2026 05:31:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHo-0004jM-8V; Tue, 25 Aug 2026 08:29:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHl-0004iN-98 for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHh-0000LM-UJ for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:48 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-571-tpyu7capPC-BticxU5uy_g-1; Tue, 25 Aug 2026 08:29:43 -0400 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c20e5890680so229706566b.1 for ; Tue, 25 Aug 2026 05:29:43 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c249606b59fsm1995590966b.12.2026.08.25.05.29.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660985; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KmvF/j/A1GG/fGBSSgcyXowpztKEbwaQjCcPtJOE5Wo=; b=NFMz6xKd6dMV3vhyr5S17cr0XGtJj3Mt1C3w/Y3suIa7ZobEqcLKXSMcEXLOOjwQKJjjqn 03VJY/57oqCHR1cxz3clzEBO0HvH9jEvA02drg6Dv6m29KkrhLcgdDfg1vF86YTiuLdO03 FZYPEOl2hmjZQ5ieNjxUUFKWD6ECnbE= X-MC-Unique: tpyu7capPC-BticxU5uy_g-1 X-Mimecast-MFC-AGG-ID: tpyu7capPC-BticxU5uy_g_1787660983 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660982; x=1788265782; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=KmvF/j/A1GG/fGBSSgcyXowpztKEbwaQjCcPtJOE5Wo=; b=t/ZxWO5tHFpw2cB1GSZIfN/bHG/4kem5DtfAOlmqDeZBXE4cfbkr+EZnheBDdxuqxR fZTusefQqynYpGqdS5CGdTk/yVzBNrJWGyxKA32mqBgG1NG37NtxRXE2wQ9b3+CVFu9B PBYw+5TOGmliywMiyuoSSRkFeI5hknkU0DfT9LCIWcQlsEWtAcDmBFQTLtDiEvZuhqgV 8GEKEF6AlGjR3Z03ka/UNrxVTWa+rRD6Up1P93AiBXci2t8g1LJAOOabR7y15ZxkADsP YqyVIgnT+Fg/Ulo+aR7dIpb7smHNo51EJahKVC/crpUjZ0q9UMo/6nvM4CvxnTZUVVXj g9mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660982; x=1788265782; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=KmvF/j/A1GG/fGBSSgcyXowpztKEbwaQjCcPtJOE5Wo=; b=X/Abn4VR9mQGZ79sdlX1UCKn2La/xPkuj12yUMfxJ8o5Gx8a5+pch4BmeV2Pexk3ki c068TJDBKRrxzX8NqTT2PvClZuzi6xr61S/pA7WpokztPxEVWyLGuRuG8RALnaouMqq2 zCWF5apwt10/uk1TUX6TejfsRr8G0nmaFh6vyB4ey8mqr/ArL7LuBux1Z9Rh2VEnMEk8 YLc+TYPCRT1giX3tXbaR+NBHOdBdPoajXAPNbQEHnmqJYovwEDVCiCITauQf5Ax6Dvkq HtsabD7QeRILMIyHqNSsKms2so071EM4EdjiNUZP4Z+uP+ZQmnakEjf8NgTynWhr8k2G mTjA== X-Gm-Message-State: AFuF++mUZAISJ/s70nouoJerJIHu9JK5gXCEYB5HVg0cMSh3tA+IDDui ag1qMU1FQWq/V0TlZfQrzTVBkcR4lpG+a5KyLfVZWlVaD9KwUVOsbjuSBfPvKwd/Dse3auUFZ3n Cf09vdweFbAVXoOdItVLgUkBkIhhqnnEzc8Q+HSbfw5A9cAAH2QRwzxStKFmTb/T5AeWSaYnV/W b8ikbPPHVBIMeJ11RkwbSZIccF1zZkzEru8LlnI/fZ X-Gm-Gg: AR+sD123Dlom0aPgpoDal6YV0GmsVerV2/r3MJx74MK44jZt98bZu/cbRRMghOIk+/a WByHbv8xpFt6v3h+QAjxP9BAwWerc9eba88e5y871ytxjCblJnYgYrL5LblPXdcg4dzxsbyoojv TUGQ2WyOEai48pXJJduGkAOVnylPWdqPuInhFJx6XHxooLDj3bziMkfX1+YJvN0WtYdZCRaAlM3 By9CBfOsnZtzVTVKpU7f9JBh2KVVrNBm7BkXeFbe38Chd+XDaNCi/v8HsbYgeXDjvJ3cKQZ1vUu BJFH0/ud/HKMUNYXnV+nb7zkM8c9+jt+G1r+xF5xBJFneZqrQAMpXREWxzLXByxhSxwBEI7alrC EGuz5KoCCifHfLlGNlb8OAPLMB5NAQDAiOZAw62p3uHdvLA94M8Tq+ZP5XSxKhOc62RvO3GQzEo bic/M= X-Received: by 2002:a17:907:c8c6:b0:c1f:1520:4de5 with SMTP id a640c23a62f3a-c249257c128mr2955001166b.1.1787660982596; Tue, 25 Aug 2026 05:29:42 -0700 (PDT) X-Received: by 2002:a17:907:c8c6:b0:c1f:1520:4de5 with SMTP id a640c23a62f3a-c249257c128mr2954991566b.1.1787660982106; Tue, 25 Aug 2026 05:29:42 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 08/20] target/i386/tcg: mark XSAVE* as not allowing REX2 Date: Tue, 25 Aug 2026 14:29:09 +0200 Message-ID: <20260825122921.431739-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661077199158501 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 3 +++ target/i386/tcg/decode-new.c.inc | 21 ++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 92822969003..c974ca9d7c5 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -181,6 +181,9 @@ typedef enum X86InsnCheck { /* Vendor-specific checks for Intel/AMD differences */ X86_CHECK_i64_amd =3D 2048, X86_CHECK_o64_intel =3D 4096, + + /* No REX2 prefix allowed */ + X86_CHECK_no_rex2 =3D 8192, } X86InsnCheck; =20 typedef enum X86InsnSpecial { diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 47bc30a22fc..a7e3ecec8a2 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -481,9 +481,9 @@ static void decode_group15(DisasContext *s, CPUX86State= *env, X86OpEntry *entry, [1] =3D X86_OP_ENTRYr(FXRSTOR, M,y, cpuid(FXSR) p_00), [2] =3D X86_OP_ENTRYr(LDMXCSR, E,d, vex5 chk(VEX128) p_00), [3] =3D X86_OP_ENTRYw(STMXCSR, E,d, vex5 chk(VEX128) p_00), - [4] =3D X86_OP_ENTRYw(XSAVE, M,y, cpuid(XSAVE) p_00), - [5] =3D X86_OP_ENTRYr(XRSTOR, M,y, cpuid(XSAVE) p_00), - [6] =3D X86_OP_ENTRYw(XSAVEOPT, M,b, cpuid(XSAVEOPT) p_00), + [4] =3D X86_OP_ENTRYw(XSAVE, M,y, cpuid(XSAVE) p_00 chk(no_re= x2)), + [5] =3D X86_OP_ENTRYr(XRSTOR, M,y, cpuid(XSAVE) p_00 chk(no_re= x2)), + [6] =3D X86_OP_ENTRYw(XSAVEOPT, M,b, cpuid(XSAVEOPT) p_00 chk(no= _rex2)), [7] =3D X86_OP_ENTRYw(NOP, M,b, cpuid(CLFLUSH) p_00), }; =20 @@ -2972,15 +2972,14 @@ static void disas_insn(DisasContext *s, CPUState *c= pu) goto illegal_op; } } - if (decode.e.check & X86_CHECK_prot_or_vm86) { - if (!PE(s)) { - goto illegal_op; - } + if ((decode.e.check & X86_CHECK_prot_or_vm86) && !PE(s)) { + goto illegal_op; } - if (decode.e.check & X86_CHECK_no_vm86) { - if (VM86(s)) { - goto illegal_op; - } + if ((decode.e.check & X86_CHECK_no_vm86) && VM86(s)) { + goto illegal_op; + } + if ((decode.e.check & X86_CHECK_no_rex2) && (s->prefix & PREFIX_RE= X2)) { + goto illegal_op; } if ((decode.e.check & X86_CHECK_VEX128) && s->vex_l) { goto illegal_op; --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661023; cv=none; d=zohomail.com; s=zohoarc; b=Z5S9IlNpTs/16br7etQO1XfLbqTUOzlluCapm1pGtesHiP9F+2DLXgsA5q9LaItpbG54hLnWa854KuP+AXtww3aOibKTghFPdQwVU3WpAJFLFcoaRSfmtN4S4Dytwfc4osvWS58TWMckKbDJzZMzk/0wVRCMSrG+4Uj2b4HVSCA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661023; h=Content-Transfer-Encoding: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:Cc; bh=9iMnCach2KZ49hnmyEOviYi8sDL27YHmctXR6GdAi7s=; b=FStNMUjEH0MLc6K7b2Y/lBxWsbl30dWsaHG//aSJg/06IczSdg6EDf+0B1Md1jI3C4ibyJvaK2UGklmJh9kyjVRALVrvwcHtxWIFxeQNsHguk35FupHerAZ6sa6yLM/juaBJCSGBM841U/Gdrlmp7TRHpdtYti/xXl4z1TDE7YU= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661023097647.3374356290917; Tue, 25 Aug 2026 05:30:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHq-0004je-V2; Tue, 25 Aug 2026 08:29:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHm-0004iY-VX for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHk-0000Ls-1V for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:50 -0400 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-626-cEo3uvZbPU2sECSP15lWwA-1; Tue, 25 Aug 2026 08:29:46 -0400 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-c1686e23b9cso400472166b.0 for ; Tue, 25 Aug 2026 05:29:45 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24968abf18sm1882336266b.61.2026.08.25.05.29.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660987; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9iMnCach2KZ49hnmyEOviYi8sDL27YHmctXR6GdAi7s=; b=EngBlvbs3vC6/XhbxE+VqsaAjc2v7ni1hzm5WAhasPv0bomPRfUBxsYTaks/HqVxX8dGv5 dC/JRU+OC1xKKoF6KBX1ijt+4D0UXqnXzVKqvsnfFR32t/pB7wEJG4x80bLBY01dqWKNoh QSslxmRT3ZcX8xPkavSkCu37CzdOAT8= X-MC-Unique: cEo3uvZbPU2sECSP15lWwA-1 X-Mimecast-MFC-AGG-ID: cEo3uvZbPU2sECSP15lWwA_1787660985 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660985; x=1788265785; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=9iMnCach2KZ49hnmyEOviYi8sDL27YHmctXR6GdAi7s=; b=PRl64GsF5omU4mqhybqY5WDrC5X8AtB9QqhgmavUC/quoy3ZZVCDc9OOD8iB3YHTAr ghE2KeB6KNWwDQ2eK5K9Ou9RfgQgTQwOJxfucFpGlKQ1MkbNXZD0xLSC8CZQInL7sGZW 8uG8CivHML/4FO8+5SBzEd1Zl4yirl7OH5+UnOvn1VJM7718nQkxGud9TNsLrYaIYo+k IdoCFVzetmJQy187NptxFD5ozGGa+1GUbEOeexeLLrTjp6P2crOiqFd1FqJ5H6JFCM5M aNB2ZBujjTzOJcNri0OUpHganNGqk7727ukivRHZwRc7H+frQREdClODOK3ZIhxST3Ee Q6XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660985; x=1788265785; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=9iMnCach2KZ49hnmyEOviYi8sDL27YHmctXR6GdAi7s=; b=SwmQbh6uxOdUSlCDP+weTcKWk1Od/rM9RSUFy4ymSvXP6eSIfl5bobEa7AWZLURy3F kxJrJ2UUQw4y92cxe4EUO+7yxY8VDiGVVq9O+luOEqHm+jgzzaeK9jpMwcBIbLSwax/B I5Z7tdFp95HqA8zleEGv9MFAqmr46hs8/Dw6pfswA3HOibE/1Cv7Se20KEUM7/VrDyCR nAlTPqvbEZIZDUymywDV6RkY38PqDVhMAmjzCNFH/qeisJZF6TFqqOooXpAT3dUJ/q8r 9guwAJOdiIs6GtlzB9K1XifI2DZUfU5EH5g40TCwdUG9LeP//0C+NzqlrTqm/Tf8jHIq 9QTw== X-Gm-Message-State: AFuF++kedj988TK3wuj652gq8oY9Htft9cE92MbPtuQ9aYmMQTPwF4AR hRw4LQlBpeUbCfwZmCltvtKNQjlK7vlxH4G+wVuFDTzl0H2Pc8GQDE8GjYouJAyOxu8l2D/tyMr tJaZiWgboOBjWn627YI9Pkj23Y06g7obnGL26xQvqJEMf3YEi6HyC5ZBiWQRru+6uqZVr9pyisr 86AOlV9Q2NYE/TG6BPrpcxgGvEXy96kNp/4wuKTJJT X-Gm-Gg: AR+sD13ztgpXHBm2aB20IzHP6zWDqACMzCyoq0hDi3dVE/aOXLV3PKGqs/6eMJXf5NE s4nXk2GpkCFq/YuHC0aZRDM6b9v0xPEktQo/Z4IZiB2D5xB36cpzWEd11vl6MiHjE+FSniWgP9A BCtOIom8Vo9UF30XbPugp8z29oa5Cis6lE1eUSrwYOfkgQc/gMAzjsyJ2L9hmbUTX0VVu//d0fQ Fy4SsLP27E/yfWCkJUnV45t+RFCk3R01vz3iBhTlSssxe7zBLqCRYplFzXqdJSHxlx2ykTaBJ2s 4KujV/41kxiz4QAErE55R922vlHaZ8k6fPKus02FXWbdZsu0tPSsc/CwEzt0V+Mo9AWwOUrDfHZ qAwGMGeRJ9Wj42YRpuJeQuS7Z36OpIDcvvThAAnJHc1vLrVCSWaVRwkWRF7wiah4wNY0/npF1Y6 jtIvI= X-Received: by 2002:a17:907:c20:b0:c1f:b883:ed3b with SMTP id a640c23a62f3a-c246a2cf2d0mr3858091566b.4.1787660984574; Tue, 25 Aug 2026 05:29:44 -0700 (PDT) X-Received: by 2002:a17:907:c20:b0:c1f:b883:ed3b with SMTP id a640c23a62f3a-c246a2cf2d0mr3858085366b.4.1787660983983; Tue, 25 Aug 2026 05:29:43 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 09/20] target/i386/tcg: decode REX2 prefix Date: Tue, 25 Aug 2026 14:29:10 +0200 Message-ID: <20260825122921.431739-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661024858158500 Content-Type: text/plain; charset="utf-8" The REX2 prefix has two main complications: it does not apply to vector registers, and it disables or mutates some opcodes (thus needing separate decoding functions instead of decode_root and decode_0F). Otherwise, all it does is extend s->rex_r, s->rex_w and s->rex_b to two bits. Since REX2 provides the ability to access r16...r31, extend cpu_regs[] to CPU_NB_EREGS elements. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 22 +++++- target/i386/tcg/decode-new.c.inc | 114 +++++++++++++++++++++++++++++-- 2 files changed, 126 insertions(+), 10 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 2b94f4163d9..ea70e9a5568 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -78,7 +78,7 @@ static TCGv cpu_cc_dst, cpu_cc_src, cpu_cc_src2; static TCGv cpu_eip; static TCGv_i32 cpu_cc_op; -static TCGv cpu_regs[CPU_NB_REGS]; +static TCGv cpu_regs[CPU_NB_EREGS]; static TCGv cpu_seg_base[6]; static TCGv_i64 cpu_bndl[4]; static TCGv_i64 cpu_bndu[4]; @@ -3336,7 +3336,7 @@ static void gen_multi0F(DisasContext *s, X86DecodedIn= sn *decode) =20 void tcg_x86_init(void) { - static const char reg_names[CPU_NB_REGS][4] =3D { + static const char reg_names[CPU_NB_EREGS][4] =3D { #ifdef TARGET_X86_64 [R_EAX] =3D "rax", [R_EBX] =3D "rbx", @@ -3354,6 +3354,22 @@ void tcg_x86_init(void) [13] =3D "r13", [14] =3D "r14", [15] =3D "r15", + [16] =3D "r16", + [17] =3D "r17", + [18] =3D "r18", + [19] =3D "r19", + [20] =3D "r20", + [21] =3D "r21", + [22] =3D "r22", + [23] =3D "r23", + [24] =3D "r24", + [25] =3D "r25", + [26] =3D "r26", + [27] =3D "r27", + [28] =3D "r28", + [29] =3D "r29", + [30] =3D "r30", + [31] =3D "r31", #else [R_EAX] =3D "eax", [R_EBX] =3D "ebx", @@ -3398,7 +3414,7 @@ void tcg_x86_init(void) "cc_src2"); cpu_eip =3D tcg_global_mem_new(tcg_env, offsetof(CPUX86State, eip), ei= p_name); =20 - for (i =3D 0; i < CPU_NB_REGS; ++i) { + for (i =3D 0; i < CPU_NB_EREGS; ++i) { cpu_regs[i] =3D tcg_global_mem_new(tcg_env, offsetof(CPUX86State, regs[i]), reg_names[i]); diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index a7e3ecec8a2..1f59fd665f7 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1989,6 +1989,65 @@ static const X86OpEntry opcodes_root[256] =3D { [0xFF] =3D X86_OP_GROUP1(group4_5, E,v), }; =20 +#ifdef TARGET_X86_64 +static const X86OpEntry opcodes_rex2_map0_A0toAF[16] =3D { +}; + +static void decode_REX2(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b, + const X86OpEntry **map) +{ + *b =3D x86_ldub_code(env, s); + const X86OpEntry *group =3D map[*b >> 4]; + *entry =3D group ? group[*b & 15] : UNKNOWN_OPCODE; +} + +static void decode_REX2_map0(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) +{ + static const X86OpEntry *opcode_rex2_map0[16] =3D { + &opcodes_root[0x00], + &opcodes_root[0x10], + &opcodes_root[0x20], + &opcodes_root[0x30], + NULL, + &opcodes_root[0x50], + &opcodes_root[0x60], + NULL, + &opcodes_root[0x80], + &opcodes_root[0x90], + opcodes_rex2_map0_A0toAF, + &opcodes_root[0xB0], + &opcodes_root[0xC0], + &opcodes_root[0xD0], + NULL, + &opcodes_root[0xF0], + }; + decode_REX2(s, env, entry, b, opcode_rex2_map0); +} + +static void decode_REX2_map1(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) +{ + static const X86OpEntry *opcode_rex2_map1[16] =3D { + &opcodes_0F[0x00], + &opcodes_0F[0x10], + &opcodes_0F[0x20], + NULL, + &opcodes_0F[0x40], + &opcodes_0F[0x50], + &opcodes_0F[0x60], + &opcodes_0F[0x70], + NULL, + &opcodes_0F[0x90], + &opcodes_0F[0xA0], + &opcodes_0F[0xB0], + &opcodes_0F[0xC0], + &opcodes_0F[0xD0], + &opcodes_0F[0xE0], + &opcodes_0F[0xF0], + }; + decode_REX2(s, env, entry, b, opcode_rex2_map1); +} +#endif + #undef mmx #undef vex1 #undef vex2 @@ -2008,6 +2067,20 @@ static void decode_root(DisasContext *s, CPUX86State= *env, X86OpEntry *entry, ui *entry =3D opcodes_root[*b]; } =20 +static int reg_nb_mask(DisasContext *s, int unit) +{ + switch (unit) { + case X86_OP_MMX: + return 7; + case X86_OP_SSE: + return 15; + break; + default: + return 31; + break; + } +} + /* Decode the MODRM and SIB bytes into a register or memory operand. */ static void decode_modrm(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode, X86DecodedOp *op) @@ -2019,10 +2092,7 @@ static void decode_modrm(DisasContext *s, CPUX86Stat= e *env, int sib =3D -1; =20 if (mod =3D=3D 3) { - op->n =3D rm; - if (op->unit !=3D X86_OP_MMX) { - op->n |=3D REX_B(s); - } + op->n =3D (rm | REX_B(s)) & reg_nb_mask(s, op->unit); return; } =20 @@ -2301,9 +2371,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, } get_reg: op->n =3D ((get_modrm(s, env) >> 3) & 7); - if (op->unit !=3D X86_OP_MMX) { - op->n |=3D REX_R(s); - } + op->n |=3D REX_R(s) & reg_nb_mask(s, op->unit); break; =20 case X86_TYPE_E: /* ALU modrm operand */ @@ -2750,6 +2818,24 @@ static void dump_unknown_opcode(CPUX86State *env, Di= sasContext *s) } } =20 +/* MASK must have two bits set. Bring the lowest just below the highest; + * for example if MASK =3D=3D 0x11, bit 1 of value is moved to bit 3. Cle= ar + * every other bit in VALUE. + * + * Generally mask will be a constant, so that all of the first three + * lines disappear. Likewise, if the bits in mask are already adjacent + * this becomes just "return value & mask". + */ +static inline uint8_t collapse_two_bits(uint8_t value, uint8_t mask) +{ + uint8_t high =3D mask & (mask - 1); + uint8_t low =3D mask & ~high; + uint8_t tweak =3D (high >> 1) - low; + + value &=3D mask; + return (value + tweak) & (mask + tweak); +} + /* * Convert one instruction. s->base.is_jmp is set if the translation must * be stopped. @@ -2842,6 +2928,20 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) goto next_byte_rex; } break; + case 0xd5: /* REX2 */ + if (CODE64(s) && (s->flags & HF_APX_EN_MASK)) { + int rex2 =3D x86_ldub_code(env, s); + if (rex !=3D -1) { + goto illegal_op; + } + s->prefix |=3D PREFIX_REX2; + s->rex_b =3D collapse_two_bits(rex2, 0x11); + s->rex_x =3D collapse_two_bits(rex2, 0x22) >> 1; + s->rex_r =3D collapse_two_bits(rex2, 0x44) >> 2; + s->vex_w =3D (rex2 >> 3) & 1; + decode_func =3D rex2 & 0x80 ? decode_REX2_map1 : decode_REX2_m= ap0; + } + break; #endif case 0xc5: /* 2-byte VEX */ case 0xc4: /* 3-byte VEX */ --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661099; cv=none; d=zohomail.com; s=zohoarc; b=IKPP8eU62LPhKJVhUXQe4OXmWyC9LhGgHpf21KWL9T06MEHp/yvqYFPVQP3m+LRQH7VnB9saRnRqZJ974XO3spx6FuTUcq5EiXPmYEue99TiqA2pYApJuUht/MvryWdeCgJqCAXG30BdRRjTHGLfj8JS0fkPgK0/XunHwUSZH88= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661099; h=Content-Transfer-Encoding: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:Cc; bh=XYNcIbotW5hwOefjX9E5TD5oRoLH0CWSyIOYzEQ2hQY=; b=loK527qD6P95qcU+pdIY+6bq7bOza/Ajw2yX8DM0jYhyjbR5zYf0a9J1dXSOr8Wj/X1IuMZqM+kKFfu29b+SyjpjN2B0K4quwPpqi3qaUAMSYtr4Wfpe329fL5Ax61oG/MFneOxutWJR19U8oM6KltEseWPECPORU22M29iAemM= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661099798901.6368308392097; Tue, 25 Aug 2026 05:31:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHr-0004jh-P2; Tue, 25 Aug 2026 08:29:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHo-0004jQ-Bx for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:52 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHm-0000Me-2l for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:52 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-630-_FS-NlgkNJqP3mlIqF6eow-1; Tue, 25 Aug 2026 08:29:48 -0400 Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-6a178080182so3215044a12.2 for ; Tue, 25 Aug 2026 05:29:47 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a59e1c3003sm13410696a12.23.2026.08.25.05.29.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660989; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XYNcIbotW5hwOefjX9E5TD5oRoLH0CWSyIOYzEQ2hQY=; b=SLRGLQ68Zekic/HAN69HNqkzIgrVBHHZ7g0EDzv+JKkEz1nnKt0OfUI6ft2IZNZkjsJIa/ yzH6mVGyZ2MfhAVHjYxFxk7rwfa5BYQQ/txqjQsOUNvSbdcLLPZGP4PGSJt0HJHzeSTbgD L0TAs5iTaTsp85sU9N1BWdxpZ5MT+BA= X-MC-Unique: _FS-NlgkNJqP3mlIqF6eow-1 X-Mimecast-MFC-AGG-ID: _FS-NlgkNJqP3mlIqF6eow_1787660987 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660987; x=1788265787; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=XYNcIbotW5hwOefjX9E5TD5oRoLH0CWSyIOYzEQ2hQY=; b=UgZS14AYBOC+Jf7m6brZgOB1b6MDLwVjd6C1oPT3sKYd5FBQayTGSuMbH+EgV/guOr kdKsX8C3XAKCd9Ohhe/yAYdTGnH5oXjf5YDzj4AceMFjMi9tMhqxc3G8JI10MtflLGok elBfgYxjpjz6LHrJwPF5WzaGHLt3+PUvRSqFbQqcn4Nt93XMgZ7sl5+mjvtIPq7wApYC OCINreV4nblPdsRrj0rHVhM4ZKTbPUbVdhIZnx5wXjxGLFJzlmAHhc3xugV5KACzSIa/ mvU664niqGoPo2okpfyLTSyhpFMGrA9yGNSUUdnETDi7otzXDTGUzJBc0FbaROVEaHFj h0cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660987; x=1788265787; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=XYNcIbotW5hwOefjX9E5TD5oRoLH0CWSyIOYzEQ2hQY=; b=onJwFz1zGov1io2TiZ/kjjw6FRDfvwPPCWLb6SlPIm0F+lWNbu0oahx421hKdvIaco Tet4R8k3vmdLq54E0r/wz0H7Zav02Fc0ytev2LXf1E9/0JpbFSRSlXpPTUkUPVG1bENR MbzoVoV4LqZ8Lx/vELU3WddYO+tDSHqhLfHwnKVTt1tC6PbIXXn4CizvSakAFFC0k/8q Xu2Y0ccU1RFofodeheKAfCVZAo7/vzpytyV4h4YFqO6upWyVS4PMhjOa+2c+vmEuRbaG M5NHBoLMhlWGQZRuyL4XzRs+g7qLThKrDvykUtcdRd0R6QtxJOYDYvvcc7TbiksI3xYz qLig== X-Gm-Message-State: AFuF++nveEl58BOCuIUIssUMD3j98NUURmdL7ylhFlgCcjic2RWIV6hw x6OuifFzVJGAV1tMa1PGIFAiIqV/rbebDAVMAeL2s/W8qEfgGlfLziTEOHzdv0yfnzTktlEx/xW JJ9C3f0NQqaoWeiZ8gv0VXPXFCo34tyr7C++gI/eJVYQH0okNWYlQciJmdZnhTUBgyiJpjoCsxJ PR9z0BuuoPo5GJ8/nqy9SxBM0cFHwRqbNJZtbbZ2W8 X-Gm-Gg: AR+sD13tkfP4KJGYCREcDNMf/3uZxoAXwn8ZYPZDkLMh1pOmh90dHlFfvISoy3Q5gbH CXzaRTXUnpAQ0Q6SSLap69gjeKIjQri6YI8RqwrMxDc1K2KekWQfO2vENXggq1Ii0MXdwguFYEf H0O7+M30xUkTLb861WtU6ePfiyN1MEPiCfpwWVXA2C90zMGWtdKG2M1bk1kOFF9CrubvScXIXQ0 Fj8mVydKntYay16WHgLSi2Y9fZvNIy2mYzxT84oomlfrqCmXCv74lqAADy3GBQIwZftOZVPnt9U ufz6ZXKMl6kcVJzjWhOLkULeuQ/rETBQ+3CnSOroFsoccyE36n8A5d1dzynPXxmp3V1MXTfxSGs QalxkEV5REUojfFL++KAKOeUxl/wZxGPFf2HjE4KPG0pGvaWtILoLgwypzk0o+ot4yfEubX6F7H LqN+A= X-Received: by 2002:a05:6402:52d0:b0:6a1:f895:1ba with SMTP id 4fb4d7f45d1cf-6a582b93d5cmr25805301a12.12.1787660986824; Tue, 25 Aug 2026 05:29:46 -0700 (PDT) X-Received: by 2002:a05:6402:52d0:b0:6a1:f895:1ba with SMTP id 4fb4d7f45d1cf-6a582b93d5cmr25805231a12.12.1787660986384; Tue, 25 Aug 2026 05:29:46 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 10/20] target/i386/tcg: implement JMPABS instruction Date: Tue, 25 Aug 2026 14:29:11 +0200 Message-ID: <20260825122921.431739-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661101303158500 Content-Type: text/plain; charset="utf-8" This is the same as an indirect jump, just with immediate operand. The requirement of W=3D0 and 0x67 are already available in the decoder. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 3 +++ target/i386/tcg/decode-new.c.inc | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index c974ca9d7c5..4998712e86d 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -184,6 +184,9 @@ typedef enum X86InsnCheck { =20 /* No REX2 prefix allowed */ X86_CHECK_no_rex2 =3D 8192, + + /* No 0x67 prefix allowed */ + X86_CHECK_no_adr =3D 16384, } X86InsnCheck; =20 typedef enum X86InsnSpecial { diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 1f59fd665f7..d215d28cec5 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1991,6 +1991,7 @@ static const X86OpEntry opcodes_root[256] =3D { =20 #ifdef TARGET_X86_64 static const X86OpEntry opcodes_rex2_map0_A0toAF[16] =3D { + [1] =3D X86_OP_ENTRY1(JMP_m, I,q, p_00 chk2(W0, no_adr)), }; =20 static void decode_REX2(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b, @@ -3081,6 +3082,9 @@ static void disas_insn(DisasContext *s, CPUState *cpu) if ((decode.e.check & X86_CHECK_no_rex2) && (s->prefix & PREFIX_RE= X2)) { goto illegal_op; } + if ((decode.e.check & X86_CHECK_no_adr) && (s->prefix & PREFIX_ADR= )) { + goto illegal_op; + } if ((decode.e.check & X86_CHECK_VEX128) && s->vex_l) { goto illegal_op; } --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661111; cv=none; d=zohomail.com; s=zohoarc; b=VaFI71vdVy0UvFYrCcH2gn29QjA9XZ5PsLWUGyQEskjwWhsZ21arSirShKAnjpxUYZkiAImKsVlmXwZeOkp68OJvd+T/hpyd8yow46SPmW+FEbsdN5ZEjDiArb/OCqD3DoOSaHpkcoh8g00Dm6MrNia2qpOagQc/lOkZe5iQknA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661111; h=Content-Transfer-Encoding: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:Cc; bh=I6wRjevlWr6mabZHk5tPd3ynvi80Zfpo7zSUjaoAC1U=; b=JWRgRLDbFleF9ji/bZx315CDPG0ucz/LjZDa6QFBbqKv2yppJGwfs7XZQongH7kNYs32dFDeiECVA+lw/zQiGm3wubvdmz8dYWvjy2sgAh0tWMPOOZDcoRtlCcN6iiKE4HBOhaLfjxkWjFEqLWy5ms4s85WKlortOFWuYDouQnE= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661111477169.75199680561752; Tue, 25 Aug 2026 05:31:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHv-0004kX-Tg; Tue, 25 Aug 2026 08:29:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHr-0004ji-3q for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:55 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHp-0000NZ-6l for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:54 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-118-Wxf67T3NPTGXQeub-y5qWg-1; Tue, 25 Aug 2026 08:29:50 -0400 Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-6a0a4a22bf0so5212863a12.0 for ; Tue, 25 Aug 2026 05:29:50 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a59dd550bcsm14256365a12.0.2026.08.25.05.29.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660992; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=I6wRjevlWr6mabZHk5tPd3ynvi80Zfpo7zSUjaoAC1U=; b=bq2CE1HUZeKnfYQQAECO8USvASprKonzVoXvkLmzIZVIbNQ9w6STVucccd3lxO99wdSCAi uhhV5q3MyZXj8X6K2MzldfYZUG2L+NdjlDKJMffTfDHsPLoj5kQ2YGDtC5EhFI/IzOhiYo 1RNGktHE7zBo1X6QswDGdSuKEDrHNCg= X-MC-Unique: Wxf67T3NPTGXQeub-y5qWg-1 X-Mimecast-MFC-AGG-ID: Wxf67T3NPTGXQeub-y5qWg_1787660989 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660989; x=1788265789; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=I6wRjevlWr6mabZHk5tPd3ynvi80Zfpo7zSUjaoAC1U=; b=l74YQ6tOnkrYHH9oQEulT428n20uqXa6rP2Fjzf/0++ROH+/Bv/iucqEavGEGjxZwr XBjUrJKWnMopft1J5ZDnO7SnFiD7is4N4RZqfHTg1MGZl8n0WMuBwZjNoN05jrQ2jJpW QCk9kSQEpravvhn/jQZka7NjqxtS8y/yvwKT9KRb9LWnDDMP6SCSgwZ3nfyhqUCBtasj oAy5uBqmahLEOVRkWcuEkN4sTZb+Se3mWSIYjyrPoIOnCP2bX5aweHTSt4tpwSeTXdlL 6ZOdpTtaR9YUIksiYZLVGSgNUeumuA37Ag7a5g/xdKIRUzmoaZLMej0uahFfPb+GuyIq bs7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660989; x=1788265789; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=I6wRjevlWr6mabZHk5tPd3ynvi80Zfpo7zSUjaoAC1U=; b=qRi2wUGbrf+ubeCP4T6rPw3HJBQ+/wW595AgTum2XyfQZ5gT0urVqgFXmG4YtfHO87 tiWxeemZdFcHbtTSY/No2upswVwpaUJT1UVSlNOblQYt9HLACUvCgNMFz9Md5d3jPDmK aF2Vn9akn3lVXReRTpsQ31sYgMC6nyRfeGy+DcbLZCyXB5PN7LqJZweBLiiTDqlIko75 qJUgIvEEX6PBtRDpPV0J9xT/89SkLyYATcqO+bu9laTpECyu0aXTV3FS/oBy0O62p0Mt W509yg+GCNQE805MqtVPjY2AsvG7OVOpwqbSpe8tcqFEjxq1VV1/C26N1/es1HuwhsvD 9kEw== X-Gm-Message-State: AFuF++lyqSR65yZd8InuMpNTODnj3vVKwdlV+DMWqFqPasHShqViWUQe 9InwYGMZKpw0zAnX+MpD0JY2asqPuwIsrOxR7+X69jVQkDYcJIqfCIqF2G6MOPrknlzMP6SRLPg ScjbRFJNhOTkknoqXhDqieujqd3xexmsWz0pvYqloLhDdB657++bmIy1mJzPBRlrGsHOUjCj4Jr WIB9Sd+SpkdcvB3lrhZ1lthyk0f/EZU8BIFrg8NClw X-Gm-Gg: AR+sD134aEYOZrNyrX9Xwc3U392tTAoQpIDDElo2j5PTN6QJhbAcHfEcBj4TUR/WuDq 5aHJC2kUaurImXRuyUYmpyvmNhUupOkqtya45Up0wsjKN4cGcyJnIlpHqHSXp5fNFueJKgkKJid GPIFxV+wEC8SvdGQ+M1AeSUyTVeKdl/mZl9d8qIc3uEFtH/v8/gIcDM62d23ErTVtGnpTwOZXui fhKgLpcBPAdetkT7SlS37d62pINXZk2QYNWUiUFV17414Q/pRfR5MMdzCrUxOVW4mVIkgZ6GB1+ NdadmPUtXw5mPK7JsOu3qVuVqMTKj/GyFXbwz8US8XPZvsfo6sHuxPT2To2kvA0D0SDN4YQ1wno mTQvE9hvQtE+Ug61w8Gz3YGn0QH9mrzbx+yBBhFmP6iWRoNinE5gxoxyjhqNqLD+TCuhQIUCx1r jCMe4= X-Received: by 2002:a05:6402:24c3:b0:6a3:eb92:8554 with SMTP id 4fb4d7f45d1cf-6a42f216d74mr32428514a12.10.1787660989210; Tue, 25 Aug 2026 05:29:49 -0700 (PDT) X-Received: by 2002:a05:6402:24c3:b0:6a3:eb92:8554 with SMTP id 4fb4d7f45d1cf-6a42f216d74mr32428434a12.10.1787660988429; Tue, 25 Aug 2026 05:29:48 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 11/20] target/i386/tcg: fetch modrm early Date: Tue, 25 Aug 2026 14:29:12 +0200 Message-ID: <20260825122921.431739-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661113377158500 Content-Type: text/plain; charset="utf-8" As a first step towards handling EVEX prefixes, fetch the modrm byte before decode_ops(). This way, EVEX validation can use the mod bits: for example, APX instructions require X4=3D0 if the r/m operand is a register. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 65 ++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index d215d28cec5..2033776ce1c 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2086,9 +2086,8 @@ static int reg_nb_mask(DisasContext *s, int unit) static void decode_modrm(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode, X86DecodedOp *op) { - int modrm =3D get_modrm(s, env); - int mod =3D (modrm >> 6) & 3; - int rm =3D modrm & 7; + int mod =3D (s->modrm >> 6) & 3; + int rm =3D s->modrm & 7; bool is_vsib =3D decode->e.vex_class =3D=3D 12; int sib =3D -1; =20 @@ -2297,11 +2296,33 @@ static bool decode_op_size(DisasContext *s, X86OpEn= try *e, X86OpSize size, MemOp } } =20 +static bool op_has_modrm(X86OpType type) +{ + switch (type) { + case X86_TYPE_C: /* REG in the modrm byte selects a control register = */ + case X86_TYPE_D: /* REG in the modrm byte selects a debug register */ + case X86_TYPE_E: /* ALU modrm operand */ + case X86_TYPE_EM: /* modrm byte selects an ALU memory operand */ + case X86_TYPE_G: /* REG in the modrm byte selects a GPR */ + case X86_TYPE_M: /* modrm byte selects a memory operand */ + case X86_TYPE_nop: /* modrm operand decoded but not fetched */ + case X86_TYPE_N: /* R/M in the modrm byte selects an MMX register */ + case X86_TYPE_P: /* REG in the modrm byte selects an MMX register */ + case X86_TYPE_Q: /* MMX modrm operand */ + case X86_TYPE_R: /* R/M in the modrm byte selects a register */ + case X86_TYPE_U: /* R/M in the modrm byte selects an XMM/YMM register= */ + case X86_TYPE_V: /* reg in the modrm byte selects an XMM/YMM register= */ + case X86_TYPE_WM: /* modrm byte selects an XMM/YMM memory operand */ + case X86_TYPE_W: /* XMM/YMM modrm operand */ + return true; + default: + return false; + } +} + static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode, X86DecodedOp *op, X86OpType type, int b) { - int modrm; - switch (type) { case X86_TYPE_None: /* Implicit or absent */ case X86_TYPE_A: /* Implicit */ @@ -2317,7 +2338,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, =20 case X86_TYPE_C: /* REG in the modrm byte selects a control register = */ op->unit =3D X86_OP_CR; - op->n =3D ((get_modrm(s, env) >> 3) & 7) | REX_R(s); + op->n =3D ((s->modrm >> 3) & 7) | REX_R(s); if (op->n =3D=3D 0 && (s->prefix & PREFIX_LOCK) && (s->cpuid_ext3_features & CPUID_EXT3_CR8LEG)) { op->n =3D 8; @@ -2333,7 +2354,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, =20 case X86_TYPE_D: /* REG in the modrm byte selects a debug register */ op->unit =3D X86_OP_DR; - op->n =3D ((get_modrm(s, env) >> 3) & 7) | REX_R(s); + op->n =3D ((s->modrm >> 3) & 7) | REX_R(s); if (op->n >=3D 8) { /* * illegal opcode. The DR4 and DR5 case is checked in the gen= erated @@ -2352,14 +2373,14 @@ static bool decode_op(DisasContext *s, CPUX86State = *env, X86DecodedInsn *decode, =20 case X86_TYPE_S: /* reg selects a segment register */ op->unit =3D X86_OP_SEG; - op->n =3D (get_modrm(s, env) >> 3) & 7; + op->n =3D (s->modrm >> 3) & 7; /* Values outside [CDEFGS]S, as well as storing to CS, are invalid= . */ if (op->n >=3D 6 || (op->n =3D=3D R_CS && op =3D=3D &decode->op[0]= )) { return false; } break; =20 - case X86_TYPE_P: + case X86_TYPE_P: /* REG in the modrm byte selects an MMX register */ op->unit =3D X86_OP_MMX; goto get_reg; =20 @@ -2371,7 +2392,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, op->unit =3D X86_OP_SSE; } get_reg: - op->n =3D ((get_modrm(s, env) >> 3) & 7); + op->n =3D ((s->modrm >> 3) & 7); op->n |=3D REX_R(s) & reg_nb_mask(s, op->unit); break; =20 @@ -2408,8 +2429,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, case X86_TYPE_R: /* R/M in the modrm byte selects a register */ op->unit =3D X86_OP_INT; get_modrm_reg: - modrm =3D get_modrm(s, env); - if ((modrm >> 6) !=3D 3) { + if ((s->modrm >> 6) !=3D 3) { return false; } goto get_modrm; @@ -2423,8 +2443,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, /* fall through */ case X86_TYPE_M: /* modrm byte selects a memory operand */ get_modrm_mem: - modrm =3D get_modrm(s, env); - if ((modrm >> 6) =3D=3D 3) { + if ((s->modrm >> 6) =3D=3D 3) { return false; } /* fall through */ @@ -2532,7 +2551,7 @@ static bool decode_insn(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_ return false; } =20 - /* First compute size of operands in order to initialize s->rip_offset= . */ + /* Compute size of operands here in order to initialize s->rip_offset.= */ if (e->op0 !=3D X86_TYPE_None) { if (!decode_op_size(s, e, e->s0, &decode->op[0].ot)) { return false; @@ -2565,6 +2584,13 @@ static bool decode_insn(DisasContext *s, CPUX86State= *env, X86DecodeFunc decode_ assert(e->op3 =3D=3D X86_TYPE_I && e->s3 =3D=3D X86_SIZE_b); s->rip_offset +=3D 1; } + return true; +} + +static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, + X86DecodedInsn *decode) +{ + X86OpEntry *e =3D &decode->e; =20 if (e->op0 !=3D X86_TYPE_None && !decode_op(s, env, decode, &decode->op[0], e->op0, decode->b)) { @@ -3096,6 +3122,15 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) } } =20 + if (op_has_modrm(decode.e.op0) || op_has_modrm(decode.e.op1) || + op_has_modrm(decode.e.op2)) { + get_modrm(s, env); + } + + if (!decode_ops(s, env, decode_func, &decode)) { + goto illegal_op; + } + switch (decode.e.special) { case X86_SPECIAL_None: break; --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661055; cv=none; d=zohomail.com; s=zohoarc; b=D9kks8nG123brBFM7i1FsW6et4t8PGRDTQGounsviCQGieZ6I/E/9OCHmVxKw6cG5j8u9Jbs6fzm821b35Z3wR6iR0FyOCpognBDohwgIBuXaR2jRBSfC7s+z3KgmzwPnwqfJeICX+18/ZFdO4D3/YdAWQx39Qumn6OoFsIcAa0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661055; h=Content-Transfer-Encoding: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:Cc; bh=V8m4ur/qwy5DWW9MB3GXE0pSnBIOrBsa+dBSKNVkWdM=; b=Q/FRMAxptQlkmD4kAK0OVwQwpFl6NY1YbZ0elQV8jprAv+KIpHaL5Y8GT4G3CewLnZMv+iYEvZAg6M4WhxwlG2oa5gUC2Yvu4hzwjTlM344xE1iXQb5RMTwbp+ebzBRUhCZR0Dlu6g43mvo+z2J55TU43f7KkpW1HGzi1hGW6V4= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661055137755.8705095172685; Tue, 25 Aug 2026 05:30:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqHw-0004kt-Bu; Tue, 25 Aug 2026 08:30:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHt-0004kO-VL for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:58 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHr-0000Ok-Q1 for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:57 -0400 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-152-_GWVYv_8N_W8TobPeSLCrg-1; Tue, 25 Aug 2026 08:29:52 -0400 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-c1f548718d0so502900366b.0 for ; Tue, 25 Aug 2026 05:29:52 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2496296a46sm1883910566b.21.2026.08.25.05.29.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V8m4ur/qwy5DWW9MB3GXE0pSnBIOrBsa+dBSKNVkWdM=; b=KSLtCsVtkeKRg8tc0mm5MStbEPAtmPXfT3GJvswL12rTkkeW6ETSrEZlO4WpmJqXpFLYuf GiwvRe9iLevxmG0qk2jDa64sWAI5ZWUhTaTgdFSlc68XoCMhqidB5l25BZDNUTRd4Ye0Dm slj9XC91QLUj9ag0+2D0h096O0X3L24= X-MC-Unique: _GWVYv_8N_W8TobPeSLCrg-1 X-Mimecast-MFC-AGG-ID: _GWVYv_8N_W8TobPeSLCrg_1787660991 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660991; x=1788265791; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=V8m4ur/qwy5DWW9MB3GXE0pSnBIOrBsa+dBSKNVkWdM=; b=LAFKiwHxykLD5ivDVDl2m10qQ76BDMxB7B2TF4akQ2NJ8nOvEWWY9pJWdJYzAuSTmJ qYxyT+98r8nbCWbsYTowxVj7pPkj55FKMI9MDf0H+jeePJ+LLhg6BD1vX+C6ws76qIwz T1qSZKLZcXsQI2bmqn4/Y+OIvPjDVgKZZgpkoLDzNgf6U2YlIDlYArME50whr8vdKk8Y 36y0jravwqWsz40oNmuImq/p3zOP1wB6aKC6TrGGYQmyJ4e5IQU4yrZMYU8klts2Fx/8 TNrMqseg5tT0TPFGR45rraEgRVa+XWh8+tAo1G2gMYhCIdME9I1Qobyme1hJN+HEuumM j78A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660991; x=1788265791; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=V8m4ur/qwy5DWW9MB3GXE0pSnBIOrBsa+dBSKNVkWdM=; b=tJ8LV86DZJfr90jkV0NUiCfbFtW8zF9rCO+NJZ4z8lD1hpamaUnMepK5UAUZFEYLS/ apAO2MixHo3KrViN/kMkYO3mpWpm/aQZctx0Tv5Opn8mpP1Svosszwx9GhV5B0KhQWra 47DKccVtHlxgpjYyupGqul7hr0AQw+jpaYcEC2O6Ubz2ZCM/JYB8mRmkScmtfsfKNq98 L8a/3BIYtOEwLq0PyOURsCV2+uqygzIxDtSDHp7aJJerBJpUjPth33KqQKMtStldyAQf MTw65C+ua/USl0RzwNSQb5ed8MuEXq3u7rZ/qOwvJe5PA64jqSxJNTIdM9ntzJ0SNUlQ sqBA== X-Gm-Message-State: AFuF++ma39CrAww0ywXPzvxLgwqfTve7F0eyxANSxYBIwAuj+aCF3Hje ywUvJ/T6nMbLlc0QwEb3hAw043edtk0tNEdsPIsee6EzXCrexapza262WrrxLqaJ5OSA6Pk47iG hVIGOiLREsPCl4pnU1mgVe7O0CNZmWQA/pKTSuxCeQfoVUN7IxtRiSSsrtA5dK3NHP0m+qdwMRM 6RuGYrKZwUP+IgzYjVLtymele+v4AUaRZel/VpOrk0 X-Gm-Gg: AR+sD11GMzTWBT9wBe3x5tYEuhXXY/3PY6M+4G/Hr8K6/OPkSjrQt/8e+U7HNZ81DkB 0jRGD1KSuw8FBZKXqOC4uFjmwNUTY6AyvbmZs40dX5gJQMm+/dR1heFfttIBSIH6XHylQg9Sr4Y ECJZgEitV4szpYoshLS1r3KV7sfCwGOMIkMpMCwkxAwBUibKzfcQQi1zNZF7SM+Qd7jaSQ7dLaO zVmJFJURxQq7xy3kqM199DZzsvLvpEu0LJCrucLwY0lcimVt19x35EL/4TYAwSEvavNmoowJ3R9 ntsNaBRbrYuLFlznxAvY2W4GL+24UkVTIVpMNyA4ESRcg4viIqWlSm/ugP4AwjJF/nNE5bxdER5 3IqQJ9nvO29J+a18ycIIrATN3RTN1ovO8UCh7DFlnT/FaMn7rjaYa2IBzZuPTThsqob+w1et+NS 9hOgg= X-Received: by 2002:a17:907:5c6:b0:c21:96e8:578d with SMTP id a640c23a62f3a-c24e5fd3199mr824948566b.15.1787660990876; Tue, 25 Aug 2026 05:29:50 -0700 (PDT) X-Received: by 2002:a17:907:5c6:b0:c21:96e8:578d with SMTP id a640c23a62f3a-c24e5fd3199mr824937466b.15.1787660990419; Tue, 25 Aug 2026 05:29:50 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 12/20] target/i386/tcg: move VEX validation early Date: Tue, 25 Aug 2026 14:29:13 +0200 Message-ID: <20260825122921.431739-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661056843158500 Content-Type: text/plain; charset="utf-8" Perform the X86_VEX_REPScalar transformation on X86OpEntry instead of X86DecodedOp; everything else can be checked equally well before immediates are fetched etc. This is especially important for APX, which may decode operands differently depending on the NDD bit: if EVEX.NDD=3D0, VEX.vvvv is ignored and must be zero. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 54 ++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 2033776ce1c..d49f467cc84 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2611,6 +2611,22 @@ static bool decode_ops(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_f decode->immediate =3D insn_get_signed(env, s, MO_8); } =20 + if (e->vex_class =3D=3D 12) { + /* Check no overlap between registers. */ + if (!decode->op[0].has_ea && + (decode->op[0].n =3D=3D decode->mem.index || decode->op[0].n = =3D=3D decode->op[1].n)) { + return false; + } + assert(!decode->op[1].has_ea); + if (decode->op[1].n =3D=3D decode->mem.index) { + return false; + } + if (!decode->op[2].has_ea && + (decode->op[2].n =3D=3D decode->mem.index || decode->op[2].n = =3D=3D decode->op[1].n)) { + return false; + } + } + return true; } =20 @@ -2717,9 +2733,9 @@ static bool validate_vex(DisasContext *s, X86DecodedI= nsn *decode) if (s->vex_l) { goto illegal; } - assert(decode->e.s2 =3D=3D X86_SIZE_x); - if (decode->op[2].has_ea) { - decode->op[2].ot =3D s->prefix & PREFIX_REPZ ? MO_32 : MO_= 64; + assert(e->op2 =3D=3D X86_TYPE_W && e->s2 =3D=3D X86_SIZE_x); + if ((s->modrm >> 6) !=3D 3) { + e->s2 =3D s->prefix & PREFIX_REPNZ ? X86_SIZE_sd : X86_SIZ= E_ss; } } break; @@ -2736,10 +2752,7 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) =20 switch (e->vex_class) { case 0: - if (s->prefix & PREFIX_VEX) { - goto illegal; - } - return true; + g_assert_not_reached(); case 1: case 2: case 3: @@ -2764,19 +2777,6 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) goto illegal; } =20 - /* Check no overlap between registers. */ - if (!decode->op[0].has_ea && - (decode->op[0].n =3D=3D decode->mem.index || decode->op[0].n = =3D=3D decode->op[1].n)) { - goto illegal; - } - assert(!decode->op[1].has_ea); - if (decode->op[1].n =3D=3D decode->mem.index) { - goto illegal; - } - if (!decode->op[2].has_ea && - (decode->op[2].n =3D=3D decode->mem.index || decode->op[2].n = =3D=3D decode->op[1].n)) { - goto illegal; - } /* fall through */ case 6: case 11: @@ -3127,6 +3127,16 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) get_modrm(s, env); } =20 + if (decode.e.vex_class =3D=3D 0) { + if (s->prefix & PREFIX_VEX) { + goto illegal_op; + } + } else { + if (!validate_vex(s, &decode)) { + return; + } + } + if (!decode_ops(s, env, decode_func, &decode)) { goto illegal_op; } @@ -3188,10 +3198,6 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) goto illegal_op; } =20 - if (!validate_vex(s, &decode)) { - return; - } - /* * Checks that result in #GP or VMEXIT come second. Intercepts are * generally checked after non-memory exceptions (i.e. after all --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661102; cv=none; d=zohomail.com; s=zohoarc; b=NBCotqd19eQhDJV+GtYGEJh1o9xCTPyG0ISzuF9+pzmMVukf4Qg1CnH0UUEXj8L9PBn9ONi/g8UIam6mITcFtR8GbJ0dKUySoX45qju5+o9fHM+xmBR6+1O3bxlONYarQPdmcTm/WF+n4nDsaY1OlgNwtzy7N7kXi+e7AXE/4zQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661102; h=Content-Transfer-Encoding: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:Cc; bh=eXafqi5leop9xl+L0588iutqTCj7yUSlxdRFeScICqs=; b=AnhXGhQXIVD8izkt2Cmgj5DWGkIDp/KPKuhckDUzlo19Q/eRc/aP3My7I6CQYLS7iJw5a38InM7VMZqGpYMXgooeoakh2P/HE1dpKfbR/D3KnFmUi46fPO1GVG1FnIJbVnzmz2qsHOfBwz7lKx0oeDd/Vj09LhMXhQaXoWmgX6s= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661102513364.3423669877768; Tue, 25 Aug 2026 05:31:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqI1-0004mJ-9r; Tue, 25 Aug 2026 08:30:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHw-0004kn-3R for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:00 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHu-0000PP-1F for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:29:59 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-308-1V3y8L8RMmSBX-C1Xjp6mw-1; Tue, 25 Aug 2026 08:29:55 -0400 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-c1670dd0f5dso157103666b.2 for ; Tue, 25 Aug 2026 05:29:54 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c249606a8fasm1932591066b.8.2026.08.25.05.29.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660996; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eXafqi5leop9xl+L0588iutqTCj7yUSlxdRFeScICqs=; b=E1+cVc6Svzw2SOoq770g4iNE3/3ubhUFbqw5Ck3BibslqpJqAnZSFRXE14/jsbJFK6G8/p 626B8osyXDpUlOxgjFNnLGzpfl9M8BhFO0YvKl8zkQ25ANUMGj3frfNK8AVgEdvKhtKu3H QJbLR3zm2CS/+5qBkPQbxyij9YnK0sM= X-MC-Unique: 1V3y8L8RMmSBX-C1Xjp6mw-1 X-Mimecast-MFC-AGG-ID: 1V3y8L8RMmSBX-C1Xjp6mw_1787660994 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660993; x=1788265793; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=eXafqi5leop9xl+L0588iutqTCj7yUSlxdRFeScICqs=; b=d0P54WlLMVYoTHIAUyqrlAjGLpZe9uHJU6y7zGqMwGtvCySRZgUGgV4Z7//9ZmTxDF mcBFDxKDViEBOIHk0WtF0DWXmDU6O2mgLffln+xvYgqRh5wax5Fkoy3cOAJ84YAOY21V 5bUJbCwGdRijvXgJPcnIPSV9G1X6AnARJK6YhcIB2WjwOJWitNzZ5HMIz6cnrERD3TqQ 7vskYY51waHyZ6TTSq29OyRfklZp4kCWoi5H+upauJcYOQBw6FfreJvnFcdAhM0esKQo G3hTzB2LJm63B9LGELHXx+XtqVfDQPUVVtnj3SEUF6fVhDRXC4jd/L0AdnRs0ApNrtkY XOsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660993; x=1788265793; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=eXafqi5leop9xl+L0588iutqTCj7yUSlxdRFeScICqs=; b=DTk/u1Eww8SHBRsb5m6T9iQl9kS1SCBriPNSwpFubfwDGEIvadRJyKi0SHAbhjUuTj ppFLrhF4d7uSxXBAqQf3+/EMAGNsJr6q+5y1QvZY3J4SRQx9qivYxFkDT5+4jgDPZFUy NHvFBnxz9K3fw/N7unbk/VFmAs1rHbkrVv/GCBd0D+ntCf4b1vPGFUq+tBhpo/k1NZcb NrMVQW/a9ZM5RM6Hl7ZLKvngUn2q4huN0CgTovKKFuqVHLJ4oVBVemBbIqB9wtjcC18z gWo9dPo4ro9VDVTTukSag/Zx+OInPV/CSGFIIN7ZrDJTdk7bkFqkFnDdLAdehDxcGvK6 it8w== X-Gm-Message-State: AFuF++lGp+wYro6ilRKxirPKaeoInZgM7kLS9uelRydju6PxvwjIw7zu WdghLpp2ZRguUqdx6Yg1wSXQRmUp5hVzCktJmVvxDxoAn2b0enWadjOxHYU1jCvWlE4H3CcCFtw HBVjITkphk0idnXkUTJd4S4db3cbBbV7FCkMKSYhEqwPi3ehrDWQB0uGic9QmiTwKcQUKzZv7xr EpHguEkphZFn6yDZGZk0hgP5qoQRjq8ULDLvKyUkXd X-Gm-Gg: AR+sD12tQRlM866dTkbrIk1w50RsVZ0xNkpJRD2rBBvHd55INAKwqS918NWpgb0ckUh abKkJeKsyqbvemj5PVCLZvJ9tmDfPSB/qvH6Nx2fxP4nv741OXEeN+1EttswbOHgYyTZyCztnSd tbc5gFANN+70xqV22LOY7sXObysnaY01aEL3F30sGJvPvB8V6wIZETWIoOo9wlEY/mWIycZyybg 0FCIyQyXFlrtqwxsNKqUtU8Sw2m4CD87eR3LDyGTA89Yjv55EgS8XwCscDxlmPNFfQggoJvLs/N H5Gfw8TVTqXvK65z9cJnxvURr6AvLQvX4Pz4l435Ng361dcKdglaXOW+6zzd0owfXNvOOQbOBU8 42/3l1RNAD870mlLH1v0KF87RfW0L6P140SoIlXJXNmTVdhq5sZkSHl0FQrc0mAK0pqqqctV6Uc j06as= X-Received: by 2002:a17:906:f5a8:b0:c16:4df6:176b with SMTP id a640c23a62f3a-c24920d3c7fmr2853023966b.20.1787660993590; Tue, 25 Aug 2026 05:29:53 -0700 (PDT) X-Received: by 2002:a17:906:f5a8:b0:c16:4df6:176b with SMTP id a640c23a62f3a-c24920d3c7fmr2853014966b.20.1787660993108; Tue, 25 Aug 2026 05:29:53 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 13/20] target/i386/tcg: extend VEX.vvvv parsing for APX Date: Tue, 25 Aug 2026 14:29:14 +0200 Message-ID: <20260825122921.431739-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661103260158500 Content-Type: text/plain; charset="utf-8" BMI uses operand type B when VEX.vvvv provides one of the register indices of three-operand instructions. However, APX needs to use it even for two-operand instructions, similar to how SSE and AVX share destination but use the modrm operand when there is no VEX prefix. To do this , operand type B can mostly reuse the code for operand type H but there are two extra possibilities: - instructions with VEX/EVEX prefix but no new data destination. To handle this, use a new field s->vex_ndd to retrieve whether the B (or H) operand comes from VEX.vvvv or from modrm. For now, this uses the same existing logic from validate_vex(), but later it will be extended to read EVEX.NDD. - instructions with operands "m,r" that NDD extends to "r,m,r". In this case, in the non-NDD format "m,r" the B operand corresponds to a memory location; when this happens, it is incorrect to parse again op1 as a memory location, because that would read the displacement again from the instruction stream. Instead, transform op1 into X86_TYPE_2op if VEX.vvvv is the destination operand. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 1 + target/i386/tcg/decode-new.c.inc | 38 +++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index ea70e9a5568..7e50cf2355f 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -105,6 +105,7 @@ typedef struct DisasContext { #endif uint8_t vex_l; /* vex vector length */ uint8_t vex_v; /* vex vvvv register, without 1's complement. */ + bool vex_ndd; /* is this a 3-operand instruction? */ uint8_t popl_esp_hack; /* for correct popl with esp base handling */ uint8_t rip_offset; /* only used in x86_64, but left for simplicity */ =20 diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index d49f467cc84..08f1fdddf16 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2331,10 +2331,9 @@ static bool decode_op(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decode, case X86_TYPE_Y: /* string destination */ break; =20 - case X86_TYPE_B: /* VEX.vvvv selects a GPR */ + case X86_TYPE_B: /* VEX.vvvv selects a GPR, else use modrm */ op->unit =3D X86_OP_INT; - op->n =3D s->vex_v; - break; + goto get_vex_v; =20 case X86_TYPE_C: /* REG in the modrm byte selects a control register = */ op->unit =3D X86_OP_CR; @@ -2464,18 +2463,25 @@ static bool decode_op(DisasContext *s, CPUX86State = *env, X86DecodedInsn *decode, }; break; =20 - case X86_TYPE_H: /* For AVX, VEX.vvvv selects an XMM/YMM register */ - if ((s->prefix & PREFIX_VEX)) { - op->unit =3D X86_OP_SSE; + case X86_TYPE_H: /* VEX.vvvv selects an XMM/YMM register, else use mo= drm */ + op->unit =3D X86_OP_SSE; + get_vex_v: + if (s->vex_ndd) { + assert(s->prefix & PREFIX_VEX); op->n =3D s->vex_v; break; } + /* Two-operand form: the other one of op0 and op1 is a modrm opera= nd, use it. */ + assert(decode->e.s1 =3D=3D decode->e.s0); if (op =3D=3D &decode->op[0]) { - /* shifts place the destination in VEX.vvvv, use modrm */ - return decode_op(s, env, decode, op, decode->e.op1, b); + if (!decode_op(s, env, decode, op, decode->e.op1, b)) { + return false; + } + decode->e.op1 =3D X86_TYPE_2op; } else { - return decode_op(s, env, decode, op, decode->e.op0, b); + *op =3D decode->op[0]; } + break; =20 case X86_TYPE_I: /* Immediate */ case X86_TYPE_J: /* Relative offset for a jump */ @@ -2718,6 +2724,14 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) { X86OpEntry *e =3D &decode->e; =20 + if (s->prefix & PREFIX_VEX) { + if (e->op0 =3D=3D X86_TYPE_H || e->op0 =3D=3D X86_TYPE_B || + e->op1 =3D=3D X86_TYPE_H || e->op1 =3D=3D X86_TYPE_B || + e->op2 =3D=3D X86_TYPE_H || e->op2 =3D=3D X86_TYPE_B) { + s->vex_ndd =3D true; + } + } + switch (e->vex_special) { case X86_VEX_None: break; @@ -2805,10 +2819,7 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) return true; } =20 - if (s->vex_v !=3D 0 && - e->op0 !=3D X86_TYPE_H && e->op0 !=3D X86_TYPE_B && - e->op1 !=3D X86_TYPE_H && e->op1 !=3D X86_TYPE_B && - e->op2 !=3D X86_TYPE_H && e->op2 !=3D X86_TYPE_B) { + if (s->vex_v !=3D 0 && !s->vex_ndd) { goto illegal; } =20 @@ -2887,6 +2898,7 @@ static void disas_insn(DisasContext *s, CPUState *cpu) s->vex_l =3D 0; s->vex_v =3D 0; s->vex_w =3D false; + s->vex_ndd =3D false; s->has_modrm =3D false; s->prefix =3D 0; =20 --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661071; cv=none; d=zohomail.com; s=zohoarc; b=aZM92Rvcy+9jYfR8Ipgnws/SaMza0IieIbkDAzwrJQk15Q7Ztr/xndC0hLhSEDmT4arteehwQ/l4QDtQPQGfT8wFa6278Yd4r897wqFJIOnYbj0UaHu1C9FjBhJgVe6EDgutxrrQAq4MDUu3jEDDWPvVsKRHAJpxdBxYFBPre20= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661071; h=Content-Transfer-Encoding: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:Cc; bh=vVFRI1J3A+WiSvoLF13U1p5+7NI4QDvzMzms0Z8Ogmg=; b=U4GDWrB3B0cfr2xnCVRaTKLz1+G1b/RtBzXkq/1zsvlt0PA4hLV1AaWaD4YVZgdoU35LGDNEaMOVfovhQBjgU9kK4bRsYmTs1ULSz93YSZF05asZXVGc3qWUd5Fstzt75xTD9oCO//o3YA3KiXNAR3aMvmPiSUd1/02FEVG3wqU= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17876610714811014.6975172490378; Tue, 25 Aug 2026 05:31:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqI2-0004mt-Nc; Tue, 25 Aug 2026 08:30:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHy-0004lo-TF for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:04 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHw-0000Qj-2t for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:01 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-498-srLdHUYPOe26GEtS7PzoXQ-1; Tue, 25 Aug 2026 08:29:58 -0400 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-c20262b5e10so557633766b.1 for ; Tue, 25 Aug 2026 05:29:56 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c249685c573sm2240958166b.51.2026.08.25.05.29.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787660999; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vVFRI1J3A+WiSvoLF13U1p5+7NI4QDvzMzms0Z8Ogmg=; b=UyhULefKEWBUVp1lY9ejKE3MUNhjE6R22Ruo+0Nf74CwNpXMi3/CoDrrFfARfDVrfnDl29 kJtVjeKqDfys4L3dFRCgzXMipMF0ZN10yjYUBXShvbFe+WU8cJ0Qk3jo8vf+w3Q6lPxRUR e4/pZXq5Jx+5yhw52MDS4r76FDsUOjY= X-MC-Unique: srLdHUYPOe26GEtS7PzoXQ-1 X-Mimecast-MFC-AGG-ID: srLdHUYPOe26GEtS7PzoXQ_1787660996 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660996; x=1788265796; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=vVFRI1J3A+WiSvoLF13U1p5+7NI4QDvzMzms0Z8Ogmg=; b=jTwiz//KTGWDCp5Dabg9mff4M0bPROmcviWo+jdHQ1CdqEeGWCAZNXf9Wy4/gxjaVW uifsR1tyGQ+0pA5clHdxBzn5k0q3lDnzDHqKjJsNCHNMwkzqMiNd+uiz2yaBL/CLDa0/ w5ygomKodvUAlW45mRQnLk624wDEQ8VDExf1QCafMYWcUWi5iv1Ohmkgz5ZKJHCnOJ1A EpfHPFxLoaJ4KZqFQgV66a7p3oIUlrez4286k+cjOhihzCSNnOBmHPgObCv82lHVKKt8 q+Eqwb1RfBTGsuqOuytw7TJY1X3CHb/cV/1EwC1DDwSxeqxXUrUp3u2DVliUk/Lr+C8k lAow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660996; x=1788265796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=vVFRI1J3A+WiSvoLF13U1p5+7NI4QDvzMzms0Z8Ogmg=; b=GT4bxRH70d9WetWKRj3W+LqeEyaVhtcQdD8jjn+4+37fcvHtZ/uO13HqCSFjhOWCPH 0bRgFtM0Czn0wjWhDBsvok4NGZtP7H86KDS5bnJ/XpOEFaJxHHaw7U6EaWfJS3otaVip 6xhHok09IKLR9dwP5jQyqYKYoJDnE8E2bOj6CtfBtsFl9Y1k07qVk2KFwJP4/U7/TzIv PvPIjK4xsuGY7Zxrf3QTz4QTo+IP1pk0EN3fQol+peGwNd2o+wYAEGNsuOHd1ngwYqS+ 1p+feG6IApmrOBmoxpfpo9KqQgKFtorVPeD6cwSutWt26gl7gobAslRel76gLVQer2pn xdyw== X-Gm-Message-State: AFuF++l+ds1a2IjrICIHvTsippPY+moOuLqw7Ozw1x5ZBRmBG/74e48o I3nHZfbZyTSc9yB4S+S56gAL361954Y6ooGbMD8C+MvgWNEJ0/8RbJ55CXE7kIoDdvlHY1v/IpI Vffuw4x3cwNxRtDjtPVvusCH3E1Kzo5CxG4T3Rish6mvsL+Enm6pR/CjDksQcv/byLrh/pp9Rfr +4nYElf6R6A933jQJbb/XU6kxUQPE7VkP+HDw194Vp X-Gm-Gg: AR+sD12YuFUoCdlQPVsxzzI79F4cv8G4ylHHfbf7Ly7ZGAG2+bJPFHr7dO3wMvh2OUa Gn39LzelD4In+QOWH8++n4kkPNc43dpxrxiyPI0rf/LfpenYbwWBaKrUbUggRoyyGrLN/ZLC1o0 A/X8AZgebghepmUgsk41tRpdL6u7RNpyEwIdWpuFK2p6RxicyfW6mdgxIKZqGHkFw23L+hwpaZL CBdFDxFxMarwwpys9e60H5qS9AM4U5CfKWnZ0TVz89yt9wpvzo6OPS+D34usQtUGwZn5QN+J8yH 59m+cVxNdfFzgfRopNnRW3HDgNGguB/95t5mTjXAGtz64TjiIRoMJ8EwhQNn4f7r6I0INoYyKBy z7f9hIQvGwQfV77njFI5uotKa5unKuJu6h3ifLJa1cpqk/2+dNFCnCyYcXvR4uiYpploqDsadW3 N7NQ== X-Received: by 2002:a17:906:f246:b0:c21:61a6:8821 with SMTP id a640c23a62f3a-c246a6cd384mr3155055666b.23.1787660995625; Tue, 25 Aug 2026 05:29:55 -0700 (PDT) X-Received: by 2002:a17:906:f246:b0:c21:61a6:8821 with SMTP id a640c23a62f3a-c246a6cd384mr3155045666b.23.1787660994903; Tue, 25 Aug 2026 05:29:54 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 14/20] target/i386/tcg: decode EVEX prefix Date: Tue, 25 Aug 2026 14:29:15 +0200 Message-ID: <20260825122921.431739-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661073033158500 Content-Type: text/plain; charset="utf-8" EVEX is really messy and the exact position of the fields is spread all over the place. For now store the three data bytes of the prefix in DisasContext, later the EVEX instruction classes for APX will be added to extract_evex_params and validate_vex. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 8 ++- target/i386/tcg/decode-new.c.inc | 86 +++++++++++++++++++++++++++++--- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 7e50cf2355f..1d6714f3c6c 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -51,6 +51,7 @@ #define PREFIX_VEX 0x20 #define PREFIX_REX 0x40 #define PREFIX_REX2 0x80 +#define PREFIX_EVEX 0x100 =20 #ifdef TARGET_X86_64 # define ctztl ctz64 @@ -93,8 +94,8 @@ typedef struct DisasContext { MemOp aflag; MemOp dflag; =20 + uint16_t prefix; int8_t override; /* -1 if no override, else R_CS, R_DS, etc */ - uint8_t prefix; =20 bool has_modrm; uint8_t modrm; @@ -114,6 +115,9 @@ typedef struct DisasContext { uint8_t rex_x; uint8_t rex_b; #endif + uint8_t evex2; + uint8_t evex3; + uint8_t evex4; bool vex_w; /* used by AVX even on 32-bit processors */ bool jmp_opt; /* use direct block chaining for direct jumps */ bool cc_op_dirty; @@ -210,7 +214,7 @@ typedef struct DisasContext { #endif =20 #ifdef TARGET_X86_64 -#define REX_PREFIX(S) (((S)->prefix & (PREFIX_REX | PREFIX_REX2 | PREFIX_= VEX)) !=3D 0) +#define REX_PREFIX(S) (((S)->prefix & (PREFIX_REX | PREFIX_REX2 | PREFIX_= VEX | PREFIX_EVEX)) !=3D 0) #define REX_W(S) ((S)->vex_w) #define REX_R(S) ((S)->rex_r + 0) #define REX_X(S) ((S)->rex_x + 0) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 08f1fdddf16..37245570751 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2047,6 +2047,11 @@ static void decode_REX2_map1(DisasContext *s, CPUX86= State *env, X86OpEntry *entr }; decode_REX2(s, env, entry, b, opcode_rex2_map1); } + +static void decode_EVEX_map4(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) +{ + *entry =3D UNKNOWN_OPCODE; +} #endif =20 #undef mmx @@ -2074,8 +2079,7 @@ static int reg_nb_mask(DisasContext *s, int unit) case X86_OP_MMX: return 7; case X86_OP_SSE: - return 15; - break; + return s->prefix & PREFIX_EVEX ? 31 : 15; default: return 31; break; @@ -2467,7 +2471,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, op->unit =3D X86_OP_SSE; get_vex_v: if (s->vex_ndd) { - assert(s->prefix & PREFIX_VEX); + assert(s->prefix & (PREFIX_VEX | PREFIX_EVEX)); op->n =3D s->vex_v; break; } @@ -2593,6 +2597,15 @@ static bool decode_insn(DisasContext *s, CPUX86State= *env, X86DecodeFunc decode_ return true; } =20 +static bool extract_evex_params(DisasContext *s, X86DecodedInsn *decode) +{ + /* + * Here, the position of RXB and (for AVX512) displacement multiplier + * should be known. + */ + g_assert_not_reached(); +} + static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, X86DecodedInsn *decode) { @@ -2724,13 +2737,16 @@ static bool validate_vex(DisasContext *s, X86Decode= dInsn *decode) { X86OpEntry *e =3D &decode->e; =20 - if (s->prefix & PREFIX_VEX) { + if (s->prefix & (PREFIX_VEX | PREFIX_EVEX)) { if (e->op0 =3D=3D X86_TYPE_H || e->op0 =3D=3D X86_TYPE_B || e->op1 =3D=3D X86_TYPE_H || e->op1 =3D=3D X86_TYPE_B || e->op2 =3D=3D X86_TYPE_H || e->op2 =3D=3D X86_TYPE_B) { s->vex_ndd =3D true; } } + if ((s->prefix & PREFIX_EVEX) && !extract_evex_params(s, decode)) { + goto illegal; + } =20 switch (e->vex_special) { case X86_VEX_None: @@ -2874,6 +2890,10 @@ static inline uint8_t collapse_two_bits(uint8_t valu= e, uint8_t mask) return (value + tweak) & (mask + tweak); } =20 +static const int pp_prefix[4] =3D { + 0, PREFIX_DATA, PREFIX_REPZ, PREFIX_REPNZ +}; + /* * Convert one instruction. s->base.is_jmp is set if the translation must * be stopped. @@ -2899,6 +2919,9 @@ static void disas_insn(DisasContext *s, CPUState *cpu) s->vex_v =3D 0; s->vex_w =3D false; s->vex_ndd =3D false; + s->evex2 =3D 0; + s->evex3 =3D 0; + s->evex4 =3D 0; s->has_modrm =3D false; s->prefix =3D 0; =20 @@ -2982,6 +3005,56 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) } break; #endif + case 0x62: /* EVEX */ + if (CODE32(s) && !VM86(s)) { + int evex2 =3D x86_ldub_code(env, s); + + if (!CODE64(s) && (evex2 & 0xc0) !=3D 0xc0) { + s->pc--; /* rewind the advance_pc() x86_ldub_code() did */ + break; + } + if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ + | PREFIX_LOCK | PREFIX_DATA)) { + goto illegal_op; + } + /* + * Store them because the exact correspondence between EVEX + * and RXB bits is only known later. It's different for APX, + * AVX512 register operands, and AVX512 VSIB index operands. + */ + s->evex2 =3D evex2; + s->evex3 =3D x86_ldub_code(env, s); + s->evex4 =3D x86_ldub_code(env, s); + s->vex_w =3D (s->evex3 >> 7) & 1; + s->vex_l =3D (s->evex4 >> 5) & 3; + s->prefix |=3D pp_prefix[s->evex3 & 3] | PREFIX_EVEX; + switch (evex2 & 7) { + case 0x01: + /* + * Note: actually uses VEX map1, to which AVX512 adds extra + * instructions encoded with VEX.L=3D1. Of these, KMOV* + * has an APX extension too. + */ + decode_func =3D decode_0F; + break; + case 0x02: + decode_func =3D decode_0F38; + break; + case 0x03: + decode_func =3D decode_0F3A; + break; + case 0x04: +#ifdef TARGET_X86_64 + decode_func =3D decode_EVEX_map4; + break; +#else + goto illegal_op; +#endif + default: /* Reserved for future use. */ + goto unknown_op; + } + } + break; case 0xc5: /* 2-byte VEX */ case 0xc4: /* 3-byte VEX */ /* @@ -2989,9 +3062,6 @@ static void disas_insn(DisasContext *s, CPUState *cpu) * Otherwise the instruction is LES or LDS. Not allowed in real m= ode. */ if (PE(s) && !VM86(s)) { - static const int pp_prefix[4] =3D { - 0, PREFIX_DATA, PREFIX_REPZ, PREFIX_REPNZ - }; int vex3, vex2 =3D x86_ldub_code(env, s); =20 if (!CODE64(s) && (vex2 & 0xc0) !=3D 0xc0) { @@ -3140,7 +3210,7 @@ static void disas_insn(DisasContext *s, CPUState *cpu) } =20 if (decode.e.vex_class =3D=3D 0) { - if (s->prefix & PREFIX_VEX) { + if (s->prefix & (PREFIX_VEX | PREFIX_EVEX)) { goto illegal_op; } } else { --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661095; cv=none; d=zohomail.com; s=zohoarc; b=Ao/VJQmmRAEOyy1Oqos40zuJxfz5e7g5CkAkp1dIiFrAyCLG91x/DAK5k6/cbIDSp8w/dQCCl5OsFGY09Slev74eQH4xAGoj9gNOX/BHpKoiY26iiBVVraC4D6A33Trf/Fbr0GZNEUCwDc/r4FYaJEXdzSGNdD2ryBB2FajX2U4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661095; h=Content-Transfer-Encoding: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:Cc; bh=Ne7T8Aqgahxe/jZvtSSKRCWy+jh7XQ1vqlcwBgfQ2l8=; b=fF8SFrQEgIQ1fSEUhSKubIIC/7TT0vSWkFrgfNtlY3hz73MRRzRX3j7AEeRRCO+WhZylmd0NcDwkCC3VX5vfOxNzceNIp/z8mNRYCEAzZNaHOH5e2Mn4vNqCG05wcbLPpU+yevKJoCSpF+895Kd2A2KWH253q8/SSOWDttc90EU= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661095207625.014013940218; Tue, 25 Aug 2026 05:31:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqI2-0004mc-Ck; Tue, 25 Aug 2026 08:30:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI0-0004lr-Az for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:04 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqHy-0000Re-Ij for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:04 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-206-0avaKfOdPv-Rn8jfv4ro3Q-1; Tue, 25 Aug 2026 08:29:59 -0400 Received: by mail-ej1-f70.google.com with SMTP id a640c23a62f3a-c1f548718d0so502909166b.0 for ; Tue, 25 Aug 2026 05:29:59 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24dfd91dd4sm467146166b.16.2026.08.25.05.29.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787661001; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ne7T8Aqgahxe/jZvtSSKRCWy+jh7XQ1vqlcwBgfQ2l8=; b=ffX1twfMAMX8zU1uepO14ZRDQhK6zZdfq8HnFKOeOVtaP/yxubOr2Uf/yvZtgv8QJTZdDY L2Y3n87NAskeN+f9ICOzeXWIUTmMXg7pSuUNc/Y1jZGyUGyvCR9EEArY5E10Z3JI/+eQaY m4E9mB4SAn5lKKSR4KV/AuibEdpmG54= X-MC-Unique: 0avaKfOdPv-Rn8jfv4ro3Q-1 X-Mimecast-MFC-AGG-ID: 0avaKfOdPv-Rn8jfv4ro3Q_1787660998 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787660998; x=1788265798; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=Ne7T8Aqgahxe/jZvtSSKRCWy+jh7XQ1vqlcwBgfQ2l8=; b=bmUqBDrfmcss/2e3SDgAQPNxeltSQ7OoC6bjjKrpJq10Iyj5JKEimh1hVOn/xpk2bD B4pEMRalycumv97uNafju9x7Mc5kF2ksjDjgx46Kc+D82vLBH0/D3C9cTiBlphwnC+Dr ERUcT1L7ovynV0oORJZYxQT95/H9dximR/S4aDhpGjWGN0Djx7M2ZHpgwChH7rK2sJgb QkPayaj+yHJEW14IZHBfyj0+SqAbVNzvwj3AgVRZtM3vzmQkedePyRBvq4xBZVQj0DQ2 /BMjpOMM8+wCP7Avor3V4PawTugUK1lC4xhwmWSfpq2gMPVCTovGRKb9Kyj0hRLSsUz2 rhSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787660998; x=1788265798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=Ne7T8Aqgahxe/jZvtSSKRCWy+jh7XQ1vqlcwBgfQ2l8=; b=pzfncTOAU1L4J2ZUv0mk04EIFLTlJFyzzFoxc5sZFk652cI1zlN7c/A6VNy+t4bMcu xG0MoR6pfklrW9hqP+lH9wdFlLFri0KpQB1xfozFVDlpJJMwvVLsmKCQ+ZaojQ6FfD6n Dx8fAJmqfp695okEtCe6CLlQ/iBa5wPUKCPcPe/cbpMqDoJ6ETk6hZGPelBNlSjC2T5Z uMF3GbdL5UO/O8vA4uCFnLxHFF4FkdSl/fmZAbWLKsWvVHE8LJSfbWvMSsjPL+M3USIT GQ39kDfSryPZ/hEGyJNUVidWRWIg00kKMCHRfWbZ8rTEnhlATh5BUmlm/0V1Z30DT4cz prRQ== X-Gm-Message-State: AFuF++l0m70dXAqcr2b2/6UxoQRUII9BNAUgRFdn0leHeFK7P2s/4v9J ULruDe9xrzNP/KbL9LqXh3VUSdnPXbANweIRvNlt6iaZrkVCnDqvX8951EZ38KtcwIALWMCGa7r D8BcNYwAM2Z7uPq3HhCKNmTTQQK0jIaArVhL7JXQOsnvSP1P+h8CDmXM3jekJEZNMjCx/8qWnUU o0FFyPK83N0hfHqclqEnyL5I0+Cjj15CE8PNPlStV/ X-Gm-Gg: AR+sD10uikK5NYrg3C5rxV8cTX7fdug4/pufG+IZ0bFCb7bSht3RmpYR8XZzTrfoAvG fXKAwScs00XzAm4tufVPPrhNYRANS9/z9Nkpp7I2h218mUijIw+3F8jMA3Lo4gUHwHhs/UItLjO wNSrVk5GPmrlrwGyjSQNfep4PPD3lOcnco1VK8gE1rCp0jAYoCi930YHONQff8mHpEUPbsRYaA+ +/cCWtPQVNCwpkECcnJrMWf78lvBirZ9XHPrE/DBYeyM/lb3JJQsx+tYCZ5b7rntlyprWjHOpYA cFcIYcqHu8gWCj8WXAypuA+ohEtMYEckHJNjtUeXT8Q1fjbLHszezwKjsVTOhXOgwEcNNjYgu1A qXgQhNqZBw+9QJJx3fSt6jsQoabtEYX0bwOxf3NWm4AgJ8T2O7BmPpzGsD5cIHttpHT87LEwvkC X7GA== X-Received: by 2002:a17:907:6090:b0:c12:695b:8876 with SMTP id a640c23a62f3a-c24e5c8b8ccmr651396766b.5.1787660998158; Tue, 25 Aug 2026 05:29:58 -0700 (PDT) X-Received: by 2002:a17:907:6090:b0:c12:695b:8876 with SMTP id a640c23a62f3a-c24e5c8b8ccmr651384166b.5.1787660997566; Tue, 25 Aug 2026 05:29:57 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 15/20] target/i386/tcg: add ZU writeback Date: Tue, 25 Aug 2026 14:29:16 +0200 Message-ID: <20260825122921.431739-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661097476158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 3 +++ target/i386/tcg/decode-new.c.inc | 4 ++++ target/i386/tcg/emit.c.inc | 2 ++ 3 files changed, 9 insertions(+) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 4998712e86d..8650b5ae7a0 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -212,6 +212,9 @@ typedef enum X86InsnSpecial { */ X86_SPECIAL_Op0_Rd, =20 + /* ZU-modified APX instruction. */ + X86_SPECIAL_Op0_ZU, + /* * Ry/Mb in the manual (PINSRB). However, the high bits are never use= d by * the instruction in either the register or memory cases; the *real* = effect diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 37245570751..76266b829cb 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -3237,6 +3237,10 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) accept_lock =3D decode.op[0].has_ea; break; =20 + case X86_SPECIAL_Op0_ZU: + assert(decode.op[0].unit =3D=3D X86_OP_INT); + break; + case X86_SPECIAL_Op0_Rd: assert(decode.op[0].unit =3D=3D X86_OP_INT); if (!decode.op[0].has_ea) { diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index c83ab809408..8c8adcf3255 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -347,6 +347,8 @@ static void gen_writeback(DisasContext *s, X86DecodedIn= sn *decode, int opn, TCGv case X86_OP_INT: if (op->has_ea) { gen_op_st_v(s, op->ot, v, s->A0); + } else if (decode->e.special =3D=3D X86_SPECIAL_Op0_ZU) { + tcg_gen_ext_tl(cpu_regs[op->n], v, op->ot); } else { gen_op_mov_reg_v(s, op->ot, op->n, v); } --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661025; cv=none; d=zohomail.com; s=zohoarc; b=GfNMLDp9uumdwkHprMsKmNwJa4gbWg/02HVSPAgCSvxW/IDm+H6e6ecbYYCtvkkiNUWz0OEM3q/s9L4BzXIHsIoM32Adf//w59N8zibkpBeucE61RvXqFhLnrhWBNtdZ6SB4A2uQhUIc1IWfRKKALavGkJ2rRCjU0eFL/qq9bVA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661025; h=Content-Transfer-Encoding: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:Cc; bh=5+a5NByR0gcOWXf7SZHpnI5L14NFq3+9KEiaUFOcp3I=; b=JfK9f2/77mYlbA6jsaLY7+IiGY+ivZXXVFOBsL5tobqrFIuiwifXdg959W2N0njL32dD4ySQ8ZF7ZRDbQa3ADB2+qfuDiDqN62eNMu+Rv5CBe/i7YYQS06NwL9RjPwOBDIgUYrv0GdZ+AO95nL/ujGsRO5tgACpJdW9u8T8xtng= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178766102506028.46073777307629; Tue, 25 Aug 2026 05:30:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqI7-0004nT-Bo; Tue, 25 Aug 2026 08:30:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI5-0004nI-1D for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:09 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI1-0000g2-Pq for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:08 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-400-vsg5hEh0P7uBwJ4hoP4FSw-1; Tue, 25 Aug 2026 08:30:02 -0400 Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-69e70c286ecso4770511a12.0 for ; Tue, 25 Aug 2026 05:30:02 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a5d9824be1sm671820a12.7.2026.08.25.05.29.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787661005; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5+a5NByR0gcOWXf7SZHpnI5L14NFq3+9KEiaUFOcp3I=; b=bMPOi3seC16TYVX4R/hAVu+NJUiydY5lh21Z6rb1ivcMJkJBnbxQ/NrULCL8KLsigBgA/8 /TpuMEd68APUYcGhvHgdQsebQOLzUJbD2Sw81WqZEdfrTvoPhkNU6b9jS+9HLa7u4q3jf/ ghgZ6CNb62MWxe0NQLdq5lSFymRDutw= X-MC-Unique: vsg5hEh0P7uBwJ4hoP4FSw-1 X-Mimecast-MFC-AGG-ID: vsg5hEh0P7uBwJ4hoP4FSw_1787661001 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787661001; x=1788265801; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=5+a5NByR0gcOWXf7SZHpnI5L14NFq3+9KEiaUFOcp3I=; b=oWa6R8UUIid3CJpu3KvqqTwTrpcSq4lMXLvy0Gyvc8LzNlu/pMpRzErA54I4ml4cyo koFJJnqJ1KOjkI9kctL0+WZzjphFEwn6hXtX7NNQ+UoWlsrECggcf3KpRQ4SEwJ4fKX5 +/fTASOOe9Wh4Bn0gTL8zZyz/sSR8M6HKr2PdXcQnBMBG5Xov8Xbhyj38LdVkLTXXTRd oJxAuBj5X+beYFhNSTQ4pj1cbaeGRiQVaDMy1kh0HRLlvcQPj6z323vS3s5iRu8T9Ylh jzHlRgAkzfUIOq6GOMHAsQT9TKw+X/be9udSY31FOluiaUFafI8jEqFB6ZOOIPruzpdl xQ0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787661001; x=1788265801; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=5+a5NByR0gcOWXf7SZHpnI5L14NFq3+9KEiaUFOcp3I=; b=fo2gSXneSiMmaULvg3tDwuAeWmjjRUXZ4c0U8c1yugGoWVYGjPtJWmgUM2n9GiKoYI fb/8lrX6FVC81vlDbwJfuMVMcumGt79hJ0YS6zyxFQ3xEvrH5ujfd1k0k9teDWhL7/FR V8skUYwGFaAeh3qk2tM4B0ZNRyA7H1KXfqU79Sa5O8BvMC+nx/DJ/04GBel8SgKcFB00 RDAZxQy8ZmFZzDyaFFrRzy5AevTg5FQPur+ZLKMGU3D2+JVlPPe//VLKQedSAiB+yqzn 7VpMnQLoEoIk9ahxtU5Fyytl7XqBLEBtZYmWXT9zKaWwxNvNTwijwLGQpdTuQqr+DnC7 jJcw== X-Gm-Message-State: AFuF++lQEcY6gr1sH3jaVCKp2EM23PmNeEwQxS1+zvu3P4g0riadj55D 1u3hogcco5evjLEMINtEYkvWrEAuj2lZVjv44lT7P1bCLxX7/dzrXIl09IFFBuZgyTOVoPwNzyQ qmpgcL6tGnZIW9ehvRWZaAbitcSO0hGtnIhQdf1UNNEuT0J4YRgIMYmoZJjg13PH7FimpsPIyWC 1raSs+w7HX6qqH3p6XgBEbtWtHNSPheyA/6tRwh1np X-Gm-Gg: AR+sD11aQ8h8QpkSsSb4A7L/J76+wLrvvjuyXHB8ESt6z3Jy3bGBDVKuuMbq6GGCx+E Dr7zO2l1UeeDI7n3fUQWKh3nlpHHkKFuN7wpCBvJybb7CoirEUM5H9HSw3enqPV2l3wpyqH4Znd aQT/TSpaA0lQrHusfx5JK3KMn+k/yIjznNNMh6ksPHOBgiL912QR4QMyT2gPXSj1WRzARKI59/5 3afrGrkI/Q5ffJ5zcoSNqMpqXYqInugdRLC2pF1P4KMbkhSBMvYfem2zdNnOD4AvnkoF72IxbjU pO1t0IdELRzNEtG1d6IwORdM4UaPfUk3ssVrP8gNcYHLZmMc6WJdZn/q2/WRiTg3ntsgA4ejMDl 2hq8cDk1gMoZZ6opaxDeOoAe0Nvv0MDfe7HSSfibv3Fod17gLNEMZzdfmKvofJGj2nbvTm5L/zZ KAuKo= X-Received: by 2002:a05:6402:3714:b0:6a1:28d8:2306 with SMTP id 4fb4d7f45d1cf-6a5c40d8c55mr8095233a12.1.1787661001189; Tue, 25 Aug 2026 05:30:01 -0700 (PDT) X-Received: by 2002:a05:6402:3714:b0:6a1:28d8:2306 with SMTP id 4fb4d7f45d1cf-6a5c40d8c55mr8095112a12.1.1787661000581; Tue, 25 Aug 2026 05:30:00 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 16/20] target/i386/tcg: add decode functionality for APX Date: Tue, 25 Aug 2026 14:29:17 +0200 Message-ID: <20260825122921.431739-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661026763158500 Content-Type: text/plain; charset="utf-8" Handle the EVEX formats for APX (including the extension of BMI and CMPccXA= DD instructions that already supported VEX) and add their validation to validate_vex(). Exit disas_insn() early if the NF field is set. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 10 ++ target/i386/tcg/translate.c | 11 +- target/i386/tcg/decode-new.c.inc | 168 ++++++++++++++++++++++++++++++- 3 files changed, 181 insertions(+), 8 deletions(-) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 8650b5ae7a0..1c7ed73c437 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -187,6 +187,9 @@ typedef enum X86InsnCheck { =20 /* No 0x67 prefix allowed */ X86_CHECK_no_adr =3D 16384, + + /* EVEX.NF bit not allowed */ + X86_CHECK_nf0 =3D 32768, } X86InsnCheck; =20 typedef enum X86InsnSpecial { @@ -274,6 +277,13 @@ typedef enum X86VEXSpecial { X86_VEX_AVX2_256, } X86VEXSpecial; =20 +typedef enum X86EVEXClass { + /* Non-vector instruction that can use APX EGPRs. */ + X86_EVEX_APX =3D 128, + X86_EVEX_APX_cmp =3D 129, + X86_EVEX_APX_pp2 =3D 130, + X86_EVEX_APX_zu =3D 131, +} X86EVEXClass; =20 typedef struct X86OpEntry X86OpEntry; typedef struct X86DecodedInsn X86DecodedInsn; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 1d6714f3c6c..770a05f7d8d 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -107,18 +107,17 @@ typedef struct DisasContext { uint8_t vex_l; /* vex vector length */ uint8_t vex_v; /* vex vvvv register, without 1's complement. */ bool vex_ndd; /* is this a 3-operand instruction? */ + bool vex_w; /* used by AVX even on 32-bit processors */ uint8_t popl_esp_hack; /* for correct popl with esp base handling */ uint8_t rip_offset; /* only used in x86_64, but left for simplicity */ =20 -#ifdef TARGET_X86_64 - uint8_t rex_r; + uint8_t rex_r; /* 0 for i386, but left for simplicity */ uint8_t rex_x; uint8_t rex_b; -#endif + uint8_t evex2; uint8_t evex3; uint8_t evex4; - bool vex_w; /* used by AVX even on 32-bit processors */ bool jmp_opt; /* use direct block chaining for direct jumps */ bool cc_op_dirty; =20 @@ -219,12 +218,16 @@ typedef struct DisasContext { #define REX_R(S) ((S)->rex_r + 0) #define REX_X(S) ((S)->rex_x + 0) #define REX_B(S) ((S)->rex_b + 0) +#define EVEX_APX_ND(S) (((S)->evex4 & 0x10) !=3D 0) +#define EVEX_APX_NF(S) (((S)->evex4 & 0x04) !=3D 0) #else #define REX_PREFIX(S) false #define REX_W(S) false #define REX_R(S) 0 #define REX_X(S) 0 #define REX_B(S) 0 +#define EVEX_APX_ND(S) 0 +#define EVEX_APX_NF(S) 0 #endif =20 /* diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 76266b829cb..ebbfa4f6592 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -253,6 +253,10 @@ #define vex11 .vex_class =3D 11, #define vex12 .vex_class =3D 12, #define vex13 .vex_class =3D 13, +#define evex_apx .vex_class =3D X86_EVEX_APX, +#define evex_apx_cmp .vex_class =3D X86_EVEX_APX_cmp, +#define evex_apx_pp2 .vex_class =3D X86_EVEX_APX_pp2, +#define evex_apx_zu .vex_class =3D X86_EVEX_APX_zu, =20 #define chk(a) .check =3D X86_CHECK_##a, #define chk2(a, b) .check =3D X86_CHECK_##a | X86_CHECK_##b, @@ -2529,9 +2533,23 @@ static bool validate_sse_prefix(DisasContext *s, X86= OpEntry *e) { uint16_t sse_prefixes; =20 - if (!e->valid_prefix) { - return true; + switch (e->vex_class) { + case X86_EVEX_APX: + case X86_EVEX_APX_cmp: + case X86_EVEX_APX_pp2: + case X86_EVEX_APX_zu: + /* For APX-extended instructions, only EVEX versions check the pre= fix. */ + if (!(s->prefix & PREFIX_EVEX)) { + return true; + } + + /* fallthrough */ + default: + if (!e->valid_prefix) { + return true; + } } + if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) { /* In SSE instructions, 0xF3 and 0xF2 cancel 0x66. */ s->prefix &=3D ~PREFIX_DATA; @@ -2603,7 +2621,35 @@ static bool extract_evex_params(DisasContext *s, X86= DecodedInsn *decode) * Here, the position of RXB and (for AVX512) displacement multiplier * should be known. */ - g_assert_not_reached(); + X86OpEntry *e =3D &decode->e; + uint8_t rex_r, rex_x, rex_b; + + switch (e->vex_class) { + case 13: + case X86_EVEX_APX: + case X86_EVEX_APX_cmp: + case X86_EVEX_APX_pp2: + case X86_EVEX_APX_zu: + /* Only reached through EVEX map 4. */ + rex_r =3D (~s->evex2 & 0x10) | ((~s->evex2 >> 4) & 8); + rex_x =3D ((~s->evex3 << 2) & 0x10) | ((~s->evex2 >> 3) & 8); + rex_b =3D ((s->evex2 << 1) & 0x10) | ((~s->evex2 >> 2) & 8); + s->vex_v =3D ((~s->evex4 << 1) & 0x10) | ((~s->evex3 >> 3) & 15); + break; + default: + return false; + } + +#ifdef TARGET_X86_64 + s->rex_r =3D rex_r; + s->rex_x =3D rex_x; + s->rex_b =3D rex_b; +#else + (void)rex_r; + (void)rex_x; + (void)rex_b; +#endif + return true; } =20 static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, @@ -2733,6 +2779,87 @@ static bool has_cpuid_feature(DisasContext *s, X86CP= UIDFeature cpuid) g_assert_not_reached(); } =20 +static bool validate_evex_apx(DisasContext *s, X86DecodedInsn *decode) +{ + X86OpEntry *e =3D &decode->e; + uint8_t evex4_mask =3D 0; + + assert(s->has_modrm); + switch (e->vex_class) { + case 13: + /* + * APX-EVEX-BMI and APX-EVEX-CMPCCXADD do not define EVEX.ND. + * They only differ for checks on NF, which happen elsewhere. + */ + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + evex4_mask =3D 0x0C; + break; + + case X86_EVEX_APX: + /* APX-EVEX-INT. Checks on NF happen elsewhere. */ + assert(e->s0 =3D=3D e->s1); + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + if (!EVEX_APX_ND(s)) { + s->vex_ndd =3D false; + } else if (!s->vex_ndd) { + goto illegal; + } + evex4_mask =3D 0x1C; + break; + + case X86_EVEX_APX_zu: + /* APX-EVEX-INT, with ZU bit defined. Checks on NF happen elsewhe= re. */ + assert(decode->e.special =3D=3D 0 && !s->vex_ndd); + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + if (s->vex_v !=3D 0) { + goto illegal; + } + if (EVEX_APX_ND(s)) { + decode->e.special =3D X86_SPECIAL_Op0_ZU; + } + evex4_mask =3D 0x1C; + break; + + case X86_EVEX_APX_pp2: + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK) || + !EVEX_APX_ND(s) || + (e->op0 !=3D X86_TYPE_None && s->vex_v =3D=3D ((decode->b & 7)= | REX_B(s))) || + ((decode->b & 7) | REX_B(s)) =3D=3D 4 || + s->vex_v =3D=3D 4) { + goto illegal; + } + evex4_mask =3D 0x18; + break; + + case X86_EVEX_APX_cmp: + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + evex4_mask =3D 0x0F; + break; + } + + if (s->evex4 & ~evex4_mask) { + goto illegal; + } + + /* r/m =3D=3D 11b requires X4=3D0 (that is, EVEX.U is 1) */ + if ((s->modrm >> 6) =3D=3D 3 && (s->rex_x & 16)) { + goto illegal; + } + return true; + +illegal: + gen_illegal_opcode(s); + return false; +} + static bool validate_vex(DisasContext *s, X86DecodedInsn *decode) { X86OpEntry *e =3D &decode->e; @@ -2825,14 +2952,32 @@ static bool validate_vex(DisasContext *s, X86Decode= dInsn *decode) } break; case 13: - if (!(s->prefix & PREFIX_VEX)) { + if (!(s->prefix & (PREFIX_VEX | PREFIX_EVEX))) { goto illegal; } if (s->vex_l) { goto illegal; } + if (s->prefix & PREFIX_EVEX) { + if (!validate_evex_apx(s, decode)) { + return false; + } + } /* All integer instructions use VEX.vvvv, so exit. */ return true; + case X86_EVEX_APX: + case X86_EVEX_APX_cmp: + case X86_EVEX_APX_pp2: + case X86_EVEX_APX_zu: + /* Only reached through EVEX map 4. */ + assert(!(s->prefix & PREFIX_VEX)); + if (s->vex_l) { + goto illegal; + } + if ((s->prefix & PREFIX_EVEX) && !validate_evex_apx(s, decode)) { + return false; + } + return true; } =20 if (s->vex_v !=3D 0 && !s->vex_ndd) { @@ -3202,6 +3347,9 @@ static void disas_insn(DisasContext *s, CPUState *cpu) if ((decode.e.check & X86_CHECK_W1) && !s->vex_w) { goto illegal_op; } + if ((decode.e.check & X86_CHECK_nf0) && EVEX_APX_NF(s)) { + goto illegal_op; + } } =20 if (op_has_modrm(decode.e.op0) || op_has_modrm(decode.e.op1) || @@ -3347,6 +3495,18 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) * cause incorrect tracking of CC_OP for instructions that write to bo= th memory * and flags. */ + switch (decode.e.vex_class) { + case 13: + case X86_EVEX_APX: + case X86_EVEX_APX_zu: + if (EVEX_APX_NF(s)) { + return; + } + break; + default: + break; + } + if (decode.cc_op !=3D -1) { if (decode.cc_dst) { tcg_gen_mov_tl(cpu_cc_dst, decode.cc_dst); --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661119; cv=none; d=zohomail.com; s=zohoarc; b=GN6E5DT/sV5X81ZuOitxJ7bW5ZV1tjfP16vDIH/UwueW2GRzzCeIfLspZpf3RpjHMNJMIT79yzZ8qswDdig//HzLwF9AN5CN6rQz1O/tNWe3naIYuLwNIncydXbxWkPmzvO/SzGskyOk7SrDvAHaruBAAainWAkxz0/7skkLgCc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661119; h=Content-Transfer-Encoding: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:Cc; bh=MCU/Z/Qgmg0aHgmJBeUL3IjPajAZQAUHQQKbxDBwU8Y=; b=ck7oVObrrci/rICYloLphpuHNt9FEweQ0tY5X4gxRuNRWHPpKbz47+GY/B8Zht19jMJCooKa5ty7UedWUwAQeJAlhqMHIn+r6mhEOUiqz0bSt/G03QjXOCS3Hp2jwHx2a9REgXkpKiCZYcIYAij0HMpw00QYp+kMXnzLMhVwuoM= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178766111905888.78053291543483; Tue, 25 Aug 2026 05:31:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqIA-0004p3-DP; Tue, 25 Aug 2026 08:30:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI8-0004o5-Hm for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:12 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI5-0000iO-Rx for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:12 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-694-v-ooD2OXNv6dIjYUewvMlQ-1; Tue, 25 Aug 2026 08:30:06 -0400 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-c15ceb17a28so355782266b.3 for ; Tue, 25 Aug 2026 05:30:05 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24966f8f2asm1855615866b.36.2026.08.25.05.30.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:30:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787661009; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MCU/Z/Qgmg0aHgmJBeUL3IjPajAZQAUHQQKbxDBwU8Y=; b=UXPu5wv/sDC5NhAOZr2iqPsqBC3zOkG+gCMuVb3hhg/qF0rBt4b7zaVpDZlXHRfzcq0eap ILT/sQA9FpcbIUMnf8lJxmgrezMIvweaHVhJxHEo3IgOl5PxkJbawJFKy1YAJBlWPDyUo1 u6nmjY4SXVDolvpUxpxjprNGIaZtjm4= X-MC-Unique: v-ooD2OXNv6dIjYUewvMlQ-1 X-Mimecast-MFC-AGG-ID: v-ooD2OXNv6dIjYUewvMlQ_1787661005 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787661005; x=1788265805; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=MCU/Z/Qgmg0aHgmJBeUL3IjPajAZQAUHQQKbxDBwU8Y=; b=bcs4yWkHoj7eFFyZktqndJ3XpxzfNTj7wZl0gpPebxhSPLk0uI1oWeL49s1DSwGzm7 m1k1zeJQPWHHDSY4Tm0Oy5Ic1WjFJbCom4O2k1AGYIcN+l1vlqn54z/BbWQMByyz2eUq zGyqpXADDhWGCjbP0lU3++ri7j3cIrARJaYg3WQ0ru9hicNC/juzZe1YqHLwS4DVU3VC 6N794wLgcEjmN7OnY/Fcp4XhVfyd4xxjbLFvAz8n/I4tYLIAGfbBGqE5EYSsrDRC+lb+ 2DvCEqrlwy5369bxYwCFHE3L2kGTqNgYJgeOjiyRZ9wSTsWa68PmqnzenqG7kSgQuea7 Bkbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787661005; x=1788265805; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=MCU/Z/Qgmg0aHgmJBeUL3IjPajAZQAUHQQKbxDBwU8Y=; b=WgdwT/sPNNe3S/N/4VylWPQuYJFaZyc9rMBIrrRE5HR1EEcIWYDquaxqG8embuTTYS JBCo+bDEWTIHHc/Ryd2QaJB+9Ii8BxNTLn7jiMfSLhcTx72nBq8MUSRdcPQSCOW1tqEF L631OC+k4aMbDZN34jijrXKPJklX10MdiYgKy/WI0xWOs1D/51NYZPfHxJiNZ3xVs8ia fZykLbYK0nteYa5pd8XiRt0PbObCqE9lMYvpzoYI6a50ylLWhxHgieAZzSEcE3PlZtBZ xXTlSp4cIXVovQzF53+AlmIkIAhdlAxlUNfooIUrelTR0dnK5r3d6k7hl1NFpV2tsJiA 2kOA== X-Gm-Message-State: AFuF++lJ3OL0hlk7J9OrU/oO++kcTtIZEjNOzYE5AHO9qASbjcOEtqpJ T3Auq6dWRNvcIHBBaeFe7iGvblVon3Xq9KQ5nuUoqFzR2gJLqriySt7Fs4ijqTqTnpovJl/PCYJ Fi7/FM2SACT+PxGipufgaUM+4LnyAyjFcsZow9TPX1fKjY6qO6aRxMLCrumf7AKJWBDXwGjIitL UB46Yi6mkgxnhMLvmZwDauyV1DcaohzJzBz9VLHxXj X-Gm-Gg: AR+sD11qTcQAyS5GBGTTooA64QY0Qu8eP4KvzJdSAw8SMaBdTYgfIblRuQf5QsUY3z+ tuq1wX0hZjPFCHZM21ToY5SeQvzxSfgnN6muVZJctZzc4PimBm19ssT8BvGoNfX04hyNF+mFmzy n77oVIO5gM0q/duzC3VGcJc/bCWXfw5t5JO67xEg6Nks05lzoWRRmurJ9AxhGRokAaij1Ss0DbL BRy9GIPAQu86qTO0zhVbsYoyEYy/Bz3GSJNfL0iXEVwKI/jO5e+0eNCcU00XU7WfuH94NgIxJpr Rr9gLJ86QD88dB0Mrkiq07L7aD6rt1TJosmN0dfXamFSCr0hu2eQ9JyQQ/XjljuLfE6RUgw0cPs n9rvxH37Ou+aekQpAfmaCri+BmUZhvuNrzhRmnv0X76SAxkBWpdkwsgt0fd8nN+kdnLqrwK92qt buFhc= X-Received: by 2002:a17:907:7241:b0:c24:457b:86fc with SMTP id a640c23a62f3a-c24e5bf345cmr703963166b.21.1787661004246; Tue, 25 Aug 2026 05:30:04 -0700 (PDT) X-Received: by 2002:a17:907:7241:b0:c24:457b:86fc with SMTP id a640c23a62f3a-c24e5bf345cmr703943566b.21.1787661003188; Tue, 25 Aug 2026 05:30:03 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 17/20] target/i386/tcg: implement CCMP/CTEST Date: Tue, 25 Aug 2026 14:29:18 +0200 Message-ID: <20260825122921.431739-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661119460158501 Content-Type: text/plain; charset="utf-8" CCMP/CTEST are new instructions that will either perform a CMP/TEST or set EFLAGS to a predetermined value. To support this double functionality without using CC_OP_DYNAMIC, introduce a new CCOp that is inspired by x86_flags.h. By shifting the carry computation part of compute_aco_sub* to TCG ops, it provides enough flexibility that the result of a subtraction, the result of an AND, and any value of EFLAGS can be encoded with a single CCOp. Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 5 + target/i386/tcg/cc_helper_template.h.inc | 11 ++ target/i386/tcg/cc_helper.c | 10 ++ target/i386/tcg/translate.c | 69 ++++++++++++ target/i386/tcg/decode-new.c.inc | 30 ++--- target/i386/tcg/emit.c.inc | 138 ++++++++++++++++++++++- 6 files changed, 247 insertions(+), 16 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index dc5d48aceea..87f857f9bcb 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1606,6 +1606,11 @@ typedef enum { CC_OP_BLSIL, CC_OP_BLSIQ, =20 + CC_OP_CCMPB, /* Z via CC_DST, P,S via CC_SRC2, carry-out in CC_SRC */ + CC_OP_CCMPW, + CC_OP_CCMPL, + CC_OP_CCMPQ, + /* * Note that only CC_OP_POPCNT (i.e. the one with MO_TL size) * is used or implemented, because the translation needs diff --git a/target/i386/tcg/cc_helper_template.h.inc b/target/i386/tcg/cc_= helper_template.h.inc index af58c2409f7..8ec449fd3ff 100644 --- a/target/i386/tcg/cc_helper_template.h.inc +++ b/target/i386/tcg/cc_helper_template.h.inc @@ -60,6 +60,17 @@ static uint32_t glue(compute_aco_cout, SUFFIX)(DATA_TYPE= carries) return af_cf + of; } =20 +static uint32_t glue(compute_all_ccmp, SUFFIX)(DATA_TYPE dst, DATA_TYPE sr= c1, DATA_TYPE src2) +{ + uint32_t pf, zf, sf; + + /* Compute all bits here because PF and SF do not come from DST. */ + zf =3D dst =3D=3D 0 ? CC_Z : 0; + pf =3D compute_pf(src2); + sf =3D lshift(src2, 8 - DATA_BITS) & CC_S; + return pf + zf + sf + glue(compute_aco_cout, SUFFIX)(src1); +} + static uint32_t glue(compute_aco_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src= 1) { DATA_TYPE src2 =3D dst - src1; diff --git a/target/i386/tcg/cc_helper.c b/target/i386/tcg/cc_helper.c index 6ddd64fcb07..a43b42badc0 100644 --- a/target/i386/tcg/cc_helper.c +++ b/target/i386/tcg/cc_helper.c @@ -111,6 +111,13 @@ target_ulong helper_cc_compute_all(target_ulong dst, t= arget_ulong src1, case CC_OP_ADCOX: return compute_all_adcox(dst, src1, src2); =20 + case CC_OP_CCMPB: + return compute_all_ccmpb(dst, src1, src2); + case CC_OP_CCMPW: + return compute_all_ccmpw(dst, src1, src2); + case CC_OP_CCMPL: + return compute_all_ccmpl(dst, src1, src2); + case CC_OP_MULB: flags =3D compute_aco_mul(src1); goto psz_b; @@ -232,6 +239,9 @@ target_ulong helper_cc_compute_all(target_ulong dst, ta= rget_ulong src1, goto psz_l; =20 #ifdef TARGET_X86_64 + case CC_OP_CCMPQ: + return compute_all_ccmpq(dst, src1, src2); + case CC_OP_MULQ: flags =3D compute_aco_mul(src1); goto psz_q; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 770a05f7d8d..42213e38962 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -286,6 +286,11 @@ enum { JCC_LE, }; =20 +enum { + CCMP_T =3D JCC_P << 1, + CCMP_F, +}; + enum { USES_CC_DST =3D 1, USES_CC_SRC =3D 2, @@ -309,6 +314,7 @@ static const uint8_t cc_op_live_[] =3D { [CC_OP_SARB ... CC_OP_SARQ] =3D USES_CC_DST | USES_CC_SRC, [CC_OP_BMILGB ... CC_OP_BMILGQ] =3D USES_CC_DST | USES_CC_SRC, [CC_OP_BLSIB ... CC_OP_BLSIQ] =3D USES_CC_DST | USES_CC_SRC, + [CC_OP_CCMPB ... CC_OP_CCMPQ] =3D USES_CC_DST | USES_CC_SRC | USES_CC_= SRC2, [CC_OP_ADCX] =3D USES_CC_DST | USES_CC_SRC, [CC_OP_ADOX] =3D USES_CC_SRC | USES_CC_SRC2, [CC_OP_ADCOX] =3D USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, @@ -908,6 +914,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) .rhs_type =3D CC_PREPARE_DIRECT }; =20 case CC_OP_SHLB ... CC_OP_SHLQ: + case CC_OP_CCMPB ... CC_OP_CCMPQ: /* (CC_SRC >> (DATA_BITS - 1)) & 1 */ size =3D cc_op_size(s->cc_op); return gen_prepare_sign_nz(cpu_cc_src, size); @@ -975,6 +982,8 @@ static CCPrepare gen_prepare_eflags_s(DisasContext *s, = TCGv reg) .imm =3D CC_S }; case CC_OP_POPCNT: return (CCPrepare) { .cond =3D TCG_COND_NEVER }; + case CC_OP_CCMPB ... CC_OP_CCMPQ: + return gen_prepare_sign_nz(cpu_cc_src2, cc_op_size(s->cc_op)); default: return gen_prepare_sign_nz(cpu_cc_dst, cc_op_size(s->cc_op)); } @@ -994,6 +1003,20 @@ static CCPrepare gen_prepare_eflags_o(DisasContext *s= , TCGv reg) return (CCPrepare) { .cond =3D TCG_COND_NEVER }; case CC_OP_MULB ... CC_OP_MULQ: return (CCPrepare) { .cond =3D TCG_COND_NE, .reg =3D cpu_cc_src }; + + case CC_OP_CCMPB ... CC_OP_CCMPQ: + if (!reg) { + reg =3D tcg_temp_new(); + } + /* + * Sum the carry-out vector and the value of the bit below the MSB; + * the XOR of the top two carry bits ends up in the sign bit. + */ + int size =3D cc_op_size(s->cc_op); + target_ulong adj =3D 1ull << ((8 << size) - 2); + tcg_gen_add_tl(reg, cpu_cc_src, tcg_constant_tl(adj)); + return gen_prepare_sign_nz(reg, size); + default: gen_compute_eflags(s); return (CCPrepare) { .cond =3D TCG_COND_TSTNE, .reg =3D cpu_cc_src, @@ -1076,6 +1099,52 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int= b, TCGv reg) } goto slow_jcc; =20 + case CC_OP_CCMPB ... CC_OP_CCMPQ: + size =3D cc_op_size(s->cc_op); + switch (jcc_op) { + CCPrepare zf; + + case JCC_L: + case JCC_LE: + if (!reg) { + reg =3D tcg_temp_new(); + } + /* + * Sum the carry-out vector and the value of the bit below the= MSB; + * the XOR of the top two carry bits ends up in the sign bit. + */ + size =3D s->cc_op - CC_OP_CCMPB; + target_ulong adj =3D 1ull << ((8 << size) - 2); + tcg_gen_add_tl(reg, cpu_cc_src, tcg_constant_tl(adj)); + /* Now XOR in SF too. */ + tcg_gen_xor_tl(reg, reg, cpu_cc_src2); + /* And possibly OR the zero flag... */ + if (jcc_op =3D=3D JCC_LE) { + goto ccmp_or_zf; + } + cc =3D gen_prepare_sign_nz(reg, size); + break; + + case JCC_BE: + if (!reg) { + reg =3D tcg_temp_new(); + } + tcg_gen_mov_tl(reg, cpu_cc_src); + ccmp_or_zf: + /* OR ZF into CF: if CPU_CC_DST is zero, set reg to all ones. = */ + zf =3D gen_prepare_val_nz(cpu_cc_dst, size, true); + if (zf.rhs_type !=3D CC_PREPARE_REG) { + zf.reg2 =3D tcg_constant_tl(zf.imm); + } + tcg_gen_movcond_tl(zf.cond, reg, zf.reg, zf.reg2, tcg_constant= _tl(-1), reg); + cc =3D gen_prepare_sign_nz(reg, size); + break; + + default: + goto slow_jcc; + } + break; + case CC_OP_LOGICB ... CC_OP_LOGICQ: /* Mostly used for test+jump */ size =3D s->cc_op - CC_OP_LOGICB; diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index ebbfa4f6592..33d366769e7 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1580,7 +1580,7 @@ static void decode_63(DisasContext *s, CPUX86State *e= nv, X86OpEntry *entry, uint static void decode_group1(DisasContext *s, CPUX86State *env, X86OpEntry *e= ntry, uint8_t *b) { static const X86GenFunc group1_gen[8] =3D { - gen_ADD, gen_OR, gen_ADC, gen_SBB, gen_AND, gen_SUB, gen_XOR, gen_= SUB, + gen_ADD, gen_OR, gen_ADC, gen_SBB, gen_AND, gen_SUB, gen_XOR, gen_= CMP, }; int op =3D (get_modrm(s, env) >> 3) & 7; entry->gen =3D group1_gen[op]; @@ -1627,8 +1627,8 @@ static void decode_group3(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, { static const X86OpEntry opcodes_grp3[16] =3D { /* 0xf6 */ - [0x00] =3D X86_OP_ENTRYrr(AND, E,b, I,b), - [0x01] =3D X86_OP_ENTRYrr(AND, E,b, I,b), + [0x00] =3D X86_OP_ENTRYrr(TEST, E,b, I,b), + [0x01] =3D X86_OP_ENTRYrr(TEST, E,b, I,b), [0x02] =3D X86_OP_ENTRY1(NOT, E,b, lock), [0x03] =3D X86_OP_ENTRY1(NEG, E,b, lock), [0x04] =3D X86_OP_ENTRYrr(MUL, E,b, 0,b, zextT0), @@ -1637,8 +1637,8 @@ static void decode_group3(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, [0x07] =3D X86_OP_ENTRYr(IDIV, E,b), =20 /* 0xf7 */ - [0x08] =3D X86_OP_ENTRYrr(AND, E,v, I,z), - [0x09] =3D X86_OP_ENTRYrr(AND, E,v, I,z), + [0x08] =3D X86_OP_ENTRYrr(TEST, E,v, I,z), + [0x09] =3D X86_OP_ENTRYrr(TEST, E,v, I,z), [0x0a] =3D X86_OP_ENTRY1(NOT, E,v, lock), [0x0b] =3D X86_OP_ENTRY1(NEG, E,v, lock), [0x0c] =3D X86_OP_ENTRYrr(MUL, E,v, 0,v, zextT0), @@ -1777,8 +1777,8 @@ static const X86OpEntry opcodes_root[256] =3D { [0x81] =3D X86_OP_GROUP2(group1, E,v, I,z), [0x82] =3D X86_OP_GROUP2(group1, E,b, I,b, chk(i64)), [0x83] =3D X86_OP_GROUP2(group1, E,v, I,b), - [0x84] =3D X86_OP_ENTRYrr(AND, E,b, G,b), - [0x85] =3D X86_OP_ENTRYrr(AND, E,v, G,v), + [0x84] =3D X86_OP_ENTRYrr(TEST, E,b, G,b), + [0x85] =3D X86_OP_ENTRYrr(TEST, E,v, G,v), [0x86] =3D X86_OP_ENTRY2(XCHG, E,b, G,b, xchg), [0x87] =3D X86_OP_ENTRY2(XCHG, E,v, G,v, xchg), =20 @@ -1869,12 +1869,12 @@ static const X86OpEntry opcodes_root[256] =3D { [0x2E] =3D {}, [0x2F] =3D X86_OP_ENTRY0(DAS, chk(i64)), =20 - [0x38] =3D X86_OP_ENTRYrr(SUB, E,b, G,b), - [0x39] =3D X86_OP_ENTRYrr(SUB, E,v, G,v), - [0x3A] =3D X86_OP_ENTRYrr(SUB, G,b, E,b), - [0x3B] =3D X86_OP_ENTRYrr(SUB, G,v, E,v), - [0x3C] =3D X86_OP_ENTRYrr(SUB, 0,b, I,b), /* AL, Ib */ - [0x3D] =3D X86_OP_ENTRYrr(SUB, 0,v, I,z), /* rAX, Iz */ + [0x38] =3D X86_OP_ENTRYrr(CMP, E,b, G,b), + [0x39] =3D X86_OP_ENTRYrr(CMP, E,v, G,v), + [0x3A] =3D X86_OP_ENTRYrr(CMP, G,b, E,b), + [0x3B] =3D X86_OP_ENTRYrr(CMP, G,v, E,v), + [0x3C] =3D X86_OP_ENTRYrr(CMP, 0,b, I,b), /* AL, Ib */ + [0x3D] =3D X86_OP_ENTRYrr(CMP, 0,v, I,z), /* rAX, Iz */ [0x3E] =3D {}, [0x3F] =3D X86_OP_ENTRY0(AAS, chk(i64)), =20 @@ -1933,8 +1933,8 @@ static const X86OpEntry opcodes_root[256] =3D { [0x9E] =3D X86_OP_ENTRY0(SAHF), [0x9F] =3D X86_OP_ENTRY0(LAHF), =20 - [0xA8] =3D X86_OP_ENTRYrr(AND, 0,b, I,b), /* AL, Ib */ - [0xA9] =3D X86_OP_ENTRYrr(AND, 0,v, I,z), /* rAX, Iz */ + [0xA8] =3D X86_OP_ENTRYrr(TEST, 0,b, I,b), /* AL, Ib */ + [0xA9] =3D X86_OP_ENTRYrr(TEST, 0,v, I,z), /* rAX, Iz */ [0xAA] =3D X86_OP_ENTRYwr(STOS, Y,b, 0,b), [0xAB] =3D X86_OP_ENTRYwr(STOS, Y,v, 0,v), /* Manual writeback because REP LODS (!) has to write EAX/RAX after ev= ery LODS. */ diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 8c8adcf3255..48181182aa7 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1649,6 +1649,117 @@ static void gen_CMOVcc(DisasContext *s, X86DecodedI= nsn *decode) gen_cmovcc(s, decode->b & 0xf, s->T0, s->T1); } =20 +/* Convert the repurposed V bits of CCMP or CTEST instructions to + * an EFLAGS value. + */ +static inline uint32_t evex_to_eflags(DisasContext *s) +{ + uint16_t eflags =3D 0; + eflags |=3D (s->evex3 & 0x08 ? CC_C | CC_P : 0); + eflags |=3D (s->evex3 & 0x10 ? CC_Z : 0); + eflags |=3D (s->evex3 & 0x20 ? CC_S : 0); + eflags |=3D (s->evex3 & 0x40 ? CC_O : 0); + return eflags; +} + +/* If the condition COND is false, fill CC_DST/SRC/SRC2 with values that + * produce the flag values in DFV for CC_OP_CCMP*. If instead COND is tru= e, + * set up the flag values from CC_DST and COUT. + * + * On input, CC_DST contains the result of the subtraction or AND, which + * ends up in CC_DST and CC_SRC2 as well. COUT is non-NULL for CCMP, and = will + * be used for the output CC_SRC if COND is true; it is NULL for CTEST and + * will result in CC_SRC=3D=3D0 (resulting in CF=3DAF=3DOF=3D0) is COND is= true. + */ +static void gen_dfv_movcond(DisasContext *s, X86DecodedInsn *decode, int c= ond, uint32_t dfv, + MemOp ot, TCGv cout) +{ + target_ulong dst, src, src2; + CCPrepare cc =3D gen_prepare_cc(s, cond, NULL); + + /* ZF from dst */ + dst =3D (dfv & CC_Z) ? 0 : -1; + + /* CF is the high bit of SRC, OF the XOR of the high two bits */ + src =3D deposit64(0, (8 << ot) - 2, 1, !!(dfv & CC_O)); + src ^=3D (dfv & CC_C) ? -1 : 0; + + /* + * SF is the high bit of SRC2, PF the parity of the low byte. But also + * ensure the value is nonzero if dfv requests zf=3D0. This triggers = the + * optimization below in some extra cases (e.g. dfv =3D=3D CC_P). + * + * Note dst is either 0 or -1 so it has even parity. + */ + src2 =3D dst & 3; + src2 ^=3D (dfv & CC_P) ? 0 : 1; + src2 ^=3D (dfv & CC_S) ? -1 : 0; + + if (cout) { + decode->cc_src =3D cout; + tcg_gen_movcond_tl(cc.cond, decode->cc_src, cc.reg, cc.reg2, + decode->cc_src, tcg_constant_tl(src)); + } else if (src) { + decode->cc_src =3D tcg_temp_new(); + tcg_gen_movcond_tl(cc.cond, decode->cc_src, cc.reg, cc.reg2, + tcg_constant_tl(0), tcg_constant_tl(src)); + } else { + decode->cc_src =3D tcg_constant_tl(0); + } + + if (!!dst =3D=3D !!src2) { + /* + * When an actual CMP or TEST result is stored, DST will be + * equal to SRC2, and when the default flag value is stored, + * only zero/nonzero matters for DST. If DST and SRC2 + * are equally zero/non-zero, use the same value for both. + */ + decode->cc_src2 =3D decode->cc_dst; + dst =3D src2; + } else { + decode->cc_src2 =3D tcg_temp_new(); + tcg_gen_movcond_tl(cc.cond, decode->cc_src2, cc.reg, cc.reg2, + decode->cc_dst, tcg_constant_tl(src2)); + } + tcg_gen_movcond_tl(cc.cond, decode->cc_dst, cc.reg, cc.reg2, + decode->cc_dst, tcg_constant_tl(dst)); +} + +static void gen_SUB(DisasContext *s, X86DecodedInsn *decode); +static void gen_CMP(DisasContext *s, X86DecodedInsn *decode) +{ + int cond =3D (s->prefix & PREFIX_EVEX) ? s->evex4 & 0x0f : CCMP_T; + uint32_t dfv =3D evex_to_eflags(s); + MemOp ot =3D decode->op[1].ot; + TCGv cout; + + switch (cond) { + case CCMP_T: + gen_SUB(s, decode); + return; + case CCMP_F: + decode->cc_op =3D CC_OP_EFLAGS; + decode->cc_src =3D tcg_constant_tl(dfv); + return; + default: + break; + } + + decode->cc_op =3D CC_OP_CCMPB + ot; + decode->cc_dst =3D tcg_temp_new(); + cout =3D tcg_temp_new(); + tcg_gen_sub_tl(decode->cc_dst, s->T0, s->T1); + + /* Compute carry-out vector of subtraction. */ + tcg_gen_xor_tl(cout, s->T1, decode->cc_dst); + tcg_gen_xor_tl(s->T0, s->T0, s->T1); + tcg_gen_and_tl(cout, cout, s->T0); + tcg_gen_xor_tl(cout, cout, decode->cc_dst); + + /* src2 =3D=3D dst if cond is true. */ + gen_dfv_movcond(s, decode, cond, dfv, ot, cout); +} + static void gen_CMPccXADD(DisasContext *s, X86DecodedInsn *decode) { TCGLabel *label_top =3D gen_new_label(); @@ -3857,7 +3968,6 @@ static void gen_SARX(DisasContext *s, X86DecodedInsn = *decode) tcg_gen_sar_tl(s->T0, s->T0, s->T1); } =20 -static void gen_SUB(DisasContext *s, X86DecodedInsn *decode); static void gen_SBB(DisasContext *s, X86DecodedInsn *decode) { MemOp ot =3D decode->op[0].ot; @@ -4172,6 +4282,32 @@ static void gen_SYSRET(DisasContext *s, X86DecodedIn= sn *decode) s->base.is_jmp =3D DISAS_EOB_RECHECK_TF; } =20 +static void gen_TEST(DisasContext *s, X86DecodedInsn *decode) +{ + int cond =3D (s->prefix & PREFIX_EVEX) ? s->evex4 & 0x0f : CCMP_T; + uint32_t dfv =3D evex_to_eflags(s); + MemOp ot =3D decode->op[1].ot; + + switch (cond) { + case CCMP_T: + gen_AND(s, decode); + return; + case CCMP_F: + decode->cc_op =3D CC_OP_EFLAGS; + decode->cc_src =3D tcg_constant_tl(dfv); + return; + default: + break; + } + + decode->cc_op =3D CC_OP_CCMPB + ot; + decode->cc_dst =3D tcg_temp_new(); + tcg_gen_and_tl(decode->cc_dst, s->T0, s->T1); + + /* src=3D0, src2 =3D=3D dst if cond is true. */ + gen_dfv_movcond(s, decode, cond, dfv, ot, NULL); +} + static void gen_TZCNT(DisasContext *s, X86DecodedInsn *decode) { MemOp ot =3D decode->op[0].ot; --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661064; cv=none; d=zohomail.com; s=zohoarc; b=S8DqxhylLJOForOnFA54yS0+GqjTSBwWpEO0ExJnEe2gVrHCFZ+HhiSR0dZlGzB6ASyXFfXWDr1ZSs+x3QcXU92Tabfqcy4TNCEmhzPxzVt4NgQfNI0kOe0yzkQgad5jUcmjPwR64/ppjOGJki/5LCuyJLor7mTUYGog+UiVszg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661064; h=Content-Transfer-Encoding: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:Cc; bh=CeIBcEAroUJ3Fvfnbs5pB5G04GNsPJK+AJJUR2I9Ymw=; b=ikie2QinFZBvVvozK8VrvzquxldRH0fIGTqdap1R9sHBSs7rwgTfXmUEIFevCK8obcOW/g4+72cfdIqS0SjlkBmgy1lRAHV2/kUYzrPbW1E4qDMY5gKEsCM3bOiBJyISBL8Vq+H2lamfyHoiWeGdrpQx27tLkwwJlFbciPBdIiQ= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661064859302.0448761294508; Tue, 25 Aug 2026 05:31:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqID-0004tu-Sc; Tue, 25 Aug 2026 08:30:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqIB-0004q1-P3 for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:15 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI7-0000j3-50 for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:14 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-53-hHUeZVD9OPm5PGTA_10Z3A-1; Tue, 25 Aug 2026 08:30:08 -0400 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c1670dd0f5dso157132766b.2 for ; Tue, 25 Aug 2026 05:30:08 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a5d82a283dsm1234190a12.11.2026.08.25.05.30.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:30:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787661010; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CeIBcEAroUJ3Fvfnbs5pB5G04GNsPJK+AJJUR2I9Ymw=; b=YlUc+gPYOJZIx/vdKLGCArxZBjA4x2iaqkuIghzhjMTiGuHWC6dYXsGAtjWAfKOq+7M7aY LvP1aPFQXyTQHxF7+F1OvYKyY97gIaa/djcJoAYy29goPDi6/cOW/R5+WF2Zoo9KO/UWox aG5aFcZ4bZvQ6pxTvQ2BxChSlsYvfAo= X-MC-Unique: hHUeZVD9OPm5PGTA_10Z3A-1 X-Mimecast-MFC-AGG-ID: hHUeZVD9OPm5PGTA_10Z3A_1787661008 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787661007; x=1788265807; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=CeIBcEAroUJ3Fvfnbs5pB5G04GNsPJK+AJJUR2I9Ymw=; b=p6uzlXFCWfmP0rX01S7ZzF/RjzezDio/q+3SC+d4POo2C5edk0CN5f+FTPmdsUzXGF 886X+S1qCosKW7ATpFgG3+MVvWPDojqZhist6Hmpv0IhfpqPl3ERCacETVWNdL9fjbxh yTH/9n3BRKmj6vJ/77b17r1FcI/yjLrbZm9/wvkvjubunwV+xOt0eDrlqi0XfCctEvZu CBEw1ZtlsBTnjQ7PmwYPXVj+TyZNsgoXD0rASi6frISLt7GA2k+cY7c2iBJ2Uyh7W5iC O6W5R4ceXbHwrsnhpG6X4ptVujPM0KRUaDm9KWdUriNazmRC+hf6NnDQtqXkwQ662Szq 7tDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787661007; x=1788265807; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=CeIBcEAroUJ3Fvfnbs5pB5G04GNsPJK+AJJUR2I9Ymw=; b=sKzdo5eOm0Qxg0x4AKRqq9qiLY/L1+4Vtm+Xn0JGtk5QfBK//QiAZljLIGkYoZXRwg pFoUiHWxFOHFZG/iE71h5SeG+su5UxEcNpoEXqz6e+eO9X8/BaviXb3baBPMY6zIjiT0 Lx7zxcSb667uFvt8+NzRJ0crwugd8brKDocJAS4fqbAh4CzX7bErmc6O+qLpp5/ZBv5y w7bMqRAFAwRW01TBe+EpNIrTa27SXQXjfD8R9xszhArsagcq0iEwh0rgXcV8hyU4wEeI 0nYCjMUiAjLyiuQV6POi8Z7ZqmCKwtRfjKG3cAwa1UzNtqt+KKlAhV9l0JadPynECE9k xb8Q== X-Gm-Message-State: AFuF++mxiScDRPAXZg+w6blB0Dz1mDkjvRouoAClcEkEFXg+MleZE89u ttM2IpN/hMT9iSzWZZYxQy/2XGgwXotUEF+dt2qJ5HL4/fXo1mSEooWHx61eEDV3k8EKu3ivRkz l4tBFvV4WwwGzwkbt7FoMDz3GGx+CPNs8cvN6gK6u+afrZXYER7VHi68tQu5s/wJ7/URR+YpH2t s91g5JSxLBOVptQjpe2bG4JqhLSjPIT0y1w/5Exx8R X-Gm-Gg: AR+sD10Ri1jTbw58214f5q1hIGTEhC7ZR6aD1vyzX+WvkaCkLNQ/sEl9P++me53MC9H e4zri7QablRg113w8qiUeXxUYuuK5Dz1O/Qkd8/V5jVNKAAoPFCUbnhIV3s//GIUNrMyAfS1Y/z HzedtrLGrQShVk48XCSPXwykwyvA1dDghgLfaMbUpR0xvZqStg4A3TZoaPRVJA9cxUnJVpB0wWb XOi11bnBQveAb/3yNzQev6m4liM5Axdge4olw+fjY3HWqYV8A2P74oLWaEYP3Quzi+JhhjE9Hbj qofhvnv0VMW9skdcL9KNEbz2YXcmwK7EMsJVnI5uHKw+6ojF0kmYWoW6TXoz44yAbyIZ1YYuA/I k9RKA5IRG2xAlKYmC+Q0EDqHj0YbEUMo61PxRW+zWOqnht9TO60/lE7yRNseIFQhcKlcbjwqyid Y8Dr8= X-Received: by 2002:a17:906:7316:b0:c19:45e3:2f57 with SMTP id a640c23a62f3a-c2491cbca79mr2860397266b.9.1787661007201; Tue, 25 Aug 2026 05:30:07 -0700 (PDT) X-Received: by 2002:a17:906:7316:b0:c19:45e3:2f57 with SMTP id a640c23a62f3a-c2491cbca79mr2860381966b.9.1787661006121; Tue, 25 Aug 2026 05:30:06 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 18/20] target/i386/tcg: decode APX instructions Date: Tue, 25 Aug 2026 14:29:19 +0200 Message-ID: <20260825122921.431739-19-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661067051158500 Content-Type: text/plain; charset="utf-8" The bulk of the APX implementation, comprising new map4-specific encodings, extensions to legacy root and 0F tables, and the implementation of new instructions CFCMOV, PUSH2 and POP2. Signed-off-by: Paolo Bonzini --- target/i386/helper.h | 1 + target/i386/tcg/decode-new.h | 1 + target/i386/tcg/excp_helper.c | 5 + target/i386/tcg/decode-new.c.inc | 307 +++++++++++++++++++++++++------ target/i386/tcg/emit.c.inc | 55 ++++++ 5 files changed, 312 insertions(+), 57 deletions(-) diff --git a/target/i386/helper.h b/target/i386/helper.h index 3f67098f11f..99cbbacadfc 100644 --- a/target/i386/helper.h +++ b/target/i386/helper.h @@ -57,6 +57,7 @@ DEF_HELPER_2(sysret, void, env, int) DEF_HELPER_FLAGS_1(pause, TCG_CALL_NO_WG, noreturn, env) DEF_HELPER_FLAGS_3(raise_interrupt, TCG_CALL_NO_WG, noreturn, env, int, in= t) DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, int) +DEF_HELPER_FLAGS_1(raise_gpf, TCG_CALL_NO_WG, noreturn, env) DEF_HELPER_FLAGS_1(icebp, TCG_CALL_NO_WG, noreturn, env) DEF_HELPER_3(boundw, void, env, tl, int) DEF_HELPER_3(boundl, void, env, tl, int) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 1c7ed73c437..de35fb44a37 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -53,6 +53,7 @@ typedef enum X86OpType { X86_TYPE_nop, /* modrm operand decoded but not loaded into s->T{0,1} */ X86_TYPE_2op, /* 2-operand RMW instruction */ X86_TYPE_LoBits, /* encoded in bits 0-2 of the operand + REX.B */ + X86_TYPE_ZERO, /* Constant zero, for CFCMOV */ X86_TYPE_0, /* Hard-coded GPRs (RAX..RDI) */ X86_TYPE_1, X86_TYPE_2, diff --git a/target/i386/tcg/excp_helper.c b/target/i386/tcg/excp_helper.c index 1eaa602c91d..d6410d6fc11 100644 --- a/target/i386/tcg/excp_helper.c +++ b/target/i386/tcg/excp_helper.c @@ -37,6 +37,11 @@ G_NORETURN void helper_raise_exception(CPUX86State *env,= int exception_index) raise_exception(env, exception_index); } =20 +G_NORETURN void helper_raise_gpf(CPUX86State *env) +{ + raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC()); +} + /* * Check nested exceptions and change to double or triple fault if * needed. It should only be called, if this is not an interrupt. diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 33d366769e7..a92bc1faeff 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -184,6 +184,8 @@ X86_OP_GROUP3(op, op0, s0, None, None, None, None, ## __VA_ARGS__) #define X86_OP_GROUPwr(op, op0, s0, op1, s1, ...) \ X86_OP_GROUP3(op, op0, s0, op1, s1, None, None, ## __VA_ARGS__) +#define X86_OP_GROUPrr(op, op0, s0, op1, s1, ...) \ + X86_OP_GROUP3(op, None, None, op0, s0, op1, s1, ## __VA_ARGS__) #define X86_OP_GROUP0(op, ...) \ X86_OP_GROUP3(op, None, None, None, None, None, None, ## __VA_ARGS__) =20 @@ -275,8 +277,10 @@ #define p_f3 .valid_prefix =3D P_F3, #define p_f2 .valid_prefix =3D P_F2, #define p_00_66 .valid_prefix =3D P_00 | P_66, +#define p_00_f2 .valid_prefix =3D P_00 | P_F2, #define p_00_f3 .valid_prefix =3D P_00 | P_F3, #define p_66_f2 .valid_prefix =3D P_66 | P_F2, +#define p_66_f3 .valid_prefix =3D P_66 | P_F3, #define p_00_66_f3 .valid_prefix =3D P_00 | P_66 | P_F3, #define p_66_f3_f2 .valid_prefix =3D P_66 | P_F3 | P_F2, #define p_00_66_f3_f2 .valid_prefix =3D P_00 | P_66 | P_F3 | P_F2, @@ -866,28 +870,33 @@ static const X86OpEntry opcodes_0F38_00toEF[240] =3D { =20 /* * REG selects srcdest2 operand, VEX.vvvv selects src3. VEX class not= found - * in manual, assumed to be 13 from the VEX.L0 constraint. + * in manual, assumed to be 13 from the VEX.L0 constraint; EVEX-APX-BM= I and + * EVEX-APX-CMPccXADD are also pretty much the same; the difference are + * reflected in chk(nf0) and in the M operand type. */ - [0xe0] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe1] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe2] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe3] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe4] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe5] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe6] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe7] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), + [0xe0] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe1] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe2] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe3] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe4] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe5] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe6] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe7] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), =20 - [0xe8] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xe9] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xea] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xeb] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xec] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xed] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xee] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), - [0xef] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o= 64) cpuid(CMPCCXADD) p_66), + [0xe8] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xe9] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xea] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xeb] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xec] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xed] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xee] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), + [0xef] =3D X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk2(= nf0, o64) cpuid(CMPCCXADD) p_66), }; =20 -/* four rows for no prefix, 66, F3, F2 (including 66+F2 operand size overr= ide) */ +/* + * four rows for no prefix, 66, F3, F2 (including 66+F2 operand size overr= ide). + * all VEX13 instructions extend to APX, while MOVBE/CRC32 move to EVEX ma= p4 + */ static const X86OpEntry opcodes_0F38_F0toFF[16][4] =3D { /* * MOVBE and CRC32 are incorrectly listed as always doing 32-bit opera= tion @@ -920,20 +929,20 @@ static const X86OpEntry opcodes_0F38_F0toFF[16][4] = =3D { [5] =3D { X86_OP_ENTRY3(BZHI, G,y, E,y, B,y, vex13 cpuid(BMI1)), {}, - X86_OP_ENTRY3(PEXT, G,y, B,y, E,y, vex13 zextT0 cpuid(BMI2)), - X86_OP_ENTRY3(PDEP, G,y, B,y, E,y, vex13 zextT0 cpuid(BMI2)), + X86_OP_ENTRY3(PEXT, G,y, B,y, E,y, vex13 zextT0 chk(nf0) cpuid(BMI= 2)), + X86_OP_ENTRY3(PDEP, G,y, B,y, E,y, vex13 zextT0 chk(nf0) cpuid(BMI= 2)), }, [6] =3D { {}, X86_OP_ENTRY2(ADCX, G,y, E,y, cpuid(ADX)), X86_OP_ENTRY2(ADOX, G,y, E,y, cpuid(ADX)), - X86_OP_ENTRY3(MULX, /* B,y, */ G,y, E,y, 2,y, vex13 cpuid(BMI2)), + X86_OP_ENTRY3(MULX, /* B,y, */ G,y, E,y, 2,y, vex13 chk(nf0) cpuid= (BMI2)), }, [7] =3D { X86_OP_ENTRY3(BEXTR, G,y, E,y, B,y, vex13 zextT0 cpuid(BMI1)), - X86_OP_ENTRY3(SHLX, G,y, E,y, B,y, vex13 cpuid(BMI1)), - X86_OP_ENTRY3(SARX, G,y, E,y, B,y, vex13 sextT0 cpuid(BMI1)), - X86_OP_ENTRY3(SHRX, G,y, E,y, B,y, vex13 zextT0 cpuid(BMI1)), + X86_OP_ENTRY3(SHLX, G,y, E,y, B,y, vex13 chk(nf0) cpuid(BMI1)), + X86_OP_ENTRY3(SARX, G,y, E,y, B,y, vex13 chk(nf0) sextT0 cpuid(BMI= 1)), + X86_OP_ENTRY3(SHRX, G,y, E,y, B,y, vex13 chk(nf0) zextT0 cpuid(BMI= 1)), }, }; =20 @@ -1022,7 +1031,7 @@ static const X86OpEntry opcodes_0F3A[256] =3D { =20 [0xdf] =3D X86_OP_ENTRY3(VAESKEYGEN, V,dq, W,dq, I,b, vex4 cpuid(AES)= p_66), =20 - [0xF0] =3D X86_OP_ENTRY3(RORX, G,y, E,y, I,b, vex13 cpuid(BMI2) p_f2), + [0xF0] =3D X86_OP_ENTRY3(RORX, G,y, E,y, I,b, vex13 chk(nf0) = cpuid(BMI2) p_f2), }; =20 static void decode_0F3A(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) @@ -1587,9 +1596,9 @@ static void decode_group1(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, =20 if (op =3D=3D 7) { /* prevent writeback for CMP */ - entry->op1 =3D entry->op0; entry->op0 =3D X86_TYPE_None; entry->s0 =3D X86_SIZE_None; + entry->vex_class =3D X86_EVEX_APX_cmp; } else { entry->special =3D X86_SPECIAL_HasLock; } @@ -1616,6 +1625,9 @@ static void decode_group2(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, }; int op =3D (get_modrm(s, env) >> 3) & 7; entry->gen =3D group2_gen[op]; + if (op =3D=3D 2 || op =3D=3D 3) { + entry->check |=3D X86_CHECK_nf0; + } if (op =3D=3D 7) { entry->special =3D X86_SPECIAL_SExtT0; } else { @@ -1627,24 +1639,24 @@ static void decode_group3(DisasContext *s, CPUX86St= ate *env, X86OpEntry *entry, { static const X86OpEntry opcodes_grp3[16] =3D { /* 0xf6 */ - [0x00] =3D X86_OP_ENTRYrr(TEST, E,b, I,b), - [0x01] =3D X86_OP_ENTRYrr(TEST, E,b, I,b), - [0x02] =3D X86_OP_ENTRY1(NOT, E,b, lock), - [0x03] =3D X86_OP_ENTRY1(NEG, E,b, lock), - [0x04] =3D X86_OP_ENTRYrr(MUL, E,b, 0,b, zextT0), - [0x05] =3D X86_OP_ENTRYrr(IMUL,E,b, 0,b, sextT0), - [0x06] =3D X86_OP_ENTRYr(DIV, E,b), - [0x07] =3D X86_OP_ENTRYr(IDIV, E,b), + [0x00] =3D X86_OP_ENTRYrr(TEST, E,b, I,b, evex_apx_cmp p_00), + [0x01] =3D X86_OP_ENTRYrr(TEST, E,b, I,b, evex_apx_cmp p_00), + [0x02] =3D X86_OP_ENTRYwr(NOT, B,b, E,b, evex_apx p_00 chk(nf0) l= ock), + [0x03] =3D X86_OP_ENTRYwr(NEG, B,b, E,b, evex_apx p_00 lock), + [0x04] =3D X86_OP_ENTRYrr(MUL, E,b, 0,b, evex_apx p_00 zextT0), + [0x05] =3D X86_OP_ENTRYrr(IMUL, E,b, 0,b, evex_apx p_00 sextT0), + [0x06] =3D X86_OP_ENTRYr(DIV, E,b, evex_apx p_00), + [0x07] =3D X86_OP_ENTRYr(IDIV, E,b, evex_apx p_00), =20 /* 0xf7 */ - [0x08] =3D X86_OP_ENTRYrr(TEST, E,v, I,z), - [0x09] =3D X86_OP_ENTRYrr(TEST, E,v, I,z), - [0x0a] =3D X86_OP_ENTRY1(NOT, E,v, lock), - [0x0b] =3D X86_OP_ENTRY1(NEG, E,v, lock), - [0x0c] =3D X86_OP_ENTRYrr(MUL, E,v, 0,v, zextT0), - [0x0d] =3D X86_OP_ENTRYrr(IMUL,E,v, 0,v, sextT0), - [0x0e] =3D X86_OP_ENTRYr(DIV, E,v), - [0x0f] =3D X86_OP_ENTRYr(IDIV, E,v), + [0x08] =3D X86_OP_ENTRYrr(TEST, E,v, I,z, evex_apx_cmp p_00_66), + [0x09] =3D X86_OP_ENTRYrr(TEST, E,v, I,z, evex_apx_cmp p_00_66), + [0x0a] =3D X86_OP_ENTRYwr(NOT, B,v, E,v, evex_apx p_00_66 chk(nf0= ) lock), + [0x0b] =3D X86_OP_ENTRYwr(NEG, B,v, E,v, evex_apx p_00_66 lock), + [0x0c] =3D X86_OP_ENTRYrr(MUL, E,v, 0,v, evex_apx p_00_66 zextT0), + [0x0d] =3D X86_OP_ENTRYrr(IMUL, E,v, 0,v, evex_apx p_00_66 sextT0), + [0x0e] =3D X86_OP_ENTRYr(DIV, E,v, evex_apx p_00_66), + [0x0f] =3D X86_OP_ENTRYr(IDIV, E,v, evex_apx p_00_66), }; =20 int w =3D (*b & 1); @@ -1657,12 +1669,12 @@ static void decode_group4_5(DisasContext *s, CPUX86= State *env, X86OpEntry *entry { static const X86OpEntry opcodes_grp4_5[16] =3D { /* 0xfe */ - [0x00] =3D X86_OP_ENTRY1(INC, E,b, l= ock), - [0x01] =3D X86_OP_ENTRY1(DEC, E,b, l= ock), + [0x00] =3D X86_OP_ENTRYwr(INC, B,b, E,b, e= vex_apx p_00 lock), + [0x01] =3D X86_OP_ENTRYwr(DEC, B,b, E,b, e= vex_apx p_00 lock), =20 /* 0xff */ - [0x08] =3D X86_OP_ENTRY1(INC, E,v, l= ock), - [0x09] =3D X86_OP_ENTRY1(DEC, E,v, l= ock), + [0x08] =3D X86_OP_ENTRYwr(INC, B,v, E,v, e= vex_apx p_00 lock), + [0x09] =3D X86_OP_ENTRYwr(DEC, B,v, E,v, e= vex_apx p_00 lock), [0x0a] =3D X86_OP_ENTRYr(CALL_m, E,f64, z= extT0), [0x0b] =3D X86_OP_ENTRYr(CALLF_m, M,p), [0x0c] =3D X86_OP_ENTRYr(JMP_m, E,f64, z= extT0), @@ -1773,10 +1785,11 @@ static const X86OpEntry opcodes_root[256] =3D { [0x76] =3D X86_OP_ENTRYr(Jcc, J,b), [0x77] =3D X86_OP_ENTRYr(Jcc, J,b), =20 - [0x80] =3D X86_OP_GROUP2(group1, E,b, I,b), - [0x81] =3D X86_OP_GROUP2(group1, E,v, I,z), - [0x82] =3D X86_OP_GROUP2(group1, E,b, I,b, chk(i64)), - [0x83] =3D X86_OP_GROUP2(group1, E,v, I,b), + /* decode_group1 is shared with EVEX map4. */ + [0x80] =3D X86_OP_GROUP3(group1, B,b, E,b, I,b), + [0x81] =3D X86_OP_GROUP3(group1, B,v, E,v, I,z), + [0x82] =3D X86_OP_GROUP3(group1, B,b, E,b, I,b, chk(i64)), + [0x83] =3D X86_OP_GROUP3(group1, B,v, E,v, I,b), [0x84] =3D X86_OP_ENTRYrr(TEST, E,b, G,b), [0x85] =3D X86_OP_ENTRYrr(TEST, E,v, G,v), [0x86] =3D X86_OP_ENTRY2(XCHG, E,b, G,b, xchg), @@ -1809,8 +1822,9 @@ static const X86OpEntry opcodes_root[256] =3D { [0xB6] =3D X86_OP_ENTRY3(MOV, LoBits,b, I,b, None, None), [0xB7] =3D X86_OP_ENTRY3(MOV, LoBits,b, I,b, None, None), =20 - [0xC0] =3D X86_OP_GROUP2(group2, E,b, I,b), - [0xC1] =3D X86_OP_GROUP2(group2, E,v, I,b), + /* decode_group2 is shared with EVEX map4. */ + [0xC0] =3D X86_OP_GROUP3(group2, B,b, E,b, I,b), + [0xC1] =3D X86_OP_GROUP3(group2, B,v, E,v, I,b), [0xC2] =3D X86_OP_ENTRYr(RET, I,w), [0xC3] =3D X86_OP_ENTRY0(RET), [0xC4] =3D X86_OP_ENTRY3(LES, G,z, EM,p, None, None, chk(i64)), @@ -1818,10 +1832,11 @@ static const X86OpEntry opcodes_root[256] =3D { [0xC6] =3D X86_OP_GROUP3(group11, E,b, I,b, None, None), /* reg=3D000b= */ [0xC7] =3D X86_OP_GROUP3(group11, E,v, I,z, None, None), /* reg=3D000b= */ =20 - [0xD0] =3D X86_OP_GROUP1(group2, E,b), - [0xD1] =3D X86_OP_GROUP1(group2, E,v), - [0xD2] =3D X86_OP_GROUP2(group2, E,b, 1,b), /* CL */ - [0xD3] =3D X86_OP_GROUP2(group2, E,v, 1,b), /* CL */ + /* decode_group2 is shared with EVEX map4. */ + [0xD0] =3D X86_OP_GROUPwr(group2, B,b, E,b), + [0xD1] =3D X86_OP_GROUPwr(group2, B,v, E,v), + [0xD2] =3D X86_OP_GROUP3(group2, B,b, E,b, 1,b), /* CL */ + [0xD3] =3D X86_OP_GROUP3(group2, B,v, E,v, 1,b), /* CL */ [0xD4] =3D X86_OP_ENTRY2(AAM, 0,w, I,b, chk(i64)), [0xD5] =3D X86_OP_ENTRY2(AAD, 0,w, I,b, chk(i64)), [0xD6] =3D X86_OP_ENTRYw(SALC, 0,b, chk(i64)), @@ -2052,9 +2067,178 @@ static void decode_REX2_map1(DisasContext *s, CPUX8= 6State *env, X86OpEntry *entr decode_REX2(s, env, entry, b, opcode_rex2_map1); } =20 +static void decode_EVEX4cc(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + uint8_t modrm =3D get_modrm(s, env); + int mod =3D (modrm >> 6) & 3; + + static const X86OpEntry setcc =3D + X86_OP_ENTRYw(SETcc, E,b, evex_apx_zu chk(nf0) p_f2); + static const X86OpEntry cfcmov_nd0[2][2] =3D { + { /* NF=3D0 */ + X86_OP_ENTRY3(CFCMOVcc_ld, G,v, ZERO,v, M,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, G,v, ZERO,v, E,v, p_00_66 evex_apx= ), + }, + { /* NF=3D1 */ + X86_OP_ENTRYwr(CFCMOVcc_st, M,v, G,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, E,v, ZERO,v, G,v, p_00_66 evex_apx= ), + }, + }; + static const X86OpEntry cfcmov_nd1[2][2] =3D { + { /* NF=3D0 */ + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= ), + }, + { /* NF=3D1 */ + X86_OP_ENTRY3(CFCMOVcc_ld, B,v, G,v, M,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= ), + }, + }; + + if (s->prefix & PREFIX_REPNZ) { + *entry =3D setcc; + if (EVEX_APX_ND(s)) { + entry->s1 =3D X86_SIZE_q; /* optimization for zu */ + } + } else { + *entry =3D (EVEX_APX_ND(s) ? cfcmov_nd1 : cfcmov_nd0)[EVEX_APX_NF(= s)][mod =3D=3D 3]; + } +} + +static void decode_EVEX4_66(DisasContext *s, CPUX86State *env, X86OpEntry = *entry, uint8_t *b) +{ + entry->gen =3D (s->prefix & PREFIX_DATA) ? gen_ADCX : gen_ADOX; +} + +static void decode_EVEX4_8F(DisasContext *s, CPUX86State *env, X86OpEntry = *entry, uint8_t *b) +{ + int op =3D (get_modrm(s, env) >> 3) & 7; + if (op =3D=3D 0) { + entry->gen =3D gen_POP2; + } else { + *entry =3D UNKNOWN_OPCODE; + } +} + +static void decode_EVEX4_FF(DisasContext *s, CPUX86State *env, X86OpEntry = *entry, uint8_t *b) +{ + static const X86OpEntry push2 =3D + X86_OP_ENTRYrr(PUSH2, B,d64, R,d64, evex_apx_pp2 p_00); + + int op =3D (get_modrm(s, env) >> 3) & 7; + if (op =3D=3D 6) { + *entry =3D push2; + } else { + decode_group4_5(s, env, entry, b); + } +} + +/* + * Missing: ENQCMD, ENQCMDS, INVEPT, INVPCID, INVVPID, + * KMOVD, KMOVW, KMOVD, KMOVQ, MOVDIR64B, MOVDIRI, URDMSR, + * UWRMSR, WRSSD, WRSSQ, WRUSSD, WRUSSQ, LDTILECFG, STTILECFG, + * TILELOADD, TILELOADDDT1, TILESTORED. + */ +static const X86OpEntry opcodes_EVEX_map4[256] =3D { + [0x00] =3D X86_OP_ENTRY3(ADD, B,b, E,b, G,b, evex_apx p_00 lock), + [0x01] =3D X86_OP_ENTRY3(ADD, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0x02] =3D X86_OP_ENTRY3(ADD, B,b, G,b, E,b, evex_apx p_00 lock), + [0x03] =3D X86_OP_ENTRY3(ADD, B,v, G,v, E,v, evex_apx p_00_66 lock), + [0x08] =3D X86_OP_ENTRY3(OR, B,b, E,b, G,b, evex_apx p_00 lock), + [0x09] =3D X86_OP_ENTRY3(OR, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0x0A] =3D X86_OP_ENTRY3(OR, B,b, G,b, E,b, evex_apx p_00 lock), + [0x0B] =3D X86_OP_ENTRY3(OR, B,v, G,v, E,v, evex_apx p_00_66 lock), + + [0x10] =3D X86_OP_ENTRY3(ADC, B,b, E,b, G,b, evex_apx p_00 chk(nf0) lo= ck), + [0x11] =3D X86_OP_ENTRY3(ADC, B,v, E,v, G,v, evex_apx p_00_66 chk(nf0)= lock), + [0x12] =3D X86_OP_ENTRY3(ADC, B,b, G,b, E,b, evex_apx p_00 chk(nf0) lo= ck), + [0x13] =3D X86_OP_ENTRY3(ADC, B,v, G,v, E,v, evex_apx p_00_66 chk(nf0)= lock), + [0x18] =3D X86_OP_ENTRY3(SBB, B,b, E,b, G,b, evex_apx p_00 chk(nf0) lo= ck), + [0x19] =3D X86_OP_ENTRY3(SBB, B,v, E,v, G,v, evex_apx p_00_66 chk(nf0)= lock), + [0x1A] =3D X86_OP_ENTRY3(SBB, B,b, G,b, E,b, evex_apx p_00 chk(nf0) lo= ck), + [0x1B] =3D X86_OP_ENTRY3(SBB, B,v, G,v, E,v, evex_apx p_00_66 chk(nf0)= lock), + + [0x20] =3D X86_OP_ENTRY3(AND, B,b, E,b, G,b, evex_apx p_00 lock), + [0x21] =3D X86_OP_ENTRY3(AND, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0x22] =3D X86_OP_ENTRY3(AND, B,b, G,b, E,b, evex_apx p_00 lock), + [0x23] =3D X86_OP_ENTRY3(AND, B,v, G,v, E,v, evex_apx p_00_66 lock), + [0x24] =3D X86_OP_ENTRY4(SHLD, B,v, E,v, G,v, evex_apx p_00_66), + [0x28] =3D X86_OP_ENTRY3(SUB, B,b, E,b, G,b, evex_apx p_00 lock), + [0x29] =3D X86_OP_ENTRY3(SUB, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0x2A] =3D X86_OP_ENTRY3(SUB, B,b, G,b, E,b, evex_apx p_00 lock), + [0x2B] =3D X86_OP_ENTRY3(SUB, B,v, G,v, E,v, evex_apx p_00_66 lock), + [0x2C] =3D X86_OP_ENTRY4(SHRD, B,v, E,v, G,v, evex_apx p_00_66), + + [0x30] =3D X86_OP_ENTRY3(XOR, B,b, E,b, G,b, evex_apx p_00 lock), + [0x31] =3D X86_OP_ENTRY3(XOR, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0x32] =3D X86_OP_ENTRY3(XOR, B,b, G,b, E,b, evex_apx p_00 lock), + [0x33] =3D X86_OP_ENTRY3(XOR, B,v, G,v, E,v, evex_apx p_00_66 lock), + [0x38] =3D X86_OP_ENTRYrr(CMP, E,b, G,b, evex_apx_cmp p_00), + [0x39] =3D X86_OP_ENTRYrr(CMP, E,v, G,v, evex_apx_cmp p_00_66), + [0x3A] =3D X86_OP_ENTRYrr(CMP, G,b, E,b, evex_apx_cmp p_00), + [0x3B] =3D X86_OP_ENTRYrr(CMP, G,v, E,v, evex_apx_cmp p_00_66), + + [0x40] =3D X86_OP_GROUP0(EVEX4cc), + [0x41] =3D X86_OP_GROUP0(EVEX4cc), + [0x42] =3D X86_OP_GROUP0(EVEX4cc), + [0x43] =3D X86_OP_GROUP0(EVEX4cc), + [0x44] =3D X86_OP_GROUP0(EVEX4cc), + [0x45] =3D X86_OP_GROUP0(EVEX4cc), + [0x46] =3D X86_OP_GROUP0(EVEX4cc), + [0x47] =3D X86_OP_GROUP0(EVEX4cc), + [0x48] =3D X86_OP_GROUP0(EVEX4cc), + [0x49] =3D X86_OP_GROUP0(EVEX4cc), + [0x4A] =3D X86_OP_GROUP0(EVEX4cc), + [0x4B] =3D X86_OP_GROUP0(EVEX4cc), + [0x4C] =3D X86_OP_GROUP0(EVEX4cc), + [0x4D] =3D X86_OP_GROUP0(EVEX4cc), + [0x4E] =3D X86_OP_GROUP0(EVEX4cc), + [0x4F] =3D X86_OP_GROUP0(EVEX4cc), + + [0x60] =3D X86_OP_ENTRYwr(MOVBE, G,v, M,v, evex_apx cpuid(M= OVBE) chk(nf0) p_00_66), + [0x61] =3D X86_OP_ENTRYwr(MOVBE, M,v, G,v, evex_apx cpuid(M= OVBE) chk(nf0) p_00_66), + [0x66] =3D X86_OP_GROUP3(EVEX4_66, B,y, G,y, E,y, evex_apx cpuid(A= DX) chk(nf0) p_66_f3), + + [0x80] =3D X86_OP_GROUP3(group1, B,b, E,b, I,b, evex_apx p_00), + [0x81] =3D X86_OP_GROUP3(group1, B,v, E,v, I,z, evex_apx p_00_66= ), + [0x83] =3D X86_OP_GROUP3(group1, B,v, E,v, I,b, evex_apx p_00_66= ), + [0x84] =3D X86_OP_ENTRYrr(TEST, E,b, G,b, evex_apx_cmp p_0= 0_66), + [0x85] =3D X86_OP_ENTRYrr(TEST, E,v, G,v, evex_apx_cmp p_0= 0_66), + [0x88] =3D X86_OP_ENTRYwr(POPCNT, G,v, E,v, evex_apx cpuid(P= OPCNT) zextT0 p_00_66), + [0x8F] =3D X86_OP_GROUPw(EVEX4_8F, R,d64, /* B,d64 */ evex_apx_pp2 p_0= 0), + + [0xA4] =3D X86_OP_ENTRY4(SHLD, B,v, E,v, G,v, evex_apx p_00_66= ), + [0xA5] =3D X86_OP_ENTRY3(SHLD, B,v, E,v, G,v, evex_apx p_00_66= ), + [0xAC] =3D X86_OP_ENTRY4(SHRD, B,v, E,v, G,v, evex_apx p_00_66= ), + [0xAD] =3D X86_OP_ENTRY3(SHRD, B,v, E,v, G,v, evex_apx p_00_66= ), + /* + * Note that unlike the non-APX version this cannot place the Ev + * operand in T0, because Bv rewrites op1 to OP_TYPE_2op if NDD=3D0. + */ + [0xAF] =3D X86_OP_ENTRY3(IMUL3, B,v, G,v, E,v, evex_apx sextT0 = p_00_66), + + [0xC0] =3D X86_OP_GROUP3(group2, B,b, E,b, I,b, evex_apx p_00), + [0xC1] =3D X86_OP_GROUP3(group2, B,v, E,v, I,b, evex_apx p_00_66= ), + + [0xD0] =3D X86_OP_GROUPwr(group2, B,b, E,b, evex_apx p_00), + [0xD1] =3D X86_OP_GROUPwr(group2, B,v, E,v, evex_apx p_00_66= ), + [0xD2] =3D X86_OP_GROUP3(group2, B,b, E,b, 1,b, evex_apx p_00), = /* CL */ + [0xD3] =3D X86_OP_GROUP3(group2, B,v, E,v, 1,b, evex_apx p_00_66= ), /* CL */ + + [0xF0] =3D X86_OP_ENTRY2(CRC32, G,d, E,b, evex_apx cpuid(S= SE42) chk(nf0) p_00), + [0xF1] =3D X86_OP_ENTRY2(CRC32, G,d, E,v, evex_apx cpuid(S= SE42) chk(nf0) p_00_66), + [0xF4] =3D X86_OP_ENTRYwr(TZCNT, G,v, E,v, evex_apx zextT0 = p_00_66), + [0xF5] =3D X86_OP_ENTRYwr(LZCNT, G,v, E,v, evex_apx zextT0 = p_00_66), + [0xF6] =3D X86_OP_GROUP1(group3, E,b), + [0xF7] =3D X86_OP_GROUP1(group3, E,v), + [0xFE] =3D X86_OP_GROUP1(group4_5, E,b), + [0xFF] =3D X86_OP_GROUP1(EVEX4_FF, E,v), +}; + static void decode_EVEX_map4(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) { - *entry =3D UNKNOWN_OPCODE; + *b =3D x86_ldub_code(env, s); + *entry =3D opcodes_EVEX_map4[*b]; } #endif =20 @@ -2071,6 +2255,10 @@ static void decode_EVEX_map4(DisasContext *s, CPUX86= State *env, X86OpEntry *entr #undef vex11 #undef vex12 #undef vex13 +#undef evex_apx +#undef evex_apx_cmp +#undef evex_apx_pp2 +#undef evex_apx_zu =20 static void decode_root(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) { @@ -2524,6 +2712,11 @@ static bool decode_op(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decode, op->n =3D type - X86_TYPE_ES; op->unit =3D X86_OP_SEG; break; + + case X86_TYPE_ZERO: + op->unit =3D X86_OP_IMM; + decode->immediate =3D op->imm =3D 0; + break; } =20 return true; diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 48181182aa7..1144953abb1 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1644,6 +1644,30 @@ static void gen_CMC(DisasContext *s, X86DecodedInsn = *decode) tcg_gen_xori_tl(cpu_cc_src, cpu_cc_src, CC_C); } =20 +#ifdef TARGET_X86_64 +static void gen_CFCMOVcc_ld(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *label_false =3D gen_new_label(); + int cond =3D decode->b & 0xf; + MemOp ot =3D decode->op[2].ot; + + gen_jcc_noeob(s, cond ^ 1, label_false); + gen_op_ld_v(s, ot, s->T0, s->A0); + gen_set_label(label_false); +} + +static void gen_CFCMOVcc_st(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *label_false =3D gen_new_label(); + int cond =3D decode->b & 0xf; + MemOp ot =3D decode->op[0].ot; + + gen_jcc_noeob(s, cond ^ 1, label_false); + gen_op_st_v(s, ot, s->T0, s->A0); + gen_set_label(label_false); +} +#endif + static void gen_CMOVcc(DisasContext *s, X86DecodedInsn *decode) { gen_cmovcc(s, decode->b & 0xf, s->T0, s->T1); @@ -3140,6 +3164,24 @@ static void gen_PMOVMSKB(DisasContext *s, X86Decoded= Insn *decode) } } =20 +#ifdef TARGET_X86_64 +static void gen_POP2(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *aligned =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_TSTEQ, cpu_regs[R_ESP], 15, aligned); + gen_helper_raise_gpf(tcg_env); + gen_set_label(aligned); + + gen_lea_ss_ofs(s, s->A0, cpu_regs[R_ESP], 0); + gen_op_ld_v(s, MO_64, cpu_regs[s->vex_v], s->A0); + + tcg_gen_addi_tl(s->A0, s->A0, 8); + gen_op_ld_v(s, MO_64, s->T0, s->A0); + gen_pop_update(s, MO_128); +} +#endif + static void gen_POP(DisasContext *s, X86DecodedInsn *decode) { X86DecodedOp *op =3D &decode->op[0]; @@ -3337,6 +3379,19 @@ static void gen_PSLLDQ_i(DisasContext *s, X86Decoded= Insn *decode) } } =20 +#ifdef TARGET_X86_64 +static void gen_PUSH2(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *aligned =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_TSTEQ, cpu_regs[R_ESP], 15, aligned); + gen_helper_raise_gpf(tcg_env); + gen_set_label(aligned); + gen_push_v(s, s->T0); + gen_push_v(s, s->T1); +} +#endif + static void gen_PUSH(DisasContext *s, X86DecodedInsn *decode) { gen_push_v(s, s->T0); --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661097; cv=none; d=zohomail.com; s=zohoarc; b=KQqU26aOUuWcIbU26OrUoIhpMmmZrhDeYE3uVLamK971fvDkvbpX6p22reaEpgSRpiuwuRuKMZ2oG3qAE//jGMYYLVQPjp7dESLQwX2rVzQe6/xB6V7rrJ/qIiHs7/bRUDUu4tOrAN2iDhYjhTuA0Ooj+ki6Jgd9jsly0SpoFRo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661097; h=Content-Transfer-Encoding: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:Cc; bh=16X1xBZPA6wfWb+bX9FtyS6bqUNIjSAl6ADzdUkrS7A=; b=dIO3a8MwgPA6VxI69v/bED4pdzGlbgOMEO6vxylwYnz4wxlu/XLhdP86QMZGZjM6KRTXkdOje6b3jpbR5pi1n7iPIHhzzsllY2hr6vBZiGzPdDP23lng766VtRR7hSNdsZ5Uwgwv28QEJYrKWyTirAQpT32tvNa5cfPyWTyCdZM= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661097949236.40379317635313; Tue, 25 Aug 2026 05:31:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqIE-0004uH-3e; Tue, 25 Aug 2026 08:30:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqIB-0004py-OY for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:15 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqI9-0000kU-SD for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:15 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-448-ULYaGZ43O4a9HRuHo2lL5Q-1; Tue, 25 Aug 2026 08:30:10 -0400 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c15fff01a30so295113766b.1 for ; Tue, 25 Aug 2026 05:30:10 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2496738e8bsm1693574966b.44.2026.08.25.05.30.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:30:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787661013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=16X1xBZPA6wfWb+bX9FtyS6bqUNIjSAl6ADzdUkrS7A=; b=CDUzXdRCJ7JCA0WqJtsd7kCKWoAFQ6dDycPSOK8/8c2GSLQ0fSRh/O1+zn0xaNddiOkbrX f75gibvusp3scOlwamBZK8qrhcwfvRr0Jtn9QEazF5Ux2+lYHqjthOGOdzSO/nYXWpaLML oltV3rQD6+m8YzARcdG3uOBYnEPOFeM= X-MC-Unique: ULYaGZ43O4a9HRuHo2lL5Q-1 X-Mimecast-MFC-AGG-ID: ULYaGZ43O4a9HRuHo2lL5Q_1787661009 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787661009; x=1788265809; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=16X1xBZPA6wfWb+bX9FtyS6bqUNIjSAl6ADzdUkrS7A=; b=WlOUiMzfxTIPDec1fhzH7BkYI59ogoeqhoHYW4o37SgbiBWVT1KH6sPkeTBOeZS7NG lkwgg8N9+4TtbLxxX/mO4E7rhlaEoMYVFtZhLH8eGhrsELy1iRa2jgnyWQartP2eIZtx vgr/voiczbnQcMRtNOBKpMGImtvH0XfLNlERKvAtfwXBE9r8dXJVU+xRN+2a/2hG1qTP ycdXf/YNuEyXM+RmBVq40M97yZmR0riGonpIzbXbJlcM2BFdP4WgKPFFnthrCCJRIqzX shxdQciE2WZ53zDw0afbjZT+0RSFkAVOh788MWmhZLMs3EYUOrwRMQnDF/OOsbP4P8sJ PG2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787661009; x=1788265809; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=16X1xBZPA6wfWb+bX9FtyS6bqUNIjSAl6ADzdUkrS7A=; b=NmFcEF0enk4GSfbLDb4Lr7SlWH/Map3fqhmylfkEMoDCT2qeo8l9Zo+5kfmN67eGvA RnQjqYZhGQbrnwjpISEHBRHHtxN1MzD/wkqzbm01OI+/9QTYxRQ5kc8hekZkxSnGd8c5 R4R6QIHVdtAOzITVf5DP1Af7oEiJwfAK10bI+3p8gPN1pGvA01Nh/b4dPcqaCZPHoFuP ITHW5WZ+g/eqzl685WMD3A/1wHYqaNDsO0szxEF+2Id2UxexsOgllUS1nyFqLeG2PN9+ eMnDoILmfTVC4UvS470q6cQXkFSHWw+BEwAc5EQ/ZeD3DjDDQoKbOMS299kL0rqLdCHo Iacg== X-Gm-Message-State: AFuF++mYIhu4Yk68ty49PSlkLk3XKvwUPVkipYSWbrzumKQZF1wG1Fvo ubyHwUlBd9PvdxYoCC+ZKA0udmcMYT9pVIv+YH26YbWPaA/tltgM6jyoE1Y4bv23OwHUGyoViyr PUJaAbey8BxI6EcVxQbTiQ6UnuPb85RUlO6GEqvvkVA5/oC0sYiRlOx2tNDznnIfhOBHKJQsdBW ujcmxJAxGMGqmeLREFt1LF6KBN9GYtm0vaCXIDdtHT X-Gm-Gg: AR+sD123esPk2gAYokONalXB6eg1JxVNaNeeXzfdBRfCyn1TRFzxcOLtAvMv3aoajtO Bz7vFjw5bDHivFe45lufT0xfG9nJX9xxH1iqh/6PqnSE1XcQEM7hRjJc0eUFAm7Kvcn7+n5cxYP Z80gTfq+4ANgGgUZo+ujlnrWzk3gMRto49E6qaNg8k/VVEVlq4CShPU3XYBYzpvBHmah47Tlqhc NB0yqhgH84Nk8dyUyRp1EhZpOHcOlqo3PyASKv5G5lhGWIo761vdPaY/gmV86ZWwa8G1NIEIrCh JU3yogObyy2qVZvaxiAAHEy7SbyGtTO/8EiQkZ6Ka9zHw3pwhdhJH0z/bELxN/1ogyiGfoFjzN9 btWvafBgvHdJFEsO4z8tyWxyBxF7fTySLRAg1K6Q79xJArc5k7pjzUk7404jyDgP2s4eWb8tY94 xkSw== X-Received: by 2002:a17:907:1ca7:b0:c20:33db:41d3 with SMTP id a640c23a62f3a-c24e5ade69dmr729784766b.11.1787661009380; Tue, 25 Aug 2026 05:30:09 -0700 (PDT) X-Received: by 2002:a17:907:1ca7:b0:c20:33db:41d3 with SMTP id a640c23a62f3a-c24e5ade69dmr729775066b.11.1787661008801; Tue, 25 Aug 2026 05:30:08 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 19/20] target/i386/tcg: mark APX as supported Date: Tue, 25 Aug 2026 14:29:20 +0200 Message-ID: <20260825122921.431739-20-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661099214158500 Content-Type: text/plain; charset="utf-8" Finally allow TCG to set the CPUID bit for the APXF feature. The effect of APX is about 0.5% larger binaries and about 1% less TCG ops. QEMU seems to produce about 1% *more* assembly instructions, because the optimizer could already produce roughly the same ops as NDD or NF instructions, and the new PUSH2/POP2 instructions include a stack alignment check that isn't there in non-APX code. Signed-off-by: Paolo Bonzini --- configs/targets/x86_64-bsd-user.mak | 2 +- configs/targets/x86_64-linux-user.mak | 2 +- target/i386/cpu.c | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/configs/targets/x86_64-bsd-user.mak b/configs/targets/x86_64-b= sd-user.mak index d754186347f..26b7cfad4e2 100644 --- a/configs/targets/x86_64-bsd-user.mak +++ b/configs/targets/x86_64-bsd-user.mak @@ -1,4 +1,4 @@ TARGET_ARCH=3Dx86_64 TARGET_BASE_ARCH=3Di386 -TARGET_XML_FILES=3D i386-64bit.xml +TARGET_XML_FILES=3D i386-64bit.xml i386-64bit-apx.xml TARGET_LONG_BITS=3D64 diff --git a/configs/targets/x86_64-linux-user.mak b/configs/targets/x86_64= -linux-user.mak index 7f9527fd1de..cad68746bdb 100644 --- a/configs/targets/x86_64-linux-user.mak +++ b/configs/targets/x86_64-linux-user.mak @@ -2,5 +2,5 @@ TARGET_ARCH=3Dx86_64 TARGET_BASE_ARCH=3Di386 TARGET_SYSTBL_ABI=3Dcommon,64 TARGET_SYSTBL=3Dsyscall_64.tbl -TARGET_XML_FILES=3D i386-64bit.xml i386-64bit-linux.xml +TARGET_XML_FILES=3D i386-64bit.xml i386-64bit-linux.xml i386-64bit-apx.xml TARGET_LONG_BITS=3D64 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index e5ffb10d156..e966bd8049b 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -1005,7 +1005,7 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t ven= dor1, #define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \ CPUID_7_1_EAX_FSRC | CPUID_7_1_EAX_CMPCCXADD) #define TCG_7_1_ECX_FEATURES 0 -#define TCG_7_1_EDX_FEATURES 0 +#define TCG_7_1_EDX_FEATURES CPUID_7_1_EDX_APXF #define TCG_7_2_EDX_FEATURES 0 #define TCG_APM_FEATURES 0 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT @@ -1554,7 +1554,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] =3D { }, .tcg_features =3D XSTATE_FP_MASK | XSTATE_SSE_MASK | XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK | - XSTATE_PKRU_MASK, + XSTATE_PKRU_MASK | XSTATE_APX_MASK, .migratable_flags =3D XSTATE_FP_MASK | XSTATE_SSE_MASK | XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK | XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_M= ASK | @@ -9722,6 +9722,17 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **er= rp) * inside x86_cpu_parse_featurestr() too. */ if (xcc->max_features) { + /* + * TCG supports both MPX and APX. Since they they cannot be enabl= ed together, + * disable one---prefer APX if none was chosen explicitly. + */ + if ((x86_cpu_get_supported_feature_word(cpu, FEAT_7_1_EDX) & CPUID= _7_1_EDX_APXF) && + env->user_features[FEAT_7_0_EBX] & CPUID_7_0_EBX_MPX) { + feature_word_info[FEAT_7_1_EDX].no_autoenable_flags |=3D CPUID= _7_1_EDX_APXF; + } else { + feature_word_info[FEAT_7_0_EBX].no_autoenable_flags |=3D CPUID= _7_0_EBX_MPX; + } + for (w =3D 0; w < FEATURE_WORDS; w++) { /* Override only features that weren't set explicitly * by the user. --=20 2.55.0 From nobody Sat Sep 26 21:37:21 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1787661084; cv=none; d=zohomail.com; s=zohoarc; b=eYMBEljZl/4JkLJpiIzVJFWShZ0WxKpiqYrxdpKWx5i8sHnPsQDD0JYRVbkHXUSFcyBt5DUolQkJbBqbQKKOUrZfmnpOjdqAwa4urHM0ldzRf3+gt9LgIFA8+UtTVo5MY+ee3fLj9iqh0QM5AtA3i7cm+ms9L0uldJFsq7t+NB4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787661084; h=Content-Transfer-Encoding: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:Cc; bh=DyxeCggo7uPr+hvGJI/JQMliRIq8OGfljSD0+Pgo2TY=; b=fB+WnWbvrWu7hQ0orHfa2N73qRmqVCA78KIySVzd0+c5zfJsRHGHX8W/m6SnmhhCeGB5UsINTA9TNWT6iUzdwlYjrg4ZRBBItA7GlGdvvimzx6hU4pbSmlXsLqKlyFM02XEJdGofCqOlpQdzIhPF28wodx8dundWhGr5BfTwE24= 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=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787661084247272.89313360248184; Tue, 25 Aug 2026 05:31:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wyqIF-0004xS-1w; Tue, 25 Aug 2026 08:30:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqID-0004tR-KG for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:17 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wyqIB-0000lN-Vw for qemu-devel@nongnu.org; Tue, 25 Aug 2026 08:30:17 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-659-2OI7uaKKMd-XajFwS8xq6Q-1; Tue, 25 Aug 2026 08:30:13 -0400 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-c15e555a164so76604666b.1 for ; Tue, 25 Aug 2026 05:30:13 -0700 (PDT) Received: from [192.168.10.48] ([151.95.34.92]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c249685ab63sm1704746366b.50.2026.08.25.05.30.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 05:30:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787661015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DyxeCggo7uPr+hvGJI/JQMliRIq8OGfljSD0+Pgo2TY=; b=IL74Y3qeQsvreVWda8rXMF5qbPY0UGxcRc2yGbbBjEhjFO3HSq8Eb9fAwLwHEfYuPxslQx YZkpXR7TeY2k1PVjvdhnXdAfyWgIhMv5PItvpZrkbDzWUCkTrBVhIOPSQ5mUFeldmH2IX+ mwnY2tzRbl7kGea7j2VGOzcc1jiBBBY= X-MC-Unique: 2OI7uaKKMd-XajFwS8xq6Q-1 X-Mimecast-MFC-AGG-ID: 2OI7uaKKMd-XajFwS8xq6Q_1787661012 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1787661012; x=1788265812; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=DyxeCggo7uPr+hvGJI/JQMliRIq8OGfljSD0+Pgo2TY=; b=ONX3w9OP+YWxGtMCDs0HpLDpyjUeDkywZ3bdMX1+k11nTdwwaJEhCgnKIpjH3FOvyZ 5GznizxgyUwHFQ9i4WppkeKl+DvlGNu1c95F+MclSEj6+NvkCIrWJUIF6wJPAVRibYCY DeyqpKdh35uxVfFpQLBWtShmbRUV41rFWjJMwhM0/jz5k2S8pR1wh9gAsV+w6ZtoTS8h T+Uznhk2qwDeVXdCMNIBcLvIjMMEqza2RUpzLqQrTDMaSD9vN8Wa6TlUHzOGgMGEL8e7 utZtRTHtPJ5eqQ4czzrjE8DuWRh9Akr3cu1rQGTNv5Dpyt7QG2Dawy3wTS5AwdcocZYL FVgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787661012; x=1788265812; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=DyxeCggo7uPr+hvGJI/JQMliRIq8OGfljSD0+Pgo2TY=; b=GsrMuABkRRRMx2CsvyHJMSLwapbCT+3J1qdzcajj4C/LURW7bmI7tQpLgci8rTLIx9 vqx/nvxTIDHrSYOxPeId4GcrVfodFn0G6LFAZk2HW2/OixkgqiwUdy42Am2IlGzHchLk PLr1U9SEvPuNy9Cu7w1LmlYklVFQZ1rcCw9bdvXqEDk94j0K89q7Vey+X3mx5UoJDuPy N4upDwnInHMBKRZktqVWMWZ5denRBCwRDvH8yTbcOdbYWzIpzg9Cjpes/I2kFySuksT6 k+zSoz7sDJ3xWEXnaOLhkOxaCmR8Jf8MV+8sXDd4szkL+TG1XYvPcf61DSGu2EwJuadC tkEQ== X-Gm-Message-State: AFuF++nLfEFb5GLsxKwV0fNZcMInJm9DgXQbazBnfCRT3NTe44WK6c00 Bsr+A7WZ5H+0VfK9ORC+qjGow1RGvvqkM1+yz8aorCfH+c62j5lg47/zxC9E4qGL/62DCs+3Opf uq1ZhKrLEHBSKpf8LY3nTaMDVDOuv05ekxvObm2Jact4boCnNYCj2iO8pSvEVWM4Nnl457DgvDP 4GSIS7THOdtHfsOQZi48vyJLsogbO3MQGbieE6s3sQ X-Gm-Gg: AR+sD13do7YKyKQLDo3Xxd1pOEf+XkGb0rl6zPzpa5NoEs6sND3PagETCSyWuqcXAEt 1fhi3rbTmajMipLMxQQEHHwCWkR0JrK2DJF+UaWTLNqD8UA4PgMxE2aHV5I880DvTECab7mIOlN sbHycV4hQIdbdoSxctrjlQc+dQoqrxvZ+Ht4sLAbqV6e5M965qbCgkrNjbNi1P702VPT30Ff4Fl DEF+IQcC59Ot9IT8+o9SakAqNhBsOSKF994zNRBUBPCY45wFvDDZ/SLiZRG6d+I9+vbhXeucfSi bDY2J9CdXkL5L2I9u4pmxI9A2HeVtdGFOwaiNtD0Ip2na5pGhV63QatlPfzkyviBbRlsSnDCZwg wqZd1+CyGwlL7D8V1H7LyC45V6OYoBxCMA6yD/JR13h+S5HaAlz16bP1+FPlPtm+0wS0aPK8g8D ioaw== X-Received: by 2002:a17:907:a0cf:b0:c1c:49d9:4c34 with SMTP id a640c23a62f3a-c24e2db3d7bmr770483766b.11.1787661012387; Tue, 25 Aug 2026 05:30:12 -0700 (PDT) X-Received: by 2002:a17:907:a0cf:b0:c1c:49d9:4c34 with SMTP id a640c23a62f3a-c24e2db3d7bmr770474266b.11.1787661011628; Tue, 25 Aug 2026 05:30:11 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 20/20] target/i386/tcg: optimize CCMP Date: Tue, 25 Aug 2026 14:29:21 +0200 Message-ID: <20260825122921.431739-21-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825122921.431739-1-pbonzini@redhat.com> References: <20260825122921.431739-1-pbonzini@redhat.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1787661085112158500 Content-Type: text/plain; charset="utf-8" If possible, modify conditionally the input arguments to generate the flags requested by dfv; this way CCMP can use CC_OP_SUB* instead of having to compute the carry-out vector by hand. This happens relatively often for dfv=3D0, and also for dfv=3Dsf for code produced by clang. Of the combinations that cannot be optimized, both GCC and clang generate dfv=3Dzf. GCC also generates OS and OSZ. Do not bother doing this for CTEST; the savings are modest because it does not need complex code to compute the carry-out vector (CC_SRC is always 0). In addition, trivially replacing the arguments to the AND would only support dfv=3D0 (produced by -2 & 2) or dfv=3DS (produced by -2 & -2), because TEST cannot produce any value where CF or OF are not zero. Signed-off-by: Paolo Bonzini --- target/i386/tcg/emit.c.inc | 56 ++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 1144953abb1..7641b2fc104 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1749,6 +1749,53 @@ static void gen_dfv_movcond(DisasContext *s, X86Deco= dedInsn *decode, int cond, u decode->cc_dst, tcg_constant_tl(dst)); } =20 +static bool gen_ccmp_movcond(DisasContext *s, int cond, uint32_t dfv, MemO= p ot) +{ + target_ulong op0, op1, max_int; + if (cond =3D=3D CCMP_T) { + return true; + } + + /* + * For some values of dfv, it's possible to overwrite operands + * instead of using CC_OP_CCMP. The weird "16"s are to set AF=3D=3D0. + */ + max_int =3D MAKE_64BIT_MASK(0, (8 << ot) - 1); + switch(dfv) { + case 0: + op0 =3D 1, op1 =3D 0; + break; + case CC_P|CC_C: + op0 =3D 1, op1 =3D -16; + break; + case CC_S: + op0 =3D -3, op1 =3D 0; + break; + case CC_S|CC_P|CC_C: + op0 =3D 0, op1 =3D 16; + break; + case CC_O: + /* + * While for >8-bit results -max_int has 1 in the lower byte, for = 8-bit + * results -max_int is 0x81, so it flips the parity flag. Compens= ate + * in op1. + */ + op0 =3D -max_int, op1 =3D 16 + (ot =3D=3D MO_8); + break; + case CC_O|CC_S|CC_P|CC_C: + /* Same here. */ + op0 =3D max_int, op1 =3D -1 - (ot =3D=3D MO_8); + break; + default: + return false; + } + + CCPrepare cc =3D gen_prepare_cc(s, cond, NULL); + tcg_gen_movcond_tl(cc.cond, s->T0, cc.reg, cc.reg2, s->T0, tcg_constan= t_tl(op0)); + tcg_gen_movcond_tl(cc.cond, s->T1, cc.reg, cc.reg2, s->T1, tcg_constan= t_tl(op1)); + return true; +} + static void gen_SUB(DisasContext *s, X86DecodedInsn *decode); static void gen_CMP(DisasContext *s, X86DecodedInsn *decode) { @@ -1757,16 +1804,15 @@ static void gen_CMP(DisasContext *s, X86DecodedInsn= *decode) MemOp ot =3D decode->op[1].ot; TCGv cout; =20 - switch (cond) { - case CCMP_T: + if (gen_ccmp_movcond(s, cond, dfv, ot)) { + /* Including CCMP_T, aka "normal" CMP. */ gen_SUB(s, decode); return; - case CCMP_F: + } + if (cond =3D=3D CCMP_F) { decode->cc_op =3D CC_OP_EFLAGS; decode->cc_src =3D tcg_constant_tl(dfv); return; - default: - break; } =20 decode->cc_op =3D CC_OP_CCMPB + ot; --=20 2.55.0