From nobody Mon Mar 2 08:46:30 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=1772376325; cv=none; d=zohomail.com; s=zohoarc; b=V3PuPec0EUs4AO9MDfp2l0soQ8QXWfYQEGmsLtnbmfPv1HcNZF1RLDV5PYBKjZ+9VUVBC5V+YEv6IrNzx7VPen6G6sHnEzyUvqM2na77Y5mAbb3GII5dKGuurniPIHN+jXSdC5aHjaDPQXjxoLUUN5JQb8ibLPrTcvuTLyH41LU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376325; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=ykpCYD8K9F4vTS88B961FauvZq3r+CLZlRGd7yZSLQA=; b=mOJ4grr522Xl2yVt/Jge+zWCkmqQ8wzSsKWa70ArwJlTt3/mxxpjG/oj1RWeTb4hMZsm3wcGknh7Dfehtvi70X7xc7oM8/MprAve9IFjZgxl5dIu6MXcQMm67234d/fRx18vGfe1RHj4ZunwtdkeMPV5ltlUWeDEpBXxzg+qVrU= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376325403852.551261175422; Sun, 1 Mar 2026 06:45:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi06-0000FK-MH; Sun, 01 Mar 2026 09:42:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi05-0000Eq-43 for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:29 -0500 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 1vwi03-0005ha-O0 for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:28 -0500 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-437-yyzZBOC9NRymh4VYdxT93Q-1; Sun, 01 Mar 2026 09:42:24 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4839fc4cef6so43585855e9.0 for ; Sun, 01 Mar 2026 06:42:24 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcb9b97sm178113585e9.7.2026.03.01.06.42.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376146; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ykpCYD8K9F4vTS88B961FauvZq3r+CLZlRGd7yZSLQA=; b=Dxol/bYZly80XxsrMX2c4NFcnV9x4f7eWvu5SlBVqaM+Fjn5DkaQT2OMwijEK2X3zcie2N PT4OBRpdaqKjb7EEmhgjNQbUZVzqdXln2Q4FRL5rVxhRL+YxxykxAj1psPqce89pc5IbB5 pSiUxYh2Hy8obqxwAqor90ws+uq9VBc= X-MC-Unique: yyzZBOC9NRymh4VYdxT93Q-1 X-Mimecast-MFC-AGG-ID: yyzZBOC9NRymh4VYdxT93Q_1772376144 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376143; x=1772980943; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=ykpCYD8K9F4vTS88B961FauvZq3r+CLZlRGd7yZSLQA=; b=uJP7EHWWjmn9pn7I9McfbehqZ+96FIS0U66LefcX43UY8y2kfWhApwyr2Ex49hOKhj edMXtta6BuLz8FASTvXQtCEOfQ54/FaT2QlqtVzbXqivprOAjn+1e3GrKdy5DUwCvWIx y2ZorX+UyeHbeXtZtbFQ7+ov9iFcrZmKqMmycTWQSy8KQ3PV1p759nNJWwZS5/1Vq42T eioaFXqDgGJ3l7zqSVhqZokWF+a8t/lvYbfz3vdWZs2Y7N2EkRfGBH6vqyReRTM+iOg1 rY5s3T9gIL+sIer6WzZ3p4GAWkqgRVVVl3OSVTyJbiiBdeLB50DVAIrp4n5jPsI62cAp /uKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376143; x=1772980943; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ykpCYD8K9F4vTS88B961FauvZq3r+CLZlRGd7yZSLQA=; b=tfJzPpLmqk3GEFYlE9tc/R7cQ9Y9+xM4O0jXT09HQY+cAkdj8qSiVCbF9E/5R999I1 HeWgCdLmuhFrRMTSUxaUMlg4zwiTEQ1lnT+AtVgVBabIiJ4ZHh4GVxLT4Eo0KCzM2M0D ueZO9Pu2QkPVkFKBdcZ7mF1jKnuxrehoE0htBpuX75s0wQiMulEVow56dV+2MmJLvtbp yMHTEpjBaVBPO2A5WeD+VJzeajjA/6bEpUQuC7vsltDA+uht6z9gQuM2sTbOe24rT15+ TCSHvvIg6pWWDxwY98p61Y/GTUKrUwcgKi2Y71cmbjU8E9ZGnr62Xp1x5EACEZ0kRdEo pp0w== X-Gm-Message-State: AOJu0Ywr944b8OQnHv5gWZY67lYdVYICRDrhYT1UZGZbP+L842f+xJeH 8xQASDxqVKfptls0+zYU1Ck1XGkBs+VIGfMGbmk4vkYDBPrUqsDpwzbm/SvaAVpnRcySrPmSQH9 drg4XQChtFHq3I8AysrvbZXfLk13EnEuxlLyo+anAQzZM8vis8nmWh/aQTVq+Ko90Uvc8iIkfXc /UD6cetGlDNFLevhTv3HXPmR5Zwmvmxg7kxY4Xv1Kl X-Gm-Gg: ATEYQzzavaeTW2yFP2tz/shymRBYF/JqnzWvIOCbLEOUJDICPV+IYJkHz6htgZm8bNO p+qp4qOYfXrI7yfToJdRKJfRqP9e352evNuRlKEb/B5bi/qKbqAphgip8Sc4Z26ngTpgMpccEAu Mj4qpiIl3wu7gn+3cLsM8aQvWz8S3VisVt6bBT54wpsrXL+eto8Z/rl3l2Krwed4RH6/X0vi8Oe QM2eVG6nIT25CUuM7I5TsH+1b3Mn2oIWgU/TZIZClukcx7ccLcJf2N2ivHmbC1/6D82We+4gUya TppxLd8+sn7zpMxtYWOFtrEPatqwQ+W6/Hq47cFRtjGJptZ8qx3FAJH7kEfiWDlfk3KDigXd5/d K3oHh7LhKGvPZJSbhf20A5zVfm8s24XYMBhf9ZG6Xr1xQIqLa44lgTpS0FzazyANyN9dkEO8oWB /ldC5DxBjkD9ETPy+KGi1YuNF36lw= X-Received: by 2002:a05:600c:3e15:b0:477:9890:9ab8 with SMTP id 5b1f17b1804b1-483c990670fmr145979975e9.3.1772376143190; Sun, 01 Mar 2026 06:42:23 -0800 (PST) X-Received: by 2002:a05:600c:3e15:b0:477:9890:9ab8 with SMTP id 5b1f17b1804b1-483c990670fmr145979535e9.3.1772376142639; Sun, 01 Mar 2026 06:42:22 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 01/18] target/i386/tcg: move check bits out of validate_vex Date: Sun, 1 Mar 2026 15:42:01 +0100 Message-ID: <20260301144218.458140-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 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_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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: 1772376327096158500 Content-Type: text/plain; charset="utf-8" JMPABS will need the W0 check; move all of these checks together with the others in disas_insn. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 086a3bcec18..6fab597fafc 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2722,24 +2722,6 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) if (s->flags & HF_EM_MASK) { goto illegal; } - - if (e->check) { - if (e->check & X86_CHECK_VEX128) { - if (s->vex_l) { - goto illegal; - } - } - if (e->check & X86_CHECK_W0) { - if (s->vex_w) { - goto illegal; - } - } - if (e->check & X86_CHECK_W1) { - if (!s->vex_w) { - goto illegal; - } - } - } return true; =20 nm_exception: @@ -2991,6 +2973,15 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) goto illegal_op; } } + if ((decode.e.check & X86_CHECK_VEX128) && s->vex_l) { + goto illegal_op; + } + if ((decode.e.check & X86_CHECK_W0) && s->vex_w) { + goto illegal_op; + } + if ((decode.e.check & X86_CHECK_W1) && !s->vex_w) { + goto illegal_op; + } } =20 switch (decode.e.special) { --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376275; cv=none; d=zohomail.com; s=zohoarc; b=L7EfoBYKnhPQuWPPKmKoq/VvA7malRTmAafnAVPT6lrvMF/WslSPll4HZPiwaOFqb/uSEZeFIvBtPz85+gSofjZFn1e7PUQTg2lx401vORoSsch+UDRyk5jWpyW+La10JKlJl2KYuppwcgw+rINb2ugydokjbuU8xDj1K7c9yGE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376275; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=4rA4MuoUWmXPQm8XF//NcOYkPAnhjZ821mcmAcEjJyA=; b=lheesZ7nc6luPsDBJl8bZvluivhh1JSfMBku5hWvOiWbZlW1DPd1v2CHug155mhGIVy4lJDYEAxRmvYmCYlh1bKzO7BWvCJdo6AhR1uW58P2IdvHymcxP9uB7WvFElEiNjpF4I7BvG/fuq+n4A+JFfsxE7QffQ2gRwWs4ioHecs= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376275404649.3944949458341; Sun, 1 Mar 2026 06:44:35 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi08-0000Fm-60; Sun, 01 Mar 2026 09:42:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi07-0000FR-1F for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:31 -0500 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 1vwi05-0005hp-7g for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:30 -0500 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-120-5-i-QV29M--fEtKshWajIA-1; Sun, 01 Mar 2026 09:42:27 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836cc0b38eso41586505e9.2 for ; Sun, 01 Mar 2026 06:42:27 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd75df90sm359259615e9.14.2026.03.01.06.42.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376148; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4rA4MuoUWmXPQm8XF//NcOYkPAnhjZ821mcmAcEjJyA=; b=bjPTrXiiClzcTyEMa8UMwnFlBY90hdfS7s/rxnL8mGHJjhcjoIb++BpnRkPFzi8O+mXqkH pb0bcabZPy5s8CSdnqYVxvk/sXZCY5v1mfsKdOC9D+CkWyv8T4UaG3j2BKzom5NFFT9MT0 mACznU4J3jLE3Vgg7JByxYrdacLGsyw= X-MC-Unique: 5-i-QV29M--fEtKshWajIA-1 X-Mimecast-MFC-AGG-ID: 5-i-QV29M--fEtKshWajIA_1772376146 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376145; x=1772980945; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=4rA4MuoUWmXPQm8XF//NcOYkPAnhjZ821mcmAcEjJyA=; b=YwPhqr7zqlP8IP4ZmgK+mwPP5vodTkIc4T00Nfwwz/ow8mz5qkC3IFIbvc+bErqi5X V+2MY2VVk8aR+VSYnWA2vpIB5unD0CZP7Ilzd2oa67aVHLXlEpSnT9WmoSMtC/xhewE/ 2XAUsN5FqHbbhjS13B2omw4XSO5I5ZuNBHr4i5l/AZIWO52vXFX41OECaqmNh4/uCt1y 4LsfmEqoETeEYpd1LmBanOPJgwqI78s/tXfXWaa1NNVSvWxGYOq5gCtb0QAD4Tkk5ihF WBiVOcx2/yEhf3BXNDRJ7qo/GmY7n4gaSpxDfkwxV9wppoEm5v5sWbPfIdUmqztpilcY jdCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376145; x=1772980945; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4rA4MuoUWmXPQm8XF//NcOYkPAnhjZ821mcmAcEjJyA=; b=PI2kyeKnNUv+Z693kInlGN6VLqGOeKtF6PpyI42MyRPYh4eHC8+ATGpULVeieY2eNE fWvcXKMsbcyN6UQb5lNp4sENI1F0k/KOS15o9AsVoDW/jqohLcArwYP/HhGSsDagEqJX JUQlyhTAHRhqwmerO/1J47hWlEx6KEaTp/LX41UUlj+SJLIdRkVlbAhPW8RsqHf70xrf t1bx0C7H1clfViNvpNVPZbbaLXbLRf1LE3CN+aT+EFeevPNrssglcF05xCGYDi91W42+ FR0KEoIuymghzH3QKymcAi8qrzsOrMyL6ZnO9VwustRUPgq0V6HVDlIXPxSrATd91H0E Pnmw== X-Gm-Message-State: AOJu0Yy7kq6z1mpNFl/nAUzFttjd6F+HF5HQDeKZRbP62mzxIlrX/kFj 5jQU08Ci8q57l4e08qm4B78sx8OTs4zIXyQgvQisjip3LzklCvmonZqCVaA8mB8ttOV5UVOXfgQ BdzCe0drh04gOW92MMWosfQ3mDpX+dC8Xv4JmvTuQOZOTDSEsehdYoYp/JaWR7I0wIlHFdgV4F8 MFcdqP3pMOSHhkWM5cUOC8vhKnmypDUVQlBk7lIwEg X-Gm-Gg: ATEYQzwecQ4NC/aef98Ckwv9MZmKebOBu84VnB44UthDIVi4nQJixDgPj8/JdjtTxpG YJ0a7pC5Msntxuh2OHupPorTteJ0G5h2OeDgdMdm5cWRz29Bl+GWwgCmdv/8Pn2DTWQfH/VfEPy +eT5d1STFOQYbjkb2XdkHgUYI3IYkk2AOfuTxffXUQN3M8RmRmo25agznQbKTJ+RGJX80ThPI83 VHl7tEYdHI43TT5ivNsNbjzxWAI4uNWb//5sVfvYvZe9+JXPmvV2nIJZkwJmxDZU+Ryjyp4Phh7 Y8OVjuGbKorHSST9pz3QA+LrdIz7jM7Kv67G06Nc2Do88W8TW9LP8F55JESf1ADKe6IiOkjIBO5 tnknMuj7P+ogjAD/rHkD56l2HQxHYmn9dbCyViTm8ly9LSu+bykQol0j6C/tny7Cvw1NxbmQ6lp 8idifA8gc9P9+3cbDiUbclQnGx2q4= X-Received: by 2002:a05:600c:3e12:b0:480:6ab1:ed0d with SMTP id 5b1f17b1804b1-483c9babd97mr159956655e9.9.1772376145393; Sun, 01 Mar 2026 06:42:25 -0800 (PST) X-Received: by 2002:a05:600c:3e12:b0:480:6ab1:ed0d with SMTP id 5b1f17b1804b1-483c9babd97mr159955955e9.9.1772376144774; Sun, 01 Mar 2026 06:42:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 02/18] target/i386/tcg: add APX support to XSAVE/XRSTOR Date: Sun, 1 Mar 2026 15:42:02 +0100 Message-ID: <20260301144218.458140-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376276757158500 Content-Type: text/plain; charset="utf-8" With it, add a new hidden flag that will be used to enable the REX2 prefix and EVEX map4. Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 3 ++ target/i386/tcg/tcg-cpu.h | 16 +++++++--- target/i386/helper.c | 11 +++++++ target/i386/tcg/fpu_helper.c | 59 +++++++++++++++++++++++++++++++++--- target/i386/tcg/tcg-cpu.c | 5 +-- 5 files changed, 83 insertions(+), 11 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index da5161fc1a5..7586ea0ed8d 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -186,6 +186,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) @@ -213,6 +214,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 @@ -2729,6 +2731,7 @@ static inline bool x86_has_cpuid_0x1f(X86CPU *cpu) /* helper.c */ void x86_cpu_set_a20(X86CPU *cpu, int a20_state); void cpu_sync_avx_hflag(CPUX86State *env); +void cpu_sync_apx_hflag(CPUX86State *env); =20 typedef enum X86ASIdx { X86ASIdx_MEM =3D 0, diff --git a/target/i386/tcg/tcg-cpu.h b/target/i386/tcg/tcg-cpu.h index 85bcd61678f..451f61e2043 100644 --- a/target/i386/tcg/tcg-cpu.h +++ b/target/i386/tcg/tcg-cpu.h @@ -52,9 +52,15 @@ typedef struct X86XSaveArea { - sizeof(X86XSaveHeader) - sizeof(XSaveAVX)]; =20 - /* MPX State: */ - XSaveBNDREG bndreg_state; - XSaveBNDCSR bndcsr_state; + /* Overlapping MPX and APX States: */ + union { + struct { + XSaveBNDREG bndreg; + XSaveBNDCSR bndcsr; + } mpx_state; + XSaveAPX apx_state; + }; + /* AVX-512 State: */ XSaveOpmask opmask_state; XSaveZMM_Hi256 zmm_hi256_state; @@ -71,8 +77,8 @@ QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.mxcsr) != =3D XSAVE_MXCSR_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.fpregs) !=3D XSAVE_ST_SPAC= E_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.xmm_regs) !=3D XSAVE_XMM_S= PACE_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, avx_state) !=3D XSAVE_AVX_OFFSET); -QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, bndreg_state) !=3D XSAVE_BNDREG_O= FFSET); -QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, bndcsr_state) !=3D XSAVE_BNDCSR_O= FFSET); +QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, mpx_state.bndreg) !=3D XSAVE_BNDR= EG_OFFSET); +QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, mpx_state.bndcsr) !=3D XSAVE_BNDC= SR_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, opmask_state) !=3D XSAVE_OPMASK_O= FFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, zmm_hi256_state) !=3D XSAVE_ZMM_H= I256_OFFSET); QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, hi16_zmm_state) !=3D XSAVE_HI16_Z= MM_OFFSET); diff --git a/target/i386/helper.c b/target/i386/helper.c index f9f9488eb4d..d01b12f8af7 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -35,6 +35,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) @@ -249,6 +259,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 b3b23823fda..26fc9af7082 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -2691,6 +2691,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; @@ -2755,14 +2768,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)); @@ -2956,6 +2974,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(); @@ -3027,7 +3068,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)); @@ -3036,7 +3077,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)); } @@ -3054,6 +3095,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 @@ -3229,6 +3279,7 @@ void helper_xsetbv(CPUX86State *env, uint32_t ecx, ui= nt64_t mask) env->xcr0 =3D mask; cpu_sync_bndcs_hflags(env); cpu_sync_avx_hflag(env); + cpu_sync_apx_hflag(env); return; =20 do_gpf: diff --git a/target/i386/tcg/tcg-cpu.c b/target/i386/tcg/tcg-cpu.c index 6f5dc06b3b9..2965c304e57 100644 --- a/target/i386/tcg/tcg-cpu.c +++ b/target/i386/tcg/tcg-cpu.c @@ -198,12 +198,13 @@ static void x86_tcg_cpu_xsave_init(void) XO(XSTATE_FP_BIT, legacy); XO(XSTATE_SSE_BIT, legacy); XO(XSTATE_YMM_BIT, avx_state); - XO(XSTATE_BNDREGS_BIT, bndreg_state); - XO(XSTATE_BNDCSR_BIT, bndcsr_state); + XO(XSTATE_BNDREGS_BIT, mpx_state.bndreg); + XO(XSTATE_BNDCSR_BIT, mpx_state.bndcsr); XO(XSTATE_OPMASK_BIT, opmask_state); XO(XSTATE_ZMM_Hi256_BIT, zmm_hi256_state); XO(XSTATE_Hi16_ZMM_BIT, hi16_zmm_state); XO(XSTATE_PKRU_BIT, pkru_state); + XO(XSTATE_APX_BIT, apx_state); =20 #undef XO } --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376321; cv=none; d=zohomail.com; s=zohoarc; b=jKWCkcZABcIC/sUFUbB7P0xGCcPFpWl5p3SqQ3YZ4+E5dS+kbBmUZPVVKNQVadvfpclVtL0kT6WqcCZhUzQAFATq0eVCMRkSubcj9Zi0ia5uRA5EY9gpkgseT0PRAj9IeSllIVFxd9gi6bfbVYKW4RhwMuesBRvs3zCx4QQKFFE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376321; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=OpWcgVQi9FBrxgIwWpWg5Pji47L9rUU5y14c6wCcUdg=; b=b8GbDzTBMU/ZMogPT+ak3iTbpPJDzdGQxp4/Xkazpu7EnDusLXFfFPthueT067FimSEYK5Bd9Q9LztGc8SzpYaGytBbjA/v6a0172/F98nld05lMvnuNJV5qYopwWtuncK+CWTwBS0HjI0rhNC/aA1fTK862ADdwx3C3gouXkck= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376321895583.5133379537313; Sun, 1 Mar 2026 06:45:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0A-0000Gt-Hp; Sun, 01 Mar 2026 09:42:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi08-0000G4-Qy for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:32 -0500 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 1vwi07-0005i5-J0 for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:32 -0500 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-221-8S9NRaWnMEmrttvBUXRuCQ-1; Sun, 01 Mar 2026 09:42:29 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4832c4621c2so40423015e9.3 for ; Sun, 01 Mar 2026 06:42:29 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b41831easm4342900f8f.12.2026.03.01.06.42.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376150; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OpWcgVQi9FBrxgIwWpWg5Pji47L9rUU5y14c6wCcUdg=; b=UdbNgPrB6X1Ramfosh/ebD4E0wJctkFMkxwkOLuo5ROSwhVFj36J2a29FyOHnjtLY45/4y Id6bsfCE9Y8wJGkSOO/V/dzsxCUXyIhqpPTeryRZLuI041Cxq6yrimxhTFZB2Rx/1rQqZ3 /1mcYfWmxJ2nN3JLyy+lwWSqNE4yiiI= X-MC-Unique: 8S9NRaWnMEmrttvBUXRuCQ-1 X-Mimecast-MFC-AGG-ID: 8S9NRaWnMEmrttvBUXRuCQ_1772376148 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376148; x=1772980948; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=OpWcgVQi9FBrxgIwWpWg5Pji47L9rUU5y14c6wCcUdg=; b=eqJGbgA1x6ygPoZXKsvW1enTVmZinp6yDS1I05fWOeDlulMYiCU8Vj8KRahUMhHoTZ 95jdMd3F2SHmp0If8SbEvL34df30GrPYERu94B0RVqdA14mO+QYWElcTZS3MdpKzdLxo ma5+ljm+vLQtDmYt6Hy5cLxj2ek5Kuh3VGPWjmXPwkTVb68ZlKYj8LWPUvjbYnYcz8xb 0Kyofc7nhM62Vv4NhjnbKuAegWzACfxgp6a+oukmZwVffPR+f/oDyGrp6GnNbDUKSNE+ iUrxjEz9+1U9FF0gkRli485n3FJ1oItOHE2ocGo4Mi/hGfp4ZtUQvpnjRS5dTMuEY6MI Xwng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376148; x=1772980948; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=OpWcgVQi9FBrxgIwWpWg5Pji47L9rUU5y14c6wCcUdg=; b=n74/73QLhwSsyPPEHD8QZ9CXx7pF7HHpBBHfnp1PgKeQiDz3v+xky8OkHkJGcDwk83 CB/nbej1nto6Pi58vbrdjZ/En9pOmsLrRlx0dEw2s2E2xBiqWDor0Nl9Ek2uYkad8Mh9 v2dFPNgYCtz6niF5aKTNXYkTAtGZoH6In/EN2X0mlf1XkoFoh1XgoRdKU62P52pN+sYu efqwIwPJIRPCL92vByprVa8uN1lWomZCkiOqVnLh5mPktGNfdnqq5O6eJXBk8yZFzrsL wH8PZEumcG2o82omDCOH0JV3nq9vARIG09XjlSTOWehJRk/GRt0+y7BnHvRND5FNjWdj Wfqg== X-Gm-Message-State: AOJu0Yy0ESwiyBb+rXqHDIWaumGaY8hkmpb/JA8GIwMii0xPnH1BdCR+ 7o5E+PjP0zugYcQoPRSjcJQ8rZrz28QJ8cA+LHfiBCj17fxGnTse4hK43lL0Z9Qqb3Z87ZOxADo E9VWV6LDn3e43pUY+hKFeLxT6lnedh9S6EFhA42oiSfUj1+al3sipGfEUorjDRn0GB08kUhQANu YuIoA/tMcoTyvehHN7XfqdBRxsD4w7bE+qDOX/M/ML X-Gm-Gg: ATEYQzyVDCTTAjFlkSO/UaPybGSqNWgoHa/IH0L2+HdbJY7AOS5keKhL11+a3m7wriJ r3kM0ks07LfhCt483eEU+ahdMJRTQJ4AnC/fKBa3dCM0bMI5JZ84qyEABC8vgPYpK7DEZgSOLZ/ E4wA9O5Y5PiZ222/slu1wGxVnPp0ShJTTNW83wnXvZU3ig1nYTzNmL+WNTyy/ZNYSPsHrjjPgzF 1AY1TGJh1HnqDSw/yp6WkE1qwAxr3k9dh2Y67aVUmkjDRcS1hfdHFmM518Ff3zekpgwky3HdtMh ZyyohTYYxPpDH2ZaHth9kIiGP8odqpDB1sFd8hfKq2JLuPYiDVXn9Rvv3ZtQQQ3k4EhKaxflrRu N+TaBYdY4j1k4FYsdCD/HRq0FYZA942AE/Sf50MiR0WnaTWPlSTtokQrM2mgbY5msHX0Qsl8xN5 1sTKzlfi3/+MTz0gnIh9/bclVeDmc= X-Received: by 2002:a5d:5f43:0:b0:439:b60a:b419 with SMTP id ffacd0b85a97d-439b60ab65dmr2021581f8f.7.1772376147627; Sun, 01 Mar 2026 06:42:27 -0800 (PST) X-Received: by 2002:a5d:5f43:0:b0:439:b60a:b419 with SMTP id ffacd0b85a97d-439b60ab65dmr2021530f8f.7.1772376147060; Sun, 01 Mar 2026 06:42:27 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 03/18] target/i386/tcg: treat VEX as disabling high-byte registers Date: Sun, 1 Mar 2026 15:42:03 +0100 Message-ID: <20260301144218.458140-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 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_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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: 1772376322956158500 Content-Type: text/plain; charset="utf-8" This does not have any functional effect because the only instruction where it would make a difference is VPINSRB/VPINSRW, and they disable high-byte registers even for the non-AVX encoding. However, with APX it becomes a general property of the EVEX prefix and it makes sense to treat VEX the same way since it *does* include REX bits. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 7186517239c..83b250056e1 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -208,7 +208,7 @@ typedef struct DisasContext { #endif =20 #ifdef TARGET_X86_64 -#define REX_PREFIX(S) (((S)->prefix & PREFIX_REX) !=3D 0) +#define REX_PREFIX(S) (((S)->prefix & (PREFIX_REX | PREFIX_VEX)) !=3D 0) #define REX_W(S) ((S)->vex_w) #define REX_R(S) ((S)->rex_r + 0) #define REX_X(S) ((S)->rex_x + 0) --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376230; cv=none; d=zohomail.com; s=zohoarc; b=EU4yz7Pv6ARjrNAAj7aEZUNJF1Fi+BYUtgi5d438yRbSWgxtnQ7u36O+HSx78MbCis1wzC2Pj6L+tpOTox1UiseUQG1IDsIc+JB6GQvvniehfxFMowOyYuIEdQ88vFMi1r0BHleA1yBDilIcqWZrc4Ra49zxj+W7Sr/F86HsKok= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376230; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=NvGSKSAyjuBhpiPZe6uKq2THsYLV9ExqDaEl8KN7MjQ=; b=aopF2O2ORwIqUVJHAI4yVLL/Z8GI8r6DhStjv95RKZc6hpnEthi1AspOaLhrOY0EOD+FUAdgHDASZClUhmiosfW9b08xsRKA2I8UnM8juByLewhQqfFaxu0Lc6GmXKBJtUD/Dsb/C0B4D/CzFOZvOLfRW9Zkaa3wkdpwa/qFcwI= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376230300421.95693063031354; Sun, 1 Mar 2026 06:43:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0C-0000HC-KT; Sun, 01 Mar 2026 09:42:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0A-0000Gv-U4 for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:34 -0500 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 1vwi09-0005iK-Lm for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:34 -0500 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-689-FtTBC08ROa2GGFcD6oUWrw-1; Sun, 01 Mar 2026 09:42:31 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-4398f665747so3697624f8f.3 for ; Sun, 01 Mar 2026 06:42:31 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b34b6252sm4869707f8f.10.2026.03.01.06.42.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376152; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NvGSKSAyjuBhpiPZe6uKq2THsYLV9ExqDaEl8KN7MjQ=; b=g0QYwarFuJkqkqnX+P6jrEy/bXI5kdf0Fl7lIk7XlYMD5J4u8oQCecuipv72mCJ2WY5iwD grekvHRiq69O/3F7zBRwmjkuukQyxKi7Gd0dl2KzlpF4q+QRZXMFT09Aq9tr/l+wWpLGVn Z2o9qL/39ge2Bvyd2SUD+J4T+WD1+nU= X-MC-Unique: FtTBC08ROa2GGFcD6oUWrw-1 X-Mimecast-MFC-AGG-ID: FtTBC08ROa2GGFcD6oUWrw_1772376150 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376150; x=1772980950; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=NvGSKSAyjuBhpiPZe6uKq2THsYLV9ExqDaEl8KN7MjQ=; b=r3EVpNCeXSRx7klGTTM+AT2lGTE1wC5HwkLyf3MowvSE172wXwZTU2FxqfRGpxFNkI 65bQTQvhmr7YCkhe0dK5O664d4K64+P9ybBJPeAbieXG9T4aTxAi/u2a8DgzhAbTkv4B GmoSGR0w88ELzz/9phB7DCUdw7bQf3nCxOvYwFoXvgfkRjTEkbzYTegxWIqoSLEXLEyu TxyG0oMF3rwsYVZU1J1/V9xKxueS8jIpEAL0WlMrt3KrYKtx11xfU6uDLddzfnCtLy9/ N6Uc/XJoqciv9sP/HWuWAwsqlpPRZY+kiVARzeTfppvLqGenb7xRJou9uAgyHY+U4C2i u5lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376150; x=1772980950; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=NvGSKSAyjuBhpiPZe6uKq2THsYLV9ExqDaEl8KN7MjQ=; b=dPO6EBamrsJKj/MIIXUg10LJ486D1KPJCmn4sNICcJNpmuKIDvtU82IVu0GsaBBedh jWzN+BbldvdAOqxztP2tvVoz7J4SC2qEu2eiJTtxMAlc0ZuPrF1mwFAdmPTtoyMVLix9 7Xa+Z0o91q4nV1/VA8G+Y6ezShtpr2RhDmqj9wa/C/o6mqnVnHlvLgUMQTL2RdA9lylF Lf8MRvMiiLa3+zqxGZ1qosMoUwS6NtfGkVkUI6i3B7UYy0HcsKuGoxmmEpDvFHgIBPjH 4ZuUEgau5D7WzMmSHVqMPOcC3BrxkuNh/kz+xqu0Tort7fu3v2XNNRZc0JiJx/N/fIUQ Jf1Q== X-Gm-Message-State: AOJu0Yz7O/fQwi6Nuv6tWluk4/hYw6V5hxBhX/5OFjP25cP5gOS82Wc5 o9lL0isDtTgQmarLsA2KMsjp/Gb0RBFiSBhnjHX2a2ylONbbeVZKuWtaFjCk9q/ly9Vy6yv0NkG 8QRq1G0BaW3kpZplgXREtHHyyAj79MCXFRPPNASbtTpHZHYU8tUAPlVGLWTf74BOHlfvUVAIKF9 iNS0aNhHB8VJCTWb5KWFHW9bHOi8GXzQ9kc9TG5Jxc X-Gm-Gg: ATEYQzxiFz5yq1RIyCy88rqC7aa8OqxypiZgDCPdc8OS0T4lwUr7kxPq93lv0Yz3g8y KWmOgq8ba4ND1NeqFvqOOrbFPXFrnZCGr6qXs88ICeUGvJNKGjp0ooQfLld6fU+O5Zt5Pm3LujE uQEtv1ZxVSKKcK20Dnf/9C9XoBhfju8wcKsQuJ8bGZTMidCgCOrXOu6SRz9Vh752BLFG5vVyGP3 je5+YARHjr+s67DJl3m0dlyGb/cVAZtiiieXF9X08O/K+RhXnW9Mk0OZUbQHkmoFpu866Rovich jFsHZy85RddLLQ/4bYdGe7bjNQsyaomMvFRprFG05HuROEdPzt1pmGXqpSpg7XhdkGebnTdBlRn iJGytCtXRwvf1gTMEOL5z+b6woFG/Lk6p5iTL7nl9TodhkxZ7+9Cdz4uY5e2JsOShujySgA4aTs BmNZ3l1u1oE0u8vF3JDe7DQrI0bt0= X-Received: by 2002:a05:6000:1847:b0:439:b65a:fd35 with SMTP id ffacd0b85a97d-439b65affefmr1397849f8f.59.1772376149752; Sun, 01 Mar 2026 06:42:29 -0800 (PST) X-Received: by 2002:a05:6000:1847:b0:439:b65a:fd35 with SMTP id ffacd0b85a97d-439b65affefmr1397802f8f.59.1772376149208; Sun, 01 Mar 2026 06:42:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 04/18] target/i386/tcg: add definition for REX2 prefix Date: Sun, 1 Mar 2026 15:42:04 +0100 Message-ID: <20260301144218.458140-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 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_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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: 1772376230588158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 83b250056e1..061adcb7221 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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376242; cv=none; d=zohomail.com; s=zohoarc; b=WEnK68uvkI4eLCNfUP6Y5SomB7MHntXO3wm0iKgkEStQyoS99aa6V5f4FjYdmDMiIC3823mWPB+IxEpIgRgnu6pdjs+gq8ileMOY/BWOhVD69tlgkYn7VzEl0IF3lrzMfK42n2yCh1G0Osgw2g5v60AuHl/Uj+GNPAwH4lmPFIQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376242; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=vT0k0DbWLV0v+4dOwNHhJjYWwhIfPiojeDvq7lIW4gI=; b=C7r28DoxwW53U1WIIb4Cv9VNkWOObQsZ7jblEekugs/M/5RFCFe397Pp6uhS4mDRGz87gJTs8j+n9mUq47ze/aEtAUjjEv0QW18Ruh6F9qNyWHcjeisJiRZ8BywpKbOhNNshunoKUTbMSuvAG+aNLHUIZtSUvq1Iq7dG1m8lzOw= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376242499815.9553488584161; Sun, 1 Mar 2026 06:44:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0E-0000Hw-VJ; Sun, 01 Mar 2026 09:42:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0D-0000HO-4S for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:37 -0500 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 1vwi0B-0005iY-N9 for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:36 -0500 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-400-Uxag58liNSKAqKY24xQiaw-1; Sun, 01 Mar 2026 09:42:33 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439af95a718so681791f8f.2 for ; Sun, 01 Mar 2026 06:42:33 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55df68dsm2625607f8f.26.2026.03.01.06.42.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376155; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vT0k0DbWLV0v+4dOwNHhJjYWwhIfPiojeDvq7lIW4gI=; b=PiMfrlayx3Dxo0veOYbsN5YLXWwAz2CwT4sz9N0+gBueNTzm08Oghp/UGCQk24H4rDEMf8 R1HVP33uHFBBKFGyAuVFznFLDhS/PuXCD7qAn1kYK0zX61jzW/2PM7rstMo1PQ/tdza2fd OmlgSHCOZDD2KZE1ZP67cAoNSG6sWj0= X-MC-Unique: Uxag58liNSKAqKY24xQiaw-1 X-Mimecast-MFC-AGG-ID: Uxag58liNSKAqKY24xQiaw_1772376152 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376152; x=1772980952; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=vT0k0DbWLV0v+4dOwNHhJjYWwhIfPiojeDvq7lIW4gI=; b=HhBzZ7AD8P6G20/+jOQUi5jtXpr1t8xBczz91/cB8/vcp6/gN10770I98UhuUjIv15 JEyxPXwOa0cucQc03gP3e+PaR2c9h3/9mFF1VKKvXPP/pLawoHw0ZaKAq9zXcj5qoHqp Ib386d/U9ZtA07Dk+gSiVoeTkeJVnCCfDus6VhWVh4XKeYlr9A8hZJG6rrEhvUSLFAA4 myEeU9BKHVxBtY2zneePWl+GaTqOe2zzx3AagoWUArk5MBktptxMS9kRUutsSwjTLQ0p /v2FJRmtcrbSvoB3yYYLUtSvWLdfYvdMLOp+SpaiOpW4Rf1GSyr4dsdgkCc201+KFNtH k25g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376152; x=1772980952; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=vT0k0DbWLV0v+4dOwNHhJjYWwhIfPiojeDvq7lIW4gI=; b=QdSO0rMQQ3EaMrbj3aRMutWPmVWNapx/GtScZt1KUZEKbikDWirQgteFct9RoxXJWE PBe4PJYzon3a1mut+nMlwLI3Ldu9RynDMEm/afrJze+/TUMnL6raepSRiFFTUfO1WzRD gYNIcYLkoktr0zGDSgHpyBg5676Q0ff8EsEXkQu7qlLMOfBEEjwtkmma/awb9oP2jbuS gTzlk461XUnOsDSJ0uWI4E2BRWQt6pROgRnX00Jct3OnmH3N9bQaeXVA5xydcMaSdIUe NynunMo6JeBzM+HrShMnTYdC9A6LgDDLRXlhMb/MAjO5vM4jCQ9zsG24vHASAH7yJTKQ EglQ== X-Gm-Message-State: AOJu0YxKoMzXINA1GQYmlzBDJAym/dgcDWp73+TXi7h0aAhBH8N1BOal 1c0ie1/ExIGQGLBvGKmOZHiFaWKRmofp9HDGAymePpblIAaDktzgAt7ZgIq3iBtoFs2p2PFDNz1 Xvrz6elymx3t+D1pZHA92u6Mpg4+JZo29kASlg17x93Xxl7x6GjwrksG1gHc8agYAbt43xq0jgn K4ZtQ8dpvtucMuVJkatAgWJxkDu3SQCHHuGgTLn/r6 X-Gm-Gg: ATEYQzz4YQ9CQw0XVTWTJeKxNXQtajgWUi6AVk6NCwMrbaR3E3lun1cfhWeBDheQ90v 8gKgVxCAjx8VqONiAh5MYvSWev3UUX575aDGp/UUIvPnuUQcG9gY+x5Hs62f2jsC/u4RuQGqDYO 4rtsbKKb+sM7KtdQ13nzLHVRVyQrN3F5TL54TMidXoXF2ssePjuMP7NaW+shsbHaFRptcwGBRqH 4TreOeHlqutmRE5PYWqxTbZP6AQPLCyPUoQnxme9tWA1DvgYUAQM1IMBNVrKsZUpNbozeB6kMOH iaL8shAzAXJ89KfvBLjmZEGNXn7V09jOHIS1WY7eei7EkBY3djHGBKx0CqfNBJSQ/2M10kDaNLf PTws7yVoBEFeMJAEkGn6lsNBlec1fyEuv+clCrLa1Vrn849/qD1IsmyIU+V5O3nsHXdDTfRIfGn JuJW8txGMDJtbC6IwXMFuS5el3WbU= X-Received: by 2002:a05:6000:2c04:b0:439:b486:ba5e with SMTP id ffacd0b85a97d-439b486c3c9mr2854752f8f.51.1772376151715; Sun, 01 Mar 2026 06:42:31 -0800 (PST) X-Received: by 2002:a05:6000:2c04:b0:439:b486:ba5e with SMTP id ffacd0b85a97d-439b486c3c9mr2854702f8f.51.1772376151243; Sun, 01 Mar 2026 06:42:31 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 05/18] target/i386/tcg: mark XSAVE* as not allowing REX2 Date: Sun, 1 Mar 2026 15:42:05 +0100 Message-ID: <20260301144218.458140-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376242630158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 3 +++ target/i386/tcg/decode-new.c.inc | 21 ++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 92822969003..c974ca9d7c5 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -181,6 +181,9 @@ typedef enum X86InsnCheck { /* Vendor-specific checks for Intel/AMD differences */ X86_CHECK_i64_amd =3D 2048, X86_CHECK_o64_intel =3D 4096, + + /* No REX2 prefix allowed */ + X86_CHECK_no_rex2 =3D 8192, } X86InsnCheck; =20 typedef enum X86InsnSpecial { diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 6fab597fafc..b968db2b8ad 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -481,9 +481,9 @@ static void decode_group15(DisasContext *s, CPUX86State= *env, X86OpEntry *entry, [1] =3D X86_OP_ENTRYr(FXRSTOR, M,y, cpuid(FXSR) p_00), [2] =3D X86_OP_ENTRYr(LDMXCSR, E,d, vex5 chk(VEX128) p_00), [3] =3D X86_OP_ENTRYw(STMXCSR, E,d, vex5 chk(VEX128) p_00), - [4] =3D X86_OP_ENTRYw(XSAVE, M,y, cpuid(XSAVE) p_00), - [5] =3D X86_OP_ENTRYr(XRSTOR, M,y, cpuid(XSAVE) p_00), - [6] =3D X86_OP_ENTRYw(XSAVEOPT, M,b, cpuid(XSAVEOPT) p_00), + [4] =3D X86_OP_ENTRYw(XSAVE, M,y, cpuid(XSAVE) p_00 chk(no_re= x2)), + [5] =3D X86_OP_ENTRYr(XRSTOR, M,y, cpuid(XSAVE) p_00 chk(no_re= x2)), + [6] =3D X86_OP_ENTRYw(XSAVEOPT, M,b, cpuid(XSAVEOPT) p_00 chk(no= _rex2)), [7] =3D X86_OP_ENTRYw(NOP, M,b, cpuid(CLFLUSH) p_00), }; =20 @@ -2963,15 +2963,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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376190; cv=none; d=zohomail.com; s=zohoarc; b=i12V0hdOXnsXNxB8fLw5U5PamcVLI+F53f/85rQSJscZIR/uGroLe7ujtkcDWEiFlKHWOslh7Q5YPP8URBDq3gZCflkgjBYjyzX2M8ASDy5tVCfsK57q0dF7xaZ7v5vJs9DrHHihkCl2DZ4y4UBx9pNAKkA2qyVQXZnOD3fnlHY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376190; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=hUfyV+BSh7CpYKLSHL/QcDrpwX+PfQmoNiEbN3lORPA=; b=V/T6jMVWc+FM4o6jMV056G+cF3soNKOtNaw0eLzZnhvtO7uOYcw3liBX4PTP7uPIovSH74KMyXtPa2lVP4qOkgB+faZA5g0KyC0M0bJ7cp/0oyK4WaFdMUg0FuKmrBIDNfvAyF+L5a+pckNiJ32mM3rmJA5gwbQbmxtYr4N7uNQ= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376190035452.5209381519145; Sun, 1 Mar 2026 06:43:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0H-0000IP-CD; Sun, 01 Mar 2026 09:42:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0F-0000I0-Gu for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:39 -0500 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 1vwi0D-0005ip-PS for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:39 -0500 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-84-ctnGWU_iPTCF_dOn_ZvT7A-1; Sun, 01 Mar 2026 09:42:36 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4837b6f6b93so22444635e9.3 for ; Sun, 01 Mar 2026 06:42:35 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfccad8esm109406605e9.22.2026.03.01.06.42.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376157; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hUfyV+BSh7CpYKLSHL/QcDrpwX+PfQmoNiEbN3lORPA=; b=BX96wFP1IomqNYUu4mEgVy3tG55BrcX+F/YQ/gLzBO0GWTDzug7SLxPKCufCygAaJ8e1f8 amZnPB//sLRreug/5bWt3dPj1g9asXxP+hSMJu/bvQkCZTEG/MymhJJZQCYtAK1xb+KBFq eK5sk5wtc/Hw0yiR7UdYkLU2FoonPJY= X-MC-Unique: ctnGWU_iPTCF_dOn_ZvT7A-1 X-Mimecast-MFC-AGG-ID: ctnGWU_iPTCF_dOn_ZvT7A_1772376155 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376154; x=1772980954; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=hUfyV+BSh7CpYKLSHL/QcDrpwX+PfQmoNiEbN3lORPA=; b=Uhbwrx801Hz73GjkyHc8dDh2Pih+BH+tDvD3OopjqwlJizN8rtSikIvNubEb32QQBu CBFBO9P4F629Ak0U5gOE0pQqNzYwyduD+SBfYYiUwIVuy5+4BFPIuoamHisJiFr4w0KV hHyrkjlFOWESTwsNTwfZb5sIhtsPNUxN4k9brQbrUNsYIrQqeuLzdRcG9/5+JaI2N2JC ITmiijx4kWrwUDhpJnmHYOG56IRapA+IvWcIkkCYHY4+aLFiGIrzcqcETsQ4L5GjMdu2 nR0pCt9B3QjQfL3MFfgktN5ApMqhIB8O0ARr4uFLsa+xFOJKUqYtOWqxyqccJ9C2eFdX Q6sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376154; x=1772980954; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=hUfyV+BSh7CpYKLSHL/QcDrpwX+PfQmoNiEbN3lORPA=; b=KWmRagxJ62NVKlCPnX6DreLLETfRkGRi0yRa6Tqm3F4d5xtN7KUowZgcdD8m1KJTt6 9A43KZ8dKsIVHrl96hdVZalxDGmtaL6ly0WHXUKVgmCfslGizsiKDos3d5lnIeSGwCZL l+Yxcqnj9ImpHK+ZGiFQUdD6b1pWW6oZLdCGE7DnDwYY0Mgha0ZB5mzs/Q42CS7URcnh YNOkng8ZrmKVVDFnSO0CgL9QkqHJqcGSVj86UJmB0V9zIeS9kXCyt8PHIhzlflBVeu9q SAPmv2h8LjzFz4+E5Vhq7EEpqlQXKcq0eAUERVwqjWtMioUmmZu+7iNNAJG7STrALRIt YArA== X-Gm-Message-State: AOJu0Ywkkt88weY9z1LxdqdbapDSRk8DRLbdOYTNEW7xo2Qcm4yc5JHP f/VAIFKXETg3OIQrGfHRI2khcTo426N1Af+0DyAANQVBZxzFE9ifp5XyK4Q1gobxFdfabTulF3c Hde+bu+8lSrJOEFL0CSdlYvrtIDZIdB/tq1MPnBgPXdZd1BE8C+1Dhb5noV4KdTUkEQBWvUe4Md ULTd9tIB/0quCxrO1HIdxM5+RYFKE2OAOPUPhjghdC X-Gm-Gg: ATEYQzzXEJ9AZuMr9fiEvc88lDEzO/JlnYT4Gyv2MuFIimTdKpZt4Uj83Oz4eGdwHY8 /1PSZ1zpQ/vz5FJROtLaMwBLXQ35saitBz9MM+V6+7TQaO4J4TrcBN3i7jtxJCsb0c6ihl10KWn C+qolRXQYWk4thhfm5/QZlz1hauXuTSnIE6LUvvA471ZGVPwNIooOLy21j0aX1MJMJ7Y1tyYLqx WfRj4rLydFrLhIBBDpzRdjEKS8hfiH9EcphHSshb8hfi579+xeGAHP3WALDGlqIQEiq0/JJtLAD sGyE78FzGpHTN6kHmAMvDD3bc8V2AgvIe0u4jEtN3WgU++KBGc/isJrKsp/okcD7N0xMVTUCM8Q ZUX4b6XKncYFQZ0iI4cilDbfW07noUDSXLUmOu+kR9NVNDzAjSc5DYbaLv6bN0d6noYRyao8h5Q bBfy85N0Y4E39yiJ0GZZjR+CbOG2A= X-Received: by 2002:a05:600c:4f0e:b0:483:702f:4641 with SMTP id 5b1f17b1804b1-483c9b94367mr156241955e9.3.1772376154032; Sun, 01 Mar 2026 06:42:34 -0800 (PST) X-Received: by 2002:a05:600c:4f0e:b0:483:702f:4641 with SMTP id 5b1f17b1804b1-483c9b94367mr156241315e9.3.1772376153364; Sun, 01 Mar 2026 06:42:33 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 06/18] target/i386/tcg: decode REX2 prefix Date: Sun, 1 Mar 2026 15:42:06 +0100 Message-ID: <20260301144218.458140-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376190522158500 Content-Type: text/plain; charset="utf-8" The REX2 prefix has two main complications: it does not apply to vector registers, and it disables or mutates some opcodes (thus needing separate decoding functions instead of decode_root and decode_0F). Otherwise, all it does is extend s->rex_r, s->rex_w and s->rex_b to two bits. Since REX2 provides the ability to access r16...r31, extend cpu_regs[] to CPU_NB_EREGS elements. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 22 +++++- target/i386/tcg/decode-new.c.inc | 114 +++++++++++++++++++++++++++++-- 2 files changed, 126 insertions(+), 10 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 061adcb7221..47eef81ba05 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]; @@ -3349,7 +3349,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", @@ -3367,6 +3367,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", @@ -3411,7 +3427,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 b968db2b8ad..9ee69564ab1 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1988,6 +1988,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 @@ -2007,6 +2066,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) @@ -2018,10 +2091,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 @@ -2300,9 +2370,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, } get_reg: op->n =3D ((get_modrm(s, env) >> 3) & 7); - if (op->unit !=3D X86_OP_MMX) { - op->n |=3D REX_R(s); - } + op->n |=3D REX_R(s) & reg_nb_mask(s, op->unit); break; =20 case X86_TYPE_E: /* ALU modrm operand */ @@ -2749,6 +2817,24 @@ static void dump_unknown_opcode(CPUX86State *env, Di= sasContext *s) } } =20 +/* MASK must have two bits set. Bring the highest next to the lowest; + * for example if MASK =3D=3D 0x11, bit 4 of value is moved to bit 1. 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 (low << 1) - high; + + value &=3D mask; + return value + (value > low ? tweak : 0); +} + /* * Convert one instruction. s->base.is_jmp is set if the translation must * be stopped. @@ -2833,6 +2919,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) << 3; + s->rex_x =3D collapse_two_bits(rex2, 0x22) << 2; + s->rex_r =3D collapse_two_bits(rex2, 0x44) << 1; + 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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376200; cv=none; d=zohomail.com; s=zohoarc; b=UF8bhDdVNHUr8cW0NvbZFat9vnUF2dS0fcR8GEd1dAD687sCRQFcseLAsxfxqZvm6JVVsJZf/zIQX/jgamGa9KKejVrSMsyF38oo82cgVGdhSpdm07U9b488j6zavvJPU9OhzPCdlfFH08IpHvIuThtBzC0mS05B5CSfQB3h2vY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376200; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=ckwtJ0FnfNcSrRYFixCj2sY19LI31H2pt20LbTzcgfo=; b=D6VjNADg+Wapc+opQZDg2x3VbPACO3CvF1JgHvxbOjjeHJGs9daXRkpEr/zN5aJagepDhIOmgrYa+9C620dOlBjhHp/TkAmnPCYE8RLSKfeWsZhYTdMpzf27n7sT3y41vacuE88xDC5h59lhKVqibEhdhBj7YqMd43Z6LGw9dss= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376200954335.05279775408906; Sun, 1 Mar 2026 06:43:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0b-0000LE-An; Sun, 01 Mar 2026 09:43:01 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0J-0000It-Nz for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:44 -0500 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 1vwi0I-0005jC-8z for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:43 -0500 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-422-9JhirMIRMxWxgDRGhW5OuQ-1; Sun, 01 Mar 2026 09:42:38 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-4398f665747so3697650f8f.3 for ; Sun, 01 Mar 2026 06:42:38 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c764546sm22802151f8f.29.2026.03.01.06.42.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376160; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ckwtJ0FnfNcSrRYFixCj2sY19LI31H2pt20LbTzcgfo=; b=V7D8F6YBbWpw0UZ8Nbmuu5CgzOZngUPI0SAbex2sL4Dr3JYMGVO1OjFr7SvTQTLYCP/eSl ojnDEWwOFEoKsZIXcjeYbfflbUpCHFFvb1QJa1urt7PBzoboUf+VxDlqbHABR7wDD3gtYB pPK9bNOoEV7dF9FwrKJIgd/3/VW1wk8= X-MC-Unique: 9JhirMIRMxWxgDRGhW5OuQ-1 X-Mimecast-MFC-AGG-ID: 9JhirMIRMxWxgDRGhW5OuQ_1772376157 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376156; x=1772980956; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=ckwtJ0FnfNcSrRYFixCj2sY19LI31H2pt20LbTzcgfo=; b=XsjvRIzhK8s7nUGxlwZUGmLgSLzLwsMU8TQQmF+JkzjhwfIWGejYRDx1smF6VAaEgG /B/fueh5b5zMYm2kljuLC3F0k+gNXa01GVsFPsfd25DjxDVE4CvqFnoLz+VkBvg4zp0s MJs7MX0P76ZglBc4ZixdzHr+VrQFLk0u/rk83D8y41o4oh5w2WI1noWCAaU2zCuJoX21 CfYp3+5f+WBtdYOH355UycZKDRRVfkK0IHRHS7XbHf7ds9v9gWfJzhmSPmbcNrq2olzT fjVXohy4qbbLF++eu8KyK4oTZ8boTEMszwMw8ZHdVy2Yd1d/PBGbqmYUCTsP2Km/a85l 9m2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376156; x=1772980956; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ckwtJ0FnfNcSrRYFixCj2sY19LI31H2pt20LbTzcgfo=; b=Jg3yYV4cwKOC12Pj4KD98XZq2Ur+5rMla+5kexjDJNZBkW6gwzh89Y7SkBjlVfY3Kg jxDB8pAwmonOULQkmMjpND79XUk+80kESQ9zJa6X9X4aRBHtOwSyzVA16zHtVaIpis6p pRPRxm6ipfSpYLZvU5+ZwhDTLaz9SJ3MdRgDsHRbfH7eAQo/sTv1nSnz5N2S6nGttn5K vTC1/Ot19Iu5P5361/AE6oqM5IreFq/gU5BuPQQvi/IZc2VnA65a/mvHCe8Yf93LR6RO k0IQliAqI9AA2QEZh24G2UP+er0EdCI8dAPHnOekVV8O3IWOXDuJC/TiQvKs39taJvz5 y5Tg== X-Gm-Message-State: AOJu0Yy75DLdICBGtm7zWJ8CT0wyxYTlu1G1qRFhJXh2u4n5JXNG4y05 +f5ElXh1d/GvrkRQExXRvUGWOJSCm3fLJQLZtuql4bQ6dcQQDIFlKqbd07yg1WP2InHf1ZFovjP ZkdFJ1NDDkfLI60EkhwhU5Zaxf5/MheLk7v5Jra5H/YcVeocwFJCeQO0dGqc87gmuaGlm4nacGD IPI3b/hPXyULvUiY8twRFv5eyDKFr81uWUlkegO9qk X-Gm-Gg: ATEYQzzI9j4W+lyn/Rh/6stodDJdEv7cxjCXH8l6s0au5RGa6kH/lMjnjvDbX6GZrjK rAYXD8rFEP2L4xYuevpyjnwPjFe/LUFjfVu6EUR4h+v4mqJy10+6PDixrqxtlR33j+Tt4KCWUvz SNmlPRe2Vi97dn26TPQjcclGyu12yMmDcvEVwOUnaFrjtuVVmtOp9z/TydWJVSKAaWszhysILwp Ld1u1uv/wdXtCf0WNSdSLgZFODYH8LFF3jAsw0cA+eMJPGs1PlWONfuMLpaJJyEbvGAvtf7gBdb 0S82IQYX0t321ubOo7klhLFitePDHAsLTbogsSIBGSCw10yEL+BuMnfsGyNegrwmHTn3W368wvG Yk+QtCsQD+Qh6Rnw/EbJ1aXsvP4Kv97pSCRjxb9JNBqe0wJz0ouvZ8jeVI++CQL9qe413OlOdGx Jw850wHoJ0Tvzso6zT6XsgplV/knE= X-Received: by 2002:a5d:64e8:0:b0:439:af0e:5798 with SMTP id ffacd0b85a97d-439af0e58e8mr5621131f8f.41.1772376156230; Sun, 01 Mar 2026 06:42:36 -0800 (PST) X-Received: by 2002:a5d:64e8:0:b0:439:af0e:5798 with SMTP id ffacd0b85a97d-439af0e58e8mr5621086f8f.41.1772376155676; Sun, 01 Mar 2026 06:42:35 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 07/18] target/i386/tcg: implement JMPABS instruction Date: Sun, 1 Mar 2026 15:42:07 +0100 Message-ID: <20260301144218.458140-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376202575158500 Content-Type: text/plain; charset="utf-8" This is the same as an indirect jump, just with immediate operand. The requirement of W=3D0 and 0x67 are already available in the decoder. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 3 +++ target/i386/tcg/decode-new.c.inc | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index c974ca9d7c5..4998712e86d 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -184,6 +184,9 @@ typedef enum X86InsnCheck { =20 /* No REX2 prefix allowed */ X86_CHECK_no_rex2 =3D 8192, + + /* No 0x67 prefix allowed */ + X86_CHECK_no_adr =3D 16384, } X86InsnCheck; =20 typedef enum X86InsnSpecial { diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 9ee69564ab1..d8a5025ac07 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1990,6 +1990,7 @@ static const X86OpEntry opcodes_root[256] =3D { =20 #ifdef TARGET_X86_64 static const X86OpEntry opcodes_rex2_map0_A0toAF[16] =3D { + [1] =3D X86_OP_ENTRY1(JMP_m, I,q, p_00 chk2(W0, no_adr)), }; =20 static void decode_REX2(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b, @@ -3072,6 +3073,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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376200; cv=none; d=zohomail.com; s=zohoarc; b=DD8M4/BC4hDZ3Sa9xYKJCT13UpuO0F4xojMIC5VnXQ8oWRVaGjAjaA9dI/KINlzj+6p0UMhtFzvonTzrrIh3gDBzrg3tAF59AlqeOpdAPkPTz4LJNR2y6oN3fDBom6QTCDLuztoCCq8xBN2Qly2zkusux0NIGl/ngRxPgQMx9Ks= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376200; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=BdDc4qndHc5H6nxB+5xYth9Be8C8ZEs/W9FPzkVwAYA=; b=innz8bl90ttYg0WqulPkQRy8KkiPaTVtB+1lKdRt+CDJl4MlUMlHcFJwJrxxx5TL+uvDFTat4/VAKt/C/fvyCPx8pe0r21H4fUJAXM6piqawP+SlPRNqTYcgjX6lgnQi34tIgGNrTyjRO5JfGsc4PzCQ0EYNLRfH0/twRgjunwc= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376200880694.8528809297346; Sun, 1 Mar 2026 06:43:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0Q-0000Ki-RT; Sun, 01 Mar 2026 09:42:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0K-0000Jp-GD for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:44 -0500 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 1vwi0I-0005jJ-OX for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:44 -0500 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-427-NJVt3-xXNE6GIBNv0Y3T6A-1; Sun, 01 Mar 2026 09:42:40 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836b7c302fso37428785e9.1 for ; Sun, 01 Mar 2026 06:42:40 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbf673sm134951505e9.19.2026.03.01.06.42.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376162; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BdDc4qndHc5H6nxB+5xYth9Be8C8ZEs/W9FPzkVwAYA=; b=XeKay0AG/PRap4KGMJ1enzuIq+J30kr8s+P2q9sJbadCaQIdVMmhQXKrIHssnWWiEo4VEF GQoHbQP0pfs6to22BcjGbD80fQTI/D3SzNWbiChBB0qAk/QluOM5kX7JY2l7wjCnOpZmFP FSlNHypcdclqltcESZ3KAEa6LDdRXDg= X-MC-Unique: NJVt3-xXNE6GIBNv0Y3T6A-1 X-Mimecast-MFC-AGG-ID: NJVt3-xXNE6GIBNv0Y3T6A_1772376159 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376159; x=1772980959; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=BdDc4qndHc5H6nxB+5xYth9Be8C8ZEs/W9FPzkVwAYA=; b=GyJFWdQbvxTVVjx/NMAnet6dDidxZPjdxqph0E+E+lCXapgU/3zSi2P72x2Enwlksj wX8NLbQVzFo4OzWs1HPp6dNSrmoSkU1N+9XKn32O42i1wzvCqH46QPOmV8PbXQTn82WO 4r/vAVZWq7Jeal2rvjfp6CEeHAjLybmnI+6uD/Srfeya7r4ZyylFMtaBWDW3p8p2OYLq AjQRMkK/d/XG4mJVLPZU5uof9XPpVBb+jwieUirXc8gJVjmsiODuWCne6NIgXZ85/mhT 7oZjsF6rSQ3IPgstotq15lbkvOtjQI90ok54zKVcrs+6omdvw2pAzqfnkWyN4kTpLPWK FLig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376159; x=1772980959; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=BdDc4qndHc5H6nxB+5xYth9Be8C8ZEs/W9FPzkVwAYA=; b=GXy1Nm0Gx/NYR/hoGf+Chmk1QHRRBXwZpe4P0+yq4CbiWZHZjsZeLfN6QWg1wt/u9N +D+pRf+kIOm0FFgnWrNlbhs59Y2q9RK6EZPZsth5Cm32fGOKABbZYgcp7yWp/FIWsK31 vHP1fPd3TF/IGrcWmHuzfSipMe0p5WYinsaCskpnxgQvdSJgoCB+T61pbM4Prva5rlfr xRXeQHGskyPOn4vHxz0JMBcIhW4//spWwV7RnNYaxuoXQZHlg9SefbkSpwDz07p6CHjG D3L7EKkhPAP+rvBKaRjn8D/E/eHd+5dwnH8PED0FVoVfyWXBCPnCqBbHFXkgOpgU7sZl 1H/Q== X-Gm-Message-State: AOJu0YxdLv/z565ffbWpMnDD7RwnFV0/NAc8QuG9hq1TPr2oAUAN5TtQ rsmoCY4bDb0svTN0a63SLYRxlB06YZrYZFlbYRtewo5r+UNmOM8REI1YHInxSmOgfd9xI2cjQUF 19AIMVmFriRgDS04ZrC8IQFmx0nUNfjK6VXaFJLon23GzGgjt1cF1bB7VLyv46G15sLmUPblMGF ZMReb7/j9pom/a6FT1wAbKyBTY0wwH31KVtfd8srze X-Gm-Gg: ATEYQzy+NQuKOxt8coWYJRPSvHoubarXQLtqLIhF9ucLJ7a5Hjk+qsvfpRpXRrpiQNG idL4HaOFd6qyH8aF8BPvKEP7ocTLXx+WnXA09DHlHPP7oe6/2X0E9xT9rQHb+JWc/nChezlAgPi YwOxjxXblhkEOoTSomEJHJeNhSLNpN9ZbU6+kt+qoPQN79GjIUlKqsnvGnD9H5vWPhBXucHaNsa qb1F98pDuG9pqGQS/LcGm7ZwalBAt1YqV3v49c6q70HT2g8P1H9xuE68YlnniMOzkUN1v3mbZG6 z5uC3XHwIiwDBnUk74iBzHts1GL8dgf9L6avWuCfT1EUrS5g3svPOS2Y7KfNlvLmK6NlgeMCk1r CgVTMU0aMI90t7Mlg3Dzn6RILqDz7jt8zc4ddLhi1dBlH5kIQgjDIdzkS5RRYx1wJamjia7Z+lA 49/hxhO4hAXAEvryq0GSxRCAd75Jg= X-Received: by 2002:a05:600c:3111:b0:483:78c5:d743 with SMTP id 5b1f17b1804b1-483c9c2baa9mr164392655e9.28.1772376158733; Sun, 01 Mar 2026 06:42:38 -0800 (PST) X-Received: by 2002:a05:600c:3111:b0:483:78c5:d743 with SMTP id 5b1f17b1804b1-483c9c2baa9mr164392125e9.28.1772376158139; Sun, 01 Mar 2026 06:42:38 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 08/18] target/i386/tcg: fetch modrm early Date: Sun, 1 Mar 2026 15:42:08 +0100 Message-ID: <20260301144218.458140-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 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_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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: 1772376202692158500 Content-Type: text/plain; charset="utf-8" As a first step towards handling EVEX prefixes, fetch the modrm byte before decode_ops(). This way, EVEX validation can use the mod bits: for example, APX instructions require X4=3D0 if the r/m operand is a register. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 65 ++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index d8a5025ac07..3205a046a6b 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2085,9 +2085,8 @@ static int reg_nb_mask(DisasContext *s, int unit) static void decode_modrm(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode, X86DecodedOp *op) { - int modrm =3D get_modrm(s, env); - int mod =3D (modrm >> 6) & 3; - int rm =3D modrm & 7; + int mod =3D (s->modrm >> 6) & 3; + int rm =3D s->modrm & 7; bool is_vsib =3D decode->e.vex_class =3D=3D 12; int sib =3D -1; =20 @@ -2296,11 +2295,33 @@ static bool decode_op_size(DisasContext *s, X86OpEn= try *e, X86OpSize size, MemOp } } =20 +static bool op_has_modrm(X86OpType type) +{ + switch (type) { + case X86_TYPE_C: /* REG in the modrm byte selects a control register = */ + case X86_TYPE_D: /* REG in the modrm byte selects a debug register */ + case X86_TYPE_E: /* ALU modrm operand */ + case X86_TYPE_EM: /* modrm byte selects an ALU memory operand */ + case X86_TYPE_G: /* REG in the modrm byte selects a GPR */ + case X86_TYPE_M: /* modrm byte selects a memory operand */ + case X86_TYPE_nop: /* modrm operand decoded but not fetched */ + case X86_TYPE_N: /* R/M in the modrm byte selects an MMX register */ + case X86_TYPE_P: /* REG in the modrm byte selects an MMX register */ + case X86_TYPE_Q: /* MMX modrm operand */ + case X86_TYPE_R: /* R/M in the modrm byte selects a register */ + case X86_TYPE_U: /* R/M in the modrm byte selects an XMM/YMM register= */ + case X86_TYPE_V: /* reg in the modrm byte selects an XMM/YMM register= */ + case X86_TYPE_WM: /* modrm byte selects an XMM/YMM memory operand */ + case X86_TYPE_W: /* XMM/YMM modrm operand */ + return true; + default: + return false; + } +} + static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode, X86DecodedOp *op, X86OpType type, int b) { - int modrm; - switch (type) { case X86_TYPE_None: /* Implicit or absent */ case X86_TYPE_A: /* Implicit */ @@ -2316,7 +2337,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, =20 case X86_TYPE_C: /* REG in the modrm byte selects a control register = */ op->unit =3D X86_OP_CR; - op->n =3D ((get_modrm(s, env) >> 3) & 7) | REX_R(s); + op->n =3D ((s->modrm >> 3) & 7) | REX_R(s); if (op->n =3D=3D 0 && (s->prefix & PREFIX_LOCK) && (s->cpuid_ext3_features & CPUID_EXT3_CR8LEG)) { op->n =3D 8; @@ -2332,7 +2353,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, =20 case X86_TYPE_D: /* REG in the modrm byte selects a debug register */ op->unit =3D X86_OP_DR; - op->n =3D ((get_modrm(s, env) >> 3) & 7) | REX_R(s); + op->n =3D ((s->modrm >> 3) & 7) | REX_R(s); if (op->n >=3D 8) { /* * illegal opcode. The DR4 and DR5 case is checked in the gen= erated @@ -2351,14 +2372,14 @@ static bool decode_op(DisasContext *s, CPUX86State = *env, X86DecodedInsn *decode, =20 case X86_TYPE_S: /* reg selects a segment register */ op->unit =3D X86_OP_SEG; - op->n =3D (get_modrm(s, env) >> 3) & 7; + op->n =3D (s->modrm >> 3) & 7; /* Values outside [CDEFGS]S, as well as storing to CS, are invalid= . */ if (op->n >=3D 6 || (op->n =3D=3D R_CS && op =3D=3D &decode->op[0]= )) { return false; } break; =20 - case X86_TYPE_P: + case X86_TYPE_P: /* REG in the modrm byte selects an MMX register */ op->unit =3D X86_OP_MMX; goto get_reg; =20 @@ -2370,7 +2391,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, op->unit =3D X86_OP_SSE; } get_reg: - op->n =3D ((get_modrm(s, env) >> 3) & 7); + op->n =3D ((s->modrm >> 3) & 7); op->n |=3D REX_R(s) & reg_nb_mask(s, op->unit); break; =20 @@ -2407,8 +2428,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, case X86_TYPE_R: /* R/M in the modrm byte selects a register */ op->unit =3D X86_OP_INT; get_modrm_reg: - modrm =3D get_modrm(s, env); - if ((modrm >> 6) !=3D 3) { + if ((s->modrm >> 6) !=3D 3) { return false; } goto get_modrm; @@ -2422,8 +2442,7 @@ static bool decode_op(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode, /* fall through */ case X86_TYPE_M: /* modrm byte selects a memory operand */ get_modrm_mem: - modrm =3D get_modrm(s, env); - if ((modrm >> 6) =3D=3D 3) { + if ((s->modrm >> 6) =3D=3D 3) { return false; } /* fall through */ @@ -2531,7 +2550,7 @@ static bool decode_insn(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_ return false; } =20 - /* First compute size of operands in order to initialize s->rip_offset= . */ + /* Compute size of operands here in order to initialize s->rip_offset.= */ if (e->op0 !=3D X86_TYPE_None) { if (!decode_op_size(s, e, e->s0, &decode->op[0].ot)) { return false; @@ -2564,6 +2583,13 @@ static bool decode_insn(DisasContext *s, CPUX86State= *env, X86DecodeFunc decode_ assert(e->op3 =3D=3D X86_TYPE_I && e->s3 =3D=3D X86_SIZE_b); s->rip_offset +=3D 1; } + return true; +} + +static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, + X86DecodedInsn *decode) +{ + X86OpEntry *e =3D &decode->e; =20 if (e->op0 !=3D X86_TYPE_None && !decode_op(s, env, decode, &decode->op[0], e->op0, decode->b)) { @@ -3087,6 +3113,15 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) } } =20 + if (op_has_modrm(decode.e.op0) || op_has_modrm(decode.e.op1) || + op_has_modrm(decode.e.op2)) { + get_modrm(s, env); + } + + if (!decode_ops(s, env, decode_func, &decode)) { + goto illegal_op; + } + switch (decode.e.special) { case X86_SPECIAL_None: break; --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376259; cv=none; d=zohomail.com; s=zohoarc; b=MbsPq9y3uQty2SS7O36eEDtKsVGTfzsx+cOz4TRwuqGmSYu6dOfusgYloemBsmDOOJ0074WfySthOUNNCpdWC+D/1kEhQVFhLvPTbJrbPRTvzotD8rewQqXe6yphOyowcp4+peA8/7J6zeiLV5RgAylfoy19earjYjMZkMfQjHE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376259; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=eMTCCM66b1mqlLHWGeewn1cec2fDx8v9kVEs608meFw=; b=Kb2Qo2yKHhmHDnbS8W1aRtUqffQ4OUw+lYXj7Sntm3MlE/Ni/5LMSSyRZuds7zP+9JBEzdrJLm4bc+KeRZT99VTSeB/KjSY0dgGscm1Qt8tM5JgvOjXQy6WLlGELvzpIt/9UXulCDPy5lOyU1ge0kB9zwEZu42ZB107L+5bm46I= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376259472151.87528912542723; Sun, 1 Mar 2026 06:44:19 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0S-0000Kr-RU; Sun, 01 Mar 2026 09:42:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0L-0000KA-Vr for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:46 -0500 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 1vwi0K-0005jV-FS for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:45 -0500 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-428-xYasKo4dMdmY5Ku3UPjn3w-1; Sun, 01 Mar 2026 09:42:42 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439ab866bc1so1182866f8f.2 for ; Sun, 01 Mar 2026 06:42:42 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c60f8e5sm23838561f8f.4.2026.03.01.06.42.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376163; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eMTCCM66b1mqlLHWGeewn1cec2fDx8v9kVEs608meFw=; b=het5Wr40dDmK2+N0i3nBeM5h+cHw6FrUPSXIwLS9if/01jVst9GE42Jt/gqcca3XLzDJyr SRJA4zG6p0PZ94HR7cItFqcAUKuWRqnEmIULTJD3Vcf4VDHsqOSOnvAF/jOpE99OWoi3jl F+uPJn0O1N4e9Y5/i9M78c3PV1vWdto= X-MC-Unique: xYasKo4dMdmY5Ku3UPjn3w-1 X-Mimecast-MFC-AGG-ID: xYasKo4dMdmY5Ku3UPjn3w_1772376161 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376161; x=1772980961; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=eMTCCM66b1mqlLHWGeewn1cec2fDx8v9kVEs608meFw=; b=gsUzm0N8D9osQbr7azxI2Rgbm8rfTreJdU7Hz0z1F1tS1knbPmRLt/5vzW/GOLJLG7 ucmDtvECtXIp6A78tuYYI56OTgrAJ10YQi5xncRDhZXfcJGB2EI+c82h8gCtrjTaIVBe 8SCxwOxJ+xbtvbawtQMxd+nWwb5sN0Z2WsdZd0W/VkuNXqOzNNby+I/HCLofJkj1FAkL AeWd+ueIPf5KbVnhBu6gGFGQ/HNEmJKnXIsKjEV8UGMmifydniEhsGDzpU/UMpHEWi57 /mhR+YQ9jAgTRgHXIa1UWduPJ9LCC2PcdZU0GA2gNNbswvd4mN8xfkgQH/xA28nPqLu4 Su9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376161; x=1772980961; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=eMTCCM66b1mqlLHWGeewn1cec2fDx8v9kVEs608meFw=; b=Qr5i0Zf4I0BDA37XRfkI7/T7wOsqCaIIusQSqxG2VHlAplAfmwI0IvixjGu5HxuA2u r3/CpL9QEXp5OIImIn9YmlI8IlVFTqueKNdMGMZt2FgsrBDM7odbu3LrVXDoXJ3NcEi8 CkhVpkzPDXQS1X1fVSccDXOFpFGX8Cj4HsooAzAFyAKzK56qjxx9XyaBRtWpzhGiSHAq kbiqX+f5tyYsU5e2D148HQfoAqhCA1rs2mJINwHp6B5iz8eJPuQpOS1a9k3txwRn+ySG LbvAf04iCBw6XrMPjft632loIc92J9EWB0NJpfhZ88/LX9CkZCUt5f/ZWnnBekmlkZ3M WpcQ== X-Gm-Message-State: AOJu0Yx7uMQrSloFvyWL+3RvmEyUE4F90NTh3fRlw7gB543v0aC7i2y2 2ZOtHYvkCNhlg71lTIIgbXDd/Cqrcm1beS/A5xn3djCQ2T1VJ5In7kInt4PgNxppXr4+VaIzr7K yN1gIwMWTKQmQeieIudbMd3icmXRr0JOgO4A/RUX1OelRLeIs+AGb7x+kxGc8P+aik3ji5h/YVi K2OCaTdfzI698oxfufyeFXiHaovY0yNc5sYt8cDGCV X-Gm-Gg: ATEYQzy8euiSMhjfdghhoCTVYPDU/euanVOfC11hP37iCMSkhyKx4kJZuMKYKBUrjfu a/QRLobWa73Dq8L+F57ay44nGpIYDa5j9LrDMy6uLO4SRqHKInNBwKqsUyUeuCR6tT/F0789EBj RIpuYMmnv1U0vEHoj3dIKC17tkofTIZ73kWKugYyJMdj3aU+9fx6RYJAbOsQ2fHA44z5xdxh13l BvYx2yhuPQmTkOE3g3gT/IjCl7V5zKSzpl2qrW0uYZAYatwv/ZtBNa0TH1TP6uqUZBQw0lLISse IMhCHQ4qQ2NoctdORZEvQlnb/atyNuQ0SwOIMTH9khmhOAoX0NtFDF1rJPyt0+EejCP+uXb1YmG SxAiviw0hqvAtIb2sljW7ZTVFjqBkAjSQS1K1bB8F51puUxm7MqMWc5Pl8jbo3fbcotMPA6TRFQ 3+OCPDeOAgTMZmOQsu9LIqUKo2ipE= X-Received: by 2002:a05:6000:40dc:b0:439:b736:bd0e with SMTP id ffacd0b85a97d-439b736be50mr624178f8f.44.1772376160966; Sun, 01 Mar 2026 06:42:40 -0800 (PST) X-Received: by 2002:a05:6000:40dc:b0:439:b736:bd0e with SMTP id ffacd0b85a97d-439b736be50mr624129f8f.44.1772376160329; Sun, 01 Mar 2026 06:42:40 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 09/18] target/i386/tcg: move VEX validation early Date: Sun, 1 Mar 2026 15:42:09 +0100 Message-ID: <20260301144218.458140-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376260680158500 Content-Type: text/plain; charset="utf-8" Perform the X86_VEX_REPScalar transformation on X86OpEntry instead of X86DecodedOp; everything else can be checked equally well before immediates are fetched etc. This is especially important for APX, which may decode operands differently depending on the NDD bit: if EVEX.NDD=3D0, VEX.vvvv is ignored and must be zero. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 54 ++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 3205a046a6b..a17fc8550fb 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2610,6 +2610,22 @@ static bool decode_ops(DisasContext *s, CPUX86State = *env, X86DecodeFunc decode_f decode->immediate =3D insn_get_signed(env, s, MO_8); } =20 + if (e->vex_class =3D=3D 12) { + /* Check no overlap between registers. */ + if (!decode->op[0].has_ea && + (decode->op[0].n =3D=3D decode->mem.index || decode->op[0].n = =3D=3D decode->op[1].n)) { + return false; + } + assert(!decode->op[1].has_ea); + if (decode->op[1].n =3D=3D decode->mem.index) { + return false; + } + if (!decode->op[2].has_ea && + (decode->op[2].n =3D=3D decode->mem.index || decode->op[2].n = =3D=3D decode->op[1].n)) { + return false; + } + } + return true; } =20 @@ -2716,9 +2732,9 @@ static bool validate_vex(DisasContext *s, X86DecodedI= nsn *decode) if (s->vex_l) { goto illegal; } - assert(decode->e.s2 =3D=3D X86_SIZE_x); - if (decode->op[2].has_ea) { - decode->op[2].ot =3D s->prefix & PREFIX_REPZ ? MO_32 : MO_= 64; + assert(e->op2 =3D=3D X86_TYPE_W && e->s2 =3D=3D X86_SIZE_x); + if ((s->modrm >> 6) !=3D 3) { + e->s2 =3D s->prefix & PREFIX_REPNZ ? X86_SIZE_sd : X86_SIZ= E_ss; } } break; @@ -2735,10 +2751,7 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) =20 switch (e->vex_class) { case 0: - if (s->prefix & PREFIX_VEX) { - goto illegal; - } - return true; + g_assert_not_reached(); case 1: case 2: case 3: @@ -2763,19 +2776,6 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) goto illegal; } =20 - /* Check no overlap between registers. */ - if (!decode->op[0].has_ea && - (decode->op[0].n =3D=3D decode->mem.index || decode->op[0].n = =3D=3D decode->op[1].n)) { - goto illegal; - } - assert(!decode->op[1].has_ea); - if (decode->op[1].n =3D=3D decode->mem.index) { - goto illegal; - } - if (!decode->op[2].has_ea && - (decode->op[2].n =3D=3D decode->mem.index || decode->op[2].n = =3D=3D decode->op[1].n)) { - goto illegal; - } /* fall through */ case 6: case 11: @@ -3118,6 +3118,16 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) get_modrm(s, env); } =20 + if (decode.e.vex_class =3D=3D 0) { + if (s->prefix & (PREFIX_VEX | PREFIX_EVEX)) { + goto illegal_op; + } + } else { + if (!validate_vex(s, &decode)) { + return; + } + } + if (!decode_ops(s, env, decode_func, &decode)) { goto illegal_op; } @@ -3179,10 +3189,6 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) goto illegal_op; } =20 - if (!validate_vex(s, &decode)) { - return; - } - /* * Checks that result in #GP or VMEXIT come second. Intercepts are * generally checked after non-memory exceptions (i.e. after all --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376256; cv=none; d=zohomail.com; s=zohoarc; b=IoT2nGWU1f+0RwGV3pjQxMVf2KOe1oGKHkYNzqHcWQhOhCpT2Dae55K4H2QFkF0PASivfl97OwI352Xb45OrnDXfcOEfrJQh0f8TYwVImnuAURIXlAXyRv3CtYhh2yqTGLF42upAfWGTLrPGmiMyrKu8F26mS3uhrQpLF5fV/KE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376256; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=deYnPH+WwmjHg35s4eVEO2RLAXpYeAKTB9VpdhYUCQ8=; b=mODWb45NNpjWAq180ggCqG2YBorlo3kKg9v1qAuuS4wMNlCTpI6fyNLZmaF4m1ci92BEb1t4KIzyWUfLqk5+b+crPblEkw2SNydWnOH2c4n4e3f2GGncKbmca0FI4oO/7LQ2Tw7zAxUzXrFIJ4klGn0O/7Jfn4eftWSo6M4jbZ0= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177237625699080.99483621398224; Sun, 1 Mar 2026 06:44:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0b-0000MF-Mx; Sun, 01 Mar 2026 09:43:01 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0O-0000KW-Lt for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:48 -0500 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 1vwi0N-0005jo-0M for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:48 -0500 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-180-gnLSWEV1Ob20y0XJt0OsUw-1; Sun, 01 Mar 2026 09:42:45 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439ab866bc1so1182891f8f.2 for ; Sun, 01 Mar 2026 06:42:45 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c765c67sm22388100f8f.32.2026.03.01.06.42.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376166; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=deYnPH+WwmjHg35s4eVEO2RLAXpYeAKTB9VpdhYUCQ8=; b=jHfHmgyfzszyPnI18Hw7zOk5bjrnK07TllSCDK0vzHRd58medzI+hIqM1117vcr5Pa4DJC DJFT1QLGm41te7t1ado1VpI0bDPaSGVb67oYIINfRzpD+3cU/IZ8Vf4yAa/0I/I3xe9zzR 40LB3u8F1qwU80InV41ILmvF0e5xBl4= X-MC-Unique: gnLSWEV1Ob20y0XJt0OsUw-1 X-Mimecast-MFC-AGG-ID: gnLSWEV1Ob20y0XJt0OsUw_1772376164 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376163; x=1772980963; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=deYnPH+WwmjHg35s4eVEO2RLAXpYeAKTB9VpdhYUCQ8=; b=EcigXfY3cOWbjTX/fZ7dci766SoJkCR2EvNcAjqZ6SD1wvjjiur2AtsVpioYOSGKZB EnxELy92ZCwVHAYDTlAnnfEzaVCBVlyvihqGWqdKqvgFBi0jwcksVTdL8gXes2UUcVuV CVdYE42yyeI0vhK8D5SttBfPXwaOLBRFwDjkiRmqDyJr2ZlH4z4Vs8/kN6oZpTsDu2eC d3oKqzvaJdsGeY7052rZhx/iBhgR4YJV1Ou7GPx/3jMQBxVIqhOOjgSyHPG1tlEFGPQ2 TimpRqwiu9rHUX3uOpM0vKRUqXoDNDQ6SCd8k4u/Y974Yb9W86iAlneYUG3NmJujtE7B qbxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376163; x=1772980963; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=deYnPH+WwmjHg35s4eVEO2RLAXpYeAKTB9VpdhYUCQ8=; b=jTWQ6yfOXhKRrMgBiWvyTwZwOwJR9iTe2Z0e/9YgfLCLkxsLGNDqCOXdiFnKN79jBf ifHq7lgKbLzgc5yyqNwLBHjfY+Ubtn/somM/aJ+CI+loWBxS+INZDEI6Op7YalEtUFKO mFR79CwXt4DXkURDHPcV5IwiJ9LQGACk7/Zg+c1MVUkKvmKwVKzTG7ZHBbnTrTOaOmIs MfKrobMWPwHBhPb+iEYcoocUDj035EzWS7ZuZmnLJ404pfErcqd7zQnjmyiLrO+AQTUl uymWgkpSvOEidC24qvTfq0CmvBuDEeNz9hUrY34cKWPhZiko+ZewnU7okcWic8EDpksR 73oQ== X-Gm-Message-State: AOJu0Yzn1WtftabzaWVihLeB/4dr8339RAimTpZr7mQXbRSI+9+xG8fc 5IMRgacWwwqzbazkbi5yzKCivkQSTNqUq/O2jCeBAAjodWrtfnlsF4dYukSR+5f4OeFKYlEorll lePK4DCo/e7tX9Jdp01Qa0L2uV+yowgRGWreK0+ljXo5D9g7+TuB7RFBsqem/TJvfEHoH6q7Qo4 93URuNfEsBXTMMxCnhMGco4hTitrx4IncqLcsiIptp X-Gm-Gg: ATEYQzxBpbhcNXzPaOShJPCIJHweAnSpU3ER6jxwYPOyHYiqk67qEJAK4MGaYqXcjjk Qa5r7RayPstiWdEBNv96u2Uf9EPL/xLc4A2XI5rsT50RkvoqpwHDO/O3EW1hp5SgBhOTZ8DGrdd cFC7HF9ksWbo8eiMv8SCjAIAxlxirWGWs5ddYmeEqDRbit38DRxHmkaqzjAQVEfCqGlGWgX3ZId 7xKsl/Ih1OYSsPRagHN1YuZyqmOTsoKWOf1Lpn4/6zUgMZhVN0R+NJdDEculiT/ChrRRE0aYquH hH3FtQNNwgcSUDD6PY/6wS4KJ+8IccH8NwAJnBwhLbejO7K3+CIW4gcqWN5FCOybkwfdBBY8Rrr Vz82tq7TMJHeYmZ++gZMEr2vUOs8g5S/U73EqfSDpBGYusvmrAsxCpYF78fwSY3ssWs/C5wWK0h 14hxZUXTgPmNcWnM5jfj+0wmmndaU= X-Received: by 2002:a05:6000:604:b0:439:afd8:6223 with SMTP id ffacd0b85a97d-439afd86729mr3996765f8f.3.1772376163286; Sun, 01 Mar 2026 06:42:43 -0800 (PST) X-Received: by 2002:a05:6000:604:b0:439:afd8:6223 with SMTP id ffacd0b85a97d-439afd86729mr3996720f8f.3.1772376162542; Sun, 01 Mar 2026 06:42:42 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 10/18] target/i386/tcg: extend VEX.vvvv parsing for APX Date: Sun, 1 Mar 2026 15:42:10 +0100 Message-ID: <20260301144218.458140-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376258832158500 Content-Type: text/plain; charset="utf-8" Reuse the code that is already in place for AVX's operand type H, so that APX can use type B without the VEX/EVEX prefix. APX mostly uses VEX.vvvv for the destination. This is already supported for AVX, though that one only uses VEX.vvvv for the destination in the case of shifts. However, APX has two extra possibilities that we need to consider: - instructions with VEX/EVEX prefix but no new data destination. To handle this, store into s->vex_ndd whether the B (or H) operand comes from VEX.vvvv or from modrm. - instructions with operands "m,r" that are extended to "r,m,r". In this case, the non-NDD format "m,r" expands the B operand 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. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 1 + target/i386/tcg/decode-new.c.inc | 38 +++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 47eef81ba05..9bf4a1fd516 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 a17fc8550fb..b7988c64f86 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2330,10 +2330,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; @@ -2463,18 +2462,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 | PREFIX_EVEX)); 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 */ @@ -2717,6 +2723,14 @@ static bool validate_vex(DisasContext *s, X86Decoded= Insn *decode) { X86OpEntry *e =3D &decode->e; =20 + 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; + } + } + switch (e->vex_special) { case X86_VEX_None: break; @@ -2804,10 +2818,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 @@ -2886,6 +2897,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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376310; cv=none; d=zohomail.com; s=zohoarc; b=PA2azM6qpS08B23fTkXiuq5satzrdLz2BGzPF23IHmJSBZqwisGpqIW0g83SK+DiRC1lG8ON3U22ZfLi1Dv7osB+Bs3MRmPrOMCZrW5xLDN0fjXJNrAOLBNEU0KSk2od5ZD1xBr6dA6Gnv4emGMTmPu1lv+5wN3YXkJeMUMlNmA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376310; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=4eBK8AnVwgKx0FlEmo7EO5eeaEg2CsCP5eW4vx1Ig1o=; b=NeXBsnVbxsygFsCou6OraDyfeoVVwgIxU/K2Ymi0RQ8GdG+qkkMHHZ2O1m/tx0jDxDqGNfuMlFwpjZUC6kaQU3XQRzLxRdEjszRaE3bTbLESSQMY8RIbICioN64ys8nXfOnSs1kUwM5Ml2VIT3+C354Uo9NlzpLzA+TqHDEppec= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376310405988.9826666149453; Sun, 1 Mar 2026 06:45:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0c-0000Mq-HF; Sun, 01 Mar 2026 09:43:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0Q-0000Kj-Bb for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:50 -0500 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 1vwi0O-0005jw-Gg for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:50 -0500 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-8-kRm9wHI1OJap-l_2mSLaMg-1; Sun, 01 Mar 2026 09:42:46 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439b6c9766aso61750f8f.0 for ; Sun, 01 Mar 2026 06:42:46 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b41831easm4344357f8f.12.2026.03.01.06.42.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376167; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4eBK8AnVwgKx0FlEmo7EO5eeaEg2CsCP5eW4vx1Ig1o=; b=DNYOFHoz7HnbfRbjLP7xB1NUkyfL6fJ+3WsE08KMFnQ2arqFuWd6AItBYddSclwUBSrPR4 86SXjaCKQ4KlY27899TJeH01E6/LH2aHEukpXX1TtTT2HlON6n15H8kILWk3gf+UE791aN G+RVbmVZQR47cHvYOf+ERbiUnqL3vVs= X-MC-Unique: kRm9wHI1OJap-l_2mSLaMg-1 X-Mimecast-MFC-AGG-ID: kRm9wHI1OJap-l_2mSLaMg_1772376165 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376165; x=1772980965; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=4eBK8AnVwgKx0FlEmo7EO5eeaEg2CsCP5eW4vx1Ig1o=; b=te3hKW5zEwMjk/Q/AEpljrprBhp9nGOoTTlTNt5/CEEipKqADKPcqOWXWIoipzJtpB P/YeUPPIZQ+wpAbq6bQRu1YQedBkK10DTXYiNVhG0e8EoefRSt895Jxs34HILrxdXm33 sElM47LNb+rPEGC/5QTSX7FuwhLdhrF1gkcSvpLUgXki3j5BXXiFZwEawPlYtDejTDUu MzIAg/UiHD52zyxuU0QVML6GbKOFEIjNvGdrVgLKAU+159xSl5Cgdw3bFAe4KDs9sAu7 j+2VcA5Yytuo0aKFHaZfALA4sVFDPBo3WTJvlFsLmdwaaMFOHjcCqFmLCQpcuQzXz//a 9qsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376165; x=1772980965; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4eBK8AnVwgKx0FlEmo7EO5eeaEg2CsCP5eW4vx1Ig1o=; b=S6qeJeT5YPA/LGG/VdxiO2XaIHxLTP6bpCBIkN74MWKOo9anavPZ3A+jlqarbqEp97 MgpSvefC/qazjqWgExi/AxAgja1l64J9ejRneWxKQzms4a7/pj7hTXAOf0sDOyFKf502 kUVsjG57gL07ojSjBR0kQGyTpb03Dv5a4OawW7JXzddrMuPEW8KBvpXkGRHsGaKtkzDl CoywEgiWwap8usqtofcNNGENUCdlR2HrOO08QGyTHld+cpCoajKNO37go7fPOD+4eG+C 9DVjAdRqhjFNIpVyZjd5CtPr5uD89eyt0KL22DPwNCT2OEjE0zLr2uNOc4ZPskLj/q3d uspA== X-Gm-Message-State: AOJu0YwZXw/hAHNfr7Qiv/uxeewuQcBpksPKMVnLJozwbECQ2jEJgSCD mGwQTcT2SQ1mGZ7HIr0ne4KvYbeUmHGxWYPpsIheAy3bcCV2GKgSaCSXA96uZzi6kFr4E1Hmj7f 7s5+PdqA9tolknHswZjrQeJIRcG4ogxqlDNVQhUobLHYqHkxM73TeaO2gRca2h7dwQckF3+DBDS JIqW/oXlj520OINja9uANOvHat1OUjvXfAzC88sJCm X-Gm-Gg: ATEYQzyOFla5hGkebZEWkpcunE+WuRH05Hy76GvsZAUcvZp396v66qvRdS3FaRPneiU BbgBnd4WCleFGLUCYlDnyjmnExYBThcEDJpMdXQXKd5bLnAEa6Te/rA5bmSPjHAQlt/Nn63vguF vVB6Yx4v9syZJ94RebV9pbQ68yNQsEauJCkvcpzmkQ3sXOR2VuAQPVSUhJpFB9UMDdqULTBMqTJ NJw4gBU2c16U6TwLELilO3WKPiUOZyIIp/8M7HRExnDjdgwM3bDphD98WIQ26mPbK19Mm5HISsj bDfCibTnrwtKTMdBlP9oTkWJdAWNYgu2XyaoPnuwTfAHWeKihDuR+FTgL6aOhMpvNaGowNtahRT ogt9fbrxWxD4BxGPDZ5U/TM9DQeUUgEUhKBRQQcvggkkaeLXrnkHvLRWBBwRoXg8r0vpDZf9tPy ChP2BYZz/ftG2oG/zEn8gboaRf/eA= X-Received: by 2002:a05:600c:4ece:b0:480:69ae:f0e9 with SMTP id 5b1f17b1804b1-483c9bbbf04mr175563525e9.16.1772376164606; Sun, 01 Mar 2026 06:42:44 -0800 (PST) X-Received: by 2002:a05:600c:4ece:b0:480:69ae:f0e9 with SMTP id 5b1f17b1804b1-483c9bbbf04mr175562925e9.16.1772376164022; Sun, 01 Mar 2026 06:42:44 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 11/18] target/i386/tcg: decode EVEX prefix Date: Sun, 1 Mar 2026 15:42:11 +0100 Message-ID: <20260301144218.458140-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376310965158500 Content-Type: text/plain; charset="utf-8" EVEX is really messy and the exact position of the fields is spread all over the place. For now store the three data bytes of the prefix in DisasContext, later the EVEX instruction classes for APX will be added to extract_evex_params and validate_vex. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 8 +++- target/i386/tcg/decode-new.c.inc | 80 ++++++++++++++++++++++++++++++-- 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 9bf4a1fd516..a74d9b0436e 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 b7988c64f86..c14a07be5ff 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2046,6 +2046,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 @@ -2073,8 +2078,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; @@ -2592,6 +2596,15 @@ static bool decode_insn(DisasContext *s, CPUX86State= *env, X86DecodeFunc decode_ return true; } =20 +static bool extract_evex_params(DisasContext *s, X86DecodedInsn *decode) +{ + /* + * Here, the position of RXB and (for AVX512) displacement multiplier + * should be known. + */ + g_assert_not_reached(); +} + static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, X86DecodedInsn *decode) { @@ -2730,6 +2743,9 @@ static bool validate_vex(DisasContext *s, X86DecodedI= nsn *decode) 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: @@ -2873,6 +2889,10 @@ static inline uint8_t collapse_two_bits(uint8_t valu= e, uint8_t mask) return value + (value > low ? tweak : 0); } =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. @@ -2898,6 +2918,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 @@ -2973,6 +2996,56 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) } break; #endif + case 0x62: /* EVEX */ + if (CODE32(s) && !VM86(s)) { + int evex2 =3D x86_ldub_code(env, s); + + if (!CODE64(s) && (evex2 & 0xc0) !=3D 0xc0) { + s->pc--; /* rewind the advance_pc() x86_ldub_code() did */ + break; + } + if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ + | PREFIX_LOCK | PREFIX_DATA)) { + goto illegal_op; + } + /* + * Store them because the exact correspondence between EVEX + * and RXB bits is only known later. It's different for APX, + * AVX512 register operands, and AVX512 VSIB index operands. + */ + s->evex2 =3D evex2; + s->evex3 =3D x86_ldub_code(env, s); + s->evex4 =3D x86_ldub_code(env, s); + s->vex_w =3D (s->evex3 >> 7) & 1; + s->vex_l =3D (s->evex4 >> 5) & 3; + s->prefix |=3D pp_prefix[s->evex3 & 3] | PREFIX_EVEX; + switch (evex2 & 7) { + case 0x01: + /* + * Note: actually uses VEX map1, to which AVX512 adds extra + * instructions encoded with VEX.L=3D1. Of these, KMOV* + * has an APX extension too. + */ + decode_func =3D decode_0F; + break; + case 0x02: + decode_func =3D decode_0F38; + break; + case 0x03: + decode_func =3D decode_0F3A; + break; + case 0x04: +#ifdef TARGET_X86_64 + decode_func =3D decode_EVEX_map4; + break; +#else + goto illegal_op; +#endif + default: /* Reserved for future use. */ + goto unknown_op; + } + } + break; case 0xc5: /* 2-byte VEX */ case 0xc4: /* 3-byte VEX */ /* @@ -2980,9 +3053,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) { --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376309; cv=none; d=zohomail.com; s=zohoarc; b=abj1Y3jVxjt+nwsk7sHKu9gesscMrTkthdSXgywvRHOnIUkhYePi8iHjNHnjU6JVwg/YLOLJQ2BUAjUsBihpiCdHE8EoLbBAiVU2s0g4QHAmbAkF7FfII3Kc4VXwk3Qh/4j4eQEvfofs5xyyy7oKjZJw3noUXRfgjVM8g0v35ik= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376309; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=Q1bWQq5m4LvVQp0EwySwDYgA6hN9gim4vxj7cEPYMGY=; b=NpMErWZapyg5BoXz6dYXHWdbJhFwZIWOvSjkDEiB/inuNneJgEZFiNNn8qbjolqvFq1Oa0WPpv91IUdLqb/g/HXPUpb+B0+k973Mue9m9uzfTng4y/4ZyZiSw9aqdAAz/750Ykjtr6FHiipHbBnuuke2Ctc2S7al3nm2lH1Lpgs= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376309652726.7730357628265; Sun, 1 Mar 2026 06:45:09 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi1A-0000m0-MZ; Sun, 01 Mar 2026 09:43:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0R-0000Ks-W5 for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:52 -0500 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 1vwi0Q-0005kC-Jd for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:51 -0500 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-222-CqQY-1bDNpiuOlz_ZoWPWw-1; Sun, 01 Mar 2026 09:42:48 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4837cee2e9bso27754435e9.3 for ; Sun, 01 Mar 2026 06:42:48 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b3471asm242680055e9.3.2026.03.01.06.42.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376170; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Q1bWQq5m4LvVQp0EwySwDYgA6hN9gim4vxj7cEPYMGY=; b=LQnbQeD8ehdO3opZmOAcBCqUzoW371q+74woPxQ39OyjOz3N0+uqI+vLn5pKm5lsSL9OLl 3K57Bdpu4PzTyMyLtrdJ+NaGzu1ta4BiNqMw1TICDgaxhPaM7wZgPRhVzi6zUInSU4tU7y lKoNMZt8gQ6BckTEI7BQjsJlU1cJtJI= X-MC-Unique: CqQY-1bDNpiuOlz_ZoWPWw-1 X-Mimecast-MFC-AGG-ID: CqQY-1bDNpiuOlz_ZoWPWw_1772376167 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376167; x=1772980967; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=Q1bWQq5m4LvVQp0EwySwDYgA6hN9gim4vxj7cEPYMGY=; b=IoZfm+kmfejksSnKq5xmWpIhZIgOlCJm1UfQR7M0sDTNBVkGFkJqRkEeLElnUI+wMK BLVGnXwFuU8eF5/TqwaxwBaFF3nDB05tFOkif3cJe8cOl3CsTHtRIVlMQKmckBRxUMSq jLdoiYUfNuKhEmcQ6yv6kw4IX9RiVkKNemVd8rTxDm2Ctqg5uLlzUfqN2A/vZAaPNaBr AqAMgF9JgxpdL5i3oh5vVTensAA+6obeL2mVon3c6BTi73opqAsqxGNg2/zZS1GfY6Oa SyVTqGta1biZo9W/bHrqOZOc6HC7/4jA5xYrvMgrYR86eMOijC4E14Nqr88VGOtyTy3X I1ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376167; x=1772980967; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Q1bWQq5m4LvVQp0EwySwDYgA6hN9gim4vxj7cEPYMGY=; b=h5WOIq8lH/Y40nSQjs8BCPdD1418VK0ww+SC6FKNd5JpEWmdPKmhC2hcNiPyMoX175 XwvQziInfbnPAzwg030jJlHrhq0LHHo7XvDeL4g+H8sto8k0YcOvLwnlPQY5bAwBq2Il OgKIa+q6S7fNiPDWwlnL2U6RaGRBnKeJVC/o2/UHjAhFqaGsdLQHxq8PRpDEBuoQWfkf fdAlHryvdEyaHV3kr0G0lZbdIrHAj0in8DaRQO48h0xysi6n9sIz7nwGBIGp6g79P2Dc Llp/us89TEMszRBfc+Fy4qARbvVPHnyNZIoOiTONZGllnxP3liN6Csf2Wwen/xzP1W6z CyQQ== X-Gm-Message-State: AOJu0YxnCTYBHDpV4etY5pF2ZmGYabiyvFVEaWX4q5pK/7gapx1yKFzS LJ+DVapL6JZOXvNfflBL2v4ESrzebNesZc9liIg6ku+SdT1APN6wNkOGQsxvcIn/O937W+jClnd qbl62EmmjdIQENpbZa/BQWmr1KO5oiwNh/rD3M1Aemfk60+3BqATh2Ok0jbkujOGGAfjQy1W+UO STMNl8c/DC4/VoFBGZ9mP/yOKwmXjoyLzN68IsTB69 X-Gm-Gg: ATEYQzxpHAmo300kL9CtgUERg57vWKLIpEhJHCLUfTNg1E3xD9trO+Jyd1HM6ElwJFN JcnFpSPVfwfFpL0S7InD/8LcYM7nYSxpadPNnBGnJCZuwLqOG0vfShsjPglKqWBJbNgAbDHx1I5 Nu4C2aU7XOaF8kUPveZFpk3NS40KpdnrHDfK5RPVzZppCXX5+fyZVgtgH4Umwd2Gyod72BMA0I7 RpSr44aTapU2XDheycFN1woZ5j3BNrIawb05mH9pzCvQc1VcLMDZrEKN0yFzGPfUBVRXDG1kC1t 2Q0yK0NR5dcguc+kbfD8kSFyw7uMJdIqkxxLRjmnttE7aAlStZOVBGYOS9qB0rgqMrMj/VkheOI zrmI1DX36EhR12XmIIUaYgh3oDndIgU65VvkinMCd3Vo2YsmfPp2lciXIjmJfeaPqZKWZZC+x8I 7QC835wepxKEt3hOcWt2Zl8l79zLI= X-Received: by 2002:a05:600c:1f06:b0:477:55ce:f3c2 with SMTP id 5b1f17b1804b1-483c9bc42c7mr154470105e9.14.1772376167043; Sun, 01 Mar 2026 06:42:47 -0800 (PST) X-Received: by 2002:a05:600c:1f06:b0:477:55ce:f3c2 with SMTP id 5b1f17b1804b1-483c9bc42c7mr154469755e9.14.1772376166521; Sun, 01 Mar 2026 06:42:46 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 12/18] target/i386/tcg: add ZU writeback Date: Sun, 1 Mar 2026 15:42:12 +0100 Message-ID: <20260301144218.458140-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376310902158501 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 3 +++ target/i386/tcg/decode-new.c.inc | 4 ++++ target/i386/tcg/emit.c.inc | 2 ++ 3 files changed, 9 insertions(+) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 4998712e86d..8650b5ae7a0 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -212,6 +212,9 @@ typedef enum X86InsnSpecial { */ X86_SPECIAL_Op0_Rd, =20 + /* ZU-modified APX instruction. */ + X86_SPECIAL_Op0_ZU, + /* * Ry/Mb in the manual (PINSRB). However, the high bits are never use= d by * the instruction in either the register or memory cases; the *real* = effect diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index c14a07be5ff..adb5595ddf3 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -3228,6 +3228,10 @@ static void disas_insn(DisasContext *s, CPUState *cp= u) accept_lock =3D decode.op[0].has_ea; break; =20 + case X86_SPECIAL_Op0_ZU: + assert(decode.op[0].unit =3D=3D X86_OP_INT); + break; + case X86_SPECIAL_Op0_Rd: assert(decode.op[0].unit =3D=3D X86_OP_INT); if (!decode.op[0].has_ea) { diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index ce636b6c56c..94a2bb49172 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -347,6 +347,8 @@ static void gen_writeback(DisasContext *s, X86DecodedIn= sn *decode, int opn, TCGv case X86_OP_INT: if (op->has_ea) { gen_op_st_v(s, op->ot, v, s->A0); + } else if (decode->e.special =3D=3D X86_SPECIAL_Op0_ZU) { + tcg_gen_ext_tl(cpu_regs[op->n], v, op->ot); } else { gen_op_mov_reg_v(s, op->ot, op->n, v); } --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376252; cv=none; d=zohomail.com; s=zohoarc; b=X2aYelZXMaa5A2ntCEr1wvGnb1vlrBMGpJfmdaLVYXnbDd6SCKTP+/dAxIbvpcAno0DXOoDcCGsyBt1ZAHKDpwlsAKlEN1NgAAPXoU2H2dj39bQoSOpockuNjWgRW0+OL30Wcyv7T/Pzkj5yRZa5/YfeVpxSOHL8auzXiVJl1AI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376252; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=6r3NMYQKuV+j4cVljek0aI4LK4YmgmTfG1Jb4diEcjY=; b=B1jsr2gXWLvK4fAma+P6pNXfjACB4tVfo0kN5rc7TS3feCUUrhc7lP4UWJ0QvjjMp8t7tL8jSOuhS2PYbAz7XIx3LYpkkU9Op8Ol0lWH8pQukq0c/dIiYSTynmAUN6RiFPrFmyqXJyr7WPt6LaW53wiAej+24R85vB+Inc9SO0c= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376252494958.6350401496202; Sun, 1 Mar 2026 06:44:12 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0e-0000Ms-M1; Sun, 01 Mar 2026 09:43:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0W-0000LL-8y for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:00 -0500 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 1vwi0U-0005kZ-Cu for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:56 -0500 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-42-dBUyEx8DMriVZdP_tQ5ZVw-1; Sun, 01 Mar 2026 09:42:51 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4837a71903aso21644395e9.1 for ; Sun, 01 Mar 2026 06:42:51 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b4a121sm221976735e9.8.2026.03.01.06.42.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376173; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6r3NMYQKuV+j4cVljek0aI4LK4YmgmTfG1Jb4diEcjY=; b=P1ayPZnGFTOq6yXj5pzNkG1Fq49PEWHxc9XuDD/JSZ6HhvZ/bSpsX9tQebxZuXmtw5jxW9 CpdZxyfO9ZPxSjFVg/Qh6ASAmr75p0RlUOh1xRcu45EEofUYhkT3DHGcWLVakuziZp2EH6 WkBqfY76EJkql0qM7E9UE3FFC4pZy+U= X-MC-Unique: dBUyEx8DMriVZdP_tQ5ZVw-1 X-Mimecast-MFC-AGG-ID: dBUyEx8DMriVZdP_tQ5ZVw_1772376171 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376170; x=1772980970; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=6r3NMYQKuV+j4cVljek0aI4LK4YmgmTfG1Jb4diEcjY=; b=Y9P+p7POlGcnA+rMiyqfFMXAuiM25NCQvH0Kd8gzV2l6LbAuJNrqk8uimIRkWSyrR5 37Ti7krUY96Jg5Y3BLuJAV8xSmDApVMxdXjjDX39nhECZ8FaeRmvFoGIODaSWZKZikwf pRglWcvwcuFAtVb3drFNomYrmgA0SblZVOfe4L/NnPvvri0jjAX3mpqH6TzNDfEk1b3Y zfFyy3pt9oTBkO9x+bjfv7RaTgSTT2Myo9u739WjfNf0n/iwELkyHwKbVKcsGIaCQbro RnDeLr7/R/NkPGZK8n0B8UrLKjvCpso29LdrAKkd6hwymxaW4L2bKjI7sfG7ydsE9uVT LONg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376170; x=1772980970; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=6r3NMYQKuV+j4cVljek0aI4LK4YmgmTfG1Jb4diEcjY=; b=pcRRizomTJj6qBPq1OrGsVP2lktiimp/FC+oaDrcTCHBUih8w6VBn9JGYLxk4tF5Vm TP+a1IwHeB2UnoOZ7JcGS1hN2V6FenEb+e/NxJbZFlEUH8cGu2wVSFikxUyBItpLjXQH tuSxMjWhpwcmXEVIicx+dW3A0++0tMgcnDD6ikmaTnjL4+eXQSx4SeLy8GxX9CPyz4hc 4/icAvW9Oz3rl/AuVO2o0qBXvsGv5eahBaUncFE0/Lt0ZrSvtvC/2kcHVssEc9N3yOh4 8/sACAB8yoMUiQDYPBpkQOjFu5reB04Ygvas2154ZkQgqxG/cX2RKeVhqaGWcYw5hg4Y Iubg== X-Gm-Message-State: AOJu0YzEuMVBMzZUV2s+dOB5RX3dVKXkg6Wi/VzBZCFYjEGKcBECKlUF 3dGYTJE5iroWdF7r6ZkIggnhB3zYHEf3qeFIJ5WntpOmf2EvY8juf6Wa2xSC6IN4LB+7/PzJSu1 bdtDAfKyti1Sh9CFdxHitV/7/qo5fqfzf39T1SJMAXXIddCdXPtjfSO+expaFhdp0Ri3ZgoPaCw fQ+eSmztR/KkPJxlUwJWxBKpf7Rrp5luAZ0zz0sznx X-Gm-Gg: ATEYQzzLxVjiUAiAZFgfhEuASUiE4393Teg5WHQMZYJMNUgAG5JXmXJYT8s3O8pCZan G489FypMAVSEAptAyx8nwoHPka/wBm5Nui5Nj+CBeU/7JgpWQEo7VLNSEO4MleOiOM5M+PpEdrt 6uPxqDEI3IdgFBzkP+rnO/JrrNJb9MYM1KNBgpTwn+upr+K5EC0NJrF0WtbO8MrXN2v9hTK1WPS PhUyfgebP2fW7lH+VsWGF18x5IctYJU6PoSFQ875gglY+SVyFHC8//sAxLL+BHiFkTIcQs9gKa1 BMWeH5QYDWbp3G4hJ1ukAYOPEXqB79RYQhcRCRRlGtkOwSq66ZeGDBaGkpcmWHxDszKwEB7PaEx IuqMrVZrYMdnH4U8rBa1QyL0w6qO85U7NkXjmllhW6iWelrgOvM8otUrMtvOtBzP9AOhJfCsg/8 A997DJzoXrCacAMiUNOLuOhCDeKGA= X-Received: by 2002:a05:600c:c16e:b0:482:e5d4:b7ca with SMTP id 5b1f17b1804b1-483c9bbb8d3mr145755335e9.8.1772376169637; Sun, 01 Mar 2026 06:42:49 -0800 (PST) X-Received: by 2002:a05:600c:c16e:b0:482:e5d4:b7ca with SMTP id 5b1f17b1804b1-483c9bbb8d3mr145754835e9.8.1772376168894; Sun, 01 Mar 2026 06:42:48 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 13/18] target/i386/tcg: add decode functionality for APX Date: Sun, 1 Mar 2026 15:42:13 +0100 Message-ID: <20260301144218.458140-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376252869158500 Content-Type: text/plain; charset="utf-8" Handle the EVEX formats for APX (including the extension of BMI and CMPccXA= DD instructions that already supported VEX) and add their validation to validate_vex(). Exit disas_insn() early if the NF field is set. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.h | 10 ++ target/i386/tcg/translate.c | 11 +- target/i386/tcg/decode-new.c.inc | 168 ++++++++++++++++++++++++++++++- 3 files changed, 181 insertions(+), 8 deletions(-) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 8650b5ae7a0..1c7ed73c437 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -187,6 +187,9 @@ typedef enum X86InsnCheck { =20 /* No 0x67 prefix allowed */ X86_CHECK_no_adr =3D 16384, + + /* EVEX.NF bit not allowed */ + X86_CHECK_nf0 =3D 32768, } X86InsnCheck; =20 typedef enum X86InsnSpecial { @@ -274,6 +277,13 @@ typedef enum X86VEXSpecial { X86_VEX_AVX2_256, } X86VEXSpecial; =20 +typedef enum X86EVEXClass { + /* Non-vector instruction that can use APX EGPRs. */ + X86_EVEX_APX =3D 128, + X86_EVEX_APX_cmp =3D 129, + X86_EVEX_APX_pp2 =3D 130, + X86_EVEX_APX_zu =3D 131, +} X86EVEXClass; =20 typedef struct X86OpEntry X86OpEntry; typedef struct X86DecodedInsn X86DecodedInsn; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index a74d9b0436e..75eeed81fbd 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 adb5595ddf3..c80c61befea 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -253,6 +253,10 @@ #define vex11 .vex_class =3D 11, #define vex12 .vex_class =3D 12, #define vex13 .vex_class =3D 13, +#define evex_apx .vex_class =3D X86_EVEX_APX, +#define evex_apx_cmp .vex_class =3D X86_EVEX_APX_cmp, +#define evex_apx_pp2 .vex_class =3D X86_EVEX_APX_pp2, +#define evex_apx_zu .vex_class =3D X86_EVEX_APX_zu, =20 #define chk(a) .check =3D X86_CHECK_##a, #define chk2(a, b) .check =3D X86_CHECK_##a | X86_CHECK_##b, @@ -2528,9 +2532,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; @@ -2602,7 +2620,35 @@ static bool extract_evex_params(DisasContext *s, X86= DecodedInsn *decode) * Here, the position of RXB and (for AVX512) displacement multiplier * should be known. */ - g_assert_not_reached(); + X86OpEntry *e =3D &decode->e; + uint8_t rex_r, rex_x, rex_b; + + switch (e->vex_class) { + case 13: + case X86_EVEX_APX: + case X86_EVEX_APX_cmp: + case X86_EVEX_APX_pp2: + case X86_EVEX_APX_zu: + /* Only reached through EVEX map 4. */ + rex_r =3D (~s->evex2 & 0x10) | ((~s->evex2 >> 4) & 8); + rex_x =3D ((~s->evex3 << 2) & 0x10) | ((~s->evex2 >> 3) & 8); + rex_b =3D ((s->evex2 << 1) & 0x10) | ((~s->evex2 >> 2) & 8); + s->vex_v =3D ((~s->evex4 << 1) & 0x10) | ((~s->evex3 >> 3) & 15); + break; + default: + return false; + } + +#ifdef TARGET_X86_64 + s->rex_r =3D rex_r; + s->rex_x =3D rex_x; + s->rex_b =3D rex_b; +#else + (void)rex_r; + (void)rex_x; + (void)rex_b; +#endif + return true; } =20 static bool decode_ops(DisasContext *s, CPUX86State *env, X86DecodeFunc de= code_func, @@ -2732,6 +2778,87 @@ static bool has_cpuid_feature(DisasContext *s, X86CP= UIDFeature cpuid) g_assert_not_reached(); } =20 +static bool validate_evex_apx(DisasContext *s, X86DecodedInsn *decode) +{ + X86OpEntry *e =3D &decode->e; + uint8_t evex4_mask =3D 0; + + assert(s->has_modrm); + switch (e->vex_class) { + case 13: + /* + * APX-EVEX-BMI and APX-EVEX-CMPCCXADD do not define EVEX.ND. + * They only differ for checks on NF, which happen elsewhere. + */ + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + evex4_mask =3D 0x0C; + break; + + case X86_EVEX_APX: + /* APX-EVEX-INT. Checks on NF happen elsewhere. */ + assert(e->s0 =3D=3D e->s1); + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + if (!EVEX_APX_ND(s)) { + s->vex_ndd =3D false; + } else if (!s->vex_ndd) { + goto illegal; + } + evex4_mask =3D 0x1C; + break; + + case X86_EVEX_APX_zu: + /* APX-EVEX-INT, with ZU bit defined. Checks on NF happen elsewhe= re. */ + assert(decode->e.special =3D=3D 0 && !s->vex_ndd); + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + if (s->vex_v !=3D 0) { + goto illegal; + } + if (EVEX_APX_ND(s)) { + decode->e.special =3D X86_SPECIAL_Op0_ZU; + } + evex4_mask =3D 0x1C; + break; + + case X86_EVEX_APX_pp2: + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK) || + !EVEX_APX_ND(s) || + (e->op0 !=3D X86_TYPE_None && s->vex_v =3D=3D ((decode->b & 7)= | REX_B(s))) || + ((decode->b & 7) | REX_B(s)) =3D=3D 4 || + s->vex_v =3D=3D 4) { + goto illegal; + } + evex4_mask =3D 0x18; + break; + + case X86_EVEX_APX_cmp: + if (!CODE64(s) || !(s->flags & HF_APX_EN_MASK)) { + goto illegal; + } + evex4_mask =3D 0x0F; + break; + } + + if (s->evex4 & ~evex4_mask) { + goto illegal; + } + + /* r/m =3D=3D 11b requires X4=3D0 (that is, EVEX.U is 1) */ + if ((s->modrm >> 6) =3D=3D 3 && (s->rex_x & 16)) { + goto illegal; + } + return true; + +illegal: + gen_illegal_opcode(s); + return false; +} + static bool validate_vex(DisasContext *s, X86DecodedInsn *decode) { X86OpEntry *e =3D &decode->e; @@ -2824,14 +2951,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) { @@ -3193,6 +3338,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) || @@ -3338,6 +3486,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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376308; cv=none; d=zohomail.com; s=zohoarc; b=FYm14CKnWBhTNvbWigyAYb1wcco4A8r0aDo5cj4fhEID0F0b1cPy8itp2NrfPvaQbwTVO5vygx5aHo/BVx116Vg4z4INEokiLKVQfPoEOAWyOIF9JOdQKYBLmXZmiNoqDMDT5a+Kt5lgJAlxODSdV6oqAWZ23LPX3TpX/hSgWIM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376308; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=cmC+aGM6B+RmqG1UXe6locEGxQuZMZOjQykwsERH2FE=; b=B8CaopWissMUVxnS3EGw5A613sQybzPlgr5EeuCDmWaLDP6+tWot7MxBxJdoKppLBb46X5Ywg7NP/MRMeJgQ0AtED5KZywavTmagrwYu1HlV1pqEq5/C1O2tuoa1OXw+M4gHMBkm89JvFPTl/gBJ2S9iRnt1E6cTNSymWIBwGp4= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376308349364.12132063273896; Sun, 1 Mar 2026 06:45:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi1k-0001GS-6x; Sun, 01 Mar 2026 09:44:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0Y-0000LV-7J for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:00 -0500 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 1vwi0V-0005kf-Jh for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:57 -0500 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-278-Zl1-uXVcMsq9_k6Vu85lug-1; Sun, 01 Mar 2026 09:42:53 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439b5511d5aso224488f8f.1 for ; Sun, 01 Mar 2026 06:42:53 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b1b97927sm5640925f8f.28.2026.03.01.06.42.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376174; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cmC+aGM6B+RmqG1UXe6locEGxQuZMZOjQykwsERH2FE=; b=MUfZ9KJg2KXi4xyVsKyNR5h2vr+AIpKayTqZJYLM00QWhqBbig4N5uKnQb3ApDAb73dMN6 OS1DCJFau9Jg0vMEFiXTqWWOwe4KJAoqmuAt5y/Qj1KrUmSZB6J9KqCwP76R6Gs/0gwK+I f2i5NxX3uFJai37RIgUA8LJYa/+kr9s= X-MC-Unique: Zl1-uXVcMsq9_k6Vu85lug-1 X-Mimecast-MFC-AGG-ID: Zl1-uXVcMsq9_k6Vu85lug_1772376173 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376172; x=1772980972; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=cmC+aGM6B+RmqG1UXe6locEGxQuZMZOjQykwsERH2FE=; b=rSFuUTdOKUJZ5yhQL0PkANRs/KmF90RiZN6JzijGqaJiRd15GG6eUSSUYM24wrp4yM 8GAQFfZtRppTin3Y8M/qwbst2mzNAw0GC3NYLLbkWQ4JD1Ubh9hSIBrxHafTglh5StVM 13aOxwWzVats81SO585k+/+lzHvvN83aYemCs0o2KxH1j+8FEE7gdstLOuDqrYxdCYtI yPjRJ7v1SPSnFJx5vu+KcW1jUe2W8oMj1xWfvlKqABPUAvJQWlEbkMEQpvcI99F8hmBA daMZ9v9E0xciBymxegSz4IVhetMeJfnRP3DXm6C2M9XzquxuqxQ/emWHWfokH7OBXWGH SL5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376172; x=1772980972; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=cmC+aGM6B+RmqG1UXe6locEGxQuZMZOjQykwsERH2FE=; b=bTINwExHGcWBWBl1tKZzzzYTn08k9Q1qJVOAiRkLcG0H7XbbauwYn2lppf8N36uiAU Ra7mfnHL56GEODs129l+E09AGxi3boD+kB4ohO1mL0W7P/3ChUeD5phCR3uJXtHN4+iP WtqxI4Gp+lsAJREQY/1O2bYJjIj/mTfsDRX0X+Ii2/hM3MS8ThASRyaQjuD4Fy77m2vz s+n/KAkXWmANQGofnCvd1Z7aRSaxbzg9ttd4sJZimbkvvXvOlM3oeO/wOEu8jxRupnEH Xo96MsmdkjH83ZvwTj7nVse3Wr6vNSX0WRnCExvHJWmo1alJFgnWTRnCz92DF5UVPiYr z1kw== X-Gm-Message-State: AOJu0YwEWrmIcQ9Kwhf4FtoGgx4FyjbEFrv1h9LCqU8kZfEuJIB2dwfH HdwqO+tVJQHNQPmrimXdIIaP0MqSj2wVzQL4gcy0sv5oCsqI7tJoKd4vq7D37RxWLHh+3uR9gcK Q56yCNFk9PHu4MNJQaib9fkkw9RgCIqjDI+h9w8du7TolhjC1DRZTIaiMljpDsS3XTPqcYvbIUD pciJYpR2ijKCcLhMs6t7nCEFnaH6jVLj6fDJ55u3bs X-Gm-Gg: ATEYQzxiGOx9ArCka6AzhJwTb9jYi8DYF0do1S+6f3X/lBK+P2rRNbdz99LZHK9xZVP tJRP9C8SK9kdgLUrA/bBzXlFGukaFqjfYVI2f1FGGgHETNrHGkuJkXMbYi1XAneFaGbX9OTQ4gv U7v4JAggGKv0BaRoiZmx6pHFBoCYc8L8cyM2cl9IZam0+Mvkn2dD9KBcx+l2GtSVXdGUkbQ/Bml IKm9Owh58RpuX+0/XxEAl8OQAL1/T/rStQXNR93GnW7lKsfmOrdpBx+L+nNRD9JL0pvMD0ftZr+ vRLZ4aFw49h9Veq3G0cIU1tHTPe8I1xOMWLEiISFp+SUNfXqOBYneVvIFXNkyAOPKElK/RFiImH E0+Uk+WJSfCu/Xxi9nOIxCBPGEXEUeV77qnkaLiayHwXt7Vtgl+m4ddTk2lH1Nso/VELyz86STj ACTqr5FIkIXa70z4SLsd+tM+ghX3s= X-Received: by 2002:a05:6000:144e:b0:439:9605:7daf with SMTP id ffacd0b85a97d-4399de2d8afmr16180574f8f.55.1772376171538; Sun, 01 Mar 2026 06:42:51 -0800 (PST) X-Received: by 2002:a05:6000:144e:b0:439:9605:7daf with SMTP id ffacd0b85a97d-4399de2d8afmr16180488f8f.55.1772376170477; Sun, 01 Mar 2026 06:42:50 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 14/18] target/i386/tcg: implement CCMP/CTEST Date: Sun, 1 Mar 2026 15:42:14 +0100 Message-ID: <20260301144218.458140-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376309273158500 Content-Type: text/plain; charset="utf-8" CCMP/CTEST are new instructions that will either perform a CMP/TEST or set EFLAGS to a predetermined value. To support this double functionality without using CC_OP_DYNAMIC, introduce a new CCOp that is inspired by x86_flags.h. By shifting the carry computation part of compute_aco_sub* to TCG ops, it provides enough flexibility that the result of a subtraction, the result of an AND, and any value of EFLAGS can be encoded with a single CCOp. Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 5 + target/i386/tcg/cc_helper_template.h.inc | 11 ++ target/i386/tcg/cc_helper.c | 10 ++ target/i386/tcg/translate.c | 63 +++++++++++ target/i386/tcg/decode-new.c.inc | 26 ++--- target/i386/tcg/emit.c.inc | 137 ++++++++++++++++++++++- 6 files changed, 238 insertions(+), 14 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 7586ea0ed8d..a542a8b250c 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1582,6 +1582,11 @@ typedef enum { CC_OP_BLSIL, CC_OP_BLSIQ, =20 + CC_OP_CCMPB, /* Z via CC_DST, P,S via CC_SRC2, carry-out in CC_SRC */ + CC_OP_CCMPW, + CC_OP_CCMPL, + CC_OP_CCMPQ, + /* * Note that only CC_OP_POPCNT (i.e. the one with MO_TL size) * is used or implemented, because the translation needs diff --git a/target/i386/tcg/cc_helper_template.h.inc b/target/i386/tcg/cc_= helper_template.h.inc index af58c2409f7..8ec449fd3ff 100644 --- a/target/i386/tcg/cc_helper_template.h.inc +++ b/target/i386/tcg/cc_helper_template.h.inc @@ -60,6 +60,17 @@ static uint32_t glue(compute_aco_cout, SUFFIX)(DATA_TYPE= carries) return af_cf + of; } =20 +static uint32_t glue(compute_all_ccmp, SUFFIX)(DATA_TYPE dst, DATA_TYPE sr= c1, DATA_TYPE src2) +{ + uint32_t pf, zf, sf; + + /* Compute all bits here because PF and SF do not come from DST. */ + zf =3D dst =3D=3D 0 ? CC_Z : 0; + pf =3D compute_pf(src2); + sf =3D lshift(src2, 8 - DATA_BITS) & CC_S; + return pf + zf + sf + glue(compute_aco_cout, SUFFIX)(src1); +} + static uint32_t glue(compute_aco_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src= 1) { DATA_TYPE src2 =3D dst - src1; diff --git a/target/i386/tcg/cc_helper.c b/target/i386/tcg/cc_helper.c index 6ddd64fcb07..a43b42badc0 100644 --- a/target/i386/tcg/cc_helper.c +++ b/target/i386/tcg/cc_helper.c @@ -111,6 +111,13 @@ target_ulong helper_cc_compute_all(target_ulong dst, t= arget_ulong src1, case CC_OP_ADCOX: return compute_all_adcox(dst, src1, src2); =20 + case CC_OP_CCMPB: + return compute_all_ccmpb(dst, src1, src2); + case CC_OP_CCMPW: + return compute_all_ccmpw(dst, src1, src2); + case CC_OP_CCMPL: + return compute_all_ccmpl(dst, src1, src2); + case CC_OP_MULB: flags =3D compute_aco_mul(src1); goto psz_b; @@ -232,6 +239,9 @@ target_ulong helper_cc_compute_all(target_ulong dst, ta= rget_ulong src1, goto psz_l; =20 #ifdef TARGET_X86_64 + case CC_OP_CCMPQ: + return compute_all_ccmpq(dst, src1, src2); + case CC_OP_MULQ: flags =3D compute_aco_mul(src1); goto psz_q; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 75eeed81fbd..b8e5bc55ad9 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -282,6 +282,7 @@ enum { JCC_BE, JCC_S, JCC_P, + CCMP_T =3D JCC_P, JCC_L, JCC_LE, }; @@ -309,6 +310,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, @@ -906,6 +908,7 @@ static CCPrepare gen_prepare_eflags_c(DisasContext *s, = TCGv reg) .no_setcond =3D true }; =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); @@ -973,6 +976,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)); } @@ -992,6 +997,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, @@ -1074,6 +1093,50 @@ 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) { + zf =3D gen_prepare_val_nz(cpu_cc_dst, size, true); + assert(!zf.use_reg2); + /* If CPU_CC_DST is zero, set reg to all ones. */ + tcg_gen_movcond_tl(zf.cond, reg, zf.reg, tcg_constant_tl(z= f.imm), + tcg_constant_tl(-1), reg); + } + return gen_prepare_sign_nz(reg, size); + + case JCC_BE: + if (!reg) { + reg =3D tcg_temp_new(); + } + /* 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); + assert(!zf.use_reg2); + tcg_gen_movcond_tl(zf.cond, reg, zf.reg, tcg_constant_tl(zf.im= m), + tcg_constant_tl(-1), cpu_cc_src); + return gen_prepare_sign_nz(reg, size); + 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 c80c61befea..5e559d6ecb5 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1581,7 +1581,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]; @@ -1628,7 +1628,7 @@ 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), + [0x00] =3D X86_OP_ENTRYrr(TEST, E,b, I,b), [0x02] =3D X86_OP_ENTRY1(NOT, E,b, lock), [0x03] =3D X86_OP_ENTRY1(NEG, E,b, lock), [0x04] =3D X86_OP_ENTRYrr(MUL, E,b, 0,b, zextT0), @@ -1637,7 +1637,7 @@ 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), + [0x08] =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), @@ -1776,8 +1776,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 @@ -1868,12 +1868,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 @@ -1932,8 +1932,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 94a2bb49172..685972060c0 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1649,6 +1649,116 @@ 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 from 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; +} + +/* Conditionally fill CC_DST/SRC/SRC2 with values that produce the flag va= lues + * in DFV, leaving the output of CCMP/CTEST in place if the condition code + * COND is true. On input, CC_DST contains the result of the subtraction = or + * AND. If COND is true, CC_SRC will be loaded with COUT if it is non-NUL= L, + * otherwise with zero (resulting in CF=3DAF=3DOF=3D0). + */ +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) + */ + src2 =3D dst & 3; + src2 ^=3D (dfv & CC_P) ? 0 : 1; + src2 ^=3D (dfv & CC_S) ? -1 : 0; + + if (!cc.use_reg2) { + cc.reg2 =3D tcg_constant_tl(cc.imm); + } + + 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 << 1; + uint32_t dfv =3D evex_to_eflags(s); + MemOp ot =3D decode->op[1].ot; + TCGv cout; + + switch (cond) { + case CCMP_T << 1: + gen_SUB(s, decode); + return; + case (CCMP_T << 1) | 1: + 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(); @@ -3844,7 +3954,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; @@ -4158,6 +4267,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 << 1; + uint32_t dfv =3D evex_to_eflags(s); + MemOp ot =3D decode->op[1].ot; + + switch (cond) { + case CCMP_T << 1: + gen_AND(s, decode); + return; + case (CCMP_T << 1) | 1: + 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.52.0 From nobody Mon Mar 2 08:46:30 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=1772376282; cv=none; d=zohomail.com; s=zohoarc; b=B883+N/5ocYkrf77fjyey0pPQlP2PXRy3e1CDxfmZsGzM+Jii21xQc45sCTfPxp8uU5HhxVgMtHOziWmbD+tTVOAxOkSMt+kQZ00J/HhI14jJsYXCGyZh6P2xlFD1cugC/KoQiXVrwBn01JQ+cgmMVLfibS8Rvg49F//bS1Oz68= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376282; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=sWKTRldb4iRFxkSurqgq7P1n5f8uWxNSHnZjn42Afes=; b=SoVzTh6DZrIFvSy/ENdrhG9nbuU5Tsci2UVQMj+2aL+X01nUOa0wVQlKtfG8xMvvuqn40FvEJPDm6qkMB5FRqmUXq19778ZGE98wPlTdFSTSboRThCfIdbnlfLnls1AbDifCOUnX9qLeEJf3DCTpbyk6D/0qR+JEwVygRFDQHvM= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376282063376.4695341092986; Sun, 1 Mar 2026 06:44:42 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0g-0000Oz-Cd; Sun, 01 Mar 2026 09:43:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0Y-0000LT-2m for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:00 -0500 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 1vwi0W-0005km-6V for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:42:57 -0500 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-528-IqvVg_8UPymrnNX4e0jqzw-1; Sun, 01 Mar 2026 09:42:54 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-482d8e6e13aso28846215e9.3 for ; Sun, 01 Mar 2026 06:42:54 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd765604sm301684265e9.15.2026.03.01.06.42.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376175; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sWKTRldb4iRFxkSurqgq7P1n5f8uWxNSHnZjn42Afes=; b=iNZ/yMD6pkOgtT2c/bEzewQqqt/8V9oPYVuOGEMJnI4wNYPXNfAqPVoMQMNNl15WSTQOYp df/sJ6ilFVEKP+iiNO8cHg7410b2ywB63UOXSPtB/bUsgeZ5Ym2cpD/dWcbIWBY5tkbxdy j9CLKihi+Ki732CN1p1K6L82SQ9gKI0= X-MC-Unique: IqvVg_8UPymrnNX4e0jqzw-1 X-Mimecast-MFC-AGG-ID: IqvVg_8UPymrnNX4e0jqzw_1772376173 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376172; x=1772980972; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=sWKTRldb4iRFxkSurqgq7P1n5f8uWxNSHnZjn42Afes=; b=lju3CdaTNyj9g/pHsyLbdOBSQ0UPQ08az7dzte0vfIUwsJGBD/WCc3D7JVwhT8Uwpn ujNn/mIH0IhwHhq5WMyDpH4zkbJUZGaaYqr+5KO4HGrf4e58H1RTwlPIB3jU0ADgbLmI pXNGZzozG826MEWxqt/CDdYBZMsxgbn+aThlpOPBJuySX5o2PH9WsN9joDUSZufNuknq v+nTU3CquHM7P7by6z5q6/nIpen7pI7KxgWIYdNH09EVYDTMpEV81A9KnxQ7q7CQfhdh nn0yMQyVgaslyyTlgOumr/FtXJcsnGdXdfYz2gdHTcOMSdNGNOigNXAygcwP9H1y65lE VT+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376172; x=1772980972; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=sWKTRldb4iRFxkSurqgq7P1n5f8uWxNSHnZjn42Afes=; b=KuiTWC6WarefdEbBZbGJqdPbmzO+9j5gwRLVx7BRLo31aRPI0DTWN+JgBFp37A7Nv4 97ezxoEmguANatDp+2RVdWDTfieCIj8MZ6FUC+9/5g03hoHZfrgdjv8Blf6wbsu7tKIR rF+opLKvZ61KNPMUXsSQJ7ZFWPPl+tPszxAEPYUjLZvxpyM0T/vyYgCNKZhYzOY5WFve TU5/ec0L4EnSlHDLZTqH1dKWi2O6kIPnDztHjZa/b2EqUqcgAXZzAMDCxyhfVm7Dklc9 YEco/Ftc2e575tXvu4BkF8WukFO2DXTvWqU4y92JOkne3CYeQ+MWLi0ZC4/u14hnOq0n Ziig== X-Gm-Message-State: AOJu0YyflB7h6FJ3DSrgnFUslpqihGCbap+iiW6JDk40cNkjGqEw5Knz THQh34MjUZdgwBX5HUKvUAradz0R0SCzUoCmbg3ImMFStlQcH4aqw63G4u9d4PTzmUajErbbqtV +YK62vXbdOnzBueNZ8ND96iB/5ZwluRURdD6NBqCyHGK/1v5XPYWiJF0H7PZF8ywukJ2XcbUuhl kMqMFkTrXaQaSH/9xi+t6xtpExSR9behDwl7v4SDjA X-Gm-Gg: ATEYQzzks87zGc7hmIb6T1v/a8jHGpPDclvm6qbp/YTe5hsihiOqSdQcanhXjWMwAov 377hybDNNXlU2s8lSr1vJt35MD+DpOskdM4B9qFDhP6efHasV8K1T1Gb2AHiaN05LLnxv88mpj7 sisW/qhRBrxm+tsB/O87pzoGW2MtjSQiL9Dj/KACtNnBmz1d65/YVWUyjZjzHTqA6WpsdNv43EW TTVxjzhwNZfb80rFxdjmPILg5dkGmZSNytKnGYOUJYca+Pqmt2oh5evTfZ+5YMnsvFokWSEkCjT L60NFOW/9+qEsO/jUSI6YjMHxjUXhC6uo3SyoOUfxiV68biE6qR+HbtKF5pB674e3zhsp1NxBq+ LEmbh+pam3fIe4cPpUHhZxiAA2uzBYN4lDpqkZuuXsk5L7mRNhFWRMUWRkOdKupVhoZapHHmy+z J1+BetCfgnqJ81u2/H3sKJBPxDsuA= X-Received: by 2002:a05:600c:3e16:b0:46e:32dd:1b1a with SMTP id 5b1f17b1804b1-483c9ba38damr170119975e9.7.1772376172520; Sun, 01 Mar 2026 06:42:52 -0800 (PST) X-Received: by 2002:a05:600c:3e16:b0:46e:32dd:1b1a with SMTP id 5b1f17b1804b1-483c9ba38damr170119435e9.7.1772376171883; Sun, 01 Mar 2026 06:42:51 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 15/18] target/i386/tcg: undo IMUL memory load optimization Date: Sun, 1 Mar 2026 15:42:15 +0100 Message-ID: <20260301144218.458140-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376282790158500 Content-Type: text/plain; charset="utf-8" The IMUL 0F AF encoding was using T0 for the (possible) memory operand so as to use a load with sign extension. However, this trick will be incompatible with APX's new data destination extension which will use "B,v" for the destination. If no VEX/EVEX prefix is present, the "B" operand type defaults to op1, hence op1 has to be "G,v" for correct decoding of the non-APX instruction. This is only needed because EVEX map 4's 0xA0-0xAF slots reuse the decode tables for pre-APX instructions. Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 5e559d6ecb5..18b1b6845c1 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1504,11 +1504,7 @@ static const X86OpEntry opcodes_0F[256] =3D { [0xac] =3D X86_OP_ENTRY4(SHRD, E,v, 2op,v, G,v), [0xad] =3D X86_OP_ENTRY3(SHRD, E,v, 2op,v, G,v), [0xae] =3D X86_OP_GROUP0(group15), - /* - * It's slightly more efficient to put Ev operand in T0 and allow gen_= IMUL3 - * to assume sextT0. Multiplication is commutative anyway. - */ - [0xaf] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, 2op,v, sextT0), + [0xaf] =3D X86_OP_ENTRY2(IMUL3, G,v, E,v, sextT0), =20 [0xb8] =3D X86_OP_GROUP0(0FB8), /* decoded as modrm, which is visible as a difference between page fau= lt and #UD */ --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376308; cv=none; d=zohomail.com; s=zohoarc; b=cfhaNXZ9Nk/PLJ5m8T2V29f0AADX6zYIHotfleyB6jWGQSq22yyMqxCsKXuKgLwlb3Oq8QFz6b1011B6qZZtybNNlxO7KDowvwWtyy5/WkOCYMnsRobXOxqxHeH4rLyhu4JgwkuUYkzC0jeCjCRPVejamiUBM8GYp79lJNONxcg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376308; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=ZGky8xMD3dSn1WaLy+RU0xJNdQ/dzGO2Gz2ecqpJwgk=; b=SaibnLVBS+7tCaqiLXW7XmqWjrSs9qdxfiz5exYqDkB/emSO+EPvHZpvcEo7ne46Evmcsifo4pMLaIrhUrAzcuP0HQGid8Se6E0KzUv1tEDsTwZNr6aWRiUiOID+iyYQRFE7VSi6LZDkVGTtpoBpQvuGFujVtmw3gtkoJUV7AJE= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376308374229.03925182775254; Sun, 1 Mar 2026 06:45:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0v-0000VA-M2; Sun, 01 Mar 2026 09:43:26 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0f-0000P1-GB for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:06 -0500 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 1vwi0a-0005lD-3u for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:04 -0500 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-384-at_JVB7CPNWE_v3JgHvZ1g-1; Sun, 01 Mar 2026 09:42:58 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4837f288194so25714335e9.2 for ; Sun, 01 Mar 2026 06:42:57 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b485a0b6sm4048856f8f.39.2026.03.01.06.42.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376179; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZGky8xMD3dSn1WaLy+RU0xJNdQ/dzGO2Gz2ecqpJwgk=; b=GktXUXbzcncEBXPPtAWeX7nWiU9rEUstg6nyVs1LP2aRXuRSYbKtPsovspFNcMoT+PK8G3 ivedMOLNrJFubG3bYLhQnS77Coco04WmH6otiVVl6teTKmoAM8+jBDEYFTNcnFoHdn5tqI HNYU9yHdr+zFTIKDxdklBjNfMJ/mt6g= X-MC-Unique: at_JVB7CPNWE_v3JgHvZ1g-1 X-Mimecast-MFC-AGG-ID: at_JVB7CPNWE_v3JgHvZ1g_1772376177 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376176; x=1772980976; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=ZGky8xMD3dSn1WaLy+RU0xJNdQ/dzGO2Gz2ecqpJwgk=; b=MzvR99mbDQduPYtlBXCBDQ9UVPkDfcbzHJLTeMWZjl6BjQzRAVwXf/XoSfMI7g8ueL VqUeZ9KZ6yK+I5+k1aRZyv26jJbcqXTLszhGUnfXhhFW8x5N7pBNBAWIuWz38EHQ9KRF ZOHsMLamW8mebbMi57/3QqXFCr0xnGo2iBBAUIrjttdrNhvK8WsmwtF5NU+NoZl5ElUw oi+6E1+OUziOe2o51MqFqU0hg1eetzfbQOLjgLPSB+nAJ1YFPU6NumOlUWReie+BleS9 6FLRUUHg08HCL1zIbEowGi2QvY/KJ6wikUVntsKQyJmBUM5/UKDTFeX8ztBH4rnupkNa fkgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376176; x=1772980976; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ZGky8xMD3dSn1WaLy+RU0xJNdQ/dzGO2Gz2ecqpJwgk=; b=deqA/iGjOgxN5eZIF9nlPbfuywPwQKCywg235ghhq7EwvwWDKgTX0wZ+Oan1kYEnfH 9WEWgbFA/R4UggTU9mRg2J8vIZAQCgS+jEDzAuzLanw+a1iW0ZE+Eq306NnqJWQsWrdk xWY5GsgbwWxBEjPwjf8SGine4QIH6FKHrJMpQAg/kIIbAfIvA2NQXiaswo7XL3bq2VLS 9KMPFZQMdIkn3c70oPN9OII8ZRXJ0N0hqTI81joYaIU/gdybYYnaFq6M++V0zprsRLYg rJkQwtD8a6O7s7YbsTVaFKSCNVJ+AZjoAXKZ1UJg1LNxWntEAP9+qnVnUe9jV9EM0UzQ Rj2g== X-Gm-Message-State: AOJu0Ywu5FSXUwnTY+dahsq8i9RYq1rlfwF6inoJmQxXKXS72wjmHEHn uVs2AkpYrtoYJRBTY/2cZz8nMRGFc8nOO8AtLBMo9YKGX5ryLGbZ6hTq7SN5/VVw7tG103pB4xN jGJ+XsQHGcgifkZS+chTnZejGSYAYMgUZp3mYINszB5kYHm+hjcDYNws3jqFUvlE9k3n6ktjnH3 axolngZk/+QkfWbdykbHV+DsavnPWGxhAzrqKVy9ZQ X-Gm-Gg: ATEYQzyh7U6n2+qJyKK/e3o0zHAVV0tdAMEfW9d26pT/B+izvrT00FluLdDM3z0ncS+ hvhvwkkblGUuE0+3xkDd08KnC36yVuv6BqRBesjxJ5f9ozP2RlwGAcX7duJ8+vxbenFCsA2UQOy Z9lAbNAR4PM4ymTAgpHwL79mqesjQklVKBcyV4BnVzWU8iER8RwDd9RU4dvU4YOjz3Y+LjLfgwr To9KQmY8K54EFyVnKCV0Ozo0nsXKBdE3XohrB+LWwKd5ZQsWriknKV+ZER7SlJz1RniZsSg4Rae uUh0oI3Th98g94V+oLRogMYVgTBLIsoGFG+rvkGA51YdgL+G+u6brBpFwa7J3UU6roBqt+7h+Y2 6GQIeHHgxwhb7lEhjx5JSNMjuieDJGMRDZ+e7pHZxgYCxK1qc3FtJsZuDSR6V2BZadlvpsixfF9 EqebgzHWPIMbQiY/0h3PP/c8vtoRE= X-Received: by 2002:a05:600c:46c4:b0:483:7ae2:1737 with SMTP id 5b1f17b1804b1-483c9c1bbe9mr164728565e9.17.1772376175778; Sun, 01 Mar 2026 06:42:55 -0800 (PST) X-Received: by 2002:a05:600c:46c4:b0:483:7ae2:1737 with SMTP id 5b1f17b1804b1-483c9c1bbe9mr164727615e9.17.1772376174663; Sun, 01 Mar 2026 06:42:54 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 16/18] target/i386/tcg: decode APX instructions Date: Sun, 1 Mar 2026 15:42:16 +0100 Message-ID: <20260301144218.458140-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376309154158500 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 | 356 ++++++++++++++++++++++--------- target/i386/tcg/emit.c.inc | 55 +++++ 5 files changed, 320 insertions(+), 98 deletions(-) diff --git a/target/i386/helper.h b/target/i386/helper.h index 3f67098f11f..99cbbacadfc 100644 --- a/target/i386/helper.h +++ b/target/i386/helper.h @@ -57,6 +57,7 @@ DEF_HELPER_2(sysret, void, env, int) DEF_HELPER_FLAGS_1(pause, TCG_CALL_NO_WG, noreturn, env) DEF_HELPER_FLAGS_3(raise_interrupt, TCG_CALL_NO_WG, noreturn, env, int, in= t) DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, int) +DEF_HELPER_FLAGS_1(raise_gpf, TCG_CALL_NO_WG, noreturn, env) DEF_HELPER_FLAGS_1(icebp, TCG_CALL_NO_WG, noreturn, env) DEF_HELPER_3(boundw, void, env, tl, int) DEF_HELPER_3(boundl, void, env, tl, int) diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 1c7ed73c437..de35fb44a37 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -53,6 +53,7 @@ typedef enum X86OpType { X86_TYPE_nop, /* modrm operand decoded but not loaded into s->T{0,1} */ X86_TYPE_2op, /* 2-operand RMW instruction */ X86_TYPE_LoBits, /* encoded in bits 0-2 of the operand + REX.B */ + X86_TYPE_ZERO, /* Constant zero, for CFCMOV */ X86_TYPE_0, /* Hard-coded GPRs (RAX..RDI) */ X86_TYPE_1, X86_TYPE_2, diff --git a/target/i386/tcg/excp_helper.c b/target/i386/tcg/excp_helper.c index 32f2784e923..6a7a9fc8d56 100644 --- a/target/i386/tcg/excp_helper.c +++ b/target/i386/tcg/excp_helper.c @@ -36,6 +36,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 18b1b6845c1..32eaf582623 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -184,6 +184,8 @@ X86_OP_GROUP3(op, op0, s0, None, None, None, None, ## __VA_ARGS__) #define X86_OP_GROUPwr(op, op0, s0, op1, s1, ...) \ X86_OP_GROUP3(op, op0, s0, op1, s1, None, None, ## __VA_ARGS__) +#define X86_OP_GROUPrr(op, op0, s0, op1, s1, ...) \ + X86_OP_GROUP3(op, None, None, op0, s0, op1, s1, ## __VA_ARGS__) #define X86_OP_GROUP0(op, ...) \ X86_OP_GROUP3(op, None, None, None, None, None, None, ## __VA_ARGS__) =20 @@ -275,8 +277,10 @@ #define p_f3 .valid_prefix =3D P_F3, #define p_f2 .valid_prefix =3D P_F2, #define p_00_66 .valid_prefix =3D P_00 | P_66, +#define p_00_f2 .valid_prefix =3D P_00 | P_F2, #define p_00_f3 .valid_prefix =3D P_00 | P_F3, #define p_66_f2 .valid_prefix =3D P_66 | P_F2, +#define p_66_f3 .valid_prefix =3D P_66 | P_F3, #define p_00_66_f3 .valid_prefix =3D P_00 | P_66 | P_F3, #define p_66_f3_f2 .valid_prefix =3D P_66 | P_F3 | P_F2, #define p_00_66_f3_f2 .valid_prefix =3D P_00 | P_66 | P_F3 | P_F2, @@ -856,28 +860,30 @@ 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 -/* five rows for no prefix, 66, F3, F2, 66+F2 */ +/* five rows for no prefix, 66, F3, F2, 66+F2 - all VEX13 instructions ext= end to APX */ static const X86OpEntry opcodes_0F38_F0toFF[16][5] =3D { [0] =3D { X86_OP_ENTRYwr(MOVBE, G,y, M,y, cpuid(MOVBE)), @@ -910,22 +916,22 @@ static const X86OpEntry opcodes_0F38_F0toFF[16][5] = =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)), {}, }, }; @@ -1023,7 +1029,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) @@ -1363,9 +1369,9 @@ static const X86OpEntry opcodes_0F[256] =3D { [0xa0] =3D X86_OP_ENTRYr(PUSH, FS, w), [0xa1] =3D X86_OP_ENTRYw(POP, FS, w), [0xa2] =3D X86_OP_ENTRY0(CPUID), - [0xa3] =3D X86_OP_ENTRYrr(BT, E,v, G,v, btEvGv), - [0xa4] =3D X86_OP_ENTRY4(SHLD, E,v, 2op,v, G,v), - [0xa5] =3D X86_OP_ENTRY3(SHLD, E,v, 2op,v, G,v), + [0xa3] =3D X86_OP_ENTRYrr(BT, E,v, G,v, btEvGv), + [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), =20 [0xb0] =3D X86_OP_ENTRY2(CMPXCHG,E,b, G,b, lock), [0xb1] =3D X86_OP_ENTRY2(CMPXCHG,E,v, G,v, lock), @@ -1499,12 +1505,12 @@ static const X86OpEntry opcodes_0F[256] =3D { =20 [0xa8] =3D X86_OP_ENTRYr(PUSH, GS, w), [0xa9] =3D X86_OP_ENTRYw(POP, GS, w), - [0xaa] =3D X86_OP_ENTRY0(RSM, chk(smm) svm(RSM)), + [0xaa] =3D X86_OP_ENTRY0(RSM, chk(smm) svm(RS= M)), [0xab] =3D X86_OP_ENTRY2(BTS, E,v, G,v, btEvGv), - [0xac] =3D X86_OP_ENTRY4(SHRD, E,v, 2op,v, G,v), - [0xad] =3D X86_OP_ENTRY3(SHRD, E,v, 2op,v, G,v), + [0xac] =3D X86_OP_ENTRY4(SHRD, B,v, E,v, G,v, evex_apx p_00_6= 6), + [0xad] =3D X86_OP_ENTRY3(SHRD, B,v, E,v, G,v, evex_apx p_00_6= 6), [0xae] =3D X86_OP_GROUP0(group15), - [0xaf] =3D X86_OP_ENTRY2(IMUL3, G,v, E,v, sextT0), + [0xaf] =3D X86_OP_ENTRY3(IMUL3, B,v, G,v, E,v, evex_apx sextT0= p_00_66), =20 [0xb8] =3D X86_OP_GROUP0(0FB8), /* decoded as modrm, which is visible as a difference between page fau= lt and #UD */ @@ -1584,9 +1590,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; } @@ -1613,6 +1619,9 @@ static void decode_group2(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, }; int op =3D (get_modrm(s, env) >> 3) & 7; entry->gen =3D group2_gen[op]; + if (op =3D=3D 2 || op =3D=3D 3) { + entry->check |=3D X86_CHECK_nf0; + } if (op =3D=3D 7) { entry->special =3D X86_SPECIAL_SExtT0; } else { @@ -1624,22 +1633,22 @@ 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), - [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), + [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), - [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), + [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); @@ -1652,12 +1661,12 @@ static void decode_group4_5(DisasContext *s, CPUX86= State *env, X86OpEntry *entry { static const X86OpEntry opcodes_grp4_5[16] =3D { /* 0xfe */ - [0x00] =3D X86_OP_ENTRY1(INC, E,b, l= ock), - [0x01] =3D X86_OP_ENTRY1(DEC, E,b, l= ock), + [0x00] =3D X86_OP_ENTRYwr(INC, B,b, E,b, e= vex_apx p_00 lock), + [0x01] =3D X86_OP_ENTRYwr(DEC, B,b, E,b, e= vex_apx p_00 lock), =20 /* 0xff */ - [0x08] =3D X86_OP_ENTRY1(INC, E,v, l= ock), - [0x09] =3D X86_OP_ENTRY1(DEC, E,v, l= ock), + [0x08] =3D X86_OP_ENTRYwr(INC, B,v, E,v, e= vex_apx p_00 lock), + [0x09] =3D X86_OP_ENTRYwr(DEC, B,v, E,v, e= vex_apx p_00 lock), [0x0a] =3D X86_OP_ENTRYr(CALL_m, E,f64, z= extT0), [0x0b] =3D X86_OP_ENTRYr(CALLF_m, M,p), [0x0c] =3D X86_OP_ENTRYr(JMP_m, E,f64, z= extT0), @@ -1696,37 +1705,37 @@ static void decode_90(DisasContext *s, CPUX86State = *env, X86OpEntry *entry, uint } =20 static const X86OpEntry opcodes_root[256] =3D { - [0x00] =3D X86_OP_ENTRY2(ADD, E,b, G,b, lock), - [0x01] =3D X86_OP_ENTRY2(ADD, E,v, G,v, lock), - [0x02] =3D X86_OP_ENTRY2(ADD, G,b, E,b, lock), - [0x03] =3D X86_OP_ENTRY2(ADD, G,v, E,v, lock), + [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), [0x04] =3D X86_OP_ENTRY2(ADD, 0,b, I,b, lock), /* AL, Ib */ [0x05] =3D X86_OP_ENTRY2(ADD, 0,v, I,z, lock), /* rAX, Iz */ [0x06] =3D X86_OP_ENTRYr(PUSH, ES, w, chk(i64)), [0x07] =3D X86_OP_ENTRYw(POP, ES, w, chk(i64)), =20 - [0x10] =3D X86_OP_ENTRY2(ADC, E,b, G,b, lock), - [0x11] =3D X86_OP_ENTRY2(ADC, E,v, G,v, lock), - [0x12] =3D X86_OP_ENTRY2(ADC, G,b, E,b, lock), - [0x13] =3D X86_OP_ENTRY2(ADC, G,v, E,v, 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), [0x14] =3D X86_OP_ENTRY2(ADC, 0,b, I,b, lock), /* AL, Ib */ [0x15] =3D X86_OP_ENTRY2(ADC, 0,v, I,z, lock), /* rAX, Iz */ [0x16] =3D X86_OP_ENTRYr(PUSH, SS, w, chk(i64)), [0x17] =3D X86_OP_ENTRYw(POP, SS, w, chk(i64)), =20 - [0x20] =3D X86_OP_ENTRY2(AND, E,b, G,b, lock), - [0x21] =3D X86_OP_ENTRY2(AND, E,v, G,v, lock), - [0x22] =3D X86_OP_ENTRY2(AND, G,b, E,b, lock), - [0x23] =3D X86_OP_ENTRY2(AND, G,v, E,v, 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_ENTRY2(AND, 0,b, I,b, lock), /* AL, Ib */ [0x25] =3D X86_OP_ENTRY2(AND, 0,v, I,z, lock), /* rAX, Iz */ [0x26] =3D {}, [0x27] =3D X86_OP_ENTRY0(DAA, chk(i64)), =20 - [0x30] =3D X86_OP_ENTRY2(XOR, E,b, G,b, lock), - [0x31] =3D X86_OP_ENTRY2(XOR, E,v, G,v, lock), - [0x32] =3D X86_OP_ENTRY2(XOR, G,b, E,b, lock), - [0x33] =3D X86_OP_ENTRY2(XOR, G,v, E,v, lock), + [0x30] =3D X86_OP_ENTRY2(XOR, E,b, G,b, evex_apx p_00 lock), + [0x31] =3D X86_OP_ENTRY2(XOR, E,v, G,v, evex_apx p_00_66 lock), + [0x32] =3D X86_OP_ENTRY2(XOR, G,b, E,b, evex_apx p_00 lock), + [0x33] =3D X86_OP_ENTRY2(XOR, G,v, E,v, evex_apx p_00_66 lock), [0x34] =3D X86_OP_ENTRY2(XOR, 0,b, I,b, lock), /* AL, Ib */ [0x35] =3D X86_OP_ENTRY2(XOR, 0,v, I,z, lock), /* rAX, Iz */ [0x36] =3D {}, @@ -1768,12 +1777,12 @@ 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), - [0x84] =3D X86_OP_ENTRYrr(TEST, E,b, G,b), - [0x85] =3D X86_OP_ENTRYrr(TEST, E,v, G,v), + [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), + [0x82] =3D X86_OP_GROUP2(group1, E,b, I,b, chk(i64)), + [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_00), + [0x85] =3D X86_OP_ENTRYrr(TEST, E,v, G,v, evex_apx_cmp p_00_66), [0x86] =3D X86_OP_ENTRY2(XCHG, E,b, G,b, xchg), [0x87] =3D X86_OP_ENTRY2(XCHG, E,v, G,v, xchg), =20 @@ -1804,8 +1813,8 @@ 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), + [0xC0] =3D X86_OP_GROUP3(group2, B,b, E,b, I,b, evex_apx p_0= 0), + [0xC1] =3D X86_OP_GROUP3(group2, B,v, E,v, I,b, evex_apx p_0= 0_66), [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)), @@ -1813,10 +1822,10 @@ 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 */ + [0xD0] =3D X86_OP_GROUPwr(group2, B,b, E,b, evex_apx p_0= 0), + [0xD1] =3D X86_OP_GROUPwr(group2, B,v, E,v, evex_apx p_0= 0_66), + [0xD2] =3D X86_OP_GROUP3(group2, B,b, E,b, 1,b, evex_apx p_0= 0), /* CL */ + [0xD3] =3D X86_OP_GROUP3(group2, B,v, E,v, 1,b, evex_apx p_0= 0_66), /* 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)), @@ -1837,37 +1846,37 @@ static const X86OpEntry opcodes_root[256] =3D { [0xF6] =3D X86_OP_GROUP1(group3, E,b), [0xF7] =3D X86_OP_GROUP1(group3, E,v), =20 - [0x08] =3D X86_OP_ENTRY2(OR, E,b, G,b, lock), - [0x09] =3D X86_OP_ENTRY2(OR, E,v, G,v, lock), - [0x0A] =3D X86_OP_ENTRY2(OR, G,b, E,b, lock), - [0x0B] =3D X86_OP_ENTRY2(OR, G,v, E,v, 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), [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), - [0x1A] =3D X86_OP_ENTRY2(SBB, G,b, E,b, lock), - [0x1B] =3D X86_OP_ENTRY2(SBB, G,v, E,v, 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), [0x1C] =3D X86_OP_ENTRY2(SBB, 0,b, I,b, lock), /* AL, Ib */ [0x1D] =3D X86_OP_ENTRY2(SBB, 0,v, I,z, lock), /* rAX, Iz */ [0x1E] =3D X86_OP_ENTRYr(PUSH, DS, w, chk(i64)), [0x1F] =3D X86_OP_ENTRYw(POP, DS, w, chk(i64)), =20 - [0x28] =3D X86_OP_ENTRY2(SUB, E,b, G,b, lock), - [0x29] =3D X86_OP_ENTRY2(SUB, E,v, G,v, lock), - [0x2A] =3D X86_OP_ENTRY2(SUB, G,b, E,b, lock), - [0x2B] =3D X86_OP_ENTRY2(SUB, G,v, E,v, lock), + [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_ENTRY2(SUB, 0,b, I,b, lock), /* AL, Ib */ [0x2D] =3D X86_OP_ENTRY2(SUB, 0,v, I,z, lock), /* rAX, Iz */ [0x2E] =3D {}, [0x2F] =3D X86_OP_ENTRY0(DAS, chk(i64)), =20 - [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), + [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), [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 {}, @@ -1892,9 +1901,9 @@ static const X86OpEntry opcodes_root[256] =3D { [0x5F] =3D X86_OP_ENTRYw(POP, LoBits,d64), =20 [0x68] =3D X86_OP_ENTRYr(PUSH, I,z), - [0x69] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, I,z, sextT0), + [0x69] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, I,z, evex_apx_zu p_00_66 sex= tT0), [0x6A] =3D X86_OP_ENTRYr(PUSH, I,b), - [0x6B] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, I,b, sextT0), + [0x6B] =3D X86_OP_ENTRY3(IMUL3, G,v, E,v, I,b, evex_apx_zu p_00_66 sex= tT0), [0x6C] =3D X86_OP_ENTRYrr(INS, Y,b, 2,w), /* DX */ [0x6D] =3D X86_OP_ENTRYrr(INS, Y,z, 2,w), /* DX */ [0x6E] =3D X86_OP_ENTRYrr(OUTS, X,b, 2,w), /* DX */ @@ -2047,9 +2056,151 @@ static void decode_REX2_map1(DisasContext *s, CPUX8= 6State *env, X86OpEntry *entr decode_REX2(s, env, entry, b, opcode_rex2_map1); } =20 +static const X86OpEntry opcodes_EVEX_map4_20to2F[16] =3D { + [0x0] =3D X86_OP_ENTRY3(AND, B,b, E,b, G,b, evex_apx p_00 lock), + [0x1] =3D X86_OP_ENTRY3(AND, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0x2] =3D X86_OP_ENTRY3(AND, B,b, G,b, E,b, evex_apx p_00 lock), + [0x3] =3D X86_OP_ENTRY3(AND, B,v, G,v, E,v, evex_apx p_00_66 lock), + [0x4] =3D X86_OP_ENTRY4(SHLD, B,v, E,v, G,v, evex_apx p_00_66), + + [0x8] =3D X86_OP_ENTRY3(SUB, B,b, E,b, G,b, evex_apx p_00 lock), + [0x9] =3D X86_OP_ENTRY3(SUB, B,v, E,v, G,v, evex_apx p_00_66 lock), + [0xA] =3D X86_OP_ENTRY3(SUB, B,b, G,b, E,b, evex_apx p_00 lock), + [0xB] =3D X86_OP_ENTRY3(SUB, B,v, G,v, E,v, evex_apx p_00_66 lock), + [0xC] =3D X86_OP_ENTRY4(SHRD, B,v, E,v, G,v, evex_apx p_00_66), +}; + +static void decode_EVEX4cc(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + uint8_t modrm =3D get_modrm(s, env); + int mod =3D (modrm >> 6) & 3; + + static const X86OpEntry setcc =3D + X86_OP_ENTRYw(SETcc, E,b, evex_apx_zu chk(nf0) p_f2); + static const X86OpEntry cfcmov_nd0[2][2] =3D { + { /* NF=3D0 */ + X86_OP_ENTRY3(CFCMOVcc_ld, G,v, ZERO,v, M,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, G,v, ZERO,v, E,v, p_00_66 evex_apx= ), + }, + { /* NF=3D1 */ + X86_OP_ENTRYwr(CFCMOVcc_st, M,v, G,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, E,v, ZERO,v, G,v, p_00_66 evex_apx= ), + }, + }; + static const X86OpEntry cfcmov_nd1[2][2] =3D { + { /* NF=3D0 */ + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= ), + }, + { /* NF=3D1 */ + X86_OP_ENTRY3(CFCMOVcc_ld, B,v, G,v, M,v, p_00_66 evex_apx= ), + X86_OP_ENTRY3(CMOVcc, B,v, G,v, E,v, p_00_66 evex_apx= ), + }, + }; + + if (s->prefix & PREFIX_REPNZ) { + *entry =3D setcc; + if (EVEX_APX_ND(s)) { + entry->s1 =3D X86_SIZE_q; /* optimization for zu */ + } + } else { + *entry =3D (EVEX_APX_ND(s) ? cfcmov_nd1 : cfcmov_nd0)[EVEX_APX_NF(= s)][mod =3D=3D 3]; + } +} + +static const X86OpEntry opcodes_EVEX_map4_40to4F[16] =3D { + [0x0] =3D X86_OP_GROUP0(EVEX4cc), + [0x1] =3D X86_OP_GROUP0(EVEX4cc), + [0x2] =3D X86_OP_GROUP0(EVEX4cc), + [0x3] =3D X86_OP_GROUP0(EVEX4cc), + [0x4] =3D X86_OP_GROUP0(EVEX4cc), + [0x5] =3D X86_OP_GROUP0(EVEX4cc), + [0x6] =3D X86_OP_GROUP0(EVEX4cc), + [0x7] =3D X86_OP_GROUP0(EVEX4cc), + [0x8] =3D X86_OP_GROUP0(EVEX4cc), + [0x9] =3D X86_OP_GROUP0(EVEX4cc), + [0xA] =3D X86_OP_GROUP0(EVEX4cc), + [0xB] =3D X86_OP_GROUP0(EVEX4cc), + [0xC] =3D X86_OP_GROUP0(EVEX4cc), + [0xD] =3D X86_OP_GROUP0(EVEX4cc), + [0xE] =3D X86_OP_GROUP0(EVEX4cc), + [0xF] =3D X86_OP_GROUP0(EVEX4cc), +}; + +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 const X86OpEntry opcodes_EVEX_map4_60to6F[16] =3D { + [0x0] =3D X86_OP_ENTRYwr(MOVBE, G,y, E,y, cpuid(MOVBE) chk(nf0)= p_00_66), + [0x1] =3D X86_OP_ENTRYwr(MOVBE, E,y, G,y, cpuid(MOVBE) chk(nf0)= p_00_66), + [0x6] =3D X86_OP_GROUP3(EVEX4_66, B,y, G,y, E,y, cpuid(ADX) chk(nf0) p= _66_f3), +}; + +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 const X86OpEntry opcodes_EVEX_map4_80to8F[16] =3D { + [0x0] =3D X86_OP_GROUP3(group1, B,b, E,b, I,b, evex_apx p_00), + [0x1] =3D X86_OP_GROUP3(group1, B,v, E,v, I,z, evex_apx p_00_66), + [0x3] =3D X86_OP_GROUP3(group1, B,v, E,v, I,b, evex_apx p_00_66), + [0x4] =3D X86_OP_ENTRYrr(TEST, E,b, G,b, evex_apx_cmp p_00= _66), + [0x5] =3D X86_OP_ENTRYrr(TEST, E,v, G,v, evex_apx_cmp p_00= _66), + + [0x8] =3D X86_OP_ENTRYwr(POPCNT, G,v, E,v, evex_apx cpuid(PO= PCNT) zextT0 p_00_66), + [0xF] =3D X86_OP_GROUPw(EVEX4_8F, R,d64, /* B,d64 */ evex_apx_pp2 p_00= ), +}; + +static void decode_EVEX4_FF(DisasContext *s, CPUX86State *env, X86OpEntry = *entry, uint8_t *b) +{ + int op =3D (get_modrm(s, env) >> 3) & 7; + if (op =3D=3D 6) { + entry->gen =3D gen_PUSH2; + } else { + *entry =3D opcodes_root[0xFF]; + } +} + +static const X86OpEntry opcodes_EVEX_map4_F0toFF[16] =3D { + [0x0] =3D X86_OP_ENTRY2(CRC32, G,d, E,b, cpuid(SSE42)), + [0x1] =3D X86_OP_ENTRY2(CRC32, G,d, E,b, cpuid(SSE42)), + [0x4] =3D X86_OP_ENTRYwr(TZCNT, G,v, E,v, evex_apx zextT0 p_00_= 66), + [0x5] =3D X86_OP_ENTRYwr(LZCNT, G,v, E,v, evex_apx zextT0 p_00_= 66), + [0x6] =3D X86_OP_GROUP1(group3, E,b), + [0x7] =3D X86_OP_GROUP1(group3, E,v), + [0xE] =3D X86_OP_GROUP1(group4_5, E,b), + [0xF] =3D X86_OP_GROUPrr(EVEX4_FF, B,d64, R,d64, evex_apx_pp2 p_00), +}; + static void decode_EVEX_map4(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) { - *entry =3D UNKNOWN_OPCODE; + static const X86OpEntry *opcode_evex_map4[16] =3D { + &opcodes_root[0x00], + &opcodes_root[0x10], + opcodes_EVEX_map4_20to2F, /* includes SHLD@24, SHRD@2C */ + &opcodes_root[0x30], + opcodes_EVEX_map4_40to4F, /* includes CMOVcc/CFCMOVcc/SETcc */ + NULL, + opcodes_EVEX_map4_60to6F, /* includes MOVBE, ADCX/ADOX */ + NULL, + opcodes_EVEX_map4_80to8F, /* includes POPCNT */ + NULL, + &opcodes_0F[0xA0], /* for SHLD/SHRD ...,CL */ + NULL, + &opcodes_root[0xC0], + &opcodes_root[0xD0], + NULL, + opcodes_EVEX_map4_F0toFF, /* includes CRC32@f0/f1, TZCNT@f4, LZCN= T@f5 */ + }; + decode_REX2(s, env, entry, b, opcode_evex_map4); } #endif =20 @@ -2066,6 +2217,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) { @@ -2519,6 +2674,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 685972060c0..a1c3680db3c 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1644,6 +1644,30 @@ static void gen_CMC(DisasContext *s, X86DecodedInsn = *decode) tcg_gen_xori_tl(cpu_cc_src, cpu_cc_src, CC_C); } =20 +#ifdef TARGET_X86_64 +static void gen_CFCMOVcc_ld(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *label_false =3D gen_new_label(); + int cond =3D decode->b & 0xf; + MemOp ot =3D decode->op[2].ot; + + gen_jcc_noeob(s, cond ^ 1, label_false); + gen_op_ld_v(s, ot, s->T0, s->A0); + gen_set_label(label_false); +} + +static void gen_CFCMOVcc_st(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *label_false =3D gen_new_label(); + int cond =3D decode->b & 0xf; + MemOp ot =3D decode->op[0].ot; + + gen_jcc_noeob(s, cond ^ 1, label_false); + gen_op_st_v(s, ot, s->T0, s->A0); + gen_set_label(label_false); +} +#endif + static void gen_CMOVcc(DisasContext *s, X86DecodedInsn *decode) { gen_cmovcc(s, decode->b & 0xf, s->T0, s->T1); @@ -3141,6 +3165,24 @@ static void gen_PMOVMSKB(DisasContext *s, X86Decoded= Insn *decode) } } =20 +#ifdef TARGET_X86_64 +static void gen_POP2(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *aligned =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_TSTEQ, cpu_regs[R_ESP], 15, aligned); + gen_helper_raise_gpf(tcg_env); + gen_set_label(aligned); + + gen_lea_ss_ofs(s, s->A0, cpu_regs[R_ESP], 0); + gen_op_ld_v(s, MO_64, cpu_regs[s->vex_v], s->A0); + + tcg_gen_addi_tl(s->A0, s->A0, 8); + gen_op_ld_v(s, MO_64, s->T0, s->A0); + gen_pop_update(s, MO_128); +} +#endif + static void gen_POP(DisasContext *s, X86DecodedInsn *decode) { X86DecodedOp *op =3D &decode->op[0]; @@ -3338,6 +3380,19 @@ static void gen_PSLLDQ_i(DisasContext *s, X86Decoded= Insn *decode) } } =20 +#ifdef TARGET_X86_64 +static void gen_PUSH2(DisasContext *s, X86DecodedInsn *decode) +{ + TCGLabel *aligned =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_TSTEQ, cpu_regs[R_ESP], 15, aligned); + gen_helper_raise_gpf(tcg_env); + gen_set_label(aligned); + gen_push_v(s, s->T0); + gen_push_v(s, s->T1); +} +#endif + static void gen_PUSH(DisasContext *s, X86DecodedInsn *decode) { gen_push_v(s, s->T0); --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376226; cv=none; d=zohomail.com; s=zohoarc; b=kU0L38AB3FoggBT0vR70qpiw1imYLebQaai9gD3an6ObexcHjDW94sahDizGEkCsvr59qg50wk0WL6h8RWmMVRhRbT0Yz0v/GkbPMp/GN+GcqVIV8Fp3uahHkSY7KzFPSEnbO90cjn5TuvMZn//N23PhumwewtDWhrmPALMq3pk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376226; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=cz9b2qHIJZxeyAf7wx+q3kZGz28BSD7HKNGdvO+EqWo=; b=EVgD4APwLmGY1aRf01nL4slGHqJY77aTn5fpKKoVSQXU6Q2ooFqIMWYvdD2ovu7/fV94ZLaz1f/KuLFJtOPglRmGJnsmk2JxQow8ZFFFYXXxeo6DkXh51vmgn5vd1W8OBMa344HjXho3Qsda37AHarbHYFuobYPsOkZTeFxa5+c= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17723762261342.704863910206768; Sun, 1 Mar 2026 06:43:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi0o-0000V7-7e; Sun, 01 Mar 2026 09:43:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0d-0000OT-1Y for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:03 -0500 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 1vwi0b-0005lH-Hs for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:02 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-538-kw-GXLJiOrumTnC-7tIAbg-1; Sun, 01 Mar 2026 09:42:58 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837a718f41so18212105e9.2 for ; Sun, 01 Mar 2026 06:42:58 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ae0e7abasm7920812f8f.23.2026.03.01.06.42.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376179; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cz9b2qHIJZxeyAf7wx+q3kZGz28BSD7HKNGdvO+EqWo=; b=OMXPDb1vUUj5kAxg/zmM4C0aMw4hoVjC0+udiGssTLnC4vsFbAhgAmFDoHjzwd22wQ/GqZ bscAPdWO8MalCKodBHuxBAuGTFNULYeCELMlqnFbW0cht5trRh6XE4Na+KUU/NmeC/cXGS tgVUFwXIVAyBzfCbSMdoFIhjvgQeqIA= X-MC-Unique: kw-GXLJiOrumTnC-7tIAbg-1 X-Mimecast-MFC-AGG-ID: kw-GXLJiOrumTnC-7tIAbg_1772376177 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376177; x=1772980977; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=cz9b2qHIJZxeyAf7wx+q3kZGz28BSD7HKNGdvO+EqWo=; b=kZQEcJeMrZEIFfHO/QqoIDkQ0yoy0rr4HUbkhZbDIBTltfqKW/SgmW898JeEQTqLxN DY1JisusPOrjeApkJVTkuvK23QscLhh43mk+P/wOHGd2u+3Av4EJgtS4gmUkZKOgErO0 JGd7DF4+e98LqXG/vPSp9Nydu4YRuh4VqDdaRMKL5CmnD3Myx7yGDKZKzSvPmgHc05LH 8UC0TTYc/s2W1lEIuJQUwv/5ge92lPe4s4tTIQzBE5TmjkYkbt3DYlN6q5hhSQ5Bc3M0 hv240i5+4T03P8YEFE3wyzn9ipFt1cA/OjZWgfuMhPxrHzz89SNKqpRuGBBwDrUcxPsl oBBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376177; x=1772980977; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=cz9b2qHIJZxeyAf7wx+q3kZGz28BSD7HKNGdvO+EqWo=; b=NCR6TY+mvL+mKSWJPHtLCEqYgcBYghq7ZyqDz3eXq7YJ7dBgN2F23TRzPLMBNZE9Lu UWA39S7Q/rh7DK6LIvOzIummBbjmNMdDLiKDrdxdR9AFdskOSlvqE/bVl4cBR+T/3WIi OfAGklZ5Qtzac00BAoJAl4LLOCIsMm5vg5R7RQ089F1JEN4YF24D1KDqUA139vKoSXcm HFL1RYf+OulosXMnB6k35xe581xvkKhpny9FqHynlSgaZS1RdBmeA6TACLf2bVjjzYtC 4XQwQc3wisn/oteb+zZl9AKwUlaPBpT1T/6zZQZa4Ldvd1f8k4JJ3VA65139KAgV1Hsa rKxQ== X-Gm-Message-State: AOJu0Yyzg3RkWQ3q/DKZDjexxA4/8vrCkipMHh4pFA9Q0wQyCHomXLJG sqReyCrZObpASZZZFaNDQpwplWV8ddGZDbI4ucBCuoV7Xnrgjg26DfCSYLaRNgPD5W2LxC0ApIP 4mpuI05Kc9M5RVEcrpthxPN4gnN+gZ+36Q7pvD6ufxWAfOvK9tg22NB354onAAZxN04g9Id03sT Z+ic9Og1I/myblbhAskn3ZpWpEe49/gIPVEb1hJXvX X-Gm-Gg: ATEYQzwFFp+/vZ4+2h+k8xdO+jFNLdlajMZGEctxTKEuvwalepZk9M90jhPb7hXvVsg geWBoMooUMy1fNs2QIWe70MvDRDH/grQwE6XyMly8RlIm7E6ZQMsFAfjR5SowA8HdNGj5uSWMxa wJ/MG7PeyLFkxZY2oLOfk5MvhrzZ7KGG1VcFb89QKZh+hMsiDzDajgj0Q23YsYceGw8SF09kCc5 l19Tx9xit3FlWNpl8/zD6bIBzbUZkWRfbjlo4D6L8gVvnsRCxi3zoWShb5zXuKbJyf046bDAmNF yDpGHVwI2/k+cSvytsv4ty7l7qVA28oheHF/3Mz01RLMJi9CcWkblYJuqkODmv0WYKGmQGqTLo/ EwI6IjOy/VmbuQtHDMN70MeEohK3lPawB51gCno7aEMemYZ8vBo9qE4ZdmlneatcxHhGuOqJI8Z Hk3YsAhG8s9bqAeGCo4YDAO//yPeQ= X-Received: by 2002:a05:600c:350d:b0:47e:e779:36d with SMTP id 5b1f17b1804b1-483c9bc5721mr169878545e9.23.1772376176774; Sun, 01 Mar 2026 06:42:56 -0800 (PST) X-Received: by 2002:a05:600c:350d:b0:47e:e779:36d with SMTP id 5b1f17b1804b1-483c9bc5721mr169878035e9.23.1772376176177; Sun, 01 Mar 2026 06:42:56 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 17/18] target/i386/tcg: mark APX as supported Date: Sun, 1 Mar 2026 15:42:17 +0100 Message-ID: <20260301144218.458140-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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: 1772376228663158500 Content-Type: text/plain; charset="utf-8" Finally allow TCG to set the CPUID bit for the APXF feature. The effect of APX is about 0.5% larger binaries and about 1% less TCG ops. QEMU seems to produce about 1% *more* assembly instructions, because the optimizer could already produce roughly the same ops as NDD or NF instructions, and the new PUSH2/POP2 instructions include a stack alignment check that isn't there in non-APX code. Signed-off-by: Paolo Bonzini --- configs/targets/x86_64-bsd-user.mak | 2 +- configs/targets/x86_64-linux-user.mak | 2 +- target/i386/cpu.c | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/configs/targets/x86_64-bsd-user.mak b/configs/targets/x86_64-b= sd-user.mak index d62d656f2c6..913d24139ab 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 gdb-xml/i386-64bit.xml +TARGET_XML_FILES=3D gdb-xml/i386-64bit.xml gdb-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 b093ab5a167..7a29bde6666 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 gdb-xml/i386-64bit.xml gdb-xml/i386-64bit-linux.xml +TARGET_XML_FILES=3D gdb-xml/i386-64bit.xml gdb-xml/i386-64bit-linux.xml gd= b-xml/i386-64bit-apx.xml TARGET_LONG_BITS=3D64 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 45f0b80deb0..f34515f5b2f 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -1001,7 +1001,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 @@ -1550,7 +1550,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 | @@ -9424,6 +9424,17 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **er= rp) * inside x86_cpu_parse_featurestr() too. */ if (xcc->max_features) { + /* + * TCG supports both MPX and APX. Since they they cannot be enabl= ed together, + * disable one---prefer APX if none was chosen explicitly. + */ + if ((x86_cpu_get_supported_feature_word(cpu, FEAT_7_1_EDX) & CPUID= _7_1_EDX_APXF) && + env->user_features[FEAT_7_0_EBX] & CPUID_7_0_EBX_MPX) { + feature_word_info[FEAT_7_1_EDX].no_autoenable_flags |=3D CPUID= _7_1_EDX_APXF; + } else { + feature_word_info[FEAT_7_0_EBX].no_autoenable_flags |=3D CPUID= _7_0_EBX_MPX; + } + for (w =3D 0; w < FEATURE_WORDS; w++) { /* Override only features that weren't set explicitly * by the user. --=20 2.52.0 From nobody Mon Mar 2 08:46:30 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=1772376236; cv=none; d=zohomail.com; s=zohoarc; b=YpACvRXgdvOCTFmckWg9tG/7gZ9aJZWinc4OOYe2uD+CvpES40f/5Z2fPyMbU9i6M+1YOQ0iG3kE91ZjpdegsCnxTy+n3tQG1oNB60M02jeP5ninPcjCoGr4wgntcwfoFrXQPjA/En8cC+lAo7xwGFXL7p9kZ+6uk8BC9UWOa1s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772376236; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=azZnkVp/NSVUI74ENWvUxmzX3QZO7A1ubP1tdWLgtW8=; b=AJ1qzf2wAkkYUBScoawIG5DGvQcL2JO8Ixb9SaMp95n+FcMoQZHZmBjPxmpb2/X9B66nHePoUFxGPgMR96jR65aJbkO56SqD4wc+kiQBcuxVAfo3o6CaFuXHXmnTtPnf8l9ltO2wmPMgnoGUjhH8jTrWtO/CMlmQJ0bYv55p45w= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772376236403186.72487948615264; Sun, 1 Mar 2026 06:43:56 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwi11-0000ZB-7H; Sun, 01 Mar 2026 09:43:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwi0f-0000P3-LN for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:06 -0500 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 1vwi0d-0005lW-DB for qemu-devel@nongnu.org; Sun, 01 Mar 2026 09:43:05 -0500 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-523-mZj38lEgNOSTlBb2MUpMvg-1; Sun, 01 Mar 2026 09:43:00 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4839fc4cef6so43586965e9.0 for ; Sun, 01 Mar 2026 06:43:00 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b34b6252sm4871536f8f.10.2026.03.01.06.42.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2026 06:42:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772376181; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=azZnkVp/NSVUI74ENWvUxmzX3QZO7A1ubP1tdWLgtW8=; b=Bhtc7AYCsFVVjthkaSWh7ZmBSHVQUnudAw/D0Di7a4HxByWmvE/S2jbSRl1aENB+qAgoO4 YzOfBAt6DWpHSb1NrXywlYbzGVWcaIHpRPHQaSLuMyqrhGTMewJWPIz4Tb6K1gqrevw8Q6 5t3PmrEgDI9cB5G2f3Chosj9xm8RP3k= X-MC-Unique: mZj38lEgNOSTlBb2MUpMvg-1 X-Mimecast-MFC-AGG-ID: mZj38lEgNOSTlBb2MUpMvg_1772376179 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772376179; x=1772980979; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=azZnkVp/NSVUI74ENWvUxmzX3QZO7A1ubP1tdWLgtW8=; b=Mgu3Efwc+Zd8xSrFzp55BhsF92/81IEIX1m0abDqqRxRzwktRRwoHU3fMwHD9YzCVy /jy/bnK5msUdyEUuC9AFf237o8Z8gvuYv57jAwXc1RculjFoH7YmQ9hNSNZ28b3MTSZu OpqBSjnkqm+aPrUQcWjihxaaeVH1DgLzOTLFqfCt9bJrkjLatrw/R3sX0XbuRtYcnqNg h+HMuvVg2tnBW8k/7pGDTcEHb3TkvgkvuDX58L1NVyvy/6/w3pCFDilGdSvyDxQX7e0/ DMZ6d9PH+nZaMy0h4Ecej8HI3GaAWyAU5re/XbOsk1OOnsDJ/fGPXOhR63IGA3NM/1hT Zzlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772376179; x=1772980979; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=azZnkVp/NSVUI74ENWvUxmzX3QZO7A1ubP1tdWLgtW8=; b=Jqz/qOZlGjW7lUZaQZ23NLwQ+N6/QnAMemY1/95BWnYaqAH5Xdgx7zqAEUIcC++psf zImKfaNyITkajbSTv3b4L14OYqSVFMq1suiuPsF6XxRN5/8o6OAPFe2szBSrOGe09HxQ CwpSBJW7PVT8tV5IIWjilrfR4h8zK7pFC0Hti/CvaeH1qm+lAVeG7Fs4bm4SUUPGQobk 1/m9b/kZJTKBq63H2FfvUSnJUdApAWrf0ET4J665VYNZAb0WB1WdrETpreDMF2EIBksF 4rfWJet5297Z8ApnMAB4whWVOq5GnqxHkMU6vqbEhNotOVgz67B8RITBt0wdshWlnblI MzHQ== X-Gm-Message-State: AOJu0Yzw50fgLV+zXhia9npa+sqp6xCTJFSCltUYmk9WVF5V4PD3nxf6 v3Se2vzI6s1PD+ZcStQdt3unsl3w31f2HM/4yMzlwR4gESA6I9j4LmXgGJnUOzBi7d0JHiZGW9L ME5kozIpRGK9/jrZCzpFHaTF9w1OAOeKJD55JWTCO9TgP8Pwd+wQj1kUDsvQtGVXaNvY6CHV5ES iuS6D4Q+W9LqV2wbyDc6btqEdZcExVtbOj+GvDx5jZ X-Gm-Gg: ATEYQzwuaRxqrndY63jlCQFJU4c9zRrxjjvg4RrGPgi3Cr1o8DCD8zb3yO72hsmxu0q mxbNNE6gbLuwP3dZcAh26KHSCcC9YpZQ5TIdxYcFsKAvCDy4uT58TqEluQLCW8Dodk1Le1eHs+a YnsV5/P4tmXK2+OysPqobMPwmSBrBeghaF0KQ0nji/qfqwY/iqoI7awcd8AowTNOa4wPKnhV8yK qdfNw6W++83hz2YyrGWEL6O64+mKEF3WJ4yfw/7WbmAIMMq2dVEcvzc3a0ZXuGamYSiSl6/yWbM vU/HMIa8pCYZIl1v6lB9shJHnDyUpV5AWyF+hjMPJc9mBBKuxwOjHxtAOR4AkBAGCEhV5MvqVmt YGSf1LsIQkk3eO/vKLR9Qns0pYRecrzsYH1JeuSOi65afsXeqO0DhVs1yuyrKgnhUhEYMTqTfLB N5CAVgBLBxsGs6iPvqE/eS0B+Xvo4= X-Received: by 2002:a05:600c:982:b0:477:a53c:8ca1 with SMTP id 5b1f17b1804b1-483c33eaf99mr157314965e9.14.1772376178969; Sun, 01 Mar 2026 06:42:58 -0800 (PST) X-Received: by 2002:a05:600c:982:b0:477:a53c:8ca1 with SMTP id 5b1f17b1804b1-483c33eaf99mr157314585e9.14.1772376178379; Sun, 01 Mar 2026 06:42:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 18/18] target/i386/tcg: optimize CCMP Date: Sun, 1 Mar 2026 15:42:18 +0100 Message-ID: <20260301144218.458140-19-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260301144218.458140-1-pbonzini@redhat.com> References: <20260301144218.458140-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=lists.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: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 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_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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: 1772376236624158500 Content-Type: text/plain; charset="utf-8" Use CC_OP_SUB* and CC_OP_LOGIC* if specific dfv values make it possible; this avoids having to compute the carry. This happens relatively often for dfv=3D0, and also for dfv=3Dsf for code produced by clang. Of the combinations that cannot be optimized, both GCC and clang generate Z. GCC also generates OS and OSZ. Do not bother doing this for CTEST; the savings are modest because it does not need complex code to compute the carry-out vector (CC_SRC is always 0). In addition, trivially replacing the arguments to the AND would only support dfv=3D0 (produced by -2 & 2) or dfv=3DS (produced by -2 & -2), because TEST cannot produce any value where CF or OF are not zero. Signed-off-by: Paolo Bonzini --- target/i386/tcg/emit.c.inc | 63 +++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index a1c3680db3c..da0e00e6652 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1748,6 +1748,56 @@ static void gen_dfv_movcond(DisasContext *s, X86Deco= dedInsn *decode, int cond, u decode->cc_dst, tcg_constant_tl(dst)); } =20 +static bool gen_ccmp_movcond(DisasContext *s, int cond, uint32_t dfv, MemO= p ot) +{ + target_ulong op0, op1, max_int; + if (cond =3D=3D (CCMP_T << 1)) { + return true; + } + + /* + * For some values of dfv, it's possible to overwrite operands + * instead of using CC_OP_CCMP. + */ + max_int =3D (target_ulong)1 << ((8 << ot) - 1); + switch(dfv) { + case 0: + op0 =3D 1, op1 =3D 0; + break; + case CC_P|CC_C: + op0 =3D 1, op1 =3D -16; + break; + case CC_S: + op0 =3D -3, op1 =3D 0; + break; + case CC_S|CC_P|CC_C: + op0 =3D 0, op1 =3D 16; + break; + case CC_O: + /* + * For 8-bit results the sign bit is in bit 7 and, having no copie= s to the + * right, it flips the parity flag. + */ + op0 =3D -max_int, op1 =3D 16 + (ot =3D=3D MO_8); + break; + case CC_O|CC_S|CC_P|CC_C: + /* Same here. */ + op0 =3D max_int, op1 =3D -1 - (ot =3D=3D MO_8); + break; + default: + return false; + } + + CCPrepare cc =3D gen_prepare_cc(s, cond, NULL); + if (!cc.use_reg2) { + cc.reg2 =3D tcg_constant_tl(cc.imm); + } + + tcg_gen_movcond_tl(cc.cond, s->T0, cc.reg, cc.reg2, s->T0, tcg_constan= t_tl(op0)); + tcg_gen_movcond_tl(cc.cond, s->T1, cc.reg, cc.reg2, s->T1, tcg_constan= t_tl(op1)); + return true; +} + static void gen_SUB(DisasContext *s, X86DecodedInsn *decode); static void gen_CMP(DisasContext *s, X86DecodedInsn *decode) { @@ -1756,16 +1806,15 @@ static void gen_CMP(DisasContext *s, X86DecodedInsn= *decode) MemOp ot =3D decode->op[1].ot; TCGv cout; =20 - switch (cond) { - case CCMP_T << 1: - gen_SUB(s, decode); - return; - case (CCMP_T << 1) | 1: + if (cond =3D=3D ((CCMP_T << 1) | 1)) { decode->cc_op =3D CC_OP_EFLAGS; decode->cc_src =3D tcg_constant_tl(dfv); return; - default: - break; + } + + if (gen_ccmp_movcond(s, cond, dfv, ot)) { + gen_SUB(s, decode); + return; } =20 decode->cc_op =3D CC_OP_CCMPB + ot; --=20 2.52.0