From nobody Sun Sep 27 21:12:12 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=1790184723; cv=none; d=zohomail.com; s=zohoarc; b=CowXYpWuYhJJAnix5lwoQtEx3zcu7QCk/G+p4LX5cV5RfKzbEZ08fdDaRaXtp6K9B9lbAdT+CBtMLNXPiLFgK74iLjGtldlKz0z7OiaB08LFpMBnON/CBciyH8Vo3DgrPKATdYb+ZjNrklX92DlSMoDoRU05AmrSzm8JEv2CQCE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184723; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=MuRC7n0+gw4SOha1luYw+NxRqCsnfBNhqiW7oZ+36/w=; b=V5z8/IUSYprPbwHVaivesGUtux088L7K1H36cRSDiPSxYjorFnpQ53hC5e/EfSzzGTw4s7DdQC1LOaJt5v0+h63bYZoQoLlnR9PQXLQdz5TGn4zip3oXJiomTIjuWa3sNy83xjb/vOJepoDMJnVGeUCQGxNqet9xo57sNU6Q2DM= 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 1790184723718293.69435500038276; Wed, 23 Sep 2026 10:32:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qof-0006x8-Ut; Wed, 23 Sep 2026 13:31:46 -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 1x9Qnf-0006d1-UT for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:33 -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 1x9Qne-0003gn-3y for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:31 -0400 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-519-KmRGN7FKNzq6ITYgCZvfLQ-1; Wed, 23 Sep 2026 13:30:25 -0400 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-49ccfad90f1so10165305e9.0 for ; Wed, 23 Sep 2026 10:30:25 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fdf9691e2sm81738145e9.1.2026.09.23.10.30.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184629; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MuRC7n0+gw4SOha1luYw+NxRqCsnfBNhqiW7oZ+36/w=; b=UQz3yuqMQueiAjTSqnLfEoR1iRO8xw3ngQAaMJlOAryuIF3Z7hsYEt0hDVwq1adNMPKSJq YKvfOgiKPVwruo9m808rsAHQG2lNW59IQzg9O4P+6PiWoHVlMJtp/YPvy73kx4EUE+B00m epEXXCgf6j0P9U2Yb1s9IZpAIkqD2Rs= X-MC-Unique: KmRGN7FKNzq6ITYgCZvfLQ-1 X-Mimecast-MFC-AGG-ID: KmRGN7FKNzq6ITYgCZvfLQ_1790184624 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184624; x=1790789424; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=MuRC7n0+gw4SOha1luYw+NxRqCsnfBNhqiW7oZ+36/w=; b=OIKWHSBn+xu76x1j+eeNxpGcrt+ZfQqjYW21Q6N/E5PyQyBhBe9xuiIjR7o+nL96Sk U4u5cC4dT6/kfJLvHPgEzydP40sj9Au1xcNCHN7Ur2DxhNqXSSYNOn0UlpCWgnY//2zY Kv3urgBS0bzwjMKH4K03mQXtoZBpncV6t3Iti5wBDZM/JTGS6gubuLN3WwKt7ccDNwdD mrZlHx4UTKk+MStF0mq9jLdPEH3Ajz5c4twhRjMiOzMQu4AiCCs8Qpmi6uIl/esSZ5rv As7eZ43LZE1aZxrOb//rmpwanN0C3170g+MJk7gnc9kJm47DIXVuVaE6kDoBE8zWaX4L tfrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184624; x=1790789424; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=MuRC7n0+gw4SOha1luYw+NxRqCsnfBNhqiW7oZ+36/w=; b=YdJKe95QVudZGidYLYZrLMlcWyaowJ14uL2FFir+B1ZHZksiLaZQphgZegg9q8cb6n uyjkgZbJDx7HDqSwN/TLh0UMDki/XJx1aWhMA+QFJFdPTwRl8AaDTTrOHPF1LBvd4cUZ vH9vITbW173whNJ74eierm1Q1mvTjXEDzE4T3andqMuaX9bFxlzfxpbGADZ8Yqi4ZBV3 VNc4AiQGQfL/ph1lYi2Ro7SF4VYrUWtGZE4IzdD62teUCl3poHa8pVRuMi0JFt3GQSmD SZJvH8EySyNUul4/R+b1Zzk1EAHihqP+uPZusinFY+BnmOIkWDmrkIGocGrmfty2yHuZ cJcQ== X-Gm-Message-State: AFuF++kMp9b8aLn0bjI5WjGoeOS5z7KxE/88rNNMcO4eB2nB5vB0PGkx wzftxWUGXq14hqMojGdksHuYSmfgAesB+BTntvyCVB2kZtKG3Od1FOKKOshZI0JP51tqwC7EpkZ O8vO7f5BeHkBLCjrw1pWTi7O90GPiuuzOsi2SpOkmfZx5rCLUXxyjIkjBGydY5DiCaW9fXDM3Hc rqBQTXN3X+t6fzhLbmGPXo/1SpEPDmtgNuUhqTC/F+ X-Gm-Gg: AYBFou3tGFG42HRvLHJuvVKoC156TMq0KjWkHtKEF4NvYBRtq4PhepW7lTh2B8VOida ObackVab4HM43MX23jPAkLIDRJYtlq6IN0Tu7rDE4/5zTXw7XQifLVPxiFmbULSqeu89Ns9lCoe fy5jrSR4Ah2DP/FqMPtC6G8WWFCZO7Yrz69yRBgDmGSL/uAxQfvOuLzfrpwQuOX4V8Y3BxTYrbp 7AtygIv+A2PV9gWz6CohEUmPlQR8EgPcvm/RCT6J8QAqCjDLAkT3dEqVuJKWcevIHfcp6AI8nL8 ZzG5xJUi4eXai1vOO1DUblBU91O9LdfOIeDF1xIlvbOhpKUcduLuPwjY50dsMZJDfAA/Z4C40+R GPsr4KaewRuclDkTvB1mquAHj8K7ihMRjQ0sbSXafREbMTPZQjZc7EToLo/NNVeTzywh4aV6nDJ +Skb8z X-Received: by 2002:a05:600c:3b88:b0:49f:cc2a:f73a with SMTP id 5b1f17b1804b1-49fdf1454dfmr55059835e9.25.1790184624385; Wed, 23 Sep 2026 10:30:24 -0700 (PDT) X-Received: by 2002:a05:600c:3b88:b0:49f:cc2a:f73a with SMTP id 5b1f17b1804b1-49fdf1454dfmr55059355e9.25.1790184623983; Wed, 23 Sep 2026 10:30:23 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 01/17] target/i386/tcg: generalize zero- and sign-extension Date: Wed, 23 Sep 2026 19:30:05 +0200 Message-ID: <20260923173021.317809-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184727045158500 Content-Type: text/plain; charset="utf-8" Allow applying sign and zero extension to T1 load and T0 writeback. T1 load is useful for some cases where the tables are hacked to put the sign extended operand in T0; T0 writeback is used for APX ZU instructions. Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/decode-new.h | 15 +++++++++++---- target/i386/tcg/decode-new.c.inc | 21 +++++++++++---------- target/i386/tcg/emit.c.inc | 16 ++++++++++------ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 25f7d2215ee..a3702b00614 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -148,6 +148,12 @@ typedef enum X86OpUnit { X86_OP_MMX, /* address in either s->ptrX or s->A0 depending on has= _ea */ } X86OpUnit; =20 +typedef enum X86OpExt { + X86_EXT_None, + X86_EXT_Signed, + X86_EXT_Unsigned, +} X86OpExt; + typedef enum X86InsnCheck { /* Illegal or exclusive to 64-bit mode */ X86_CHECK_i64 =3D 1, @@ -226,10 +232,6 @@ typedef enum X86InsnSpecial { */ X86_SPECIAL_MMX, =20 - /* When loaded into s->T0, register operand 1 is zero/sign extended. = */ - X86_SPECIAL_SExtT0, - X86_SPECIAL_ZExtT0, - /* Memory operand size of MOV from segment register is MO_16 */ X86_SPECIAL_Op0_Mw, } X86InsnSpecial; @@ -300,6 +302,10 @@ struct X86OpEntry { X86OpSize s3:8; =20 X86InsnSpecial special:8; + unsigned ext0:2; + unsigned ext1:2; + unsigned ext2:2; + unsigned :2; X86CPUIDFeature cpuid:8; unsigned vex_class:8; X86VEXSpecial vex_special:8; @@ -314,6 +320,7 @@ typedef struct X86DecodedOp { int8_t n; MemOp ot; /* For b/c/d/p/s/q/v/w/y/z */ X86OpUnit unit; + X86OpExt ext; bool has_ea; int offset; /* For MMX and SSE */ =20 diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 26f6d6277be..e8b21c77743 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -233,8 +233,12 @@ #define op0_Rd .special =3D X86_SPECIAL_Op0_Rd, #define op2_Ry .special =3D X86_SPECIAL_Op2_Ry, #define avx_movx .special =3D X86_SPECIAL_AVXExtMov, -#define sextT0 .special =3D X86_SPECIAL_SExtT0, -#define zextT0 .special =3D X86_SPECIAL_ZExtT0, +#define sextwT0 .ext0 =3D X86_EXT_Signed, +#define zextwT0 .ext0 =3D X86_EXT_Unsigned, +#define sextT0 .ext1 =3D X86_EXT_Signed, +#define zextT0 .ext1 =3D X86_EXT_Unsigned, +#define sextT1 .ext2 =3D X86_EXT_Signed, +#define zextT1 .ext2 =3D X86_EXT_Unsigned, #define op0_Mw .special =3D X86_SPECIAL_Op0_Mw, #define btEvGv .special =3D X86_SPECIAL_BitTest, =20 @@ -1614,9 +1618,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 7) { - entry->special =3D X86_SPECIAL_SExtT0; + entry->ext1 =3D X86_EXT_Signed; } else { - entry->special =3D X86_SPECIAL_ZExtT0; + entry->ext1 =3D X86_EXT_Unsigned; } } =20 @@ -2491,6 +2495,7 @@ static bool decode_insn(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_ if (e->op0 =3D=3D X86_TYPE_I) { s->rip_offset +=3D 1 << decode->op[0].ot; } + decode->op[0].ext =3D e->ext0; } if (e->op1 !=3D X86_TYPE_None) { if (!decode_op_size(s, e, e->s1, &decode->op[1].ot)) { @@ -2499,6 +2504,7 @@ static bool decode_insn(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_ if (e->op1 =3D=3D X86_TYPE_I) { s->rip_offset +=3D 1 << decode->op[1].ot; } + decode->op[1].ext =3D e->ext1; } if (e->op2 !=3D X86_TYPE_None) { if (!decode_op_size(s, e, e->s2, &decode->op[2].ot)) { @@ -2507,6 +2513,7 @@ static bool decode_insn(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_ if (e->op2 =3D=3D X86_TYPE_I) { s->rip_offset +=3D 1 << decode->op[2].ot; } + decode->op[2].ext =3D e->ext2; } if (e->op3 !=3D X86_TYPE_None) { /* @@ -3079,12 +3086,6 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) } break; =20 - case X86_SPECIAL_SExtT0: - case X86_SPECIAL_ZExtT0: - /* Handled in gen_load. */ - assert(decode.op[1].unit =3D=3D X86_OP_INT); - break; - case X86_SPECIAL_Op0_Mw: 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..54dc23ca624 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -266,23 +266,21 @@ static void gen_load(DisasContext *s, X86DecodedInsn = *decode, int opn, TCGv v) #endif case X86_OP_INT: if (op->has_ea) { - if (v =3D=3D s->T0 && decode->e.special =3D=3D X86_SPECIAL_SEx= tT0) { + if (op->ext =3D=3D X86_EXT_Signed) { gen_op_ld_v(s, op->ot | MO_SIGN, v, s->A0); } else { gen_op_ld_v(s, op->ot, v, s->A0); } =20 - } else if (op->ot < MO_TL && v =3D=3D s->T0 && - (decode->e.special =3D=3D X86_SPECIAL_SExtT0 || - decode->e.special =3D=3D X86_SPECIAL_ZExtT0)) { + } else if (op->ot < MO_TL && op->ext !=3D X86_EXT_None) { if (op->ot =3D=3D MO_8 && byte_reg_is_xH(s, op->n)) { - if (decode->e.special =3D=3D X86_SPECIAL_SExtT0) { + if (op->ext =3D=3D X86_EXT_Signed) { tcg_gen_sextract_tl(v, cpu_regs[op->n - 4], 8, 8); } else { tcg_gen_extract_tl(v, cpu_regs[op->n - 4], 8, 8); } } else { - if (decode->e.special =3D=3D X86_SPECIAL_SExtT0) { + if (op->ext =3D=3D X86_EXT_Signed) { tcg_gen_ext_tl(v, cpu_regs[op->n], op->ot | MO_SIGN); } else { tcg_gen_ext_tl(v, cpu_regs[op->n], op->ot); @@ -347,6 +345,12 @@ static void gen_writeback(DisasContext *s, X86DecodedI= nsn *decode, int opn, TCGv case X86_OP_INT: if (op->has_ea) { gen_op_st_v(s, op->ot, v, s->A0); + } else if (op->ot < MO_TL && op->ext !=3D X86_EXT_None) { + if (op->ext =3D=3D X86_EXT_Signed) { + tcg_gen_ext_tl(cpu_regs[op->n], v, op->ot | MO_SIGN); + } else { + 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 Sun Sep 27 21:12:13 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=1790184815; cv=none; d=zohomail.com; s=zohoarc; b=itRri4XrBLCCjs+vX27PIgNc+zYsoRuMDBaQKhRFtdneI/dHhqNQqftdndTeOVwi5wKaHYOobwxVLOTaSqN6gjnhP8yKYsZif3TG1cV/5HnaMpX+B5p7FO9zDbKDugItXweDSnOHzMCNlyNbaqwbqKjYbl076LPK0GDJZQz4JwE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184815; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=B7fTalcP4TrfpRkckJpydRMKC2cEbSRO/6w7tVKQpGU=; b=L1lB4Xc30lZaclYGoilNwn86VAyMw41qwRgLEv9KVw8gilCcgOeMIyipIdgh5gKlRc6OyIUNKkoeKmA7P0rzK6x0BTF7gKWdSDGZ1c4bNfFYQVGzMJVlPMLakvxBAPPmFU6cAU8QQuo9uXWSKPRquxu6ESl1Np0HW4lpFDiMru0= 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 1790184815137486.15566854384576; Wed, 23 Sep 2026 10:33:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpd-0007lL-Bk; Wed, 23 Sep 2026 13:32:33 -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 1x9Qnq-0006m3-Ms for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:52 -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 1x9Qnf-0003h3-Ms for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:34 -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-663-huJkAiyQNbiNIbAXliJFJw-1; Wed, 23 Sep 2026 13:30:29 -0400 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-487057d8a3eso101468f8f.2 for ; Wed, 23 Sep 2026 10:30:29 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48868889130sm8136855f8f.37.2026.09.23.10.30.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184630; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=B7fTalcP4TrfpRkckJpydRMKC2cEbSRO/6w7tVKQpGU=; b=UyAsGG3o3C22D9VEYCJilcLrvMDB0Y32+XyI/INaFOXpv/Rq73+C7YuU4gRptccxe3Y2vv UrwqPSRqD+3fhUhG6IrQ0+M8x4QmvcjKm9nU5B1Mw789wUHJW9JVKU8CRR6iPGH3fKC1r0 oRQIChWYIySxFi9/qsQhQcXaEHbAZKk= X-MC-Unique: huJkAiyQNbiNIbAXliJFJw-1 X-Mimecast-MFC-AGG-ID: huJkAiyQNbiNIbAXliJFJw_1790184628 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184628; x=1790789428; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=B7fTalcP4TrfpRkckJpydRMKC2cEbSRO/6w7tVKQpGU=; b=LPwxNeuEihuS/kVwb6EK/2U451uwArX0B7Q1tESD7Y41sHoaxdCQftBWFnbgr3M50W oEZfcHQC4aGDvdM6vQyqXMdl8kkN4+kiD5w0x2SwZvJiNbvIm9pkA17aTfasoLQQwQCX WjZS9LoWnhqjEjIrLvl8uLviP0lTKQqvDyGMTXv0Kt3u/qcSLWXsOlX9Vird8xqCOT+e M+dYNez07fhEkvHpkmbx0M/NS9ObGYl/3O2n7W9qAJfCqbxBTs7vFr26966U/eemLKe3 grPv/WJbNyZHKIJ1xlxAUPbYDy+Fxn8hjyNe65qxsn69N0qOFJXuh8CR+yVn4sGMhkLj f5/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184628; x=1790789428; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=B7fTalcP4TrfpRkckJpydRMKC2cEbSRO/6w7tVKQpGU=; b=aVx9FSFBzE2VlJSbWr4HVgPK0zUXWVPSjB8QPq7yzIlxydcpsGo46+IRovWZjfLGkD 7Zgc1Vy/6EMJu1Ds0xvY+S2vkChYtDa8MiTlnfPL2Mu0Bz178yPmJL8+GIooq7u9DMYr JqQTspw7DucK3niO5pdyI9KnGWgYLm98vtmRvvcLsMn6tNEvgDf+rzOCXknwBM+1274T YU5bUcI5bjDH+nda6KEbjVYNSriFb148tdQm2ip96klBs5JOBC3Ddtm6rVgMwOjARVbB 59BZNYpzyuvtz9NlWUy9NJpTCRojR4KsIk19kLpiSuSAOdh4SRq1HXS606JEeWRSqUBK Tm/Q== X-Gm-Message-State: AFuF++mUfIjCLG8VwHSyeUHPhMOa/5qJbmCUZ0SowBGqlHBU7xuB7cpB KSNWqHE6yAD+UVZ0CJ3xIfQ5XWuqnfyjpF7yY+stMv66x80jlTO59gsqgTSYQ/inGENJdi929+K 0VzOJCRHaO5ApDC5zqirfjCWjNLebl2xzzbQpjFLH2v/orHy3oCf1t2439h8Nf1VlqM1S7Y/krn leYuqJgU+xMc/Di5U8JkoAL1IeHtRrld2SdpCOeYIx X-Gm-Gg: AYBFou3Z2Nwi2x/iuspRJuXo+KBuIgpBrQnQ6ycOpCmrtQuzdEeaqvFY9zZ04GbPkpI 7QXuHEnc8KUsdtBk/E6jq2gisTbJlRWSgLbFKmqQX7aHkHJGuGM/LuudpiS477sKHwRbUJ+lGvg DPBrMURxVb+KroRogFsBb6Py9wARTL50pV3e+Hg7GG48S3HNm75a8gILgu44S/Gz8WL68ONYWcE rBWz9XVn74OtvfetsTspgfSMvXl5fsBH+p/RkFlo4LTfHqfJus9cgyxiiD5smCvT1QBJqyek23m X3fdrg27ewwT/IhH3qhwcIn45HgDySGvah/2g4zMMQ5WIikkkaVNgMJLXMWegdSLv9+rSJwldsi hJ0loINhmQYLnLws3yi2f5vDvYv8NS9RE/uaWuzmUUS9aW9ZYt8+2i3dI2Y17S1oXaQ1waZI/gg pGQrTPB8cKDKbxq9M= X-Received: by 2002:a05:6000:4023:b0:487:10b5:a88a with SMTP id ffacd0b85a97d-4886705fb90mr6170099f8f.9.1790184628494; Wed, 23 Sep 2026 10:30:28 -0700 (PDT) X-Received: by 2002:a05:6000:4023:b0:487:10b5:a88a with SMTP id ffacd0b85a97d-4886705fb90mr6170049f8f.9.1790184628082; Wed, 23 Sep 2026 10:30:28 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 02/17] target/i386/tcg: use standard operand order for BSF and BSR Date: Wed, 23 Sep 2026 19:30:06 +0200 Message-ID: <20260923173021.317809-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184817071158500 Content-Type: text/plain; charset="utf-8" BSF and BSR currently pass their source as operand 0 and the old destination as operand 2. This nonstandard order was needed so that the source could use zextT0. Per-operand extensions now let operand 2 use zextT1, so that BSF and BSR can use the normal X86_OP_ENTRY2. Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/decode-new.c.inc | 18 ++++++++---------- target/i386/tcg/emit.c.inc | 12 +++++------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index e8b21c77743..0e6175b8dbc 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -674,12 +674,11 @@ static void decode_0FB8(DisasContext *s, CPUX86State = *env, X86OpEntry *entry, ui =20 static void decode_0FBC(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) { - /* For BSF, pass 2op as the third operand so that we can use zextT0 */ static const X86OpEntry opcodes_0FBC[4] =3D { - X86_OP_ENTRY3(BSF, G,v, E,v, 2op,v, zextT0), - X86_OP_ENTRY3(BSF, G,v, E,v, 2op,v, zextT0), /* 0x66 */ - X86_OP_ENTRYwr(TZCNT, G,v, E,v, zextT0), /* 0xf3 */ - X86_OP_ENTRY3(BSF, G,v, E,v, 2op,v, zextT0), /* 0xf2 */ + X86_OP_ENTRY2(BSF, G,v, E,v, zextT1), + X86_OP_ENTRY2(BSF, G,v, E,v, zextT1), /* 0x66 */ + X86_OP_ENTRYwr(TZCNT, G,v, E,v, zextT0), /* 0xf3 */ + X86_OP_ENTRY2(BSF, G,v, E,v, zextT1), /* 0xf2 */ }; if (!(s->cpuid_ext3_features & CPUID_EXT3_ABM)) { *entry =3D opcodes_0FBC[0]; @@ -690,12 +689,11 @@ static void decode_0FBC(DisasContext *s, CPUX86State = *env, X86OpEntry *entry, ui =20 static void decode_0FBD(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) { - /* For BSR, pass 2op as the third operand so that we can use zextT0 */ static const X86OpEntry opcodes_0FBD[4] =3D { - X86_OP_ENTRY3(BSR, G,v, E,v, 2op,v, zextT0), - X86_OP_ENTRY3(BSR, G,v, E,v, 2op,v, zextT0), /* 0x66 */ - X86_OP_ENTRYwr(LZCNT, G,v, E,v, zextT0), /* 0xf3 */ - X86_OP_ENTRY3(BSR, G,v, E,v, 2op,v, zextT0), /* 0xf2 */ + X86_OP_ENTRY2(BSR, G,v, E,v, zextT1), + X86_OP_ENTRY2(BSR, G,v, E,v, zextT1), /* 0x66 */ + X86_OP_ENTRYwr(LZCNT, G,v, E,v, zextT0), /* 0xf3 */ + X86_OP_ENTRY2(BSR, G,v, E,v, zextT1), /* 0xf2 */ }; if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1)) { *entry =3D opcodes_0FBD[0]; diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 54dc23ca624..abf40123035 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1396,7 +1396,6 @@ static void gen_BOUND(DisasContext *s, X86DecodedInsn= *decode) } } =20 -/* Non-standard convention - on entry T0 is zero-extended input, T1 is the= output. */ static void gen_BSF(DisasContext *s, X86DecodedInsn *decode) { MemOp ot =3D decode->op[0].ot; @@ -1404,7 +1403,7 @@ static void gen_BSF(DisasContext *s, X86DecodedInsn *= decode) /* Only the Z bit is defined and it is related to the input. */ decode->cc_dst =3D tcg_temp_new(); decode->cc_op =3D CC_OP_LOGICB + ot; - tcg_gen_mov_tl(decode->cc_dst, s->T0); + tcg_gen_mov_tl(decode->cc_dst, s->T1); =20 /* * The manual says that the output is undefined when the @@ -1412,10 +1411,9 @@ static void gen_BSF(DisasContext *s, X86DecodedInsn = *decode) * real programs appear to depend on that. Accomplish this * by passing the output as the value to return upon zero. */ - tcg_gen_ctz_tl(s->T0, s->T0, s->T1); + tcg_gen_ctz_tl(s->T0, s->T1, s->T0); } =20 -/* Non-standard convention - on entry T0 is zero-extended input, T1 is the= output. */ static void gen_BSR(DisasContext *s, X86DecodedInsn *decode) { MemOp ot =3D decode->op[0].ot; @@ -1423,7 +1421,7 @@ static void gen_BSR(DisasContext *s, X86DecodedInsn *= decode) /* Only the Z bit is defined and it is related to the input. */ decode->cc_dst =3D tcg_temp_new(); decode->cc_op =3D CC_OP_LOGICB + ot; - tcg_gen_mov_tl(decode->cc_dst, s->T0); + tcg_gen_mov_tl(decode->cc_dst, s->T1); =20 /* * The manual says that the output is undefined when the @@ -1432,8 +1430,8 @@ static void gen_BSR(DisasContext *s, X86DecodedInsn *= decode) * by passing the output as the value to return upon zero. * Plus, return the bit index of the first 1 bit. */ - tcg_gen_xori_tl(s->T1, s->T1, TARGET_LONG_BITS - 1); - tcg_gen_clz_tl(s->T0, s->T0, s->T1); + tcg_gen_xori_tl(s->T0, s->T0, TARGET_LONG_BITS - 1); + tcg_gen_clz_tl(s->T0, s->T1, s->T0); tcg_gen_xori_tl(s->T0, s->T0, TARGET_LONG_BITS - 1); } =20 --=20 2.55.0 From nobody Sun Sep 27 21:12:13 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=1790184755; cv=none; d=zohomail.com; s=zohoarc; b=AYKcNH5KdvwlYKsl5CgyxHAeQoK5YBOoFKm7hvm8ChtlyY1wZCy0LOmLKvepyCAsRlleyDWO7ePTfpbiTFBIq4ji0sOPaCc+YMh+O9+bBqH6fC9Xq8U2bRiH6dzC1GmpcwHFFxkipOZWxboLr07hteGuLsVAY7iA4vCYY3p6b3k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184755; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0k6hYdy9n9pt5ZV4khXSiOuR4fbAslYUogsJM6eNfZw=; b=NxX/7wyxgtH5I7kiNbmOvuVt+KXBvaLO+nNusOh+7m5HKnrmYJMcZ2TKn7f8DuhY/bOA3j6ItZS+cANm7hIx9pFcAFVpm2Rl+oUwusHwow7lytYgseuhlJMPl7fkKi6LjQIa8mJJBm4n2+61SMBNBTf2poRRNSL8vLq6a2iNJ0Q= 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 1790184755120671.9925718851696; Wed, 23 Sep 2026 10:32:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9QpK-0007AB-Si; Wed, 23 Sep 2026 13:32:16 -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 1x9Qnr-0006m6-VJ for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:53 -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 1x9Qnh-0003hN-OA for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:41 -0400 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-607-NWMONXttOQaFViaDvr3omw-1; Wed, 23 Sep 2026 13:30:31 -0400 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-49e6b5c5f44so17093385e9.2 for ; Wed, 23 Sep 2026 10:30:31 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4886877a19bsm8977592f8f.25.2026.09.23.10.30.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184632; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0k6hYdy9n9pt5ZV4khXSiOuR4fbAslYUogsJM6eNfZw=; b=bo4l6+Sn8TXXCRGdRHSO6pVXYSKsRcTWBDxmxugoNhtf05yL7BO090ekN5WeAcwx5iJ2Lg FrBRz8hBqXkCddKkOzb3lntrPel6L4/G6LTO8NM/OYf3gGKTSztMj3l1eqmKl2gz06ri2p JanhQ+m8bVQ2f8oW0I+eW8D164hRg5M= X-MC-Unique: NWMONXttOQaFViaDvr3omw-1 X-Mimecast-MFC-AGG-ID: NWMONXttOQaFViaDvr3omw_1790184630 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184630; x=1790789430; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0k6hYdy9n9pt5ZV4khXSiOuR4fbAslYUogsJM6eNfZw=; b=Bl0zYIexHH6ivZdBEKXXtWKo7rL4JEPf9RtZnej5Sdq2i3W6Mkn0X4FAjmfl7NGFjg 7XszzBhueB0VbKvith1VAoiAf5AvJ3KZI9VvBqfHIHC1XVstWdpMSVgVchHKQBsCM9+m 0ehtgAg9HFDUGaaaxF++RI33H3rRO/S7a/j5Fmrf3JS63QBDF62mDT1iZVo1yGBvBHLv ETFuKII4utfBBmJ1a3SfEYL1rH3p26xpAO4CVktyN8sJKj58ojYyoCK1vW3bUVYl2C9f pKD0S5UVEk8gYZa8ewJCJ8raCbOc9GYMZs//HTdG3XdNvlWyHLtzvmN8TaQBLnr1Fu3f 0Lcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184630; x=1790789430; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=0k6hYdy9n9pt5ZV4khXSiOuR4fbAslYUogsJM6eNfZw=; b=di26kODJP08cWl6mnU32cWMXfsn0KqirlXcmmTAtJXyW8gJA55J1w/CA+O9XJdkXV1 GJmuxiKoa9GtZ8A+QXIN1AGUFvOvjj7kZT/d2eeMLPB0rWuGSOm3E/Uh6wDFEz3Hlh5A AJnivIOxjlqFWm1dfYH3Z8qbjRStFRA0wzT8PQU/T1w5rjOkSsyejwXGppktpdUCCp21 tSYIBYWqQNH1i/7MldBPX88xBOL8jO5FCwNICDgqjbCTkx69fS17KPdR7JEFH0wwlBnj Ecvdu1GskSYw5akowMoqBFcS9mKSrf5o4fP0LSOmqpKRA02+aF2NXRQtoADYGAenNqBB LFYA== X-Gm-Message-State: AFuF++mt9nCQRzNk72YY+mlVPOPjZkLJ8FyKGUZlxL/n3YqK73T35B1k ngfyDno7acfo2HJ/GWq8biiKAN4+xbjb0dJ+o4fs26na2Lr3ebNloxep3kJuGSPAeQBU8bqN+En KEwYTxZZOt8zeJ03dK3jMRbX0j8K2nVGGb+NdRWacFCFHwND5aQl4FHjADONg+VKaKirGWuC8jF J0kcGy43sZPs3h3NUQ+ymB9YijezPWFqiSxloDEgS8 X-Gm-Gg: AYBFou1X0YFyRuCoxy+IacBNup9LgUZdeAA5jKEvdS8MekSUH5xbI8A0+joZBe6BNtd Bq9+4pM6coX4sieviRyrC/IgLQqI2YmgX42mHQdfC6sU/s9Uon5LqCpckxFeBWym86bC0Zoz7G9 MUMs3WjBrI4zhAlVM/GjaKOkEaJfMdapVWwcVy+fW5tsz6DTwaspQVOj01+lHFeTM/0gpYoRaaL AdOQaX6Mi78AWMxhy8sELlwdO04ObYqzYUM0giFFi7Hoi8xaSaYruAdsxTiXb+S92zfO7Y+ylcP 2L0NM47v8gpS7/jT4zTji+/ex7Odedgdgl1DCfpNxEwpS9vwb0Jf+rnvH6ngHkTISpeI0R2HIkj O5YncFWr5PIZfCI9yDvFQSOMRYWiGBlNnqeZlSBODC7I73GYVUitajoNc8VcIebfbA2+bVMLHXo PAOqjkON9ajO2YjnM= X-Received: by 2002:a05:6000:220b:b0:487:219e:5e20 with SMTP id ffacd0b85a97d-488670a04damr5962683f8f.51.1790184630296; Wed, 23 Sep 2026 10:30:30 -0700 (PDT) X-Received: by 2002:a05:6000:220b:b0:487:219e:5e20 with SMTP id ffacd0b85a97d-488670a04damr5962648f8f.51.1790184629894; Wed, 23 Sep 2026 10:30:29 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 03/17] target/i386/tcg: use zextT1 for CMPXCHG Date: Wed, 23 Sep 2026 19:30:07 +0200 Message-ID: <20260923173021.317809-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184756688158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/decode-new.c.inc | 4 ++-- target/i386/tcg/emit.c.inc | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 0e6175b8dbc..d8299a760c3 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1365,8 +1365,8 @@ static const X86OpEntry opcodes_0F[256] =3D { [0xa4] =3D X86_OP_ENTRY4(SHLD, E,v, 2op,v, G,v), [0xa5] =3D X86_OP_ENTRY3(SHLD, E,v, 2op,v, G,v), =20 - [0xb0] =3D X86_OP_ENTRY2(CMPXCHG,E,b, G,b, lock), - [0xb1] =3D X86_OP_ENTRY2(CMPXCHG,E,v, G,v, lock), + [0xb0] =3D X86_OP_ENTRY2(CMPXCHG,E,b, G,b, lock zextT1), + [0xb1] =3D X86_OP_ENTRY2(CMPXCHG,E,v, G,v, lock zextT1), [0xb2] =3D X86_OP_ENTRY3(LSS, G,v, EM,p, None, None), [0xb3] =3D X86_OP_ENTRY2(BTR, E,v, G,v, btEvGv), [0xb4] =3D X86_OP_ENTRY3(LFS, G,v, EM,p, None, None), diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index abf40123035..e4700473c9f 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1760,11 +1760,10 @@ static void gen_CMPXCHG(DisasContext *s, X86Decoded= Insn *decode) MemOp ot =3D decode->op[2].ot; TCGv cmpv =3D tcg_temp_new(); TCGv oldv =3D tcg_temp_new(); - TCGv newv =3D tcg_temp_new(); + TCGv newv =3D s->T1; TCGv dest; =20 tcg_gen_ext_tl(cmpv, cpu_regs[R_EAX], ot); - tcg_gen_ext_tl(newv, s->T1, ot); if (s->prefix & PREFIX_LOCK) { tcg_gen_atomic_cmpxchg_tl(oldv, s->A0, cmpv, newv, s->mem_index, ot | MO_LE); @@ -1787,7 +1786,7 @@ static void gen_CMPXCHG(DisasContext *s, X86DecodedIn= sn *decode) * not zero-extending it on 64-bit processors. So, precompute * the result of a successful writeback and perform the movcond * directly on cpu_regs. In case rm is part of RAX, note that= this - * movcond and the one below are mutually exclusive is execute= d. + * movcond and the one below are mutually exclusive. */ dest =3D gen_op_deposit_reg_v(s, ot, decode->op[0].n, newv, ne= wv); tcg_gen_movcond_tl(TCG_COND_EQ, dest, oldv, cmpv, newv, dest); --=20 2.55.0 From nobody Sun Sep 27 21:12:13 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=1790184774; cv=none; d=zohomail.com; s=zohoarc; b=kcuGE6nPpyg/ImF0tMZn4rHrCPJJW119w4xXSKYe5bhEqiHVM5wgXzcwYsjU6dfBcMQ9tzdStwJgoSGMqkJBFkHg54RCm0UQnln3lDcsHFSy92+U5NdOpEceOUs3TEBaptt4aOSB8vh14tETJIbYGzb1JQQRU1NHXAi8iYrWhqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184774; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0sbr6D52DYyEcysDu/13ACnGhICxj2RMwy7hEFb8nKI=; b=Dh0R5jSh1HxQlRNwFHZ06RfWNQAFsLsAbjEwCLWNrrjch4KI+DEG02vyrnl5zkv8VpW+Vr2VtdyiZp1ccrJ0Cx05/tFtwA1pEF0V8d4VmJfgrP+2Xpa84bJH2GxXZvRuuiTY8Rp8P4uSq+cuV9TbAmuVEedIBe2ek1i+VT7lb18= 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 179018477487523.276430301919277; Wed, 23 Sep 2026 10:32:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpd-0007lx-CX; Wed, 23 Sep 2026 13:32:33 -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 1x9Qnv-0006mf-HM for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:53 -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 1x9Qnq-0003hi-Ku for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:45 -0400 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-677-GxDT-29cNpGsikk-wJSp9Q-1; Wed, 23 Sep 2026 13:30:35 -0400 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-48709a1fbd0so868091f8f.1 for ; Wed, 23 Sep 2026 10:30:35 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-488684863fbsm7583082f8f.11.2026.09.23.10.30.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184636; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0sbr6D52DYyEcysDu/13ACnGhICxj2RMwy7hEFb8nKI=; b=HXOQxKIU36t3EwEYtJhpdVNOW0hY+ishIKhN96S4rawfk9D2v2WNpxWWr9YQj1R4i2Nvs6 +ogLbPlh0tRmLTs8AwxTQN7BlbVh9YA1WayS100ymmVEdvOBvl0QZ5TdNPF5utwcRqiJpE ZthnM+9h69Ee/N2OV81pG2B+aJjITKA= X-MC-Unique: GxDT-29cNpGsikk-wJSp9Q-1 X-Mimecast-MFC-AGG-ID: GxDT-29cNpGsikk-wJSp9Q_1790184634 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184634; x=1790789434; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0sbr6D52DYyEcysDu/13ACnGhICxj2RMwy7hEFb8nKI=; b=ItEcwdXWZV1iqxKKIHKVKLtzvxiJrz5Og8mYeUoHEleqauJB3iA5ScaEHjguXA3wHL RXagBNMPcYMIE2kDwO4BBhsJ089XNoxrDrSPINj2fS8VdvducBulGCekwThgTSQF3Aft AoTAovwiBtbQQtMDukqyeDJWdTyYeUlWL8AGwPiz+UNa88n6MSe5u9f7G+Oi/MnsUJqV xd3+MqA5z1USx+igiO+2KzdjVpa808q9rJi4e57MvCmjok58dDg0KUSg01Ich4ybUwlb PvxBmY2EiiJsA7E1rm9Fl/Kdlb5EIHwc/JctXggxwOS11Adz4KGtSp+DuBZLRQSCB50V SayA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184634; x=1790789434; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=0sbr6D52DYyEcysDu/13ACnGhICxj2RMwy7hEFb8nKI=; b=jQlD0HZvvqFw6P8klfFFP4+KYQfiVT1JabcSlNnzK5+sb5nCoQ89Ff7WymPc3Dw4Tz 1r5aFgN9eQvZgWviUR1TBgCrll+f0hmi+rlbX0Wr5ck6ruL6yzvHEbpZRTJJor5nCtrq 0t9bTZuwq8xGn/XdcXkVkfB6NX+c11OPn4mTFVchoGcwWUaTjqSyes/FFuKTOQcNUwfi Y2BrX7WcQVHs6LMv8lTVHEWzQlz9GfqaV7Fn5Jex1b2TFZJFN9TCFEzEx6ce2j6cF9Dl 0ajr6spB20NeUXw064Xa0z9Mg79b/UkYoUjc2D3iv5IhnlykttQ93yxn96tvW4raDeLN /9cA== X-Gm-Message-State: AFuF++neerN6BQPqHLSXIolQJsj7tQ7GVOQuTJoGioVfeH+t3A+Juvhc nFHxYUZ/pt9+hXcDrdpOWvm2Vjya38/PQTjIfTb0JFb8Igj5ThJjMLsGAtppyNIotjZMPFvkEUW GVmlNhlmlTdKyRAi2VDnjGAWcdcwZD0ZeYPyENqBCMPB+ofAItzc7UF7V1opNaaGG2sVccITXvp jp/AUt6dLJnRXdVqg9mJPFsOG46IrPLsS2k0MFaVJB X-Gm-Gg: AYBFou3JKuRvslFHj1cREoN8tGj09lylwGg7xk849HWLMjom1Y9ibAPPQ2LuK0zbdil a7nd6EUr/pqX30+trG7XfZ06ajl0Hy3yCvBjf/FuyjFIDQZGUE3njAUoNWvdOYJJWalza2DvzWA vwUohtzqOrtJbnQPxnwXyhn+V3pZBvYD23osmBL5bfB6ac5vTMrTU3t7tMAwk8BIy/CgZSrF2MA olywCQUNB6gNFu9Ys1crAQUH++5A1xt4RqQjGEOgXzLktzbAmfESE1gO+RcxPtZjW1lp9VNR/lN g89E9V5dvC8zzsAI+LwrRjI3CBs9Dsu+QbhHDsr1Awu+eMv8iv5uYoOdfeahhn/KRYwT87ykSY6 qPQMRvaG4+8ZIHO8n3s+k8vNeAmWxbyd243VMT/p9uKBDyOqRi/RC0rdZQyJGJSbEzLN/s++l2q W6a/eI X-Received: by 2002:a05:6000:4906:b0:488:54ff:67c9 with SMTP id ffacd0b85a97d-4886709dba7mr6055971f8f.46.1790184634220; Wed, 23 Sep 2026 10:30:34 -0700 (PDT) X-Received: by 2002:a05:6000:4906:b0:488:54ff:67c9 with SMTP id ffacd0b85a97d-4886709dba7mr6055927f8f.46.1790184633783; Wed, 23 Sep 2026 10:30:33 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 04/17] target/i386/tcg: unify MOVBE and BSWAP generators Date: Wed, 23 Sep 2026 19:30:08 +0200 Message-ID: <20260923173021.317809-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184776652158500 Content-Type: text/plain; charset="utf-8" APX allows register-to-register MOVBE, which is normally done by BSWAP (except 16-bit is also allowed). Modify gen_MOVBE to also handle BSWAP. Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/emit.c.inc | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index e4700473c9f..5a880b9760e 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1435,17 +1435,6 @@ static void gen_BSR(DisasContext *s, X86DecodedInsn = *decode) tcg_gen_xori_tl(s->T0, s->T0, TARGET_LONG_BITS - 1); } =20 -static void gen_BSWAP(DisasContext *s, X86DecodedInsn *decode) -{ -#ifdef TARGET_X86_64 - if (s->dflag =3D=3D MO_64) { - tcg_gen_bswap64_i64(s->T0, s->T0); - return; - } -#endif - tcg_gen_bswap32_tl(s->T0, s->T0, TCG_BSWAP_OZ); -} - static TCGv gen_bt_mask(DisasContext *s, X86DecodedInsn *decode) { MemOp ot =3D decode->op[1].ot; @@ -2519,10 +2508,19 @@ static void gen_MOVBE(DisasContext *s, X86DecodedIn= sn *decode) /* M operand type does not load/store */ if (decode->e.op0 =3D=3D X86_TYPE_M) { tcg_gen_qemu_st_tl(s->T0, s->A0, s->mem_index, ot | MO_BE); - } else { + } else if (decode->e.op1 =3D=3D X86_TYPE_M) { tcg_gen_qemu_ld_tl(s->T0, s->A0, s->mem_index, ot | MO_BE); +#ifdef TARGET_X86_64 + } else if (ot =3D=3D MO_64) { + tcg_gen_bswap64_tl(s->T0, s->T0); +#endif + } else if (ot =3D=3D MO_32) { + tcg_gen_bswap32_tl(s->T0, s->T0, TCG_BSWAP_OZ); + } else { + tcg_gen_bswap16_tl(s->T0, s->T0, TCG_BSWAP_OZ); } } +#define gen_BSWAP gen_MOVBE =20 static void gen_MOVD_from(DisasContext *s, X86DecodedInsn *decode) { --=20 2.55.0 From nobody Sun Sep 27 21:12:13 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=1790184760; cv=none; d=zohomail.com; s=zohoarc; b=S1fH7vvwHwbfx7UvzeTnNMV8kcftZDkPUWmE7k6yxKeCGRxuQ4ACyMNtZjGfLbkI7vEF95hfiQDrAuhJU/YBSC6PHz0uLbOu1VWe/jgkoiPCPTXSvee4nC3F2BYA7obyA4F6/2W5Pweouojd83tc8mIr8eiym3H9pWAfpgK3+K4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184760; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Dfu8COcO7bTDT11F8VTKT7W8wN/p/kNPOs2GOY98rzk=; b=btlhTK0Vbq6Q/Rk2Gs7PvPJPGiSDs40TceR5YABVW7whuHMH9LcGdTVUvbQoWRe84Iv77Z0b3QWvFm1wHH/gI4kGw2DtKe3LZqiyT4jAvop05DzP1nSbx3QcsAXMKBz1n5uH2B3VgwmKOHpiU83DZSb8GLSsRJzxslMmtgI9wdw= 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 17901847599651022.635222324453; Wed, 23 Sep 2026 10:32:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9QpS-0007Ff-PP; Wed, 23 Sep 2026 13:32:23 -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 1x9Qnv-0006me-H9 for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:53 -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 1x9Qnr-0003hx-UL for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:46 -0400 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-691-G9FHZH1tNOa5mJPbrlza8A-1; Wed, 23 Sep 2026 13:30:37 -0400 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-49e6b5c5f44so17094545e9.2 for ; Wed, 23 Sep 2026 10:30:36 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5dfbc0csm1146585e9.13.2026.09.23.10.30.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184638; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Dfu8COcO7bTDT11F8VTKT7W8wN/p/kNPOs2GOY98rzk=; b=ITzf+5qGReBVlWOcYcOC222BgfPZ4p59uWb4z+XmdZpDg98YR6cCJh7/MLapzdrRHFOe8S BemWoRTZ1rrrIP1SCBZDxB72FQYdd6x1VlUqfeyiwO7K7jayXmEmIwsu89TwslNsacbwWX P1cYo7c7VdZ4uLu5GyEfUwsYbByRpG8= X-MC-Unique: G9FHZH1tNOa5mJPbrlza8A-1 X-Mimecast-MFC-AGG-ID: G9FHZH1tNOa5mJPbrlza8A_1790184636 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184636; x=1790789436; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Dfu8COcO7bTDT11F8VTKT7W8wN/p/kNPOs2GOY98rzk=; b=YMFxrQLe7JsPQTy6UKmCTBUUc6st2UVSNiLyMQyupVCfhwE85O+28Y2HiJnD/WGU9c 3J3d3Mb9Ki7FpRFWSiTZQYduaw6XjhVQhGXo7JjoySP1osn+Q0no0QOniDy8/T3y5oXb xW0q7uSz1McFAe42A/77WpGnOdHqkPxEnt/g0LHyRtNuzjGMq1guPa1FBCNvd1TirmCH 3dQvk84v2LGfzXQX3aXq6aOfBhRmpqJBVD1dRjMOVWlIaGZ7624LiXN8D8v5wJLrSnQx tHSC9YfXZCBybViraG/wwUMvz0nTrzgsCgQOzVK4GDS50titxN5AGWpN1ccZgl6jOf+L jwKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184636; x=1790789436; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Dfu8COcO7bTDT11F8VTKT7W8wN/p/kNPOs2GOY98rzk=; b=xzwq8C/S9MEtH2Pj/S/Ax2jAK1ezFhhr8WDH7/4DlDjyLgdC/MSzRr7y84Ku4rDYfR aKskRVV91gi4v+2K5tQdQn9X0CbtU/jhqmlPMUo/hYWrEViO8j363EBeSLN+oPKWN3s5 G0hepACOoTar+NjVScSqgziRznzz1QZRKqnYyKeH49IUx3OnZzCNqMc2Bu81s1arybRE si1SneicSdTPK7n/0Evm+DPAye7Zm2Ftg9LOvrPrTVnkWkGBzxJpF8G3znShc1GtSuTV 1vZAx7M4bTVKvJL8gc/fegfBhe3vzgm0ToRmYU+3KByi4hEWVWGt8sDa0F2axLFfB+jK HObQ== X-Gm-Message-State: AFuF++m28ti3U7huaWUgDN1Ek+tufLDSWicZDiR+fVe0kD9T1F83osLn ek64zhR0snA4swWCguoF10wCzcAl5viZnSHYF6E0v0LXgXSl7DnOMhkO5w9Iqhb/mKZqJiGyKGT g8JaUIKN1/vguVKJs8LEDR6eNj1NGgHmJmF74eJnKG6r2u3Ko0SbxgArfbdYqHkiKaN0H9+7zLm 2pJ9C9CEZ/UJsfnzLxNhebHR/y7jQpAF5pQuoJwsNJ X-Gm-Gg: AYBFou0M4LXUG8qmh2N0GwQgMvieLGqBighqLZS0B0E3dKSAzIvgS30Y6qntijhz3eS LELOeH126z/u6eC5wa3YlL87wobUiUCSmYkPm6S3jhYefFTO494reu1TqamHFPoUZv3cMSveoj6 77gRJNQHGYYhUKhpwkbrqDjg43+5zQDUhivKncuQUlP7jQKho2kiPA/OU1Uxhpbgt+ilepOzd5k +Y1RGFkdgIcYZrwhyR9hlGqvmFUe9PA1Tv0/4C0+vt2CKqPfQQx6rt4M7Twg0jitcxHxHWavzdZ 3CXs3IzZBbrT3YZJKPe5sPMIfWH/Br4nIkVdDo1vc6NLf58LYAXdJHqNVCuHIogLwyXm5PRRn8/ LGdh9R6ok6RypGkBtxJjm9IxDUr7yqQrf9UKfmSHRLw7PsgswkBobgPHfTlHwOmm1gA== X-Received: by 2002:a05:600c:1d14:b0:49f:ce73:4a with SMTP id 5b1f17b1804b1-49fdf34f0e0mr52360695e9.34.1790184635669; Wed, 23 Sep 2026 10:30:35 -0700 (PDT) X-Received: by 2002:a05:600c:1d14:b0:49f:ce73:4a with SMTP id 5b1f17b1804b1-49fdf34f0e0mr52360195e9.34.1790184635253; Wed, 23 Sep 2026 10:30:35 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 05/17] target/i386/tcg: add APX support to XSAVE/XRSTOR Date: Wed, 23 Sep 2026 19:30:09 +0200 Message-ID: <20260923173021.317809-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184760801158500 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. Reviewed-by: Chang S. Bae Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 3 ++ target/i386/tcg/tcg-cpu.h | 18 ++++++++--- target/i386/helper.c | 11 +++++++ target/i386/tcg/fpu_helper.c | 59 +++++++++++++++++++++++++++++++++--- target/i386/tcg/tcg-cpu.c | 5 +-- 5 files changed, 85 insertions(+), 11 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 3f69b0a066a..c8619666f07 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 @@ -2771,6 +2773,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..919c2f3ee3b 100644 --- a/target/i386/tcg/tcg-cpu.h +++ b/target/i386/tcg/tcg-cpu.h @@ -32,6 +32,7 @@ #define XSAVE_AVX_OFFSET 0x240 #define XSAVE_BNDREG_OFFSET 0x3c0 #define XSAVE_BNDCSR_OFFSET 0x400 +#define XSAVE_APX_OFFSET XSAVE_BNDREG_OFFSET #define XSAVE_OPMASK_OFFSET 0x440 #define XSAVE_ZMM_HI256_OFFSET 0x480 #define XSAVE_HI16_ZMM_OFFSET 0x680 @@ -52,9 +53,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 +78,9 @@ 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, apx_state) !=3D XSAVE_APX_OFFSET); +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 4133b5f244c..cb25018ecbb 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 56d093da8c9..fb473c28f7b 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -2709,6 +2709,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; @@ -2773,14 +2786,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)); @@ -2974,6 +2992,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(); @@ -3045,7 +3086,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)); @@ -3054,7 +3095,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)); } @@ -3072,6 +3113,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 @@ -3253,6 +3303,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 2402608fe90..9db9795a3b2 100644 --- a/target/i386/tcg/tcg-cpu.c +++ b/target/i386/tcg/tcg-cpu.c @@ -200,12 +200,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 Sun Sep 27 21:12:13 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=1790184819; cv=none; d=zohomail.com; s=zohoarc; b=B5VnF0u2/ew1DNj2vrivvl0hUfSImoDNXdAtGQtKlfh7rKjzC+I8lGDJL8xLP1pqlMWlQSvgN7U8IkjXXlNYf5btZUfvbEH4jeGhtVaoI49SNqvbJoA1CQfiLPRvmZyDkWw6gSv+SjrSyPco17h2eM5180L/VLQwtdl0QLoDOvo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184819; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cqtuBjrcUX78UlQ0M+D2gdtFekrOzzmNKWyMGboaw7g=; b=GSm9cJxsRjgn62WMv/tsBFFLPfCGpylrRnD43rQW42ANeOSaM0o9yw9fUgUMsdRX16qiq5Fg/twbCaLb0tzngvZnCcGa4K3DVBrkbSmH0aQHf0/JVzeNLEenIgr/ZT4XUxbZ1W6vQUrJHkztjJnFR5Re+CGKBiPx4AaTInYNHJo= 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 1790184818938621.2261694551264; Wed, 23 Sep 2026 10:33:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpi-00081u-TC; Wed, 23 Sep 2026 13:32:39 -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 1x9Qnv-0006md-G5 for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:53 -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 1x9Qnr-0003i6-Mi for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:45 -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-128-1gjITVC7MTyuPWkSt_ZADg-1; Wed, 23 Sep 2026 13:30:39 -0400 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-4870eda3782so978336f8f.0 for ; Wed, 23 Sep 2026 10:30:38 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4886877a2d5sm8312196f8f.27.2026.09.23.10.30.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184640; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cqtuBjrcUX78UlQ0M+D2gdtFekrOzzmNKWyMGboaw7g=; b=VvqzCFaEC+kLaDnp7eB2Vb2vjgbrbnFh3Atr9xblrXfqGETBjWrVWjgT6f9WJxmmSYQudF og8WahTSiYHLFLjE/ZUrrH/Wmpjz3ENDNYGXDAhxt0tFSqpJD8E8SlKTf14fDccRHMv7Da 1pAhVhlPk2UCRUKfUNrKdo8YTP8NTU8= X-MC-Unique: 1gjITVC7MTyuPWkSt_ZADg-1 X-Mimecast-MFC-AGG-ID: 1gjITVC7MTyuPWkSt_ZADg_1790184638 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184638; x=1790789438; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cqtuBjrcUX78UlQ0M+D2gdtFekrOzzmNKWyMGboaw7g=; b=r2PHlVeE3SDUauknSmVJezl1jHUuqOGMh91UBJxzV57evlefC/VBFN+hNTQMH7KMak FH4wjoM3ly88Mcz8+5pVZ7roL5rUINRwWrul1dz5H79rDHlefVNIa3H6hliZbfmF/ybw Z+WtIB50sBNBmWtbMxPyt6SF4WT5ptkzkXmp2ptzj5f6kHVo46FCqA1uicHygf9D7PKb Jt2EgzMJvVaZ9XMMHOELhyscACfdzxojCMkCwMEvrHd6o5HeJeSFjBjdIExiCgyIV8hl WfmNvRqQRpVHaDOgb7zPCSPMk6mu5qNQ8Y1B6BUjeJ3fNQRb4uMEy6drlCwCLXRQQiYV rjBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184638; x=1790789438; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=cqtuBjrcUX78UlQ0M+D2gdtFekrOzzmNKWyMGboaw7g=; b=Tv28SfZDHuhS3fjA2H3C2y2vVTWEdkSvgOjS7BLmpph14zv2a+fHJtOC9bKMu2zPVh n7xNE31o6gUFY4btcwjEwkY7pQwCAh08ddxRRRuAYsCu8N1wdaD1/yewy7I+wCkrrbA0 xdZSZl/4lKDVqHPFtxQ7YWDcBdL2dzfTCbWUsasfDkCoF1ylJg1Oy8639wiX63mlRtY5 OXOihbr5SjFPE9gpeSSwALbj1P7OpQEbn0meie9gjgTR6TXef9hSUgTs85cIAINvUpve 9egVuQzJp+/0Wb71aBo3V3h2ajFA61IkVy3bd101RjzW4Il+Ry1urPFoDAZz2v/Xz2JR C2IA== X-Gm-Message-State: AFuF++mxsQqHY/qFveqFly6xUdjMZbXJ350/py60nrSXo0KVvaFSb5gr 3PxpcF8iWb7mkjXvYzapDlxMjqoce5YI7WCBZEG+JxdFoDGgBrTEJKWSCk3rFUts+d5YXFwYKqj 6J8gg3wEUZy8sKDgjEXQ0cc5wKnWZG6qXdirWV/M5Dz4gPOy6yknmVTPruxqNHwiWXNCPi/RIyi vhUMnRZHpXddpjDxyOHeCDj481qhvvAbVmArypBsjw X-Gm-Gg: AYBFou1KELFIuLdQ71ZYygr5IPOO1HjWBqx50mhFftUBfW7q0zUmilQMRnLx7ET9ShP pZs8XP5xkaE+eGVWs+LnhUh0fZzT/KsJtZYLP6lTDPGXmIpN8g9e1kDFW9zCw7oJfC5Q+fdEcgR LtssknX+6Ioc02JJmkYkH2Hq/SbOtrIGcnDVNjKHHjBTvyPaz+cFhRxOU/yNhWDW3bJg6lG8pDb l7chRETf5kPmbaSZkahkrHrTkyIgQxTltvaWacL2jf9Eg0Q63wSp9mhAZVu2Yh7EKpofYekdYTs 0eqr9We1dMRlGvNPrnnrp/kNlD/A0p21v4e6O6H5xQeGi77UGdm3MjK6iskNxe4mXTgyuBAk/eK anDDK1CEyLKK1+vRhknOv7wsXwT5DiBywdPVRbfkE44guKkHiIHsLGf+d6HGJVHPeScYXh928FV zvjmHW6VolMpVKaLs= X-Received: by 2002:a05:6000:471e:b0:487:9a9:6d24 with SMTP id ffacd0b85a97d-48867073d75mr6296982f8f.19.1790184637729; Wed, 23 Sep 2026 10:30:37 -0700 (PDT) X-Received: by 2002:a05:6000:471e:b0:487:9a9:6d24 with SMTP id ffacd0b85a97d-48867073d75mr6296940f8f.19.1790184637318; Wed, 23 Sep 2026 10:30:37 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 06/17] target/i386/tcg: add definition for REX2 prefix Date: Wed, 23 Sep 2026 19:30:10 +0200 Message-ID: <20260923173021.317809-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184820918158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- 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 3cdc458f95b..b8e8991163f 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 Sun Sep 27 21:12:13 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=1790184774; cv=none; d=zohomail.com; s=zohoarc; b=AhSjQXvE8l8XJPJCzgz1HlmZR52Uksrf4icVPuRcHzv3Rnu3IStuGm2dEykZoDUXZA4FQVX/uNa0IocY0Ioeksbk6fKFD1YSqqaKlo2juuyBIGwQ+fBKKWKUKRcYwsIlhHNt0sPWcHrippvvVVDF9YCFN441qjllxuSfvTdbkR8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184774; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BSmYu9L/iGp8dgqFhpTW6B1FJFhdvend4JDdu4OhBL4=; b=MREpXQLNXQ1u52b9eFS4vPkjv02/RPoiB3jqqj3CpKIEFIbnVY5zRsBAo3cqEZuLmAp4DIqCdBG2Bra7Sjhb34C05Z48NZgLbrEkMdmZxCCUwxHpOJqABQNSbnLmH5bk3z0WPnG+miZuH8EOKG+aZMa0IAccpdAwJjKihL7mFr0= 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 1790184774936889.7297029015807; Wed, 23 Sep 2026 10:32:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpq-0008Gy-3P; Wed, 23 Sep 2026 13:32:46 -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 1x9Qnx-0006mq-EJ for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:59 -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 1x9Qnv-0003j3-9F for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:48 -0400 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-464-JJAEXh7COZqNL41fMeqpAA-1; Wed, 23 Sep 2026 13:30:43 -0400 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-49cd55ee2f7so9679925e9.0 for ; Wed, 23 Sep 2026 10:30:43 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5dff204sm1414225e9.14.2026.09.23.10.30.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184645; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BSmYu9L/iGp8dgqFhpTW6B1FJFhdvend4JDdu4OhBL4=; b=hPMdV4qNoWYIeackQoHJZg+5n+x5c7dLJSW53q/jwqb0SQkx8aCcCNoqTe3orcgmIQiXuU fBkm2E61hjme86/7ZxuRJPQq4fR7lIuZy3l3FwJ8gybnzpoSeqFJFRTzKK0oUBnP8B8uEE A5pU1xpaPYuW6MB7LC7LoQy8UKykhWk= X-MC-Unique: JJAEXh7COZqNL41fMeqpAA-1 X-Mimecast-MFC-AGG-ID: JJAEXh7COZqNL41fMeqpAA_1790184643 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184642; x=1790789442; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=BSmYu9L/iGp8dgqFhpTW6B1FJFhdvend4JDdu4OhBL4=; b=Lfj5W6He2skECCHA+sRvrVYlTt4KRe9VEvXc0Pkr9twzdjAhDqY4Y0Ae3QpTj9nAc+ yew458fdYvbvZmxkBsZoSQyK60BP2K1AzLCgol7Yk4/7hL/N/GhiTNf4kLkLCDjaV96A X+t6vpuH+jWoprH369ylbEEaCTztshN6pwXbrhCPN2x02i//PWIXpyPc0et6tw1i5zKA z9CAh6qwng4b+DSjiJKyiA3SuGbXjt+aVZqWsyzMPk+i46eosNGed7go8xJZekZ293LQ IoP+TTbIVuD2MUZiMWFNUAu9XCUSDVztt3PIwBaNkuoEZe02v2mgYEbLLfNTLtlop81n 5XvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184642; x=1790789442; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=BSmYu9L/iGp8dgqFhpTW6B1FJFhdvend4JDdu4OhBL4=; b=fVt1986D1RKpc+GGyXTz2u0RnrYrlF3Rkez+SKWrWSleca1l7Z1Ixus29T9E9R4btB K9/gHB2317aTwDK3EWVJi4EWkjWxMbKBpTv+LV01J42w9lFdZ4hRDdp7zJ3LXWSt4iGR FxpKc1kBeHBP3mTSqEhdys5aXCCAHjwAjdoODSNlxPiqDsHzcwwiYbneoT5V3Wsi17rs QEd3A8Lr64At//R/fziRdr9FREMLC7r/49V0wVSbblNOpJNgIEYdQXBSea8gLclgem8N 5hj3rVk5eDiJZXONqadk5jJhhyVECuBaNqpSQZBhpi2cpdqJtxlkIFZs887fj9oIWZ2T Fswg== X-Gm-Message-State: AFuF++kZRLAvuUl/bzXn8+1yw7i4HT3uuPHMMnOMDvI7/CpEqs795gOB 50InMXK3ESQOO3EXeuJwXP8hAyCPoKi7LFzedq3IN+yQljzU/aarEsEzSJqyfgrQxC8/0dVyySb e1WmtDUiYB0Gcg4zJVSPCkpOxtqmUR+ybRg9ZnD6ZbiQS52vDpA6qZdGQ+Q5R/GnzVvTvNW09wo foufQcH0DkNCwYCoKWRuQ9vHGb/8BuDoKK027WQ8Zg X-Gm-Gg: AYBFou2Oq6LEaC6WxSgFyTWqnV+8BpoottaNb02dzndgaC5b/S71nX2YodbendNgkR+ pMBpIlzwbPQCu7vdj0JYyPhR75ucCRNe9IMGK4QdBVTmZWDh6UfOXDUvCFAZBSCpkWr0sflbc/F eGsyeAhWWP3OgGQzhy0t2TErJ7ew+XYV6D9MgBvJ1WD1FWR6N7lVNJFn44p/QnhjflvZs3LtPFi C49fThXrplZbF98+U8c194hz5RIH8XMiiP0h5mruc12WXPRVwIE0jzkQ46XXqKkgwpe/VEvHd3V JUJQyDKP0w07AtTErFXayVwl0w9b0uMr6ff+fiCMTVLMnec/8tNv4OFY4/mzBcj1AR30dGkHUcP S4W2JZcThjwBdNLTca+yOTA8f0zRc6UXMCaU3HQp6Y/u9+qxCXAGayNndTtui0oe5AWYzSHB7mk lk7Ixq X-Received: by 2002:a05:600c:4584:b0:49c:fa21:1c89 with SMTP id 5b1f17b1804b1-49fdf15b21dmr55901475e9.30.1790184642643; Wed, 23 Sep 2026 10:30:42 -0700 (PDT) X-Received: by 2002:a05:600c:4584:b0:49c:fa21:1c89 with SMTP id 5b1f17b1804b1-49fdf15b21dmr55900845e9.30.1790184642152; Wed, 23 Sep 2026 10:30:42 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 07/17] target/i386/tcg: mark XSAVE* as not allowing REX2 Date: Wed, 23 Sep 2026 19:30:11 +0200 Message-ID: <20260923173021.317809-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184776672158500 Content-Type: text/plain; charset="utf-8" Reviewed-by: Chang S. Bae Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- 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 a3702b00614..b4b0567e7ca 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -187,6 +187,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 d8299a760c3..c4f12ba6c13 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -486,9 +486,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 @@ -3008,15 +3008,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 Sun Sep 27 21:12:13 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=1790184755; cv=none; d=zohomail.com; s=zohoarc; b=QUj3XsyGwxX7dRjYVBFmYH6a4lRtByGHpHlmDMG1k7lZE6mccNZzaqIv/7+TyU4mThfdBMyiOu9ZYt1YdjHB2CK4RFuMSNuY9pZwNpZg1s91+PYIe1mLcfKeA5nxN+q/N7biktIqLd+/m9A0b+5fH0V6NrFT013ncPmxLLbEI2g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184755; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4/8iD7ZtOAW8EyUVp3GSUi7sOX1DaJh/ixaZwNIM96s=; b=Pi+PgLANTMQwOdNxxPdi4aTM1b6Ow47Y2GcZJmZSJTWFT20cW9DIX4HwgR8rhwYMXtnQ3hYBHJUvYZfpPXAu1SE+a7xhiRSHrt1Xyy35pk9XpSNOuB15kVN9dO88RstQ30ZaJ24sBK9a8Zz5pXSqnskG6UBjV/nc89JBeRlWUN4= 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 1790184755595749.4434814396657; Wed, 23 Sep 2026 10:32:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9QpZ-0007QM-Rg; Wed, 23 Sep 2026 13:32:30 -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 1x9Qny-0006mw-Hp for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:59 -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 1x9Qnw-0003jk-M1 for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:50 -0400 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-283-YHo_9dH_Mmikcslcw2QkMw-1; Wed, 23 Sep 2026 13:30:46 -0400 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-49e735659b7so9155285e9.3 for ; Wed, 23 Sep 2026 10:30:46 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5b44db6sm3113665e9.0.2026.09.23.10.30.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184647; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4/8iD7ZtOAW8EyUVp3GSUi7sOX1DaJh/ixaZwNIM96s=; b=ZenCfEVU3rl9Q1/la2WwzwEEOMMKWT6NkBr/wsyR0Y4n4nGoUF9pDUP/wodxb/gDgSj1Dq GpjwJ7+ZAIlrNrixZpbZAN72tgWN4lDK2//eIhAI2TDwzpGh2+vXkSnsCZbWfPqd/+IWYs yAt2TewbVMvrLzI0D3LAKbdNICsl9ko= X-MC-Unique: YHo_9dH_Mmikcslcw2QkMw-1 X-Mimecast-MFC-AGG-ID: YHo_9dH_Mmikcslcw2QkMw_1790184645 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184645; x=1790789445; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4/8iD7ZtOAW8EyUVp3GSUi7sOX1DaJh/ixaZwNIM96s=; b=fg8m7vUZ7zI/QJy88aOuGz7nD0jRprTUl+NNhVaz8JVjE9SANQasM9F7EIc5HnvPQY RlPN/6svYCpmrPX3j0MIGkXAFpbOXyVH6uMPNeLuWSJvTt1uNYA2cHte/g+4lz/OU/ii 3SklEgQ4lpz8O674xWw49roC75pO/+bvccQamhXROilGuVgWOJLejDMiWSTOxbhg0kSo ebQ2G2BVnWqfsj5pF+1JT72XGioRG1JFRnUeDei50DRZsQnvyjQC+w2ONnl+5ue1NTl2 4QaHJIEclrvN7AjkjSg31Gcf6ew/A5JjOubg2plEO8ViqjWRRvXgYRuZ95M/KDLh1QEN WdGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184645; x=1790789445; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=4/8iD7ZtOAW8EyUVp3GSUi7sOX1DaJh/ixaZwNIM96s=; b=0dShaDypWxRhGzS54IVAs3gKMwdRI8N+MaTLWbby+RFnYm7JOGuQFWxDJ2APQ+vcbS xLK5rxuI/u2974zFYEEgU1iLKN8/9kXdAvv6POUmW0ET+XvtCmBlp4uksMrnoJ3oSR05 zYPbuQJJd1IwiI6ab58Hb5Ry+55SucFvJXBQIMhqKrHTmPMz1daY4rBuhoPm7aOJ9moE VGMF4m4+DZVwIeUgcQCiV1PQxczLvsPyM2YGIdhkqXxE+7rtc/sn0JcHmxID3400A9+c c3biO3KibbW6z+OCsatmV9wAcyoLMHb2KX3SQxGNHFl4q0gz45gxowHd0gJvMoZcebTg VJqg== X-Gm-Message-State: AFuF++ma9o9iJjHmK7K+8IotZFT9hmNhyVlZE2bTce8X/X6NjqPT7Q/f 8EqUa6znwnHc/0Mar9yrf8jnQ+JlgH2lmu1fJ4BxPjpPRtlLtalxZIem/0ZkP6AErXweo4SrTnl /7QNfiW9K3fXv6wPU4Jq7hT7JI6iU2E8n5vUsOJT0epXfbIoCkjrhu5krdyv0+3vVPk7eWT6CQW LYINLFmdd7RE/Jl9DUCnZN7LpOZ/ids8lfeDiM2zNB X-Gm-Gg: AYBFou1Dv21LSfn0uJE/uyfaHkF4ZEpQvRU9GBiIo3S47juMyc673elkv5kf+zZONIY CVmOr/cpekXJf8WSFp5xl7vg+G+H+5kpQcMOfouYKWhHYO/FgaHNJ9v2lf3tMT3SPwkXVkiZ0Hq MLjVRCgyOFVRLNiH/ce4vfDy0lhEOOeu1H3yEtKNicVgTwsKUVZ6+4w9cc6ET9mfxjNFtSfhoVE y4loLNRCjNlvvR4Q3cJt8d+TqMNm4tfS/YSOrvlHy856d+Rcj8OFthYk0+hetusB+Zm6IeeA3wh JWPxdPCq+IltWpTdhIaqpLJtB1mOwSFR/FgQlWURqqJ9Nfe9zK6XqCRaScVzjDGplkWaEFURENO 3wv7DVzjMnvbbn0LaACtET9CUlaNVzrBlJ36Q8nBjvNgbk3Nl+THVd8a7mrYBsXFdHVOsIgOnnU Cx6mPh X-Received: by 2002:a05:600c:1d14:b0:49c:fc6e:a3dc with SMTP id 5b1f17b1804b1-49fdf148cb6mr53264675e9.27.1790184645180; Wed, 23 Sep 2026 10:30:45 -0700 (PDT) X-Received: by 2002:a05:600c:1d14:b0:49c:fc6e:a3dc with SMTP id 5b1f17b1804b1-49fdf148cb6mr53264145e9.27.1790184644722; Wed, 23 Sep 2026 10:30:44 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 08/17] target/i386/tcg: treat 0x0F as a prefix Date: Wed, 23 Sep 2026 19:30:12 +0200 Message-ID: <20260923173021.317809-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184756672158500 Content-Type: text/plain; charset="utf-8" Because 0x0F cannot come after REX2, pick the 0F opcode map during prefix decoding instead of doing so via the root opcode map. Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- target/i386/tcg/decode-new.c.inc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index c4f12ba6c13..bcb23c6fae1 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1848,7 +1848,6 @@ static const X86OpEntry opcodes_root[256] =3D { [0x0C] =3D X86_OP_ENTRY2(OR, 0,b, I,b, lock), /* AL, Ib */ [0x0D] =3D X86_OP_ENTRY2(OR, 0,v, I,z, lock), /* rAX, Iz */ [0x0E] =3D X86_OP_ENTRYr(PUSH, CS, w, chk(i64)), - [0x0F] =3D X86_OP_GROUP0(0F), =20 [0x18] =3D X86_OP_ENTRY2(SBB, E,b, G,b, lock), [0x19] =3D X86_OP_ENTRY2(SBB, E,v, G,v, lock), @@ -2824,6 +2823,9 @@ static void disas_insn(DisasContext *s, CPUState *cpu) =20 /* Collect prefixes. */ switch (b) { + case 0x0f: + decode_func =3D decode_0F; + break; case 0xf3: s->prefix |=3D PREFIX_REPZ; s->prefix &=3D ~PREFIX_REPNZ; --=20 2.55.0 From nobody Sun Sep 27 21:12:13 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=1790184749; cv=none; d=zohomail.com; s=zohoarc; b=TYq3r7Mwevn0MrNhkbfWf9tss13Zl27nRtx6L1nB+uq8vKx/R5wVNxZgC5RIAdKX54LZFvUOdtLNgg6EJ8ineMBHfU52yxdVO5gLPvnoReIru8Rr4vIdgNdwDWNJ4C+j1Jqi4F6NvUCSbc+2uNPPRQbDfxgBXuATogwVDR+JwSM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184749; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=QKDSIFWp43Gs/ApqacofjIfIteR2AUxMhDKogSwDmdQ=; b=XwQ9TSGoa6sh3Afv/opE3xLPIugmadg+qh4DVu82dWg9pI850XWAsIdL7G2BJOcQgyEigb5/rc345FCI1GYPznSDJ5bywMm5MUXAlqT5SZEyaJsJvdHfQNzAeBpPz1PSmkSs4wkfCwg5NAFXfWTH80aLPMge73jzD2wPMjMVz68= 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 1790184749297147.67027813933078; Wed, 23 Sep 2026 10:32:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9QpJ-00079l-T6; Wed, 23 Sep 2026 13:32:15 -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 1x9Qo1-0006nV-SJ for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31: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 1x9Qnz-0003k6-4H for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:53 -0400 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-10-N-EahUTCMxq-__rZqSyidw-1; Wed, 23 Sep 2026 13:30:48 -0400 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-49e6862e924so8683555e9.0 for ; Wed, 23 Sep 2026 10:30:48 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5df44f9sm1101065e9.11.2026.09.23.10.30.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184650; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QKDSIFWp43Gs/ApqacofjIfIteR2AUxMhDKogSwDmdQ=; b=OqgLn2fIwAs6zkponOxsKGwgiNbx0hl/b/MK/QNU3l5U8y2bjYkowOyWyGVlvaISNpZufU ZUhzmxbWSE0LLTwdySQXEaxBGO4zVFk79wN9HE7OfRaRdm6/mJ+vheb5sYzFxJj46oSFHv Hm84C9urA/FXI6AXKDlbpa4IogkaLwU= X-MC-Unique: N-EahUTCMxq-__rZqSyidw-1 X-Mimecast-MFC-AGG-ID: N-EahUTCMxq-__rZqSyidw_1790184648 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184647; x=1790789447; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=QKDSIFWp43Gs/ApqacofjIfIteR2AUxMhDKogSwDmdQ=; b=YgMAsI8B4/M7/T+9utjHaLemDrl/x62+yI7tOCVuXU180lEgRFkZ0pW2JaPEZVFh6B FPYdpJL/cEeekKZVsrj2wFr7j31S6t4J4aqZh5F7tMFYwSCIeMegrfB/hFL96YgkpyLd oq4bQVTuuISoGUTUamuGkmVxbvOQqoEElAkEWi9vZA3MuLdnervBxR+1KzDNwiYyoooC uplurN9OKlRg/OpSIVud4Uzx5Na8f6Qdu67WwcDmUrydVlUEgbDuieJOdG3Xl/0jDypB pV4dilwpg6GNpf2fUzZjPW0hoH6uesC7hd31U9T4uxTFUCwU5nIpuHzb36bNiuX2pL4E 97zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184647; x=1790789447; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=QKDSIFWp43Gs/ApqacofjIfIteR2AUxMhDKogSwDmdQ=; b=RSM4YeUs042iveibOb5qO17vcef7+yiCytSko4YBuG9DficabBTGEIqriLY37SS5c6 eNzU2iHO2XW1ifxrba8n6K8vmWuHU0i8j7WCyohnKZacGORy+P4f/lw9bsYD4N8ppFwb 8K0TahR+EBa1B1/KA17awldb2UhruHxnXhKnmH9lbSAUGxtngtRkqKJQcJcqSiL7siC5 IlSI22d4GsuHL1TuHDyhsgh5scKzP/TChI6M1HlnLhBGWpc3bmmROVx76DsTiF8g+gPM nObLSLqUf4arYSWwy1uvPqlbZn3bPbyUs5Sbowf+qSqWTY8IPLtZ8Y50tLK+DqrwzB91 HrOA== X-Gm-Message-State: AFuF++lKqpgrM492og6esGJxGcdlviAPREbvqZZ2HK9KXRvqe9kzMNwA FgkCN3X76DpS6+bO2pHCRZs7ynVL8E6whoJ0KS18Ira+EPDlbbdZL2nx3VRcAwuheLmkTsBWcNl hhXQa/i3rNuH/FdLbLBbg31PGygIyTsmNI7dr3OyngqQaErv6AnUysxZuPrCerAFhdC0umU1qo2 ltHdxf1qNd7b/rIaE9toBDXMECJpD+I6CZQC46BySv X-Gm-Gg: AYBFou0tiBw66OpaIhZ4R6JE0Z3QHf4P+gwhOFleOnwP+jklFubZEZyOV/iUP7tuA56 Zg8W++NZgRSa/QvCfNkQ4GwOTsJq0eCR6O5SmQ5pz+krx/BS/xIS+vwIKQajJVrCbuRXENxAyYx xXuo5ivMYMl9sn4rqoSnEYZn/cM3jSaertNUAzUTApwXA1uWvp2l+Gy4qbTMbsGciatBUEaFK47 RYVennOJmj5zUpq9jdKbr+0HtvXuCNtQX1JqEC4kkydXu8GYulIyGxkvCrxPvxLMvRpJ7o0ULti wt8hfjWgo1R80ZTEGmZ2Oo0Ub55eqetzBEd2sMbquwfgCwCz6CCubCJJSq1V+KZzd/6HxUzPcAG 2VND1/11z60ATIt8BjA+peHKkHWDZoJ9kl5TKFhc/n2GuXLgRE0F22jl9ggaM8p3d0NnJ91mVQG p1eToL X-Received: by 2002:a05:600c:1f90:b0:49e:7c4b:1753 with SMTP id 5b1f17b1804b1-49fdf0fc3a0mr42589015e9.12.1790184647486; Wed, 23 Sep 2026 10:30:47 -0700 (PDT) X-Received: by 2002:a05:600c:1f90:b0:49e:7c4b:1753 with SMTP id 5b1f17b1804b1-49fdf0fc3a0mr42588585e9.12.1790184646957; Wed, 23 Sep 2026 10:30:46 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 09/17] target/i386/tcg: decode REX2 prefix Date: Wed, 23 Sep 2026 19:30:13 +0200 Message-ID: <20260923173021.317809-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184752704158500 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. Reviewed-by: Chang S. Bae Signed-off-by: Paolo Bonzini Reviewed-by: Richard Henderson --- 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 b8e8991163f..edef866a24b 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]; @@ -3337,7 +3337,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", @@ -3355,6 +3355,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", @@ -3399,7 +3415,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 bcb23c6fae1..c2b252c01be 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1991,6 +1991,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 @@ -2010,6 +2069,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) @@ -2020,10 +2093,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 @@ -2324,9 +2394,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, } get_reg: op->n =3D ((s->modrm >> 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 */ @@ -2785,6 +2853,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. @@ -2880,6 +2966,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 Sun Sep 27 21:12:13 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=1790184814; cv=none; d=zohomail.com; s=zohoarc; b=OmD9O3AGi06WWPu+/JMcX5mJQx0Iuob+X+e6in9SCBHwNnXW5AKBSAtAWXST/mTfAatAmSDFCvhknPODp8PJZHAkQcwx+2Lv/Eu7lzr60Y19naGOKr/3w6d1BQx0XquFdjIqY8iuQj80IrewqQ+5dV0xJ5oSo/avD1/Yrt/Aa0w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184814; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OcOOAk0eswPaNGGDKfx6f/1GOBrGMNRRiT7vRvwEJ6k=; b=Mec6bcP+8lVpOwcFOuUGodsdgBzMYAzLXIZZAt2efNUckYnNczcHLfWWBxeyj6CgnaN9CcdZQllpl9FbeC4zFTzNXr+Nasi3kotbMNZtOk1wBolMsP6jOGtClzPwRjJz1omDL82tPl00i9Tfty5oMdKq47VwiWfHYnEvisWF/HA= 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 1790184814906310.96986475653637; Wed, 23 Sep 2026 10:33:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qq6-0000L6-5P; Wed, 23 Sep 2026 13:33:02 -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 1x9Qo3-0006nW-6F for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:00 -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 1x9Qo1-0003kL-FA for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:54 -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-651-GQEscC-XMUOQCiq1eq04dg-1; Wed, 23 Sep 2026 13:30:51 -0400 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-4870a0fe60fso852105f8f.2 for ; Wed, 23 Sep 2026 10:30:50 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fdf9691e2sm81758945e9.1.2026.09.23.10.30.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184652; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OcOOAk0eswPaNGGDKfx6f/1GOBrGMNRRiT7vRvwEJ6k=; b=EK9tadFt/ozsXIY9erk3tXA4gnsxCycUQ0ChWJCvh3nhuOiXdz57XPdK6xrkpKFYygwTF8 nxJKxsLrp8WDXrHo0iq3ylC6eim50ePUpOrD1cJllvkKqZBmHLPd483e0dRDzIEwq/8q/M yn2owIUNX2kd0cfBXQ888vZR/9xzzHI= X-MC-Unique: GQEscC-XMUOQCiq1eq04dg-1 X-Mimecast-MFC-AGG-ID: GQEscC-XMUOQCiq1eq04dg_1790184650 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184649; x=1790789449; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OcOOAk0eswPaNGGDKfx6f/1GOBrGMNRRiT7vRvwEJ6k=; b=nIweUsFPtjj+VNG9N23uuStwlWa8gJsTpfyffJpcQNouQpVCjB6L5NWXLf3hF3gTqT 5StpxepZfdzzDFCYi9nKM3WjLirOQSw1bcmM94XwIqYmOExYc9zTvmP/SIgC1eQmONTf nY27so82AHIRNrUD4vj2rN2TcPvF7HCHxZToR6SJJp9DCXBsALHcGn01+iPwVcCN+Bv6 9Lk8dTTgqvV9kcwz1jiqSOrQZmd9sKX0Zk5qu4XrRNWg2xaAoXAy6sZFoky98g6vJv12 GhrY4Yk68JQ9NAE5vm0j0OV30VRYymFGrBdrjriTwRl+nZOxmHUFW0/6sMXogbcnUwQy FLAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184649; x=1790789449; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=OcOOAk0eswPaNGGDKfx6f/1GOBrGMNRRiT7vRvwEJ6k=; b=lyEYpyThuq5aCFxOEDkNrINnqU0dH/zgDwbYgbCJgFNSsq73JRoWJx7+aJBQLCIWcG YMSjGwiluiu4cPmJruSA6Wdod1d8oGA0hQtMH6ZXqEbCxxXLFMt43o/irMXTyO1Bnp42 pkVAa52iXeB0XbFbcCR4rtKBj33772W64a9ihYwnHyg9IRkQxvL6zq2K5W2aFlRJYcMT c9wzqi7qRfuB5hxzp6EjMQuFrAMxKlau8MtLK5DXRWvBMQrUCagCXUy65LTJZRSaF2Mk b0sKFkn1GHaM719A4ZL30LyXgyfmoR0zOzGHRbB9GIR+/5AMXDonCNmuWV8tZ6q7Uo0m uZww== X-Gm-Message-State: AFuF++m+JrtIimZPnhZtn+haxlrTQROvvc9p8ZB8HhGazQtWa/9cyeNu 9ypv+YOz8Vuhda20GhzJ+DVsckqWdXV8dR06Nv1LwW1oKmDGKl5A0kUXFilZaYYl1oui3NNYS8y YSv7M+MQnqD3OGhS3fczA13+vvo8hc2/GQaBRqArOyLYQ5eFwQ9Cgn1dOfA03gu+gQoWYDAmOxr coRTmYadMv2Tcz/NQCJhNca+ZmpjtIvhnEdamEBXXc X-Gm-Gg: AYBFou2FCjEfZ3W1ft+ZMmjdzakxINNeBejhTj3i24zC0hFCUtSP29BFeORZMQleo6V OxKqMZyovEVy61Tnf4ZWUYLIjc8L4qNeG0cyor+R2PNUZSBDE0CaCeHJ/AXgBnmVLFRcOw5lKxJ Ix+V9Y1RnGlqh8b45tIMWn10sZ2OcZPmXNI8Dv86kwLnmYwbA6aTjTaeOSPgcB9KDI7maOI/jo3 IApQEUMd4hpVVypTyFJIxazESjhQwW1Hj7QDasD5ir027g/HeEVDZbiOYj0nKx4xDDS6XDmOTvI 7dhoEpO9/78J5k/JnnWeMzt/MejZRnLk3FXYFh8VnX8zLRjP4uj0sNtEH7d+peSdCueJ7ZnhhYE ayeyQTJ2zcMNyxyESffORc36pGj+eyjRFZn0zXJn2Xqg57ScBN5/ptcr2Fmo2633AXbBhF58l5p BIwLzFz/1/evv/MZg= X-Received: by 2002:a05:600c:354e:b0:49c:fc6e:a3d8 with SMTP id 5b1f17b1804b1-49fdf13d72cmr52432675e9.23.1790184649727; Wed, 23 Sep 2026 10:30:49 -0700 (PDT) X-Received: by 2002:a05:600c:354e:b0:49c:fc6e:a3d8 with SMTP id 5b1f17b1804b1-49fdf13d72cmr52432375e9.23.1790184649315; Wed, 23 Sep 2026 10:30:49 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 10/17] target/i386/tcg: implement JMPABS instruction Date: Wed, 23 Sep 2026 19:30:14 +0200 Message-ID: <20260923173021.317809-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184817088158500 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 Reviewed-by: Richard Henderson --- 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 b4b0567e7ca..cbc85498a1c 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -190,6 +190,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 c2b252c01be..b6d909d5f2b 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1993,6 +1993,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_ENTRYr(JMP_m, I,q, p_00 chk2(W0, no_adr)), /* JMPABS = */ }; =20 static void decode_REX2(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b, @@ -3119,6 +3120,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 Sun Sep 27 21:12:13 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=1790184822; cv=none; d=zohomail.com; s=zohoarc; b=iGStvZhRGBGwU4QmcroY/WKW3Rx1I8+VrBDl4lIIJ4zXvZvThIKOs5OAdIJO78aQRwILZBjrjKSk9A3pw9GRuSb3vfFgNCEfjE9a6rIckpzMICd21DTWfMrs+k2yJCp/KVil7Lhtqul4pJ2A2YPPoRm8WwyvArAe5nh+gBX7bp0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184822; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OYkNO/TdjB0qzTy0KRTNz8bADgBksuDXeNWhGmrxZks=; b=CiqVjy3p7xt+l7bcYQyC65zxMmWYf90IRKqUN/cWFJjEGrpbpdH56c3eX6Asv4B+Bm41WpMH1lHL+QVwlhEe+rXrrJN0yFDSF9+oaCaakYnLO1Yi8THkzoaYRZmFnS7C9z/D1W2otqbyA0juGGX1wH2Zs9XhoQKFwHN1oRWEkR8= 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 1790184822035961.1618978061716; Wed, 23 Sep 2026 10:33:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpa-0007aE-BN; Wed, 23 Sep 2026 13:32:30 -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 1x9Qo5-0006nl-FO for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:01 -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 1x9Qo3-0003kj-Oq for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:30:57 -0400 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-631-BU7e1abwNGaml7UEGk88LQ-1; Wed, 23 Sep 2026 13:30:53 -0400 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-49e6c17ec1dso13919005e9.2 for ; Wed, 23 Sep 2026 10:30:53 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5cd2bacsm1410555e9.13.2026.09.23.10.30.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184654; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OYkNO/TdjB0qzTy0KRTNz8bADgBksuDXeNWhGmrxZks=; b=iWLLidNRVRHXt9KoE9KKTCwPJp+PctWmRtAQ/WiS7gfVIs1SLv+tVLUYljsVoqtro5cnGG Sf+77M6TikmkSAb+inMtferQqzPzVdCoSffHhHkwoYBUbzLRK/7KMHGlCTlwXdpIe/423B SPzwMUVQL0gYy7+H2OrJ/pyIAUcE0Wc= X-MC-Unique: BU7e1abwNGaml7UEGk88LQ-1 X-Mimecast-MFC-AGG-ID: BU7e1abwNGaml7UEGk88LQ_1790184652 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184652; x=1790789452; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OYkNO/TdjB0qzTy0KRTNz8bADgBksuDXeNWhGmrxZks=; b=BmOPmDOWuizAvU2DBoXg+oAgPK8Fqwf5EPDikkMAkqp4uLdcAXhaBUKuCNi/DPWsw5 +LOyYFeDI9WWuOQd2GxRPe/n/SyecqqW7rZ6aKS+SNM+2hbN2xZ7plUdmuRzcqLbqLuc 1uezE8zugf5BdOKaIpXfwjg06NxQg3H6paPTiz1SmUA/ynTjRdeabB+MH71OKkFRpfNR phyfNVczTeiDPoTx8FR9BAFgySoaa8hEZHL85dFmpT0Uxhc8J15ihMqgYSLpL4T276F4 RZABptJByv/jUNFS7o/OJwRScpQBbfGaA+9gCCWW/YjEm+0L/OArUSksiPaeV8G8t3/t UCWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184652; x=1790789452; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=OYkNO/TdjB0qzTy0KRTNz8bADgBksuDXeNWhGmrxZks=; b=DzjE6c4MJMGjmBhbBQqsCtDDxVAivZdqD48GMU53QpW4EJT6q5uR6m6wdHb0dLY43/ nIJnHUM+xXKt34Ax8IURzNbalvCbAAB3yz5FdhOv6emIL1pWZb+pXIUiXn/76vmgVN8S NpcoE1BTDhcgkOxM/ACd2a6fBaSwmkwE0xSQCUFnPcUlXCTdK7zi0w1deCT5u75+Uvxv MQRJng1qTqysjBEYYXOBIviunlwZlWNuFV+HVWwX080S4zysCFx4h/qqWTMkl7ddkYl9 1kAwpiRukGXIWNGdtI3CYi66TmWvkbVMqUHiwM1L+QuTJRbicdCsLMv3AyP7ZNLz+LvQ Ay1w== X-Gm-Message-State: AFuF++mwtCQM5KoRoEVQViFIOzRBj/MLk1s5N5NxBd3z5TEXUOOY8rMm 3zsaM3wzxfIt84URb2uSjOb0Bet9jnsYBHtdhXrc7L8J8W9zYX6g1iyuUdrLs915YXPN/3d4G5M Q+qnfJw6mCYPadlGyvXWOyNn+ZClRbJH7KaNOclogpvS1RudcToU5mhIf4cTSWT/5bVzFbxNNDb eGQ9N/8Byc5Ui3lRrHSwP6ksQMVUrlihJgZJSVuJcP X-Gm-Gg: AYBFou17RF62KbtgkvzHg5u1tKO80bP0CbW9POfGfKhHLWy4IbBwpa/3M9yta8E7ABF 1LEjv1G8+GR7czJhanug/joyJiITonB4TSCAmsTOMXToMGTXy7Ufk3fqyuHDOsvGTolFATku/Jj 7jLZnJqA5zCGWhwTYhjRB3jv7onNrZvboQwDlFwSJmBC5jUSv6cNQhNnnKMPQm5PxshZgTBXXwZ tWDfiuyEUJ0IYd2IMy35FLfxofi1SvfpNcFSOhScb/v+jMNhlfPtycuSo2JbsCjWpF0orKf6PNI zkGyNtA5IoLzS3t1WdVIrA/NBHe8W3c/l559a7eS4oqI0e29Ulro9giNE1qVakxhJ/5acACqhsM xmHVqQglrXvAiUd1TrjuOmIpkalXWgpkO9TPzXDKATY3hj0LWiKSawywnu/ZM/lSHQ2nd7ZvuLF bDI7PU645x3OHwEi4= X-Received: by 2002:a05:600c:3b11:b0:498:943:ccc0 with SMTP id 5b1f17b1804b1-49fdeffcf0amr51171305e9.6.1790184652252; Wed, 23 Sep 2026 10:30:52 -0700 (PDT) X-Received: by 2002:a05:600c:3b11:b0:498:943:ccc0 with SMTP id 5b1f17b1804b1-49fdeffcf0amr51171035e9.6.1790184651852; Wed, 23 Sep 2026 10:30:51 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 11/17] target/i386/tcg: extend VEX.vvvv parsing for APX Date: Wed, 23 Sep 2026 19:30:15 +0200 Message-ID: <20260923173021.317809-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184823010158500 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 Reviewed-by: Richard Henderson --- 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 edef866a24b..1901d9372bb 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 b6d909d5f2b..b3873043b16 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2333,10 +2333,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; @@ -2466,18 +2465,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 */ @@ -2723,6 +2729,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; @@ -2814,10 +2828,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 @@ -2896,6 +2907,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 Sun Sep 27 21:12:13 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=1790184732; cv=none; d=zohomail.com; s=zohoarc; b=HMfpHYVsVBRVfkvCGwqTZZc02i9Lk8bgmMeyL/cocLbDoUwNBluqfMJdO63Kqlbb7cao2uspa7qCuceLtpEaj/NSGhh2ObkqHgNYZ3SHO++8OjzxKP0y7RaDEMo89Sb5kKIQc6JqX8CWkzcXngmLSpcR/fg6/uDIB49ZWg1yX1c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184732; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=F0rnhZMIzJhXSttL3UzDH4bY1vhB2QsysEjw18vtlHw=; b=W4AotLJ1VVylecEfZgVUOySIJM23wQYIWu6MWEKdunWqvzrtvrBCQJ4enL8uAew8baCLzMTMSptJlGOu6xeekbpS7ndqX+2WRarTJ6mZHDGALVuC9bYBkhWMeKBQhlc2W5Ud5Leir7AZhUxFdPeeT/trgkW1UnlZEeqbwjCAeVc= 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 1790184732835666.3960083689483; Wed, 23 Sep 2026 10:32:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qp6-000755-Uo; Wed, 23 Sep 2026 13:32:03 -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 1x9Qo9-0006oL-0V for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:05 -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 1x9Qo7-0003l1-1o for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:00 -0400 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-KAE8_LcpOemnHOuftkDTZQ-1; Wed, 23 Sep 2026 13:30:56 -0400 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-49cd83ca361so16546095e9.1 for ; Wed, 23 Sep 2026 10:30:56 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-488684863d9sm8391738f8f.12.2026.09.23.10.30.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184658; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=F0rnhZMIzJhXSttL3UzDH4bY1vhB2QsysEjw18vtlHw=; b=DfBw5gZyt5Uu4A3JlJI/+S9myieXfV+xWtexPeog3gpp0IcH76MbvgEK/edI4pV/5lb0tT TNlmzv5UsfVGU7t6knvKZJywS1C3GwyGl5efGhh7uCPwpoptQwJ9tQDXokwGBcOAi+5Ftn 1zQhpTr3SkdKaD2AAHlATg9ohRGUNqE= X-MC-Unique: KAE8_LcpOemnHOuftkDTZQ-1 X-Mimecast-MFC-AGG-ID: KAE8_LcpOemnHOuftkDTZQ_1790184655 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184655; x=1790789455; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=F0rnhZMIzJhXSttL3UzDH4bY1vhB2QsysEjw18vtlHw=; b=b4EYQkIm1Hmd7PjxdV0sKhQ2AqMSUTORL6/tA9nF6s7en/I3BKg0WvBVnpbMK97jgq mDQmoHX9OAWStSw0eNd7JLDzjW8xRAlsW3PeuvbpbaSsu/k0vBaUGfprA/+qguQANPXF YYMn2tu/wn/Sfe1U7pIrHf9H0z4MDDJguzlaD68fCpcWhXb2qYLvjN0ujZntq6JUDrfR 1vNpX4za0KtjasD8rueQkzgnPT8YgAXqPaMFD3xmz20wuo629D3cJVdS3j3tnAnFsFZJ Ch+YhVQt9Krw5Y5MCCsyefR6g1EtQlcd7F8wKrd6mhFl6ZMhCrSBT1TZ673p9+k2YgJL 8cUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184655; x=1790789455; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=F0rnhZMIzJhXSttL3UzDH4bY1vhB2QsysEjw18vtlHw=; b=R/3j65FcsJA5acEURbqhb/E8v3i5Z0FtP6GQMvDY2CQo+gREwLjDx9V1QvzNh9ll2S DI0S4fFlXqeB05qpXpI8HPen3a81xlwfn1rV5oRYVb4yX7yIcPw1YBPWOeI79R3DOgP3 D6oqbdSACXYEySJVpQSlvaOhtJQZky41Ps7NoQ9RXDDuGiccDbzjNOiKRpCIyPpuAtC7 XmJve5yCHJpXY0vf5zI0/tjlyq4UbY/vAuMTc+RURiw6MBwZiFceABpPSjUCaB8YhvRC PMFlcFeOTF8J1HiVXlOSgHiX6jKZaUNIbbdsccECxP9Q0uUpm9lzz3qLv0JYKHL4DlqK Ovgg== X-Gm-Message-State: AFuF++m1iZfXV6c9jorI3TgSOVlc/NwEzzeh8hOPqPq0ZzpJ+iNGzbr0 Y0yWmBMo8italkOpzI5Eg44/rh8qhi2dazdyUEoh8wJBUdSsKu4vFv/jdV5GV8kStSK6tHgqKxW 9Xv+qlfAuQjhK9gTHePs8lvzQHU5+0gVrTI53OPD/oUIpoae9udBsvZI0v8Y3kPWxuBs+NZd3SL qRRLXF+JHxkKzHZ/V81HSlgtk/zIhmq14J3DTeSBhH X-Gm-Gg: AYBFou0NPsyuXoxbJ5FvSl80ypj7A0d7EsZ5PTAcmkvzi+1USwj7dyih6ki/un/NQZs 4uEKgdYSXrerNARPFxXGSvj8IGxqpUEvo9Zp+zuFD16lcbuekUlCxE93zHQ1LuXOkG8GE9vEa8H 9PwEbEpAsiBpcPjMHrLvZvMOjolmcRgEpS9HJrCOhm7Dq3iKK5jnqOldZUxpbTZHYkoX/wByyP9 2HKjuAMBR2iS8KiEDyPIIvcRGoXd2Tw4hVd9JzRO46SayFk1MPsfEw5z0OcVUQNgKediOBLb/oz CEEa1FHo3eC6kpFhgDy4dEkkxazWSsu/Lz6nvWuFBGwmJ9AmJ8M6tnSey0XhfU6CPTtt8rZnH60 +82HZKxCHUz5+EFNgiiLrZOz4xrNe5l8kOArifRJVrHK/XF2wyIUA8KBZaLg0FCvMMv5NuZ4z16 FgYapv X-Received: by 2002:a05:600c:190a:b0:49f:c331:39e4 with SMTP id 5b1f17b1804b1-49fdee0a0e0mr55361885e9.7.1790184654826; Wed, 23 Sep 2026 10:30:54 -0700 (PDT) X-Received: by 2002:a05:600c:190a:b0:49f:c331:39e4 with SMTP id 5b1f17b1804b1-49fdee0a0e0mr55361515e9.7.1790184654409; Wed, 23 Sep 2026 10:30:54 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 12/17] target/i386/tcg: decode EVEX prefix Date: Wed, 23 Sep 2026 19:30:16 +0200 Message-ID: <20260923173021.317809-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184734774158500 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 Reviewed-by: Richard Henderson --- target/i386/tcg/translate.c | 8 ++- target/i386/tcg/decode-new.c.inc | 89 +++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 1901d9372bb..c28cd9809e9 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 b3873043b16..10c6833bb3c 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2049,6 +2049,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 @@ -2076,8 +2081,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; @@ -2469,7 +2473,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; } @@ -2598,6 +2602,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. + */ + return false; +} + static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, X86DecodedInsn *decode) { @@ -2729,13 +2742,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: @@ -2883,6 +2899,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. @@ -2908,6 +2928,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 @@ -2994,6 +3017,59 @@ 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; + } +#ifdef TARGET_X86_64 + if (rex !=3D -1) { + goto illegal_op; + } +#endif + 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; +#ifdef TARGET_X86_64 + case 0x04: + decode_func =3D decode_EVEX_map4; + break; +#endif + default: /* Reserved for future use. */ + goto unknown_op; + } + } + break; case 0xc5: /* 2-byte VEX */ case 0xc4: /* 3-byte VEX */ /* @@ -3001,9 +3077,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) { @@ -3152,7 +3225,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 Sun Sep 27 21:12:13 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=1790184791; cv=none; d=zohomail.com; s=zohoarc; b=Lp7gLnz9GghwJJgn6z7UHJzG7fNi1rcP+ThpIi57naLysvCSH8vomKO+0pHnQQQjWLUYA8KM2FIR2x4sSAU/IS6BIpUqW4k8P6ca94rSyEolzjx04d9vrDV8P+wkPy4ziE2DJfhVMHLA/V4x0urkJM0+KA1lMkRj+FsMBPVGRkU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184791; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=jgOMb7SjXuk3u4/2YZ1h0BpaB3cHG3WQBao057QStLA=; b=JXl3vt6Ot1imR6rZ25ziEe7nGAp28MKSi0mUC3PExZXtJTOt7qSbOLNv358rPS/X8Q76HFCOI8XFNIiOl/Iif51SRfz7kwyczHxsMesLI+AIgXEjBavW05nSp85N7wvSw03frDT5eczZp/kmHK29BCHK0Zej1cGn1Pawh/46hqg= 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 1790184791265530.2980286335298; Wed, 23 Sep 2026 10:33:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpx-0008Tm-II; Wed, 23 Sep 2026 13:32:53 -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 1x9QoB-0006sm-Sl for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:07 -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 1x9Qo9-0003lF-MQ for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:03 -0400 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-593-tk7Qd-nnNA6pvndv_tKnVQ-1; Wed, 23 Sep 2026 13:30:58 -0400 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-48701401090so1039312f8f.3 for ; Wed, 23 Sep 2026 10:30:58 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4886876c64dsm8470023f8f.21.2026.09.23.10.30.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184660; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jgOMb7SjXuk3u4/2YZ1h0BpaB3cHG3WQBao057QStLA=; b=IImzkS1d8+MhkVFvB5wUnoSo3YaM+Et/RjbklRTfpqd8vbaBLsRwy2UB8S+BoUj26rlFuF RYegEZoOayFqBGwYacpnV97bx/t8/lFOWkOryKcVH5KVgmUtSM/lKKMAswgx7iJbgaOF3t aLJvgrWUM6Jqx8bYYooUlezxn5JNhcE= X-MC-Unique: tk7Qd-nnNA6pvndv_tKnVQ-1 X-Mimecast-MFC-AGG-ID: tk7Qd-nnNA6pvndv_tKnVQ_1790184657 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184657; x=1790789457; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=jgOMb7SjXuk3u4/2YZ1h0BpaB3cHG3WQBao057QStLA=; b=a1w93VxGgcUPnzuDqR4sAM7dbXxeo6XCPXucc28M/QrVEEAeq8LK9T90ueSA/TKZho +OLWx4EstHqpR3yFz5R8jTVqFF+F6sz2Y4xXYbTGhDbu1I83HNg6Xl3eYaXG56ulGVz4 Hl5gCz5YUuDbusHssBJYwiLaXqLPnrdRHEuONhk8yagaG3C653mx63sZILEB/ZFpG87Z zYs3MF3/R+h9Emagn0M5C7tLhMv1iHh8yYvoDqdz+/t3twY9DSn+pQkZRIun9tTHpnBg GmKdpeVHLn80GRVCoN204Na1S3MIZF/LRGDMVTMq+JX08ek64TPy7UUIIhgcRK2lksw3 3Vvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184657; x=1790789457; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=jgOMb7SjXuk3u4/2YZ1h0BpaB3cHG3WQBao057QStLA=; b=MFFYH8JSKSVW7KhZQKX+hd6WRo32lVE7mzmFbKhmX78jXnfkpT8iy7+DzJRgOX6/nE YdPRP+clqVlQ3mjek7F5dWMY9SGKnhk47WtWfmOLT6Kmezx36gTH/+X3HiDfuLIannKG xbOxSX3zQabB42cz9qmyAAQcEh+rSOuWRc+X8t0lvuuifBLv15sZvHZbcPMzcCTsjI+6 Hjov2bQVEXcERqC/nioffYtOTSwQf9GbO6BczGWio8YfeTCI4TKGJ6PUOoF82znKJNR5 BaUu1KXsBKbL7u5jNd7KL0LjnJ/ptc3pttunMV7g2H7jWJ1vKx6Uqtevr/TPCOHxdyk4 mllQ== X-Gm-Message-State: AFuF++lO7j8UwF8x0IZIhF+sjQm9KW3jzoQ8YdxXt/qmMy+P4D/3anjO Oxu9ONBIqdeq+noWIoOP/BnhZ22uN/kVsD7LxcEu3D5XBApTePTlNEhYQL9XIQQC8JFmzrVOgv/ cumZiNpGAdo39CMu+05zzz96R0+FbHOmV63h4rIe3A5H6MDrKKtry9CVUsMbRS/W9OdRyceCoH8 xJ22sXm3pB3pmM4DqDT3+jA/cwmm5wfq3dEaprOmlC X-Gm-Gg: AYBFou0RH0U+YkhR+NVwr/YEKKKqLgVzRln8iiyRr7b+Gr1tw4FfC85oZ/JB2SHZe1g c9dNYK34SvTU6A8Y6xZ1shHPTdpBtEKq2nXGz7aiii3rBxI3Y7WAwjqp8Q2EYa38Cu/E3TrwIOa wZGTog6//CLA/f5Eq1h8i/fW2FdXnG1Yyqw8tT0pwGPvgWTfPQ8njvR6FWErEkoVCYh3kqFLEVq leueEjDnqYzJOf14aYzRcOHnvfoHdUEEzaQtNWY4mv/Z+QXAU1y9ESBwjfgP6dBHThX+Jjyn+5l 6o3towz1udFIScDqCwkjK4TUH45CSN6h5DWTnj5hfd0/esBUjc/I44jNxSYvZBdRHA1ckMeHCfY mXZGXW59KOu7+7rPplfyeGyKjCoJ6hPkP817w2XWyfy9jEBXUH6Pbp14zDzlzv6HCZN8PnTfUZ2 S06mL3JxrO7YsIlhw= X-Received: by 2002:a05:6000:710:b0:487:27f9:840 with SMTP id ffacd0b85a97d-488670a09d6mr6102010f8f.53.1790184657108; Wed, 23 Sep 2026 10:30:57 -0700 (PDT) X-Received: by 2002:a05:6000:710:b0:487:27f9:840 with SMTP id ffacd0b85a97d-488670a09d6mr6101960f8f.53.1790184656570; Wed, 23 Sep 2026 10:30:56 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 13/17] target/i386/tcg: add decode functionality for APX Date: Wed, 23 Sep 2026 19:30:17 +0200 Message-ID: <20260923173021.317809-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184793040158500 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 Reviewed-by: Richard Henderson --- 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 cbc85498a1c..ec65ae5d75b 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -193,6 +193,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 { @@ -279,6 +282,13 @@ typedef enum X86VEXSpecial { X86_VEX_LIG, } 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 c28cd9809e9..c35869ab500 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 10c6833bb3c..b2e6dd3a488 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -257,6 +257,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, @@ -2531,9 +2535,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; @@ -2608,7 +2626,35 @@ static bool extract_evex_params(DisasContext *s, X86= DecodedInsn *decode) * Here, the position of RXB and (for AVX512) displacement multiplier * should be known. */ - return false; + 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, @@ -2738,6 +2784,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->op0 =3D=3D X86_TYPE_None || 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.ext0 =3D=3D X86_EXT_None && !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->op[0].ext =3D X86_EXT_Unsigned; + } + 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 ((s->modrm & 7) = | REX_B(s))) || + ((s->modrm & 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; @@ -2834,14 +2961,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) { @@ -3217,6 +3362,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) || @@ -3352,6 +3500,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 Sun Sep 27 21:12:13 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=1790184812; cv=none; d=zohomail.com; s=zohoarc; b=DulYD3gX9Gvr7QntUuMKVAT9ZFEqgDZ1LRgZfTg+L7ptCVQAwRvKun71GN9nrMA+Jh3urqCF3vN5xbPJaf7Lgex/yNFP4CA5fbRxZGOu6/vTSfk7nYGOVmP3jYwPUT1jPs+bza13zSG2udL+AdbkPZseoZC83rB9L8acNMjBVtM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184812; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vR9Rd2gkUsuQ24llYsXcBUHzD3lmAU8sX2QRxYy5hiM=; b=l4RIQzk2eu9CBNVmKVawmkkBnE22GcmLgHhchQCW0v1zb+UxN6HRbzpGkBfhtH6/jhZWNBbjXqXA4BEVCVnNBjSiOxxLkYu9q2EP0i/DE6ZEX73psICrw39aMjz9nRwwpvosuDs49THZleA4zqPuuYH2dUOvpAdk/+yj+xTyzPA= 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 1790184812518688.4595549468254; Wed, 23 Sep 2026 10:33:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9QqQ-0000pZ-9f; Wed, 23 Sep 2026 13:33:22 -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 1x9QoM-0006xW-BR for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:23 -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 1x9QoC-0003lr-8a for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:06 -0400 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-588-xgwyMpRXMZK1AVSe3f91rQ-1; Wed, 23 Sep 2026 13:31:01 -0400 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-490a767b782so9273855e9.2 for ; Wed, 23 Sep 2026 10:31:01 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5bae53dsm1945905e9.4.2026.09.23.10.30.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:30:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184663; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vR9Rd2gkUsuQ24llYsXcBUHzD3lmAU8sX2QRxYy5hiM=; b=gNwccxytRotkrw+mEht2U1X2poDHNZ8SiVNWeC+P7POz+vcvXRA1I2KEX0RBcHZHLxh0fb rTc2dAqUb4cjlhk8CM4LTQkVm4/5tavjMYXiDXEezOdQNwMDv+DFYzom9L/6ttaw/NESQ5 nZxGhxGtTybSmfupoL+TyOP+4g88wdo= X-MC-Unique: xgwyMpRXMZK1AVSe3f91rQ-1 X-Mimecast-MFC-AGG-ID: xgwyMpRXMZK1AVSe3f91rQ_1790184660 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184660; x=1790789460; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=vR9Rd2gkUsuQ24llYsXcBUHzD3lmAU8sX2QRxYy5hiM=; b=PBCjYSKRH/E4r97O2ykul1Im2g8XLpX8xZ4yQpTjwOLP5OaMxxWieJfNCDmQ/c9xE0 QUKyEdGpTIOcd/PsVMEymtWGO2oR7p+ipcixywllU+Lzv5Iv+cDwfBWILRHL3pgV7GyP Q4j7hdP4iXi9pCmh0qEuLly7w5RhNisLefIfKlg94zxAUAqOmC5VGGyjAn350/zSrCLf mzQTPew0HX3o7bm99ZJmuMFoL2G3bSt3hJ+kdem90lqFhwjRzXyA9BgIlzUZRA/J9Ehs XrCPGY2e3T9XCR6VDKjYkxgRqQv3uegnIt7T6w662MnZmXfqM7CMO664L2xFMbFEo6Ai pBMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184660; x=1790789460; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=vR9Rd2gkUsuQ24llYsXcBUHzD3lmAU8sX2QRxYy5hiM=; b=tevew2z5U0fJxw5YuMyw+S7a44weC1pFAQEeCusuOONFsBxo8uace4CWO8luTrA3KO bbQz0DlUDEn4DQL0lFtnlRxGljeQdHifNK/6ahKwmb1iYwBAlc49msd4c5Ib3W2wuAE6 N21QaXmtqz/Oq1/5NPvfI8bBgiivdlVwAD/EweXFVhrMNV5xwtEW6dc3C3fJnKBwzBbF 00slQ19RjY2jVsnROci/fEsKs86G5CjZw2EApGCMP0mBDTTahOf50pH2YEDwuxY13/Nq 6F+MBqi9wXtyt2YrLvGRn/X3w0Ee52hX5vGj1iZPEOGJXidfpAXW8Wdhb0QEdIKpVKCf CWBw== X-Gm-Message-State: AFuF++mgKUjRNnKxU3mouT+ouyVr9S9wENCvKcY0nxLneJIEjJwq4fV4 HXABs8WSvgsg3qs8eZ/6DaTt/cOQ6y1Qxx6anGSYa7bHDz8cfUIto07I9/hMD4O1KuzjbvCRKr/ jecOAk0CqVp2KTzWVig6cRQxSfEEE4JoxIc3zJYYMrOZKOEnwJQT0OY+p1UjKYJbCwm7SIgZRjl ceSI4cIfTDsIuKdIW7do/p4rRRNY6svSiccfPQ2la2 X-Gm-Gg: AYBFou26xAT65JEf2vwZo54j2fRqHmTeRAJuE+pac5iAV1O1Uk3k+vNIR0qowQiGDeM rWuXYIPIpxZ112f6tvWWR/0W4iqKZG4WvZF3I1s376Zw3SL0Ktzf8QFln1IQX3BbTXl5OrZl39p nrX2vA1CSzbtSu6FFmpYOrElTkycihzufAQpLmrlAJ9EB7Nso3+Gl2jwaSR3ux0yvZsJdhup973 vMUZ678oq96Io9claefVPGqzJg6Os+yZmKrB0dODO6RNplFdK/q3KL8f1kRTMVWrLlKC0IR/kCB bM6vcUrML+P7RHbzqsSyolIE59abua+6OMHsaJie+89pQw9UadLFcjBlIjGgKd/nGaAwgyCrSdQ 28l7Arf/3ESMYjy7rteRLjgB8DcvZN5qSCMMU57jqqstdwBXIVkMYnHM2w/EHjP75s2AJHQG7Co tvFzKT X-Received: by 2002:a05:600c:4ec6:b0:49f:dc71:e609 with SMTP id 5b1f17b1804b1-49fdf12f351mr49262425e9.20.1790184660197; Wed, 23 Sep 2026 10:31:00 -0700 (PDT) X-Received: by 2002:a05:600c:4ec6:b0:49f:dc71:e609 with SMTP id 5b1f17b1804b1-49fdf12f351mr49261855e9.20.1790184659589; Wed, 23 Sep 2026 10:30:59 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 14/17] target/i386/tcg: implement CCMP/CTEST Date: Wed, 23 Sep 2026 19:30:18 +0200 Message-ID: <20260923173021.317809-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184813015158500 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 | 14 +++ target/i386/tcg/translate.c | 69 ++++++++++++ target/i386/tcg/decode-new.c.inc | 30 ++--- target/i386/tcg/emit.c.inc | 138 ++++++++++++++++++++++- 6 files changed, 251 insertions(+), 16 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index c8619666f07..e7a88074c07 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..b868ef2949f 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; @@ -365,10 +375,13 @@ target_ulong helper_cc_compute_c(target_ulong dst, ta= rget_ulong src1, return compute_c_sbbl(dst, src1, src2); =20 case CC_OP_SHLB: + case CC_OP_CCMPB: return compute_c_shlb(dst, src1); case CC_OP_SHLW: + case CC_OP_CCMPW: return compute_c_shlw(dst, src1); case CC_OP_SHLL: + case CC_OP_CCMPL: return compute_c_shll(dst, src1); =20 case CC_OP_BMILGB: @@ -395,6 +408,7 @@ target_ulong helper_cc_compute_c(target_ulong dst, targ= et_ulong src1, case CC_OP_SBBQ: return compute_c_sbbq(dst, src1, src2); case CC_OP_SHLQ: + case CC_OP_CCMPQ: return compute_c_shlq(dst, src1); case CC_OP_BMILGQ: return compute_c_bmilgq(dst, src1); diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index c35869ab500..e25e2abad75 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); @@ -976,6 +983,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)); } @@ -995,6 +1004,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, @@ -1077,6 +1100,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 b2e6dd3a488..e8fbf31e963 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1583,7 +1583,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]; @@ -1630,8 +1630,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), @@ -1640,8 +1640,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), @@ -1780,8 +1780,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 @@ -1871,12 +1871,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 @@ -1935,8 +1935,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 5a880b9760e..ba347c4e6b7 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1638,6 +1638,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 | CC_C= ). + * + * 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(); @@ -3854,7 +3965,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; @@ -4169,6 +4279,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 Sun Sep 27 21:12:13 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=1790184755; cv=none; d=zohomail.com; s=zohoarc; b=dnxRrBwCs+H9ajSzkIyYjCih5QKO4G38n2Uz7pZhtTgQa55i45MyrGUr9t0MCIFB0BboR3T8mVNP0VI8CNVncWisd3Ta8OxbLc13zhRJFx6cnT3+j4xIRjfvefM4gOgGTg4sqgInVnVVSfnaXQoHWvbZpwaEy5BhaVwxPWZ7RZA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184755; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rQPJYxjsrw8StGU0R9vPThlyR0lItUz6Z0940C3IxIY=; b=fZX6GGrHYSv5I7mazBYmSAOm7qIuKliJPOFNlebBdNtF2jLHbUQ+uSSZkC2j6de9azaejboEwfKMlElbIWoTCv08CQQlUuz8FjoVyAZ0Jo6zuPefyL75nXg4LiDJw9VgOJfw09BiResjnHgFLDMoaE5sqE4F8eINWUHw87QxbdU= 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 1790184755655980.6497346626606; Wed, 23 Sep 2026 10:32:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9QpW-0007Jc-OF; Wed, 23 Sep 2026 13:32:29 -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 1x9QoQ-0006zV-Fy for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:29 -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 1x9QoM-0003m4-2E for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:17 -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-136-CX5XTt5CNki5od1gZY8SIA-1; Wed, 23 Sep 2026 13:31:04 -0400 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-487057d8a3eso101591f8f.2 for ; Wed, 23 Sep 2026 10:31:03 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-488684864c8sm8351268f8f.13.2026.09.23.10.31.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:31:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184665; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rQPJYxjsrw8StGU0R9vPThlyR0lItUz6Z0940C3IxIY=; b=PbHLmxWRYIPGX3TIziZGBoKGf92y0j1llf/V4z1lV5rcotjn7cI5zqtlHxpojMQgdj/lwW qcOROaucsFUAPhk1VXNvY5sRTgwtx1iWKK0aCUVlfh/bZFksrPmTibmYf1gB7uJdnG64M1 Y8DUiTtS+6MYpfQim1O9tdFlwuUlVxw= X-MC-Unique: CX5XTt5CNki5od1gZY8SIA-1 X-Mimecast-MFC-AGG-ID: CX5XTt5CNki5od1gZY8SIA_1790184663 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184663; x=1790789463; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rQPJYxjsrw8StGU0R9vPThlyR0lItUz6Z0940C3IxIY=; b=mdnno0iX56muLq0/3tiPyaF4CMj1nYRy+piewRyhR0Y7sgQFlt6T3bLob++6AJp23B Ya87bn69plkIyZ7T7CCTTbgHor6HIoNLl9dGCOim/mFmSYtX6JA8ttP/njpV7dBMMuBA ARK36sf8sA4+BJT18BtYw0YrbNdgHXxFOG7FGS6ET5Rl+cqe6+u4QGvbaMg419pv7TdY 30Lv8BuhXYjxIzzOrylMhO/7TZLuhLuwKRBgXDjVFKrQT9G26JrEOYlWp2mSchMj9vhk kAC1f4Iy9woAgt8Ah3SXFwLtAF0ooQg6Ydkqdd8GMjdJTSOvkWGbgh5Lg17VolP1pVSn DvAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184663; x=1790789463; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=rQPJYxjsrw8StGU0R9vPThlyR0lItUz6Z0940C3IxIY=; b=QBJQUlZ7ar0R6svCAYLhkbMIh+83hAUKc1YJk104Av647Z14KGAR9TT5tg/Zk9IYAW 4KepXDnw4lFCvSsLbi0pyIqB22QXWezg9B73aEnFq9a0PGRB0H16NvVqzPiMym59cV1e 4portIBumyg31DhLwP7g/N9bmRc6GiTmovrqp8GJFq8STJF3XnBZLxz3cbAVh0B4hbGY vX+fk73O/xJwxa/9Josu1jBf2Q0b8dZufTFKqdM2PrXMCtuykk1H2NbKtezihebVMq/a vwKEKCmiAZXpAnplSTNuP5Tzmo7hJ3W7c7SGGGWZQEVbMTvTkrpb8BLvzYawS2KsPkTM Xakw== X-Gm-Message-State: AFuF++lVAOXdtRLVA0xzPNf7AAYMqguxHsKYPQWS1c4gBQQVIFHVuiUx +5ZFt9liZ7BIYQk5EnDF93LSr8DW4hf+hZYkMgJuL2PH7LUmqOTJvXKwQ5mdPOJGPidBerWvPo6 7AYRVuFodh9W3qQUbYe6RUjZCvQpQbv2nTQ1Jfg+4/19Qc+6PNNt+EIjn+pUATPtVPiEwKXQ+Bc Jzofajysv0HvR2hlldEtj5/EavuGLRwQSkCu232Z3m X-Gm-Gg: AYBFou3nogerS0k1vzrGyl1jYEw/0rDN3ajQ1b6ePMTQFKmFYzI49gUCLMcMnIvEbos n5zvp5IdGkQ++NUkh51/gGvbAs3RSsPhI/+FN7OsY1cPdV1Tc+m56UzHspyjA+iCvq0qorUIno/ xNlcXP1ZMJwqAnf91vwyvH5mphF16uqYFiXAmwIOXQ2VXoUVn/H3JSJQXrATT7PL5GQLubXkN47 uBPbOpzUHTTMV7Bdt/21JO8t7h6xlouyBItVGjnLQDpL1g/R4r7PsOCQyn3Hul7DwuakzoTc4YW RGyEBPBfybhiB0TIE9cTXwWTkhFdS9rZrcJ50RagioGHbEQS4pEmK8Z/K0HuUYfmbPdrlHWn2fV Rb3VgX9Eo4IRWefns0jzhxRZgE5Qq2MRvIidJTpz2ufGO4tFncHubL2ZJf+iksrgUU1xGl7Wgum uABp16 X-Received: by 2002:a5d:6f06:0:b0:487:27f9:834 with SMTP id ffacd0b85a97d-48867095a1emr5783110f8f.41.1790184662214; Wed, 23 Sep 2026 10:31:02 -0700 (PDT) X-Received: by 2002:a5d:6f06:0:b0:487:27f9:834 with SMTP id ffacd0b85a97d-48867095a1emr5783031f8f.41.1790184661480; Wed, 23 Sep 2026 10:31:01 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 15/17] target/i386/tcg: decode APX instructions Date: Wed, 23 Sep 2026 19:30:19 +0200 Message-ID: <20260923173021.317809-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184756671158500 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 | 332 +++++++++++++++++++++++++------ target/i386/tcg/emit.c.inc | 62 ++++++ 5 files changed, 344 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 ec65ae5d75b..c7237393e1f 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 e8fbf31e963..453242b4a3b 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 @@ -280,8 +282,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, @@ -869,28 +873,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 @@ -923,20 +932,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 @@ -1025,7 +1034,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) @@ -1590,9 +1599,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; } @@ -1619,6 +1628,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->ext1 =3D X86_EXT_Signed; } else { @@ -1630,24 +1642,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); @@ -1660,12 +1672,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_66 lock), + [0x09] =3D X86_OP_ENTRYwr(DEC, B,v, E,v, e= vex_apx p_00_66 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), @@ -1776,10 +1788,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), @@ -1812,8 +1825,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)), @@ -1821,10 +1835,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)), @@ -2054,9 +2069,203 @@ 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); + + /* + * All EVEX-promoted register-destination conditional moves (all CFCMOV + * cases except "CFCMOV rm, r", and three-operand CMOV) have zero-upper + * Note that this is specific to CMOV/CFCMOV, and not ZU! + * + * For NDD=3D0, NF represents the direction. For NDD=3D1, NF represen= ts fault + * suppression. + */ + 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= zextwT0), + X86_OP_ENTRY3(CMOVcc, G,v, ZERO,v, E,v, p_00_66 evex_apx= zextwT0), + }, + { /* 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= zextwT0), + }, + }; + 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= zextwT0), + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= zextwT0), + }, + { /* NF=3D1 */ + X86_OP_ENTRY3(CFCMOVcc_ld, B,v, G,v, M,v, p_00_66 evex_apx= zextwT0), + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= zextwT0), + }, + }; + + 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_MOVBE(DisasContext *s, CPUX86State *env, + X86OpEntry *entry, uint8_t *b) +{ + entry->gen =3D gen_MOVBE; + if ((get_modrm(s, env) >> 6) !=3D 3) { + /* skip the load/store to be able to use MO_BE in code generation.= */ + if (entry->op0 =3D=3D X86_TYPE_E) { + entry->op0 =3D X86_TYPE_M; + } else { + entry->op1 =3D X86_TYPE_M; + } + } +} + +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_GROUPwr(EVEX4_MOVBE, G,v, E,v, evex_apx cpuid(M= OVBE) chk(nf0) p_00_66), + [0x61] =3D X86_OP_GROUPwr(EVEX4_MOVBE, E,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), + [0x69] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, I,z, evex_apx_zu sext= T0 p_00_66), + [0x6B] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, I,b, evex_apx_zu sext= T0 p_00_66), + + [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 @@ -2073,6 +2282,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) { @@ -2526,6 +2739,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 ba347c4e6b7..c353d97ee74 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1633,6 +1633,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); @@ -3137,6 +3161,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(); + TCGv_i128 t =3D tcg_temp_new_i128(); + + 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); + tcg_gen_qemu_ld_i128(t, s->A0, s->mem_index, + MO_LE | MO_128 | MO_ALIGN | MO_ATOM_IFALIGN_PAIR); + tcg_gen_extr_i128_i64(cpu_regs[s->vex_v], s->T0, t); + gen_pop_update(s, MO_128); +} +#endif + static void gen_POP(DisasContext *s, X86DecodedInsn *decode) { X86DecodedOp *op =3D &decode->op[0]; @@ -3334,6 +3376,26 @@ 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(); + TCGv_i128 t =3D tcg_temp_new_i128(); + TCGv new_esp =3D tcg_temp_new(); + + tcg_gen_brcondi_tl(TCG_COND_TSTEQ, cpu_regs[R_ESP], 15, aligned); + gen_helper_raise_gpf(tcg_env); + gen_set_label(aligned); + + tcg_gen_subi_tl(new_esp, cpu_regs[R_ESP], 16); + gen_lea_ss_ofs(s, s->A0, new_esp, 0); + tcg_gen_concat_i64_i128(t, s->T1, s->T0); + tcg_gen_qemu_st_i128(t, s->A0, s->mem_index, + MO_LE | MO_128 | MO_ALIGN | MO_ATOM_IFALIGN_PAIR); + gen_op_mov_reg_v(s, mo_stacksize(s), R_ESP, new_esp); +} +#endif + static void gen_PUSH(DisasContext *s, X86DecodedInsn *decode) { gen_push_v(s, s->T0); --=20 2.55.0 From nobody Sun Sep 27 21:12:13 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=1790184775; cv=none; d=zohomail.com; s=zohoarc; b=eLb1pijC5C6nzLg/1CbaH/IXabuAOLEyzAnGCYTHL3RHFRYjKJbJuxWPAcGZs52F/WEUUcGcA2NdR75E6ZIM1HtL1emFZ0fEqhFhzuPDc/wacYpX/UtnZ2cuBydih7RjtDlqAC9ED07AnL6gFAhUbySxGXZK5R7j+3PjFD/36/o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184775; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=/XXIXhr9rwnA5+ykhbGO3yVGQuL3XT8fPCd0c2xNb+I=; b=caeS3mTmdJZPi5BWdoKDZBh8NlaarXgwPhpANTb46MXBEUp7BhBLLJNI94ZSb0TmayiY1VrOk53wI6g7+xEIj/9pbVwZ+pkJSFhxfl79QZ8mudafjPQ9/8X9jq39MAncaFOBxlao/i2N/ZizLzkh/8flFiiwgImUeqwOldqhBU4= 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 1790184775458909.5707343169536; Wed, 23 Sep 2026 10:32:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qpc-0007jV-RE; Wed, 23 Sep 2026 13:32:32 -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 1x9QoO-0006xh-OR for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:29 -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 1x9QoM-0003mD-3O for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:16 -0400 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-39-Ndxdv_aiMWmvQVNTdKmZmA-1; Wed, 23 Sep 2026 13:31:05 -0400 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-487038a4a88so568432f8f.0 for ; Wed, 23 Sep 2026 10:31:05 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48868889409sm6940538f8f.35.2026.09.23.10.31.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:31:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/XXIXhr9rwnA5+ykhbGO3yVGQuL3XT8fPCd0c2xNb+I=; b=ebWa1CzoyB20TlNGVMSkHRtgUJMkj6Jr7yD+ZPl+fvcaurPmtBjBT9BG5qwDzz920w6auF +M9eddlColjPaWfqC/e3CHDJ0vVvlk3TUnA3jY7BBXbAivyjnKADtFRggqxPtl5p1s9hXV 8QLqPjzVIQBJRcO6WWtcLa+C8OHh7og= X-MC-Unique: Ndxdv_aiMWmvQVNTdKmZmA-1 X-Mimecast-MFC-AGG-ID: Ndxdv_aiMWmvQVNTdKmZmA_1790184665 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184664; x=1790789464; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=/XXIXhr9rwnA5+ykhbGO3yVGQuL3XT8fPCd0c2xNb+I=; b=MkYy5p56uest3Dw3PSZrUtYbEWfy8G2NyRyxB4yjgsquI3/tzddRFBqNFlDcfMoJUU J67fJEbXRI7we4AlcWg1mjVtmm2sxH6mZoYsf5rIZe4wpLWJGi5+uOSXs9gT2XZVelSM GDhA0JMChdwFjM6KZSILrLCNZChjqYZWmQ1QL7uRcCa/i7QiDkMCFLWg4SJSS6fOeA/9 NuPhDVxb1apJL/m8WqLU+dnBJrxJabqvW247zZvVVMh4q8z+oK7o7TiEseNiiZp+nvHo /kpCYoLZNODFyHFnnPPjeWfMuXLqateAk/zC/vHmLN9ImZxswPJuyFAvMZtzRK/CaLLx 5HSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184664; x=1790789464; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=/XXIXhr9rwnA5+ykhbGO3yVGQuL3XT8fPCd0c2xNb+I=; b=bD6gUPa4rg5/ohprKcGld1+DozTU7FBgXTQoy09FWdhQIx2rmm3sc1rsqBY2TX0Dyy CpPAqLV1v0Ibaicx2md9vdK67svgTcDz7scIlfCfrwHdaC/OUiF9yBh79570zCSzVBbG ZyrRyJqn52BXsC697NqMqzhHkXbLDZa0newN2nSGAKZX3TrCAejaxPxMeiFrOC5J6OPa 4psi7uNpYmCCU9w5iPx7+A2f/bxAwTEAG0QkUmBEqod0yK1/ASuWERZl8wxAJuLjASro DQ9nXX+6UXMtONShXgHsq9trVeBvsT8g6ak2tWlnYshER3BsQIID82gZwCk8PC2HDud7 qJxw== X-Gm-Message-State: AFuF++nMJlVKWPfRSp8E6/N5Klx5P70bvPKrx4hTCOv6MHCzLFNOeDDJ 5Cld7Dh+NquMs0Ehq58q+npt8Fp0jHv6p7tasXG8Z+PMcYh0WEubsNdawzRVanfulQx91BsHH6e cVlMvI8myob4t00dZAaU56UPN8tDPj21xboJ9cQAsYXO0j7dav2pvpFBzCeb3ZP36K+LAeXkmF6 +i+HnqGitfNrAlFuCvoZzWM8tW/PMgNGbJwIsZK90q X-Gm-Gg: AYBFou1bLjT4cO3CNZs1r/m8x9OR/z5YZ9mDloxo14ZWSy8MPoe6g7qr0+k/gujrbE2 0NCO+OauBKXvxJSD7i2yt+1xEedExchHFUmyK0sv9y7605lQad98DDqSdB+mZwNOJtO/1YB5oDA upavkw+NChuS6Z87DjDCQ7DDFOyfKsUWVIbr6gPd4BJ5j1ycN4/3kWKgT2+LbAaTZVr6Tn2ls9z q5M3rYEVVt5q3IEA8kZtLbHaIfcdEUPFAYPU8HkgSK0rWx8zTHU5H8TP9k/DdnxHRDMBSvIIKaI sorsA1sOz7LZRWnnWOcnpDsYeo86YoueB/P2U3eLojf/zX4u/un+v+RisKHJSG2ZpeR/v9hLYA1 3d0e0ZyXO0crlP1KBrE2E3OeTXHzxLTr5akjwcM3iN/0cEjv822J3OomkIgl2TP3RY+evlo4+Sn eCLheC X-Received: by 2002:a5d:5f88:0:b0:485:8a46:b3cc with SMTP id ffacd0b85a97d-488670c51fcmr5939057f8f.52.1790184664665; Wed, 23 Sep 2026 10:31:04 -0700 (PDT) X-Received: by 2002:a5d:5f88:0:b0:485:8a46:b3cc with SMTP id ffacd0b85a97d-488670c51fcmr5939000f8f.52.1790184664209; Wed, 23 Sep 2026 10:31:04 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 16/17] target/i386: extract computation of no-autoenable features Date: Wed, 23 Sep 2026 19:30:20 +0200 Message-ID: <20260923173021.317809-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184776667158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 2a69ffeda40..b6ad69d5047 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -9723,13 +9723,10 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **e= rrp) */ if (xcc->max_features) { for (w =3D 0; w < FEATURE_WORDS; w++) { - /* Override only features that weren't set explicitly - * by the user. - */ - env->features[w] |=3D - x86_cpu_get_supported_feature_word(cpu, w) & - ~env->user_features[w] & - ~feature_word_info[w].no_autoenable_flags; + /* Override only features that weren't set explicitly by the u= ser. */ + uint64_t no_autoenable_flags =3D env->user_features[w] | featu= re_word_info[w].no_autoenable_flags; + + env->features[w] |=3D x86_cpu_get_supported_feature_word(cpu, = w) & ~no_autoenable_flags; } =20 if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && !env->a= vx10_version) { --=20 2.55.0 From nobody Sun Sep 27 21:12:13 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=1790184798; cv=none; d=zohomail.com; s=zohoarc; b=VkHeAZIC63RDzTEZqbHW1oR0RNOgSb5K9QAq2+sdbfhB/+KqCn1weRmngzB7OE1LWiGxzbo1AuuEkgZStktdg/dwc+Sid50jYI9hA7IghKkf6RuyTgZTpvh1xr7Hsw6N/pa5Jmey03OvbKrzh5RWddkLaBxyTyUTFdTN2SiaM5k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790184798; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=F3LJcrFsY6gDI05Rg2w/j7BQ0U1fMQIzC7scyP9KnJQ=; b=J5QgIc3gnWs/mYq27fojDKscL7hHhXB5zyOsEiBB2F+fa/gsR3wIHYBcs4uQZbvbJw8/1JiEjZfek30f7o+frk6SL/LlvN9mRbXvcaSDCCbRb/AbRDmTaUutPcLre0N9lIM+FLSSIxrb6IGlJre3Onri4GficKOlEwBVH9TlvW0= 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 1790184798446197.80606792232368; Wed, 23 Sep 2026 10:33:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x9Qq9-0000Rj-SR; Wed, 23 Sep 2026 13:33:08 -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 1x9QoP-0006yB-Uq for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:29 -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 1x9QoM-0003mN-42 for qemu-devel@nongnu.org; Wed, 23 Sep 2026 13:31:17 -0400 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-380-obfeThjvN0qo-C7Aj0ihPQ-1; Wed, 23 Sep 2026 13:31:10 -0400 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-49cf4cc2125so5528925e9.2 for ; Wed, 23 Sep 2026 10:31:10 -0700 (PDT) Received: from [192.168.10.48] ([151.49.232.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fe5bae53dsm1954355e9.4.2026.09.23.10.31.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 10:31:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790184671; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=F3LJcrFsY6gDI05Rg2w/j7BQ0U1fMQIzC7scyP9KnJQ=; b=JvY5j43sUqp0NuM/3nL/1uylvg+6z/wojKu5uNjfArBxCH4Wr+1tRZQqsfGQzMPkStxuDD DN4gNESdF/cDvlaqbM5MZ+mloCWXMDRax0S68k7e+kMj6q6+RNWge/H0b6s2lE/4FtHuri LWPxCVzi5O4K+1r9mCjGbuI2YSL0B14= X-MC-Unique: obfeThjvN0qo-C7Aj0ihPQ-1 X-Mimecast-MFC-AGG-ID: obfeThjvN0qo-C7Aj0ihPQ_1790184669 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1790184669; x=1790789469; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=F3LJcrFsY6gDI05Rg2w/j7BQ0U1fMQIzC7scyP9KnJQ=; b=AgjTrJF52du9Nwd74/pAQDhhRtj/3LLwXZfEVbrAoKqDB/bhdu5JvgaAvUYTDIbT9a EOQp8Sj3qAuTXnF90/58YsF64L38fF4lLaAGNdz533u8LaFYR2VnR/jIsyH3SBfhcPSt fq+D+muXU5zmih0/Hzc4x7U73VlR5/JmfGyorrw+COrLkjgn0ZUz6GfXyWSZc+OJvM73 c2/uM1cmoZO7TlQvRUPuzwGst9xcFn2zFOr1FTKFboX0if9Hg9VVMxS/qJM6cQ7ZQCE2 75hhLu0yA5ggZMcpVyyvYWu4wvyvheNsO7GgjPu9W64ap3AYkIWKsqAx1VWaIdtxsIsM /lcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790184669; x=1790789469; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=F3LJcrFsY6gDI05Rg2w/j7BQ0U1fMQIzC7scyP9KnJQ=; b=HNC0+2K6Y+MHONsd11xbUX2KbqR62MZTTQeZohjKwHM6y4I/sfaQf7V/bpycW+fhnZ rABBnwbjp8Qb4J9BaGMKV3QhctUlmSlX72UVG+DRGgvzm83FvRBRDA5MFvCsLNO3FyxN 0tCsvxz6lepYhYGPw2SPdJBHDmz0re3eelcvAkno6GLJJoBK2kLOOKL5lnFlEECroYX8 HHAs+JtFqx/u9YD3OznE13c4Zek9L+uHNaVYst+Vj6qa2WzZGf7e1epDDgcUqMao5SrG 75mSoqQWuDNnS+QVb/G0nFHnclcYwmsXSEAcXKau2YgUtKlFA7S6CVkJJQjE2VeU25BV Vyjg== X-Gm-Message-State: AFuF++m8gFi6+Rt6ydSzT3Qhc3kw8I39QdIc5YK39fekb/QIVRcumHN9 oOpAsXR5rEkXarJmnEpEo+y1lwCTzJTZHvA5b4es7GFzIgqigTxax4ie8IG1qT2fZ14XmqTHr+H wb/zVgWFg8yYEO0ZH1TDFllsmeWSuXxWB8PF3RC8c7rkNgW8y6i2dmgY4NhCHgFkA7OsTBFZSB8 iRscp3d4Uka5q2u9VjS/EA/cC4hE7Fb2CGS8cgzax9 X-Gm-Gg: AYBFou26pQRb6Kylyh9LJ0soavyKABrj1Fxitf8Bt06FhqAgdX8JfPrL+MFGo/2QiED NBLXN5p8By8ew6Y6QtLt+n4ymeJcX8rRSXcZIpGyQX0xE/u4hlizWIvY9NOqrOjGmAu/snCVXKC Xp2sXAkMhu74sSSy9POTtUdRFVp6ZNJeXNr+SpdzK1u0GG0TKaIVT/8vqBg8ZrgwY17cDlwXKwe QNpb6ujhYUq95nalAy1CmPpI9DwPhiYDmNfKDb1lrYNnpPikfqYXywv3nHVeZzSwByzUHEf7KuW 5LoL88bd36/xDO13s8CbRGa5LoXIxc1q4OySwTba67dAH2vNcTRRdmLN5qhE2GaiDX70FouQOq6 yTcTyPUFjJ07uEuNZSyfge6HbsCtuiEhCCpZQzgDXjg9oSJJ+jQU47JAAmyJ9nGsoHIt2jZ5TzG wUkpcj X-Received: by 2002:a05:600c:4ece:b0:49e:6050:9fbe with SMTP id 5b1f17b1804b1-49fdece7b76mr52890495e9.15.1790184668932; Wed, 23 Sep 2026 10:31:08 -0700 (PDT) X-Received: by 2002:a05:600c:4ece:b0:49e:6050:9fbe with SMTP id 5b1f17b1804b1-49fdece7b76mr52889935e9.15.1790184668326; Wed, 23 Sep 2026 10:31:08 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: chang.seok.bae@intel.com, zhao1.liu@intel.com Subject: [PATCH 17/17] target/i386/tcg: mark APX as supported Date: Wed, 23 Sep 2026 19:30:21 +0200 Message-ID: <20260923173021.317809-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260923173021.317809-1-pbonzini@redhat.com> References: <20260923173021.317809-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: 1790184798940158501 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 | 34 ++++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 5 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 b6ad69d5047..62cce7d3105 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 @@ -1017,7 +1017,7 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t ven= dor1, #define TCG_SGX_12_0_EBX_FEATURES 0 #define TCG_SGX_12_1_EAX_FEATURES 0 #define TCG_24_0_EBX_FEATURES 0 -#define TCG_29_0_EBX_FEATURES 0 +#define TCG_29_0_EBX_FEATURES CPUID_29_0_EBX_APX_NCI_NDD_NF #define TCG_1E_1_EAX_FEATURES 0 #define TCG_24_1_ECX_FEATURES 0 =20 @@ -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,9 +9722,37 @@ 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. + */ + uint64_t feat7_1_edx =3D env->user_features[FEAT_7_1_EDX] & CPUID_= 7_1_EDX_APXF + ? env->features[FEAT_7_1_EDX] + : x86_cpu_get_supported_feature_word(cpu, FEAT_7_1_EDX); + uint64_t feat7_0_ebx =3D env->user_features[FEAT_7_0_EBX] & CPUID_= 7_0_EBX_MPX + ? env->features[FEAT_7_0_EBX] + : x86_cpu_get_supported_feature_word(cpu, FEAT_7_0_EBX); + + bool apx =3D feat7_1_edx & CPUID_7_1_EDX_APXF; + bool mpx =3D feat7_0_ebx & CPUID_7_0_EBX_MPX; + if (apx && mpx) { + if (env->user_features[FEAT_7_1_EDX] & CPUID_7_1_EDX_APXF + || !(env->user_features[FEAT_7_0_EBX] & CPUID_7_0_EBX_MPX)= ) { + mpx =3D false; + } else { + apx =3D false; + } + } + for (w =3D 0; w < FEATURE_WORDS; w++) { /* Override only features that weren't set explicitly by the u= ser. */ uint64_t no_autoenable_flags =3D env->user_features[w] | featu= re_word_info[w].no_autoenable_flags; + if (w =3D=3D FEAT_7_1_EDX && mpx) { + no_autoenable_flags |=3D CPUID_7_1_EDX_APXF; + } + if (w =3D=3D FEAT_7_0_EBX && apx) { + no_autoenable_flags |=3D CPUID_7_0_EBX_MPX; + } =20 env->features[w] |=3D x86_cpu_get_supported_feature_word(cpu, = w) & ~no_autoenable_flags; } --=20 2.55.0