From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666100997; cv=none; d=zohomail.com; s=zohoarc; b=U7thLeonn2JXORDg9gLqI3n4oJ+K1ydG1VnERoJ68cMvRW4+y5gfphIdwJODM6a/5y++aW7m8NZY5M0dYHmZRSw32HtAoTWPG378T7fWfHJRIwboOmLqPzVX+MGkHX/cRk+iWrsnwgMM2AtPkzQAkkc4DLaGQ6Hv1IuVtWARZ50= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666100997; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=M4z+JhV9qDTZgqn3J9Gd4ALHXvhuoKERwwE9F7a3A3I=; b=nijj471iIKF/00Ol66rRmt6e5yDRL7FcRwCM2qHfR9HP/5zLPhLEWaB6C/ZU9qaN+ABhp+t8zJOmAyfO6hSXJrEJxJPcjxrqX6dnUbJS5caQUscEVo47LcW6OH7W1XGWNLt3pie+fwk7GOwEJYq1KTW6x27Z3NhZKtpsiIEJ66c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666100997526430.1498931902835; Tue, 18 Oct 2022 06:49:57 -0700 (PDT) Received: from localhost ([::1]:52478 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmyh-0006Vh-Gb for importer@patchew.org; Tue, 18 Oct 2022 09:49:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46342) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgU-000225-6q for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:39949) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgJ-0004y8-Ou for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:03 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-283-P44KYV_NO1CGq8JKB3QYlQ-1; Tue, 18 Oct 2022 09:30:52 -0400 Received: by mail-ej1-f70.google.com with SMTP id hc43-20020a17090716ab00b0078e28567ffbso4746779ejc.15 for ; Tue, 18 Oct 2022 06:30:51 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id t29-20020a056402241d00b0045ce419ecffsm8965588eda.58.2022.10.18.06.30.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:30:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099853; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=M4z+JhV9qDTZgqn3J9Gd4ALHXvhuoKERwwE9F7a3A3I=; b=CKqG6WDqxfnBBcwEZBffYEmxQJe+rwNNOlTpoR6EY+wgCxMO69KJJ/772vbZ/ARulnHjs0 1d5xq01P05Ked0gLNnkS2aAJDDyoi8ZYTpcwWZhkSIb6r1BKj3ogddX5EcBT7XG/ebmfBz h2E/bIL8bs0Wm1QdhVShTroeIJeIT3Y= X-MC-Unique: P44KYV_NO1CGq8JKB3QYlQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=M4z+JhV9qDTZgqn3J9Gd4ALHXvhuoKERwwE9F7a3A3I=; b=bG8z/YlNg+DQcGeBIvbL4JcKfsSi6jDZod6yWGxm5H7Dv2fsN16eb3Xbm63vF/FDvi PyB5URDftrLqiuYKUQWp+LQaO/NrHsrBLYKvtgdOJHvyobMv/dmYHTI6kPjrqVAfGdGW P4ZIwPW96gE9GgxsEioc/h0khNenMJoZpLI4EwqPMuL3zgYh7qYQM3QyhzWNw1aO4gnR Upl/chKqi3bc4X1RvagcK+qKgeBdLloSjp8lqYKO5FhJM+lb3ZklUEv05IxWjwny3cIu XPzy0yNDk8zunAKY59fY28A1PhTJqlfbRv7sYMd54bebw+TrtretJRLMYSwJRgyNaMg4 5Xww== X-Gm-Message-State: ACrzQf0THQHsqhGGtk8wuHejNQVzQCJ6xlNldYsWWq2iNKieKqzYdPSE mfrGS4o/lalonrm0YJgkb87ojSHRz2h6n9l/zA8muCafoL59vMJO4Ww+Yz17HwED0T6C8hT5a7Z gAsFoiuwklZnyNU3ZlGPDAlyPTeO5QXbrOuNJVW700b9K2+1jrQG/sYPrhDKtYAnrUJo= X-Received: by 2002:a05:6402:2791:b0:45d:3a94:3494 with SMTP id b17-20020a056402279100b0045d3a943494mr2595630ede.91.1666099850386; Tue, 18 Oct 2022 06:30:50 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7g8c4dYlKxH2YpIyQuZmnTv/+igxRG8sz6HUZKttg5hQhHUH6uJ03p8ddI2RXnevWK3zAUmA== X-Received: by 2002:a05:6402:2791:b0:45d:3a94:3494 with SMTP id b17-20020a056402279100b0045d3a943494mr2595605ede.91.1666099850102; Tue, 18 Oct 2022 06:30:50 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Venu Busireddy Subject: [PULL 01/53] virtio-scsi: Send "REPORTED LUNS CHANGED" sense data upon disk hotplug events Date: Tue, 18 Oct 2022 15:29:50 +0200 Message-Id: <20221018133042.856368-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666100998494100002 Content-Type: text/plain; charset="utf-8" From: Venu Busireddy Section 5.6.6.3 of VirtIO specification states, "Events will also be reported via sense codes..." However, no sense data is sent when VIRTIO_SCSI_EVT_RESET_RESCAN or VIRTIO_SCSI_EVT_RESET_REMOVED events are reported (when disk hotplug/hotunplug events occur). SCSI layer on Solaris depends on this sense data, and hence does not handle disk hotplug/hotunplug events. When the disk inventory changes, use the bus unit attention mechanism to return a CHECK_CONDITION status with sense data of 0x06/0x3F/0x0E (sense code REPORTED_LUNS_CHANGED). The first device on the bus to execute a command successfully will report and consume the unit attention status. Signed-off-by: Venu Busireddy Message-Id: <20221006194946.24134-1-venu.busireddy@oracle.com> Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-bus.c | 18 ++++++++++++++++++ hw/scsi/virtio-scsi.c | 2 ++ include/hw/scsi/scsi.h | 1 + 3 files changed, 21 insertions(+) diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index 4403717c4a..ceceafb2cd 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -1616,6 +1616,24 @@ static int scsi_ua_precedence(SCSISense sense) return (sense.asc << 8) | sense.ascq; } =20 +void scsi_bus_set_ua(SCSIBus *bus, SCSISense sense) +{ + int prec1, prec2; + if (sense.key !=3D UNIT_ATTENTION) { + return; + } + + /* + * Override a pre-existing unit attention condition, except for a more + * important reset condition. + */ + prec1 =3D scsi_ua_precedence(bus->unit_attention); + prec2 =3D scsi_ua_precedence(sense); + if (prec2 < prec1) { + bus->unit_attention =3D sense; + } +} + void scsi_device_set_ua(SCSIDevice *sdev, SCSISense sense) { int prec1, prec2; diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 41f2a56301..cf2721aa46 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -956,6 +956,7 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug= _dev, DeviceState *dev, virtio_scsi_push_event(s, sd, VIRTIO_SCSI_T_TRANSPORT_RESET, VIRTIO_SCSI_EVT_RESET_RESCAN); + scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED)); virtio_scsi_release(s); } } @@ -973,6 +974,7 @@ static void virtio_scsi_hotunplug(HotplugHandler *hotpl= ug_dev, DeviceState *dev, virtio_scsi_push_event(s, sd, VIRTIO_SCSI_T_TRANSPORT_RESET, VIRTIO_SCSI_EVT_RESET_REMOVED); + scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED)); virtio_scsi_release(s); } =20 diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h index 001103488c..3b1b3d278e 100644 --- a/include/hw/scsi/scsi.h +++ b/include/hw/scsi/scsi.h @@ -186,6 +186,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, Blo= ckBackend *blk, BlockdevOnError rerror, BlockdevOnError werror, const char *serial, Error **errp); +void scsi_bus_set_ua(SCSIBus *bus, SCSISense sense); void scsi_bus_legacy_handle_cmdline(SCSIBus *bus); void scsi_legacy_handle_cmdline(void); =20 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666100986; cv=none; d=zohomail.com; s=zohoarc; b=cTIxn9b+Y/gM9n145Erdxp5KkivGA5RAvnLCSsymSzPZRF0t6xOmWSspmM2vNfvRoX65HPH52JR5JiZr89ASsth8KSni42SiZjC7u6plfI66fX5aChgI9efDQinILwOXwtejcAm0w7IF2OTr6VhOQYx/KCBd5fhZkT1vvABKp+E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666100986; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=taTFdLgbLBGKV8hKxTDS8uOnxr3eSe8+8nzESpA2qR0=; b=WNKKFpBvtfr9yyWE1VcUiHPe9LKmj2inEI3ty9akbR6+JAZjQZJBRkoD+uotpmp1jLlIzkW6dp1/oaor2ToThnvnSR1wjkf/lGR2zKuI/OAWqjBnHUgd58jncrs2VY5MSmRf2PWFEYIm4zNxCdRJYG2UcuH9ANeZWvpPHQOhysk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666100986380533.9946211456358; Tue, 18 Oct 2022 06:49:46 -0700 (PDT) Received: from localhost ([::1]:52416 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmyW-0006E8-34 for importer@patchew.org; Tue, 18 Oct 2022 09:49:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46348) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgU-000228-8S for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:40195) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgP-0004yI-Q5 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:05 -0400 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-284-oraMy8Q3MCu1S91fIxhpgg-1; Tue, 18 Oct 2022 09:30:57 -0400 Received: by mail-ej1-f72.google.com with SMTP id qk31-20020a1709077f9f00b00791a3e02c80so267729ejc.21 for ; Tue, 18 Oct 2022 06:30:54 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id kl24-20020a170907995800b00787f91a6b16sm7468762ejc.26.2022.10.18.06.30.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:30:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099859; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=taTFdLgbLBGKV8hKxTDS8uOnxr3eSe8+8nzESpA2qR0=; b=XVx3EhhuFk8TVD/izh/yMaAXUi67PAwETrsUFrSgKva7HoxWVQIsgfv7PtzgyckXs5ROBa a44G2xPr6hOqDcwowIZBZBIxoP16uLaFnZldbQcNrDtXqV+MdYUKZp1dfVl7E6cKWSEDvG ehIpv0JccJ52B2Z0zrKo9k3n9H/3PGw= X-MC-Unique: oraMy8Q3MCu1S91fIxhpgg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=taTFdLgbLBGKV8hKxTDS8uOnxr3eSe8+8nzESpA2qR0=; b=HN6PtbcYq/ZP80bPnUszcvz4esk4DFu1acajjYSIGd/7jNJwib17CXhMYUFJujM7/h CBdW4w5/IdTGixjyAWQiec5Tj45cCZVzsbgTvb9wQ3ULtQmri9kP5AGq/CGtOo2w7nRA DTSaboEjMfkFab6Zcs4lzCF1NqZveAA6qnUGrOabkFeEWiGnrvNWNNjOrpMwK//N4pda BFtlxohxgv1CH6zWJ7xzAwtfvOBpdq4zDmHc0RaGucqETZva0KkQW12VFK/oFC8T7+pI dY5XciowC/wGRIRHW9AjLynRgL/wBZ+Xjiv/W4xXUnssDsenhRuv7CiN5DwG1bTnqLiZ U3Eg== X-Gm-Message-State: ACrzQf1QFC7Vasq5z5dwBEuv7g3hDKpNCHBQLqF7mrlbwB2IxNk++W4r BlAkMkDX9M7jgm8+1vh5hRs6rYLDz4t62htoR1ofEp4maLxTkLN1H18UlTbHWzAA0Cg7IwGiDpU cyWRlMNo9F8UzgERPVRLsxRKZBxPi5thxvCvcljiIlsmlBvI3CkoSiwB0MhcDa6bMFsY= X-Received: by 2002:a17:906:9bf1:b0:78d:f2d7:efbe with SMTP id de49-20020a1709069bf100b0078df2d7efbemr2479859ejc.273.1666099853315; Tue, 18 Oct 2022 06:30:53 -0700 (PDT) X-Google-Smtp-Source: AMsMyM66wMnDN1TrRrU35S7HwTULUYs0jyJI4KL34cNOOobXtHY5oh5XBtxylW6/8nm5oySyN4YLGA== X-Received: by 2002:a17:906:9bf1:b0:78d:f2d7:efbe with SMTP id de49-20020a1709069bf100b0078df2d7efbemr2479841ejc.273.1666099852970; Tue, 18 Oct 2022 06:30:52 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PULL 02/53] configure: don't enable firmware for targets that are not built Date: Tue, 18 Oct 2022 15:29:51 +0200 Message-Id: <20221018133042.856368-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666100988374100003 Content-Type: text/plain; charset="utf-8" This avoids the unfortunate effect of building pc-bios blobs even for targets the user isn't interested in. Due to the bi-arch nature of x86 and PPC firmware, check for the desired target by hand, and don't just look for the compilation target in $target_list. Signed-off-by: Paolo Bonzini --- configure | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 45ee6f4eb3..f9ec050bf8 100755 --- a/configure +++ b/configure @@ -1841,6 +1841,16 @@ compute_target_variable() { fi } =20 +have_target() { + for i; do + case " $target_list " in + *" $i "*) return 0;; + *) ;; + esac + done + return 1 +} + # probe_target_compiler TARGET # # Look for a compiler for the given target, either native or cross. @@ -2261,8 +2271,9 @@ echo "# Automatically generated by configure - do not= modify" > Makefile.prereqs =20 # Mac OS X ships with a broken assembler roms=3D -if test "$targetos" !=3D "darwin" && test "$targetos" !=3D "sunos" && \ - test "$targetos" !=3D "haiku" && test "$softmmu" =3D yes && \ +if have_target i386-softmmu x86_64-softmmu && \ + test "$targetos" !=3D "darwin" && test "$targetos" !=3D "sunos" &&= \ + test "$targetos" !=3D "haiku" && \ probe_target_compiler i386-softmmu; then roms=3D"pc-bios/optionrom" config_mak=3Dpc-bios/optionrom/config.mak @@ -2271,7 +2282,8 @@ if test "$targetos" !=3D "darwin" && test "$targetos"= !=3D "sunos" && \ write_target_makefile >> $config_mak fi =20 -if test "$softmmu" =3D yes && probe_target_compiler ppc-softmmu; then +if have_target ppc-softmmu ppc64-softmmu && \ + probe_target_compiler ppc-softmmu; then roms=3D"$roms pc-bios/vof" config_mak=3Dpc-bios/vof/config.mak echo "# Automatically generated by configure - do not modify" > $confi= g_mak @@ -2281,7 +2293,7 @@ fi =20 # Only build s390-ccw bios if the compiler has -march=3Dz900 or -march=3Dz= 10 # (which is the lowest architecture level that Clang supports) -if test "$softmmu" =3D yes && probe_target_compiler s390x-softmmu; then +if have_target s390x-softmmu && probe_target_compiler s390x-softmmu; then write_c_skeleton do_compiler "$target_cc" $target_cc_cflags -march=3Dz900 -o $TMPO -c $TM= PC has_z900=3D$? --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666100991; cv=none; d=zohomail.com; s=zohoarc; b=IlFklbaOZv6G7teJiKU4iZYULoHjdXINrWiHq+MX4CTKQdI0zC8v8/tTgklRrbCW8EMFqKjS/t1fiZ45xIeyvWNpdJZZs+hoPNfzo7Z8UZ5/TKovKm36sqC92q/Lbm8aRD3X5g+22ZyNgnp7l/xLQ4dTXAzBV8jwFjipXKOaBK0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666100991; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WBayf/BcWZuAnvkVyWE9fiu3SPDAv6PKOeXm+A0vxwE=; b=djka38v/0ygYHI3bQlzWDnmdTHR2gzn6uopVthPpQNSzx+qZIkfKo7d3g5DgrlgWQ5eAHWtES+Dj/oiiIJpw78xwBMp3uvs66PLgzGGNtS+Njhgq1OnidNS+hhfIYrFtADwmgt2ZJ7RyQ56oeCO/WW4E+jUgAEf0yG07JALt5XA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166610099125966.01252804636886; Tue, 18 Oct 2022 06:49:51 -0700 (PDT) Received: from localhost ([::1]:52426 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmyZ-0006G1-Oc for importer@patchew.org; Tue, 18 Oct 2022 09:49:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46350) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgW-00022P-2S for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:08 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:49901) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgS-0004yN-3W for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:07 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-668-_b0nu94KO5OfzxYE3GS5Ow-1; Tue, 18 Oct 2022 09:30:59 -0400 Received: by mail-ed1-f69.google.com with SMTP id z11-20020a056402274b00b0045ca9510fc8so11917826edd.23 for ; Tue, 18 Oct 2022 06:30:59 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id kz1-20020a17090777c100b0073d753759fasm7701837ejc.172.2022.10.18.06.30.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:30:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099861; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WBayf/BcWZuAnvkVyWE9fiu3SPDAv6PKOeXm+A0vxwE=; b=K3/f+DFStpDFbLo/hlxuRdVufI85/q/EYIxcx8K9UVNuKpEWxk7Dz63YIsWj/IBW4wu3H6 S9sHLZsY178u66CEht/0xcZ/8Qych8y6Vp3eS6N1ynxEYdgVke9KwgKUqgKEGWi086qtUz oix6YeW4aSAoXtaFG90XOWYE94s5Lh4= X-MC-Unique: _b0nu94KO5OfzxYE3GS5Ow-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WBayf/BcWZuAnvkVyWE9fiu3SPDAv6PKOeXm+A0vxwE=; b=xxJluayS5Jj6BuJjGMJtiBhMpPyVRY2Nk8/Emd7XqxHooaJrQ/SnfoDgkKWDbx4BEc Zp7nD0mDGmWeWTH5CVxFtdx4gjhfIe6oGZDO+lePnlar1gpB3dh9Fn8NIjDkKX/AFnoD RJwMsWNeAuNlZb/s75TA3cvJO38+0wELB3oylE9u0lBQUlkVf7aVuLPqoHDreF+zjRNY uip5RUV2Zn2/U8Z78tuS0JpE5EpJtNBUMgMPvLJBxhVP0VE7SK6k8i9w99gpDVsmy/gZ rLJntQPhKM8DOMmXLQlAo4eSCgMchrhF0GDH0nrqVqOmHOhSzpeLMDsnK9nqlCN85kCq RgKw== X-Gm-Message-State: ACrzQf1BdGgD4O9B3Zqx9VaEsCNYWQ8ZhZI+UmoCjUVMVHqQ572R/LXl DozOmtnnx/DkSUSfrMaYefvLIe/E42EllIyT2K+PzNXDAxT87uy+Zl53l1dweyjmIOVuKHS7B/J F8v2+iNiG6STsGNpIBq9k4iXQSoNug95IFqZIetfF1czxye1iSwghDVVd7lpA5WwAeTk= X-Received: by 2002:a05:6402:11ce:b0:45c:a364:2c3d with SMTP id j14-20020a05640211ce00b0045ca3642c3dmr2699702edw.204.1666099858342; Tue, 18 Oct 2022 06:30:58 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6oPVM92CEMb8QsrI6nXU8Nwlh50OnjKxKpZxa8q1UQnMj2CpjeNsVkMLMjyh12ir01kBiuwQ== X-Received: by 2002:a05:6402:11ce:b0:45c:a364:2c3d with SMTP id j14-20020a05640211ce00b0045ca3642c3dmr2699672edw.204.1666099858029; Tue, 18 Oct 2022 06:30:58 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Peter Maydell Subject: [PULL 03/53] scsi: Use device_cold_reset() and bus_cold_reset() Date: Tue, 18 Oct 2022 15:29:52 +0200 Message-Id: <20221018133042.856368-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666100992547100001 Content-Type: text/plain; charset="utf-8" From: Peter Maydell In the SCSI subsystem we currently use the legacy functions qdev_reset_all() and qbus_reset_all(). These perform a recursive reset, starting from either a qbus or a qdev. However they do not permit any of the devices in the tree to use three-phase reset, because device reset goes through the device_legacy_reset() function that only calls the single DeviceClass::reset method. Switch to using the device_cold_reset() and bus_cold_reset() functions. These also perform a recursive reset, where first the children are reset and then finally the parent, but they use the new (...in 2020...) Resettable mechanism, which supports both the old style single-reset method and also the new 3-phase reset handling. Since no devices attached to SCSI buses currently try to use 3-phase reset, this should be a no-behaviour-change commit which just reduces the use of a deprecated API. Commit created with: sed -i -e 's/qdev_reset_all/device_cold_reset/g;s/qbus_reset_all/bus_cold= _reset/g' hw/scsi/*.c Signed-off-by: Peter Maydell Message-Id: <20221013160623.1296109-2-peter.maydell@linaro.org> Signed-off-by: Paolo Bonzini --- hw/scsi/esp.c | 2 +- hw/scsi/lsi53c895a.c | 4 ++-- hw/scsi/megasas.c | 2 +- hw/scsi/mptsas.c | 8 ++++---- hw/scsi/spapr_vscsi.c | 2 +- hw/scsi/virtio-scsi.c | 6 +++--- hw/scsi/vmw_pvscsi.c | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index 2ff18ce500..e5b281e836 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -941,7 +941,7 @@ static void esp_soft_reset(ESPState *s) =20 static void esp_bus_reset(ESPState *s) { - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); } =20 static void parent_esp_reset(ESPState *s, int irq, int level) diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c index 05a43ec807..50979640c3 100644 --- a/hw/scsi/lsi53c895a.c +++ b/hw/scsi/lsi53c895a.c @@ -1868,7 +1868,7 @@ static void lsi_reg_writeb(LSIState *s, int offset, u= int8_t val) } if (val & LSI_SCNTL1_RST) { if (!(s->sstat0 & LSI_SSTAT0_RST)) { - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); s->sstat0 |=3D LSI_SSTAT0_RST; lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0); } @@ -1926,7 +1926,7 @@ static void lsi_reg_writeb(LSIState *s, int offset, u= int8_t val) lsi_execute_script(s); } if (val & LSI_ISTAT0_SRST) { - qdev_reset_all(DEVICE(s)); + device_cold_reset(DEVICE(s)); } break; case 0x16: /* MBOX0 */ diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c index 7082456d65..9cbbb16121 100644 --- a/hw/scsi/megasas.c +++ b/hw/scsi/megasas.c @@ -1484,7 +1484,7 @@ static int megasas_cluster_reset_ld(MegasasState *s, = MegasasCmd *cmd) MegasasCmd *tmp_cmd =3D &s->frames[i]; if (tmp_cmd->req && tmp_cmd->req->dev->id =3D=3D target_id) { SCSIDevice *d =3D tmp_cmd->req->dev; - qdev_reset_all(&d->qdev); + device_cold_reset(&d->qdev); } } return MFI_STAT_OK; diff --git a/hw/scsi/mptsas.c b/hw/scsi/mptsas.c index a90c2546f1..c485da792c 100644 --- a/hw/scsi/mptsas.c +++ b/hw/scsi/mptsas.c @@ -522,7 +522,7 @@ reply_maybe_async: reply.ResponseCode =3D MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN; goto out; } - qdev_reset_all(&sdev->qdev); + device_cold_reset(&sdev->qdev); break; =20 case MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET: @@ -538,13 +538,13 @@ reply_maybe_async: QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { sdev =3D SCSI_DEVICE(kid->child); if (sdev->channel =3D=3D 0 && sdev->id =3D=3D req->TargetID) { - qdev_reset_all(kid->child); + device_cold_reset(kid->child); } } break; =20 case MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS: - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); break; =20 default: @@ -807,7 +807,7 @@ static void mptsas_soft_reset(MPTSASState *s) s->intr_mask =3D MPI_HIM_DIM | MPI_HIM_RIM; mptsas_update_interrupt(s); =20 - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); s->intr_status =3D 0; s->intr_mask =3D save_mask; =20 diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 0a8cbf5a4b..5bbbef64ef 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -865,7 +865,7 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_= req *req) break; } =20 - qdev_reset_all(&d->qdev); + device_cold_reset(&d->qdev); break; =20 case SRP_TSK_ABORT_TASK_SET: diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index cf2721aa46..6f6e2e32ba 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -365,7 +365,7 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSI= Req *req) goto incorrect_lun; } s->resetting++; - qdev_reset_all(&d->qdev); + device_cold_reset(&d->qdev); s->resetting--; break; =20 @@ -417,7 +417,7 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSI= Req *req) QTAILQ_FOREACH_RCU(kid, &s->bus.qbus.children, sibling) { SCSIDevice *d1 =3D SCSI_DEVICE(kid->child); if (d1->channel =3D=3D 0 && d1->id =3D=3D target) { - qdev_reset_all(&d1->qdev); + device_cold_reset(&d1->qdev); } } rcu_read_unlock(); @@ -831,7 +831,7 @@ static void virtio_scsi_reset(VirtIODevice *vdev) =20 assert(!s->dataplane_started); s->resetting++; - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); s->resetting--; =20 vs->sense_size =3D VIRTIO_SCSI_SENSE_DEFAULT_SIZE; diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c index 91e2f858ab..3ea2c8c9f2 100644 --- a/hw/scsi/vmw_pvscsi.c +++ b/hw/scsi/vmw_pvscsi.c @@ -445,7 +445,7 @@ static void pvscsi_reset_adapter(PVSCSIState *s) { s->resetting++; - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); s->resetting--; pvscsi_process_completion_queue(s); assert(QTAILQ_EMPTY(&s->pending_queue)); @@ -894,7 +894,7 @@ pvscsi_on_cmd_reset_bus(PVSCSIState *s) trace_pvscsi_on_cmd_arrived("PVSCSI_CMD_RESET_BUS"); =20 s->resetting++; - qbus_reset_all(BUS(&s->bus)); + bus_cold_reset(BUS(&s->bus)); s->resetting--; return PVSCSI_COMMAND_PROCESSING_SUCCEEDED; } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666100984; cv=none; d=zohomail.com; s=zohoarc; b=IqzNH/NmKGXFdo1dc8aSMcFOBAQIw97j+cuCebi9lW6AQ9Chkxg60lzv25qU/M9jZj5VY6zxFs6ZCfPiAsRmRjuS5y2EwhweJxl7yuheA0sFR7tAIjlSveIkUK88ix9uqfCQYwqOLsngC6+fJQthIriLypewfg67nft6owF5nmg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666100984; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=SoCij7i/9X4juBWaniX6jsRov2N8yHMFa3Jfri+4JLA=; b=V4K/fcfoK5Y4AdcLHamrCk981PbotsubOLX1OhdSdaipp5friWXqLyJlzQvB32w4Q7mwfa1DpmPFb55Bb0kTAe6RJ2SyQ1SMoA990EXWJEJlQm21q/Xg9PxWtKlsqZ/tD0Mto2LRaMVEdqWSphpsoF0VzdXTxDpJby5JbvL4ORE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666100984233350.0617339789769; Tue, 18 Oct 2022 06:49:44 -0700 (PDT) Received: from localhost ([::1]:52442 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmyS-0006H6-Fk for importer@patchew.org; Tue, 18 Oct 2022 09:49:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57508) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmge-0002K6-NS for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:23 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:60043) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgV-0004z2-DB for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:16 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-498-ff6AnEJHN6SbRmjXwgU5Vw-1; Tue, 18 Oct 2022 09:31:04 -0400 Received: by mail-ed1-f71.google.com with SMTP id z20-20020a05640240d400b0045cec07c3dcso11493953edb.3 for ; Tue, 18 Oct 2022 06:31:03 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id k13-20020a17090627cd00b0077826b92d99sm7587315ejc.12.2022.10.18.06.30.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099866; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SoCij7i/9X4juBWaniX6jsRov2N8yHMFa3Jfri+4JLA=; b=Y59DM32PnwEp+D8JIoFK+Task/ECAFXDsJOS8DmcotZzB9zTorW3dZhQGWYcnP8vDhntRi m+o+bDPOK5g7Zpq9HdN7DANu2LFcz9Flc7qQNXBOMXpUbY84tzWtoZlbAID8pz2yyf5cAL DiKq1i0/NYbGFv+72l5dPez7huG2i6k= X-MC-Unique: ff6AnEJHN6SbRmjXwgU5Vw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SoCij7i/9X4juBWaniX6jsRov2N8yHMFa3Jfri+4JLA=; b=VgKRNTcw+Z7MJM7kMRyQwb7eW1npgtO4rJWhFTLi9yN+qMDy9amu/ZmE5iUcNqOje7 DEeF3vQSXuLn8kmOsD7V3rNdW9Dl/vNuzyBd1SU09dEQPTdpLOuNSTLTh4JirfZta85v 4e55mmW//wqFn+zdtnLTaF0cDRUePIEQAYiTn/dxhlSb7sJEgpgPoy1Ux5fB3culjyum v44AeoelpnkmWM2vA2aV6zqMuS9titC0z7nX6tCVv2MjNk1fw5eJkXNMCQp5DaR/QNO9 zF/rJvIy5tU5HOz0dXUTGuKoJopvJC0c53wE7nkNEQYb3UPm60PEs8Iy2mZrCXHLlAnp qpzQ== X-Gm-Message-State: ACrzQf0fzYQSbj94TMecSeF8vaF1HJVjQjpWf4S14etzdUvAtz5zyQan kYlQ6D2y/FNbtm1uEZDKvB/KjTJAJsBHkopeLtBjOwAicOUyvun5KAafBGWVtNHFhlc1FpQB5cg pZaYcvJe+DI/QvaiAb6mJ0aSbDX7Bzwyg13zUbrjvbfo6mnIODeLj8jZIc2x9UnMBFfk= X-Received: by 2002:a17:906:8b81:b0:78e:1cb:e411 with SMTP id nr1-20020a1709068b8100b0078e01cbe411mr2346758ejc.681.1666099861844; Tue, 18 Oct 2022 06:31:01 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6UzxtNMTMfvudUtnhQCCKxriOcn73mCmKvh1fQGSsMVsTWIETTDEg+pKzFaX2w1hjhz71kRQ== X-Received: by 2002:a17:906:8b81:b0:78e:1cb:e411 with SMTP id nr1-20020a1709068b8100b0078e01cbe411mr2346735ejc.681.1666099861519; Tue, 18 Oct 2022 06:31:01 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Peter Maydell Subject: [PULL 04/53] hw/scsi/vmw_pvscsi.c: Use device_cold_reset() to reset SCSI devices Date: Tue, 18 Oct 2022 15:29:53 +0200 Message-Id: <20221018133042.856368-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666100987750100001 Content-Type: text/plain; charset="utf-8" From: Peter Maydell Currently the vwm_pvscsi controller resets individual SCSI devices with the device_legacy_reset() function. The only difference between this and device_cold_reset() is that device_legacy_reset() resets the device but not any child qbuses it might have. In this case, no SCSI device has a child qbus, so the functions have the same behaviour. Switch to device_cold_reset() to move away from using the deprecated function, and bring this SCSI controller in to line with what all the others do. Signed-off-by: Peter Maydell Message-Id: <20221013160623.1296109-3-peter.maydell@linaro.org> Signed-off-by: Paolo Bonzini --- hw/scsi/vmw_pvscsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c index 3ea2c8c9f2..fa76696855 100644 --- a/hw/scsi/vmw_pvscsi.c +++ b/hw/scsi/vmw_pvscsi.c @@ -880,7 +880,7 @@ pvscsi_on_cmd_reset_device(PVSCSIState *s) =20 if (sdev !=3D NULL) { s->resetting++; - device_legacy_reset(&sdev->qdev); + device_cold_reset(&sdev->qdev); s->resetting--; return PVSCSI_COMMAND_PROCESSING_SUCCEEDED; } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102182; cv=none; d=zohomail.com; s=zohoarc; b=c68qQzuQ1OjHGcF3kL3m2qfKePa6yS7Cm7qGcgd9pzzL7h1d3URRHJNz2PGUgCybKpjDtoq3T/WKX6cGI+n1sNcqtWxn/HSl3NHOBLhZipRoUHTkoTG+WPTuBqrC/5AbZk3gr3Sbp7hvk56zOtW3DruQC9G6vIMPs5EeOvmDJUA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102182; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xh2WQfMOThQmIiiSvAkUXXDHDmndCBlFXuAzD7GAhXI=; b=DlEtbVn40vVaTHdKt8Hahwwe7VFANBwORjqc/i65mvpLj8rtPw8FAQLqCqGXjusjP1q4GnaWqYUd0zNxXmW9vka06sVeejLMtlHha7aCFJo7M2U0ANGtw7nM2m895ZfHPWHC887lpPJFSAc9UCbkIGzTsVpm5/6e8iD75uwIikM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166610218214158.87086298671602; Tue, 18 Oct 2022 07:09:42 -0700 (PDT) Received: from localhost ([::1]:50770 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknHn-0003T3-Qa for importer@patchew.org; Tue, 18 Oct 2022 10:09:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46352) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgZ-0002AJ-RZ for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:11 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:46992) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgX-0004zZ-LN for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:11 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-62-3T-nuJ_cMW-A7k-Zz61L2A-1; Tue, 18 Oct 2022 09:31:07 -0400 Received: by mail-ed1-f72.google.com with SMTP id b8-20020a056402278800b0045d410dec69so7565150ede.2 for ; Tue, 18 Oct 2022 06:31:07 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id kv2-20020a17090778c200b0077e6be40e4asm7662549ejc.175.2022.10.18.06.31.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099869; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xh2WQfMOThQmIiiSvAkUXXDHDmndCBlFXuAzD7GAhXI=; b=eyxW5QPSTTdQXGsVO4HOkvwTFm9jgaL2qT4/MVFKpx/qckvGqLJV16vRk052+zm+s0qs6t mJ7bY9ax4yTU9EboEhcfVP1dydscvwULr1CV47HcHRsfMEGOUb4MOVFfBUNxjKD/OsbsiV mdfdY76Z6h3rqo/Yf9dlTURIj40JHuM= X-MC-Unique: 3T-nuJ_cMW-A7k-Zz61L2A-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xh2WQfMOThQmIiiSvAkUXXDHDmndCBlFXuAzD7GAhXI=; b=m0Dq/FCvcwLlCd3tG4xJEMbIbWIpz4OeUGib3PEADcEJga0GjDcQB2B/LHyHaobGNc b5R8YuZriGcj4KBZWvZmFb+FQj0J23SKKUERloIDWluFAPLzBCpw3vMSdjyvAJzV7G4A wLjOSZxFHa3M9JFaRFI5RutHiNg6tetunL5mpGaME2M5XWiPbFK0HGD+7aWo1a9KiHl1 ekGH8HcbdpkLpgvaUDEUnps+n0FJHTOY9qGHBmBdiO2XwHlM2R/FG1rsmQjIHM1ScKih CeYg/t34EgNkwcXd/6ruMhQ3hsVNQKDc9yKNjnAglQo8MdzTHaaOr2lG0VT2sMXl9BrO 8gXA== X-Gm-Message-State: ACrzQf1LnvRyy7kOk+T08EjREV+r0Ci0RPfyjlb0iBXXI6W4Hk/YII7g tjBrxe2tkFKwf3UJGH+M9K76/hZpcGPc0IBpV1FNawHQwGYT+10ptgtZCWNIIr/qujkFBZtelvV MpcpLbwJhFCtLb/VsjmVqiXuuQJAi4ty8UZQ2U/5+FFN8FSvvtDtq5zRwewid5HBbdf8= X-Received: by 2002:a05:6402:538f:b0:444:c17b:1665 with SMTP id ew15-20020a056402538f00b00444c17b1665mr2706592edb.98.1666099865872; Tue, 18 Oct 2022 06:31:05 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6n/9B3Z9fhEw4mTZS+dZWucs3A/Mj4ZFbUcPy32ttYhJSvsTyryMgwQA/remfesvl/Ynz+6w== X-Received: by 2002:a05:6402:538f:b0:444:c17b:1665 with SMTP id ew15-20020a056402538f00b00444c17b1665mr2706566edb.98.1666099865514; Tue, 18 Oct 2022 06:31:05 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: "Maciej S. Szmigiero" Subject: [PULL 05/53] hyperv: fix SynIC SINT assertion failure on guest reset Date: Tue, 18 Oct 2022 15:29:54 +0200 Message-Id: <20221018133042.856368-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102184089100004 Content-Type: text/plain; charset="utf-8" From: "Maciej S. Szmigiero" Resetting a guest that has Hyper-V VMBus support enabled triggers a QEMU assertion failure: hw/hyperv/hyperv.c:131: synic_reset: Assertion `QLIST_EMPTY(&synic->sint_ro= utes)' failed. This happens both on normal guest reboot or when using "system_reset" HMP command. The failing assertion was introduced by commit 64ddecc88bcf ("hyperv: SCont= rol is optional to enable SynIc") to catch dangling SINT routes on SynIC reset. The root cause of this problem is that the SynIC itself is reset before devices using SINT routes have chance to clean up these routes. Since there seems to be no existing mechanism to force reset callbacks (or methods) to be executed in specific order let's use a similar method that is already used to reset another interrupt controller (APIC) after devices have been reset - by invoking the SynIC reset from the machine reset handler via a new x86_cpu_after_reset() function co-located with the existing x86_cpu_reset() in target/i386/cpu.c. Opportunistically move the APIC reset handler there, too. Fixes: 64ddecc88bcf ("hyperv: SControl is optional to enable SynIc") # expo= sed the bug Signed-off-by: Maciej S. Szmigiero Message-Id: Signed-off-by: Paolo Bonzini --- hw/i386/microvm.c | 4 +--- hw/i386/pc.c | 5 ++--- target/i386/cpu.c | 13 +++++++++++++ target/i386/cpu.h | 2 ++ target/i386/kvm/hyperv.c | 4 ++++ target/i386/kvm/kvm.c | 26 ++++++++++++++++++-------- target/i386/kvm/kvm_i386.h | 1 + 7 files changed, 41 insertions(+), 14 deletions(-) diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c index 7fe8cce03e..52f9aa9d8c 100644 --- a/hw/i386/microvm.c +++ b/hw/i386/microvm.c @@ -485,9 +485,7 @@ static void microvm_machine_reset(MachineState *machine) CPU_FOREACH(cs) { cpu =3D X86_CPU(cs); =20 - if (cpu->apic_state) { - device_legacy_reset(cpu->apic_state); - } + x86_cpu_after_reset(cpu); } } =20 diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 566accf7e6..768982ae9a 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -92,6 +92,7 @@ #include "hw/virtio/virtio-mem-pci.h" #include "hw/mem/memory-device.h" #include "sysemu/replay.h" +#include "target/i386/cpu.h" #include "qapi/qmp/qerror.h" #include "e820_memory_layout.h" #include "fw_cfg.h" @@ -1859,9 +1860,7 @@ static void pc_machine_reset(MachineState *machine) CPU_FOREACH(cs) { cpu =3D X86_CPU(cs); =20 - if (cpu->apic_state) { - device_legacy_reset(cpu->apic_state); - } + x86_cpu_after_reset(cpu); } } =20 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 8a11470507..90aec2f462 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -6035,6 +6035,19 @@ static void x86_cpu_reset(DeviceState *dev) #endif } =20 +void x86_cpu_after_reset(X86CPU *cpu) +{ +#ifndef CONFIG_USER_ONLY + if (kvm_enabled()) { + kvm_arch_after_reset_vcpu(cpu); + } + + if (cpu->apic_state) { + device_legacy_reset(cpu->apic_state); + } +#endif +} + static void mce_init(X86CPU *cpu) { CPUX86State *cenv =3D &cpu->env; diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 7edf5dfac3..4d21c5759d 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2082,6 +2082,8 @@ typedef struct PropValue { } PropValue; void x86_cpu_apply_props(X86CPU *cpu, PropValue *props); =20 +void x86_cpu_after_reset(X86CPU *cpu); + uint32_t cpu_x86_virtual_addr_width(CPUX86State *env); =20 /* cpu.c other functions (cpuid) */ diff --git a/target/i386/kvm/hyperv.c b/target/i386/kvm/hyperv.c index 9026ef3a81..e3ac978648 100644 --- a/target/i386/kvm/hyperv.c +++ b/target/i386/kvm/hyperv.c @@ -23,6 +23,10 @@ int hyperv_x86_synic_add(X86CPU *cpu) return 0; } =20 +/* + * All devices possibly using SynIC have to be reset before calling this t= o let + * them remove their SINT routes first. + */ void hyperv_x86_synic_reset(X86CPU *cpu) { hyperv_synic_reset(CPU(cpu)); diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index bed6c00f2c..dac100c67c 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -2203,14 +2203,6 @@ void kvm_arch_reset_vcpu(X86CPU *cpu) env->mp_state =3D KVM_MP_STATE_RUNNABLE; } =20 - if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNIC)) { - int i; - for (i =3D 0; i < ARRAY_SIZE(env->msr_hv_synic_sint); i++) { - env->msr_hv_synic_sint[i] =3D HV_SINT_MASKED; - } - - hyperv_x86_synic_reset(cpu); - } /* enabled by default */ env->poll_control_msr =3D 1; =20 @@ -2219,6 +2211,24 @@ void kvm_arch_reset_vcpu(X86CPU *cpu) sev_es_set_reset_vector(CPU(cpu)); } =20 +void kvm_arch_after_reset_vcpu(X86CPU *cpu) +{ + CPUX86State *env =3D &cpu->env; + int i; + + /* + * Reset SynIC after all other devices have been reset to let them rem= ove + * their SINT routes first. + */ + if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNIC)) { + for (i =3D 0; i < ARRAY_SIZE(env->msr_hv_synic_sint); i++) { + env->msr_hv_synic_sint[i] =3D HV_SINT_MASKED; + } + + hyperv_x86_synic_reset(cpu); + } +} + void kvm_arch_do_init_vcpu(X86CPU *cpu) { CPUX86State *env =3D &cpu->env; diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h index 2ed586c11b..b7c38ba2c4 100644 --- a/target/i386/kvm/kvm_i386.h +++ b/target/i386/kvm/kvm_i386.h @@ -38,6 +38,7 @@ bool kvm_has_adjust_clock_stable(void); bool kvm_has_exception_payload(void); void kvm_synchronize_all_tsc(void); void kvm_arch_reset_vcpu(X86CPU *cs); +void kvm_arch_after_reset_vcpu(X86CPU *cpu); void kvm_arch_do_init_vcpu(X86CPU *cs); =20 void kvm_put_apicbase(X86CPU *cpu, uint64_t value); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101025; cv=none; d=zohomail.com; s=zohoarc; b=W/OGg5l6rS5tABMeRl4QsuzoRjzv4iu0QwOXVGGbVRkd7tttnRHaNyHjuczGrDNjxay2qbIn+mYt2CoX/p4hvnVBcZ5TXR4T0RwP1N8eGM5Ut5gyUDpOFFC8XC6gbUlBRd/fUUCa3qve+a5cCnXK1CjogJ0zwpAAX2x87228KKg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101025; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oE+3E3jGm4iDUWdYfIF6C9CXXTBvieh4iAWsUTJZKNI=; b=m4Qzk1IaiSwN7mNftvKN2Fu2a+8v5qe1kmqdam1o0MudF1IIgRaxqT6brPXq0+BjwUWNXZJQVZ3OUQKON+QIgxlCNSS0S3knlPGfT4y4r2QbVkKXw0pi2B+cgttEbKwi+qmr2TVTXbNCf2SeVhUGujP9bZVkMeaaJ2ZhZdgEZYU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166610102573921.10354623078183; Tue, 18 Oct 2022 06:50:25 -0700 (PDT) Received: from localhost ([::1]:52468 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmzA-0006T4-4n for importer@patchew.org; Tue, 18 Oct 2022 09:50:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57512) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgh-0002KC-7z for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:23 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:33765) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmga-000504-MJ for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:17 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-577-0mN55wOLO4G8Osntzo1KiQ-1; Tue, 18 Oct 2022 09:31:10 -0400 Received: by mail-ed1-f69.google.com with SMTP id c9-20020a05640227c900b0045d4a88c750so6973093ede.12 for ; Tue, 18 Oct 2022 06:31:10 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id sz15-20020a1709078b0f00b0078d9b967962sm7418575ejc.65.2022.10.18.06.31.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099872; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oE+3E3jGm4iDUWdYfIF6C9CXXTBvieh4iAWsUTJZKNI=; b=M58V63JBrDFLdXpRM5aTGroEe7bHB2t3naYDvDVpHuoCFRZ+vDuGXkOYrdG0stU7CoqG58 oF4nkjmSj2UtBfK3CdYv1wEF+kklrvAOJaY4sI7h8oVhV2PJ+pXbavE1mTub7zUisTP2+X WABfbKKtNhw/MbPt3kS90u3J62tjDvg= X-MC-Unique: 0mN55wOLO4G8Osntzo1KiQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oE+3E3jGm4iDUWdYfIF6C9CXXTBvieh4iAWsUTJZKNI=; b=5xguZYY5kA/Id43DYaOi/rBvLCSimrzcW10piDrEX0CXunP22DEMv8GPc4cmcvTF2k YFlay1DEwqy7uN0jMjHVbip3nLvpQp3mZUWjUzt9glh/hytJcmmfIV28s1YHu60Za/qw BKPNBYCzGlmCORKfZpfaKzhvldeJlAfC/jQU0/LrcyNaDUix772CRvk0Uni9jfECshNf +JBhZpWF4mphm97cexcsKt8uxQi3fVvmE214HbMdvOkqH+JkzIVEaumLNzQ4II5RXYb8 skcOch3kAAD5vnT9B603o9IUGpc9OpKp0mJQJXDiM/6vIrOjyS4qW0HpgFUPrBQn4VBD kmcA== X-Gm-Message-State: ACrzQf0gL2+0KqT+aehklENYMdEKnfDmhb/9/XPpPGpdIiukbBrIZ/HZ KKWKIrIxPIL8PS2GTGcjVZTOZvj3LYH0+1BJwSCVaFdN2jhszZOEKFUq+2LbM1LAaxNG22KiHmV f9TmzExmqR4EfQsNLU44FjIMwi9avzzye46mtWD9XJUys1xuY/RnCHs6S53CLaLLK62c= X-Received: by 2002:a17:907:e87:b0:78e:2b3c:f672 with SMTP id ho7-20020a1709070e8700b0078e2b3cf672mr2442009ejc.74.1666099868695; Tue, 18 Oct 2022 06:31:08 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6O6U19SyyzRj1WVbO1Be7mCNSSXm5/yGMq4x+uQwWIZXufy936ztrkFyr8dXkqSkYAQfVmjQ== X-Received: by 2002:a17:907:e87:b0:78e:2b3c:f672 with SMTP id ho7-20020a1709070e8700b0078e2b3cf672mr2441985ejc.74.1666099868379; Tue, 18 Oct 2022 06:31:08 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Michal Privoznik , qemu-stable@nongnu.org Subject: [PULL 06/53] configure: Avoid using strings binary Date: Tue, 18 Oct 2022 15:29:55 +0200 Message-Id: <20221018133042.856368-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101026871100002 Content-Type: text/plain; charset="utf-8" From: Michal Privoznik When determining the endiandness of the target architecture we're building for a small program is compiled, which in an obfuscated way declares two strings. Then, we look which string is in correct order (using strings binary) and deduct the endiandness. But using the strings binary is problematic, because it's part of toolchain (strings is just a symlink to x86_64-pc-linux-gnu-strings or llvm-strings). And when (cross-)compiling, it requires users to set the symlink to the correct toolchain. Fortunately, we have a better alternative anyways. We can mimic what compiler.h is already doing: comparing __BYTE_ORDER__ against values for little/big endiandness. Bug: https://bugs.gentoo.org/876933 Signed-off-by: Michal Privoznik Message-Id: Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini --- configure | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/configure b/configure index f9ec050bf8..81561be7c1 100755 --- a/configure +++ b/configure @@ -1423,30 +1423,31 @@ if test "$tcg" =3D "enabled"; then git_submodules=3D"$git_submodules tests/fp/berkeley-softfloat-3" fi =20 -# --- +########################################## # big/little endian test cat > $TMPC << EOF -#include -short big_endian[] =3D { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, }; -short little_endian[] =3D { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41= , 0, }; -int main(int argc, char *argv[]) -{ - return printf("%s %s\n", (char *)big_endian, (char *)little_endian); -} +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ =3D=3D __ORDER_LITTLE_ENDIAN= __ +# error LITTLE +#endif +int main(void) { return 0; } EOF =20 -if compile_prog ; then - if strings -a $TMPE | grep -q BiGeNdIaN ; then - bigendian=3D"yes" - elif strings -a $TMPE | grep -q LiTtLeEnDiAn ; then - bigendian=3D"no" - else - echo big/little test failed - exit 1 - fi +if ! compile_prog ; then + bigendian=3D"no" else + cat > $TMPC << EOF +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ =3D=3D __ORDER_BIG_ENDIAN__ +# error BIG +#endif +int main(void) { return 0; } +EOF + + if ! compile_prog ; then + bigendian=3D"yes" + else echo big/little test failed exit 1 + fi fi =20 ########################################## --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101255; cv=none; d=zohomail.com; s=zohoarc; b=GbJwg4aRpH0W8D+/1h4z9/GvCCg77PI654DFPfycCPGsk+ZalElnbZ4wil5CEql7UNPA2I1eq1a/aaq9QfqWzdlUCrRV7ueE1NMSiWAHbvykpdh4Y2zsBFnk9WByYTUadqlb0XD/N+zHSCX4pf0mwZmhnkYp4HgoR9Q+wLLxERU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101255; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8Mj0trnLBbmwbil62VyOFwjoBgFh0LukQgd1Qfq5RB8=; b=GXabWD6SzN+zFpfqAA1hXAa/KEyFsBZ0mNzW4syESC+VY8kzeTYij/vHiun1CPrDtDyN4jawa8c/aqszz/ww0Y1jy6p8nZ8X9l2nfULju4uLF7Sb0zYajlFEP0bm1GUnbw+ZPrgmbqJRR9DYfE7pkv8mGLvWIEqli5dvHQwvbo0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101255492167.705662397968; Tue, 18 Oct 2022 06:54:15 -0700 (PDT) Received: from localhost ([::1]:35770 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn2n-0005UT-Vj for importer@patchew.org; Tue, 18 Oct 2022 09:54:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57510) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgh-0002KB-5p for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:23 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:42168) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmge-00050k-5b for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:17 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-635-HJpj9CrpN062IhaAz7RTkA-1; Tue, 18 Oct 2022 09:31:13 -0400 Received: by mail-ej1-f69.google.com with SMTP id sa6-20020a1709076d0600b0078d84ed54b9so6374052ejc.18 for ; Tue, 18 Oct 2022 06:31:13 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id l17-20020a1709060cd100b00783c545544fsm7500565ejh.215.2022.10.18.06.31.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099875; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8Mj0trnLBbmwbil62VyOFwjoBgFh0LukQgd1Qfq5RB8=; b=JtswHCO068zQB6igZNCcJ5aFyKKpIiF3tWJMmCSsh1ckcyMWJXwHmMerHSfTe1diLvNV35 Hbgr1LtTQnrvM5Gxd+KooT7J154pe4vkO+L2AAa5gP5sJBP9Suck6/lAxkOl6ypdDzaYF1 3E8LEuZ2bfFL5+sp5G9ge+3mCxo2lF0= X-MC-Unique: HJpj9CrpN062IhaAz7RTkA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8Mj0trnLBbmwbil62VyOFwjoBgFh0LukQgd1Qfq5RB8=; b=dN+Y0QfVuWy+usVcUmoWzNhZ6PW5//+9wNdaeKJU20SMS+6wWxsELRHB+d7lRK4mlQ pAMSzlaDdI2qxdj57Ou4AXMhkfgdyIBPQwJ/m7ggQ5rIiGt/9xY0uPTwphxqzYKdKVIQ m664uETGI7n8FLYHBphKbgeg/X4+MOeE5WbCrwLa0jzJydok44hV1xqR8vIO8k/jFbXb kX6GrEezD+cT2iNfOaKszvGZquhZ2Rd8fBL9gnl05U8bKMYSFHliTvi/r8B3Y8neIxfJ 3zbXtUAagvXJU/xaViaDfYf8RXg0ZTbgCJ8/vWsDEaLC8vchsd0smf0dG2yV1y7PreQC hOdQ== X-Gm-Message-State: ACrzQf15SESsSf762f5MB/SKPTL0FsoPAlgT4DgpNy5XL45VejNul2qE rEkrCjSKrUkkbZd8h6z1T6XO1R6ZZIbS6P9E38VXxM97G8DXst7H8gMSyc/lrvAXEfGYaRUF4Uj A/bEkiWfhDb57BkR6KRX6FFdLMtnn4YHuwmLOD6UI3nTJtkFZQyCCv+LFh6eysnBtfrY= X-Received: by 2002:a17:907:2d0f:b0:78e:9ca5:62af with SMTP id gs15-20020a1709072d0f00b0078e9ca562afmr2428770ejc.334.1666099871787; Tue, 18 Oct 2022 06:31:11 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5sUaychFe3wBo2kY5s6G2G3USPhGLRGtWchh1NtfaYDlJFqoIIl4EZ5CJM3WLPaJq/MlBUUw== X-Received: by 2002:a17:907:2d0f:b0:78e:9ca5:62af with SMTP id gs15-20020a1709072d0f00b0078e9ca562afmr2428756ejc.334.1666099871547; Tue, 18 Oct 2022 06:31:11 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Peter Maydell , "Michael S . Tsirkin" Subject: [PULL 07/53] target/i386: Use device_cold_reset() to reset the APIC Date: Tue, 18 Oct 2022 15:29:56 +0200 Message-Id: <20221018133042.856368-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101256049100001 Content-Type: text/plain; charset="utf-8" From: Peter Maydell The semantic difference between the deprecated device_legacy_reset() function and the newer device_cold_reset() function is that the new function resets both the device itself and any qbuses it owns, whereas the legacy function resets just the device itself and nothing else. The x86_cpu_after_reset() function uses device_legacy_reset() to reset the APIC; this is an APICCommonState and does not have any qbuses, so for this purpose the two functions behave identically and we can stop using the deprecated one. Signed-off-by: Peter Maydell Acked-by: Michael S. Tsirkin Message-Id: <20221013171926.1447899-1-peter.maydell@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 90aec2f462..6279745f79 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -6043,7 +6043,7 @@ void x86_cpu_after_reset(X86CPU *cpu) } =20 if (cpu->apic_state) { - device_legacy_reset(cpu->apic_state); + device_cold_reset(cpu->apic_state); } #endif } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101024; cv=none; d=zohomail.com; s=zohoarc; b=aX8fTCyM/uGHo00aw/sRyOLDv2uLmrOD98yvR74ZYT2dGDxd8XiAEdWr0/7+xfn9oHCwPMkGHYJxk0uXTpCj86ZdVRiVQusrktX/gdllDiWyi7zacdtE298uOzEIWveh0AtsR1R+Va+FF/rF0BeozQCqWj23iC8yL5EB+NcI9pk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101024; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0ehRf64SO+N5WhlRXQwHKpykS1f6TV6fwdbGGcfH37w=; b=k5hAkhezsO8s2UvljW9ZxYXzuBHm+9sF6s73LEfO65NvgdXKBhf6mesR4eofMsbFPKkfAcHFS+an1zbm7goy2aTr+ZJ7jZa5JRdP9OvUcHgFmTf6yJeBg5pvVcD1AN07KxpklZEBQieXXzGMKpJz/VYK9aaCbPIf67pfeKBYTpY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166610102460966.00082501753047; Tue, 18 Oct 2022 06:50:24 -0700 (PDT) Received: from localhost ([::1]:57972 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmz7-0006pC-GI for importer@patchew.org; Tue, 18 Oct 2022 09:50:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57514) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgj-0002Kc-K1 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:25 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:22864) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgg-00050u-U3 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:20 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-53-gd-9Wz3UO8unyYfBnndCVQ-1; Tue, 18 Oct 2022 09:31:16 -0400 Received: by mail-ed1-f71.google.com with SMTP id z7-20020a05640235c700b0045d3841ccf2so8252494edc.9 for ; Tue, 18 Oct 2022 06:31:16 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id p6-20020a05640243c600b0045b4b67156fsm8920112edc.45.2022.10.18.06.31.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099878; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0ehRf64SO+N5WhlRXQwHKpykS1f6TV6fwdbGGcfH37w=; b=LK5FPmF4wv5UhjDzJHja8QArWYRDQSUfemBUp7ZyZFXBMhrrPsYDrI7jLKhyYiY9EvJadr vtV3Vr178WNjwBbYXc/P2K3dUTiVYS4Y10Es//xyNH7UgRxIedwZObcqSYlJnIrtljIIHB ryiKZ4ia/xX/ZyhYH+a8gDP8XA9G5vY= X-MC-Unique: gd-9Wz3UO8unyYfBnndCVQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0ehRf64SO+N5WhlRXQwHKpykS1f6TV6fwdbGGcfH37w=; b=6ORtQm5962O1dNrtWGpU4DAj61H4vC9FTZTItLKAXbUsogassgcVi+w2GyhLYNZKlq 70jkY2CG6EfmJ05XLaey8NEDtyOn/Jzb4dzG3qrB94kECy5o7dmYsDpCirjzs36jcpMF wT1WQPCd9EvPiJheqdL3AG/L7E/1S7DhNWRDHuaJEESI7em9zvnJoKFqMmpYRi6rLW1t PW9yYoWVOILzJxEYG4B4Eeoll8xpQfrdTQijS0kY4DlrIqSfJxJMOd1fwe7wKx+Mq1mu S6RoXmoeu4ltgH9OSNERsha0p5UgtnJVzc3l1KlMbFiTXpfatbfw93Op4NbOMuSGI/cE Xlhg== X-Gm-Message-State: ACrzQf2UwW2vdvP4N6DHSIK3PNuxU0hMfJL4W1ij8g5JZQ99L9JMx8za 1y/rL8xF3BdYzuGO2fT9eGXLB1Xrk336reXdGhR8uwJPD4Uv9/jViUal+yax1OHVG6MJz7Elaw/ 42HVNpPtm5FoGLGBFbOjctrG7rGe3xmq5MOvp5c1MOa1FzNgIC56osFSLyxwAMsBpFvw= X-Received: by 2002:a17:907:320c:b0:77b:6f08:9870 with SMTP id xg12-20020a170907320c00b0077b6f089870mr2428417ejb.249.1666099874719; Tue, 18 Oct 2022 06:31:14 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4hcXBPXlLMgKPFCgQS9PXXjkgupyrR+bDpWILGrVGML5tsFGHLb3lOl4ZcpxGWEWdytQT0sQ== X-Received: by 2002:a17:907:320c:b0:77b:6f08:9870 with SMTP id xg12-20020a170907320c00b0077b6f089870mr2428388ejb.249.1666099874409; Tue, 18 Oct 2022 06:31:14 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson , Peter Maydell Subject: [PULL 08/53] target/i386: Save and restore pc_save before tcg_remove_ops_after Date: Tue, 18 Oct 2022 15:29:57 +0200 Message-Id: <20221018133042.856368-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101026868100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Restore pc_save while undoing any state change that may have happened while decoding the instruction. Leave a TODO about removing all of that when the table-based decoder is complete. Cc: Paolo Bonzini Suggested-by: Peter Maydell Signed-off-by: Richard Henderson Message-Id: <20221016222303.288551-1-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 279a3ae999..75ca99084e 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4817,6 +4817,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) int modrm, reg, rm, mod, op, opreg, val; bool orig_cc_op_dirty =3D s->cc_op_dirty; CCOp orig_cc_op =3D s->cc_op; + target_ulong orig_pc_save =3D s->pc_save; =20 s->pc =3D s->base.pc_next; s->override =3D -1; @@ -4838,8 +4839,15 @@ static bool disas_insn(DisasContext *s, CPUState *cp= u) case 2: /* Restore state that may affect the next instruction. */ s->pc =3D s->base.pc_next; + /* + * TODO: These save/restore can be removed after the table-based + * decoder is complete; we will be decoding the insn completely + * before any code generation that might affect these variables. + */ s->cc_op_dirty =3D orig_cc_op_dirty; s->cc_op =3D orig_cc_op; + s->pc_save =3D orig_pc_save; + /* END TODO */ s->base.num_insns--; tcg_remove_ops_after(s->prev_insn_end); s->base.is_jmp =3D DISAS_TOO_MANY; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101157; cv=none; d=zohomail.com; s=zohoarc; b=kgwhg4d/+j/x2gJkSm5JAFs/GBmvjoDhOvTUA+VwW96dqPOLPmks3rkx7oM8OVe4n2X28l8Kpwm+ojvG43RWYEYfUKCanKDqwC4Fg6Yc8/8mL1QaDirfine41uxfl11iItkijWIt1bBD+d375luPwxBvYi52W6K4Nh2d2VHv8nE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101157; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=mUai5IOd+nk/9EXVKOs8Nw1OnO26tcrFnLS0BvRxlDw=; b=lj0KK4JFFKh+i9RlGxwedtUKdtcaIm5Kb4hCdkbkeZBcKfLdCygy91pNqI2iPZ+dA05qfiv73zs1VvzMLoBrborZOterbGG5BLj7oOfH253w1/EoQ8ZyjXJdDv+kjPTk6ooyW49TgsvDNp51q9VmQuedud3ovXF/9W5r88bKSUA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101157952683.5491333075473; Tue, 18 Oct 2022 06:52:37 -0700 (PDT) Received: from localhost ([::1]:40186 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn1H-0002vT-Hh for importer@patchew.org; Tue, 18 Oct 2022 09:52:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58664) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgs-0002Lu-M7 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:33 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:46845) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgm-00051Q-Vx for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:26 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-130-Sayw47-HNx2OXqAB7rBH5A-1; Tue, 18 Oct 2022 09:31:19 -0400 Received: by mail-ej1-f70.google.com with SMTP id sb13-20020a1709076d8d00b0078d8e1f6f7aso6393185ejc.8 for ; Tue, 18 Oct 2022 06:31:19 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id l3-20020aa7cac3000000b0045723aa48ccsm8755833edt.93.2022.10.18.06.31.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099883; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mUai5IOd+nk/9EXVKOs8Nw1OnO26tcrFnLS0BvRxlDw=; b=XymxH6wVwjvqVhnhnJYrIC14H8IjxjwY2+Erm8cVz3b2kHV/czLuvRTRFW4aQ9OgVmj8vv 1qMuUrpRn9zbmKofPiiME9rKeVkvGPR8ceSWwfcdMKpMSUbwMcLAS6gJAvnImkGpySzCSe 3db7DkOYoFVIYmecPg3Sy70BOPllJBc= X-MC-Unique: Sayw47-HNx2OXqAB7rBH5A-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mUai5IOd+nk/9EXVKOs8Nw1OnO26tcrFnLS0BvRxlDw=; b=Hu7Ak/fdiXul6JNWodBzxFqaiMxOiqV8vJqPp/nSZBf2bqUaSmaViUXr3EoJNuXZhu BBmHlwUh5cA6y+Fm+a6EjB7wIrm7AwT7XZYa0iur7KxrJujknEPk+//rEGaAT+Uv+EV2 iceuj9YRkqU7Vd7/iv33q9kIchiss9GmpkXQ4AomsxTn3LOr7ACB4Q3ODxeoOZzC5AAj o/bTpWZEI6gkGAOjepzC8V/rR8sYx4Z0CZaHD02Z4MGqJI8obXO9UQyZTQYFmdKniYtj 2oammwNYRJ+857wKwlyEhdnHgVrzgB0eyNb2S1t84Oqm5hF79jHV8xBhD9zvT7UXZyq8 nRmQ== X-Gm-Message-State: ACrzQf3lv8UPrlAEH40VmBWaq6BGHxKqMdkmwDprTqvEWAit7URiTboA 56ucofgspJVeYfgyeeHYmNTFsJkUC6EeXsIycev2Q3wtNXzcmFepuyDjKKPU8Eb7jAOikBSE92W irQb4kOo26TPkOq2wnpOcFrF5yruYOVRoCVAh7C7ujIhWAQUG6GJov32KUBH2ZpQvy1s= X-Received: by 2002:aa7:d7c5:0:b0:459:fad8:fd2 with SMTP id e5-20020aa7d7c5000000b00459fad80fd2mr2670396eds.336.1666099877872; Tue, 18 Oct 2022 06:31:17 -0700 (PDT) X-Google-Smtp-Source: AMsMyM67O7pGcZPkfNEWhZEjsQkGAosDsBgv16mUC4VxHL6z4BWi65ps231EKejKFAvtcbiht8Ld3Q== X-Received: by 2002:aa7:d7c5:0:b0:459:fad8:fd2 with SMTP id e5-20020aa7d7c5000000b00459fad80fd2mr2670376eds.336.1666099877527; Tue, 18 Oct 2022 06:31:17 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 09/53] target/i386: Use MMUAccessType across excp_helper.c Date: Tue, 18 Oct 2022 15:29:58 +0200 Message-Id: <20221018133042.856368-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101159667100003 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Replace int is_write1 and magic numbers with the proper MMUAccessType access_type and enumerators. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-2-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 796dc2a1f3..eee59aa977 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -30,8 +30,10 @@ typedef hwaddr (*MMUTranslateFunc)(CPUState *cs, hwaddr = gphys, MMUAccessType acc #define GET_HPHYS(cs, gpa, access_type, prot) \ (get_hphys_func ? get_hphys_func(cs, gpa, access_type, prot) : gpa) =20 -static int mmu_translate(CPUState *cs, hwaddr addr, MMUTranslateFunc get_h= phys_func, - uint64_t cr3, int is_write1, int mmu_idx, int pg_= mode, +static int mmu_translate(CPUState *cs, hwaddr addr, + MMUTranslateFunc get_hphys_func, + uint64_t cr3, MMUAccessType access_type, + int mmu_idx, int pg_mode, hwaddr *xlat, int *page_size, int *prot) { X86CPU *cpu =3D X86_CPU(cs); @@ -40,13 +42,13 @@ static int mmu_translate(CPUState *cs, hwaddr addr, MMU= TranslateFunc get_hphys_f int32_t a20_mask; target_ulong pde_addr, pte_addr; int error_code =3D 0; - int is_dirty, is_write, is_user; + bool is_dirty, is_write, is_user; uint64_t rsvd_mask =3D PG_ADDRESS_MASK & ~MAKE_64BIT_MASK(0, cpu->phys= _bits); uint32_t page_offset; uint32_t pkr; =20 is_user =3D (mmu_idx =3D=3D MMU_USER_IDX); - is_write =3D is_write1 & 1; + is_write =3D (access_type =3D=3D MMU_DATA_STORE); a20_mask =3D x86_get_a20_mask(env); =20 if (!(pg_mode & PG_MODE_NXE)) { @@ -264,14 +266,14 @@ do_check_protect_pse36: } =20 *prot &=3D pkr_prot; - if ((pkr_prot & (1 << is_write1)) =3D=3D 0) { - assert(is_write1 !=3D 2); + if ((pkr_prot & (1 << access_type)) =3D=3D 0) { + assert(access_type !=3D MMU_INST_FETCH); error_code |=3D PG_ERROR_PK_MASK; goto do_fault_protect; } } =20 - if ((*prot & (1 << is_write1)) =3D=3D 0) { + if ((*prot & (1 << access_type)) =3D=3D 0) { goto do_fault_protect; } =20 @@ -297,7 +299,7 @@ do_check_protect_pse36: /* align to page_size */ pte &=3D PG_ADDRESS_MASK & ~(*page_size - 1); page_offset =3D addr & (*page_size - 1); - *xlat =3D GET_HPHYS(cs, pte + page_offset, is_write1, prot); + *xlat =3D GET_HPHYS(cs, pte + page_offset, access_type, prot); return PG_ERROR_OK; =20 do_fault_rsvd: @@ -308,7 +310,7 @@ do_check_protect_pse36: error_code |=3D (is_write << PG_ERROR_W_BIT); if (is_user) error_code |=3D PG_ERROR_U_MASK; - if (is_write1 =3D=3D 2 && + if (access_type =3D=3D MMU_INST_FETCH && ((pg_mode & PG_MODE_NXE) || (pg_mode & PG_MODE_SMEP))) error_code |=3D PG_ERROR_I_D_MASK; return error_code; @@ -353,7 +355,7 @@ hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAccessT= ype access_type, * 1 =3D generate PF fault */ static int handle_mmu_fault(CPUState *cs, vaddr addr, int size, - int is_write1, int mmu_idx) + MMUAccessType access_type, int mmu_idx) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; @@ -365,7 +367,7 @@ static int handle_mmu_fault(CPUState *cs, vaddr addr, i= nt size, =20 #if defined(DEBUG_MMU) printf("MMU fault: addr=3D%" VADDR_PRIx " w=3D%d mmu=3D%d eip=3D" TARG= ET_FMT_lx "\n", - addr, is_write1, mmu_idx, env->eip); + addr, access_type, mmu_idx, env->eip); #endif =20 if (!(env->cr[0] & CR0_PG_MASK)) { @@ -393,7 +395,7 @@ static int handle_mmu_fault(CPUState *cs, vaddr addr, i= nt size, } } =20 - error_code =3D mmu_translate(cs, addr, get_hphys, env->cr[3], is_w= rite1, + error_code =3D mmu_translate(cs, addr, get_hphys, env->cr[3], acce= ss_type, mmu_idx, pg_mode, &paddr, &page_size, &prot); } @@ -404,7 +406,7 @@ static int handle_mmu_fault(CPUState *cs, vaddr addr, i= nt size, vaddr =3D addr & TARGET_PAGE_MASK; paddr &=3D TARGET_PAGE_MASK; =20 - assert(prot & (1 << is_write1)); + assert(prot & (1 << access_type)); tlb_set_page_with_attrs(cs, vaddr, paddr, cpu_get_mem_attrs(env), prot, mmu_idx, page_size); return 0; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101060; cv=none; d=zohomail.com; s=zohoarc; b=j4Bxyyw7bVUrMiByHvGGVwU0+utU735/w0ygHg6fmJMDpU/6pTc1Dsrm2w/71hzV1bPtaWEvCzfuiNh6ez3c/Wcb/MXQTCWAWZDs5OaXUPbEshMRkSDKZFIJtt/TeMwTUaTbKrA2KWbuI6f1Vj6vbQN5mKd4CJhBM85FNI+90/o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101060; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=osh32bXliqc9+xMnWun8jK/3xeIfkSUICao8CeLnwxs=; b=bOD3eZ9MvN4ykxt1ppo+zWZJQ3h5BuNTijacX7TT4B3hKlyXzXTz6rvJB+rr9XfGUx5PxfYu7IisCYtGlulIDnmAkZnK9Qp5J4J/RtvP2DzHRawyDP0Mu9dew/JmPuk5O71j+ql3WR06We0vkBeRjXYuHptU2XdkO+zi+XChudQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101060206411.74601845142524; Tue, 18 Oct 2022 06:51:00 -0700 (PDT) Received: from localhost ([::1]:48824 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmzJ-0007ZP-Rj for importer@patchew.org; Tue, 18 Oct 2022 09:50:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58666) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgw-0002MR-OW for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:36 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:48793) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgn-00051c-6M for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:27 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-490-SgFASPUdNuyk9hXbI676CQ-1; Tue, 18 Oct 2022 09:31:22 -0400 Received: by mail-ed1-f72.google.com with SMTP id z7-20020a05640235c700b0045d3841ccf2so8252724edc.9 for ; Tue, 18 Oct 2022 06:31:22 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id c7-20020aa7d607000000b0045d74aa401fsm4920636edr.60.2022.10.18.06.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099884; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=osh32bXliqc9+xMnWun8jK/3xeIfkSUICao8CeLnwxs=; b=FHp1e/FWgd3FcguqxAOS4svEpoAdMWgEGXkJ6P0Vvr1ZRk1u2O3dH1aWUYsvefQ4VgGQOj wP/LxUL3FkL/HUUcnEtLEvv737Lm2isvSfgQDcwIp+x60Vrh/7q/2NwY5rHWuF2JivbXSe Y762jlbF7ZBBooS3PCPUdDbQyrBKPig= X-MC-Unique: SgFASPUdNuyk9hXbI676CQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=osh32bXliqc9+xMnWun8jK/3xeIfkSUICao8CeLnwxs=; b=lA3snfSlbxstdhIjTXxedif4T+aDNgCtG1j8/FBBGm7jN2id3gxCul5XxsPu/1uVsK GXhqbkZ55+fdDSN2wqHooaU0Zvu4KnOKTqI8SiJtxfqAXX6Ayy8HaeQWNco6j52wxjQW 6Ja1d0eLLrBj8YfcCEfsM07xt5ub5c/Ydo+e2nALzLYJfGDDzhB3at8q4cFX+7c+8brL DHugEeaWEJSUiasyNEvCVdkHRrHSe9b/fZAvizI254Trv6W+G2PyJT2FNouktUFWdPxt yh5WIQGTcGubwBl5neuKghKJnlmw1n8y4DeOcdZSaS0Y4sX47TtbzVt/X/kPDC3OnO8G wwww== X-Gm-Message-State: ACrzQf3Z6gH6fE8lgrjTuQkYe2YKy8IJI8B/yvKMgNQeihv9jps/3Gat IuGRJj2ar0It6lpunBHVmVJNbUCneRj8YeNZKTGJsX93Bz/cCko2Te5jTkgf2xCHYc7a/uvfc6N dMcGI1qNGggTx1m7qy3PldOXlqBM6nLxcucMHMffT4YY8oAKSZaG3DnmYftY5AWXZW9Y= X-Received: by 2002:a05:6402:3592:b0:45c:fb8a:c57d with SMTP id y18-20020a056402359200b0045cfb8ac57dmr2661382edc.290.1666099880987; Tue, 18 Oct 2022 06:31:20 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5qaaETNP6oyLL98sLrwU/MrlHSY2Mj00/dGUAi3M34yAMAor5OfvVNK0zXxsLYwydg0V1bNA== X-Received: by 2002:a05:6402:3592:b0:45c:fb8a:c57d with SMTP id y18-20020a056402359200b0045cfb8ac57dmr2661355edc.290.1666099880662; Tue, 18 Oct 2022 06:31:20 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 10/53] target/i386: Direct call get_hphys from mmu_translate Date: Tue, 18 Oct 2022 15:29:59 +0200 Message-Id: <20221018133042.856368-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101061014100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Use a boolean to control the call to get_hphys instead of passing a null function pointer. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-3-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index eee59aa977..c9f6afba29 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -24,14 +24,10 @@ =20 #define PG_ERROR_OK (-1) =20 -typedef hwaddr (*MMUTranslateFunc)(CPUState *cs, hwaddr gphys, MMUAccessTy= pe access_type, - int *prot); - #define GET_HPHYS(cs, gpa, access_type, prot) \ - (get_hphys_func ? get_hphys_func(cs, gpa, access_type, prot) : gpa) + (use_stage2 ? get_hphys(cs, gpa, access_type, prot) : gpa) =20 -static int mmu_translate(CPUState *cs, hwaddr addr, - MMUTranslateFunc get_hphys_func, +static int mmu_translate(CPUState *cs, hwaddr addr, bool use_stage2, uint64_t cr3, MMUAccessType access_type, int mmu_idx, int pg_mode, hwaddr *xlat, int *page_size, int *prot) @@ -329,7 +325,7 @@ hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAccessT= ype access_type, return gphys; } =20 - exit_info_1 =3D mmu_translate(cs, gphys, NULL, env->nested_cr3, + exit_info_1 =3D mmu_translate(cs, gphys, false, env->nested_cr3, access_type, MMU_USER_IDX, env->nested_pg_m= ode, &hphys, &page_size, &next_prot); if (exit_info_1 =3D=3D PG_ERROR_OK) { @@ -395,7 +391,7 @@ static int handle_mmu_fault(CPUState *cs, vaddr addr, i= nt size, } } =20 - error_code =3D mmu_translate(cs, addr, get_hphys, env->cr[3], acce= ss_type, + error_code =3D mmu_translate(cs, addr, true, env->cr[3], access_ty= pe, mmu_idx, pg_mode, &paddr, &page_size, &prot); } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101024; cv=none; d=zohomail.com; s=zohoarc; b=GYOST15PVqZ/x7NvDSItbzS+EhKhHSFZBpwp46HY4RA5KnZHvqfbZIvGsgxPsYIOdiOkuiWipxVa8p0mhYIPD6NPeTC3ke9i/AGMPfhPM+f4YLftYgp/EqMeWLg4eYXU0iECF6UYvGt/DfAlhjJ4UhsswTVYW0ok3zCbpKCvYV8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101024; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=7GlNJgsioKslIdmrxmiJZ4WhdvbvaVSXmj8KiecNkqU=; b=EE+3rVwOZsJEAyQNg3TpBQPoC8YpvIz+NPyekPOAl+y5BRw7gE3eBxvLVI5jyzzbMhsVbJAWbd0l+ziGa/hLTvEn2B41zXNTzYz66bRuqYoK3Uv5dRhma1asdHyvd2a0DWQxZVmJZZ2w2YC7MYWsOhyJCwIsFPhFbWySYO+OInU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101024479232.2164288619167; Tue, 18 Oct 2022 06:50:24 -0700 (PDT) Received: from localhost ([::1]:52458 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmz8-0006HZ-Vw for importer@patchew.org; Tue, 18 Oct 2022 09:50:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37160) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgz-0002P5-S9 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:37 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:51352) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgw-00051k-Hy for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:37 -0400 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-172-wj3L28IpOqaD370yTvh24Q-1; Tue, 18 Oct 2022 09:31:26 -0400 Received: by mail-ej1-f69.google.com with SMTP id hp41-20020a1709073e2900b0078e07dbf280so6356085ejc.7 for ; Tue, 18 Oct 2022 06:31:25 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id u22-20020a056402111600b00458dc7e8ecasm8908646edv.72.2022.10.18.06.31.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099887; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7GlNJgsioKslIdmrxmiJZ4WhdvbvaVSXmj8KiecNkqU=; b=P98gaWLyWcFoIOEKM9uv+MxinX/+gecLfyljZCjNOpTIFsbQMZb6HJUO6wcoVpbHBI25i2 GrnYCDbQ+JaS8JDOAkL5cacc9GbFWlaCvnZmSAstlOiZO+t3EVfI58IbZcdMci14FNZwXK Gos/MdqsMzgb2sYihmz7fnzauTr37gU= X-MC-Unique: wj3L28IpOqaD370yTvh24Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7GlNJgsioKslIdmrxmiJZ4WhdvbvaVSXmj8KiecNkqU=; b=B7xOEYm20cqfihoCB+i2BwcnKsj6sfYMWBo66TfT/0hO5AIzoCAV4jmXdsJIdlydpx 7IfTf7mK+gFdVBte8VyYJy/k++edRRrEXgsHRGf6UTDNrpytRmQ98gS8o3HELL7D+/cf gxAsr4YDe4L0wbniIjFreAEktyhByoCvWPVKApKgthCunPYfMRa043pQk71byZUJK/OT BXpqjnKb1eKxpR5BYBwiniArmX3O3ENVAOqquzoJmOjEPlD2XXwmmQfoIq+GOFknO3UN WPTpq6OnWFazpCH9mMzeKVKJUyw2SSDCijioylNbJq2VrQlk1Mi/sHCK8fc0hvXqAsIW /EnA== X-Gm-Message-State: ACrzQf195T7HrLy5gjRzTAe8QerLazTU/xII2dvsMFNWQtraUHAtY4HP SknIzl7o7t5DPRbWpiSEEOJ2/3l71tyEwK6ueRgzjHhPopCP0OcDIpXjHfZVwzc1DdEzFEYQhOr iv+mn6tXYV8w3axGXLSzRnEqyS85uNmlG/BU7+44BGaYtygjHVacmZ5QRl4pfy08ouVM= X-Received: by 2002:a17:907:7d8e:b0:78d:ed30:643b with SMTP id oz14-20020a1709077d8e00b0078ded30643bmr2397407ejc.253.1666099884282; Tue, 18 Oct 2022 06:31:24 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5Y47GBmPSF7HLSey59hh0SNaARC3F7nCOEhngeW3Tar+vJojtD12e8yBgV07KNbEZ1V9uLGQ== X-Received: by 2002:a17:907:7d8e:b0:78d:ed30:643b with SMTP id oz14-20020a1709077d8e00b0078ded30643bmr2397365ejc.253.1666099883793; Tue, 18 Oct 2022 06:31:23 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 11/53] target/i386: Introduce structures for mmu_translate Date: Tue, 18 Oct 2022 15:30:00 +0200 Message-Id: <20221018133042.856368-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101026879100003 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Create TranslateParams for inputs, TranslateResults for successful outputs, and TranslateFault for error outputs; return true on success. Move stage1 error paths from handle_mmu_fault to x86_cpu_tlb_fill; reorg the rest of handle_mmu_fault into get_physical_address. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-4-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 322 ++++++++++++++------------- 1 file changed, 171 insertions(+), 151 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index c9f6afba29..00ce4cf253 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -22,30 +22,45 @@ #include "exec/exec-all.h" #include "tcg/helper-tcg.h" =20 -#define PG_ERROR_OK (-1) +typedef struct TranslateParams { + target_ulong addr; + target_ulong cr3; + int pg_mode; + int mmu_idx; + MMUAccessType access_type; + bool use_stage2; +} TranslateParams; + +typedef struct TranslateResult { + hwaddr paddr; + int prot; + int page_size; +} TranslateResult; + +typedef struct TranslateFault { + int exception_index; + int error_code; + target_ulong cr2; +} TranslateFault; =20 #define GET_HPHYS(cs, gpa, access_type, prot) \ - (use_stage2 ? get_hphys(cs, gpa, access_type, prot) : gpa) + (in->use_stage2 ? get_hphys(cs, gpa, access_type, prot) : gpa) =20 -static int mmu_translate(CPUState *cs, hwaddr addr, bool use_stage2, - uint64_t cr3, MMUAccessType access_type, - int mmu_idx, int pg_mode, - hwaddr *xlat, int *page_size, int *prot) +static bool mmu_translate(CPUX86State *env, const TranslateParams *in, + TranslateResult *out, TranslateFault *err) { - X86CPU *cpu =3D X86_CPU(cs); - CPUX86State *env =3D &cpu->env; + CPUState *cs =3D env_cpu(env); + X86CPU *cpu =3D env_archcpu(env); + const int32_t a20_mask =3D x86_get_a20_mask(env); + const target_ulong addr =3D in->addr; + const int pg_mode =3D in->pg_mode; + const bool is_user =3D (in->mmu_idx =3D=3D MMU_USER_IDX); + const MMUAccessType access_type =3D in->access_type; uint64_t ptep, pte; - int32_t a20_mask; - target_ulong pde_addr, pte_addr; - int error_code =3D 0; - bool is_dirty, is_write, is_user; + hwaddr pde_addr, pte_addr; uint64_t rsvd_mask =3D PG_ADDRESS_MASK & ~MAKE_64BIT_MASK(0, cpu->phys= _bits); - uint32_t page_offset; uint32_t pkr; - - is_user =3D (mmu_idx =3D=3D MMU_USER_IDX); - is_write =3D (access_type =3D=3D MMU_DATA_STORE); - a20_mask =3D x86_get_a20_mask(env); + int page_size; =20 if (!(pg_mode & PG_MODE_NXE)) { rsvd_mask |=3D PG_NX_MASK; @@ -62,7 +77,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, bool = use_stage2, uint64_t pml4e_addr, pml4e; =20 if (la57) { - pml5e_addr =3D ((cr3 & ~0xfff) + + pml5e_addr =3D ((in->cr3 & ~0xfff) + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; pml5e_addr =3D GET_HPHYS(cs, pml5e_addr, MMU_DATA_STORE, N= ULL); pml5e =3D x86_ldq_phys(cs, pml5e_addr); @@ -78,7 +93,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, bool = use_stage2, } ptep =3D pml5e ^ PG_NX_MASK; } else { - pml5e =3D cr3; + pml5e =3D in->cr3; ptep =3D PG_NX_MASK | PG_USER_MASK | PG_RW_MASK; } =20 @@ -114,7 +129,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, boo= l use_stage2, } if (pdpe & PG_PSE_MASK) { /* 1 GB page */ - *page_size =3D 1024 * 1024 * 1024; + page_size =3D 1024 * 1024 * 1024; pte_addr =3D pdpe_addr; pte =3D pdpe; goto do_check_protect; @@ -123,7 +138,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, boo= l use_stage2, #endif { /* XXX: load them when cr3 is loaded ? */ - pdpe_addr =3D ((cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & + pdpe_addr =3D ((in->cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & a20_mask; pdpe_addr =3D GET_HPHYS(cs, pdpe_addr, MMU_DATA_STORE, NULL); pdpe =3D x86_ldq_phys(cs, pdpe_addr); @@ -150,7 +165,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, boo= l use_stage2, ptep &=3D pde ^ PG_NX_MASK; if (pde & PG_PSE_MASK) { /* 2 MB page */ - *page_size =3D 2048 * 1024; + page_size =3D 2048 * 1024; pte_addr =3D pde_addr; pte =3D pde; goto do_check_protect; @@ -172,12 +187,12 @@ static int mmu_translate(CPUState *cs, hwaddr addr, b= ool use_stage2, } /* combine pde and pte nx, user and rw protections */ ptep &=3D pte ^ PG_NX_MASK; - *page_size =3D 4096; + page_size =3D 4096; } else { uint32_t pde; =20 /* page directory entry */ - pde_addr =3D ((cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & + pde_addr =3D ((in->cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & a20_mask; pde_addr =3D GET_HPHYS(cs, pde_addr, MMU_DATA_STORE, NULL); pde =3D x86_ldl_phys(cs, pde_addr); @@ -188,7 +203,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, boo= l use_stage2, =20 /* if PSE bit is set, then we use a 4MB page */ if ((pde & PG_PSE_MASK) && (pg_mode & PG_MODE_PSE)) { - *page_size =3D 4096 * 1024; + page_size =3D 4096 * 1024; pte_addr =3D pde_addr; =20 /* Bits 20-13 provide bits 39-32 of the address, bit 21 is res= erved. @@ -214,12 +229,12 @@ static int mmu_translate(CPUState *cs, hwaddr addr, b= ool use_stage2, } /* combine pde and pte user and rw protections */ ptep &=3D pte | PG_NX_MASK; - *page_size =3D 4096; + page_size =3D 4096; rsvd_mask =3D 0; } =20 do_check_protect: - rsvd_mask |=3D (*page_size - 1) & PG_ADDRESS_MASK & ~PG_PSE_PAT_MASK; + rsvd_mask |=3D (page_size - 1) & PG_ADDRESS_MASK & ~PG_PSE_PAT_MASK; do_check_protect_pse36: if (pte & rsvd_mask) { goto do_fault_rsvd; @@ -231,17 +246,17 @@ do_check_protect_pse36: goto do_fault_protect; } =20 - *prot =3D 0; - if (mmu_idx !=3D MMU_KSMAP_IDX || !(ptep & PG_USER_MASK)) { - *prot |=3D PAGE_READ; + int prot =3D 0; + if (in->mmu_idx !=3D MMU_KSMAP_IDX || !(ptep & PG_USER_MASK)) { + prot |=3D PAGE_READ; if ((ptep & PG_RW_MASK) || !(is_user || (pg_mode & PG_MODE_WP))) { - *prot |=3D PAGE_WRITE; + prot |=3D PAGE_WRITE; } } if (!(ptep & PG_NX_MASK) && - (mmu_idx =3D=3D MMU_USER_IDX || + (is_user || !((pg_mode & PG_MODE_SMEP) && (ptep & PG_USER_MASK)))) { - *prot |=3D PAGE_EXEC; + prot |=3D PAGE_EXEC; } =20 if (ptep & PG_USER_MASK) { @@ -260,164 +275,151 @@ do_check_protect_pse36: } else if (pkr_wd && (is_user || (pg_mode & PG_MODE_WP))) { pkr_prot &=3D ~PAGE_WRITE; } - - *prot &=3D pkr_prot; if ((pkr_prot & (1 << access_type)) =3D=3D 0) { - assert(access_type !=3D MMU_INST_FETCH); - error_code |=3D PG_ERROR_PK_MASK; - goto do_fault_protect; + goto do_fault_pk_protect; } + prot &=3D pkr_prot; } =20 - if ((*prot & (1 << access_type)) =3D=3D 0) { + if ((prot & (1 << access_type)) =3D=3D 0) { goto do_fault_protect; } =20 /* yes, it can! */ - is_dirty =3D is_write && !(pte & PG_DIRTY_MASK); - if (!(pte & PG_ACCESSED_MASK) || is_dirty) { - pte |=3D PG_ACCESSED_MASK; - if (is_dirty) { - pte |=3D PG_DIRTY_MASK; + { + uint32_t set =3D PG_ACCESSED_MASK; + if (access_type =3D=3D MMU_DATA_STORE) { + set |=3D PG_DIRTY_MASK; + } + if (set & ~pte) { + pte |=3D set; + x86_stl_phys_notdirty(cs, pte_addr, pte); } - x86_stl_phys_notdirty(cs, pte_addr, pte); } =20 if (!(pte & PG_DIRTY_MASK)) { /* only set write access if already dirty... otherwise wait for dirty access */ - assert(!is_write); - *prot &=3D ~PAGE_WRITE; + assert(access_type !=3D MMU_DATA_STORE); + prot &=3D ~PAGE_WRITE; } - - pte =3D pte & a20_mask; + out->prot =3D prot; + out->page_size =3D page_size; =20 /* align to page_size */ - pte &=3D PG_ADDRESS_MASK & ~(*page_size - 1); - page_offset =3D addr & (*page_size - 1); - *xlat =3D GET_HPHYS(cs, pte + page_offset, access_type, prot); - return PG_ERROR_OK; + out->paddr =3D (pte & a20_mask & PG_ADDRESS_MASK & ~(page_size - 1)) + | (addr & (page_size - 1)); + out->paddr =3D GET_HPHYS(cs, out->paddr, access_type, &out->prot); + return true; =20 + int error_code; do_fault_rsvd: - error_code |=3D PG_ERROR_RSVD_MASK; + error_code =3D PG_ERROR_RSVD_MASK; + goto do_fault_cont; do_fault_protect: - error_code |=3D PG_ERROR_P_MASK; + error_code =3D PG_ERROR_P_MASK; + goto do_fault_cont; + do_fault_pk_protect: + assert(access_type !=3D MMU_INST_FETCH); + error_code =3D PG_ERROR_PK_MASK | PG_ERROR_P_MASK; + goto do_fault_cont; do_fault: - error_code |=3D (is_write << PG_ERROR_W_BIT); - if (is_user) + error_code =3D 0; + do_fault_cont: + if (is_user) { error_code |=3D PG_ERROR_U_MASK; - if (access_type =3D=3D MMU_INST_FETCH && - ((pg_mode & PG_MODE_NXE) || (pg_mode & PG_MODE_SMEP))) - error_code |=3D PG_ERROR_I_D_MASK; - return error_code; + } + switch (access_type) { + case MMU_DATA_LOAD: + break; + case MMU_DATA_STORE: + error_code |=3D PG_ERROR_W_MASK; + break; + case MMU_INST_FETCH: + if (pg_mode & (PG_MODE_NXE | PG_MODE_SMEP)) { + error_code |=3D PG_ERROR_I_D_MASK; + } + break; + } + err->exception_index =3D EXCP0E_PAGE; + err->error_code =3D error_code; + err->cr2 =3D addr; + return false; } =20 hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAccessType access_type, - int *prot) + int *prot) { CPUX86State *env =3D &X86_CPU(cs)->env; - uint64_t exit_info_1; - int page_size; - int next_prot; - hwaddr hphys; =20 if (likely(!(env->hflags2 & HF2_NPT_MASK))) { return gphys; - } + } else { + TranslateParams in =3D { + .addr =3D gphys, + .cr3 =3D env->nested_cr3, + .pg_mode =3D env->nested_pg_mode, + .mmu_idx =3D MMU_USER_IDX, + .access_type =3D access_type, + .use_stage2 =3D false, + }; + TranslateResult out; + TranslateFault err; + uint64_t exit_info_1; =20 - exit_info_1 =3D mmu_translate(cs, gphys, false, env->nested_cr3, - access_type, MMU_USER_IDX, env->nested_pg_m= ode, - &hphys, &page_size, &next_prot); - if (exit_info_1 =3D=3D PG_ERROR_OK) { - if (prot) { - *prot &=3D next_prot; + if (mmu_translate(env, &in, &out, &err)) { + if (prot) { + *prot &=3D out.prot; + } + return out.paddr; } - return hphys; - } =20 - x86_stq_phys(cs, env->vm_vmcb + offsetof(struct vmcb, control.exit_inf= o_2), - gphys); - if (prot) { - exit_info_1 |=3D SVM_NPTEXIT_GPA; - } else { /* page table access */ - exit_info_1 |=3D SVM_NPTEXIT_GPT; + x86_stq_phys(cs, env->vm_vmcb + + offsetof(struct vmcb, control.exit_info_2), gphys); + exit_info_1 =3D err.error_code + | (prot ? SVM_NPTEXIT_GPA : SVM_NPTEXIT_GPT); + cpu_vmexit(env, SVM_EXIT_NPF, exit_info_1, env->retaddr); } - cpu_vmexit(env, SVM_EXIT_NPF, exit_info_1, env->retaddr); } =20 -/* return value: - * -1 =3D cannot handle fault - * 0 =3D nothing more to do - * 1 =3D generate PF fault - */ -static int handle_mmu_fault(CPUState *cs, vaddr addr, int size, - MMUAccessType access_type, int mmu_idx) +static bool get_physical_address(CPUX86State *env, vaddr addr, + MMUAccessType access_type, int mmu_idx, + TranslateResult *out, TranslateFault *err) { - X86CPU *cpu =3D X86_CPU(cs); - CPUX86State *env =3D &cpu->env; - int error_code =3D PG_ERROR_OK; - int pg_mode, prot, page_size; - int32_t a20_mask; - hwaddr paddr; - hwaddr vaddr; - -#if defined(DEBUG_MMU) - printf("MMU fault: addr=3D%" VADDR_PRIx " w=3D%d mmu=3D%d eip=3D" TARG= ET_FMT_lx "\n", - addr, access_type, mmu_idx, env->eip); -#endif - if (!(env->cr[0] & CR0_PG_MASK)) { - a20_mask =3D x86_get_a20_mask(env); - paddr =3D addr & a20_mask; + out->paddr =3D addr & x86_get_a20_mask(env); + #ifdef TARGET_X86_64 if (!(env->hflags & HF_LMA_MASK)) { /* Without long mode we can only address 32bits in real mode */ - paddr =3D (uint32_t)paddr; + out->paddr =3D (uint32_t)out->paddr; } #endif - prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; - page_size =3D 4096; + out->prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + out->page_size =3D TARGET_PAGE_SIZE; + return true; } else { - pg_mode =3D get_pg_mode(env); - if (pg_mode & PG_MODE_LMA) { - int32_t sext; + TranslateParams in =3D { + .addr =3D addr, + .cr3 =3D env->cr[3], + .pg_mode =3D get_pg_mode(env), + .mmu_idx =3D mmu_idx, + .access_type =3D access_type, + .use_stage2 =3D true + }; =20 + if (in.pg_mode & PG_MODE_LMA) { /* test virtual address sign extension */ - sext =3D (int64_t)addr >> (pg_mode & PG_MODE_LA57 ? 56 : 47); + int shift =3D in.pg_mode & PG_MODE_LA57 ? 56 : 47; + int64_t sext =3D (int64_t)addr >> shift; if (sext !=3D 0 && sext !=3D -1) { - env->error_code =3D 0; - cs->exception_index =3D EXCP0D_GPF; - return 1; + err->exception_index =3D EXCP0D_GPF; + err->error_code =3D 0; + err->cr2 =3D addr; + return false; } } - - error_code =3D mmu_translate(cs, addr, true, env->cr[3], access_ty= pe, - mmu_idx, pg_mode, - &paddr, &page_size, &prot); - } - - if (error_code =3D=3D PG_ERROR_OK) { - /* Even if 4MB pages, we map only one 4KB page in the cache to - avoid filling it too fast */ - vaddr =3D addr & TARGET_PAGE_MASK; - paddr &=3D TARGET_PAGE_MASK; - - assert(prot & (1 << access_type)); - tlb_set_page_with_attrs(cs, vaddr, paddr, cpu_get_mem_attrs(env), - prot, mmu_idx, page_size); - return 0; - } else { - if (env->intercept_exceptions & (1 << EXCP0E_PAGE)) { - /* cr2 is not modified in case of exceptions */ - x86_stq_phys(cs, - env->vm_vmcb + offsetof(struct vmcb, control.exit_inf= o_2), - addr); - } else { - env->cr[2] =3D addr; - } - env->error_code =3D error_code; - cs->exception_index =3D EXCP0E_PAGE; - return 1; + return mmu_translate(env, &in, out, err); } } =20 @@ -425,17 +427,35 @@ bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int s= ize, MMUAccessType access_type, int mmu_idx, bool probe, uintptr_t retaddr) { - X86CPU *cpu =3D X86_CPU(cs); - CPUX86State *env =3D &cpu->env; + CPUX86State *env =3D cs->env_ptr; + TranslateResult out; + TranslateFault err; =20 - env->retaddr =3D retaddr; - if (handle_mmu_fault(cs, addr, size, access_type, mmu_idx)) { - /* FIXME: On error in get_hphys we have already jumped out. */ - g_assert(!probe); - raise_exception_err_ra(env, cs->exception_index, - env->error_code, retaddr); + if (get_physical_address(env, addr, access_type, mmu_idx, &out, &err))= { + /* + * Even if 4MB pages, we map only one 4KB page in the cache to + * avoid filling it too fast. + */ + assert(out.prot & (1 << access_type)); + tlb_set_page_with_attrs(cs, addr & TARGET_PAGE_MASK, + out.paddr & TARGET_PAGE_MASK, + cpu_get_mem_attrs(env), + out.prot, mmu_idx, out.page_size); + return true; } - return true; + + /* FIXME: On error in get_hphys we have already jumped out. */ + g_assert(!probe); + + if (env->intercept_exceptions & (1 << err.exception_index)) { + /* cr2 is not modified in case of exceptions */ + x86_stq_phys(cs, env->vm_vmcb + + offsetof(struct vmcb, control.exit_info_2), + err.cr2); + } else { + env->cr[2] =3D err.cr2; + } + raise_exception_err_ra(env, err.exception_index, err.error_code, retad= dr); } =20 G_NORETURN void x86_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101030; cv=none; d=zohomail.com; s=zohoarc; b=iiLpO23ADMZWXyReZ4Qx2MrH4QSiPsEdzUWnbtxwukaJfFDViaY4C3H/USfUWsh/50U4hq9NpaqsvC8JsInNp0axklkv+r9YRl3W93JLxm/BgvfqNDCUUI7x2+IEDWUz6z9XPfRZl2PqUoPyGPFHxD27O5CDT8yvlrfJfIk7Pug= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101030; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/E80xi7+DHvPCJRY31HtVvxNIdUIG8v2vBsVZ9TVoa0=; b=PDeK0VJOhSCeozrDb0zLJT8lAp1yk61nRy6aD0I7EraWZC8q7lTxxxR/HAykpwWTt8ikiRayQSftkmK80bM68XREF01e0ftCq/Is9TTcFVQUwDzaiSVismxR0+BeaotCM2H+wV34Ysr+of2nShezbkPNrEt8gQQQfA8A4d5CSi0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101030161743.2869222330053; Tue, 18 Oct 2022 06:50:30 -0700 (PDT) Received: from localhost ([::1]:57982 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmzC-0007Db-Ex for importer@patchew.org; Tue, 18 Oct 2022 09:50:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37158) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgy-0002NP-T4 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:37 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:43703) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgw-00051t-Hx for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:36 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-390-sbg_BKqsMLWPz2sPAdlEFg-1; Tue, 18 Oct 2022 09:31:28 -0400 Received: by mail-ed1-f72.google.com with SMTP id w1-20020a056402268100b0045d06ea5575so10241546edd.6 for ; Tue, 18 Oct 2022 06:31:28 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id p18-20020a17090653d200b0073dd1ac2fc8sm7473268ejo.195.2022.10.18.06.31.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099889; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/E80xi7+DHvPCJRY31HtVvxNIdUIG8v2vBsVZ9TVoa0=; b=dVubEo+rUvW23YV3gldsdrlefN0qlSubukRjLxO3D3uE4VwEmJzzb7YAhN1/YnSalGg2XR Q/g0KF1BOWVk3p/m+GlBHwiTQkJyek/akLhsXTEKDmN+nAp7AcLjvKBJExvYD0doftijcL 1vQFOPyaHSZ/Tbz25DCsLDiHlnrmYwQ= X-MC-Unique: sbg_BKqsMLWPz2sPAdlEFg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/E80xi7+DHvPCJRY31HtVvxNIdUIG8v2vBsVZ9TVoa0=; b=dnc9bvEFvofcO5RKH0Ixk8CnYQprE5WgVfXFPyEhWA7WBRzq0To5cQ25dZcQMx92KI YAJx3dAs8LTVh0kBAQRd7iUtDLlJ/S+XyAazIW+dMpqtiegwsVLBd9awx2TZl0D9E+wz 9g+Kr+3RgPdXrnewdP2wjCG5XVJ74Y2Fn4DCVFHnCKMNld62PYZX18TVio2v8AiNrP+T FeQp9ptIWh311qbrlPICoyLWW0MYi0kvb/i73FjhUe67+73D9HDdAQ9noyJ3BuIX3OlZ 2lb7b9KGU4PwdTbznPHj9X4aI1AgG4xKf2JBEOgnQm2FFPBYY35a24PAxehiOdOfJPjm oY+g== X-Gm-Message-State: ACrzQf0eZLVI+ghQfSDHk9dKNBz/HjJnxR/nGf0vc7MieA6xO2YhkGki PIb7RCuH5ujeY02aLjzf4Y+fV43uLlMtL9wDIhE7Kie+afavYknXOWAWxAmU7RdDwf08gbPXhCb RxtdM8HqrpXjvblxgsC/p1+vq6ba+Y9734XVHGpeLSpb6eLI62Mnl1p/3j79rSSh4L6c= X-Received: by 2002:a05:6402:2706:b0:45d:aaae:e74a with SMTP id y6-20020a056402270600b0045daaaee74amr2591810edd.72.1666099886962; Tue, 18 Oct 2022 06:31:26 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5BNJkPzxsDR1qZ2N2cZCB2uxUmBEjOE9Hlrz/QymCjSy6ntJXVdD2ORs0ZyM57z/1rrN/NmQ== X-Received: by 2002:a05:6402:2706:b0:45d:aaae:e74a with SMTP id y6-20020a056402270600b0045daaaee74amr2591777edd.72.1666099886547; Tue, 18 Oct 2022 06:31:26 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 12/53] target/i386: Reorg GET_HPHYS Date: Tue, 18 Oct 2022 15:30:01 +0200 Message-Id: <20221018133042.856368-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101030781100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Replace with PTE_HPHYS for the page table walk, and a direct call to mmu_translate for the final stage2 translation. Hoist the check for HF2_NPT_MASK out to get_physical_address, which avoids the recursive call when stage2 is disabled. We can now return all the way out to x86_cpu_tlb_fill before raising an exception, which means probe works. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-5-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 123 +++++++++++++++++++++------ 1 file changed, 95 insertions(+), 28 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 00ce4cf253..816b307547 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -37,18 +37,43 @@ typedef struct TranslateResult { int page_size; } TranslateResult; =20 +typedef enum TranslateFaultStage2 { + S2_NONE, + S2_GPA, + S2_GPT, +} TranslateFaultStage2; + typedef struct TranslateFault { int exception_index; int error_code; target_ulong cr2; + TranslateFaultStage2 stage2; } TranslateFault; =20 -#define GET_HPHYS(cs, gpa, access_type, prot) \ - (in->use_stage2 ? get_hphys(cs, gpa, access_type, prot) : gpa) +#define PTE_HPHYS(ADDR) \ + do { \ + if (in->use_stage2) { \ + nested_in.addr =3D (ADDR); \ + if (!mmu_translate(env, &nested_in, out, err)) { \ + err->stage2 =3D S2_GPT; \ + return false; \ + } \ + (ADDR) =3D out->paddr; \ + } \ + } while (0) =20 static bool mmu_translate(CPUX86State *env, const TranslateParams *in, TranslateResult *out, TranslateFault *err) { + TranslateParams nested_in =3D { + /* Use store for page table entries, to allow A/D flag updates. */ + .access_type =3D MMU_DATA_STORE, + .cr3 =3D env->nested_cr3, + .pg_mode =3D env->nested_pg_mode, + .mmu_idx =3D MMU_USER_IDX, + .use_stage2 =3D false, + }; + CPUState *cs =3D env_cpu(env); X86CPU *cpu =3D env_archcpu(env); const int32_t a20_mask =3D x86_get_a20_mask(env); @@ -79,7 +104,7 @@ static bool mmu_translate(CPUX86State *env, const Transl= ateParams *in, if (la57) { pml5e_addr =3D ((in->cr3 & ~0xfff) + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; - pml5e_addr =3D GET_HPHYS(cs, pml5e_addr, MMU_DATA_STORE, N= ULL); + PTE_HPHYS(pml5e_addr); pml5e =3D x86_ldq_phys(cs, pml5e_addr); if (!(pml5e & PG_PRESENT_MASK)) { goto do_fault; @@ -99,7 +124,7 @@ static bool mmu_translate(CPUX86State *env, const Transl= ateParams *in, =20 pml4e_addr =3D ((pml5e & PG_ADDRESS_MASK) + (((addr >> 39) & 0x1ff) << 3)) & a20_mask; - pml4e_addr =3D GET_HPHYS(cs, pml4e_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pml4e_addr); pml4e =3D x86_ldq_phys(cs, pml4e_addr); if (!(pml4e & PG_PRESENT_MASK)) { goto do_fault; @@ -114,7 +139,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, ptep &=3D pml4e ^ PG_NX_MASK; pdpe_addr =3D ((pml4e & PG_ADDRESS_MASK) + (((addr >> 30) & 0x= 1ff) << 3)) & a20_mask; - pdpe_addr =3D GET_HPHYS(cs, pdpe_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pdpe_addr); pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { goto do_fault; @@ -140,7 +165,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, /* XXX: load them when cr3 is loaded ? */ pdpe_addr =3D ((in->cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & a20_mask; - pdpe_addr =3D GET_HPHYS(cs, pdpe_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pdpe_addr); pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { goto do_fault; @@ -154,7 +179,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, =20 pde_addr =3D ((pdpe & PG_ADDRESS_MASK) + (((addr >> 21) & 0x1ff) <= < 3)) & a20_mask; - pde_addr =3D GET_HPHYS(cs, pde_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pde_addr); pde =3D x86_ldq_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { goto do_fault; @@ -177,7 +202,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, } pte_addr =3D ((pde & PG_ADDRESS_MASK) + (((addr >> 12) & 0x1ff) <<= 3)) & a20_mask; - pte_addr =3D GET_HPHYS(cs, pte_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pte_addr); pte =3D x86_ldq_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; @@ -194,7 +219,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, /* page directory entry */ pde_addr =3D ((in->cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & a20_mask; - pde_addr =3D GET_HPHYS(cs, pde_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pde_addr); pde =3D x86_ldl_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { goto do_fault; @@ -222,7 +247,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, /* page directory entry */ pte_addr =3D ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & a20_mask; - pte_addr =3D GET_HPHYS(cs, pte_addr, MMU_DATA_STORE, NULL); + PTE_HPHYS(pte_addr); pte =3D x86_ldl_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; @@ -303,13 +328,31 @@ do_check_protect_pse36: assert(access_type !=3D MMU_DATA_STORE); prot &=3D ~PAGE_WRITE; } - out->prot =3D prot; - out->page_size =3D page_size; =20 /* align to page_size */ out->paddr =3D (pte & a20_mask & PG_ADDRESS_MASK & ~(page_size - 1)) | (addr & (page_size - 1)); - out->paddr =3D GET_HPHYS(cs, out->paddr, access_type, &out->prot); + + if (in->use_stage2) { + nested_in.addr =3D out->paddr; + nested_in.access_type =3D access_type; + + if (!mmu_translate(env, &nested_in, out, err)) { + err->stage2 =3D S2_GPA; + return false; + } + + /* Merge stage1 & stage2 protection bits. */ + prot &=3D out->prot; + + /* Re-verify resulting protection. */ + if ((prot & (1 << access_type)) =3D=3D 0) { + goto do_fault_protect; + } + } + + out->prot =3D prot; + out->page_size =3D page_size; return true; =20 int error_code; @@ -344,13 +387,36 @@ do_check_protect_pse36: err->exception_index =3D EXCP0E_PAGE; err->error_code =3D error_code; err->cr2 =3D addr; + err->stage2 =3D S2_NONE; return false; } =20 +static G_NORETURN void raise_stage2(CPUX86State *env, TranslateFault *err, + uintptr_t retaddr) +{ + uint64_t exit_info_1 =3D err->error_code; + + switch (err->stage2) { + case S2_GPT: + exit_info_1 |=3D SVM_NPTEXIT_GPT; + break; + case S2_GPA: + exit_info_1 |=3D SVM_NPTEXIT_GPA; + break; + default: + g_assert_not_reached(); + } + + x86_stq_phys(env_cpu(env), + env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2), + err->cr2); + cpu_vmexit(env, SVM_EXIT_NPF, exit_info_1, retaddr); +} + hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAccessType access_type, int *prot) { - CPUX86State *env =3D &X86_CPU(cs)->env; + CPUX86State *env =3D cs->env_ptr; =20 if (likely(!(env->hflags2 & HF2_NPT_MASK))) { return gphys; @@ -365,20 +431,16 @@ hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAcces= sType access_type, }; TranslateResult out; TranslateFault err; - uint64_t exit_info_1; =20 - if (mmu_translate(env, &in, &out, &err)) { - if (prot) { - *prot &=3D out.prot; - } - return out.paddr; + if (!mmu_translate(env, &in, &out, &err)) { + err.stage2 =3D prot ? SVM_NPTEXIT_GPA : SVM_NPTEXIT_GPT; + raise_stage2(env, &err, env->retaddr); } =20 - x86_stq_phys(cs, env->vm_vmcb + - offsetof(struct vmcb, control.exit_info_2), gphys); - exit_info_1 =3D err.error_code - | (prot ? SVM_NPTEXIT_GPA : SVM_NPTEXIT_GPT); - cpu_vmexit(env, SVM_EXIT_NPF, exit_info_1, env->retaddr); + if (prot) { + *prot &=3D out.prot; + } + return out.paddr; } } =20 @@ -405,7 +467,7 @@ static bool get_physical_address(CPUX86State *env, vadd= r addr, .pg_mode =3D get_pg_mode(env), .mmu_idx =3D mmu_idx, .access_type =3D access_type, - .use_stage2 =3D true + .use_stage2 =3D env->hflags2 & HF2_NPT_MASK, }; =20 if (in.pg_mode & PG_MODE_LMA) { @@ -444,8 +506,13 @@ bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int si= ze, return true; } =20 - /* FIXME: On error in get_hphys we have already jumped out. */ - g_assert(!probe); + if (probe) { + return false; + } + + if (err.stage2 !=3D S2_NONE) { + raise_stage2(env, &err, retaddr); + } =20 if (env->intercept_exceptions & (1 << err.exception_index)) { /* cr2 is not modified in case of exceptions */ --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102177; cv=none; d=zohomail.com; s=zohoarc; b=aSddOYGmxbqAscSX58U4Igf++NryqbIDDC0OafVhPZ78iShhF7rxzy6K07TOkQ/MgTuPNuk0JVJa2bPEvNXBzokWQB8ARYVHWc6BPp5dT/7PR2jgSAiob3QDRvFzAx9scwe8K9VJ+RA+QkL04hHLzS0W4IXm8eZHV02LXiHzP7U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102177; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=v5dp7+qCUGzBtcpQe2Asqx5dhgaedWRqcldb8Y4LGrY=; b=QjDZ5BlXr/eT4EpumUREU54+iGEP3KzdN61aJTJeMiVTnFX6i26P9jMqhRqyiABgAIQ5gn21LxoNUhxx2X68p+WsymybTYc9RLDD0nmWn/ksS35DPElk7AnA6cV0QOX0Ikb5A+WdXq4g0Kk4EHMDzv6ZlC06WChmJ+1bUnOpnf4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102177437397.0855840209134; Tue, 18 Oct 2022 07:09:37 -0700 (PDT) Received: from localhost ([::1]:40674 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknHj-0004VR-Om for importer@patchew.org; Tue, 18 Oct 2022 10:09:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37162) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh0-0002Re-M2 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:38 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:51872) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmgw-00052C-Pk for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:37 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-504-Gh_sDQOzPZ6G9Q5VDz3Ebg-1; Tue, 18 Oct 2022 09:31:31 -0400 Received: by mail-ej1-f70.google.com with SMTP id xc12-20020a170907074c00b007416699ea14so6383939ejb.19 for ; Tue, 18 Oct 2022 06:31:31 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id md9-20020a170906ae8900b0078defb88b0dsm7454622ejb.73.2022.10.18.06.31.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099894; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v5dp7+qCUGzBtcpQe2Asqx5dhgaedWRqcldb8Y4LGrY=; b=W07nqTcAJ75RfIansXUVP5Zq8ceiqNzTz8og1C0SGs3j2YaiLzzPAPv1z3MX47Zb9+e9aM FWiqbYNdujF6HzN+X/T9tOD/sVLU4BBMe9+T12+03ao1BGREfUQYk/t/KVqnRgESwMZhgr EJShVKsxWZu0bXxYR0Ac/dXuN95+e+o= X-MC-Unique: Gh_sDQOzPZ6G9Q5VDz3Ebg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=v5dp7+qCUGzBtcpQe2Asqx5dhgaedWRqcldb8Y4LGrY=; b=oTCUPqSOySAR5VIfm3o1zBwnRgpyrxKvwTG9ieF/SzWYPzD6mr1OBBqyojAWd5LnNM f06Y/askZ/2706GUsjfnzZK//MUIUou/Hug2IhpTbGp4k09pRaVWX8eHZVBB12UzVbSl rbp4NMDxerkb70rwxgp4iN2/d++AdfGH3idiYe+eyz2uwI/F8pjDkK4CBmOW6y9hBJJA sN1vK/VBzNumaFEe4FVO/Xp/g5ssAGk+RZ1cuCkk7OZ27u33nqFfCwC0O5B21zpsAO5m HPdoWkp0H4/NL6WUCBOJuDrRut3KlbWLlo4vQ1i4HYGzVG2n4S4RX92swpk6IsDU20Wi yh+w== X-Gm-Message-State: ACrzQf1l3QsLS9jkfaHg9hL/kLNiHh/kDLGZ24ui2QKMqk5b8RrDKTe9 CS1vtm8IiCqiD/h4LKIEKYQdem9rBXk99bcZcfoy5f1C+MGhIAR45ET6rX27Ge8ltQfIt4SazKB jhg6jK6+Ck/BStQwLqGmu/ni1bhymTyhrzj2g3nZoUNWU05vfcrsabI6J2e/vn0izCiY= X-Received: by 2002:a05:6402:10c2:b0:45c:3c87:721f with SMTP id p2-20020a05640210c200b0045c3c87721fmr2731214edu.251.1666099889904; Tue, 18 Oct 2022 06:31:29 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5TjWJcm3uWtbRBWditEv5b52BCXnQrkjhlL+ulbAr//CC3tSlC6ButZhVTduT2aL7i8SVtFA== X-Received: by 2002:a05:6402:10c2:b0:45c:3c87:721f with SMTP id p2-20020a05640210c200b0045c3c87721fmr2731183edu.251.1666099889557; Tue, 18 Oct 2022 06:31:29 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 13/53] target/i386: Add MMU_PHYS_IDX and MMU_NESTED_IDX Date: Tue, 18 Oct 2022 15:30:02 +0200 Message-Id: <20221018133042.856368-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102178072100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson These new mmu indexes will be helpful for improving paging and code throughout the target. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-6-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/cpu-param.h | 2 +- target/i386/cpu.h | 3 + target/i386/tcg/sysemu/excp_helper.c | 82 ++++++++++++++++++---------- target/i386/tcg/sysemu/svm_helper.c | 3 + 4 files changed, 60 insertions(+), 30 deletions(-) diff --git a/target/i386/cpu-param.h b/target/i386/cpu-param.h index 1e79389761..f579b16bd2 100644 --- a/target/i386/cpu-param.h +++ b/target/i386/cpu-param.h @@ -23,7 +23,7 @@ # define TARGET_VIRT_ADDR_SPACE_BITS 32 #endif #define TARGET_PAGE_BITS 12 -#define NB_MMU_MODES 3 +#define NB_MMU_MODES 5 =20 #ifndef CONFIG_USER_ONLY # define TARGET_TB_PCREL 1 diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 4d21c5759d..3573107356 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2149,6 +2149,9 @@ uint64_t cpu_get_tsc(CPUX86State *env); #define MMU_KSMAP_IDX 0 #define MMU_USER_IDX 1 #define MMU_KNOSMAP_IDX 2 +#define MMU_NESTED_IDX 3 +#define MMU_PHYS_IDX 4 + static inline int cpu_mmu_index(CPUX86State *env, bool ifetch) { return (env->hflags & HF_CPL_MASK) =3D=3D 3 ? MMU_USER_IDX : diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 816b307547..494dc6d00c 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -448,41 +448,65 @@ static bool get_physical_address(CPUX86State *env, va= ddr addr, MMUAccessType access_type, int mmu_idx, TranslateResult *out, TranslateFault *err) { - if (!(env->cr[0] & CR0_PG_MASK)) { - out->paddr =3D addr & x86_get_a20_mask(env); + TranslateParams in; + bool use_stage2 =3D env->hflags2 & HF2_NPT_MASK; =20 -#ifdef TARGET_X86_64 - if (!(env->hflags & HF_LMA_MASK)) { - /* Without long mode we can only address 32bits in real mode */ - out->paddr =3D (uint32_t)out->paddr; - } -#endif - out->prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; - out->page_size =3D TARGET_PAGE_SIZE; - return true; - } else { - TranslateParams in =3D { - .addr =3D addr, - .cr3 =3D env->cr[3], - .pg_mode =3D get_pg_mode(env), - .mmu_idx =3D mmu_idx, - .access_type =3D access_type, - .use_stage2 =3D env->hflags2 & HF2_NPT_MASK, - }; + in.addr =3D addr; + in.access_type =3D access_type; =20 - if (in.pg_mode & PG_MODE_LMA) { - /* test virtual address sign extension */ - int shift =3D in.pg_mode & PG_MODE_LA57 ? 56 : 47; - int64_t sext =3D (int64_t)addr >> shift; - if (sext !=3D 0 && sext !=3D -1) { - err->exception_index =3D EXCP0D_GPF; - err->error_code =3D 0; - err->cr2 =3D addr; + switch (mmu_idx) { + case MMU_PHYS_IDX: + break; + + case MMU_NESTED_IDX: + if (likely(use_stage2)) { + in.cr3 =3D env->nested_cr3; + in.pg_mode =3D env->nested_pg_mode; + in.mmu_idx =3D MMU_USER_IDX; + in.use_stage2 =3D false; + + if (!mmu_translate(env, &in, out, err)) { + err->stage2 =3D S2_GPA; return false; } + return true; } - return mmu_translate(env, &in, out, err); + break; + + default: + in.cr3 =3D env->cr[3]; + in.mmu_idx =3D mmu_idx; + in.use_stage2 =3D use_stage2; + in.pg_mode =3D get_pg_mode(env); + + if (likely(in.pg_mode)) { + if (in.pg_mode & PG_MODE_LMA) { + /* test virtual address sign extension */ + int shift =3D in.pg_mode & PG_MODE_LA57 ? 56 : 47; + int64_t sext =3D (int64_t)addr >> shift; + if (sext !=3D 0 && sext !=3D -1) { + err->exception_index =3D EXCP0D_GPF; + err->error_code =3D 0; + err->cr2 =3D addr; + return false; + } + } + return mmu_translate(env, &in, out, err); + } + break; } + + /* Translation disabled. */ + out->paddr =3D addr & x86_get_a20_mask(env); +#ifdef TARGET_X86_64 + if (!(env->hflags & HF_LMA_MASK)) { + /* Without long mode we can only address 32bits in real mode */ + out->paddr =3D (uint32_t)out->paddr; + } +#endif + out->prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + out->page_size =3D TARGET_PAGE_SIZE; + return true; } =20 bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int size, diff --git a/target/i386/tcg/sysemu/svm_helper.c b/target/i386/tcg/sysemu/s= vm_helper.c index 2b6f450af9..85b7741d94 100644 --- a/target/i386/tcg/sysemu/svm_helper.c +++ b/target/i386/tcg/sysemu/svm_helper.c @@ -271,6 +271,8 @@ void helper_vmrun(CPUX86State *env, int aflag, int next= _eip_addend) env->hflags2 |=3D HF2_NPT_MASK; =20 env->nested_pg_mode =3D get_pg_mode(env) & PG_MODE_SVM_MASK; + + tlb_flush_by_mmuidx(cs, 1 << MMU_NESTED_IDX); } =20 /* enable intercepts */ @@ -720,6 +722,7 @@ void do_vmexit(CPUX86State *env) env->vm_vmcb + offsetof(struct vmcb, control.int_state), = 0); } env->hflags2 &=3D ~HF2_NPT_MASK; + tlb_flush_by_mmuidx(cs, 1 << MMU_NESTED_IDX); =20 /* Save the VM state in the vmcb */ svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.es), --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101083; cv=none; d=zohomail.com; s=zohoarc; b=Zw8TUBzYy0K+yEkfclP/nhg70XGGui2fOo/3xTOOtWuoKEDL8z1KZUE1p3OG3XSXdWZbxWINCcm9VsMrUvXKr8StS60dbYLy+R0s409gmV1cLbBEhUlvFASLEALKG5q4WMrR1pbMNvbbCIG8mGwuFSoHGBRmewvwAB67V4EqXAg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101083; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Rj/4jO8sSUdfjVKvFFNktbJ8p40rBE0xrv8gZ3XIDKc=; b=Fr8wes8Tm0nKn4CuQymJclL5bpnQKXAcYg1VSUCzVQlGgZrADMb3Ckdxh10daKBYELMyfALNdZ7ZsvtWj5v0aQtVI5Y3xVa3rsViLBd42YsneSD38pMtjce6hka0TdJiMuAFWWPhPohyqhqTcwrqB1etcmN7NbGHUfHl4IIxnUc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101083566308.36975827330605; Tue, 18 Oct 2022 06:51:23 -0700 (PDT) Received: from localhost ([::1]:52698 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okmzj-0007wV-2P for importer@patchew.org; Tue, 18 Oct 2022 09:51:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37164) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh5-0002fu-FI for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:43 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:47488) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh1-00053S-Ku for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:43 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-637-Y3h6so_FN5udvY2tQMjIOQ-1; Tue, 18 Oct 2022 09:31:35 -0400 Received: by mail-ej1-f71.google.com with SMTP id hc43-20020a17090716ab00b0078e28567ffbso4748101ejc.15 for ; Tue, 18 Oct 2022 06:31:35 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id g16-20020a056402115000b004575085bf18sm8830219edw.74.2022.10.18.06.31.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099897; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Rj/4jO8sSUdfjVKvFFNktbJ8p40rBE0xrv8gZ3XIDKc=; b=PpiVHujBlYLhEo6++gaMQllmarrdaKj/focB3Xsul5YI9KMh284z+aGJqROPDBmpTc+r2j +0CXUfPKUjSGt7x/zoYyNR/9cRg36r/QEf4AH1eCfzU6z2hnBc9LCm8HujoQmWisLhmcND zp1DEF00iJnkVeOuo1KDqKqw1hYaNVk= X-MC-Unique: Y3h6so_FN5udvY2tQMjIOQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Rj/4jO8sSUdfjVKvFFNktbJ8p40rBE0xrv8gZ3XIDKc=; b=yxJLRKe6T9p3vsSF2clezvWFedCZh+DtfAEeVfeusLKtesKYQrhR7ORQ5cJ3xEbtsY GwuSaY6K42JR3ylHO5DMoH1G6m73li3/8TqEEpGrRSmXAruuUQJEICuYyZhz2M0U1Qzt 2OjQhh0AKnCTYPyCvuoy3XN6o3lm+BmwNjQBTENVvoHAW9KAeAD3f978XH8QFKyRdejT 3DTO8AxSd4SgFGuXLnm6Vs+5yE95g7V7oorbX1GnbZYPuZEAb61N3v4/eJ5eL1KUJOYg POnz/3ZfrMSseL2dRrq3ZEaopfZDRHHBk89Q5nmUsg/WWBvhseFyIoB/2orPXMQ/Ml6t k2PQ== X-Gm-Message-State: ACrzQf2/ma6Y+19iqlGRNKH6OvskP+TKwfzwNygM/rSnPNFYmHm1Hbgg 41b2xjbifxjqK0kbz29vNGbAkte1lf8YbgiWFzCeISianUWGLbnvG+EZy75tTLkyvWOWwvWETJJ Jr+lMAepQ9mtY7vuHMC/NY93yNxTBNFbNfeL5c4JxiH9REKPYmZ0qmyUugeyKejvEGD4= X-Received: by 2002:a17:906:fe45:b0:791:9624:9ea4 with SMTP id wz5-20020a170906fe4500b0079196249ea4mr2389493ejb.147.1666099893673; Tue, 18 Oct 2022 06:31:33 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4QLUuD3s5NYnN/KLkmfO6gQnmz6s2k38Zllkjsm6MRFArw3EtYyaN1s/KYu1ixPJRiqZ/+Sw== X-Received: by 2002:a17:906:fe45:b0:791:9624:9ea4 with SMTP id wz5-20020a170906fe4500b0079196249ea4mr2389457ejb.147.1666099893142; Tue, 18 Oct 2022 06:31:33 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 14/53] target/i386: Use MMU_NESTED_IDX for vmload/vmsave Date: Tue, 18 Oct 2022 15:30:03 +0200 Message-Id: <20221018133042.856368-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101084071100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Use MMU_NESTED_IDX for each memory access, rather than just a single translation to physical. Adjust svm_save_seg and svm_load_seg to pass in mmu_idx. This removes the last use of get_hphys so remove it. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-7-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 2 - target/i386/tcg/sysemu/excp_helper.c | 31 ---- target/i386/tcg/sysemu/svm_helper.c | 231 +++++++++++++++------------ 3 files changed, 126 insertions(+), 138 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 3573107356..6bb6653e76 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2387,8 +2387,6 @@ static inline bool ctl_has_irq(CPUX86State *env) return (env->int_ctl & V_IRQ_MASK) && (int_prio >=3D tpr); } =20 -hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAccessType access_type, - int *prot); #if defined(TARGET_X86_64) && \ defined(CONFIG_USER_ONLY) && \ defined(CONFIG_LINUX) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 494dc6d00c..86b3014196 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -413,37 +413,6 @@ static G_NORETURN void raise_stage2(CPUX86State *env, = TranslateFault *err, cpu_vmexit(env, SVM_EXIT_NPF, exit_info_1, retaddr); } =20 -hwaddr get_hphys(CPUState *cs, hwaddr gphys, MMUAccessType access_type, - int *prot) -{ - CPUX86State *env =3D cs->env_ptr; - - if (likely(!(env->hflags2 & HF2_NPT_MASK))) { - return gphys; - } else { - TranslateParams in =3D { - .addr =3D gphys, - .cr3 =3D env->nested_cr3, - .pg_mode =3D env->nested_pg_mode, - .mmu_idx =3D MMU_USER_IDX, - .access_type =3D access_type, - .use_stage2 =3D false, - }; - TranslateResult out; - TranslateFault err; - - if (!mmu_translate(env, &in, &out, &err)) { - err.stage2 =3D prot ? SVM_NPTEXIT_GPA : SVM_NPTEXIT_GPT; - raise_stage2(env, &err, env->retaddr); - } - - if (prot) { - *prot &=3D out.prot; - } - return out.paddr; - } -} - static bool get_physical_address(CPUX86State *env, vaddr addr, MMUAccessType access_type, int mmu_idx, TranslateResult *out, TranslateFault *err) diff --git a/target/i386/tcg/sysemu/svm_helper.c b/target/i386/tcg/sysemu/s= vm_helper.c index 85b7741d94..8e88567399 100644 --- a/target/i386/tcg/sysemu/svm_helper.c +++ b/target/i386/tcg/sysemu/svm_helper.c @@ -27,19 +27,19 @@ =20 /* Secure Virtual Machine helpers */ =20 -static inline void svm_save_seg(CPUX86State *env, hwaddr addr, - const SegmentCache *sc) +static void svm_save_seg(CPUX86State *env, int mmu_idx, hwaddr addr, + const SegmentCache *sc) { - CPUState *cs =3D env_cpu(env); - - x86_stw_phys(cs, addr + offsetof(struct vmcb_seg, selector), - sc->selector); - x86_stq_phys(cs, addr + offsetof(struct vmcb_seg, base), - sc->base); - x86_stl_phys(cs, addr + offsetof(struct vmcb_seg, limit), - sc->limit); - x86_stw_phys(cs, addr + offsetof(struct vmcb_seg, attrib), - ((sc->flags >> 8) & 0xff) | ((sc->flags >> 12) & 0x0f00)); + cpu_stw_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, selector), + sc->selector, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, base), + sc->base, mmu_idx, 0); + cpu_stl_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, limit), + sc->limit, mmu_idx, 0); + cpu_stw_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, attrib), + ((sc->flags >> 8) & 0xff) + | ((sc->flags >> 12) & 0x0f00), + mmu_idx, 0); } =20 /* @@ -52,29 +52,36 @@ static inline void svm_canonicalization(CPUX86State *en= v, target_ulong *seg_base *seg_base =3D ((((long) *seg_base) << shift_amt) >> shift_amt); } =20 -static inline void svm_load_seg(CPUX86State *env, hwaddr addr, - SegmentCache *sc) +static void svm_load_seg(CPUX86State *env, int mmu_idx, hwaddr addr, + SegmentCache *sc) { - CPUState *cs =3D env_cpu(env); unsigned int flags; =20 - sc->selector =3D x86_lduw_phys(cs, - addr + offsetof(struct vmcb_seg, selector)); - sc->base =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb_seg, base)); - sc->limit =3D x86_ldl_phys(cs, addr + offsetof(struct vmcb_seg, limit)= ); - flags =3D x86_lduw_phys(cs, addr + offsetof(struct vmcb_seg, attrib)); + sc->selector =3D + cpu_lduw_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, selector), + mmu_idx, 0); + sc->base =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, base), + mmu_idx, 0); + sc->limit =3D + cpu_ldl_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, limit), + mmu_idx, 0); + flags =3D + cpu_lduw_mmuidx_ra(env, addr + offsetof(struct vmcb_seg, attrib), + mmu_idx, 0); sc->flags =3D ((flags & 0xff) << 8) | ((flags & 0x0f00) << 12); + svm_canonicalization(env, &sc->base); } =20 -static inline void svm_load_seg_cache(CPUX86State *env, hwaddr addr, - int seg_reg) +static void svm_load_seg_cache(CPUX86State *env, int mmu_idx, + hwaddr addr, int seg_reg) { - SegmentCache sc1, *sc =3D &sc1; + SegmentCache sc; =20 - svm_load_seg(env, addr, sc); - cpu_x86_load_seg_cache(env, seg_reg, sc->selector, - sc->base, sc->limit, sc->flags); + svm_load_seg(env, mmu_idx, addr, &sc); + cpu_x86_load_seg_cache(env, seg_reg, sc.selector, + sc.base, sc.limit, sc.flags); } =20 static inline bool is_efer_invalid_state (CPUX86State *env) @@ -199,13 +206,17 @@ void helper_vmrun(CPUX86State *env, int aflag, int ne= xt_eip_addend) env->vm_hsave + offsetof(struct vmcb, save.rflags), cpu_compute_eflags(env)); =20 - svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.es), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.es), &env->segs[R_ES]); - svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.cs), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.cs), &env->segs[R_CS]); - svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.ss), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.ss), &env->segs[R_SS]); - svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.ds), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.ds), &env->segs[R_DS]); =20 x86_stq_phys(cs, env->vm_hsave + offsetof(struct vmcb, save.rip), @@ -325,18 +336,18 @@ void helper_vmrun(CPUX86State *env, int aflag, int ne= xt_eip_addend) save.rflags)), ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK)); =20 - svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.es), - R_ES); - svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.cs), - R_CS); - svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.ss), - R_SS); - svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.ds), - R_DS); - svm_load_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.idtr), - &env->idt); - svm_load_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.gdtr), - &env->gdt); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.es), R_ES= ); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.cs), R_CS= ); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.ss), R_SS= ); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.ds), R_DS= ); + svm_load_seg(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.idtr), &env->id= t); + svm_load_seg(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.gdtr), &env->gd= t); =20 env->eip =3D x86_ldq_phys(cs, env->vm_vmcb + offsetof(struct vmcb, save.rip)); @@ -451,9 +462,8 @@ void helper_vmmcall(CPUX86State *env) =20 void helper_vmload(CPUX86State *env, int aflag) { - CPUState *cs =3D env_cpu(env); + int mmu_idx =3D MMU_PHYS_IDX; target_ulong addr; - int prot; =20 cpu_svm_check_intercept_param(env, SVM_EXIT_VMLOAD, 0, GETPC()); =20 @@ -464,43 +474,52 @@ void helper_vmload(CPUX86State *env, int aflag) } =20 if (virtual_vm_load_save_enabled(env, SVM_EXIT_VMLOAD, GETPC())) { - addr =3D get_hphys(cs, addr, MMU_DATA_LOAD, &prot); + mmu_idx =3D MMU_NESTED_IDX; } =20 - qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmload! " TARGET_FMT_lx - "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n", - addr, x86_ldq_phys(cs, addr + offsetof(struct vmcb, - save.fs.base)), - env->segs[R_FS].base); - - svm_load_seg_cache(env, addr + offsetof(struct vmcb, save.fs), R_FS); - svm_load_seg_cache(env, addr + offsetof(struct vmcb, save.gs), R_GS); - svm_load_seg(env, addr + offsetof(struct vmcb, save.tr), &env->tr); - svm_load_seg(env, addr + offsetof(struct vmcb, save.ldtr), &env->ldt); + svm_load_seg_cache(env, mmu_idx, + addr + offsetof(struct vmcb, save.fs), R_FS); + svm_load_seg_cache(env, mmu_idx, + addr + offsetof(struct vmcb, save.gs), R_GS); + svm_load_seg(env, mmu_idx, + addr + offsetof(struct vmcb, save.tr), &env->tr); + svm_load_seg(env, mmu_idx, + addr + offsetof(struct vmcb, save.ldtr), &env->ldt); =20 #ifdef TARGET_X86_64 - env->kernelgsbase =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, - save.kernel_gs_base)); - env->lstar =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, save.lsta= r)); - env->cstar =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, save.csta= r)); - env->fmask =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, save.sfma= sk)); + env->kernelgsbase =3D + cpu_ldq_mmuidx_ra(env, + addr + offsetof(struct vmcb, save.kernel_gs_base= ), + mmu_idx, 0); + env->lstar =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.lstar), + mmu_idx, 0); + env->cstar =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.cstar), + mmu_idx, 0); + env->fmask =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sfmask), + mmu_idx, 0); svm_canonicalization(env, &env->kernelgsbase); #endif - env->star =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, save.star)= ); - env->sysenter_cs =3D x86_ldq_phys(cs, - addr + offsetof(struct vmcb, save.sysenter= _cs)); - env->sysenter_esp =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, - save.sysenter_esp)); - env->sysenter_eip =3D x86_ldq_phys(cs, addr + offsetof(struct vmcb, - save.sysenter_eip)); - + env->star =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.star), + mmu_idx, 0); + env->sysenter_cs =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sysenter_= cs), + mmu_idx, 0); + env->sysenter_esp =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sysenter_= esp), + mmu_idx, 0); + env->sysenter_eip =3D + cpu_ldq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sysenter_= eip), + mmu_idx, 0); } =20 void helper_vmsave(CPUX86State *env, int aflag) { - CPUState *cs =3D env_cpu(env); + int mmu_idx =3D MMU_PHYS_IDX; target_ulong addr; - int prot; =20 cpu_svm_check_intercept_param(env, SVM_EXIT_VMSAVE, 0, GETPC()); =20 @@ -511,38 +530,36 @@ void helper_vmsave(CPUX86State *env, int aflag) } =20 if (virtual_vm_load_save_enabled(env, SVM_EXIT_VMSAVE, GETPC())) { - addr =3D get_hphys(cs, addr, MMU_DATA_STORE, &prot); + mmu_idx =3D MMU_NESTED_IDX; } =20 - qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmsave! " TARGET_FMT_lx - "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n", - addr, x86_ldq_phys(cs, - addr + offsetof(struct vmcb, save.fs.base= )), - env->segs[R_FS].base); - - svm_save_seg(env, addr + offsetof(struct vmcb, save.fs), + svm_save_seg(env, mmu_idx, addr + offsetof(struct vmcb, save.fs), &env->segs[R_FS]); - svm_save_seg(env, addr + offsetof(struct vmcb, save.gs), + svm_save_seg(env, mmu_idx, addr + offsetof(struct vmcb, save.gs), &env->segs[R_GS]); - svm_save_seg(env, addr + offsetof(struct vmcb, save.tr), + svm_save_seg(env, mmu_idx, addr + offsetof(struct vmcb, save.tr), &env->tr); - svm_save_seg(env, addr + offsetof(struct vmcb, save.ldtr), + svm_save_seg(env, mmu_idx, addr + offsetof(struct vmcb, save.ldtr), &env->ldt); =20 #ifdef TARGET_X86_64 - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.kernel_gs_base), - env->kernelgsbase); - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.lstar), env->lstar); - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.cstar), env->cstar); - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.sfmask), env->fmask= ); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.kernel_gs_bas= e), + env->kernelgsbase, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.lstar), + env->lstar, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.cstar), + env->cstar, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sfmask), + env->fmask, mmu_idx, 0); #endif - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.star), env->star); - x86_stq_phys(cs, - addr + offsetof(struct vmcb, save.sysenter_cs), env->sysenter= _cs); - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.sysenter_esp), - env->sysenter_esp); - x86_stq_phys(cs, addr + offsetof(struct vmcb, save.sysenter_eip), - env->sysenter_eip); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.star), + env->star, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sysenter_cs), + env->sysenter_cs, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sysenter_esp), + env->sysenter_esp, mmu_idx, 0); + cpu_stq_mmuidx_ra(env, addr + offsetof(struct vmcb, save.sysenter_eip), + env->sysenter_eip, mmu_idx, 0); } =20 void helper_stgi(CPUX86State *env) @@ -725,13 +742,17 @@ void do_vmexit(CPUX86State *env) tlb_flush_by_mmuidx(cs, 1 << MMU_NESTED_IDX); =20 /* Save the VM state in the vmcb */ - svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.es), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.es), &env->segs[R_ES]); - svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.cs), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.cs), &env->segs[R_CS]); - svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.ss), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.ss), &env->segs[R_SS]); - svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.ds), + svm_save_seg(env, MMU_PHYS_IDX, + env->vm_vmcb + offsetof(struct vmcb, save.ds), &env->segs[R_DS]); =20 x86_stq_phys(cs, env->vm_vmcb + offsetof(struct vmcb, save.gdtr.base), @@ -812,14 +833,14 @@ void do_vmexit(CPUX86State *env) ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK | VM_MASK)); =20 - svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.es), - R_ES); - svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.cs), - R_CS); - svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.ss), - R_SS); - svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.ds), - R_DS); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.es), R_E= S); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.cs), R_C= S); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.ss), R_S= S); + svm_load_seg_cache(env, MMU_PHYS_IDX, + env->vm_hsave + offsetof(struct vmcb, save.ds), R_D= S); =20 env->eip =3D x86_ldq_phys(cs, env->vm_hsave + offsetof(struct vmcb, save.rip)); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101104; cv=none; d=zohomail.com; s=zohoarc; b=XF7DjCGOYFXfWs64RdoYvNwr9ReUtbAj+vv1SdF856bVCZ7THm2hr5u9hUub5CKwwm9iil9zkmECJmB/b350a2N2f24NrjY8T6ZecH5GOmexqBBCe6yJBJSQutgZv2KnkntM77ABL82tZpqGz4nWbZOVBzKZNl3ZUZgRMcexQmk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101104; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XV/FUkjTe/ouWvpIL64KvSzYdBJ0cqh3t/FB4ungLqk=; b=HSbHBnVhsmn6j19o5KjDLcP1Ft7AKCmkJnTJu5y2ly/4AVgv+HIB1OSsMMPJiEXbWHPJA3agCoNYL5D4HtX3qIdN1Eu4uqWHmeWfDsPHWFqIiDteJTNXoZPKpRrBvnJKN0tqUDmJ03/43U5ADhURUZ74YOOx/zaluAcZk4PVq1I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101104553600.0791638753843; Tue, 18 Oct 2022 06:51:44 -0700 (PDT) Received: from localhost ([::1]:52712 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0Q-0008RH-Gl for importer@patchew.org; Tue, 18 Oct 2022 09:51:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37166) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh7-0002mu-2h for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:45 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:52041) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh4-00053j-PM for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:44 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-191-GN35QT0-O3ad6B5-FkdAsw-1; Tue, 18 Oct 2022 09:31:38 -0400 Received: by mail-ed1-f70.google.com with SMTP id l18-20020a056402255200b0045d2674d1a0so9078099edb.0 for ; Tue, 18 Oct 2022 06:31:38 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id 17-20020a170906219100b0073d81b0882asm5779088eju.7.2022.10.18.06.31.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099900; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XV/FUkjTe/ouWvpIL64KvSzYdBJ0cqh3t/FB4ungLqk=; b=C+Y9GIGi+yvqp1sSbAFUI6X9m6XXxo3V6TT7cT9oPUw9zuGRYqMx+yoV8DN6Z1XynSlMyR d1LbxVV/Fy4uwYBK6htGbIAA6tQO8xvSOfYhpaITYFHJgD0rDvOQiiiaA6P8386OJVNCuh tYbZuV7Dl7U4amCgDjhr/yNjdnP3Ye4= X-MC-Unique: GN35QT0-O3ad6B5-FkdAsw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XV/FUkjTe/ouWvpIL64KvSzYdBJ0cqh3t/FB4ungLqk=; b=U0PvZt4XjwxWZTC5d0tHYpUkM88O2dj6e19LWEEkQrDbnJZjHsS2dEfVf9wKCFlMRT uNHQLyqZiyHDu7p+GUajFXWS/0GSpH7wRLzvGHKvDljY6y8/Q4AIvl8a+pxfZyZbb3O8 isMRA56eibCQDWI8WAs3ZzrQdi/nShPvUSoUe6r6hbSu7nZslT+eU3s0/1W1dWyTEjyE OJapDYC0hKXEygpe/Rh+X8oin17/iOAQKUwm6mcKGaH6EHY25nZVK0GXH/1oA4/LM2QZ CiYR+s3PrROnlmtK35aTW1UP82Z7OW/KfAocEUN205H5kXWSMKtVYsDqjU8M+ppOv49Z +9BA== X-Gm-Message-State: ACrzQf0touQrqPccwJ53mmXNWDf0FM9kszvmIEC90t3ZGOQtDWcRLLwV WEGk9cJ5eVYXCVX8UPeYpBvA2H0Gh3dQvhImL/m1fSzYGONIv1E5q6szLZBE3eoSoSR4MRjvwdi 5Pb2k8GFbauLATNjqcccvSjgL0ATyJe9WsaAN8BYIihj7+EAQIAjXImim0AVe+VjHrYk= X-Received: by 2002:a17:906:401:b0:73d:af73:b78 with SMTP id d1-20020a170906040100b0073daf730b78mr2518828eja.122.1666099896736; Tue, 18 Oct 2022 06:31:36 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6BwKhhVEXymEwsR3WwounUlo3MGkogPYL3pG6mNzupcNG4f+6MIYRmU+Nk2sVVow8zRHg6PQ== X-Received: by 2002:a17:906:401:b0:73d:af73:b78 with SMTP id d1-20020a170906040100b0073daf730b78mr2518800eja.122.1666099896392; Tue, 18 Oct 2022 06:31:36 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 15/53] target/i386: Combine 5 sets of variables in mmu_translate Date: Tue, 18 Oct 2022 15:30:04 +0200 Message-Id: <20221018133042.856368-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101106477100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson We don't need one variable set per translation level, which requires copying into pte/pte_addr for huge pages. Standardize on pte/pte_addr for all levels. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-8-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 178 ++++++++++++++------------- 1 file changed, 91 insertions(+), 87 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 86b3014196..d6b7de6eea 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -82,7 +82,7 @@ static bool mmu_translate(CPUX86State *env, const Transla= teParams *in, const bool is_user =3D (in->mmu_idx =3D=3D MMU_USER_IDX); const MMUAccessType access_type =3D in->access_type; uint64_t ptep, pte; - hwaddr pde_addr, pte_addr; + hwaddr pte_addr; uint64_t rsvd_mask =3D PG_ADDRESS_MASK & ~MAKE_64BIT_MASK(0, cpu->phys= _bits); uint32_t pkr; int page_size; @@ -92,116 +92,122 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, } =20 if (pg_mode & PG_MODE_PAE) { - uint64_t pde, pdpe; - target_ulong pdpe_addr; - #ifdef TARGET_X86_64 if (pg_mode & PG_MODE_LMA) { - bool la57 =3D pg_mode & PG_MODE_LA57; - uint64_t pml5e_addr, pml5e; - uint64_t pml4e_addr, pml4e; - - if (la57) { - pml5e_addr =3D ((in->cr3 & ~0xfff) + - (((addr >> 48) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pml5e_addr); - pml5e =3D x86_ldq_phys(cs, pml5e_addr); - if (!(pml5e & PG_PRESENT_MASK)) { + if (pg_mode & PG_MODE_LA57) { + /* + * Page table level 5 + */ + pte_addr =3D ((in->cr3 & ~0xfff) + + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; + PTE_HPHYS(pte_addr); + pte =3D x86_ldq_phys(cs, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } - if (pml5e & (rsvd_mask | PG_PSE_MASK)) { + if (pte & (rsvd_mask | PG_PSE_MASK)) { goto do_fault_rsvd; } - if (!(pml5e & PG_ACCESSED_MASK)) { - pml5e |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pml5e_addr, pml5e); + if (!(pte & PG_ACCESSED_MASK)) { + pte |=3D PG_ACCESSED_MASK; + x86_stl_phys_notdirty(cs, pte_addr, pte); } - ptep =3D pml5e ^ PG_NX_MASK; + ptep =3D pte ^ PG_NX_MASK; } else { - pml5e =3D in->cr3; + pte =3D in->cr3; ptep =3D PG_NX_MASK | PG_USER_MASK | PG_RW_MASK; } =20 - pml4e_addr =3D ((pml5e & PG_ADDRESS_MASK) + - (((addr >> 39) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pml4e_addr); - pml4e =3D x86_ldq_phys(cs, pml4e_addr); - if (!(pml4e & PG_PRESENT_MASK)) { + /* + * Page table level 4 + */ + pte_addr =3D ((pte & PG_ADDRESS_MASK) + + (((addr >> 39) & 0x1ff) << 3)) & a20_mask; + PTE_HPHYS(pte_addr); + pte =3D x86_ldq_phys(cs, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } - if (pml4e & (rsvd_mask | PG_PSE_MASK)) { + if (pte & (rsvd_mask | PG_PSE_MASK)) { goto do_fault_rsvd; } - if (!(pml4e & PG_ACCESSED_MASK)) { - pml4e |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pml4e_addr, pml4e); + if (!(pte & PG_ACCESSED_MASK)) { + pte |=3D PG_ACCESSED_MASK; + x86_stl_phys_notdirty(cs, pte_addr, pte); } - ptep &=3D pml4e ^ PG_NX_MASK; - pdpe_addr =3D ((pml4e & PG_ADDRESS_MASK) + (((addr >> 30) & 0x= 1ff) << 3)) & - a20_mask; - PTE_HPHYS(pdpe_addr); - pdpe =3D x86_ldq_phys(cs, pdpe_addr); - if (!(pdpe & PG_PRESENT_MASK)) { + ptep &=3D pte ^ PG_NX_MASK; + + /* + * Page table level 3 + */ + pte_addr =3D ((pte & PG_ADDRESS_MASK) + + (((addr >> 30) & 0x1ff) << 3)) & a20_mask; + PTE_HPHYS(pte_addr); + pte =3D x86_ldq_phys(cs, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } - if (pdpe & rsvd_mask) { + if (pte & rsvd_mask) { goto do_fault_rsvd; } - ptep &=3D pdpe ^ PG_NX_MASK; - if (!(pdpe & PG_ACCESSED_MASK)) { - pdpe |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pdpe_addr, pdpe); + ptep &=3D pte ^ PG_NX_MASK; + if (!(pte & PG_ACCESSED_MASK)) { + pte |=3D PG_ACCESSED_MASK; + x86_stl_phys_notdirty(cs, pte_addr, pte); } - if (pdpe & PG_PSE_MASK) { + if (pte & PG_PSE_MASK) { /* 1 GB page */ page_size =3D 1024 * 1024 * 1024; - pte_addr =3D pdpe_addr; - pte =3D pdpe; goto do_check_protect; } } else #endif { - /* XXX: load them when cr3 is loaded ? */ - pdpe_addr =3D ((in->cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & - a20_mask; - PTE_HPHYS(pdpe_addr); - pdpe =3D x86_ldq_phys(cs, pdpe_addr); - if (!(pdpe & PG_PRESENT_MASK)) { + /* + * Page table level 3 + */ + pte_addr =3D ((in->cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & a20= _mask; + PTE_HPHYS(pte_addr); + pte =3D x86_ldq_phys(cs, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } rsvd_mask |=3D PG_HI_USER_MASK; - if (pdpe & (rsvd_mask | PG_NX_MASK)) { + if (pte & (rsvd_mask | PG_NX_MASK)) { goto do_fault_rsvd; } ptep =3D PG_NX_MASK | PG_USER_MASK | PG_RW_MASK; } =20 - pde_addr =3D ((pdpe & PG_ADDRESS_MASK) + (((addr >> 21) & 0x1ff) <= < 3)) & - a20_mask; - PTE_HPHYS(pde_addr); - pde =3D x86_ldq_phys(cs, pde_addr); - if (!(pde & PG_PRESENT_MASK)) { + /* + * Page table level 2 + */ + pte_addr =3D ((pte & PG_ADDRESS_MASK) + + (((addr >> 21) & 0x1ff) << 3)) & a20_mask; + PTE_HPHYS(pte_addr); + pte =3D x86_ldq_phys(cs, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } - if (pde & rsvd_mask) { + if (pte & rsvd_mask) { goto do_fault_rsvd; } - ptep &=3D pde ^ PG_NX_MASK; - if (pde & PG_PSE_MASK) { + ptep &=3D pte ^ PG_NX_MASK; + if (pte & PG_PSE_MASK) { /* 2 MB page */ page_size =3D 2048 * 1024; - pte_addr =3D pde_addr; - pte =3D pde; goto do_check_protect; } - /* 4 KB page */ - if (!(pde & PG_ACCESSED_MASK)) { - pde |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pde_addr, pde); + if (!(pte & PG_ACCESSED_MASK)) { + pte |=3D PG_ACCESSED_MASK; + x86_stl_phys_notdirty(cs, pte_addr, pte); } - pte_addr =3D ((pde & PG_ADDRESS_MASK) + (((addr >> 12) & 0x1ff) <<= 3)) & - a20_mask; + + /* + * Page table level 1 + */ + pte_addr =3D ((pte & PG_ADDRESS_MASK) + + (((addr >> 12) & 0x1ff) << 3)) & a20_mask; PTE_HPHYS(pte_addr); pte =3D x86_ldq_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { @@ -214,39 +220,37 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, ptep &=3D pte ^ PG_NX_MASK; page_size =3D 4096; } else { - uint32_t pde; - - /* page directory entry */ - pde_addr =3D ((in->cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & - a20_mask; - PTE_HPHYS(pde_addr); - pde =3D x86_ldl_phys(cs, pde_addr); - if (!(pde & PG_PRESENT_MASK)) { + /* + * Page table level 2 + */ + pte_addr =3D ((in->cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & a20_m= ask; + PTE_HPHYS(pte_addr); + pte =3D x86_ldl_phys(cs, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } - ptep =3D pde | PG_NX_MASK; + ptep =3D pte | PG_NX_MASK; =20 /* if PSE bit is set, then we use a 4MB page */ - if ((pde & PG_PSE_MASK) && (pg_mode & PG_MODE_PSE)) { + if ((pte & PG_PSE_MASK) && (pg_mode & PG_MODE_PSE)) { page_size =3D 4096 * 1024; - pte_addr =3D pde_addr; - - /* Bits 20-13 provide bits 39-32 of the address, bit 21 is res= erved. + /* + * Bits 20-13 provide bits 39-32 of the address, bit 21 is res= erved. * Leave bits 20-13 in place for setting accessed/dirty bits b= elow. */ - pte =3D pde | ((pde & 0x1fe000LL) << (32 - 13)); + pte =3D (uint32_t)pte | ((pte & 0x1fe000LL) << (32 - 13)); rsvd_mask =3D 0x200000; goto do_check_protect_pse36; } - - if (!(pde & PG_ACCESSED_MASK)) { - pde |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pde_addr, pde); + if (!(pte & PG_ACCESSED_MASK)) { + pte |=3D PG_ACCESSED_MASK; + x86_stl_phys_notdirty(cs, pte_addr, pte); } =20 - /* page directory entry */ - pte_addr =3D ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & - a20_mask; + /* + * Page table level 1 + */ + pte_addr =3D ((pte & ~0xfffu) + ((addr >> 10) & 0xffc)) & a20_mask; PTE_HPHYS(pte_addr); pte =3D x86_ldl_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101100; cv=none; d=zohomail.com; s=zohoarc; b=iNQcSsI1zukED457S4Xx+AbCdrxRNuxguf6SPntCM0ycVx46LWcDJSpV8nwTQGFzEFY3YxUxEM1rcQXbx1zXktINBMgnqnCzD48B3v7dPrbIr7eTtk00+yRZ1bHPBQI9XEvUz5Okr3EUkMW8jMvOkD3DK3MsrEro4eOnGT5V9mc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101100; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=m2dHx0LRW585ke2Q9ChlHIyJ/9MxV4ZPgyjFBz6CRbw=; b=iyNL7B8RwEDpWXc9J+EVNyr9Kx3aEWIo9HUggwWwBtXfVXGHBlo7GG2GnZomLxl8sswI4SSxvFuX532TDAT1UlNwn2EhFZsc70IOc1t7pOjrtetNanjSWWgOFvRA5Zad5uc9GRxM6mos4k8f+MeyA7WK5aRq1P2/Q7c2PhvI410= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101100641335.1377530053288; Tue, 18 Oct 2022 06:51:40 -0700 (PDT) Received: from localhost ([::1]:34670 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0M-000083-SN for importer@patchew.org; Tue, 18 Oct 2022 09:51:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53002) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhA-0002yi-FU for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:48 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:35815) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh5-00054M-VK for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:47 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-448-v48Jl67DPYyvJGmAefC7Ig-1; Tue, 18 Oct 2022 09:31:41 -0400 Received: by mail-ej1-f71.google.com with SMTP id xj11-20020a170906db0b00b0077b6ecb23fcso6332189ejb.5 for ; Tue, 18 Oct 2022 06:31:41 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id gy9-20020a170906f24900b0073ddd36ba8csm7498030ejb.145.2022.10.18.06.31.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099903; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=m2dHx0LRW585ke2Q9ChlHIyJ/9MxV4ZPgyjFBz6CRbw=; b=UI0Ach6cPbUWGmkwqW3dOjVfqmsgS6YKNcA8AeTB4MxtrnSgas0c9FhrioCjQLtRY4N/cd x+83+yr+Y3SkOD9YRvgZdy1vyPuVdtUOzQzDzVNXy47qRkB/FpX0lszFvAdfyhicNyRgPE cogc3xn6UPdrpKfFInkY/a0FXpBi3XM= X-MC-Unique: v48Jl67DPYyvJGmAefC7Ig-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m2dHx0LRW585ke2Q9ChlHIyJ/9MxV4ZPgyjFBz6CRbw=; b=HABJIQdgXYbJl47dNKumNzFvBCv2tDGpdwnOExKh7X2Pxbk9diRw1xlpqCQfIUaBk6 OmxWWEtit/fxYCIOH/oGw/oP1FfhTQh1tNJojT3DwyLEI2mpRI5/6+N0Wj8WpEP9/iUn GuJltDVZhZTgU61PxT4nu0tFAblPoB5/OFtnT43kD76bjhwBeHRwnYjklXWswmRAM8SO EHjDv8NU4aRU3Shi+m5svXC8i9yD6R4bJVeMQaPphFwyV+XEWc83uouUHsLfqcjRUIUg g1o65Y+EmKQwYvh+rZn29DD+5N9Hc1WKo2IDQ36nyEbOQ174WbFzWVY8CXE3BYpXByLB wYMg== X-Gm-Message-State: ACrzQf0jHZGOcDqYfZD73w4av6IFn5H6IlCZkvIpVfMCbbVPZOSh2IS2 qLhBAggVsX1hr76eF5md6jo4aZJVlimBq+pY+w06kzeTr1n17gBofHg2j6qJPx7jfps34iuyHtZ RjBTnPUHFflbZ98kuFcOfWnDlTR6mL7KFx19AUYQLU7irrgy4Ua9TZCREYN1HHsQXbKA= X-Received: by 2002:a05:6402:164c:b0:459:1e2e:e742 with SMTP id s12-20020a056402164c00b004591e2ee742mr2578397edx.125.1666099900171; Tue, 18 Oct 2022 06:31:40 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6dDfYt2pzP4bGDm93O4iWc7h19UC06FdvjqZZcj8/JyHGcUTXkfJeSafQBd87ktEXrU5RuKw== X-Received: by 2002:a05:6402:164c:b0:459:1e2e:e742 with SMTP id s12-20020a056402164c00b004591e2ee742mr2578365edx.125.1666099899751; Tue, 18 Oct 2022 06:31:39 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 16/53] target/i386: Use atomic operations for pte updates Date: Tue, 18 Oct 2022 15:30:05 +0200 Message-Id: <20221018133042.856368-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101102367100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Use probe_access_full in order to resolve to a host address, which then lets us use a host cmpxchg to update the pte. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/279 Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-9-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 242 +++++++++++++++++++-------- 1 file changed, 168 insertions(+), 74 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index d6b7de6eea..e8457e9b21 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -27,8 +27,8 @@ typedef struct TranslateParams { target_ulong cr3; int pg_mode; int mmu_idx; + int ptw_idx; MMUAccessType access_type; - bool use_stage2; } TranslateParams; =20 typedef struct TranslateResult { @@ -50,43 +50,106 @@ typedef struct TranslateFault { TranslateFaultStage2 stage2; } TranslateFault; =20 -#define PTE_HPHYS(ADDR) \ - do { \ - if (in->use_stage2) { \ - nested_in.addr =3D (ADDR); \ - if (!mmu_translate(env, &nested_in, out, err)) { \ - err->stage2 =3D S2_GPT; \ - return false; \ - } \ - (ADDR) =3D out->paddr; \ - } \ - } while (0) +typedef struct PTETranslate { + CPUX86State *env; + TranslateFault *err; + int ptw_idx; + void *haddr; + hwaddr gaddr; +} PTETranslate; + +static bool ptw_translate(PTETranslate *inout, hwaddr addr) +{ + CPUTLBEntryFull *full; + int flags; + + inout->gaddr =3D addr; + flags =3D probe_access_full(inout->env, addr, MMU_DATA_STORE, + inout->ptw_idx, true, &inout->haddr, &full, = 0); + + if (unlikely(flags & TLB_INVALID_MASK)) { + TranslateFault *err =3D inout->err; + + assert(inout->ptw_idx =3D=3D MMU_NESTED_IDX); + err->exception_index =3D 0; /* unused */ + err->error_code =3D inout->env->error_code; + err->cr2 =3D addr; + err->stage2 =3D S2_GPT; + return false; + } + return true; +} + +static inline uint32_t ptw_ldl(const PTETranslate *in) +{ + if (likely(in->haddr)) { + return ldl_p(in->haddr); + } + return cpu_ldl_mmuidx_ra(in->env, in->gaddr, in->ptw_idx, 0); +} + +static inline uint64_t ptw_ldq(const PTETranslate *in) +{ + if (likely(in->haddr)) { + return ldq_p(in->haddr); + } + return cpu_ldq_mmuidx_ra(in->env, in->gaddr, in->ptw_idx, 0); +} + +/* + * Note that we can use a 32-bit cmpxchg for all page table entries, + * even 64-bit ones, because PG_PRESENT_MASK, PG_ACCESSED_MASK and + * PG_DIRTY_MASK are all in the low 32 bits. + */ +static bool ptw_setl_slow(const PTETranslate *in, uint32_t old, uint32_t n= ew) +{ + uint32_t cmp; + + /* Does x86 really perform a rmw cycle on mmio for ptw? */ + start_exclusive(); + cmp =3D cpu_ldl_mmuidx_ra(in->env, in->gaddr, in->ptw_idx, 0); + if (cmp =3D=3D old) { + cpu_stl_mmuidx_ra(in->env, in->gaddr, new, in->ptw_idx, 0); + } + end_exclusive(); + return cmp =3D=3D old; +} + +static inline bool ptw_setl(const PTETranslate *in, uint32_t old, uint32_t= set) +{ + if (set & ~old) { + uint32_t new =3D old | set; + if (likely(in->haddr)) { + old =3D cpu_to_le32(old); + new =3D cpu_to_le32(new); + return qatomic_cmpxchg((uint32_t *)in->haddr, old, new) =3D=3D= old; + } + return ptw_setl_slow(in, old, new); + } + return true; +} =20 static bool mmu_translate(CPUX86State *env, const TranslateParams *in, TranslateResult *out, TranslateFault *err) { - TranslateParams nested_in =3D { - /* Use store for page table entries, to allow A/D flag updates. */ - .access_type =3D MMU_DATA_STORE, - .cr3 =3D env->nested_cr3, - .pg_mode =3D env->nested_pg_mode, - .mmu_idx =3D MMU_USER_IDX, - .use_stage2 =3D false, - }; - - CPUState *cs =3D env_cpu(env); - X86CPU *cpu =3D env_archcpu(env); const int32_t a20_mask =3D x86_get_a20_mask(env); const target_ulong addr =3D in->addr; const int pg_mode =3D in->pg_mode; const bool is_user =3D (in->mmu_idx =3D=3D MMU_USER_IDX); const MMUAccessType access_type =3D in->access_type; - uint64_t ptep, pte; + uint64_t ptep, pte, rsvd_mask; + PTETranslate pte_trans =3D { + .env =3D env, + .err =3D err, + .ptw_idx =3D in->ptw_idx, + }; hwaddr pte_addr; - uint64_t rsvd_mask =3D PG_ADDRESS_MASK & ~MAKE_64BIT_MASK(0, cpu->phys= _bits); uint32_t pkr; int page_size; =20 + restart_all: + rsvd_mask =3D ~MAKE_64BIT_MASK(0, env_archcpu(env)->phys_bits); + rsvd_mask &=3D PG_ADDRESS_MASK; if (!(pg_mode & PG_MODE_NXE)) { rsvd_mask |=3D PG_NX_MASK; } @@ -100,17 +163,19 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, */ pte_addr =3D ((in->cr3 & ~0xfff) + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldq_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + restart_5: + pte =3D ptw_ldq(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } if (pte & (rsvd_mask | PG_PSE_MASK)) { goto do_fault_rsvd; } - if (!(pte & PG_ACCESSED_MASK)) { - pte |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pte_addr, pte); + if (!ptw_setl(&pte_trans, pte, PG_ACCESSED_MASK)) { + goto restart_5; } ptep =3D pte ^ PG_NX_MASK; } else { @@ -123,17 +188,19 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, */ pte_addr =3D ((pte & PG_ADDRESS_MASK) + (((addr >> 39) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldq_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + restart_4: + pte =3D ptw_ldq(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } if (pte & (rsvd_mask | PG_PSE_MASK)) { goto do_fault_rsvd; } - if (!(pte & PG_ACCESSED_MASK)) { - pte |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pte_addr, pte); + if (!ptw_setl(&pte_trans, pte, PG_ACCESSED_MASK)) { + goto restart_4; } ptep &=3D pte ^ PG_NX_MASK; =20 @@ -142,19 +209,21 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, */ pte_addr =3D ((pte & PG_ADDRESS_MASK) + (((addr >> 30) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldq_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + restart_3_lma: + pte =3D ptw_ldq(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } if (pte & rsvd_mask) { goto do_fault_rsvd; } - ptep &=3D pte ^ PG_NX_MASK; - if (!(pte & PG_ACCESSED_MASK)) { - pte |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pte_addr, pte); + if (!ptw_setl(&pte_trans, pte, PG_ACCESSED_MASK)) { + goto restart_3_lma; } + ptep &=3D pte ^ PG_NX_MASK; if (pte & PG_PSE_MASK) { /* 1 GB page */ page_size =3D 1024 * 1024 * 1024; @@ -167,15 +236,21 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, * Page table level 3 */ pte_addr =3D ((in->cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & a20= _mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldq_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + rsvd_mask |=3D PG_HI_USER_MASK; + restart_3_nolma: + pte =3D ptw_ldq(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } - rsvd_mask |=3D PG_HI_USER_MASK; if (pte & (rsvd_mask | PG_NX_MASK)) { goto do_fault_rsvd; } + if (!ptw_setl(&pte_trans, pte, PG_ACCESSED_MASK)) { + goto restart_3_nolma; + } ptep =3D PG_NX_MASK | PG_USER_MASK | PG_RW_MASK; } =20 @@ -184,32 +259,37 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, */ pte_addr =3D ((pte & PG_ADDRESS_MASK) + (((addr >> 21) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldq_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + restart_2_pae: + pte =3D ptw_ldq(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } if (pte & rsvd_mask) { goto do_fault_rsvd; } - ptep &=3D pte ^ PG_NX_MASK; if (pte & PG_PSE_MASK) { /* 2 MB page */ page_size =3D 2048 * 1024; + ptep &=3D pte ^ PG_NX_MASK; goto do_check_protect; } - if (!(pte & PG_ACCESSED_MASK)) { - pte |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pte_addr, pte); + if (!ptw_setl(&pte_trans, pte, PG_ACCESSED_MASK)) { + goto restart_2_pae; } + ptep &=3D pte ^ PG_NX_MASK; =20 /* * Page table level 1 */ pte_addr =3D ((pte & PG_ADDRESS_MASK) + (((addr >> 12) & 0x1ff) << 3)) & a20_mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldq_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + pte =3D ptw_ldq(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } @@ -224,8 +304,11 @@ static bool mmu_translate(CPUX86State *env, const Tran= slateParams *in, * Page table level 2 */ pte_addr =3D ((in->cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & a20_m= ask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldl_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + restart_2_nopae: + pte =3D ptw_ldl(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } @@ -242,17 +325,18 @@ static bool mmu_translate(CPUX86State *env, const Tra= nslateParams *in, rsvd_mask =3D 0x200000; goto do_check_protect_pse36; } - if (!(pte & PG_ACCESSED_MASK)) { - pte |=3D PG_ACCESSED_MASK; - x86_stl_phys_notdirty(cs, pte_addr, pte); + if (!ptw_setl(&pte_trans, pte, PG_ACCESSED_MASK)) { + goto restart_2_nopae; } =20 /* * Page table level 1 */ pte_addr =3D ((pte & ~0xfffu) + ((addr >> 10) & 0xffc)) & a20_mask; - PTE_HPHYS(pte_addr); - pte =3D x86_ldl_phys(cs, pte_addr); + if (!ptw_translate(&pte_trans, pte_addr)) { + return false; + } + pte =3D ptw_ldl(&pte_trans); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; } @@ -319,27 +403,35 @@ do_check_protect_pse36: uint32_t set =3D PG_ACCESSED_MASK; if (access_type =3D=3D MMU_DATA_STORE) { set |=3D PG_DIRTY_MASK; + } else if (!(pte & PG_DIRTY_MASK)) { + /* + * Only set write access if already dirty... + * otherwise wait for dirty access. + */ + prot &=3D ~PAGE_WRITE; } - if (set & ~pte) { - pte |=3D set; - x86_stl_phys_notdirty(cs, pte_addr, pte); + if (!ptw_setl(&pte_trans, pte, set)) { + /* + * We can arrive here from any of 3 levels and 2 formats. + * The only safe thing is to restart the entire lookup. + */ + goto restart_all; } } =20 - if (!(pte & PG_DIRTY_MASK)) { - /* only set write access if already dirty... otherwise wait - for dirty access */ - assert(access_type !=3D MMU_DATA_STORE); - prot &=3D ~PAGE_WRITE; - } - /* align to page_size */ out->paddr =3D (pte & a20_mask & PG_ADDRESS_MASK & ~(page_size - 1)) | (addr & (page_size - 1)); =20 - if (in->use_stage2) { - nested_in.addr =3D out->paddr; - nested_in.access_type =3D access_type; + if (in->ptw_idx =3D=3D MMU_NESTED_IDX) { + TranslateParams nested_in =3D { + .addr =3D out->paddr, + .access_type =3D access_type, + .cr3 =3D env->nested_cr3, + .pg_mode =3D env->nested_pg_mode, + .mmu_idx =3D MMU_USER_IDX, + .ptw_idx =3D MMU_PHYS_IDX, + }; =20 if (!mmu_translate(env, &nested_in, out, err)) { err->stage2 =3D S2_GPA; @@ -436,7 +528,7 @@ static bool get_physical_address(CPUX86State *env, vadd= r addr, in.cr3 =3D env->nested_cr3; in.pg_mode =3D env->nested_pg_mode; in.mmu_idx =3D MMU_USER_IDX; - in.use_stage2 =3D false; + in.ptw_idx =3D MMU_PHYS_IDX; =20 if (!mmu_translate(env, &in, out, err)) { err->stage2 =3D S2_GPA; @@ -449,7 +541,7 @@ static bool get_physical_address(CPUX86State *env, vadd= r addr, default: in.cr3 =3D env->cr[3]; in.mmu_idx =3D mmu_idx; - in.use_stage2 =3D use_stage2; + in.ptw_idx =3D use_stage2 ? MMU_NESTED_IDX : MMU_PHYS_IDX; in.pg_mode =3D get_pg_mode(env); =20 if (likely(in.pg_mode)) { @@ -504,6 +596,8 @@ bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int siz= e, } =20 if (probe) { + /* This will be used if recursing for stage2 translation. */ + env->error_code =3D err.error_code; return false; } =20 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101111; cv=none; d=zohomail.com; s=zohoarc; b=ZmdBfzp84emCksmoh6N6q7YrgLBf2SJzCat6dWxQy/n7Ny6+J0IWcVT1fCQa8TBBJ58gHckkzewnScAiV6HcyWKcjISMns/hsxMNR/ThsZ54XRBqm//e/ovZhhc1UmmvZDQsLPBAOlAOC1rBgmmGKzGqXauYW3MaXK2tRIdcLD8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101111; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=2F97ColJI+7lzgMeZU3g4eV1pMug9BLejVEp/uW8X/A=; b=WupZ7vaNqj4CbYEFLh1ao/4UQdTvKZ9oqpuiJPJgujAjqPKLSAC9MCtKALrxUTldj8V+X/GrGvPRIKRGwtjQjmH5tHJbvDeBeaLyf8BZW8cu1NKyuhCdLRGmgRuGt0emut3pjJ51fs9pgHCdJ6vqwC4uX8GukWl6o/r1te87sPs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101111094629.5206654872349; Tue, 18 Oct 2022 06:51:51 -0700 (PDT) Received: from localhost ([::1]:52702 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0U-0008Ko-5d for importer@patchew.org; Tue, 18 Oct 2022 09:51:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53004) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhC-00033L-FE for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:50 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:29819) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmh9-00054z-9p for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:49 -0400 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-481-adipXhunMZ-jduEMNCAnqw-1; Tue, 18 Oct 2022 09:31:45 -0400 Received: by mail-ej1-f72.google.com with SMTP id hp41-20020a1709073e2900b0078e07dbf280so6356613ejc.7 for ; Tue, 18 Oct 2022 06:31:45 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id w14-20020a170906384e00b0078246b1360fsm7477339ejc.131.2022.10.18.06.31.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099906; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2F97ColJI+7lzgMeZU3g4eV1pMug9BLejVEp/uW8X/A=; b=PoRUyqCxQt7A3ONBgIUN2NsSYymFDNzIYyGumFCxJ1fFNqwPpvD7oebI/UR+2NJa51KzwN JoMGnPnWH3PYdskdHPJmCXuH8QeHlxSjL57/rcxk+H7+d3z/YgXeEqZqE4ZV0ZS6Li0ybf GITVFQ48b7WwGNTgPSyik7LZRU33Y+M= X-MC-Unique: adipXhunMZ-jduEMNCAnqw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2F97ColJI+7lzgMeZU3g4eV1pMug9BLejVEp/uW8X/A=; b=V3CgwODvRdBFvawuuZRTJVInc3l/UQtA/DzVgpV67wph23Z/tXUpbn4LX9mwmn1sTJ 2QS2UZJ+HtARlfYAfs15tS+kW6qZglSXkparOhJVDS9VFXSKjlFl53uhnSOS9ahNUaxN MOrjwuJ+FU/1NG7GQghIUdHYsdn+kVsZ6vfXlSftD21+pLm2Mc7lE17T4C/joRcuae41 23V6y2AVUuMlYcQm9v3PbLZR5ZPY/mdDH9P9AmfTIdzWC9gkoFtLHXiWsIEwb6gfbvlx rxZTj58+eyHLc60wM946Sm7Q5JVVwQ8XuUxPCcFJTvf3Ne/atNlZiXlf5IlEdI9EKIOy 9R6Q== X-Gm-Message-State: ACrzQf0z7J/bHftx1SfdIrKkKJFrbcRzvIP9YWgmbFPP5tlnh5esKhN5 BMwC3umrkR2uEZVEQ1GMqTxeJiLubhtQYg/TnCpCfhE2X7wj0LWWFVF9nUsk5ZIh9RmsbEZrLn3 4Nb15llGeQh9MoSqeukTcDLSuiVvmrcGSk8pK5IqgmfapUMWaUUv1NKSwDP50feGJdrU= X-Received: by 2002:a05:6402:ca:b0:45c:dbdd:8143 with SMTP id i10-20020a05640200ca00b0045cdbdd8143mr2619830edu.213.1666099903534; Tue, 18 Oct 2022 06:31:43 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6nNrJh/e0JBxg1MRWs4S0vIY5bEaWFwglS9zvwmmq0djcdBFCtEcrdMBrQW9fr0ZQAgjLegQ== X-Received: by 2002:a05:6402:ca:b0:45c:dbdd:8143 with SMTP id i10-20020a05640200ca00b0045cdbdd8143mr2619799edu.213.1666099903242; Tue, 18 Oct 2022 06:31:43 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 17/53] target/i386: Use probe_access_full for final stage2 translation Date: Tue, 18 Oct 2022 15:30:06 +0200 Message-Id: <20221018133042.856368-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101112415100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Rather than recurse directly on mmu_translate, go through the same softmmu lookup that we did for the page table walk. This centralizes all knowledge of MMU_NESTED_IDX, with respect to setup of TranslationParams, to get_physical_address. Signed-off-by: Richard Henderson Message-Id: <20221002172956.265735-10-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 40 +++++++++++++++++++--------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index e8457e9b21..d51b5d7431 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -143,7 +143,7 @@ static bool mmu_translate(CPUX86State *env, const Trans= lateParams *in, .err =3D err, .ptw_idx =3D in->ptw_idx, }; - hwaddr pte_addr; + hwaddr pte_addr, paddr; uint32_t pkr; int page_size; =20 @@ -420,33 +420,47 @@ do_check_protect_pse36: } =20 /* align to page_size */ - out->paddr =3D (pte & a20_mask & PG_ADDRESS_MASK & ~(page_size - 1)) - | (addr & (page_size - 1)); + paddr =3D (pte & a20_mask & PG_ADDRESS_MASK & ~(page_size - 1)) + | (addr & (page_size - 1)); =20 if (in->ptw_idx =3D=3D MMU_NESTED_IDX) { - TranslateParams nested_in =3D { - .addr =3D out->paddr, - .access_type =3D access_type, - .cr3 =3D env->nested_cr3, - .pg_mode =3D env->nested_pg_mode, - .mmu_idx =3D MMU_USER_IDX, - .ptw_idx =3D MMU_PHYS_IDX, - }; + CPUTLBEntryFull *full; + int flags, nested_page_size; =20 - if (!mmu_translate(env, &nested_in, out, err)) { + flags =3D probe_access_full(env, paddr, access_type, + MMU_NESTED_IDX, true, + &pte_trans.haddr, &full, 0); + if (unlikely(flags & TLB_INVALID_MASK)) { + err->exception_index =3D 0; /* unused */ + err->error_code =3D env->error_code; + err->cr2 =3D paddr; err->stage2 =3D S2_GPA; return false; } =20 /* Merge stage1 & stage2 protection bits. */ - prot &=3D out->prot; + prot &=3D full->prot; =20 /* Re-verify resulting protection. */ if ((prot & (1 << access_type)) =3D=3D 0) { goto do_fault_protect; } + + /* Merge stage1 & stage2 addresses to final physical address. */ + nested_page_size =3D 1 << full->lg_page_size; + paddr =3D (full->phys_addr & ~(nested_page_size - 1)) + | (paddr & (nested_page_size - 1)); + + /* + * Use the larger of stage1 & stage2 page sizes, so that + * invalidation works. + */ + if (nested_page_size > page_size) { + page_size =3D nested_page_size; + } } =20 + out->paddr =3D paddr; out->prot =3D prot; out->page_size =3D page_size; return true; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102181; cv=none; d=zohomail.com; s=zohoarc; b=XHKklrUOG0Wp3Ta7eSCYecrJirjvO8EBnEly2RLJtNMzScGibQ4VK/iMilScWlqS0yKq6CMZCcQdmYeXiYE94ZnDsVolsyS5UGxT1+Lnk+bej9aZ1VyuzuyNioFsjLEG+1w4yPPaHtZ4RgZMZwmETdo+aDa1fBsmg4/B4tvSn5I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102181; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=pFvE2IPwyAj8J17/+xngYCMPf0scv6DEdgFJ5PKv0jo=; b=h7zuOee5MhD2/47WHD28R8oA9R8E4TJDyTNk8+6HURrLK8Kf6Oq4rUtlIZ9OdtZRH+0zP03LpMIiotBtAr0CwPXHMj8+gEBfzB4tdSHAMfIWu5OjOF+F5Wq3qDWj1tXdxLv4fY+wL+Fmnd4wMj8qQ+qIcJEf2lznrlo38Tptb7Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102181721651.7748381874275; Tue, 18 Oct 2022 07:09:41 -0700 (PDT) Received: from localhost ([::1]:55030 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknHo-0004IF-0r for importer@patchew.org; Tue, 18 Oct 2022 10:09:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53008) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhH-0003LI-1O for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:55 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:23425) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhE-00055Z-2v for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:53 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-341-oFuhPaBvNz-bs7BfxXcseQ-1; Tue, 18 Oct 2022 09:31:48 -0400 Received: by mail-ej1-f70.google.com with SMTP id sa6-20020a1709076d0600b0078d84ed54b9so6375010ejc.18 for ; Tue, 18 Oct 2022 06:31:48 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id nb36-20020a1709071ca400b00780f24b797dsm7594559ejc.108.2022.10.18.06.31.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099909; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pFvE2IPwyAj8J17/+xngYCMPf0scv6DEdgFJ5PKv0jo=; b=Kyc+fhR5H9EChB+jt8F/Qr8bTOGHZO7VeIVCXFePliJ2L1xIFRYNIMHLfKM5s5j49Yo0RX Bm5iqk+GXO4l/xWcl7KI4g1xAdp8ZpMQwYDLnOx+rmirZ0VkefEqiTdACPMHj/XfL4KSPj WHDin0cywzf1JZsIH82X0vlz7n1SJPk= X-MC-Unique: oFuhPaBvNz-bs7BfxXcseQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pFvE2IPwyAj8J17/+xngYCMPf0scv6DEdgFJ5PKv0jo=; b=1MirQoY7OMxc/8DRRCS4my8V0G7vjOwnHOg2zzHJRuT1ZkIzuRZ/wSH5uB31x60v1P OFBcUJ7Vyk6AG27gKeMnDpXcPkZpCeJWJu5HNX5YUlA/NNd9O9+9yOBeh7GW1sBM6whT z2kwRlW7Ywe5XUYFXZ4TglwZdpqmZiYyldhwQNz8cpLGwbhB4xPyIalJRyzFHKEJYchj S2dOi3xio2edeSpHOCKtCLKofOoiPgEk5huX/vkoQu3sd7ocvGUKsZd0cTMqg/oI/3Os Dp8FianYcjFoyhAvzmy8M531UXGa/ZiTwn33UTyiSkOxfZkgQk8PFNlneC8suVIwA9B2 PFdA== X-Gm-Message-State: ACrzQf2ENuaqN3FHJziW7uJlcDrP/C7bj6RV8lEPEKIHIeSiD1ls6L4I Ku/CP97RoFRg4jBEcFejoSU1Bh67sEdVUlzZjLh3zC1FjfsGQUBciudJlrYtdL2QPQC0ZxHcQup l66DSmHF+1Nm20mmn9ATIuG/XgfELaNc9/vsg22xgjkUEHhW8Sd8NTbWgPV/yo6MMHmA= X-Received: by 2002:a17:907:80b:b0:77a:86a1:db52 with SMTP id wv11-20020a170907080b00b0077a86a1db52mr2559448ejb.294.1666099906758; Tue, 18 Oct 2022 06:31:46 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6uTbK9KCy0mJFYE+5ZFWlMbgfK+R+AM6f7pd73/MzlaHrCjfaSNCTyczbz6NlVxlmPHihrwA== X-Received: by 2002:a17:907:80b:b0:77a:86a1:db52 with SMTP id wv11-20020a170907080b00b0077a86a1db52mr2559422ejb.294.1666099906432; Tue, 18 Oct 2022 06:31:46 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 18/53] target/i386: Define XMMReg and access macros, align ZMM registers Date: Tue, 18 Oct 2022 15:30:07 +0200 Message-Id: <20221018133042.856368-19-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102182032100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson This will be used for emission and endian adjustments of gvec operations. Signed-off-by: Richard Henderson Message-Id: <20220822223722.1697758-2-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 56 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 6bb6653e76..5be90e72a9 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1233,18 +1233,34 @@ typedef struct SegmentCache { uint32_t flags; } SegmentCache; =20 -#define MMREG_UNION(n, bits) \ - union n { \ - uint8_t _b_##n[(bits)/8]; \ - uint16_t _w_##n[(bits)/16]; \ - uint32_t _l_##n[(bits)/32]; \ - uint64_t _q_##n[(bits)/64]; \ - float32 _s_##n[(bits)/32]; \ - float64 _d_##n[(bits)/64]; \ - } +typedef union MMXReg { + uint8_t _b_MMXReg[64 / 8]; + uint16_t _w_MMXReg[64 / 16]; + uint32_t _l_MMXReg[64 / 32]; + uint64_t _q_MMXReg[64 / 64]; + float32 _s_MMXReg[64 / 32]; + float64 _d_MMXReg[64 / 64]; +} MMXReg; =20 -typedef MMREG_UNION(ZMMReg, 512) ZMMReg; -typedef MMREG_UNION(MMXReg, 64) MMXReg; +typedef union XMMReg { + uint64_t _q_XMMReg[128 / 64]; +} XMMReg; + +typedef union YMMReg { + uint64_t _q_YMMReg[256 / 64]; + XMMReg _x_YMMReg[256 / 128]; +} YMMReg; + +typedef union ZMMReg { + uint8_t _b_ZMMReg[512 / 8]; + uint16_t _w_ZMMReg[512 / 16]; + uint32_t _l_ZMMReg[512 / 32]; + uint64_t _q_ZMMReg[512 / 64]; + float32 _s_ZMMReg[512 / 32]; + float64 _d_ZMMReg[512 / 64]; + XMMReg _x_ZMMReg[512 / 128]; + YMMReg _y_ZMMReg[512 / 256]; +} ZMMReg; =20 typedef struct BNDReg { uint64_t lb; @@ -1267,6 +1283,13 @@ typedef struct BNDCSReg { #define ZMM_S(n) _s_ZMMReg[15 - (n)] #define ZMM_Q(n) _q_ZMMReg[7 - (n)] #define ZMM_D(n) _d_ZMMReg[7 - (n)] +#define ZMM_X(n) _x_ZMMReg[3 - (n)] +#define ZMM_Y(n) _y_ZMMReg[1 - (n)] + +#define XMM_Q(n) _q_XMMReg[1 - (n)] + +#define YMM_Q(n) _q_YMMReg[3 - (n)] +#define YMM_X(n) _x_YMMReg[1 - (n)] =20 #define MMX_B(n) _b_MMXReg[7 - (n)] #define MMX_W(n) _w_MMXReg[3 - (n)] @@ -1279,6 +1302,13 @@ typedef struct BNDCSReg { #define ZMM_S(n) _s_ZMMReg[n] #define ZMM_Q(n) _q_ZMMReg[n] #define ZMM_D(n) _d_ZMMReg[n] +#define ZMM_X(n) _x_ZMMReg[n] +#define ZMM_Y(n) _y_ZMMReg[n] + +#define XMM_Q(n) _q_XMMReg[n] + +#define YMM_Q(n) _q_YMMReg[n] +#define YMM_X(n) _x_YMMReg[n] =20 #define MMX_B(n) _b_MMXReg[n] #define MMX_W(n) _w_MMXReg[n] @@ -1556,8 +1586,8 @@ typedef struct CPUArchState { float_status mmx_status; /* for 3DNow! float ops */ float_status sse_status; uint32_t mxcsr; - ZMMReg xmm_regs[CPU_NB_REGS =3D=3D 8 ? 8 : 32]; - ZMMReg xmm_t0; + ZMMReg xmm_regs[CPU_NB_REGS =3D=3D 8 ? 8 : 32] QEMU_ALIGNED(16); + ZMMReg xmm_t0 QEMU_ALIGNED(16); MMXReg mmx_t0; =20 uint64_t opmask_regs[NB_OPMASK_REGS]; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101131; cv=none; d=zohomail.com; s=zohoarc; b=W5xsPsPlamyeC2iKWJ35aZEwT0FN2lppVLyoTMX9b3ufp0sXtAiWfN8LfhzhTV3ioKO/Bsom6ITVxTy93ToNi/amXwAUPlJifbfqfFZANw5opUjbYrQUpCaIFe97VQVh7ejhC1mHFCJ/XSWlxkHz3l8+YcNeD1MfjKUNTYwSJjM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101131; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Oc1sRBtOXv+SeliZwXtm5zuza9PKebWIQDt4DQiKTqU=; b=dAvrnTbS2mQLni+KehmO+i3EV4TK7kgzb++DcsC/5wvZDDdsC8qZqLOBVT7mrcesdD1x/baPaS+B/iTE1duxb4gUJJQAOsLQlNNa1Mf5ol2l+ZOZ2a3+SEoI+o5ETyvY4Pjj+mEqGO+8OqFVsb6Gm5iGNUGfoAq6CJ4xGLSxAzE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101131728914.0571294573712; Tue, 18 Oct 2022 06:52:11 -0700 (PDT) Received: from localhost ([::1]:58384 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0s-0000vX-Li for importer@patchew.org; Tue, 18 Oct 2022 09:52:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44872) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhI-0003T0-4p for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:56 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:44675) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhF-000575-SX for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:31:55 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-283-E_FxTZmZNyOC3CHAt78oHw-1; Tue, 18 Oct 2022 09:31:51 -0400 Received: by mail-ed1-f70.google.com with SMTP id w20-20020a05640234d400b0045d0d1afe8eso10131771edc.15 for ; Tue, 18 Oct 2022 06:31:51 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id kw8-20020a170907770800b007821f4bc328sm7701156ejc.178.2022.10.18.06.31.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099913; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Oc1sRBtOXv+SeliZwXtm5zuza9PKebWIQDt4DQiKTqU=; b=TSvrOi3POU7jYCw5o3fVUWww1J5Lxgl/1/xTAtxE7NcsgIRnAPfHNO9+0sxrcyvhOOEYWu hU0hvbkbjuPQgPYoNxiG7ksZeCWSKQBY3rc/YTlIaYQr65ljUUC326UVXSmLivQ1PEvHu6 cVtPcxxwIv58Ly4ACqO/oTecs1KYPZs= X-MC-Unique: E_FxTZmZNyOC3CHAt78oHw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Oc1sRBtOXv+SeliZwXtm5zuza9PKebWIQDt4DQiKTqU=; b=dFRcXB9TWHwU9enqKIi9oeEcgeCRPVZGsFe4Div+Yxwyxan91pFyWQo2dTCcPK/A70 HkDXLodR4IlrIJWlhQCQMBSIjXF1ysS9HmZQLMC48qOcZaRhwoiB0enKZB2HUbqBQgdo Xff0jpww1PRjk8WpmlBUvg2RRdmLvloqL+4Gwv24kDi8Z32YudIzSimLEv22PpB31BS1 P3LdmDeU4rdbJvJYG80p7eLwhdW5W1QM+5k2EE/JsDsLE14hoEmC2MO84dG4L10ONUZ3 NbJDiACLKfjSAfHlK5Nw9mIMJZf1vwl94pLXN9Rq3R37XIzNAt6LVO41F+F7i9MMTsu1 0sUA== X-Gm-Message-State: ACrzQf2FHnf19fbQwcvKGlYY+cAbeJJHVDjCLE6X8iTXnQie6UOeFpBv CoWWnH8licVETkoSaXZRNvNg5ZaaaP3TTaoJnFJl4tAXXNd6UpHkqcQQDiUNIx4AU/wsgpvA40V nONR1u3VayF5oBvUnT1yi1XcX0YcfIfiPSmumqQDOiTk4o+dOL21pM18YfWym1tqWogU= X-Received: by 2002:a17:906:4786:b0:78d:b793:5bf6 with SMTP id cw6-20020a170906478600b0078db7935bf6mr2491001ejc.222.1666099909914; Tue, 18 Oct 2022 06:31:49 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4jWRco2K4gCJzTdieuZbQnRiKEVysH68L1BOcqfQBIWTjosTRdc2IXzy4N9CGltvlzSb9Ppw== X-Received: by 2002:a17:906:4786:b0:78d:b793:5bf6 with SMTP id cw6-20020a170906478600b0078db7935bf6mr2490973ejc.222.1666099909534; Tue, 18 Oct 2022 06:31:49 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 19/53] target/i386: make ldo/sto operations consistent with ldq Date: Tue, 18 Oct 2022 15:30:08 +0200 Message-Id: <20221018133042.856368-20-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101132645100003 Content-Type: text/plain; charset="utf-8" ldq takes a pointer to the first byte to load the 64-bit word in; ldo takes a pointer to the first byte of the ZMMReg. Make them consistent, which will be useful in the new SSE decoder's load/writeback routines. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 43 +++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 75ca99084e..1b96201685 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -2868,29 +2868,29 @@ static inline void gen_ldo_env_A0(DisasContext *s, = int offset, bool align) int mem_index =3D s->mem_index; tcg_gen_qemu_ld_i64(s->tmp1_i64, s->A0, mem_index, MO_LEUQ | (align ? MO_ALIGN_16 : 0)); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(ZMMReg, ZMM_Q(0= ))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(0= ))); tcg_gen_addi_tl(s->tmp0, s->A0, 8); tcg_gen_qemu_ld_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(ZMMReg, ZMM_Q(1= ))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(1= ))); } =20 static inline void gen_sto_env_A0(DisasContext *s, int offset, bool align) { int mem_index =3D s->mem_index; - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(ZMMReg, ZMM_Q(0= ))); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(0= ))); tcg_gen_qemu_st_i64(s->tmp1_i64, s->A0, mem_index, MO_LEUQ | (align ? MO_ALIGN_16 : 0)); tcg_gen_addi_tl(s->tmp0, s->A0, 8); - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(ZMMReg, ZMM_Q(1= ))); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(1= ))); tcg_gen_qemu_st_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); } =20 static inline void gen_op_movo(DisasContext *s, int d_offset, int s_offset) { - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(ZMMReg, ZMM_Q= (0))); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset + offsetof(ZMMReg, ZMM_Q= (0))); - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(ZMMReg, ZMM_Q= (1))); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset + offsetof(ZMMReg, ZMM_Q= (1))); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(XMMReg, XMM_Q= (0))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset + offsetof(XMMReg, XMM_Q= (0))); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(XMMReg, XMM_Q= (1))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset + offsetof(XMMReg, XMM_Q= (1))); } =20 static inline void gen_op_movq(DisasContext *s, int d_offset, int s_offset) @@ -2912,6 +2912,7 @@ static inline void gen_op_movq_env_0(DisasContext *s,= int d_offset) } =20 #define ZMM_OFFSET(reg) offsetof(CPUX86State, xmm_regs[reg]) +#define XMM_OFFSET(reg) offsetof(CPUX86State, xmm_regs[reg].ZMM_X(0)) =20 typedef void (*SSEFunc_i_ep)(TCGv_i32 val, TCGv_ptr env, TCGv_ptr reg); typedef void (*SSEFunc_l_ep)(TCGv_i64 val, TCGv_ptr env, TCGv_ptr reg); @@ -3424,13 +3425,13 @@ static void gen_sse(CPUX86State *env, DisasContext = *s, int b) if (mod =3D=3D 3) goto illegal_op; gen_lea_modrm(env, s, modrm); - gen_sto_env_A0(s, ZMM_OFFSET(reg), true); + gen_sto_env_A0(s, XMM_OFFSET(reg), true); break; case 0x3f0: /* lddqu */ if (mod =3D=3D 3) goto illegal_op; gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, ZMM_OFFSET(reg), false); + gen_ldo_env_A0(s, XMM_OFFSET(reg), true); break; case 0x22b: /* movntss */ case 0x32b: /* movntsd */ @@ -3499,12 +3500,12 @@ static void gen_sse(CPUX86State *env, DisasContext = *s, int b) case 0x26f: /* movdqu xmm, ea */ if (mod !=3D 3) { gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, ZMM_OFFSET(reg), + gen_ldo_env_A0(s, XMM_OFFSET(reg), /* movaps, movapd, movdqa */ b =3D=3D 0x028 || b =3D=3D 0x128 || b =3D= =3D 0x16f); } else { rm =3D (modrm & 7) | REX_B(s); - gen_op_movo(s, ZMM_OFFSET(reg), ZMM_OFFSET(rm)); + gen_op_movo(s, XMM_OFFSET(reg), XMM_OFFSET(rm)); } break; case 0x210: /* movss xmm, ea */ @@ -3560,7 +3561,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) case 0x212: /* movsldup */ if (mod !=3D 3) { gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, ZMM_OFFSET(reg), true); + gen_ldo_env_A0(s, XMM_OFFSET(reg), true); } else { rm =3D (modrm & 7) | REX_B(s); gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(0= )), @@ -3602,7 +3603,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) case 0x216: /* movshdup */ if (mod !=3D 3) { gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, ZMM_OFFSET(reg), true); + gen_ldo_env_A0(s, XMM_OFFSET(reg), true); } else { rm =3D (modrm & 7) | REX_B(s); gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(1= )), @@ -3706,12 +3707,12 @@ static void gen_sse(CPUX86State *env, DisasContext = *s, int b) case 0x27f: /* movdqu ea, xmm */ if (mod !=3D 3) { gen_lea_modrm(env, s, modrm); - gen_sto_env_A0(s, ZMM_OFFSET(reg), + gen_sto_env_A0(s, XMM_OFFSET(reg), /* movaps, movapd, movdqa */ b =3D=3D 0x029 || b =3D=3D 0x129 || b =3D= =3D 0x17f); } else { rm =3D (modrm & 7) | REX_B(s); - gen_op_movo(s, ZMM_OFFSET(rm), ZMM_OFFSET(reg)); + gen_op_movo(s, XMM_OFFSET(rm), XMM_OFFSET(reg)); } break; case 0x211: /* movss ea, xmm */ @@ -3863,7 +3864,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) gen_helper_enter_mmx(cpu_env); if (mod !=3D 3) { gen_lea_modrm(env, s, modrm); - op2_offset =3D offsetof(CPUX86State,xmm_t0); + op2_offset =3D offsetof(CPUX86State, xmm_t0.ZMM_X(0)); /* FIXME: should be 64-bit access if b1 =3D=3D 0. */ gen_ldo_env_A0(s, op2_offset, !!b1); } else { @@ -4055,10 +4056,10 @@ static void gen_sse(CPUX86State *env, DisasContext = *s, int b) offsetof(ZMMReg, ZMM_W(0))); break; case 0x2a: /* movntdqa */ - gen_ldo_env_A0(s, op1_offset, true); + gen_ldo_env_A0(s, op1_offset + offsetof(ZMMReg, ZM= M_X(0)), true); return; default: - gen_ldo_env_A0(s, op2_offset, true); + gen_ldo_env_A0(s, op2_offset + offsetof(ZMMReg, ZM= M_X(0)), true); } } if (!op6->fn[b1].op1) { @@ -4640,7 +4641,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) } else { op2_offset =3D offsetof(CPUX86State, xmm_t0); gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, op2_offset, true); + gen_ldo_env_A0(s, op2_offset + offsetof(ZMMReg, ZMM_X(0)),= true); } =20 val =3D x86_ldub_code(env, s); @@ -4747,7 +4748,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) break; default: /* 128 bit access */ - gen_ldo_env_A0(s, op2_offset, true); + gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_t0.ZMM_X(0= )), true); break; } } else { --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666104261; cv=none; d=zohomail.com; s=zohoarc; b=lYWmJj8TENhLSWLf7fpzdnJ4ldNnCDGe1F+S84Qj/RxXbilbcm1Gxyi9VR7zkrAu+6CpLmrl6xa6TXZK6q5eNrBck+H24jjgvb4X6y13QQiAu+/Cj2gv4svpmShj2QJF6/HU8/JRXym1ZQUUOJaLS7qbS4wW3cIEVQnJMLjOGRE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666104261; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Uab1pag/hyzpxfLXfHWB39awvPjdv3h0bR5JqzUXU6M=; b=Ab5PlWEgxk3Kcr9UDAk6KDpXxyCfPnvnIs57UQnk35Q892TjBLMqMuw5dkRRhvwv/WYjZ+GZAEr44rYgtPELcifKd+4VbQD4tz1GeUzvIlABLGgAxmuOxpTYNwmXzvcX6lX4X7+obZDkWj6+KHsg1w2EfHDQB20RxK5O5GGpMpY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666104261117382.7120526792718; Tue, 18 Oct 2022 07:44:21 -0700 (PDT) Received: from localhost ([::1]:56548 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknpJ-00072l-6U for importer@patchew.org; Tue, 18 Oct 2022 10:44:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33988) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RJ-UM for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:52287) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhc-0005Cl-BA for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:29 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-12-42zI-BKbMPCaQiGHeFkX_w-1; Tue, 18 Oct 2022 09:32:07 -0400 Received: by mail-ed1-f70.google.com with SMTP id v13-20020a056402348d00b0045d36615696so8375414edc.14 for ; Tue, 18 Oct 2022 06:32:07 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id y16-20020a056402359000b004589da5e5cesm9119881edc.41.2022.10.18.06.31.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099928; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Uab1pag/hyzpxfLXfHWB39awvPjdv3h0bR5JqzUXU6M=; b=dvvVu1o2maKrldPqj5BSfa41wN08iwlAkxBJaT9gGSMe1it5zqXVADPWbfQi6/bQHDntv1 /+MivpAHDDZokUIPxXf9tCoW4LDKonWGBNBBX7XMvg9C9T/aQakEmV7U/KzdV6CI3Om+Q6 59UdYGTxHqtsUPaL+qCc267uZL1SrBE= X-MC-Unique: 42zI-BKbMPCaQiGHeFkX_w-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Uab1pag/hyzpxfLXfHWB39awvPjdv3h0bR5JqzUXU6M=; b=sQwdJKej+7np6MSjOx6jhRf6US+1vOi1ulV88L+Q6Tm5tywrfDd1lijfBawyXdwVkz iuvjVnON2fBRmR+uDrefazuq2g43KqEsZRUDnMecYlymX3OodE/IKmBwtk7xGy9n7aly VUA+g079dJMBpSQkPaOsEBTmdEoV2g8BLFDxKxVBtnGG5d2mFRTd4+tQ9w7C9Iyo+R0x BF140yhxksmrNjebI12Hi6hhrIWOXg7+UEQ6SQjBkj4M/FnxWCei747oRq066ZI0o1bq vlU19y2BTSCUaJ2Lra52SMES/1xZQHBwTft0QvBSJNIxYElJKSrsW0JuY3lKe1i4kYfP Ni/A== X-Gm-Message-State: ACrzQf0/smF3yDOqpjpiSnTBJdWasMNw6JxhNk5AP/hr1QZPrB34kdq9 ktHzNaOmZ1n3/hyZBbrbIdsGkcehOqWRU8QWmWmh9GfhKRDc4g/Duar/TEkZP6hflX/xlXS5rk0 Dv8vT0xD0tv4iL41RYJwz9+gnAtXAVS3NbWcoFBBGtanDpDl4xb0TTCmovDcN+D1w8PA= X-Received: by 2002:a17:907:9710:b0:791:8aa6:18bb with SMTP id jg16-20020a170907971000b007918aa618bbmr2343184ejc.279.1666099921692; Tue, 18 Oct 2022 06:32:01 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5fXkaCoGAfRNeOk7cXLFIRaun+4zvFbhlYa5dBE4T2/2a8k0i8LIpJyQw4R3QGvDk5vsESkA== X-Received: by 2002:a17:907:9710:b0:791:8aa6:18bb with SMTP id jg16-20020a170907971000b007918aa618bbmr2342671ejc.279.1666099912496; Tue, 18 Oct 2022 06:31:52 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PULL 20/53] target/i386: make rex_w available even in 32-bit mode Date: Tue, 18 Oct 2022 15:30:09 +0200 Message-Id: <20221018133042.856368-21-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666104263128100001 Content-Type: text/plain; charset="utf-8" REX.W can be used even in 32-bit mode by AVX instructions, where it is retr= oactively renamed to VEX.W. Make the field available even in 32-bit mode but keep th= e REX_W() macro as it was; this way, that the handling of dflag does not use it by mi= stake and the AVX code more clearly points at the special VEX behavior of the bit. Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 1b96201685..279e34e0d0 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -99,8 +99,8 @@ typedef struct DisasContext { uint8_t rex_r; uint8_t rex_x; uint8_t rex_b; - bool rex_w; #endif + bool vex_w; /* used by AVX even on 32-bit processors */ bool jmp_opt; /* use direct block chaining for direct jumps */ bool repz_opt; /* optimize jumps within repz instructions */ bool cc_op_dirty; @@ -177,7 +177,7 @@ typedef struct DisasContext { =20 #ifdef TARGET_X86_64 #define REX_PREFIX(S) (((S)->prefix & PREFIX_REX) !=3D 0) -#define REX_W(S) ((S)->rex_w) +#define REX_W(S) ((S)->vex_w) #define REX_R(S) ((S)->rex_r + 0) #define REX_X(S) ((S)->rex_x + 0) #define REX_B(S) ((S)->rex_b + 0) @@ -4823,7 +4823,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) s->pc =3D s->base.pc_next; s->override =3D -1; #ifdef TARGET_X86_64 - s->rex_w =3D false; s->rex_r =3D 0; s->rex_x =3D 0; s->rex_b =3D 0; @@ -4831,6 +4830,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) s->rip_offset =3D 0; /* for relative ip address */ s->vex_l =3D 0; s->vex_v =3D 0; + s->vex_w =3D false; switch (sigsetjmp(s->jmpbuf, 0)) { case 0: break; @@ -4903,7 +4903,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) if (CODE64(s)) { /* REX prefix */ prefixes |=3D PREFIX_REX; - s->rex_w =3D (b >> 3) & 1; + s->vex_w =3D (b >> 3) & 1; s->rex_r =3D (b & 0x4) << 1; s->rex_x =3D (b & 0x2) << 2; s->rex_b =3D (b & 0x1) << 3; @@ -4946,8 +4946,8 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #ifdef TARGET_X86_64 s->rex_x =3D (~vex2 >> 3) & 8; s->rex_b =3D (~vex2 >> 2) & 8; - s->rex_w =3D (vex3 >> 7) & 1; #endif + s->vex_w =3D (vex3 >> 7) & 1; switch (vex2 & 0x1f) { case 0x01: /* Implied 0f leading opcode bytes. */ b =3D x86_ldub_code(env, s) | 0x100; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101136; cv=none; d=zohomail.com; s=zohoarc; b=WpEMFXid/rI+QPKSFreoCB2aHUV0FWD2yfODpPMJRjRxTvgPVwtTOlU/6rrojLXqKp2S5csDtUxNs9bkDQG4mlOD6wiRtR1qlkCUlTHK7JID1JHFhtUn1qfRQdM62aty6F4ywZOYQSyQ+sd9ElEAqw5a/RNf+Upt51kCr3Y4wKU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101136; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=51Uo/JDueUn1Yh1wB94rcbI9KY2tdfCqokjIWinqdqc=; b=kpcLYfM88yjHOWtsPGTC+qltGOK8w2xf2mYj+VViIKVk6xXaA1ueKr7L/lYu2eXOU3ZWmWMBfec+TT0Ud0ueHrk7Wu/R/xT5/ojJeLteIPYnP1F2dgqznPdXAyziHLmsrPNJvKk90KERle7R+XPmJalnBoT7OeazaeYMYI2bBjo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101136926692.9700007186309; Tue, 18 Oct 2022 06:52:16 -0700 (PDT) Received: from localhost ([::1]:50450 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0u-0001GN-Gv for importer@patchew.org; Tue, 18 Oct 2022 09:52:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44876) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhR-00048Y-IN for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:06 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:47939) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhN-00058M-9R for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:05 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-615-Nw31yZjzPeSoJwAjyH53Hw-1; Tue, 18 Oct 2022 09:31:59 -0400 Received: by mail-ed1-f72.google.com with SMTP id dz9-20020a0564021d4900b0045d9a3aded4so4285928edb.22 for ; Tue, 18 Oct 2022 06:31:59 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id l17-20020a056402345100b0045cba869e84sm9001636edc.26.2022.10.18.06.31.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099920; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=51Uo/JDueUn1Yh1wB94rcbI9KY2tdfCqokjIWinqdqc=; b=SHLJ5RwYkGYWDNcT3eA08aFHuwa9NGJpqK7j5DTvX/xcm+JIy95LNyEAwUC+f2KmtY5HFE cfTrnqACqNsudFbOVbatpj7mV4qeLBoFmx/EGLqltz6QkJP746cLH/jtXkgkOEB4kCFX0M 8snITxzZtgfHHPrEQBDI4yGqphy3p0c= X-MC-Unique: Nw31yZjzPeSoJwAjyH53Hw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=51Uo/JDueUn1Yh1wB94rcbI9KY2tdfCqokjIWinqdqc=; b=QfQt3LK6DUIV8UtidMWDSowb83FI6JqXWdxufhostPNkQCO5Nnn2DoucDCE/nxYIbF mCOm0U/yGNutLivwXprk7A0NK4CyLkoh5NuDYXmpo9mv25AzY1/uT1RUBaoFr3BL6aXt CyrHrsiUO45NSS67y05HlZHg71Y6iWjSOiwx2vPJl6bSoKy88vF0gRCxtM6hxrqKScPl u1Kb+uIp/3aHy5M5NIJluY65iU70xiz8mZTfPc5jCXtDIQU2ABjAkYQ4lvR2V5x7dJ0l xbDTUFKVLmyo1QqxY8BovXzhfcDFoaqjn3kPTC5QZxWS9s7GnyMJn9qdons1vpfx3aNv XqvQ== X-Gm-Message-State: ACrzQf3+577bmkFc9tz996E8giSZJtMOgf/Ua2GBRIVt11H/3pleXWQf 8VzaL8JoR5C/B83W0M1N3UGiXBWHvdZ9SOFc7AzrcHu5yPhGBiJ815nSg87YH2UTZlZZYAI/q1r unjzOOfJgn62hMfQRxjhGfHmxQH4ixU3gQm3oLGnuj13rUx6Li90ZHv6a8cn0Je2DjHI= X-Received: by 2002:a17:907:6296:b0:787:d066:9fcf with SMTP id nd22-20020a170907629600b00787d0669fcfmr2328934ejc.692.1666099917023; Tue, 18 Oct 2022 06:31:57 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5558lmjtUfdkxeWbqYoZo9JhsYNdf9VCR3mStDxDK16okaUWANtrUvRu/AD9WFhFkTl3r7Qg== X-Received: by 2002:a17:907:6296:b0:787:d066:9fcf with SMTP id nd22-20020a170907629600b00787d0669fcfmr2328865ejc.692.1666099915796; Tue, 18 Oct 2022 06:31:55 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 21/53] target/i386: add core of new i386 decoder Date: Tue, 18 Oct 2022 15:30:10 +0200 Message-Id: <20221018133042.856368-22-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101138706100001 Content-Type: text/plain; charset="utf-8" The new decoder is based on three principles: - use mostly table-driven decoding, using tables derived as much as possible from the Intel manual. Centralizing the decode the operands makes it more homogeneous, for example all immediates are signed. All modrm handling is in one function, and can be shared between SSE and ALU instructions (including XMM<->GPR instructions). The SSE/AVX decoder will also not have duplicated code between the 0F, 0F38 and 0F3A tables. - keep the code as "non-branchy" as possible. Generally, the code for the new decoder is more verbose, but the control flow is simpler. Conditionals are not nested and have small bodies. All instruction groups are resolved even before operands are decoded, and code generation is separated as much as possible within small functions that only handle one instruction each. - keep address generation and (for ALU operands) memory loads and writeback as much in common code as possible. All ALU operations for example are implemented as T0=3Df(T0,T1). For non-ALU instructions, read-modify-write memory operations are rare, but registers do not have TCGv equivalents: therefore, the common logic sets up pointer temporaries with the operands, while load and writeback are handled by gvec or by helpers. These principles make future code review and extensibility simpler, at the cost of having a relatively large amount of code in the form of this patch. Even EVEX should not be _too_ hard to implement (it's just a crazy large amount of possibilities). This patch introduces the main decoder flow, and integrates the old decoder with the new one. The old decoder takes care of parsing prefixes and then optionally drops to the new one. The changes to the old decoder are minimal and allow it to be replaced incrementally with the new one. There is a debugging mechanism through a "LIMIT" environment variable. In user-mode emulation, the variable is the number of instructions decoded by the new decoder before permanently switching to the old one. In system emulation, the variable is the highest opcode that is decoded by the new decoder (this is less friendly, but it's the best that can be done without requiring deterministic execution). Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 748 +++++++++++++++++++++++++++++++ target/i386/tcg/decode-new.h | 181 ++++++++ target/i386/tcg/emit.c.inc | 31 ++ target/i386/tcg/translate.c | 68 ++- 4 files changed, 1020 insertions(+), 8 deletions(-) create mode 100644 target/i386/tcg/decode-new.c.inc create mode 100644 target/i386/tcg/decode-new.h create mode 100644 target/i386/tcg/emit.c.inc diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc new file mode 100644 index 0000000000..65f9c1de40 --- /dev/null +++ b/target/i386/tcg/decode-new.c.inc @@ -0,0 +1,748 @@ +/* + * New-style decoder for i386 instructions + * + * Copyright (c) 2022 Red Hat, Inc. + * + * Author: Paolo Bonzini + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +/* + * The decoder is mostly based on tables copied from the Intel SDM. As + * a result, most operand load and writeback is done entirely in common + * table-driven code using the same operand type (X86_TYPE_*) and + * size (X86_SIZE_*) codes used in the manual. + * + * The main difference is that the V, U and W types are extended to + * cover MMX as well; if an instruction is like + * + * por Pq, Qq + * 66 por Vx, Hx, Wx + * + * only the second row is included and the instruction is marked as a + * valid MMX instruction. The MMX flag directs the decoder to rewrite + * the V/U/H/W types to P/N/P/Q if there is no prefix, as well as changing + * "x" to "q" if there is no prefix. + * + * In addition, the ss/ps/sd/pd types are sometimes mushed together as "x" + * if the difference is expressed via prefixes. Individual instructions + * are separated by prefix in the generator functions. + * + * There are a couple cases in which instructions (e.g. MOVD) write the + * whole XMM or MM register but are established incorrectly in the manual + * as "d" or "q". These have to be fixed for the decoder to work correctl= y. + */ + +#define X86_OP_NONE { 0 }, + +#define X86_OP_GROUP3(op, op0_, s0_, op1_, s1_, op2_, s2_, ...) { \ + .decode =3D glue(decode_, op), \ + .op0 =3D glue(X86_TYPE_, op0_), \ + .s0 =3D glue(X86_SIZE_, s0_), \ + .op1 =3D glue(X86_TYPE_, op1_), \ + .s1 =3D glue(X86_SIZE_, s1_), \ + .op2 =3D glue(X86_TYPE_, op2_), \ + .s2 =3D glue(X86_SIZE_, s2_), \ + .is_decode =3D true, \ + ## __VA_ARGS__ \ +} + +#define X86_OP_GROUP2(op, op0, s0, op1, s1, ...) \ + X86_OP_GROUP3(op, op0, s0, 2op, s0, op1, s1, ## __VA_ARGS__) +#define X86_OP_GROUP0(op, ...) \ + X86_OP_GROUP3(op, None, None, None, None, None, None, ## __VA_ARGS__) + +#define X86_OP_ENTRY3(op, op0_, s0_, op1_, s1_, op2_, s2_, ...) { \ + .gen =3D glue(gen_, op), \ + .op0 =3D glue(X86_TYPE_, op0_), \ + .s0 =3D glue(X86_SIZE_, s0_), \ + .op1 =3D glue(X86_TYPE_, op1_), \ + .s1 =3D glue(X86_SIZE_, s1_), \ + .op2 =3D glue(X86_TYPE_, op2_), \ + .s2 =3D glue(X86_SIZE_, s2_), \ + ## __VA_ARGS__ \ +} + +#define X86_OP_ENTRY4(op, op0_, s0_, op1_, s1_, op2_, s2_, ...) \ + X86_OP_ENTRY3(op, op0_, s0_, op1_, s1_, op2_, s2_, \ + .op3 =3D X86_TYPE_I, .s3 =3D X86_SIZE_b, \ + ## __VA_ARGS__) + +#define X86_OP_ENTRY2(op, op0, s0, op1, s1, ...) \ + X86_OP_ENTRY3(op, op0, s0, 2op, s0, op1, s1, ## __VA_ARGS__) +#define X86_OP_ENTRY0(op, ...) \ + X86_OP_ENTRY3(op, None, None, None, None, None, None, ## __VA_ARGS__) + +#define i64 .special =3D X86_SPECIAL_i64, +#define o64 .special =3D X86_SPECIAL_o64, +#define xchg .special =3D X86_SPECIAL_Locked, +#define mmx .special =3D X86_SPECIAL_MMX, +#define zext0 .special =3D X86_SPECIAL_ZExtOp0, +#define zext2 .special =3D X86_SPECIAL_ZExtOp2, + +static uint8_t get_modrm(DisasContext *s, CPUX86State *env) +{ + if (!s->has_modrm) { + s->modrm =3D x86_ldub_code(env, s); + s->has_modrm =3D true; + } + return s->modrm; +} + +static const X86OpEntry opcodes_0F38_00toEF[240] =3D { +}; + +/* five rows for no prefix, 66, F3, F2, 66+F2 */ +static const X86OpEntry opcodes_0F38_F0toFF[16][5] =3D { +}; + +static void decode_0F38(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + *b =3D x86_ldub_code(env, s); + if (*b < 0xf0) { + *entry =3D opcodes_0F38_00toEF[*b]; + } else { + int row =3D 0; + if (s->prefix & PREFIX_REPZ) { + /* The REPZ (F3) prefix has priority over 66 */ + row =3D 2; + } else { + row +=3D s->prefix & PREFIX_REPNZ ? 3 : 0; + row +=3D s->prefix & PREFIX_DATA ? 1 : 0; + } + *entry =3D opcodes_0F38_F0toFF[*b & 15][row]; + } +} + +static const X86OpEntry opcodes_0F3A[256] =3D { +}; + +static void decode_0F3A(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + *b =3D x86_ldub_code(env, s); + *entry =3D opcodes_0F3A[*b]; +} + +static const X86OpEntry opcodes_0F[256] =3D { + [0x38] =3D X86_OP_GROUP0(0F38), + [0x3a] =3D X86_OP_GROUP0(0F3A), +}; + +static void do_decode_0F(DisasContext *s, CPUX86State *env, X86OpEntry *en= try, uint8_t *b) +{ + *entry =3D opcodes_0F[*b]; +} + +static void decode_0F(DisasContext *s, CPUX86State *env, X86OpEntry *entry= , uint8_t *b) +{ + *b =3D x86_ldub_code(env, s); + do_decode_0F(s, env, entry, b); +} + +static const X86OpEntry opcodes_root[256] =3D { + [0x0F] =3D X86_OP_GROUP0(0F), +}; + +#undef mmx + +/* + * Decode the fixed part of the opcode and place the last + * in b. + */ +static void decode_root(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + *entry =3D opcodes_root[*b]; +} + + +static int decode_modrm(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode, + X86DecodedOp *op, X86OpType type) +{ + int modrm =3D get_modrm(s, env); + if ((modrm >> 6) =3D=3D 3) { + if (s->prefix & PREFIX_LOCK) { + decode->e.gen =3D gen_illegal; + return 0xff; + } + op->n =3D (modrm & 7); + if (type !=3D X86_TYPE_Q && type !=3D X86_TYPE_N) { + op->n |=3D REX_B(s); + } + } else { + op->has_ea =3D true; + op->n =3D -1; + decode->mem =3D gen_lea_modrm_0(env, s, get_modrm(s, env)); + } + return modrm; +} + +static bool decode_op_size(DisasContext *s, X86OpEntry *e, X86OpSize size,= MemOp *ot) +{ + switch (size) { + case X86_SIZE_b: /* byte */ + *ot =3D MO_8; + return true; + + case X86_SIZE_d: /* 32-bit */ + case X86_SIZE_ss: /* SSE/AVX scalar single precision */ + *ot =3D MO_32; + return true; + + case X86_SIZE_p: /* Far pointer, return offset size */ + case X86_SIZE_s: /* Descriptor, return offset size */ + case X86_SIZE_v: /* 16/32/64-bit, based on operand size */ + *ot =3D s->dflag; + return true; + + case X86_SIZE_pi: /* MMX */ + case X86_SIZE_q: /* 64-bit */ + case X86_SIZE_sd: /* SSE/AVX scalar double precision */ + *ot =3D MO_64; + return true; + + case X86_SIZE_w: /* 16-bit */ + *ot =3D MO_16; + return true; + + case X86_SIZE_y: /* 32/64-bit, based on operand size */ + *ot =3D s->dflag =3D=3D MO_16 ? MO_32 : s->dflag; + return true; + + case X86_SIZE_z: /* 16-bit for 16-bit operand size, else 32-bit */ + *ot =3D s->dflag =3D=3D MO_16 ? MO_16 : MO_32; + return true; + + case X86_SIZE_dq: /* SSE/AVX 128-bit */ + if (e->special =3D=3D X86_SPECIAL_MMX && + !(s->prefix & (PREFIX_DATA | PREFIX_REPZ | PREFIX_REPNZ))) { + *ot =3D MO_64; + return true; + } + if (s->vex_l && e->s0 !=3D X86_SIZE_qq && e->s1 !=3D X86_SIZE_qq) { + return false; + } + *ot =3D MO_128; + return true; + + case X86_SIZE_qq: /* AVX 256-bit */ + if (!s->vex_l) { + return false; + } + *ot =3D MO_256; + return true; + + case X86_SIZE_x: /* 128/256-bit, based on operand size */ + if (e->special =3D=3D X86_SPECIAL_MMX && + !(s->prefix & (PREFIX_DATA | PREFIX_REPZ | PREFIX_REPNZ))) { + *ot =3D MO_64; + return true; + } + /* fall through */ + case X86_SIZE_ps: /* SSE/AVX packed single precision */ + case X86_SIZE_pd: /* SSE/AVX packed double precision */ + *ot =3D s->vex_l ? MO_256 : MO_128; + return true; + + case X86_SIZE_d64: /* Default to 64-bit in 64-bit mode */ + *ot =3D CODE64(s) && s->dflag =3D=3D MO_32 ? MO_64 : s->dflag; + return true; + + case X86_SIZE_f64: /* Ignore size override prefix in 64-bit mode */ + *ot =3D CODE64(s) ? MO_64 : s->dflag; + return true; + + default: + *ot =3D -1; + return true; + } +} + +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 */ + case X86_TYPE_F: /* EFLAGS/RFLAGS */ + break; + + case X86_TYPE_B: /* VEX.vvvv selects a GPR */ + op->unit =3D X86_OP_INT; + op->n =3D s->vex_v; + break; + + case X86_TYPE_C: /* REG in the modrm byte selects a control register = */ + op->unit =3D X86_OP_CR; + goto get_reg; + + case X86_TYPE_D: /* REG in the modrm byte selects a debug register */ + op->unit =3D X86_OP_DR; + goto get_reg; + + case X86_TYPE_G: /* REG in the modrm byte selects a GPR */ + op->unit =3D X86_OP_INT; + goto get_reg; + + case X86_TYPE_S: /* reg selects a segment register */ + op->unit =3D X86_OP_SEG; + goto get_reg; + + case X86_TYPE_P: + op->unit =3D X86_OP_MMX; + goto get_reg; + + case X86_TYPE_V: /* reg in the modrm byte selects an XMM/YMM register= */ + if (decode->e.special =3D=3D X86_SPECIAL_MMX && + !(s->prefix & (PREFIX_DATA | PREFIX_REPZ | PREFIX_REPNZ))) { + op->unit =3D X86_OP_MMX; + } else { + op->unit =3D X86_OP_SSE; + } + get_reg: + op->n =3D ((get_modrm(s, env) >> 3) & 7) | REX_R(s); + break; + + case X86_TYPE_E: /* ALU modrm operand */ + op->unit =3D X86_OP_INT; + goto get_modrm; + + case X86_TYPE_Q: /* MMX modrm operand */ + op->unit =3D X86_OP_MMX; + goto get_modrm; + + case X86_TYPE_W: /* XMM/YMM modrm operand */ + if (decode->e.special =3D=3D X86_SPECIAL_MMX && + !(s->prefix & (PREFIX_DATA | PREFIX_REPZ | PREFIX_REPNZ))) { + op->unit =3D X86_OP_MMX; + } else { + op->unit =3D X86_OP_SSE; + } + goto get_modrm; + + case X86_TYPE_N: /* R/M in the modrm byte selects an MMX register */ + op->unit =3D X86_OP_MMX; + goto get_modrm_reg; + + case X86_TYPE_U: /* R/M in the modrm byte selects an XMM/YMM register= */ + if (decode->e.special =3D=3D X86_SPECIAL_MMX && + !(s->prefix & (PREFIX_DATA | PREFIX_REPZ | PREFIX_REPNZ))) { + op->unit =3D X86_OP_MMX; + } else { + op->unit =3D X86_OP_SSE; + } + goto get_modrm_reg; + + 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) { + return false; + } + goto get_modrm; + + case X86_TYPE_M: /* modrm byte selects a memory operand */ + modrm =3D get_modrm(s, env); + if ((modrm >> 6) =3D=3D 3) { + return false; + } + get_modrm: + decode_modrm(s, env, decode, op, type); + break; + + case X86_TYPE_O: /* Absolute address encoded in the instruction */ + op->unit =3D X86_OP_INT; + op->has_ea =3D true; + op->n =3D -1; + decode->mem =3D (AddressParts) { + .def_seg =3D R_DS, + .base =3D -1, + .index =3D -1, + .disp =3D insn_get_addr(env, s, s->aflag) + }; + break; + + case X86_TYPE_H: /* For AVX, VEX.vvvv selects an XMM/YMM register */ + if ((s->prefix & PREFIX_VEX)) { + op->unit =3D X86_OP_SSE; + op->n =3D s->vex_v; + break; + } + 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); + } else { + return decode_op(s, env, decode, op, decode->e.op0, b); + } + + case X86_TYPE_I: /* Immediate */ + op->unit =3D X86_OP_IMM; + decode->immediate =3D insn_get_signed(env, s, op->ot); + break; + + case X86_TYPE_J: /* Relative offset for a jump */ + op->unit =3D X86_OP_IMM; + decode->immediate =3D insn_get_signed(env, s, op->ot); + decode->immediate +=3D s->pc - s->cs_base; + if (s->dflag =3D=3D MO_16) { + decode->immediate &=3D 0xffff; + } else if (!CODE64(s)) { + decode->immediate &=3D 0xffffffffu; + } + break; + + case X86_TYPE_L: /* The upper 4 bits of the immediate select a 128-bi= t register */ + op->n =3D insn_get(env, s, op->ot) >> 4; + break; + + case X86_TYPE_X: /* string source */ + op->n =3D -1; + decode->mem =3D (AddressParts) { + .def_seg =3D R_DS, + .base =3D R_ESI, + .index =3D -1, + }; + break; + + case X86_TYPE_Y: /* string destination */ + op->n =3D -1; + decode->mem =3D (AddressParts) { + .def_seg =3D R_ES, + .base =3D R_EDI, + .index =3D -1, + }; + break; + + case X86_TYPE_2op: + *op =3D decode->op[0]; + break; + + case X86_TYPE_LoBits: + op->n =3D (b & 7) | REX_B(s); + op->unit =3D X86_OP_INT; + break; + + case X86_TYPE_0 ... X86_TYPE_7: + op->n =3D type - X86_TYPE_0; + op->unit =3D X86_OP_INT; + break; + + case X86_TYPE_ES ... X86_TYPE_GS: + op->n =3D type - X86_TYPE_ES; + op->unit =3D X86_OP_SEG; + break; + } + + return true; +} + +static bool decode_insn(DisasContext *s, CPUX86State *env, X86DecodeFunc d= ecode_func, + X86DecodedInsn *decode) +{ + X86OpEntry *e =3D &decode->e; + + decode_func(s, env, e, &decode->b); + while (e->is_decode) { + e->is_decode =3D false; + e->decode(s, env, e, &decode->b); + } + + /* First compute size of operands 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; + } + if (e->op0 =3D=3D X86_TYPE_I) { + s->rip_offset +=3D 1 << decode->op[0].ot; + } + } + if (e->op1 !=3D X86_TYPE_None) { + if (!decode_op_size(s, e, e->s1, &decode->op[1].ot)) { + return false; + } + if (e->op1 =3D=3D X86_TYPE_I) { + s->rip_offset +=3D 1 << decode->op[1].ot; + } + } + if (e->op2 !=3D X86_TYPE_None) { + if (!decode_op_size(s, e, e->s2, &decode->op[2].ot)) { + return false; + } + if (e->op2 =3D=3D X86_TYPE_I) { + s->rip_offset +=3D 1 << decode->op[2].ot; + } + } + if (e->op3 !=3D X86_TYPE_None) { + assert(e->op3 =3D=3D X86_TYPE_I && e->s3 =3D=3D X86_SIZE_b); + s->rip_offset +=3D 1; + } + + if (e->op0 !=3D X86_TYPE_None && + !decode_op(s, env, decode, &decode->op[0], e->op0, decode->b)) { + return false; + } + + if (e->op1 !=3D X86_TYPE_None && + !decode_op(s, env, decode, &decode->op[1], e->op1, decode->b)) { + return false; + } + + if (e->op2 !=3D X86_TYPE_None && + !decode_op(s, env, decode, &decode->op[2], e->op2, decode->b)) { + return false; + } + + if (e->op3 !=3D X86_TYPE_None) { + decode->immediate =3D insn_get_signed(env, s, MO_8); + } + + return true; +} + +/* + * Convert one instruction. s->base.is_jmp is set if the translation must + * be stopped. + */ +static void disas_insn_new(DisasContext *s, CPUState *cpu, int b) +{ + CPUX86State *env =3D cpu->env_ptr; + bool first =3D true; + X86DecodedInsn decode; + X86DecodeFunc decode_func =3D decode_root; + +#ifdef CONFIG_USER_ONLY + if (limit) { --limit; } +#endif + s->has_modrm =3D false; + + next_byte: + if (first) { + first =3D false; + } else { + b =3D x86_ldub_code(env, s); + } + /* Collect prefixes. */ + switch (b) { + case 0xf3: + s->prefix |=3D PREFIX_REPZ; + s->prefix &=3D ~PREFIX_REPNZ; + goto next_byte; + case 0xf2: + s->prefix |=3D PREFIX_REPNZ; + s->prefix &=3D ~PREFIX_REPZ; + goto next_byte; + case 0xf0: + s->prefix |=3D PREFIX_LOCK; + goto next_byte; + case 0x2e: + s->override =3D R_CS; + goto next_byte; + case 0x36: + s->override =3D R_SS; + goto next_byte; + case 0x3e: + s->override =3D R_DS; + goto next_byte; + case 0x26: + s->override =3D R_ES; + goto next_byte; + case 0x64: + s->override =3D R_FS; + goto next_byte; + case 0x65: + s->override =3D R_GS; + goto next_byte; + case 0x66: + s->prefix |=3D PREFIX_DATA; + goto next_byte; + case 0x67: + s->prefix |=3D PREFIX_ADR; + goto next_byte; +#ifdef TARGET_X86_64 + case 0x40 ... 0x4f: + if (CODE64(s)) { + /* REX prefix */ + s->prefix |=3D PREFIX_REX; + s->vex_w =3D (b >> 3) & 1; + s->rex_r =3D (b & 0x4) << 1; + s->rex_x =3D (b & 0x2) << 2; + s->rex_b =3D (b & 0x1) << 3; + goto next_byte; + } + break; +#endif + case 0xc5: /* 2-byte VEX */ + case 0xc4: /* 3-byte VEX */ + /* + * VEX prefixes cannot be used except in 32-bit mode. + * Otherwise the instruction is LES or LDS. + */ + if (CODE32(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); + + if (!CODE64(s) && (vex2 & 0xc0) !=3D 0xc0) { + /* + * 4.1.4.6: In 32-bit mode, bits [7:6] must be 11b, + * otherwise the instruction is LES or LDS. + */ + s->pc--; /* rewind the advance_pc() x86_ldub_code() did */ + break; + } + + /* 4.1.1-4.1.3: No preceding lock, 66, f2, f3, or rex prefixes= . */ + if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ + | PREFIX_LOCK | PREFIX_DATA | PREFIX_REX)) { + goto illegal_op; + } +#ifdef TARGET_X86_64 + s->rex_r =3D (~vex2 >> 4) & 8; +#endif + if (b =3D=3D 0xc5) { + /* 2-byte VEX prefix: RVVVVlpp, implied 0f leading opcode = byte */ + vex3 =3D vex2; + decode_func =3D decode_0F; + } else { + /* 3-byte VEX prefix: RXBmmmmm wVVVVlpp */ + vex3 =3D x86_ldub_code(env, s); +#ifdef TARGET_X86_64 + s->rex_x =3D (~vex2 >> 3) & 8; + s->rex_b =3D (~vex2 >> 2) & 8; +#endif + s->vex_w =3D (vex3 >> 7) & 1; + switch (vex2 & 0x1f) { + case 0x01: /* Implied 0f leading opcode bytes. */ + decode_func =3D decode_0F; + break; + case 0x02: /* Implied 0f 38 leading opcode bytes. */ + decode_func =3D decode_0F38; + break; + case 0x03: /* Implied 0f 3a leading opcode bytes. */ + decode_func =3D decode_0F3A; + break; + default: /* Reserved for future use. */ + goto unknown_op; + } + } + s->vex_v =3D (~vex3 >> 3) & 0xf; + s->vex_l =3D (vex3 >> 2) & 1; + s->prefix |=3D pp_prefix[vex3 & 3] | PREFIX_VEX; + } + break; + default: + if (b >=3D 0x100) { + b -=3D 0x100; + decode_func =3D do_decode_0F; + } + break; + } + + /* Post-process prefixes. */ + if (CODE64(s)) { + /* + * In 64-bit mode, the default data size is 32-bit. Select 64-bit + * data with rex_w, and 16-bit data with 0x66; rex_w takes precede= nce + * over 0x66 if both are present. + */ + s->dflag =3D (REX_W(s) ? MO_64 : s->prefix & PREFIX_DATA ? MO_16 := MO_32); + /* In 64-bit mode, 0x67 selects 32-bit addressing. */ + s->aflag =3D (s->prefix & PREFIX_ADR ? MO_32 : MO_64); + } else { + /* In 16/32-bit mode, 0x66 selects the opposite data size. */ + if (CODE32(s) ^ ((s->prefix & PREFIX_DATA) !=3D 0)) { + s->dflag =3D MO_32; + } else { + s->dflag =3D MO_16; + } + /* In 16/32-bit mode, 0x67 selects the opposite addressing. */ + if (CODE32(s) ^ ((s->prefix & PREFIX_ADR) !=3D 0)) { + s->aflag =3D MO_32; + } else { + s->aflag =3D MO_16; + } + } + + memset(&decode, 0, sizeof(decode)); + decode.b =3D b; + if (!decode_insn(s, env, decode_func, &decode)) { + goto illegal_op; + } + if (!decode.e.gen) { + goto unknown_op; + } + + switch (decode.e.special) { + case X86_SPECIAL_None: + break; + + case X86_SPECIAL_Locked: + if (decode.op[0].has_ea) { + s->prefix |=3D PREFIX_LOCK; + } + break; + + case X86_SPECIAL_ProtMode: + if (!PE(s) || VM86(s)) { + goto illegal_op; + } + break; + + case X86_SPECIAL_i64: + if (CODE64(s)) { + goto illegal_op; + } + break; + case X86_SPECIAL_o64: + if (!CODE64(s)) { + goto illegal_op; + } + break; + + case X86_SPECIAL_ZExtOp0: + assert(decode.op[0].unit =3D=3D X86_OP_INT); + if (!decode.op[0].has_ea) { + decode.op[0].ot =3D MO_32; + } + break; + + case X86_SPECIAL_ZExtOp2: + assert(decode.op[2].unit =3D=3D X86_OP_INT); + if (!decode.op[2].has_ea) { + decode.op[2].ot =3D MO_32; + } + break; + + case X86_SPECIAL_MMX: + if (!(s->prefix & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))) { + gen_helper_enter_mmx(cpu_env); + } + break; + } + + if (decode.op[0].has_ea || decode.op[1].has_ea || decode.op[2].has_ea)= { + gen_load_ea(s, &decode.mem); + } + decode.e.gen(s, env, &decode); + return; + illegal_op: + gen_illegal_opcode(s); + return; + unknown_op: + gen_unknown_opcode(env, s); +} diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h new file mode 100644 index 0000000000..2f22d4d22e --- /dev/null +++ b/target/i386/tcg/decode-new.h @@ -0,0 +1,181 @@ +/* + * Decode table flags, mostly based on Intel SDM. + * + * Copyright (c) 2022 Red Hat, Inc. + * + * Author: Paolo Bonzini + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +typedef enum X86OpType { + X86_TYPE_None, + + X86_TYPE_A, /* Implicit */ + X86_TYPE_B, /* VEX.vvvv selects a GPR */ + X86_TYPE_C, /* REG in the modrm byte selects a control register */ + X86_TYPE_D, /* REG in the modrm byte selects a debug register */ + X86_TYPE_E, /* ALU modrm operand */ + X86_TYPE_F, /* EFLAGS/RFLAGS */ + X86_TYPE_G, /* REG in the modrm byte selects a GPR */ + X86_TYPE_H, /* For AVX, VEX.vvvv selects an XMM/YMM register */ + X86_TYPE_I, /* Immediate */ + X86_TYPE_J, /* Relative offset for a jump */ + X86_TYPE_L, /* The upper 4 bits of the immediate select a 128-bit regi= ster */ + X86_TYPE_M, /* modrm byte selects a memory operand */ + X86_TYPE_N, /* R/M in the modrm byte selects an MMX register */ + X86_TYPE_O, /* Absolute address encoded in the instruction */ + X86_TYPE_P, /* reg in the modrm byte selects an MMX register */ + X86_TYPE_Q, /* MMX modrm operand */ + X86_TYPE_R, /* R/M in the modrm byte selects a register */ + X86_TYPE_S, /* reg selects a segment register */ + X86_TYPE_U, /* R/M in the modrm byte selects an XMM/YMM register */ + X86_TYPE_V, /* reg in the modrm byte selects an XMM/YMM register */ + X86_TYPE_W, /* XMM/YMM modrm operand */ + X86_TYPE_X, /* string source */ + X86_TYPE_Y, /* string destination */ + + /* Custom */ + X86_TYPE_2op, /* 2-operand RMW instruction */ + X86_TYPE_LoBits, /* encoded in bits 0-2 of the operand + REX.B */ + X86_TYPE_0, /* Hard-coded GPRs (RAX..RDI) */ + X86_TYPE_1, + X86_TYPE_2, + X86_TYPE_3, + X86_TYPE_4, + X86_TYPE_5, + X86_TYPE_6, + X86_TYPE_7, + X86_TYPE_ES, /* Hard-coded segment registers */ + X86_TYPE_CS, + X86_TYPE_SS, + X86_TYPE_DS, + X86_TYPE_FS, + X86_TYPE_GS, +} X86OpType; + +typedef enum X86OpSize { + X86_SIZE_None, + + X86_SIZE_a, /* BOUND operand */ + X86_SIZE_b, /* byte */ + X86_SIZE_d, /* 32-bit */ + X86_SIZE_dq, /* SSE/AVX 128-bit */ + X86_SIZE_p, /* Far pointer */ + X86_SIZE_pd, /* SSE/AVX packed double precision */ + X86_SIZE_pi, /* MMX */ + X86_SIZE_ps, /* SSE/AVX packed single precision */ + X86_SIZE_q, /* 64-bit */ + X86_SIZE_qq, /* AVX 256-bit */ + X86_SIZE_s, /* Descriptor */ + X86_SIZE_sd, /* SSE/AVX scalar double precision */ + X86_SIZE_ss, /* SSE/AVX scalar single precision */ + X86_SIZE_si, /* 32-bit GPR */ + X86_SIZE_v, /* 16/32/64-bit, based on operand size */ + X86_SIZE_w, /* 16-bit */ + X86_SIZE_x, /* 128/256-bit, based on operand size */ + X86_SIZE_y, /* 32/64-bit, based on operand size */ + X86_SIZE_z, /* 16-bit for 16-bit operand size, else 32-bit */ + + /* Custom */ + X86_SIZE_d64, + X86_SIZE_f64, +} X86OpSize; + +/* Execution flags */ + +typedef enum X86OpUnit { + X86_OP_SKIP, /* not valid or managed by emission function */ + X86_OP_SEG, /* segment selector */ + X86_OP_CR, /* control register */ + X86_OP_DR, /* debug register */ + X86_OP_INT, /* loaded into/stored from s->T0/T1 */ + X86_OP_IMM, /* immediate */ + X86_OP_SSE, /* address in either s->ptrX or s->A0 depending on has= _ea */ + X86_OP_MMX, /* address in either s->ptrX or s->A0 depending on has= _ea */ +} X86OpUnit; + +typedef enum X86InsnSpecial { + X86_SPECIAL_None, + + /* Always locked if it has a memory operand (XCHG) */ + X86_SPECIAL_Locked, + + /* Fault outside protected mode */ + X86_SPECIAL_ProtMode, + + /* + * Register operand 0/2 is zero extended to 32 bits. Rd/Mb or Rd/Mw + * in the manual. + */ + X86_SPECIAL_ZExtOp0, + X86_SPECIAL_ZExtOp2, + + /* + * MMX instruction exists with no prefix; if there is no prefix, V/H/W= /U operands + * become P/P/Q/N, and size "x" becomes "q". + */ + X86_SPECIAL_MMX, + + /* Illegal or exclusive to 64-bit mode */ + X86_SPECIAL_i64, + X86_SPECIAL_o64, +} X86InsnSpecial; + +typedef struct X86OpEntry X86OpEntry; +typedef struct X86DecodedInsn X86DecodedInsn; + +/* Decode function for multibyte opcodes. */ +typedef void (*X86DecodeFunc)(DisasContext *s, CPUX86State *env, X86OpEntr= y *entry, uint8_t *b); + +/* Code generation function. */ +typedef void (*X86GenFunc)(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode); + +struct X86OpEntry { + /* Based on the is_decode flags. */ + union { + X86GenFunc gen; + X86DecodeFunc decode; + }; + /* op0 is always written, op1 and op2 are always read. */ + X86OpType op0:8; + X86OpSize s0:8; + X86OpType op1:8; + X86OpSize s1:8; + X86OpType op2:8; + X86OpSize s2:8; + /* Must be I and b respectively if present. */ + X86OpType op3:8; + X86OpSize s3:8; + + X86InsnSpecial special:8; + bool is_decode:1; +}; + +typedef struct X86DecodedOp { + int8_t n; + MemOp ot; /* For b/c/d/p/s/q/v/w/y/z */ + X86OpUnit unit; + bool has_ea; +} X86DecodedOp; + +struct X86DecodedInsn { + X86OpEntry e; + X86DecodedOp op[3]; + target_ulong immediate; + AddressParts mem; + + uint8_t b; +}; + diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc new file mode 100644 index 0000000000..e86364ffc1 --- /dev/null +++ b/target/i386/tcg/emit.c.inc @@ -0,0 +1,31 @@ +/* + * New-style TCG opcode generator for i386 instructions + * + * Copyright (c) 2022 Red Hat, Inc. + * + * Author: Paolo Bonzini + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +static void gen_illegal(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + gen_illegal_opcode(s); +} + +static void gen_load_ea(DisasContext *s, AddressParts *mem) +{ + TCGv ea =3D gen_lea_modrm_1(s, *mem); + gen_lea_v_seg(s, s->aflag, ea, mem->def_seg, s->override); +} diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 279e34e0d0..a9cf6c00aa 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -86,6 +86,9 @@ typedef struct DisasContext { int8_t override; /* -1 if no override, else R_CS, R_DS, etc */ uint8_t prefix; =20 + bool has_modrm; + uint8_t modrm; + #ifndef CONFIG_USER_ONLY uint8_t cpl; /* code priv level */ uint8_t iopl; /* i/o priv level */ @@ -2425,6 +2428,31 @@ static inline uint32_t insn_get(CPUX86State *env, Di= sasContext *s, MemOp ot) return ret; } =20 +static target_long insn_get_signed(CPUX86State *env, DisasContext *s, MemO= p ot) +{ + target_long ret; + + switch (ot) { + case MO_8: + ret =3D (int8_t) x86_ldub_code(env, s); + break; + case MO_16: + ret =3D (int16_t) x86_lduw_code(env, s); + break; + case MO_32: + ret =3D (int32_t) x86_ldl_code(env, s); + break; +#ifdef TARGET_X86_64 + case MO_64: + ret =3D x86_ldq_code(env, s); + break; +#endif + default: + g_assert_not_reached(); + } + return ret; +} + static inline int insn_const_size(MemOp ot) { if (ot <=3D MO_32) { @@ -2927,6 +2955,11 @@ typedef void (*SSEFunc_0_ppi)(TCGv_ptr reg_a, TCGv_p= tr reg_b, TCGv_i32 val); typedef void (*SSEFunc_0_eppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, TCGv val); =20 +static bool first =3D true; static unsigned long limit; +#include "decode-new.h" +#include "emit.c.inc" +#include "decode-new.c.inc" + #define SSE_OPF_CMP (1 << 1) /* does not write for first operand */ #define SSE_OPF_SPECIAL (1 << 3) /* magic */ #define SSE_OPF_3DNOW (1 << 4) /* 3DNow! instruction */ @@ -4859,10 +4892,35 @@ static bool disas_insn(DisasContext *s, CPUState *c= pu) =20 prefixes =3D 0; =20 + if (first) first =3D false, limit =3D getenv("LIMIT") ? atol(getenv("L= IMIT")) : -1; + bool use_new =3D true; +#ifdef CONFIG_USER_ONLY + use_new &=3D limit > 0; +#endif next_byte: + s->prefix =3D prefixes; b =3D x86_ldub_code(env, s); /* Collect prefixes. */ switch (b) { + default: +#ifndef CONFIG_USER_ONLY + use_new &=3D b <=3D limit; +#endif + if (use_new && 0) { + disas_insn_new(s, cpu, b); + return s->pc; + } + break; + case 0x0f: + b =3D x86_ldub_code(env, s) + 0x100; +#ifndef CONFIG_USER_ONLY + use_new &=3D b <=3D limit; +#endif + if (use_new && 0) { + disas_insn_new(s, cpu, b + 0x100); + return s->pc; + } + break; case 0xf3: prefixes |=3D PREFIX_REPZ; prefixes &=3D ~PREFIX_REPNZ; @@ -4913,6 +4971,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #endif case 0xc5: /* 2-byte VEX */ case 0xc4: /* 3-byte VEX */ + use_new =3D false; /* VEX prefixes cannot be used except in 32-bit mode. Otherwise the instruction is LES or LDS. */ if (CODE32(s) && !VM86(s)) { @@ -4997,14 +5056,7 @@ static bool disas_insn(DisasContext *s, CPUState *cp= u) s->dflag =3D dflag; =20 /* now check op code */ - reswitch: - switch(b) { - case 0x0f: - /**************************/ - /* extended op code */ - b =3D x86_ldub_code(env, s) | 0x100; - goto reswitch; - + switch (b) { /**************************/ /* arith & logic */ case 0x00 ... 0x05: --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101103; cv=none; d=zohomail.com; s=zohoarc; b=hTdSGMvDlO3RDHSWd8c0W7sSET8F83POknN7ux58N+aMkKYq3+/XxuHzKGm23aOXdB8orNNwJWXzYjXI4GDeczn+VCa/NkR145C0s6pH3hjs65NWSY5tS/whH1wD3nWFBCF2QqPqF4HdDuW+4reJJuCGQrehMdbhPVvZxDaf1aQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101103; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=s50wNdwuikLbcvhJhhINIl0KrA+HXG2cnJpgnBOeqwo=; b=gB89p2IBD+2/1F9BASZz6bDrVGyEJfbtANEp6Jq7pfWwA4/oHCUT1TQfOkiyoNOjzdOePe1xx8PePWYzHBzQmReXvl8di3/Z5MaOW5P4SuAe9c7vQlUzAk1xVNbsMWjjHFo+aVnKbVz1SqwCxcn6NxNW8goQS8MBEYvdvAsd2Oc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101103557472.8115321397747; Tue, 18 Oct 2022 06:51:43 -0700 (PDT) Received: from localhost ([::1]:50164 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0P-0000e2-Uu for importer@patchew.org; Tue, 18 Oct 2022 09:51:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34970) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhT-0004F3-PT for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:08 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:60080) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhQ-00059Y-Hp for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:07 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-659-qfRlCbyYMg-Er4LQEmKnCw-1; Tue, 18 Oct 2022 09:32:02 -0400 Received: by mail-ej1-f70.google.com with SMTP id hc43-20020a17090716ab00b0078e28567ffbso4748813ejc.15 for ; Tue, 18 Oct 2022 06:32:01 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id o22-20020a170906769600b0078b03d57fa7sm7624205ejm.34.2022.10.18.06.31.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:31:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099923; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=s50wNdwuikLbcvhJhhINIl0KrA+HXG2cnJpgnBOeqwo=; b=HiE+Ti6Rs2SnPicgo8XuEuPZd0NsdkxMxLapEtcilLGNdPZGpSVOBDRh4kEOrEjwaFxo4c NJFiuh3DjiM9z4lgGgef4NlnxvKI8KUrx9Y6e0YgQOUyG/Eb82HK0wEB+Wge+xhMZX55+0 gi3g/Hur2lim4M28snZI/dWHWWJaH+Q= X-MC-Unique: qfRlCbyYMg-Er4LQEmKnCw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=s50wNdwuikLbcvhJhhINIl0KrA+HXG2cnJpgnBOeqwo=; b=cG9bkDEBCrAFipgwsrmSFuARIyYjpOAwVK5L5lassrL+ComwADa6Na8Bgk3O46UNxJ zhJ4guDlflW3P78GSmfnSEe9Mu3NMP3W2vfxRjHxeoorVz63soRLLgayZSJmkE7jVayu T/mUPB5nH4G5zZ2N+2KRFpY6gc/NLTtNXhNbyWTuvNhlIIgeUkMF5bleNOSkanj0Idvs Z89OSdXDPemsfvmIA0KegtaJ5M1CCiHpfq056RCAip8Y7rQrc1hbA7rv2EJQNFSBTGzN g1hiOx8v5dE22oJ5bGmJEV5yWIZ82Hr1IvJbDUbUibAXJ6BxE1MolnkmkvPtlkMjIife LzKg== X-Gm-Message-State: ACrzQf1TOErJ5iVvYA4tnr0nRfM8ZdU3bMdj0y+R1IwUX1l02YmGKdbq i9ko+loy4iXLnMuXeQ3+s2H0QTbNk7B4c+Xv7kWR99L1EB9pY4dskK+2vTQed+qVKBPlmej30/M LZG7w8XAkzgMQNZxfr3Yzcj0ZyijlcoElHaxhvhYytVOZ71NeoH4RSabV1MhNPwWMpAM= X-Received: by 2002:a50:fc85:0:b0:458:e7c6:1cfa with SMTP id f5-20020a50fc85000000b00458e7c61cfamr2694600edq.256.1666099920338; Tue, 18 Oct 2022 06:32:00 -0700 (PDT) X-Google-Smtp-Source: AMsMyM70QOYanD+XDLqEBH2vPr0xx3TGkkrYeOiZ+/HVuckZE7YVJ164U3z4TCL9lycQTjZrvJcB/Q== X-Received: by 2002:a50:fc85:0:b0:458:e7c6:1cfa with SMTP id f5-20020a50fc85000000b00458e7c61cfamr2694568edq.256.1666099919848; Tue, 18 Oct 2022 06:31:59 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 22/53] target/i386: add ALU load/writeback core Date: Tue, 18 Oct 2022 15:30:11 +0200 Message-Id: <20221018133042.856368-23-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101104364100003 Content-Type: text/plain; charset="utf-8" Add generic code generation that takes care of preparing operands around calls to decode.e.gen in a table-driven manner, so that ALU operations need not take care of that. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 33 ++++++- target/i386/tcg/decode-new.h | 7 ++ target/i386/tcg/emit.c.inc | 155 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 18 ++++ 4 files changed, 212 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 65f9c1de40..37e76692ba 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -513,6 +513,20 @@ static bool decode_insn(DisasContext *s, CPUX86State *= env, X86DecodeFunc decode_ return true; } =20 +static void decode_temp_free(X86DecodedOp *op) +{ + if (op->v_ptr) { + tcg_temp_free_ptr(op->v_ptr); + } +} + +static void decode_temps_free(X86DecodedInsn *decode) +{ + decode_temp_free(&decode->op[0]); + decode_temp_free(&decode->op[1]); + decode_temp_free(&decode->op[2]); +} + /* * Convert one instruction. s->base.is_jmp is set if the translation must * be stopped. @@ -738,7 +752,24 @@ static void disas_insn_new(DisasContext *s, CPUState *= cpu, int b) if (decode.op[0].has_ea || decode.op[1].has_ea || decode.op[2].has_ea)= { gen_load_ea(s, &decode.mem); } - decode.e.gen(s, env, &decode); + if (s->prefix & PREFIX_LOCK) { + if (decode.op[0].unit !=3D X86_OP_INT || !decode.op[0].has_ea) { + goto illegal_op; + } + gen_load(s, &decode, 2, s->T1); + decode.e.gen(s, env, &decode); + } else { + if (decode.op[0].unit =3D=3D X86_OP_MMX) { + compute_mmx_offset(&decode.op[0]); + } else if (decode.op[0].unit =3D=3D X86_OP_SSE) { + compute_xmm_offset(&decode.op[0]); + } + gen_load(s, &decode, 1, s->T0); + gen_load(s, &decode, 2, s->T1); + decode.e.gen(s, env, &decode); + gen_writeback(s, &decode, 0, s->T0); + } + decode_temps_free(&decode); return; illegal_op: gen_illegal_opcode(s); diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 2f22d4d22e..3a856b48e7 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -168,6 +168,13 @@ typedef struct X86DecodedOp { MemOp ot; /* For b/c/d/p/s/q/v/w/y/z */ X86OpUnit unit; bool has_ea; + int offset; /* For MMX and SSE */ + + /* + * This field is used internally by macros OP0_PTR/OP1_PTR/OP2_PTR, + * do not access directly! + */ + TCGv_ptr v_ptr; } X86DecodedOp; =20 struct X86DecodedInsn { diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index e86364ffc1..f8ba888c33 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -29,3 +29,158 @@ static void gen_load_ea(DisasContext *s, AddressParts *= mem) TCGv ea =3D gen_lea_modrm_1(s, *mem); gen_lea_v_seg(s, s->aflag, ea, mem->def_seg, s->override); } + +static inline int mmx_offset(MemOp ot) +{ + switch (ot) { + case MO_8: + return offsetof(MMXReg, MMX_B(0)); + case MO_16: + return offsetof(MMXReg, MMX_W(0)); + case MO_32: + return offsetof(MMXReg, MMX_L(0)); + case MO_64: + return offsetof(MMXReg, MMX_Q(0)); + default: + g_assert_not_reached(); + } +} + +static inline int xmm_offset(MemOp ot) +{ + switch (ot) { + case MO_8: + return offsetof(ZMMReg, ZMM_B(0)); + case MO_16: + return offsetof(ZMMReg, ZMM_W(0)); + case MO_32: + return offsetof(ZMMReg, ZMM_L(0)); + case MO_64: + return offsetof(ZMMReg, ZMM_Q(0)); + case MO_128: + return offsetof(ZMMReg, ZMM_X(0)); + case MO_256: + return offsetof(ZMMReg, ZMM_Y(0)); + default: + g_assert_not_reached(); + } +} + +static void compute_mmx_offset(X86DecodedOp *op) +{ + if (!op->has_ea) { + op->offset =3D offsetof(CPUX86State, fpregs[op->n].mmx) + mmx_offs= et(op->ot); + } else { + op->offset =3D offsetof(CPUX86State, mmx_t0) + mmx_offset(op->ot); + } +} + +static void compute_xmm_offset(X86DecodedOp *op) +{ + if (!op->has_ea) { + op->offset =3D ZMM_OFFSET(op->n) + xmm_offset(op->ot); + } else { + op->offset =3D offsetof(CPUX86State, xmm_t0) + xmm_offset(op->ot); + } +} + +static void gen_load_sse(DisasContext *s, TCGv temp, MemOp ot, int dest_of= s, bool aligned) +{ + switch(ot) { + case MO_8: + gen_op_ld_v(s, MO_8, temp, s->A0); + tcg_gen_st8_tl(temp, cpu_env, dest_ofs); + break; + case MO_16: + gen_op_ld_v(s, MO_16, temp, s->A0); + tcg_gen_st16_tl(temp, cpu_env, dest_ofs); + break; + case MO_32: + gen_op_ld_v(s, MO_32, temp, s->A0); + tcg_gen_st32_tl(temp, cpu_env, dest_ofs); + break; + case MO_64: + gen_ldq_env_A0(s, dest_ofs); + break; + case MO_128: + gen_ldo_env_A0(s, dest_ofs, aligned); + break; + case MO_256: + gen_ldy_env_A0(s, dest_ofs, aligned); + break; + default: + g_assert_not_reached(); + } +} + +static void gen_load(DisasContext *s, X86DecodedInsn *decode, int opn, TCG= v v) +{ + X86DecodedOp *op =3D &decode->op[opn]; + + switch (op->unit) { + case X86_OP_SKIP: + return; + case X86_OP_SEG: + tcg_gen_ld32u_tl(v, cpu_env, + offsetof(CPUX86State,segs[op->n].selector)); + break; + case X86_OP_CR: + tcg_gen_ld_tl(v, cpu_env, offsetof(CPUX86State, cr[op->n])); + break; + case X86_OP_DR: + tcg_gen_ld_tl(v, cpu_env, offsetof(CPUX86State, dr[op->n])); + break; + case X86_OP_INT: + if (op->has_ea) { + gen_op_ld_v(s, op->ot, v, s->A0); + } else { + gen_op_mov_v_reg(s, op->ot, v, op->n); + } + break; + case X86_OP_IMM: + tcg_gen_movi_tl(v, decode->immediate); + break; + + case X86_OP_MMX: + compute_mmx_offset(op); + goto load_vector; + + case X86_OP_SSE: + compute_xmm_offset(op); + load_vector: + if (op->has_ea) { + gen_load_sse(s, v, op->ot, op->offset, true); + } + break; + + default: + g_assert_not_reached(); + } +} + +static void gen_writeback(DisasContext *s, X86DecodedInsn *decode, int opn= , TCGv v) +{ + X86DecodedOp *op =3D &decode->op[opn]; + switch (op->unit) { + case X86_OP_SKIP: + break; + case X86_OP_SEG: + /* Note that gen_movl_seg_T0 takes care of interrupt shadow and TF= . */ + gen_movl_seg_T0(s, op->n); + break; + case X86_OP_INT: + if (op->has_ea) { + gen_op_st_v(s, op->ot, v, s->A0); + } else { + gen_op_mov_reg_v(s, op->ot, op->n, v); + } + break; + case X86_OP_MMX: + case X86_OP_SSE: + break; + case X86_OP_CR: + case X86_OP_DR: + default: + g_assert_not_reached(); + } +} diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index a9cf6c00aa..eb174dbb8c 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -2913,6 +2913,24 @@ static inline void gen_sto_env_A0(DisasContext *s, i= nt offset, bool align) tcg_gen_qemu_st_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); } =20 +static void gen_ldy_env_A0(DisasContext *s, int offset, bool align) +{ + int mem_index =3D s->mem_index; + tcg_gen_qemu_ld_i64(s->tmp1_i64, s->A0, mem_index, + MO_LEUQ | (align ? MO_ALIGN_32 : 0)); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(0= ))); + tcg_gen_addi_tl(s->tmp0, s->A0, 8); + tcg_gen_qemu_ld_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(1= ))); + + tcg_gen_addi_tl(s->tmp0, s->A0, 16); + tcg_gen_qemu_ld_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(2= ))); + tcg_gen_addi_tl(s->tmp0, s->A0, 24); + tcg_gen_qemu_ld_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(3= ))); +} + static inline void gen_op_movo(DisasContext *s, int d_offset, int s_offset) { tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(XMMReg, XMM_Q= (0))); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102253; cv=none; d=zohomail.com; s=zohoarc; b=HdOyilcFD2T0+0VeTEuJtfqoTK9rGB4y45ImDAN4FDIuWQU3QqEWWAPlZZJpBxe/yqSW3RkGf9BagVVrpVSzbKlm8+SjHGXqiZad+R5bkAKGNEMsS72PMTynwObXruWzIV/e1Adu4PIEbmU6NnDXfVVMpk62g+E5MatBkuyhk1Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102253; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=9vw5LlIDyswk8yQIY84axnlS2VUcrouMFoVhlsE9apE=; b=Vpr0BcPEtUsBUvo7nCVJBNZpxX5Je1cmaDnz1XeZncW8ZiqKBVmUQUiJfPCDramYceHj/1G7gHazL1dv0LWoLuR26hv3gCgqm2V/SZauC9b6FvfI96g4r2RQ1VXn6JRYioeaEIo02HZNnKxg6UObiPUv4OswqAt2G6Vj5G9OeRk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102253602959.011613969576; Tue, 18 Oct 2022 07:10:53 -0700 (PDT) Received: from localhost ([::1]:47734 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknIy-0005lw-9p for importer@patchew.org; Tue, 18 Oct 2022 10:10:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46214) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiR-0004RN-W2 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:49394) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhe-0005F7-Ez for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:32 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-513-WRpiFhYHORCcMn9DpZuEzw-1; Tue, 18 Oct 2022 09:32:13 -0400 Received: by mail-ej1-f71.google.com with SMTP id xh12-20020a170906da8c00b007413144e87fso6401390ejb.14 for ; Tue, 18 Oct 2022 06:32:13 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id z3-20020a1709063a0300b007836d075152sm7472447eje.187.2022.10.18.06.32.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099935; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9vw5LlIDyswk8yQIY84axnlS2VUcrouMFoVhlsE9apE=; b=c7WTdsEPXhG6f57ELXT8KYJuHSxBvz3UT+BPgEsoaGBmRtawF0BEHTDQbeo4QrXjI5GMz0 hLasmQYCGB6JvD71AZtOCtDlFD5nLQvrOMj/WTvgi2ovfRTRaxgb+yvKasTCHEXw/0/zjE RV9ClJTaASEyOThZf5V/pwNbwRG3+I0= X-MC-Unique: WRpiFhYHORCcMn9DpZuEzw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9vw5LlIDyswk8yQIY84axnlS2VUcrouMFoVhlsE9apE=; b=c5Bq+Bl9nRfJEr4jsCqWfT+poN3n0F3kSO1gF3DgBquPM9rpxRXxlJGAQE8ASGEhYl na+YSf/MeX1WXMO2noVUDEyXoXUVArtxgeAlJHyQ7kG4SYcsWWo+JDVkyNR/1eBuynU+ hFLm5nBRcT1wyTDNYy88MUQ8FEzGYzLe63nfYZdhMxtPvY5UW7AibO930gZe9kZhUONE zdJbZSk+mhE7VmCKUj5AkXti806xVZruSHDn+7zYiCYJ4T+qS5CAednFrfkRD2/tBdIS mH1GcWlsj8voQDnZ8hjo7TtxfgJiGYB7uZ1KJvtU92tE74G6hVanTfDSceNmQCPuSn4s WFmA== X-Gm-Message-State: ACrzQf2QoG9S4315k/5ARm7dYKpQilnY8rWaF3DTXE7bfkwJcOeWWDT0 G3yOmXq8Ym5wvSZDgyOz4AzCv0V0gyV8kjI3M/gwjhaaoXWN+jDuBDaf7vsnE0lx6cQ1wobnR22 Is+FxXzO1RLJ4GfcVkX2lOvNUsU/YzthdgDvYt1B4mrz2RarGPUtiFPhcZ7aM9MvwOhQ= X-Received: by 2002:a17:907:9710:b0:791:8aa6:18bb with SMTP id jg16-20020a170907971000b007918aa618bbmr2343631ejc.279.1666099929314; Tue, 18 Oct 2022 06:32:09 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5ESH2laV+X9pdDOF3dFLrG4c+6JjZIKhsTK4/40jQ/I6TuLmwN8zQ0ldEVOMM1YEA4X7NlCQ== X-Received: by 2002:a17:907:9710:b0:791:8aa6:18bb with SMTP id jg16-20020a170907971000b007918aa618bbmr2343252ejc.279.1666099923091; Tue, 18 Oct 2022 06:32:03 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 23/53] target/i386: add CPUID[EAX=7,ECX=0].ECX to DisasContext Date: Tue, 18 Oct 2022 15:30:12 +0200 Message-Id: <20221018133042.856368-24-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102255354100001 Content-Type: text/plain; charset="utf-8" TCG will shortly implement VAES instructions, so add the relevant feature word to the DisasContext. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/translate.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index eb174dbb8c..abccaadfbf 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -116,6 +116,7 @@ typedef struct DisasContext { int cpuid_ext2_features; int cpuid_ext3_features; int cpuid_7_0_ebx_features; + int cpuid_7_0_ecx_features; int cpuid_xsave_features; =20 /* TCG local temps */ @@ -8859,6 +8860,7 @@ static void i386_tr_init_disas_context(DisasContextBa= se *dcbase, CPUState *cpu) dc->cpuid_ext2_features =3D env->features[FEAT_8000_0001_EDX]; dc->cpuid_ext3_features =3D env->features[FEAT_8000_0001_ECX]; dc->cpuid_7_0_ebx_features =3D env->features[FEAT_7_0_EBX]; + dc->cpuid_7_0_ecx_features =3D env->features[FEAT_7_0_ECX]; dc->cpuid_xsave_features =3D env->features[FEAT_XSAVE]; dc->jmp_opt =3D !((cflags & CF_NO_GOTO_TB) || (flags & (HF_TF_MASK | HF_INHIBIT_IRQ_MASK))); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101390; cv=none; d=zohomail.com; s=zohoarc; b=EIhIRhmw6ma8110vYlKa4rhFKpZGU0zUwwbqWFMezSk5wtWRo4FMdOWrDyJBPBG2xfghvykOfy/U5PqmfBFrfCy7tS8qf3VqZA7/tcp/vP3m3r94ioJWCtwcJpssJ0EAi5Q8EQc/TPboFVRrAQpnIfGmUd9sCH3LbXy3eLy/hyk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101390; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Eak2Olk8SGXmy5UtEL5kCMoFzmLXJ5Mc/eK44fcXzMw=; b=eEgkFttBE1GKvP/hcgRE9k38bSnzbiY0tIv6a5YZugzxE27CSyhj/KFrte06yIaCtv5UOICfwi6D6EnxtImGY2qXdtH460zQD0RWgDh+RzFgUPajuxufI4PG8vPqWMpgI/c3f0+tF53QAm/D8FlaJoMc8UsWAxfcA2UFGMnp994= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101390026653.2279800659818; Tue, 18 Oct 2022 06:56:30 -0700 (PDT) Received: from localhost ([::1]:57460 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn4y-0001mx-KO for importer@patchew.org; Tue, 18 Oct 2022 09:56:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46216) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiR-0004RO-VZ for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:33118) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhe-0005DZ-DF for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:33 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-237-vj-fAHQpN2SUuwF2D15CHQ-1; Tue, 18 Oct 2022 09:32:08 -0400 Received: by mail-ed1-f69.google.com with SMTP id b13-20020a056402350d00b0045d0fe2004eso9900537edd.18 for ; Tue, 18 Oct 2022 06:32:07 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id 3-20020a170906318300b0078c213ad441sm7547455ejy.101.2022.10.18.06.32.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099929; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Eak2Olk8SGXmy5UtEL5kCMoFzmLXJ5Mc/eK44fcXzMw=; b=cKyvf/5Uk3MRmdqpT3KEyn5fZM/aFsy79aKsv29h4dkWPm6+ZmOV2RXwzrR2cztjokLF8V mRBJcP/Vh2of5rjRj6kt1x11C0tP3TKgKZG+h6rx4Zp/IkUHalW0Rz3oKTkn1ROLAjntQa mDI1trOLHdp0ZyQKjogmtcVE1ncUDZI= X-MC-Unique: vj-fAHQpN2SUuwF2D15CHQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Eak2Olk8SGXmy5UtEL5kCMoFzmLXJ5Mc/eK44fcXzMw=; b=ZDLLRngBXty8tPwoxx+HkAvaeKypCMfDz8BC+YhcvcL3svVvTIADFaY+bbiwxnMsEy FRr0afh2WwQ+EGAGPzfO0RMEoV+8PNK2FgQ6ISWAMmWwsCyWbKvcesVR9LXzmrGdjj8t JIdO9JOziM32VpO7FTw2Taf5uVhgxCkoB6w6ruVetJS74Iw+Ugsr12pO+yX+su8Ix40M KjUo/FPqo0lGymzVGI7tvmyhp+phuG9t6uiAjpLHc8gzw7T2IIFAU/QjXCmnmAK5vPBC DUbLj8fXvIrez4XCL8xq+yW4AQrKwTkqqdV8LKTqcPa/7prTbz7UPrz52fbBIf/vG9KQ 66pQ== X-Gm-Message-State: ACrzQf0GlSUJN+tIwJRMEB2oBXY1javKwrwVtvLvhkZ30Nv8iminznEY /t3IpyvSTmAXrrSvaMeTQ/3qPqbR0abWz3nrmURZI+FsEBWv1KJWrR9abKK3fP7Pw9HC99oR3Pu Bys9xol0ehjIDU8reEONoxq8oRlM+Qyo9XPecuLKN017Dv23o1rauKRCjQJf+iXTU7lE= X-Received: by 2002:a05:6402:51c6:b0:45d:50ef:1142 with SMTP id r6-20020a05640251c600b0045d50ef1142mr2678989edd.259.1666099926443; Tue, 18 Oct 2022 06:32:06 -0700 (PDT) X-Google-Smtp-Source: AMsMyM72h7H6V9nl/1jTdeeoMYE/caclX8qbFE5bI5iS6HH+uwz0jwU8mShjgBEDcV1LUJMdnKD6+g== X-Received: by 2002:a05:6402:51c6:b0:45d:50ef:1142 with SMTP id r6-20020a05640251c600b0045d50ef1142mr2678963edd.259.1666099926048; Tue, 18 Oct 2022 06:32:06 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 24/53] target/i386: add CPUID feature checks to new decoder Date: Tue, 18 Oct 2022 15:30:13 +0200 Message-Id: <20221018133042.856368-25-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101391394100001 Content-Type: text/plain; charset="utf-8" Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 55 ++++++++++++++++++++++++++++++++ target/i386/tcg/decode-new.h | 20 ++++++++++++ 2 files changed, 75 insertions(+) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 37e76692ba..9afc26b9c9 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -85,6 +85,7 @@ #define X86_OP_ENTRY0(op, ...) \ X86_OP_ENTRY3(op, None, None, None, None, None, None, ## __VA_ARGS__) =20 +#define cpuid(feat) .cpuid =3D X86_FEAT_##feat, #define i64 .special =3D X86_SPECIAL_i64, #define o64 .special =3D X86_SPECIAL_o64, #define xchg .special =3D X86_SPECIAL_Locked, @@ -513,6 +514,56 @@ static bool decode_insn(DisasContext *s, CPUX86State *= env, X86DecodeFunc decode_ return true; } =20 +static bool has_cpuid_feature(DisasContext *s, X86CPUIDFeature cpuid) +{ + switch (cpuid) { + case X86_FEAT_None: + return true; + case X86_FEAT_MOVBE: + return (s->cpuid_ext_features & CPUID_EXT_MOVBE); + case X86_FEAT_PCLMULQDQ: + return (s->cpuid_ext_features & CPUID_EXT_PCLMULQDQ); + case X86_FEAT_SSE: + return (s->cpuid_ext_features & CPUID_SSE); + case X86_FEAT_SSE2: + return (s->cpuid_ext_features & CPUID_SSE2); + case X86_FEAT_SSE3: + return (s->cpuid_ext_features & CPUID_EXT_SSE3); + case X86_FEAT_SSSE3: + return (s->cpuid_ext_features & CPUID_EXT_SSSE3); + case X86_FEAT_SSE41: + return (s->cpuid_ext_features & CPUID_EXT_SSE41); + case X86_FEAT_SSE42: + return (s->cpuid_ext_features & CPUID_EXT_SSE42); + case X86_FEAT_AES: + if (!(s->cpuid_ext_features & CPUID_EXT_AES)) { + return false; + } else if (!(s->prefix & PREFIX_VEX)) { + return true; + } else if (!(s->cpuid_ext_features & CPUID_EXT_AVX)) { + return false; + } else { + return !s->vex_l || (s->cpuid_7_0_ecx_features & CPUID_7_0_ECX= _VAES); + } + + case X86_FEAT_AVX: + return (s->cpuid_ext_features & CPUID_EXT_AVX); + + case X86_FEAT_SSE4A: + return (s->cpuid_ext3_features & CPUID_EXT3_SSE4A); + + case X86_FEAT_ADX: + return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_ADX); + case X86_FEAT_BMI1: + return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1); + case X86_FEAT_BMI2: + return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2); + case X86_FEAT_AVX2: + return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_AVX2); + } + g_assert_not_reached(); +} + static void decode_temp_free(X86DecodedOp *op) { if (op->v_ptr) { @@ -701,6 +752,10 @@ static void disas_insn_new(DisasContext *s, CPUState *= cpu, int b) goto unknown_op; } =20 + if (!has_cpuid_feature(s, decode.e.cpuid)) { + goto illegal_op; + } + switch (decode.e.special) { case X86_SPECIAL_None: break; diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 3a856b48e7..e62e9c9d87 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -93,6 +93,25 @@ typedef enum X86OpSize { X86_SIZE_f64, } X86OpSize; =20 +typedef enum X86CPUIDFeature { + X86_FEAT_None, + X86_FEAT_ADX, + X86_FEAT_AES, + X86_FEAT_AVX, + X86_FEAT_AVX2, + X86_FEAT_BMI1, + X86_FEAT_BMI2, + X86_FEAT_MOVBE, + X86_FEAT_PCLMULQDQ, + X86_FEAT_SSE, + X86_FEAT_SSE2, + X86_FEAT_SSE3, + X86_FEAT_SSSE3, + X86_FEAT_SSE41, + X86_FEAT_SSE42, + X86_FEAT_SSE4A, +} X86CPUIDFeature; + /* Execution flags */ =20 typedef enum X86OpUnit { @@ -160,6 +179,7 @@ struct X86OpEntry { X86OpSize s3:8; =20 X86InsnSpecial special:8; + X86CPUIDFeature cpuid:8; bool is_decode:1; }; =20 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101130; cv=none; d=zohomail.com; s=zohoarc; b=F8cnqcVY4Ndc4NiXSzvoDw+OiJdEhZjn/c+Swff6bm+MMHMiCWPJmL+/ASEHU6cOmc8+z1+TG9m5P//JlfadLjHziLT9yKo+ndU4ThghT/viPdbHW2r6cccZZUqSRYzP5l/0wqTfdep/Z2kKGwOXfkdlZcO87J20UeQ+uJWS9BE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101130; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=T72QVSqLSxlxzXN8nSLOrwkRd0Y8/+Od4Hyl1a3jdVQ=; b=gtDEc2jkGbJl0fAsCyHxH6UmrIRaX4rvSHnNhZlfo8ur6QfUVlbnC1axH94l2ibEoifkfLnEXY9LeyFA+EAy4kc/Lbvdgzgm7HjJZcReLrKYd5Ho8+PikRY2nLj1xC+LBbUBkAuH+iL8/53W1Tte/ipLzkq4aFvYIZd+vwdvBMA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101130260840.4424023102084; Tue, 18 Oct 2022 06:52:10 -0700 (PDT) Received: from localhost ([::1]:40066 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn0p-0000ZM-Op for importer@patchew.org; Tue, 18 Oct 2022 09:52:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33990) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RK-UO for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:35985) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhe-0005F2-Dd for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:31 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-170-V_Gvm2C0MGqvet4lAAx9bw-1; Tue, 18 Oct 2022 09:32:11 -0400 Received: by mail-ed1-f72.google.com with SMTP id z7-20020a05640235c700b0045d3841ccf2so8254528edc.9 for ; Tue, 18 Oct 2022 06:32:11 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id t5-20020a056402524500b0045726e8a22bsm9116506edd.46.2022.10.18.06.32.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099932; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T72QVSqLSxlxzXN8nSLOrwkRd0Y8/+Od4Hyl1a3jdVQ=; b=Fh0z9CHl9gFWWK3n1+gOA+gEEVzJnE1PbNAXdXH7v7zubPqIuuJWR+ivDG+vcIFCY4R8r/ z0lbdvCI+QXeGTH0QXfDIH+A4yLkS0oVJulp4ZCButKV3jT4wAVqNAYRToiQ9TAFJ4JGJe 5uV7fveuMiYeesy8gJCA5DPiThepGho= X-MC-Unique: V_Gvm2C0MGqvet4lAAx9bw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T72QVSqLSxlxzXN8nSLOrwkRd0Y8/+Od4Hyl1a3jdVQ=; b=aAO0BQyqSD5r7VNZp7Fv1AWxvUWlKSp9PcWkKXVTqLzNi2GNKnxMBvjivVfNjk8uYz BUaLMZ/+hDsyEhfGYA3YI3dE9Oyjti2Vn+PkUv9p4T9C0J3AcLdNHOmlGGf8VqAHkSIC CLZMnucHvOTGuqGW4bb8A6sSJlfgVDrh+MfgtqXY24HVr6iAJ0Esiabeq6jrs70Ijk+U JGq8l94Gk8uumHHMouOVBOfytqwDQZ5ff5e6MXw1mJJHi++jApqcskFOigae15jXXE9a FXQK/4q1A+8CB73QRiyXUu16zGRJSkspxBpc1NqS2xafzc4tzs0w3+QEvV08GSdkCOoM 55Mg== X-Gm-Message-State: ACrzQf2dm1rHwFCZ0xmAD3bwg5v915E22flODJC9At6v9mXJniHny8rK paHe5UMXAco8o2D7/KPFN7kyCw/ozecYVA6U07Q204YQpKYmiNU6zqScHSHE+PtCjSUMiFodcQ1 M8lHibPLyxy/PWxBKh9szrTdFbmo2FQwH0g+vP64IsXPFoqUn/WCOnmSO4KtsHH6TW/4= X-Received: by 2002:a17:907:808:b0:730:54cc:b597 with SMTP id wv8-20020a170907080800b0073054ccb597mr2435978ejb.434.1666099929822; Tue, 18 Oct 2022 06:32:09 -0700 (PDT) X-Google-Smtp-Source: AMsMyM42UZEgyKkEbHHC4FI9jxB1kx2ABbJNCmZwqA83wCFmoflE8LYOlCzj5cPnN5mTNl5D1pii+g== X-Received: by 2002:a17:907:808:b0:730:54cc:b597 with SMTP id wv8-20020a170907080800b0073054ccb597mr2435947ejb.434.1666099929511; Tue, 18 Oct 2022 06:32:09 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Paul Brook , Richard Henderson Subject: [PULL 25/53] target/i386: add AVX_EN hflag Date: Tue, 18 Oct 2022 15:30:14 +0200 Message-Id: <20221018133042.856368-26-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101130913100001 Content-Type: text/plain; charset="utf-8" From: Paul Brook Add a new hflag bit to determine whether AVX instructions are allowed Signed-off-by: Paul Brook Message-Id: <20220424220204.2493824-4-paul@nowt.org> Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 3 +++ target/i386/helper.c | 12 ++++++++++++ target/i386/tcg/fpu_helper.c | 1 + 3 files changed, 16 insertions(+) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 5be90e72a9..dad2b2db8d 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -169,6 +169,7 @@ typedef enum X86Seg { #define HF_MPX_EN_SHIFT 25 /* MPX Enabled (CR4+XCR0+BNDCFGx) */ #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) */ =20 #define HF_CPL_MASK (3 << HF_CPL_SHIFT) #define HF_INHIBIT_IRQ_MASK (1 << HF_INHIBIT_IRQ_SHIFT) @@ -195,6 +196,7 @@ typedef enum X86Seg { #define HF_MPX_EN_MASK (1 << HF_MPX_EN_SHIFT) #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) =20 /* hflags2 */ =20 @@ -2126,6 +2128,7 @@ void host_cpuid(uint32_t function, uint32_t count, =20 /* helper.c */ void x86_cpu_set_a20(X86CPU *cpu, int a20_state); +void cpu_sync_avx_hflag(CPUX86State *env); =20 #ifndef CONFIG_USER_ONLY static inline int x86_asidx_from_attrs(CPUState *cs, MemTxAttrs attrs) diff --git a/target/i386/helper.c b/target/i386/helper.c index b954ccda50..b62a1e48e2 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -29,6 +29,17 @@ #endif #include "qemu/log.h" =20 +void cpu_sync_avx_hflag(CPUX86State *env) +{ + if ((env->cr[4] & CR4_OSXSAVE_MASK) + && (env->xcr0 & (XSTATE_SSE_MASK | XSTATE_YMM_MASK)) + =3D=3D (XSTATE_SSE_MASK | XSTATE_YMM_MASK)) { + env->hflags |=3D HF_AVX_EN_MASK; + } else{ + env->hflags &=3D ~HF_AVX_EN_MASK; + } +} + void cpu_sync_bndcs_hflags(CPUX86State *env) { uint32_t hflags =3D env->hflags; @@ -209,6 +220,7 @@ void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_= cr4) env->hflags =3D hflags; =20 cpu_sync_bndcs_hflags(env); + cpu_sync_avx_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 ad58931751..9b59026e37 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -2955,6 +2955,7 @@ void helper_xsetbv(CPUX86State *env, uint32_t ecx, ui= nt64_t mask) =20 env->xcr0 =3D mask; cpu_sync_bndcs_hflags(env); + cpu_sync_avx_hflag(env); return; =20 do_gpf: --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102263; cv=none; d=zohomail.com; s=zohoarc; b=ieO4XFCRYL1IvKj3ZIrJmzQ9tT2PydpCq3GkWdnhQNUqHTZwxXk5YkXIgX/CylYg0Pza14MFgpTvSjtdTLgYJOvHolUWvmJbRbKU4Ncd5DIpDaUu42AjMw5YqvbiY9klvcYl7a4ngytJJLBYWj9E8vlkW01T4/nGAWc0LKZEcy0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102263; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=BfSaYGguZ4N5nvJ/l5lKobhGOQddQwK6wwIF7gUioj0=; b=GgnVEEUVKjBhC9cl5uxzXlLq9O3BZmPd8EWTi3fn7QVfJcKqZjfwRLGPLEZWF8Z7q0O+NMozXqwX1DW6+aXXhJXJwvgVt54tQO0gpfDoZOLzAK9RefkcjjYUsNIZz0Tm2R5FNSgCZTu3eLjKRKdQ0iNNIqtf6bT7w8kn8dOAhq8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166610226336225.01802187205419; Tue, 18 Oct 2022 07:11:03 -0700 (PDT) Received: from localhost ([::1]:54162 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknJ8-0006PK-3O for importer@patchew.org; Tue, 18 Oct 2022 10:11:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33992) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiR-0004RL-Vx for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:54653) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhe-0005FE-Di for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:31 -0400 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-79-wScmDLoZNmanu2oMgolEnA-1; Tue, 18 Oct 2022 09:32:14 -0400 Received: by mail-ej1-f72.google.com with SMTP id nc4-20020a1709071c0400b0078a5ceb571bso6344377ejc.4 for ; Tue, 18 Oct 2022 06:32:14 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id q24-20020a17090676d800b0072f112a6ad2sm7536755ejn.97.2022.10.18.06.32.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099936; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BfSaYGguZ4N5nvJ/l5lKobhGOQddQwK6wwIF7gUioj0=; b=ItsU09+QfGIJ4xr52sunjCOVScKI/W24ZeBgGSTCwMpS9i/th2dMDuDTKjc0yuKWIjFK/U mE1qwqOZPOe0kQZSEV7BJfIXBJmJPGgHrEVvBKLJRLMulVSKPVQgjiGFIfC49JEzugrQ74 A1Z9J11AIc5LfawjOSxe0pUCYNa4/Gs= X-MC-Unique: wScmDLoZNmanu2oMgolEnA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BfSaYGguZ4N5nvJ/l5lKobhGOQddQwK6wwIF7gUioj0=; b=iDVp1pHST7JSxE/WtsMr7EptcHYvYwDHBqvP+mudU+/wJTYMOD/eJZ8vGRkGtGX+yb CvcOqRMFYaYEAtTnFVwRQgaVwxy8ihXPQzHhmwiGQ8Oq2j9YJilnguvXbVAqB7sD4PW5 XI8beUWMiM3QOf0ZPOFaE+hnN/AExqgwc1IOupHAerhFVt+2xgamYDbr8uKqnp0mMSp4 qaAg5K6eZJr81D117RsGwq5x+CGjigZavN0urCqOk+DfcttM1owqS5nlcf0B8gMfuxvD 1mgoGfJL7jfmIj8zKcgre/GJ9ebky/b5I4bxd9TzmUcBApRU5ubavYgihm8h8RbGr50w Jv1A== X-Gm-Message-State: ACrzQf3mtNjiR0+Rb2vnadv+5VJblc2p6QK1++EsH0RYSTdtnRUfSifp GfKa2Fb5nbQE3dTukc3wLbEhWq+USw5DGy3vBbFn91WNG87C4pysMIppg3Z7863pioIVbhhRhen rDwfTXrW9XZ9nwPaaCwszqBHRzc1MYOaQzmniSclJrJ8ebErqNQsKSf1Aoe7bGteBZ4k= X-Received: by 2002:a17:907:2e0b:b0:78d:387d:1579 with SMTP id ig11-20020a1709072e0b00b0078d387d1579mr2363198ejc.761.1666099933149; Tue, 18 Oct 2022 06:32:13 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5u+3n9utDvzn6/dbj7jtqbYgrj4LX2kiq/2tOW3amKp3hH8M4ViyeNqLrwe4hvb4l4+sbjmA== X-Received: by 2002:a17:907:2e0b:b0:78d:387d:1579 with SMTP id ig11-20020a1709072e0b00b0078d387d1579mr2363169ejc.761.1666099932695; Tue, 18 Oct 2022 06:32:12 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 26/53] target/i386: validate VEX prefixes via the instructions' exception classes Date: Tue, 18 Oct 2022 15:30:15 +0200 Message-Id: <20221018133042.856368-27-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102265422100001 Content-Type: text/plain; charset="utf-8" Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 164 ++++++++++++++++++++++++++++++- target/i386/tcg/decode-new.h | 32 ++++++ target/i386/tcg/emit.c.inc | 37 ++++++- target/i386/tcg/translate.c | 18 ++-- 4 files changed, 239 insertions(+), 12 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 9afc26b9c9..a7af673df3 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -93,6 +93,23 @@ #define zext0 .special =3D X86_SPECIAL_ZExtOp0, #define zext2 .special =3D X86_SPECIAL_ZExtOp2, =20 +#define vex1 .vex_class =3D 1, +#define vex1_rep3 .vex_class =3D 1, .vex_special =3D X86_VEX_REPScalar, +#define vex2 .vex_class =3D 2, +#define vex2_rep3 .vex_class =3D 2, .vex_special =3D X86_VEX_REPScalar, +#define vex3 .vex_class =3D 3, +#define vex4 .vex_class =3D 4, +#define vex4_unal .vex_class =3D 4, .vex_special =3D X86_VEX_SSEUnaligned, +#define vex5 .vex_class =3D 5, +#define vex6 .vex_class =3D 6, +#define vex7 .vex_class =3D 7, +#define vex8 .vex_class =3D 8, +#define vex11 .vex_class =3D 11, +#define vex12 .vex_class =3D 12, +#define vex13 .vex_class =3D 13, + +#define avx2_256 .vex_special =3D X86_VEX_AVX2_256, + static uint8_t get_modrm(DisasContext *s, CPUX86State *env) { if (!s->has_modrm) { @@ -157,6 +174,18 @@ static const X86OpEntry opcodes_root[256] =3D { }; =20 #undef mmx +#undef vex1 +#undef vex2 +#undef vex3 +#undef vex4 +#undef vex4_unal +#undef vex5 +#undef vex6 +#undef vex7 +#undef vex8 +#undef vex11 +#undef vex12 +#undef vex13 =20 /* * Decode the fixed part of the opcode and place the last @@ -564,6 +593,136 @@ static bool has_cpuid_feature(DisasContext *s, X86CPU= IDFeature cpuid) g_assert_not_reached(); } =20 +static bool validate_vex(DisasContext *s, X86DecodedInsn *decode) +{ + X86OpEntry *e =3D &decode->e; + + switch (e->vex_special) { + case X86_VEX_REPScalar: + /* + * Instructions which differ between 00/66 and F2/F3 in the + * exception classification and the size of the memory operand. + */ + assert(e->vex_class =3D=3D 1 || e->vex_class =3D=3D 2); + if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) { + e->vex_class =3D 3; + 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; + } + } + break; + + case X86_VEX_SSEUnaligned: + /* handled in sse_needs_alignment. */ + break; + + case X86_VEX_AVX2_256: + if ((s->prefix & PREFIX_VEX) && s->vex_l && !has_cpuid_feature(s, = X86_FEAT_AVX2)) { + goto illegal; + } + } + + /* TODO: instructions that require VEX.W=3D0 (Table 2-16) */ + + switch (e->vex_class) { + case 0: + if (s->prefix & PREFIX_VEX) { + goto illegal; + } + return true; + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + if (s->prefix & PREFIX_VEX) { + if (!(s->flags & HF_AVX_EN_MASK)) { + goto illegal; + } + } else { + if (!(s->flags & HF_OSFXSR_MASK)) { + goto illegal; + } + } + break; + case 12: + /* Must have a VSIB byte and no address prefix. */ + assert(s->has_modrm); + if ((s->modrm & 7) !=3D 4 || s->aflag =3D=3D MO_16) { + goto illegal; + } + + /* 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: + if (!(s->prefix & PREFIX_VEX)) { + goto illegal; + } + if (!(s->flags & HF_AVX_EN_MASK)) { + goto illegal; + } + break; + case 8: + if (!(s->prefix & PREFIX_VEX)) { + /* EMMS */ + return true; + } + if (!(s->flags & HF_AVX_EN_MASK)) { + goto illegal; + } + break; + case 13: + if (!(s->prefix & PREFIX_VEX)) { + goto illegal; + } + if (s->vex_l) { + goto illegal; + } + /* All integer instructions use VEX.vvvv, so exit. */ + return true; + } + + 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) { + goto illegal; + } + + if (s->flags & HF_TS_MASK) { + goto nm_exception; + } + if (s->flags & HF_EM_MASK) { + goto illegal; + } + return true; + +nm_exception: + gen_NM_exception(s); + return false; +illegal: + gen_illegal_opcode(s); + return false; +} + static void decode_temp_free(X86DecodedOp *op) { if (op->v_ptr) { @@ -804,8 +963,11 @@ static void disas_insn_new(DisasContext *s, CPUState *= cpu, int b) break; } =20 + if (!validate_vex(s, &decode)) { + return; + } if (decode.op[0].has_ea || decode.op[1].has_ea || decode.op[2].has_ea)= { - gen_load_ea(s, &decode.mem); + gen_load_ea(s, &decode.mem, decode.e.vex_class =3D=3D 12); } if (s->prefix & PREFIX_LOCK) { if (decode.op[0].unit !=3D X86_OP_INT || !decode.op[0].has_ea) { diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index e62e9c9d87..25e5400a8a 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -152,6 +152,36 @@ typedef enum X86InsnSpecial { X86_SPECIAL_o64, } X86InsnSpecial; =20 +/* + * Special cases for instructions that operate on XMM/YMM registers. Intel + * retconned all of them to have VEX exception classes other than 0 and 13= , so + * all these only matter for instructions that have a VEX exception class. + * Based on tables in the "AVX and SSE Instruction Exception Specification" + * section of the manual. + */ +typedef enum X86VEXSpecial { + /* Legacy SSE instructions that allow unaligned operands */ + X86_VEX_SSEUnaligned, + + /* + * Used for instructions that distinguish the XMM operand type with an + * instruction prefix; legacy SSE encodings will allow unaligned opera= nds + * for scalar operands only (identified by a REP prefix). In this cas= e, + * the decoding table uses "x" for the vector operands instead of spec= ifying + * pd/ps/sd/ss individually. + */ + X86_VEX_REPScalar, + + /* + * VEX instructions that only support 256-bit operands with AVX2 (Tabl= e 2-17 + * column 3). Columns 2 and 4 (instructions limited to 256- and 127-b= it + * operands respectively) are implicit in the presence of dq and qq + * operands, and thus handled by decode_op_size. + */ + X86_VEX_AVX2_256, +} X86VEXSpecial; + + typedef struct X86OpEntry X86OpEntry; typedef struct X86DecodedInsn X86DecodedInsn; =20 @@ -180,6 +210,8 @@ struct X86OpEntry { =20 X86InsnSpecial special:8; X86CPUIDFeature cpuid:8; + unsigned vex_class:8; + X86VEXSpecial vex_special:8; bool is_decode:1; }; =20 diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index f8ba888c33..85b0aeac60 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -19,14 +19,19 @@ * License along with this library; if not, see . */ =20 +static void gen_NM_exception(DisasContext *s) +{ + gen_exception(s, EXCP07_PREX); +} + static void gen_illegal(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) { gen_illegal_opcode(s); } =20 -static void gen_load_ea(DisasContext *s, AddressParts *mem) +static void gen_load_ea(DisasContext *s, AddressParts *mem, bool is_vsib) { - TCGv ea =3D gen_lea_modrm_1(s, *mem); + TCGv ea =3D gen_lea_modrm_1(s, *mem, is_vsib); gen_lea_v_seg(s, s->aflag, ea, mem->def_seg, s->override); } =20 @@ -113,6 +118,25 @@ static void gen_load_sse(DisasContext *s, TCGv temp, M= emOp ot, int dest_ofs, boo } } =20 +static bool sse_needs_alignment(DisasContext *s, X86DecodedInsn *decode, M= emOp ot) +{ + switch (decode->e.vex_class) { + case 2: + case 4: + if ((s->prefix & PREFIX_VEX) || + decode->e.vex_special =3D=3D X86_VEX_SSEUnaligned) { + /* MOST legacy SSE instructions require aligned memory operand= s, but not all. */ + return false; + } + /* fall through */ + case 1: + return ot >=3D MO_128; + + default: + return false; + } +} + static void gen_load(DisasContext *s, X86DecodedInsn *decode, int opn, TCG= v v) { X86DecodedOp *op =3D &decode->op[opn]; @@ -149,7 +173,8 @@ static void gen_load(DisasContext *s, X86DecodedInsn *d= ecode, int opn, TCGv v) compute_xmm_offset(op); load_vector: if (op->has_ea) { - gen_load_sse(s, v, op->ot, op->offset, true); + bool aligned =3D sse_needs_alignment(s, decode, op->ot); + gen_load_sse(s, v, op->ot, op->offset, aligned); } break; =20 @@ -176,7 +201,13 @@ static void gen_writeback(DisasContext *s, X86DecodedI= nsn *decode, int opn, TCGv } break; case X86_OP_MMX: + break; case X86_OP_SSE: + if ((s->prefix & PREFIX_VEX) && op->ot =3D=3D MO_128) { + tcg_gen_gvec_dup_imm(MO_64, + offsetof(CPUX86State, xmm_regs[op->n].ZMM= _X(1)), + 16, 16, 0); + } break; case X86_OP_CR: case X86_OP_DR: diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index abccaadfbf..b5be0e59f4 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -23,6 +23,7 @@ #include "disas/disas.h" #include "exec/exec-all.h" #include "tcg/tcg-op.h" +#include "tcg/tcg-op-gvec.h" #include "exec/cpu_ldst.h" #include "exec/translator.h" =20 @@ -2281,11 +2282,11 @@ static AddressParts gen_lea_modrm_0(CPUX86State *en= v, DisasContext *s, } =20 /* Compute the address, with a minimum number of TCG ops. */ -static TCGv gen_lea_modrm_1(DisasContext *s, AddressParts a) +static TCGv gen_lea_modrm_1(DisasContext *s, AddressParts a, bool is_vsib) { TCGv ea =3D NULL; =20 - if (a.index >=3D 0) { + if (a.index >=3D 0 && !is_vsib) { if (a.scale =3D=3D 0) { ea =3D cpu_regs[a.index]; } else { @@ -2318,7 +2319,7 @@ static TCGv gen_lea_modrm_1(DisasContext *s, AddressP= arts a) static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) { AddressParts a =3D gen_lea_modrm_0(env, s, modrm); - TCGv ea =3D gen_lea_modrm_1(s, a); + TCGv ea =3D gen_lea_modrm_1(s, a, false); gen_lea_v_seg(s, s->aflag, ea, a.def_seg, s->override); } =20 @@ -2331,7 +2332,8 @@ static void gen_nop_modrm(CPUX86State *env, DisasCont= ext *s, int modrm) static void gen_bndck(CPUX86State *env, DisasContext *s, int modrm, TCGCond cond, TCGv_i64 bndv) { - TCGv ea =3D gen_lea_modrm_1(s, gen_lea_modrm_0(env, s, modrm)); + AddressParts a =3D gen_lea_modrm_0(env, s, modrm); + TCGv ea =3D gen_lea_modrm_1(s, a, false); =20 tcg_gen_extu_tl_i64(s->tmp1_i64, ea); if (!CODE64(s)) { @@ -6011,7 +6013,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) reg =3D ((modrm >> 3) & 7) | REX_R(s); { AddressParts a =3D gen_lea_modrm_0(env, s, modrm); - TCGv ea =3D gen_lea_modrm_1(s, a); + TCGv ea =3D gen_lea_modrm_1(s, a, false); gen_lea_v_seg(s, s->aflag, ea, -1, -1); gen_op_mov_reg_v(s, dflag, reg, s->A0); } @@ -6234,7 +6236,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) if (mod !=3D 3) { /* memory op */ AddressParts a =3D gen_lea_modrm_0(env, s, modrm); - TCGv ea =3D gen_lea_modrm_1(s, a); + TCGv ea =3D gen_lea_modrm_1(s, a, false); TCGv last_addr =3D tcg_temp_new(); bool update_fdp =3D true; =20 @@ -7229,7 +7231,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) gen_exts(ot, s->T1); tcg_gen_sari_tl(s->tmp0, s->T1, 3 + ot); tcg_gen_shli_tl(s->tmp0, s->tmp0, ot); - tcg_gen_add_tl(s->A0, gen_lea_modrm_1(s, a), s->tmp0); + tcg_gen_add_tl(s->A0, gen_lea_modrm_1(s, a, false), s->tmp0); gen_lea_v_seg(s, s->aflag, s->A0, a.def_seg, s->override); if (!(s->prefix & PREFIX_LOCK)) { gen_op_ld_v(s, ot, s->T0, s->A0); @@ -8278,7 +8280,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) /* rip-relative generates #ud */ goto illegal_op; } - tcg_gen_not_tl(s->A0, gen_lea_modrm_1(s, a)); + tcg_gen_not_tl(s->A0, gen_lea_modrm_1(s, a, false)); if (!CODE64(s)) { tcg_gen_ext32u_tl(s->A0, s->A0); } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102189; cv=none; d=zohomail.com; s=zohoarc; b=gBQngo3hLZNMxsRcLewmr70QPB06J72V75pEbNn2OS10B+fDv2svditPjd+9OJXmwxwdoJIXkTeAJLvHvT4fnigSaO3o4EUO8ciEY8pCGGaVvpEQQJHMNaL69CDPmrH69zzfjGR14aEh/4DdCG6+y5S++WAqlsss0F3Ut47G8WE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102189; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JETjXvsLDGBVZaWr8X9vwnBhgE2BdBgJ63vEQ6jShxs=; b=FlhJ/e9hiJ9cAHdMFDvSyaMbZir0q8Lv84rrciYdv1HosB+LJ9/MgZjcjhGy92y2bNM7gs1SnHmSmUI+O8vghxIALQEELlXfebrXxlELQJji0KbbLgnCosmL1JViOt7LxnAqPH0251nU/Yht8titAXi4fiDnG7ajdW0VBRCVI0U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102189390199.50429518121518; Tue, 18 Oct 2022 07:09:49 -0700 (PDT) Received: from localhost ([::1]:55044 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknHu-0004Ls-QF for importer@patchew.org; Tue, 18 Oct 2022 10:09:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33994) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiR-0004RM-VQ for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:35672) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhf-0005FP-Vx for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:32 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-57-z-yTJ_KYMSa6EkTa-yXsLg-1; Tue, 18 Oct 2022 09:32:17 -0400 Received: by mail-ed1-f69.google.com with SMTP id b13-20020a056402350d00b0045d0fe2004eso9900935edd.18 for ; Tue, 18 Oct 2022 06:32:17 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id n24-20020a170906119800b0077077b59085sm7498283eja.184.2022.10.18.06.32.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099939; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JETjXvsLDGBVZaWr8X9vwnBhgE2BdBgJ63vEQ6jShxs=; b=ebe3+jMgNDCDxBM8a5xt9sWLfuEt5jF8OA4H+jnX0KjhIvsVATcnKY0wK36542NFCrQ2/f v7NPuP65WAdSLYjD/LfaHVt9fPuPRYSMzU4VFwC3roEXAtKBgpfsg938/nWzfgyDH27LKK V1GogW4NUjGY1H63cqznRIwAO9NGCTM= X-MC-Unique: z-yTJ_KYMSa6EkTa-yXsLg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JETjXvsLDGBVZaWr8X9vwnBhgE2BdBgJ63vEQ6jShxs=; b=dcIXbdeYERrn2ciQ9EZFZjcoztzKJgFp8ZoQ5PijmLl16kBpB2jTRnNGzeB044g58M M5hlJYK/qYr93M0H0S557WIN7wGK+WAkIFcjxKpLvO/x94ot63qmRNdDis/jV1/04b8U VmnQxO7aBymN9SEMFj9Jp774q/8OdU7+tAGh877U5qJcrXGsPlDbBLyKpLcHlOyqtOQl 1GHrzENdrwaps6Nc//mWo4RxOtUQFt9/jT8DVpNLtEJ/FwPvUfrJq5TCGYE6tPW+zhN/ sl7WATr7GVj35bwdW37utn0vlcEs9Tx3XVHA4gXgOVUF4CP/XjcAD6ilzqX2SBgx1QC6 2TJA== X-Gm-Message-State: ACrzQf0+mKD/K6zVoGExV+ITSQrv71KxZMKsgPEAly9XrmWZJ94uFs2u IjoSIiQw+/9SSTC2D4RcBJGcU4/HBT+qSHELoRk1PhVIhe4d8mWiUShwpkKLfLZreXghpAvNBO2 6py1U19cUomH0PpsxsS31QsLymin6NhDechB19ziGaE/anfp7ecTejck+tTkXsoW2Hu8= X-Received: by 2002:a17:907:e87:b0:78e:2b3c:f672 with SMTP id ho7-20020a1709070e8700b0078e2b3cf672mr2446159ejc.74.1666099935809; Tue, 18 Oct 2022 06:32:15 -0700 (PDT) X-Google-Smtp-Source: AMsMyM759cRnBmoqcUeIi2ZOd1qNmpRLxjX4SmTHQwWD7Rr0ZsnGlmXfurIioKVf6Fm2zzJIPu+1Bg== X-Received: by 2002:a17:907:e87:b0:78e:2b3c:f672 with SMTP id ho7-20020a1709070e8700b0078e2b3cf672mr2446133ejc.74.1666099935524; Tue, 18 Oct 2022 06:32:15 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 27/53] target/i386: validate SSE prefixes directly in the decoding table Date: Tue, 18 Oct 2022 15:30:16 +0200 Message-Id: <20221018133042.856368-28-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102190081100001 Content-Type: text/plain; charset="utf-8" Many SSE and AVX instructions are only valid with specific prefixes (none, 66, F3, F2). Introduce a direct way to encode this in the decoding table to avoid using decode groups too much. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 37 ++++++++++++++++++++++++++++++++ target/i386/tcg/decode-new.h | 1 + 2 files changed, 38 insertions(+) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index a7af673df3..64bef76159 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -110,6 +110,22 @@ =20 #define avx2_256 .vex_special =3D X86_VEX_AVX2_256, =20 +#define P_00 1 +#define P_66 (1 << PREFIX_DATA) +#define P_F3 (1 << PREFIX_REPZ) +#define P_F2 (1 << PREFIX_REPNZ) + +#define p_00 .valid_prefix =3D P_00, +#define p_66 .valid_prefix =3D P_66, +#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_f3 .valid_prefix =3D P_00 | P_F3, +#define p_66_f2 .valid_prefix =3D P_66 | P_F2, +#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, + static uint8_t get_modrm(DisasContext *s, CPUX86State *env) { if (!s->has_modrm) { @@ -480,6 +496,23 @@ static bool decode_op(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode, return true; } =20 +static bool validate_sse_prefix(DisasContext *s, X86OpEntry *e) +{ + uint16_t sse_prefixes; + + 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; + } + + /* Now, either zero or one bit is set in sse_prefixes. */ + sse_prefixes =3D s->prefix & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA= ); + return e->valid_prefix & (1 << sse_prefixes); +} + static bool decode_insn(DisasContext *s, CPUX86State *env, X86DecodeFunc d= ecode_func, X86DecodedInsn *decode) { @@ -491,6 +524,10 @@ static bool decode_insn(DisasContext *s, CPUX86State *= env, X86DecodeFunc decode_ e->decode(s, env, e, &decode->b); } =20 + if (!validate_sse_prefix(s, e)) { + return false; + } + /* First compute size of operands 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)) { diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 25e5400a8a..8456ae67ad 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -212,6 +212,7 @@ struct X86OpEntry { X86CPUIDFeature cpuid:8; unsigned vex_class:8; X86VEXSpecial vex_special:8; + uint16_t valid_prefix:16; bool is_decode:1; }; =20 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101148; cv=none; d=zohomail.com; s=zohoarc; b=iHI988+tm66Kgm5hEzZVeWNbNY9656tgNKiTaqfJStebGa+Vqc7GbSvgUZu4pAt1oZCr76vMXyijlBUpnqHuXy1Vbf9PH5b6JSNEQ9oJEg73gxZ3NJjbHaiRFeOSqU7VwJfHSSDZ0pSrVvg/D2MVogyUgDKPZKJNKEwQSTpl5As= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101148; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=+NZLrsCOwMDvFIYLBsPVdaDb6PXjdw5NxLEdSI2UaoE=; b=UndwV3kN+3JoCtrhC0Geg9TGYXsfYWg5jOdIDtUucSYINhW+zZ1cKs3q9prtkxnNy74sg8Zl8BWUmReC0fzXCDr9C5KF2almGb0thePiI6Mg8C128x1BDFR8r+DJJm2+k5hB48OLvugsy1aW1FNg9jQ77en8fgpXRxjkOF8x7rs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166610114886030.973325316993737; Tue, 18 Oct 2022 06:52:28 -0700 (PDT) Received: from localhost ([::1]:34672 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn18-0001mU-5x for importer@patchew.org; Tue, 18 Oct 2022 09:52:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46218) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RP-43 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:38832) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhj-0005Fa-KX for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:34 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-255-95RdMKA0PpuVSaJBlu7WIA-1; Tue, 18 Oct 2022 09:32:21 -0400 Received: by mail-ed1-f72.google.com with SMTP id i17-20020a05640242d100b0044f18a5379aso11946660edc.21 for ; Tue, 18 Oct 2022 06:32:21 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id 17-20020a170906201100b007803083a36asm7449643ejo.115.2022.10.18.06.32.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099942; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+NZLrsCOwMDvFIYLBsPVdaDb6PXjdw5NxLEdSI2UaoE=; b=HzaUMLqub3u1i/zSb2qAURDjADk40OWF1flIvStAUsaFSUpUBaHE3aUkHCrlfpEahzK4kS PxZvAW/bgxZT+KwSyoEPAMmTlmApVT7OsuZGGb7pCgdcnJFxU5zMIY121Lk1QHHsDJTI6k E1k/8fsTnvOss2k5aUnD7Gd9Y6jRrTY= X-MC-Unique: 95RdMKA0PpuVSaJBlu7WIA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+NZLrsCOwMDvFIYLBsPVdaDb6PXjdw5NxLEdSI2UaoE=; b=kEEFtV/OpIq+Yobtgi1Bh7dJD5KbaesjdOGpp4+aytLuxWZ1UoisBlqGDqf+/dgu7K 4KTvnfnyXcyFDyL4XFMAd+sB2z/NBIqiX9Qsfikr8Q23OLumEa59N1dZ5kQ7+rsO9XmN A013LCAh4nMCpwdrz3v1YUrMmMz8HkZ5fBhxl9e8l+cNtoh93EvCzX1mfhUNPihn0kSy Hp6tVduEdIB1Y43tZKqcWdFTRlFYEebWHrfVs/towXKvi5nxEPg63o8QuQudEAYloo5p KicifEUBdN22/qR4kX3V+HSAkEe5018swY6XofkuvTdS+vziU7Ku293bcqBvumH3nlyB dkPw== X-Gm-Message-State: ACrzQf1oBjsd1mqn7shmHwsTBq9WdPDGFXvozgzLQAqJ1txtCiOxga9Z fYPuU4kfCYUdhI1skW89rRu5DJXJveNxi3kX0kQuruCvi3BkbfgsbrcJ31eRZUJrSTly0hUzaFL aCEEcD1c/1zXIhQRjEyy/drhqxFmOrUt3Vx/Xo9KNLH/DIijKlVxOTRr0i+PcCFcuj50= X-Received: by 2002:a17:906:ee8e:b0:730:3646:d178 with SMTP id wt14-20020a170906ee8e00b007303646d178mr2480175ejb.426.1666099939161; Tue, 18 Oct 2022 06:32:19 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6wRrnuTBzxX5SLRTSLrYUgtHwkyOq5t/S+rmhvqu4EWDLFD4uUFotWD6NaeOFEfRrfLnuPaA== X-Received: by 2002:a17:906:ee8e:b0:730:3646:d178 with SMTP id wt14-20020a170906ee8e00b007303646d178mr2480137ejb.426.1666099938518; Tue, 18 Oct 2022 06:32:18 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 28/53] target/i386: move scalar 0F 38 and 0F 3A instruction to new decoder Date: Tue, 18 Oct 2022 15:30:17 +0200 Message-Id: <20221018133042.856368-29-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101149472100002 Content-Type: text/plain; charset="utf-8" Because these are the only VEX instructions that QEMU supports, the new decoder is entered on the first byte of a valid VEX prefix, and VEX decoding only needs to be done in decode-new.c.inc. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 59 +++++++ target/i386/tcg/emit.c.inc | 258 +++++++++++++++++++++++++++ target/i386/tcg/translate.c | 293 +------------------------------ 3 files changed, 321 insertions(+), 289 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 64bef76159..dc04aa9cbb 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -135,11 +135,69 @@ static uint8_t get_modrm(DisasContext *s, CPUX86State= *env) return s->modrm; } =20 +static void decode_group17(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + static const X86GenFunc group17_gen[8] =3D { + NULL, gen_BLSR, gen_BLSMSK, gen_BLSI, + }; + int op =3D (get_modrm(s, env) >> 3) & 7; + entry->gen =3D group17_gen[op]; +} + static const X86OpEntry opcodes_0F38_00toEF[240] =3D { }; =20 /* five rows for no prefix, 66, F3, F2, 66+F2 */ static const X86OpEntry opcodes_0F38_F0toFF[16][5] =3D { + [0] =3D { + X86_OP_ENTRY3(MOVBE, G,y, M,y, None,None, cpuid(MOVBE)), + X86_OP_ENTRY3(MOVBE, G,w, M,w, None,None, cpuid(MOVBE)), + {}, + X86_OP_ENTRY2(CRC32, G,d, E,b, cpuid(SSE42)), + X86_OP_ENTRY2(CRC32, G,d, E,b, cpuid(SSE42)), + }, + [1] =3D { + X86_OP_ENTRY3(MOVBE, M,y, G,y, None,None, cpuid(MOVBE)), + X86_OP_ENTRY3(MOVBE, M,w, G,w, None,None, cpuid(MOVBE)), + {}, + X86_OP_ENTRY2(CRC32, G,d, E,y, cpuid(SSE42)), + X86_OP_ENTRY2(CRC32, G,d, E,w, cpuid(SSE42)), + }, + [2] =3D { + X86_OP_ENTRY3(ANDN, G,y, B,y, E,y, vex13 cpuid(BMI1)), + {}, + {}, + {}, + {}, + }, + [3] =3D { + X86_OP_GROUP3(group17, B,y, E,y, None,None, vex13 cpuid(BMI1)), + {}, + {}, + {}, + {}, + }, + [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 cpuid(BMI2)), + X86_OP_ENTRY3(PDEP, G,y, B,y, E,y, vex13 cpuid(BMI2)), + {}, + }, + [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)), + {}, + }, + [7] =3D { + X86_OP_ENTRY3(BEXTR, G,y, E,y, B,y, vex13 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 cpuid(BMI1)), + X86_OP_ENTRY3(SHRX, G,y, E,y, B,y, vex13 cpuid(BMI1)), + {}, + }, }; =20 static void decode_0F38(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) @@ -161,6 +219,7 @@ static void decode_0F38(DisasContext *s, CPUX86State *e= nv, X86OpEntry *entry, ui } =20 static const X86OpEntry opcodes_0F3A[256] =3D { + [0xF0] =3D X86_OP_ENTRY3(RORX, G,y, E,y, I,b, vex13 cpuid(BMI2) p_f2), }; =20 static void decode_0F3A(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 85b0aeac60..947deacd37 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -215,3 +215,261 @@ static void gen_writeback(DisasContext *s, X86Decoded= Insn *decode, int opn, TCGv g_assert_not_reached(); } } + +static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_= op) +{ + TCGv carry_in =3D NULL; + TCGv carry_out =3D (cc_op =3D=3D CC_OP_ADCX ? cpu_cc_dst : cpu_cc_src2= ); + TCGv zero; + + if (cc_op =3D=3D s->cc_op || s->cc_op =3D=3D CC_OP_ADCOX) { + /* Re-use the carry-out from a previous round. */ + carry_in =3D carry_out; + cc_op =3D s->cc_op; + } else if (s->cc_op =3D=3D CC_OP_ADCX || s->cc_op =3D=3D CC_OP_ADOX) { + /* Merge with the carry-out from the opposite instruction. */ + cc_op =3D CC_OP_ADCOX; + } + + /* If we don't have a carry-in, get it out of EFLAGS. */ + if (!carry_in) { + if (s->cc_op !=3D CC_OP_ADCX && s->cc_op !=3D CC_OP_ADOX) { + gen_compute_eflags(s); + } + carry_in =3D s->tmp0; + tcg_gen_extract_tl(carry_in, cpu_cc_src, + ctz32(cc_op =3D=3D CC_OP_ADCX ? CC_C : CC_O), 1); + } + + switch (ot) { +#ifdef TARGET_X86_64 + case MO_32: + /* If TL is 64-bit just do everything in 64-bit arithmetic. */ + tcg_gen_add_i64(s->T0, s->T0, s->T1); + tcg_gen_add_i64(s->T0, s->T0, carry_in); + tcg_gen_shri_i64(carry_out, s->T0, 32); + break; +#endif + default: + zero =3D tcg_constant_tl(0); + tcg_gen_add2_tl(s->T0, carry_out, s->T0, zero, carry_in, zero); + tcg_gen_add2_tl(s->T0, carry_out, s->T0, carry_out, s->T1, zero); + break; + } + set_cc_op(s, cc_op); +} + +static void gen_ADCX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + gen_ADCOX(s, env, decode->op[0].ot, CC_OP_ADCX); +} + +static void gen_ADOX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + gen_ADCOX(s, env, decode->op[0].ot, CC_OP_ADOX); +} + +static void gen_ANDN(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + + tcg_gen_andc_tl(s->T0, s->T1, s->T0); + gen_op_update1_cc(s); + set_cc_op(s, CC_OP_LOGICB + ot); +} + +static void gen_BEXTR(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + MemOp ot =3D decode->op[0].ot; + TCGv bound, zero; + + /* + * Extract START, and shift the operand. + * Shifts larger than operand size get zeros. + */ + tcg_gen_ext8u_tl(s->A0, s->T1); + tcg_gen_shr_tl(s->T0, s->T0, s->A0); + + bound =3D tcg_constant_tl(ot =3D=3D MO_64 ? 63 : 31); + zero =3D tcg_constant_tl(0); + tcg_gen_movcond_tl(TCG_COND_LEU, s->T0, s->A0, bound, s->T0, zero); + + /* + * Extract the LEN into a mask. Lengths larger than + * operand size get all ones. + */ + tcg_gen_extract_tl(s->A0, s->T1, 8, 8); + tcg_gen_movcond_tl(TCG_COND_LEU, s->A0, s->A0, bound, s->A0, bound); + + tcg_gen_movi_tl(s->T1, 1); + tcg_gen_shl_tl(s->T1, s->T1, s->A0); + tcg_gen_subi_tl(s->T1, s->T1, 1); + tcg_gen_and_tl(s->T0, s->T0, s->T1); + + gen_op_update1_cc(s); + set_cc_op(s, CC_OP_LOGICB + ot); +} + +static void gen_BLSI(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + + tcg_gen_neg_tl(s->T1, s->T0); + tcg_gen_and_tl(s->T0, s->T0, s->T1); + tcg_gen_mov_tl(cpu_cc_dst, s->T0); + set_cc_op(s, CC_OP_BMILGB + ot); +} + +static void gen_BLSMSK(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + MemOp ot =3D decode->op[0].ot; + + tcg_gen_subi_tl(s->T1, s->T0, 1); + tcg_gen_xor_tl(s->T0, s->T0, s->T1); + tcg_gen_mov_tl(cpu_cc_dst, s->T0); + set_cc_op(s, CC_OP_BMILGB + ot); +} + +static void gen_BLSR(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + + tcg_gen_subi_tl(s->T1, s->T0, 1); + tcg_gen_and_tl(s->T0, s->T0, s->T1); + tcg_gen_mov_tl(cpu_cc_dst, s->T0); + set_cc_op(s, CC_OP_BMILGB + ot); +} + +static void gen_BZHI(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + TCGv bound; + + tcg_gen_ext8u_tl(s->T1, cpu_regs[s->vex_v]); + bound =3D tcg_constant_tl(ot =3D=3D MO_64 ? 63 : 31); + + /* + * Note that since we're using BMILG (in order to get O + * cleared) we need to store the inverse into C. + */ + tcg_gen_setcond_tl(TCG_COND_LT, cpu_cc_src, s->T1, bound); + tcg_gen_movcond_tl(TCG_COND_GT, s->T1, s->T1, bound, bound, s->T1); + + tcg_gen_movi_tl(s->A0, -1); + tcg_gen_shl_tl(s->A0, s->A0, s->T1); + tcg_gen_andc_tl(s->T0, s->T0, s->A0); + + gen_op_update1_cc(s); + set_cc_op(s, CC_OP_BMILGB + ot); +} + +static void gen_CRC32(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + MemOp ot =3D decode->op[2].ot; + + tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); + gen_helper_crc32(s->T0, s->tmp2_i32, s->T1, tcg_constant_i32(8 << ot)); +} + +static void gen_MOVBE(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + MemOp ot =3D decode->op[0].ot; + + /* M operand type does not load/store */ + if (decode->e.op0 =3D=3D X86_TYPE_M) { + tcg_gen_qemu_st_tl(s->T0, s->A0, s->mem_index, ot | MO_BE); + } else { + tcg_gen_qemu_ld_tl(s->T0, s->A0, s->mem_index, ot | MO_BE); + } +} + +static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + + /* low part of result in VEX.vvvv, high in MODRM */ + switch (ot) { + default: + tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); + tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T1); + tcg_gen_mulu2_i32(s->tmp2_i32, s->tmp3_i32, + s->tmp2_i32, s->tmp3_i32); + tcg_gen_extu_i32_tl(cpu_regs[s->vex_v], s->tmp2_i32); + tcg_gen_extu_i32_tl(s->T0, s->tmp3_i32); + break; +#ifdef TARGET_X86_64 + case MO_64: + tcg_gen_mulu2_i64(cpu_regs[s->vex_v], s->T0, s->T0, s->T1); + break; +#endif + } + +} + +static void gen_PDEP(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[1].ot; + if (ot < MO_64) { + tcg_gen_ext32u_tl(s->T0, s->T0); + } + gen_helper_pdep(s->T0, s->T0, s->T1); +} + +static void gen_PEXT(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[1].ot; + if (ot < MO_64) { + tcg_gen_ext32u_tl(s->T0, s->T0); + } + gen_helper_pext(s->T0, s->T0, s->T1); +} + +static void gen_RORX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + int b =3D decode->immediate; + + if (ot =3D=3D MO_64) { + tcg_gen_rotri_tl(s->T0, s->T0, b & 63); + } else { + tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); + tcg_gen_rotri_i32(s->tmp2_i32, s->tmp2_i32, b & 31); + tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); + } +} + +static void gen_SARX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + int mask; + + mask =3D ot =3D=3D MO_64 ? 63 : 31; + tcg_gen_andi_tl(s->T1, s->T1, mask); + if (ot !=3D MO_64) { + tcg_gen_ext32s_tl(s->T0, s->T0); + } + tcg_gen_sar_tl(s->T0, s->T0, s->T1); +} + +static void gen_SHLX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + int mask; + + mask =3D ot =3D=3D MO_64 ? 63 : 31; + tcg_gen_andi_tl(s->T1, s->T1, mask); + tcg_gen_shl_tl(s->T0, s->T0, s->T1); +} + +static void gen_SHRX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + MemOp ot =3D decode->op[0].ot; + int mask; + + mask =3D ot =3D=3D MO_64 ? 63 : 31; + tcg_gen_andi_tl(s->T1, s->T1, mask); + if (ot !=3D MO_64) { + tcg_gen_ext32u_tl(s->T0, s->T0); + } + tcg_gen_shr_tl(s->T0, s->T0, s->T1); +} diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index b5be0e59f4..202dc5145a 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4210,151 +4210,6 @@ static void gen_sse(CPUX86State *env, DisasContext = *s, int b) s->mem_index, ot | MO_BE); } break; - - case 0x0f2: /* andn Gy, By, Ey */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - tcg_gen_andc_tl(s->T0, s->T0, cpu_regs[s->vex_v]); - gen_op_mov_reg_v(s, ot, reg, s->T0); - gen_op_update1_cc(s); - set_cc_op(s, CC_OP_LOGICB + ot); - break; - - case 0x0f7: /* bextr Gy, Ey, By */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - { - TCGv bound, zero; - - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - /* Extract START, and shift the operand. - Shifts larger than operand size get zeros. */ - tcg_gen_ext8u_tl(s->A0, cpu_regs[s->vex_v]); - tcg_gen_shr_tl(s->T0, s->T0, s->A0); - - bound =3D tcg_const_tl(ot =3D=3D MO_64 ? 63 : 31); - zero =3D tcg_const_tl(0); - tcg_gen_movcond_tl(TCG_COND_LEU, s->T0, s->A0, bound, - s->T0, zero); - tcg_temp_free(zero); - - /* Extract the LEN into a mask. Lengths larger than - operand size get all ones. */ - tcg_gen_extract_tl(s->A0, cpu_regs[s->vex_v], 8, 8); - tcg_gen_movcond_tl(TCG_COND_LEU, s->A0, s->A0, bound, - s->A0, bound); - tcg_temp_free(bound); - tcg_gen_movi_tl(s->T1, 1); - tcg_gen_shl_tl(s->T1, s->T1, s->A0); - tcg_gen_subi_tl(s->T1, s->T1, 1); - tcg_gen_and_tl(s->T0, s->T0, s->T1); - - gen_op_mov_reg_v(s, ot, reg, s->T0); - gen_op_update1_cc(s); - set_cc_op(s, CC_OP_LOGICB + ot); - } - break; - - case 0x0f5: /* bzhi Gy, Ey, By */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - tcg_gen_ext8u_tl(s->T1, cpu_regs[s->vex_v]); - { - TCGv bound =3D tcg_const_tl(ot =3D=3D MO_64 ? 63 : 31); - /* Note that since we're using BMILG (in order to get O - cleared) we need to store the inverse into C. */ - tcg_gen_setcond_tl(TCG_COND_LT, cpu_cc_src, - s->T1, bound); - tcg_gen_movcond_tl(TCG_COND_GT, s->T1, s->T1, - bound, bound, s->T1); - tcg_temp_free(bound); - } - tcg_gen_movi_tl(s->A0, -1); - tcg_gen_shl_tl(s->A0, s->A0, s->T1); - tcg_gen_andc_tl(s->T0, s->T0, s->A0); - gen_op_mov_reg_v(s, ot, reg, s->T0); - gen_op_update1_cc(s); - set_cc_op(s, CC_OP_BMILGB + ot); - break; - - case 0x3f6: /* mulx By, Gy, rdx, Ey */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - switch (ot) { - default: - tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); - tcg_gen_trunc_tl_i32(s->tmp3_i32, cpu_regs[R_EDX]); - tcg_gen_mulu2_i32(s->tmp2_i32, s->tmp3_i32, - s->tmp2_i32, s->tmp3_i32); - tcg_gen_extu_i32_tl(cpu_regs[s->vex_v], s->tmp2_i32); - tcg_gen_extu_i32_tl(cpu_regs[reg], s->tmp3_i32); - break; -#ifdef TARGET_X86_64 - case MO_64: - tcg_gen_mulu2_i64(s->T0, s->T1, - s->T0, cpu_regs[R_EDX]); - tcg_gen_mov_i64(cpu_regs[s->vex_v], s->T0); - tcg_gen_mov_i64(cpu_regs[reg], s->T1); - break; -#endif - } - break; - - case 0x3f5: /* pdep Gy, By, Ey */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - /* Note that by zero-extending the source operand, we - automatically handle zero-extending the result. */ - if (ot =3D=3D MO_64) { - tcg_gen_mov_tl(s->T1, cpu_regs[s->vex_v]); - } else { - tcg_gen_ext32u_tl(s->T1, cpu_regs[s->vex_v]); - } - gen_helper_pdep(cpu_regs[reg], s->T1, s->T0); - break; - - case 0x2f5: /* pext Gy, By, Ey */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - /* Note that by zero-extending the source operand, we - automatically handle zero-extending the result. */ - if (ot =3D=3D MO_64) { - tcg_gen_mov_tl(s->T1, cpu_regs[s->vex_v]); - } else { - tcg_gen_ext32u_tl(s->T1, cpu_regs[s->vex_v]); - } - gen_helper_pext(cpu_regs[reg], s->T1, s->T0); - break; - case 0x1f6: /* adcx Gy, Ey */ case 0x2f6: /* adox Gy, Ey */ CHECK_NO_VEX(s); @@ -4434,73 +4289,6 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) } break; =20 - case 0x1f7: /* shlx Gy, Ey, By */ - case 0x2f7: /* sarx Gy, Ey, By */ - case 0x3f7: /* shrx Gy, Ey, By */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - if (ot =3D=3D MO_64) { - tcg_gen_andi_tl(s->T1, cpu_regs[s->vex_v], 63); - } else { - tcg_gen_andi_tl(s->T1, cpu_regs[s->vex_v], 31); - } - if (b =3D=3D 0x1f7) { - tcg_gen_shl_tl(s->T0, s->T0, s->T1); - } else if (b =3D=3D 0x2f7) { - if (ot !=3D MO_64) { - tcg_gen_ext32s_tl(s->T0, s->T0); - } - tcg_gen_sar_tl(s->T0, s->T0, s->T1); - } else { - if (ot !=3D MO_64) { - tcg_gen_ext32u_tl(s->T0, s->T0); - } - tcg_gen_shr_tl(s->T0, s->T0, s->T1); - } - gen_op_mov_reg_v(s, ot, reg, s->T0); - break; - - case 0x0f3: - case 0x1f3: - case 0x2f3: - case 0x3f3: /* Group 17 */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - - tcg_gen_mov_tl(cpu_cc_src, s->T0); - switch (reg & 7) { - case 1: /* blsr By,Ey */ - tcg_gen_subi_tl(s->T1, s->T0, 1); - tcg_gen_and_tl(s->T0, s->T0, s->T1); - break; - case 2: /* blsmsk By,Ey */ - tcg_gen_subi_tl(s->T1, s->T0, 1); - tcg_gen_xor_tl(s->T0, s->T0, s->T1); - break; - case 3: /* blsi By, Ey */ - tcg_gen_neg_tl(s->T1, s->T0); - tcg_gen_and_tl(s->T0, s->T0, s->T1); - break; - default: - goto unknown_op; - } - tcg_gen_mov_tl(cpu_cc_dst, s->T0); - gen_op_mov_reg_v(s, ot, s->vex_v, s->T0); - set_cc_op(s, CC_OP_BMILGB + ot); - break; - - default: - goto unknown_op; } break; =20 @@ -4716,37 +4504,6 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) } break; =20 - case 0x33a: - /* Various integer extensions at 0f 3a f[0-f]. */ - b =3D modrm | (b1 << 8); - modrm =3D x86_ldub_code(env, s); - reg =3D ((modrm >> 3) & 7) | REX_R(s); - - switch (b) { - case 0x3f0: /* rorx Gy,Ey, Ib */ - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) - || !(s->prefix & PREFIX_VEX) - || s->vex_l !=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - b =3D x86_ldub_code(env, s); - if (ot =3D=3D MO_64) { - tcg_gen_rotri_tl(s->T0, s->T0, b & 63); - } else { - tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); - tcg_gen_rotri_i32(s->tmp2_i32, s->tmp2_i32, b & 31); - tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); - } - gen_op_mov_reg_v(s, ot, reg, s->T0); - break; - - default: - goto unknown_op; - } - break; - default: unknown_op: gen_unknown_opcode(env, s); @@ -4992,59 +4749,17 @@ static bool disas_insn(DisasContext *s, CPUState *c= pu) #endif case 0xc5: /* 2-byte VEX */ case 0xc4: /* 3-byte VEX */ - use_new =3D false; - /* VEX prefixes cannot be used except in 32-bit mode. - Otherwise the instruction is LES or LDS. */ if (CODE32(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); + int vex2 =3D x86_ldub_code(env, s); + s->pc--; /* rewind the advance_pc() x86_ldub_code() did */ =20 if (!CODE64(s) && (vex2 & 0xc0) !=3D 0xc0) { /* 4.1.4.6: In 32-bit mode, bits [7:6] must be 11b, otherwise the instruction is LES or LDS. */ - s->pc--; /* rewind the advance_pc() x86_ldub_code() did */ break; } - - /* 4.1.1-4.1.3: No preceding lock, 66, f2, f3, or rex prefixes= . */ - if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ - | PREFIX_LOCK | PREFIX_DATA | PREFIX_REX)) { - goto illegal_op; - } -#ifdef TARGET_X86_64 - s->rex_r =3D (~vex2 >> 4) & 8; -#endif - if (b =3D=3D 0xc5) { - /* 2-byte VEX prefix: RVVVVlpp, implied 0f leading opcode = byte */ - vex3 =3D vex2; - b =3D x86_ldub_code(env, s) | 0x100; - } else { - /* 3-byte VEX prefix: RXBmmmmm wVVVVlpp */ - vex3 =3D x86_ldub_code(env, s); -#ifdef TARGET_X86_64 - s->rex_x =3D (~vex2 >> 3) & 8; - s->rex_b =3D (~vex2 >> 2) & 8; -#endif - s->vex_w =3D (vex3 >> 7) & 1; - switch (vex2 & 0x1f) { - case 0x01: /* Implied 0f leading opcode bytes. */ - b =3D x86_ldub_code(env, s) | 0x100; - break; - case 0x02: /* Implied 0f 38 leading opcode bytes. */ - b =3D 0x138; - break; - case 0x03: /* Implied 0f 3a leading opcode bytes. */ - b =3D 0x13a; - break; - default: /* Reserved for future use. */ - goto unknown_op; - } - } - s->vex_v =3D (~vex3 >> 3) & 0xf; - s->vex_l =3D (vex3 >> 2) & 1; - prefixes |=3D pp_prefix[vex3 & 3] | PREFIX_VEX; + disas_insn_new(s, cpu, b); + return s->pc; } break; } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102218; cv=none; d=zohomail.com; s=zohoarc; b=IuS3hJ3wo809dKFBPIMAEMu3qkCq/NLch+QDlKhJcxRHwsbmPJh3FKjpNM2x2Hp/5N/crZ3BdipQpn6cC5B7J4cuiEw2l8oHgBEiEcbD69Jgozu0lSgijWJGdxtgzLJr15XPWcUPxXzVGPn2jKIrWpzYCjs01ZMyYR1VegeSu/s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102218; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=uc7wD+lI3WJ/B3hYnqHB7VyRq1+TbEhatASAzR8zQNI=; b=Mq/bouz3G4rE908fhnmD3I82pTdoyctGF2yJhiKLZ8Yb4mXoTpIo/16D6FySX6jvwKQ4Hbh55Vu3pbg6n2E3L3PFFer0W4UoQsROoj6onWXpbZtrn7IhB8vKRCCmBxfxhqEaWbvzLtYxXXINroj/kkmcxqrD8G0qqEifz86uSGQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102218770868.9647377258914; Tue, 18 Oct 2022 07:10:18 -0700 (PDT) Received: from localhost ([::1]:47484 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknIN-0004ur-Kc for importer@patchew.org; Tue, 18 Oct 2022 10:10:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46220) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RQ-3e for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:40657) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhl-0005Fh-KK for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:34 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-582-PytP3j7DOLqpTT5A-qtUjw-1; Tue, 18 Oct 2022 09:32:23 -0400 Received: by mail-ed1-f71.google.com with SMTP id h13-20020a056402280d00b0045cb282161cso11714779ede.8 for ; Tue, 18 Oct 2022 06:32:23 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id c21-20020aa7df15000000b0045c76120e61sm8889615edy.54.2022.10.18.06.32.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099944; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uc7wD+lI3WJ/B3hYnqHB7VyRq1+TbEhatASAzR8zQNI=; b=beWAmG+6cbNcJ5aP6LL/ZQJIJmcLHaX2/6Rssp2sVYaxf4lPHE9FqBBkS0vzx5JPyb7vfK wJWuoRnN11g17+MrUGU+ymY63PD8l/9n0nHc+/1P8oV9ApfHx1yyxzujOrZyHsTVggZKNb S4YZib9kO0YWK6k/DCrivDCwrCun/Z4= X-MC-Unique: PytP3j7DOLqpTT5A-qtUjw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uc7wD+lI3WJ/B3hYnqHB7VyRq1+TbEhatASAzR8zQNI=; b=AjUiKoFrUwyINWevklT7TnYEQi3fDhLTgV7ivlTSTcQCQVn1ZultJJWBqDDZz8lmgt 2bw0kEc6c9cAL207kHlOJJtfzw+AFLc/UqBqJlVtPwRC1vVXrngh9yywxpvZnli2+KKy kKJqcqUq/GJu742/sXEYf8KgqAI7z3KsBPmXuNqOsAE15GoC541xcQ/SMg/sZnPkudhX DFrs6QghbyLB6j/2cx+/FAimzDiA8bw9O2sXGSHgQVkVKRTsjSTSbdr8vthKj8Rlk532 sw1JQLnRI4ttCTaqjZ5VkMyLuDVuFEaIvHoGifKFwvMiyfe/FXKNFkV+6RfZSTi/q/15 F5Cg== X-Gm-Message-State: ACrzQf2oBtt9PWx7F0uITRfdrSk/+pb799V4cEp+lB2qSztUayy2TJH/ THShMhl1YT3irvHXt0O+vlZezrSBR7DFtnSI3XVZJTyzXMyVJYV3gBX29K8O1ykqrutyewpJLdB IrguwOBqJFpwiQc1uMrWJodW3pmPFhgBc6ibd+Awxzbjidu8myr2OKCkxn/ImmH4BMYU= X-Received: by 2002:a17:907:1dde:b0:78d:9725:cc69 with SMTP id og30-20020a1709071dde00b0078d9725cc69mr2491426ejc.305.1666099941602; Tue, 18 Oct 2022 06:32:21 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5iDDgzeuXx4AFj5Pf6UrDmI6wafzCrUASx7D35C45sRcS2AYx/AjsR1eRFUih30t2Rj0FFMg== X-Received: by 2002:a17:907:1dde:b0:78d:9725:cc69 with SMTP id og30-20020a1709071dde00b0078d9725cc69mr2491403ejc.305.1666099941277; Tue, 18 Oct 2022 06:32:21 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Paul Brook , Richard Henderson Subject: [PULL 29/53] target/i386: Prepare ops_sse_header.h for 256 bit AVX Date: Tue, 18 Oct 2022 15:30:18 +0200 Message-Id: <20221018133042.856368-30-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102219169100001 Content-Type: text/plain; charset="utf-8" From: Paul Brook Adjust all #ifdefs to match the ones in ops_sse.h. Signed-off-by: Paul Brook Message-Id: <20220424220204.2493824-23-paul@nowt.org> Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse_header.h | 114 +++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 39 deletions(-) diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 400b24c091..9d9a115df4 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -43,7 +43,7 @@ DEF_HELPER_3(glue(pslld, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(psrlq, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(psllq, SUFFIX), void, env, Reg, Reg) =20 -#if SHIFT =3D=3D 1 +#if SHIFT >=3D 1 DEF_HELPER_3(glue(psrldq, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pslldq, SUFFIX), void, env, Reg, Reg) #endif @@ -101,7 +101,7 @@ SSE_HELPER_L(pcmpeql, FCMPEQ) =20 SSE_HELPER_W(pmullw, FMULLW) #if SHIFT =3D=3D 0 -SSE_HELPER_W(pmulhrw, FMULHRW) +DEF_HELPER_3(glue(pmulhrw, SUFFIX), void, env, Reg, Reg) #endif SSE_HELPER_W(pmulhuw, FMULHUW) SSE_HELPER_W(pmulhw, FMULHW) @@ -113,7 +113,9 @@ DEF_HELPER_3(glue(pmuludq, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmaddwd, SUFFIX), void, env, Reg, Reg) =20 DEF_HELPER_3(glue(psadbw, SUFFIX), void, env, Reg, Reg) +#if SHIFT < 2 DEF_HELPER_4(glue(maskmov, SUFFIX), void, env, Reg, Reg, tl) +#endif DEF_HELPER_2(glue(movl_mm_T0, SUFFIX), void, Reg, i32) #ifdef TARGET_X86_64 DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64) @@ -122,38 +124,63 @@ DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64) #if SHIFT =3D=3D 0 DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int) #else -DEF_HELPER_3(glue(shufps, SUFFIX), void, Reg, Reg, int) -DEF_HELPER_3(glue(shufpd, SUFFIX), void, Reg, Reg, int) DEF_HELPER_3(glue(pshufd, SUFFIX), void, Reg, Reg, int) DEF_HELPER_3(glue(pshuflw, SUFFIX), void, Reg, Reg, int) DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) #endif =20 -#if SHIFT =3D=3D 1 +#if SHIFT >=3D 1 /* FPU ops */ /* XXX: not accurate */ =20 -#define SSE_HELPER_S(name, F) \ - DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ - DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ - DEF_HELPER_3(glue(name ## pd, SUFFIX), void, env, Reg, Reg) \ +#define SSE_HELPER_P4(name) \ + DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ + DEF_HELPER_3(glue(name ## pd, SUFFIX), void, env, Reg, Reg) + +#define SSE_HELPER_P3(name, ...) \ + DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ + DEF_HELPER_3(glue(name ## pd, SUFFIX), void, env, Reg, Reg) + +#if SHIFT =3D=3D 1 +#define SSE_HELPER_S4(name) \ + SSE_HELPER_P4(name) \ + DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ DEF_HELPER_3(name ## sd, void, env, Reg, Reg) +#define SSE_HELPER_S3(name) \ + SSE_HELPER_P3(name) \ + DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## sd, void, env, Reg, Reg) +#else +#define SSE_HELPER_S4(name, ...) SSE_HELPER_P4(name) +#define SSE_HELPER_S3(name, ...) SSE_HELPER_P3(name) +#endif =20 -SSE_HELPER_S(add, FPU_ADD) -SSE_HELPER_S(sub, FPU_SUB) -SSE_HELPER_S(mul, FPU_MUL) -SSE_HELPER_S(div, FPU_DIV) -SSE_HELPER_S(min, FPU_MIN) -SSE_HELPER_S(max, FPU_MAX) -SSE_HELPER_S(sqrt, FPU_SQRT) +DEF_HELPER_3(glue(shufps, SUFFIX), void, Reg, Reg, int) +DEF_HELPER_3(glue(shufpd, SUFFIX), void, Reg, Reg, int) =20 +SSE_HELPER_S4(add) +SSE_HELPER_S4(sub) +SSE_HELPER_S4(mul) +SSE_HELPER_S4(div) +SSE_HELPER_S4(min) +SSE_HELPER_S4(max) + +SSE_HELPER_S3(sqrt) =20 DEF_HELPER_3(glue(cvtps2pd, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(cvtpd2ps, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(cvtss2sd, void, env, Reg, Reg) -DEF_HELPER_3(cvtsd2ss, void, env, Reg, Reg) DEF_HELPER_3(glue(cvtdq2ps, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(cvtdq2pd, SUFFIX), void, env, Reg, Reg) + +DEF_HELPER_3(glue(cvtps2dq, SUFFIX), void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(glue(cvtpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) + +DEF_HELPER_3(glue(cvttps2dq, SUFFIX), void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(glue(cvttpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) + +#if SHIFT =3D=3D 1 +DEF_HELPER_3(cvtss2sd, void, env, Reg, Reg) +DEF_HELPER_3(cvtsd2ss, void, env, Reg, Reg) DEF_HELPER_3(cvtpi2ps, void, env, ZMMReg, MMXReg) DEF_HELPER_3(cvtpi2pd, void, env, ZMMReg, MMXReg) DEF_HELPER_3(cvtsi2ss, void, env, ZMMReg, i32) @@ -164,8 +191,6 @@ DEF_HELPER_3(cvtsq2ss, void, env, ZMMReg, i64) DEF_HELPER_3(cvtsq2sd, void, env, ZMMReg, i64) #endif =20 -DEF_HELPER_3(glue(cvtps2dq, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(cvtpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) DEF_HELPER_3(cvtps2pi, void, env, MMXReg, ZMMReg) DEF_HELPER_3(cvtpd2pi, void, env, MMXReg, ZMMReg) DEF_HELPER_2(cvtss2si, s32, env, ZMMReg) @@ -175,8 +200,6 @@ DEF_HELPER_2(cvtss2sq, s64, env, ZMMReg) DEF_HELPER_2(cvtsd2sq, s64, env, ZMMReg) #endif =20 -DEF_HELPER_3(glue(cvttps2dq, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(cvttpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) DEF_HELPER_3(cvttps2pi, void, env, MMXReg, ZMMReg) DEF_HELPER_3(cvttpd2pi, void, env, MMXReg, ZMMReg) DEF_HELPER_2(cvttss2si, s32, env, ZMMReg) @@ -185,27 +208,24 @@ DEF_HELPER_2(cvttsd2si, s32, env, ZMMReg) DEF_HELPER_2(cvttss2sq, s64, env, ZMMReg) DEF_HELPER_2(cvttsd2sq, s64, env, ZMMReg) #endif +#endif =20 DEF_HELPER_3(glue(rsqrtps, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(rsqrtss, void, env, ZMMReg, ZMMReg) DEF_HELPER_3(glue(rcpps, SUFFIX), void, env, ZMMReg, ZMMReg) +#if SHIFT =3D=3D 1 +DEF_HELPER_3(rsqrtss, void, env, ZMMReg, ZMMReg) DEF_HELPER_3(rcpss, void, env, ZMMReg, ZMMReg) DEF_HELPER_3(extrq_r, void, env, ZMMReg, ZMMReg) DEF_HELPER_4(extrq_i, void, env, ZMMReg, int, int) DEF_HELPER_3(insertq_r, void, env, ZMMReg, ZMMReg) DEF_HELPER_5(insertq_i, void, env, ZMMReg, ZMMReg, int, int) -DEF_HELPER_3(glue(haddps, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(haddpd, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(hsubps, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(hsubpd, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(addsubps, SUFFIX), void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(glue(addsubpd, SUFFIX), void, env, ZMMReg, ZMMReg) +#endif =20 -#define SSE_HELPER_CMP(name, F, C) \ - DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ - DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ - DEF_HELPER_3(glue(name ## pd, SUFFIX), void, env, Reg, Reg) \ - DEF_HELPER_3(name ## sd, void, env, Reg, Reg) +SSE_HELPER_P4(hadd) +SSE_HELPER_P4(hsub) +SSE_HELPER_P4(addsub) + +#define SSE_HELPER_CMP(name, F, C) SSE_HELPER_S4(name) =20 SSE_HELPER_CMP(cmpeq, FPU_CMPQ, FPU_EQ) SSE_HELPER_CMP(cmplt, FPU_CMPS, FPU_LT) @@ -216,10 +236,13 @@ SSE_HELPER_CMP(cmpnlt, FPU_CMPS, !FPU_LT) SSE_HELPER_CMP(cmpnle, FPU_CMPS, !FPU_LE) SSE_HELPER_CMP(cmpord, FPU_CMPQ, !FPU_UNORD) =20 +#if SHIFT =3D=3D 1 DEF_HELPER_3(ucomiss, void, env, Reg, Reg) DEF_HELPER_3(comiss, void, env, Reg, Reg) DEF_HELPER_3(ucomisd, void, env, Reg, Reg) DEF_HELPER_3(comisd, void, env, Reg, Reg) +#endif + DEF_HELPER_2(glue(movmskps, SUFFIX), i32, env, Reg) DEF_HELPER_2(glue(movmskpd, SUFFIX), i32, env, Reg) #endif @@ -236,7 +259,7 @@ DEF_HELPER_3(glue(packssdw, SUFFIX), void, env, Reg, Re= g) UNPCK_OP(l, 0) UNPCK_OP(h, 1) =20 -#if SHIFT =3D=3D 1 +#if SHIFT >=3D 1 DEF_HELPER_3(glue(punpcklqdq, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(punpckhqdq, SUFFIX), void, env, Reg, Reg) #endif @@ -283,7 +306,7 @@ DEF_HELPER_3(glue(psignd, SUFFIX), void, env, Reg, Reg) DEF_HELPER_4(glue(palignr, SUFFIX), void, env, Reg, Reg, s32) =20 /* SSE4.1 op helpers */ -#if SHIFT =3D=3D 1 +#if SHIFT >=3D 1 DEF_HELPER_3(glue(pblendvb, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(blendvps, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(blendvpd, SUFFIX), void, env, Reg, Reg) @@ -312,22 +335,30 @@ DEF_HELPER_3(glue(pmaxsd, SUFFIX), void, env, Reg, Re= g) DEF_HELPER_3(glue(pmaxuw, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmaxud, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmulld, SUFFIX), void, env, Reg, Reg) +#if SHIFT =3D=3D 1 DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, Reg) +#endif DEF_HELPER_4(glue(roundps, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(roundpd, SUFFIX), void, env, Reg, Reg, i32) +#if SHIFT =3D=3D 1 DEF_HELPER_4(glue(roundss, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(roundsd, SUFFIX), void, env, Reg, Reg, i32) +#endif DEF_HELPER_4(glue(blendps, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(blendpd, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(pblendw, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(dpps, SUFFIX), void, env, Reg, Reg, i32) +#if SHIFT =3D=3D 1 DEF_HELPER_4(glue(dppd, SUFFIX), void, env, Reg, Reg, i32) +#endif DEF_HELPER_4(glue(mpsadbw, SUFFIX), void, env, Reg, Reg, i32) #endif =20 /* SSE4.2 op helpers */ -#if SHIFT =3D=3D 1 +#if SHIFT >=3D 1 DEF_HELPER_3(glue(pcmpgtq, SUFFIX), void, env, Reg, Reg) +#endif +#if SHIFT =3D=3D 1 DEF_HELPER_4(glue(pcmpestri, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(pcmpestrm, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(pcmpistri, SUFFIX), void, env, Reg, Reg, i32) @@ -336,13 +367,15 @@ DEF_HELPER_3(crc32, tl, i32, tl, i32) #endif =20 /* AES-NI op helpers */ -#if SHIFT =3D=3D 1 +#if SHIFT >=3D 1 DEF_HELPER_3(glue(aesdec, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(aesdeclast, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(aesenc, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(aesenclast, SUFFIX), void, env, Reg, Reg) +#if SHIFT =3D=3D 1 DEF_HELPER_3(glue(aesimc, SUFFIX), void, env, Reg, Reg) DEF_HELPER_4(glue(aeskeygenassist, SUFFIX), void, env, Reg, Reg, i32) +#endif DEF_HELPER_4(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, i32) #endif =20 @@ -354,6 +387,9 @@ DEF_HELPER_4(glue(pclmulqdq, SUFFIX), void, env, Reg, R= eg, i32) #undef SSE_HELPER_W #undef SSE_HELPER_L #undef SSE_HELPER_Q -#undef SSE_HELPER_S +#undef SSE_HELPER_S3 +#undef SSE_HELPER_S4 +#undef SSE_HELPER_P3 +#undef SSE_HELPER_P4 #undef SSE_HELPER_CMP #undef UNPCK_OP --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103371; cv=none; d=zohomail.com; s=zohoarc; b=WxLEhjb9lv7ChpDNQwUCDIEC6bE+sM63WPGB+iJTbyrZNd0ABS48kWReQ1v/IQigvii5592FtdNV5JdFQyIxvGeGeCk3I5Tkaj+S+12oE/k4tVPopnJu3eiFx+MsaALJR7BQVX1RtWzafaKiXhW1znYq8lNcuLG76ciYV00pO/w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103371; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=klhjDvLGTRH3k8ozBzppF7HqGFeYECYkFdY/meLJbXE=; b=CnAuuzsS79Xv5Ti8OBynRHr1moniaRZT6PVuxZosjKzbXqtMlxTl9b9XJ+m9DRdLlzOMpMav3AkcG9U4yGLnTHZ1iNgCAcuKlnxQJY6bJzTEUD5arlc4dCY8g4J0XzkslMrxJZ3izlSJ+zSW/IV5AIIJEfJjAqCYH18JPjlDRBM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103371234977.450774925937; Tue, 18 Oct 2022 07:29:31 -0700 (PDT) Received: from localhost ([::1]:43296 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknax-0005f1-11 for importer@patchew.org; Tue, 18 Oct 2022 10:29:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33110) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiR-0004RS-WF for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:21350) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhr-0005Fx-Ub for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:39 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-97-jR_9hoJGP5SAPI8aE80oVg-1; Tue, 18 Oct 2022 09:32:28 -0400 Received: by mail-ed1-f69.google.com with SMTP id h9-20020a05640250c900b0045cfb639f56so10969068edb.13 for ; Tue, 18 Oct 2022 06:32:28 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id q1-20020a170906360100b00773c60c2129sm7630794ejb.141.2022.10.18.06.32.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099949; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=klhjDvLGTRH3k8ozBzppF7HqGFeYECYkFdY/meLJbXE=; b=AwhzAlj+i/xcjl8p6+1opsG1ye2KaamKWKdlEamBTOFWaDkXd4q5wamuAvNC1G+0BXX5QH uLNFEIsJuTaa3M/5Lfus5mAOyu1M/fnBDxd+tcaua/VVVXwn4NevGESxsFiYQlzcnVl7dD 47/Uvd0pQB2X2E+4iUFfibjGLK0FiIY= X-MC-Unique: jR_9hoJGP5SAPI8aE80oVg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=klhjDvLGTRH3k8ozBzppF7HqGFeYECYkFdY/meLJbXE=; b=jwIZzppjzX/1gkFNn9AkcwELs0YW7Z3F1rwZcYiToyaod8iHNe0jZj3CTAec3Z5a85 YVmNlGjylB3jhhpS2xFpOgsk7xcphcBtRbA2uSWs5oCrsbZuDV3IhrddI+htthN6zYtx RE2ktma2FkT6w+foTu88Y8k7JiFkCLKxiCKJjk3+Pup8R/IeF6z4Y/88u0px3twNhoYX 0KuSGhH+Y073Qt6Srx3TkCLLMJICvI9ib0v3UWBf1r5jqh0TP/l7XbvhwGpziAC+GJyA mcgBSbwe+ax+/6Zz6Ibh2dzAK12vfsf6bCc6mB+pTPNBV2CAoSaFxeG6kNgwoTltX1Vz PncQ== X-Gm-Message-State: ACrzQf2NNoLa8bBkGZaRXcSXiswNr6LRxo02X+3wVefW/XO46rP1CUNt Dq+ZC+7RIFLr0QVphGvKP/3cah+aa3WGyow2D8s65Ne3MCHjK7bkobYmDoWIked+sqPzOb+36SZ mNcJhnh5OX4BTWCEU0j5e9QjohxFDGo6qZMEhGQw6AabP9NfrgY9DcDyFx7zogOCxJJk= X-Received: by 2002:a17:907:6e87:b0:78f:a596:5cf6 with SMTP id sh7-20020a1709076e8700b0078fa5965cf6mr2424551ejc.398.1666099945749; Tue, 18 Oct 2022 06:32:25 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4CA4fosz/9HTXb1fNPOZQ9PaF923Vypedvnonyz6uMscsDsz6IWQnkbCLrg3j2sDTxFPnA+w== X-Received: by 2002:a17:907:6e87:b0:78f:a596:5cf6 with SMTP id sh7-20020a1709076e8700b0078fa5965cf6mr2424476ejc.398.1666099944434; Tue, 18 Oct 2022 06:32:24 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 30/53] target/i386: extend helpers to support VEX.V 3- and 4- operand encodings Date: Tue, 18 Oct 2022 15:30:19 +0200 Message-Id: <20221018133042.856368-31-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103372431100002 Content-Type: text/plain; charset="utf-8" Add to the helpers all the operands that are needed to implement AVX. Extracted from a patch by Paul Brook . Message-Id: <20220424220204.2493824-26-paul@nowt.org> Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 173 +++++++++++++-------------------- target/i386/ops_sse_header.h | 149 ++++++++++++++-------------- target/i386/tcg/translate.c | 181 ++++++++++++++++++++++++----------- 3 files changed, 265 insertions(+), 238 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 7bf8bb967d..5f0ee9db52 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -48,9 +48,8 @@ #define FPSLL(x, c) ((x) << shift) #endif =20 -void glue(helper_psrlw, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psrlw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 15) { for (int i =3D 0; i < 1 << SHIFT; i++) { @@ -64,9 +63,8 @@ void glue(helper_psrlw, SUFFIX)(CPUX86State *env, Reg *d,= Reg *c) } } =20 -void glue(helper_psllw, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psllw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 15) { for (int i =3D 0; i < 1 << SHIFT; i++) { @@ -80,9 +78,8 @@ void glue(helper_psllw, SUFFIX)(CPUX86State *env, Reg *d,= Reg *c) } } =20 -void glue(helper_psraw, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psraw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 15) { shift =3D 15; @@ -94,9 +91,8 @@ void glue(helper_psraw, SUFFIX)(CPUX86State *env, Reg *d,= Reg *c) } } =20 -void glue(helper_psrld, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psrld, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 31) { for (int i =3D 0; i < 1 << SHIFT; i++) { @@ -110,9 +106,8 @@ void glue(helper_psrld, SUFFIX)(CPUX86State *env, Reg *= d, Reg *c) } } =20 -void glue(helper_pslld, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_pslld, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 31) { for (int i =3D 0; i < 1 << SHIFT; i++) { @@ -126,9 +121,8 @@ void glue(helper_pslld, SUFFIX)(CPUX86State *env, Reg *= d, Reg *c) } } =20 -void glue(helper_psrad, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psrad, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 31) { shift =3D 31; @@ -140,9 +134,8 @@ void glue(helper_psrad, SUFFIX)(CPUX86State *env, Reg *= d, Reg *c) } } =20 -void glue(helper_psrlq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psrlq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 63) { for (int i =3D 0; i < 1 << SHIFT; i++) { @@ -156,9 +149,8 @@ void glue(helper_psrlq, SUFFIX)(CPUX86State *env, Reg *= d, Reg *c) } } =20 -void glue(helper_psllq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psllq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift; if (c->Q(0) > 63) { for (int i =3D 0; i < 1 << SHIFT; i++) { @@ -173,9 +165,8 @@ void glue(helper_psllq, SUFFIX)(CPUX86State *env, Reg *= d, Reg *c) } =20 #if SHIFT >=3D 1 -void glue(helper_psrldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_psrldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift, i, j; =20 shift =3D c->L(0); @@ -192,9 +183,8 @@ void glue(helper_psrldq, SUFFIX)(CPUX86State *env, Reg = *d, Reg *c) } } =20 -void glue(helper_pslldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +void glue(helper_pslldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, Reg *c) { - Reg *s =3D d; int shift, i, j; =20 shift =3D c->L(0); @@ -222,9 +212,8 @@ void glue(helper_pslldq, SUFFIX)(CPUX86State *env, Reg = *d, Reg *c) } =20 #define SSE_HELPER_2(name, elem, num, F) \ - void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ int n =3D num; \ for (int i =3D 0; i < n; i++) { \ d->elem(i) =3D F(v->elem(i), s->elem(i)); \ @@ -362,18 +351,24 @@ SSE_HELPER_W(helper_pcmpeqw, FCMPEQ) SSE_HELPER_L(helper_pcmpeql, FCMPEQ) =20 SSE_HELPER_W(helper_pmullw, FMULLW) -#if SHIFT =3D=3D 0 -SSE_HELPER_W(helper_pmulhrw, FMULHRW) -#endif SSE_HELPER_W(helper_pmulhuw, FMULHUW) SSE_HELPER_W(helper_pmulhw, FMULHW) =20 +#if SHIFT =3D=3D 0 +void glue(helper_pmulhrw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) =3D FMULHRW(d->W(0), s->W(0)); + d->W(1) =3D FMULHRW(d->W(1), s->W(1)); + d->W(2) =3D FMULHRW(d->W(2), s->W(2)); + d->W(3) =3D FMULHRW(d->W(3), s->W(3)); +} +#endif + SSE_HELPER_B(helper_pavgb, FAVG) SSE_HELPER_W(helper_pavgw, FAVG) =20 -void glue(helper_pmuludq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pmuludq, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { - Reg *v =3D d; int i; =20 for (i =3D 0; i < (1 << SHIFT); i++) { @@ -381,9 +376,8 @@ void glue(helper_pmuludq, SUFFIX)(CPUX86State *env, Reg= *d, Reg *s) } } =20 -void glue(helper_pmaddwd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pmaddwd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { - Reg *v =3D d; int i; =20 for (i =3D 0; i < (2 << SHIFT); i++) { @@ -402,10 +396,8 @@ static inline int abs1(int a) } } #endif - -void glue(helper_psadbw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_psadbw, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { - Reg *v =3D d; int i; =20 for (i =3D 0; i < (1 << SHIFT); i++) { @@ -478,9 +470,8 @@ void glue(helper_pshufw, SUFFIX)(Reg *d, Reg *s, int or= der) SHUFFLE4(W, s, s, 0); } #else -void glue(helper_shufps, SUFFIX)(Reg *d, Reg *s, int order) +void glue(helper_shufps, SUFFIX)(Reg *d, Reg *v, Reg *s, int order) { - Reg *v =3D d; uint32_t r0, r1, r2, r3; int i; =20 @@ -489,9 +480,8 @@ void glue(helper_shufps, SUFFIX)(Reg *d, Reg *s, int or= der) } } =20 -void glue(helper_shufpd, SUFFIX)(Reg *d, Reg *s, int order) +void glue(helper_shufpd, SUFFIX)(Reg *d, Reg *v, Reg *s, int order) { - Reg *v =3D d; uint64_t r0, r1; int i; =20 @@ -543,9 +533,8 @@ void glue(helper_pshufhw, SUFFIX)(Reg *d, Reg *s, int o= rder) =20 #define SSE_HELPER_P(name, F) \ void glue(helper_ ## name ## ps, SUFFIX)(CPUX86State *env, \ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ int i; \ for (i =3D 0; i < 2 << SHIFT; i++) { \ d->ZMM_S(i) =3D F(32, v->ZMM_S(i), s->ZMM_S(i)); \ @@ -553,9 +542,8 @@ void glue(helper_pshufhw, SUFFIX)(Reg *d, Reg *s, int o= rder) } \ \ void glue(helper_ ## name ## pd, SUFFIX)(CPUX86State *env, \ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ int i; \ for (i =3D 0; i < 1 << SHIFT; i++) { \ d->ZMM_D(i) =3D F(64, v->ZMM_D(i), s->ZMM_D(i)); \ @@ -567,15 +555,13 @@ void glue(helper_pshufhw, SUFFIX)(Reg *d, Reg *s, int= order) #define SSE_HELPER_S(name, F) \ SSE_HELPER_P(name, F) \ \ - void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *s)\ + void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *v, Reg *s)\ { \ - Reg *v =3D d; \ d->ZMM_S(0) =3D F(32, v->ZMM_S(0), s->ZMM_S(0)); \ } \ \ - void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *s)\ + void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *v, Reg *s)\ { \ - Reg *v =3D d; \ d->ZMM_D(0) =3D F(64, v->ZMM_D(0), s->ZMM_D(0)); \ } =20 @@ -958,9 +944,8 @@ void helper_insertq_i(CPUX86State *env, ZMMReg *d, ZMMR= eg *s, int index, int len #endif =20 #define SSE_HELPER_HPS(name, F) \ -void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ +void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) \ { \ - Reg *v =3D d; \ float32 r[2 << SHIFT]; \ int i, j, k; \ for (k =3D 0; k < 2 << SHIFT; k +=3D LANE_WIDTH / 4) { \ @@ -980,9 +965,8 @@ SSE_HELPER_HPS(haddps, float32_add) SSE_HELPER_HPS(hsubps, float32_sub) =20 #define SSE_HELPER_HPD(name, F) \ -void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ +void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) \ { \ - Reg *v =3D d; \ float64 r[1 << SHIFT]; \ int i, j, k; \ for (k =3D 0; k < 1 << SHIFT; k +=3D LANE_WIDTH / 8) { \ @@ -1001,9 +985,8 @@ void glue(helper_ ## name, SUFFIX)(CPUX86State *env, R= eg *d, Reg *s) \ SSE_HELPER_HPD(haddpd, float64_add) SSE_HELPER_HPD(hsubpd, float64_sub) =20 -void glue(helper_addsubps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_addsubps, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) { - Reg *v =3D d; int i; for (i =3D 0; i < 2 << SHIFT; i +=3D 2) { d->ZMM_S(i) =3D float32_sub(v->ZMM_S(i), s->ZMM_S(i), &env->sse_st= atus); @@ -1011,9 +994,8 @@ void glue(helper_addsubps, SUFFIX)(CPUX86State *env, R= eg *d, Reg *s) } } =20 -void glue(helper_addsubpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_addsubpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) { - Reg *v =3D d; int i; for (i =3D 0; i < 1 << SHIFT; i +=3D 2) { d->ZMM_D(i) =3D float64_sub(v->ZMM_D(i), s->ZMM_D(i), &env->sse_st= atus); @@ -1023,9 +1005,8 @@ void glue(helper_addsubpd, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) =20 #define SSE_HELPER_CMP_P(name, F, C) \ void glue(helper_ ## name ## ps, SUFFIX)(CPUX86State *env, \ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ int i; \ for (i =3D 0; i < 2 << SHIFT; i++) { \ d->ZMM_L(i) =3D C(F(32, v->ZMM_S(i), s->ZMM_S(i))) ? -1 : 0; \ @@ -1033,9 +1014,8 @@ void glue(helper_addsubpd, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) } \ \ void glue(helper_ ## name ## pd, SUFFIX)(CPUX86State *env, \ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ int i; \ for (i =3D 0; i < 1 << SHIFT; i++) { \ d->ZMM_Q(i) =3D C(F(64, v->ZMM_D(i), s->ZMM_D(i))) ? -1 : 0; \ @@ -1045,15 +1025,13 @@ void glue(helper_addsubpd, SUFFIX)(CPUX86State *env= , Reg *d, Reg *s) #if SHIFT =3D=3D 1 #define SSE_HELPER_CMP(name, F, C) = \ SSE_HELPER_CMP_P(name, F, C) = \ - void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *s) \ + void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *v, Reg *s) = \ { = \ - Reg *v =3D d; = \ d->ZMM_L(0) =3D C(F(32, v->ZMM_S(0), s->ZMM_S(0))) ? -1 : 0; = \ } = \ = \ - void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *s) \ + void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *v, Reg *s) = \ { = \ - Reg *v =3D d; = \ d->ZMM_Q(0) =3D C(F(64, v->ZMM_D(0), s->ZMM_D(0))) ? -1 : 0; = \ } =20 @@ -1179,9 +1157,8 @@ uint32_t glue(helper_pmovmskb, SUFFIX)(CPUX86State *e= nv, Reg *s) =20 #define PACK_HELPER_B(name, F) \ void glue(helper_pack ## name, SUFFIX)(CPUX86State *env, \ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ uint8_t r[PACK_WIDTH * 2]; \ int j, k; \ for (j =3D 0; j < 4 << SHIFT; j +=3D PACK_WIDTH) { \ @@ -1200,9 +1177,8 @@ void glue(helper_pack ## name, SUFFIX)(CPUX86State *e= nv, \ PACK_HELPER_B(sswb, satsb) PACK_HELPER_B(uswb, satub) =20 -void glue(helper_packssdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_packssdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) { - Reg *v =3D d; uint16_t r[PACK_WIDTH]; int j, k; =20 @@ -1222,9 +1198,8 @@ void glue(helper_packssdw, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) #define UNPCK_OP(base_name, base) \ \ void glue(helper_punpck ## base_name ## bw, SUFFIX)(CPUX86State *env,\ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ uint8_t r[PACK_WIDTH * 2]; \ int j, i; \ \ @@ -1241,9 +1216,8 @@ void glue(helper_packssdw, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) } \ \ void glue(helper_punpck ## base_name ## wd, SUFFIX)(CPUX86State *env,\ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ uint16_t r[PACK_WIDTH]; \ int j, i; \ \ @@ -1260,9 +1234,8 @@ void glue(helper_packssdw, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) } \ \ void glue(helper_punpck ## base_name ## dq, SUFFIX)(CPUX86State *env,\ - Reg *d, Reg *s) \ + Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ uint32_t r[PACK_WIDTH / 2]; \ int j, i; \ \ @@ -1280,9 +1253,8 @@ void glue(helper_packssdw, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) \ XMM_ONLY( \ void glue(helper_punpck ## base_name ## qdq, SUFFIX)( \ - CPUX86State *env, Reg *d, Reg *s) \ + CPUX86State *env, Reg *d, Reg *v, Reg *s) \ { \ - Reg *v =3D d; \ uint64_t r[2]; \ int i; \ \ @@ -1453,9 +1425,8 @@ void helper_pswapd(CPUX86State *env, MMXReg *d, MMXRe= g *s) #endif =20 /* SSSE3 op helpers */ -void glue(helper_pshufb, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pshufb, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { - Reg *v =3D d; int i; #if SHIFT =3D=3D 0 uint8_t r[8]; @@ -1480,9 +1451,8 @@ void glue(helper_pshufb, SUFFIX)(CPUX86State *env, Re= g *d, Reg *s) } =20 #define SSE_HELPER_HW(name, F) \ -void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ +void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) \ { \ - Reg *v =3D d; \ uint16_t r[4 << SHIFT]; \ int i, j, k; \ for (k =3D 0; k < 4 << SHIFT; k +=3D LANE_WIDTH / 2) { \ @@ -1499,9 +1469,8 @@ void glue(helper_ ## name, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) \ } =20 #define SSE_HELPER_HL(name, F) \ -void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ +void glue(helper_ ## name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) \ { \ - Reg *v =3D d; \ uint32_t r[2 << SHIFT]; \ int i, j, k; \ for (k =3D 0; k < 2 << SHIFT; k +=3D LANE_WIDTH / 4) { \ @@ -1527,9 +1496,8 @@ SSE_HELPER_HL(phsubd, FSUB) #undef SSE_HELPER_HW #undef SSE_HELPER_HL =20 -void glue(helper_pmaddubsw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pmaddubsw, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg = *s) { - Reg *v =3D d; int i; for (i =3D 0; i < 4 << SHIFT; i++) { d->W(i) =3D satsw((int8_t)s->B(i * 2) * (uint8_t)v->B(i * 2) + @@ -1554,10 +1522,9 @@ SSE_HELPER_B(helper_psignb, FSIGNB) SSE_HELPER_W(helper_psignw, FSIGNW) SSE_HELPER_L(helper_psignd, FSIGNL) =20 -void glue(helper_palignr, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, +void glue(helper_palignr, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, int32_t shift) { - Reg *v =3D d; int i; =20 /* XXX could be checked during translation */ @@ -1594,10 +1561,9 @@ void glue(helper_palignr, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s, #if SHIFT >=3D 1 =20 #define SSE_HELPER_V(name, elem, num, F) \ - void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, \ + Reg *m) \ { \ - Reg *v =3D d; \ - Reg *m =3D &env->xmm_regs[0]; \ int i; \ for (i =3D 0; i < num; i++) { \ d->elem(i) =3D F(v->elem(i), s->elem(i), m->elem(i)); \ @@ -1605,10 +1571,9 @@ void glue(helper_palignr, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s, } =20 #define SSE_HELPER_I(name, elem, num, F) \ - void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, \ uint32_t imm) \ { \ - Reg *v =3D d; \ int i; \ for (i =3D 0; i < num; i++) { \ int j =3D i & 7; \ @@ -1660,9 +1625,8 @@ SSE_HELPER_F(helper_pmovzxwq, Q, 1 << SHIFT, s->W) SSE_HELPER_F(helper_pmovzxdq, Q, 1 << SHIFT, s->L) #endif =20 -void glue(helper_pmuldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pmuldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { - Reg *v =3D d; int i; =20 for (i =3D 0; i < 1 << SHIFT; i++) { @@ -1673,9 +1637,8 @@ void glue(helper_pmuldq, SUFFIX)(CPUX86State *env, Re= g *d, Reg *s) #define FCMPEQQ(d, s) (d =3D=3D s ? -1 : 0) SSE_HELPER_Q(helper_pcmpeqq, FCMPEQQ) =20 -void glue(helper_packusdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_packusdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) { - Reg *v =3D d; uint16_t r[8]; int i, j, k; =20 @@ -1893,10 +1856,9 @@ SSE_HELPER_I(helper_blendps, L, 2 << SHIFT, FBLENDP) SSE_HELPER_I(helper_blendpd, Q, 1 << SHIFT, FBLENDP) SSE_HELPER_I(helper_pblendw, W, 4 << SHIFT, FBLENDP) =20 -void glue(helper_dpps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, +void glue(helper_dpps, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, uint32_t mask) { - Reg *v =3D d; float32 prod1, prod2, temp2, temp3, temp4; int i; =20 @@ -1939,9 +1901,8 @@ void glue(helper_dpps, SUFFIX)(CPUX86State *env, Reg = *d, Reg *s, #if SHIFT =3D=3D 1 /* Oddly, there is no ymm version of dppd */ void glue(helper_dppd, SUFFIX)(CPUX86State *env, - Reg *d, Reg *s, uint32_t mask) + Reg *d, Reg *v, Reg *s, uint32_t mask) { - Reg *v =3D d; float64 prod1, prod2, temp2; =20 if (mask & (1 << 4)) { @@ -1960,10 +1921,9 @@ void glue(helper_dppd, SUFFIX)(CPUX86State *env, } #endif =20 -void glue(helper_mpsadbw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, +void glue(helper_mpsadbw, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, uint32_t offset) { - Reg *v =3D d; int i, j; uint16_t r[8]; =20 @@ -2236,10 +2196,9 @@ static void clmulq(uint64_t *dest_l, uint64_t *dest_= h, } #endif =20 -void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, +void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg = *s, uint32_t ctrl) { - Reg *v =3D d; uint64_t a, b; int i; =20 @@ -2250,10 +2209,10 @@ void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *en= v, Reg *d, Reg *s, } } =20 -void glue(helper_aesdec, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_aesdec, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { int i; - Reg st =3D *d; + Reg st =3D *v; Reg rk =3D *s; =20 for (i =3D 0 ; i < 2 << SHIFT ; i++) { @@ -2265,10 +2224,10 @@ void glue(helper_aesdec, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) } } =20 -void glue(helper_aesdeclast, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_aesdeclast, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg= *s) { int i; - Reg st =3D *d; + Reg st =3D *v; Reg rk =3D *s; =20 for (i =3D 0; i < 8 << SHIFT; i++) { @@ -2276,10 +2235,10 @@ void glue(helper_aesdeclast, SUFFIX)(CPUX86State *e= nv, Reg *d, Reg *s) } } =20 -void glue(helper_aesenc, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_aesenc, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) { int i; - Reg st =3D *d; + Reg st =3D *v; Reg rk =3D *s; =20 for (i =3D 0 ; i < 2 << SHIFT ; i++) { @@ -2291,10 +2250,10 @@ void glue(helper_aesenc, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) } } =20 -void glue(helper_aesenclast, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_aesenclast, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg= *s) { int i; - Reg st =3D *d; + Reg st =3D *v; Reg rk =3D *s; =20 for (i =3D 0; i < 8 << SHIFT; i++) { diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 9d9a115df4..b60fe2f0d4 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -34,31 +34,31 @@ #define dh_typecode_ZMMReg dh_typecode_ptr #define dh_typecode_MMXReg dh_typecode_ptr =20 -DEF_HELPER_3(glue(psrlw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psraw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psllw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psrld, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psrad, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pslld, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psrlq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psllq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(psrlw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psraw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psllw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psrld, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psrad, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pslld, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psrlq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psllq, SUFFIX), void, env, Reg, Reg, Reg) =20 #if SHIFT >=3D 1 -DEF_HELPER_3(glue(psrldq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pslldq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(psrldq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pslldq, SUFFIX), void, env, Reg, Reg, Reg) #endif =20 #define SSE_HELPER_B(name, F)\ - DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) =20 #define SSE_HELPER_W(name, F)\ - DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) =20 #define SSE_HELPER_L(name, F)\ - DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) =20 #define SSE_HELPER_Q(name, F)\ - DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) =20 SSE_HELPER_B(paddb, FADD) SSE_HELPER_W(paddw, FADD) @@ -109,10 +109,10 @@ SSE_HELPER_W(pmulhw, FMULHW) SSE_HELPER_B(pavgb, FAVG) SSE_HELPER_W(pavgw, FAVG) =20 -DEF_HELPER_3(glue(pmuludq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmaddwd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(pmuludq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmaddwd, SUFFIX), void, env, Reg, Reg, Reg) =20 -DEF_HELPER_3(glue(psadbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(psadbw, SUFFIX), void, env, Reg, Reg, Reg) #if SHIFT < 2 DEF_HELPER_4(glue(maskmov, SUFFIX), void, env, Reg, Reg, tl) #endif @@ -134,8 +134,8 @@ DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) /* XXX: not accurate */ =20 #define SSE_HELPER_P4(name) \ - DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ - DEF_HELPER_3(glue(name ## pd, SUFFIX), void, env, Reg, Reg) + DEF_HELPER_4(glue(name ## ps, SUFFIX), void, env, Reg, Reg, Reg) \ + DEF_HELPER_4(glue(name ## pd, SUFFIX), void, env, Reg, Reg, Reg) =20 #define SSE_HELPER_P3(name, ...) \ DEF_HELPER_3(glue(name ## ps, SUFFIX), void, env, Reg, Reg) \ @@ -144,8 +144,8 @@ DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) #if SHIFT =3D=3D 1 #define SSE_HELPER_S4(name) \ SSE_HELPER_P4(name) \ - DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ - DEF_HELPER_3(name ## sd, void, env, Reg, Reg) + DEF_HELPER_4(name ## ss, void, env, Reg, Reg, Reg) \ + DEF_HELPER_4(name ## sd, void, env, Reg, Reg, Reg) #define SSE_HELPER_S3(name) \ SSE_HELPER_P3(name) \ DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ @@ -155,8 +155,8 @@ DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) #define SSE_HELPER_S3(name, ...) SSE_HELPER_P3(name) #endif =20 -DEF_HELPER_3(glue(shufps, SUFFIX), void, Reg, Reg, int) -DEF_HELPER_3(glue(shufpd, SUFFIX), void, Reg, Reg, int) +DEF_HELPER_4(glue(shufps, SUFFIX), void, Reg, Reg, Reg, int) +DEF_HELPER_4(glue(shufpd, SUFFIX), void, Reg, Reg, Reg, int) =20 SSE_HELPER_S4(add) SSE_HELPER_S4(sub) @@ -212,6 +212,7 @@ DEF_HELPER_2(cvttsd2sq, s64, env, ZMMReg) =20 DEF_HELPER_3(glue(rsqrtps, SUFFIX), void, env, ZMMReg, ZMMReg) DEF_HELPER_3(glue(rcpps, SUFFIX), void, env, ZMMReg, ZMMReg) + #if SHIFT =3D=3D 1 DEF_HELPER_3(rsqrtss, void, env, ZMMReg, ZMMReg) DEF_HELPER_3(rcpss, void, env, ZMMReg, ZMMReg) @@ -248,20 +249,20 @@ DEF_HELPER_2(glue(movmskpd, SUFFIX), i32, env, Reg) #endif =20 DEF_HELPER_2(glue(pmovmskb, SUFFIX), i32, env, Reg) -DEF_HELPER_3(glue(packsswb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(packuswb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(packssdw, SUFFIX), void, env, Reg, Reg) -#define UNPCK_OP(base_name, base) \ - DEF_HELPER_3(glue(punpck ## base_name ## bw, SUFFIX), void, env, Reg, = Reg) \ - DEF_HELPER_3(glue(punpck ## base_name ## wd, SUFFIX), void, env, Reg, = Reg) \ - DEF_HELPER_3(glue(punpck ## base_name ## dq, SUFFIX), void, env, Reg, = Reg) +DEF_HELPER_4(glue(packsswb, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(packuswb, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(packssdw, SUFFIX), void, env, Reg, Reg, Reg) +#define UNPCK_OP(name, base) \ + DEF_HELPER_4(glue(punpck ## name ## bw, SUFFIX), void, env, Reg, Reg, = Reg) \ + DEF_HELPER_4(glue(punpck ## name ## wd, SUFFIX), void, env, Reg, Reg, = Reg) \ + DEF_HELPER_4(glue(punpck ## name ## dq, SUFFIX), void, env, Reg, Reg, = Reg) =20 UNPCK_OP(l, 0) UNPCK_OP(h, 1) =20 #if SHIFT >=3D 1 -DEF_HELPER_3(glue(punpcklqdq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(punpckhqdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(punpcklqdq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(punpckhqdq, SUFFIX), void, env, Reg, Reg, Reg) #endif =20 /* 3DNow! float ops */ @@ -288,28 +289,28 @@ DEF_HELPER_3(pswapd, void, env, MMXReg, MMXReg) #endif =20 /* SSSE3 op helpers */ -DEF_HELPER_3(glue(phaddw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(phaddd, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(phaddsw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(phsubw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(phsubd, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(phsubsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(phaddw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(phaddd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(phaddsw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(phsubw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(phsubd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(phsubsw, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_3(glue(pabsb, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pabsw, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pabsd, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmaddubsw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmulhrsw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pshufb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psignb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psignw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(psignd, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_4(glue(palignr, SUFFIX), void, env, Reg, Reg, s32) +DEF_HELPER_4(glue(pmaddubsw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmulhrsw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pshufb, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psignb, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psignw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(psignd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_5(glue(palignr, SUFFIX), void, env, Reg, Reg, Reg, s32) =20 /* SSE4.1 op helpers */ #if SHIFT >=3D 1 -DEF_HELPER_3(glue(pblendvb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(blendvps, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(blendvpd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_5(glue(pblendvb, SUFFIX), void, env, Reg, Reg, Reg, Reg) +DEF_HELPER_5(glue(blendvps, SUFFIX), void, env, Reg, Reg, Reg, Reg) +DEF_HELPER_5(glue(blendvpd, SUFFIX), void, env, Reg, Reg, Reg, Reg) DEF_HELPER_3(glue(ptest, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovsxbw, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovsxbd, SUFFIX), void, env, Reg, Reg) @@ -323,40 +324,40 @@ DEF_HELPER_3(glue(pmovzxbq, SUFFIX), void, env, Reg, = Reg) DEF_HELPER_3(glue(pmovzxwd, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovzxwq, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovzxdq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmuldq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pcmpeqq, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(packusdw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pminsb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pminsd, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pminuw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pminud, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmaxsb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmaxsd, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmaxuw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmaxud, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pmulld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(pmuldq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pcmpeqq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(packusdw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pminsb, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pminsd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pminuw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pminud, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmaxsb, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmaxsd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmaxuw, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmaxud, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(pmulld, SUFFIX), void, env, Reg, Reg, Reg) #if SHIFT =3D=3D 1 DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, Reg) #endif DEF_HELPER_4(glue(roundps, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(roundpd, SUFFIX), void, env, Reg, Reg, i32) #if SHIFT =3D=3D 1 -DEF_HELPER_4(glue(roundss, SUFFIX), void, env, Reg, Reg, i32) -DEF_HELPER_4(glue(roundsd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(roundss_xmm, void, env, Reg, Reg, i32) +DEF_HELPER_4(roundsd_xmm, void, env, Reg, Reg, i32) #endif -DEF_HELPER_4(glue(blendps, SUFFIX), void, env, Reg, Reg, i32) -DEF_HELPER_4(glue(blendpd, SUFFIX), void, env, Reg, Reg, i32) -DEF_HELPER_4(glue(pblendw, SUFFIX), void, env, Reg, Reg, i32) -DEF_HELPER_4(glue(dpps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_5(glue(blendps, SUFFIX), void, env, Reg, Reg, Reg, i32) +DEF_HELPER_5(glue(blendpd, SUFFIX), void, env, Reg, Reg, Reg, i32) +DEF_HELPER_5(glue(pblendw, SUFFIX), void, env, Reg, Reg, Reg, i32) +DEF_HELPER_5(glue(dpps, SUFFIX), void, env, Reg, Reg, Reg, i32) #if SHIFT =3D=3D 1 -DEF_HELPER_4(glue(dppd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_5(glue(dppd, SUFFIX), void, env, Reg, Reg, Reg, i32) #endif -DEF_HELPER_4(glue(mpsadbw, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_5(glue(mpsadbw, SUFFIX), void, env, Reg, Reg, Reg, i32) #endif =20 /* SSE4.2 op helpers */ #if SHIFT >=3D 1 -DEF_HELPER_3(glue(pcmpgtq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(pcmpgtq, SUFFIX), void, env, Reg, Reg, Reg) #endif #if SHIFT =3D=3D 1 DEF_HELPER_4(glue(pcmpestri, SUFFIX), void, env, Reg, Reg, i32) @@ -368,15 +369,15 @@ DEF_HELPER_3(crc32, tl, i32, tl, i32) =20 /* AES-NI op helpers */ #if SHIFT >=3D 1 -DEF_HELPER_3(glue(aesdec, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(aesdeclast, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(aesenc, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(aesenclast, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(aesdec, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(aesdeclast, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(aesenc, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(aesenclast, SUFFIX), void, env, Reg, Reg, Reg) #if SHIFT =3D=3D 1 DEF_HELPER_3(glue(aesimc, SUFFIX), void, env, Reg, Reg) DEF_HELPER_4(glue(aeskeygenassist, SUFFIX), void, env, Reg, Reg, i32) #endif -DEF_HELPER_4(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_5(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, Reg, i32) #endif =20 #undef SHIFT diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 202dc5145a..8e3066d70a 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -131,6 +131,7 @@ typedef struct DisasContext { TCGv tmp4; TCGv_ptr ptr0; TCGv_ptr ptr1; + TCGv_ptr ptr2; TCGv_i32 tmp2_i32; TCGv_i32 tmp3_i32; TCGv_i64 tmp1_i64; @@ -2970,18 +2971,28 @@ typedef void (*SSEFunc_0_epl)(TCGv_ptr env, TCGv_pt= r reg, TCGv_i64 val); typedef void (*SSEFunc_0_epp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b= ); typedef void (*SSEFunc_0_eppp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, TCGv_ptr reg_c); +typedef void (*SSEFunc_0_epppp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, + TCGv_ptr reg_c, TCGv_ptr reg_d); typedef void (*SSEFunc_0_eppi)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, TCGv_i32 val); +typedef void (*SSEFunc_0_epppi)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, + TCGv_ptr reg_c, TCGv_i32 val); typedef void (*SSEFunc_0_ppi)(TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_i32 val= ); +typedef void (*SSEFunc_0_pppi)(TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_ptr re= g_c, + TCGv_i32 val); typedef void (*SSEFunc_0_eppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, TCGv val); +typedef void (*SSEFunc_0_epppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, + TCGv_ptr reg_c, TCGv val); =20 static bool first =3D true; static unsigned long limit; #include "decode-new.h" #include "emit.c.inc" #include "decode-new.c.inc" =20 +#define SSE_OPF_V0 (1 << 0) /* vex.v must be 1111b (only 2 operands= ) */ #define SSE_OPF_CMP (1 << 1) /* does not write for first operand */ +#define SSE_OPF_BLENDV (1 << 2) /* blendv* instruction */ #define SSE_OPF_SPECIAL (1 << 3) /* magic */ #define SSE_OPF_3DNOW (1 << 4) /* 3DNow! instruction */ #define SSE_OPF_MMX (1 << 5) /* MMX/integer/AVX2 instruction */ @@ -2991,10 +3002,10 @@ static bool first =3D true; static unsigned long li= mit; #define OP(op, flags, a, b, c, d) \ {flags, {{.op =3D a}, {.op =3D b}, {.op =3D c}, {.op =3D d} } } =20 -#define MMX_OP(x) OP(op1, SSE_OPF_MMX, \ +#define MMX_OP(x) OP(op2, SSE_OPF_MMX, \ gen_helper_ ## x ## _mmx, gen_helper_ ## x ## _xmm, NULL, NULL) =20 -#define SSE_FOP(name) OP(op1, SSE_OPF_SCALAR, \ +#define SSE_FOP(name) OP(op2, SSE_OPF_SCALAR, \ gen_helper_##name##ps##_xmm, gen_helper_##name##pd##_xmm, \ gen_helper_##name##ss, gen_helper_##name##sd) #define SSE_OP(sname, dname, op, flags) OP(op, flags, \ @@ -3004,6 +3015,9 @@ typedef union SSEFuncs { SSEFunc_0_epp op1; SSEFunc_0_ppi op1i; SSEFunc_0_eppt op1t; + SSEFunc_0_eppp op2; + SSEFunc_0_pppi op2i; + SSEFunc_0_epppp op3; } SSEFuncs; =20 struct SSEOpHelper_table1 { @@ -3023,8 +3037,8 @@ static const struct SSEOpHelper_table1 sse_op_table1[= 256] =3D { [0x11] =3D SSE_SPECIAL, /* movups, movupd, movss, movsd */ [0x12] =3D SSE_SPECIAL, /* movlps, movlpd, movsldup, movddup */ [0x13] =3D SSE_SPECIAL, /* movlps, movlpd */ - [0x14] =3D SSE_OP(punpckldq, punpcklqdq, op1, 0), /* unpcklps, unpcklp= d */ - [0x15] =3D SSE_OP(punpckhdq, punpckhqdq, op1, 0), /* unpckhps, unpckhp= d */ + [0x14] =3D SSE_OP(punpckldq, punpcklqdq, op2, 0), /* unpcklps, unpcklp= d */ + [0x15] =3D SSE_OP(punpckhdq, punpckhqdq, op2, 0), /* unpckhps, unpckhp= d */ [0x16] =3D SSE_SPECIAL, /* movhps, movhpd, movshdup */ [0x17] =3D SSE_SPECIAL, /* movhps, movhpd */ =20 @@ -3034,28 +3048,28 @@ static const struct SSEOpHelper_table1 sse_op_table= 1[256] =3D { [0x2b] =3D SSE_SPECIAL, /* movntps, movntpd, movntss, movntsd */ [0x2c] =3D SSE_SPECIAL, /* cvttps2pi, cvttpd2pi, cvttsd2si, cvttss2si = */ [0x2d] =3D SSE_SPECIAL, /* cvtps2pi, cvtpd2pi, cvtsd2si, cvtss2si */ - [0x2e] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR, + [0x2e] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_ucomiss, gen_helper_ucomisd, NULL, NULL), - [0x2f] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR, + [0x2f] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_comiss, gen_helper_comisd, NULL, NULL), [0x50] =3D SSE_SPECIAL, /* movmskps, movmskpd */ - [0x51] =3D OP(op1, SSE_OPF_SCALAR, + [0x51] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_sqrtps_xmm, gen_helper_sqrtpd_xmm, gen_helper_sqrtss, gen_helper_sqrtsd), - [0x52] =3D OP(op1, SSE_OPF_SCALAR, + [0x52] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_rsqrtps_xmm, NULL, gen_helper_rsqrtss, NULL), - [0x53] =3D OP(op1, SSE_OPF_SCALAR, + [0x53] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_rcpps_xmm, NULL, gen_helper_rcpss, NULL), - [0x54] =3D SSE_OP(pand, pand, op1, 0), /* andps, andpd */ - [0x55] =3D SSE_OP(pandn, pandn, op1, 0), /* andnps, andnpd */ - [0x56] =3D SSE_OP(por, por, op1, 0), /* orps, orpd */ - [0x57] =3D SSE_OP(pxor, pxor, op1, 0), /* xorps, xorpd */ + [0x54] =3D SSE_OP(pand, pand, op2, 0), /* andps, andpd */ + [0x55] =3D SSE_OP(pandn, pandn, op2, 0), /* andnps, andnpd */ + [0x56] =3D SSE_OP(por, por, op2, 0), /* orps, orpd */ + [0x57] =3D SSE_OP(pxor, pxor, op2, 0), /* xorps, xorpd */ [0x58] =3D SSE_FOP(add), [0x59] =3D SSE_FOP(mul), - [0x5a] =3D OP(op1, SSE_OPF_SCALAR, + [0x5a] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_cvtps2pd_xmm, gen_helper_cvtpd2ps_xmm, gen_helper_cvtss2sd, gen_helper_cvtsd2ss), - [0x5b] =3D OP(op1, 0, + [0x5b] =3D OP(op1, SSE_OPF_V0, gen_helper_cvtdq2ps_xmm, gen_helper_cvtps2dq_xmm, gen_helper_cvttps2dq_xmm, NULL), [0x5c] =3D SSE_FOP(sub), @@ -3064,7 +3078,7 @@ static const struct SSEOpHelper_table1 sse_op_table1[= 256] =3D { [0x5f] =3D SSE_FOP(max), =20 [0xc2] =3D SSE_FOP(cmpeq), /* sse_op_table4 */ - [0xc6] =3D SSE_OP(shufps, shufpd, op1i, SSE_OPF_SHUF), + [0xc6] =3D SSE_OP(shufps, shufpd, op2i, SSE_OPF_SHUF), =20 /* SSSE3, SSE4, MOVBE, CRC32, BMI1, BMI2, ADX. */ [0x38] =3D SSE_SPECIAL, @@ -3083,13 +3097,13 @@ static const struct SSEOpHelper_table1 sse_op_table= 1[256] =3D { [0x69] =3D MMX_OP(punpckhwd), [0x6a] =3D MMX_OP(punpckhdq), [0x6b] =3D MMX_OP(packssdw), - [0x6c] =3D OP(op1, SSE_OPF_MMX, + [0x6c] =3D OP(op2, SSE_OPF_MMX, NULL, gen_helper_punpcklqdq_xmm, NULL, NULL), - [0x6d] =3D OP(op1, SSE_OPF_MMX, + [0x6d] =3D OP(op2, SSE_OPF_MMX, NULL, gen_helper_punpckhqdq_xmm, NULL, NULL), [0x6e] =3D SSE_SPECIAL, /* movd mm, ea */ [0x6f] =3D SSE_SPECIAL, /* movq, movdqa, , movqdu */ - [0x70] =3D OP(op1i, SSE_OPF_SHUF | SSE_OPF_MMX, + [0x70] =3D OP(op1i, SSE_OPF_SHUF | SSE_OPF_MMX | SSE_OPF_V0, gen_helper_pshufw_mmx, gen_helper_pshufd_xmm, gen_helper_pshufhw_xmm, gen_helper_pshuflw_xmm), [0x71] =3D SSE_SPECIAL, /* shiftw */ @@ -3100,17 +3114,17 @@ static const struct SSEOpHelper_table1 sse_op_table= 1[256] =3D { [0x76] =3D MMX_OP(pcmpeql), [0x77] =3D SSE_SPECIAL, /* emms */ [0x78] =3D SSE_SPECIAL, /* extrq_i, insertq_i (sse4a) */ - [0x79] =3D OP(op1, 0, + [0x79] =3D OP(op1, SSE_OPF_V0, NULL, gen_helper_extrq_r, NULL, gen_helper_insertq_r), - [0x7c] =3D OP(op1, 0, + [0x7c] =3D OP(op2, 0, NULL, gen_helper_haddpd_xmm, NULL, gen_helper_haddps_xmm), - [0x7d] =3D OP(op1, 0, + [0x7d] =3D OP(op2, 0, NULL, gen_helper_hsubpd_xmm, NULL, gen_helper_hsubps_xmm), [0x7e] =3D SSE_SPECIAL, /* movd, movd, , movq */ [0x7f] =3D SSE_SPECIAL, /* movq, movdqa, movdqu */ [0xc4] =3D SSE_SPECIAL, /* pinsrw */ [0xc5] =3D SSE_SPECIAL, /* pextrw */ - [0xd0] =3D OP(op1, 0, + [0xd0] =3D OP(op2, 0, NULL, gen_helper_addsubpd_xmm, NULL, gen_helper_addsubps_x= mm), [0xd1] =3D MMX_OP(psrlw), [0xd2] =3D MMX_OP(psrld), @@ -3133,7 +3147,7 @@ static const struct SSEOpHelper_table1 sse_op_table1[= 256] =3D { [0xe3] =3D MMX_OP(pavgw), [0xe4] =3D MMX_OP(pmulhuw), [0xe5] =3D MMX_OP(pmulhw), - [0xe6] =3D OP(op1, 0, + [0xe6] =3D OP(op1, SSE_OPF_V0, NULL, gen_helper_cvttpd2dq_xmm, gen_helper_cvtdq2pd_xmm, gen_helper_cvtpd2dq_xmm), [0xe7] =3D SSE_SPECIAL, /* movntq, movntq */ @@ -3152,7 +3166,7 @@ static const struct SSEOpHelper_table1 sse_op_table1[= 256] =3D { [0xf4] =3D MMX_OP(pmuludq), [0xf5] =3D MMX_OP(pmaddwd), [0xf6] =3D MMX_OP(psadbw), - [0xf7] =3D OP(op1t, SSE_OPF_MMX, + [0xf7] =3D OP(op1t, SSE_OPF_MMX | SSE_OPF_V0, gen_helper_maskmov_mmx, gen_helper_maskmov_xmm, NULL, NULL= ), [0xf8] =3D MMX_OP(psubb), [0xf9] =3D MMX_OP(psubw), @@ -3170,7 +3184,7 @@ static const struct SSEOpHelper_table1 sse_op_table1[= 256] =3D { =20 #define MMX_OP2(x) { gen_helper_ ## x ## _mmx, gen_helper_ ## x ## _xmm } =20 -static const SSEFunc_0_epp sse_op_table2[3 * 8][2] =3D { +static const SSEFunc_0_eppp sse_op_table2[3 * 8][2] =3D { [0 + 2] =3D MMX_OP2(psrlw), [0 + 4] =3D MMX_OP2(psraw), [0 + 6] =3D MMX_OP2(psllw), @@ -3214,7 +3228,7 @@ static const SSEFunc_l_ep sse_op_table3bq[] =3D { #define SSE_CMP(x) { \ gen_helper_ ## x ## ps ## _xmm, gen_helper_ ## x ## pd ## _xmm, \ gen_helper_ ## x ## ss, gen_helper_ ## x ## sd} -static const SSEFunc_0_epp sse_op_table4[8][4] =3D { +static const SSEFunc_0_eppp sse_op_table4[8][4] =3D { SSE_CMP(cmpeq), SSE_CMP(cmplt), SSE_CMP(cmple), @@ -3226,6 +3240,11 @@ static const SSEFunc_0_epp sse_op_table4[8][4] =3D { }; #undef SSE_CMP =20 +static void gen_helper_pavgusb(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b) +{ + gen_helper_pavgb_mmx(env, reg_a, reg_a, reg_b); +} + static const SSEFunc_0_epp sse_op_table5[256] =3D { [0x0c] =3D gen_helper_pi2fw, [0x0d] =3D gen_helper_pi2fd, @@ -3250,7 +3269,7 @@ static const SSEFunc_0_epp sse_op_table5[256] =3D { [0xb6] =3D gen_helper_movq, /* pfrcpit2 */ [0xb7] =3D gen_helper_pmulhrw_mmx, [0xbb] =3D gen_helper_pswapd, - [0xbf] =3D gen_helper_pavgb_mmx, + [0xbf] =3D gen_helper_pavgusb, }; =20 struct SSEOpHelper_table6 { @@ -3262,6 +3281,8 @@ struct SSEOpHelper_table6 { struct SSEOpHelper_table7 { union { SSEFunc_0_eppi op1; + SSEFunc_0_epppi op2; + SSEFunc_0_epppp op3; } fn[2]; uint32_t ext_mask; int flags; @@ -3273,15 +3294,15 @@ struct SSEOpHelper_table7 { {{{.op =3D mmx_name}, {.op =3D gen_helper_ ## name ## _xmm} }, \ CPUID_EXT_ ## ext, flags} #define BINARY_OP_MMX(name, ext) \ - OP(name, op1, SSE_OPF_MMX, ext, gen_helper_ ## name ## _mmx) + OP(name, op2, SSE_OPF_MMX, ext, gen_helper_ ## name ## _mmx) #define BINARY_OP(name, ext, flags) \ - OP(name, op1, flags, ext, NULL) + OP(name, op2, flags, ext, NULL) #define UNARY_OP_MMX(name, ext) \ - OP(name, op1, SSE_OPF_MMX, ext, gen_helper_ ## name ## _mmx) + OP(name, op1, SSE_OPF_V0 | SSE_OPF_MMX, ext, gen_helper_ ## name ## _m= mx) #define UNARY_OP(name, ext, flags) \ - OP(name, op1, flags, ext, NULL) -#define BLENDV_OP(name, ext, flags) OP(name, op1, 0, ext, NULL) -#define CMP_OP(name, ext) OP(name, op1, SSE_OPF_CMP, ext, NULL) + OP(name, op1, SSE_OPF_V0 | flags, ext, NULL) +#define BLENDV_OP(name, ext, flags) OP(name, op3, SSE_OPF_BLENDV, ext, NUL= L) +#define CMP_OP(name, ext) OP(name, op1, SSE_OPF_CMP | SSE_OPF_V0, ext, NUL= L) #define SPECIAL_OP(ext) OP(special, op1, SSE_OPF_SPECIAL, ext, NULL) =20 /* prefix [66] 0f 38 */ @@ -3838,7 +3859,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) op1_offset =3D offsetof(CPUX86State,mmx_t0); } assert(b1 < 2); - SSEFunc_0_epp fn =3D sse_op_table2[((b - 1) & 3) * 8 + + SSEFunc_0_eppp fn =3D sse_op_table2[((b - 1) & 3) * 8 + (((modrm >> 3)) & 7)][b1]; if (!fn) { goto unknown_op; @@ -3851,8 +3872,9 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); } tcg_gen_addi_ptr(s->ptr0, cpu_env, op2_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op1_offset); - fn(cpu_env, s->ptr0, s->ptr1); + tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); + tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); + fn(cpu_env, s->ptr0, s->ptr1, s->ptr2); break; case 0x050: /* movmskps */ rm =3D (modrm & 7) | REX_B(s); @@ -4121,7 +4143,21 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) } tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - op6->fn[b1].op1(cpu_env, s->ptr0, s->ptr1); + if (op6->flags & SSE_OPF_V0) { + op6->fn[b1].op1(cpu_env, s->ptr0, s->ptr1); + } else { + tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); + if (op6->flags & SSE_OPF_BLENDV) { + TCGv_ptr mask =3D tcg_temp_new_ptr(); + tcg_gen_addi_ptr(mask, cpu_env, ZMM_OFFSET(0)); + op6->fn[b1].op3(cpu_env, s->ptr0, s->ptr2, s->ptr1, + mask); + tcg_temp_free_ptr(mask); + } else { + SSEFunc_0_eppp fn =3D op6->fn[b1].op2; + fn(cpu_env, s->ptr0, s->ptr2, s->ptr1); + } + } } else { CHECK_NO_VEX(s); if ((op6->flags & SSE_OPF_MMX) =3D=3D 0) { @@ -4137,7 +4173,11 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) } tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - op6->fn[0].op1(cpu_env, s->ptr0, s->ptr1); + if (op6->flags & SSE_OPF_V0) { + op6->fn[0].op1(cpu_env, s->ptr0, s->ptr1); + } else { + op6->fn[0].op2(cpu_env, s->ptr0, s->ptr0, s->ptr1); + } } =20 if (op6->flags & SSE_OPF_CMP) { @@ -4471,7 +4511,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) /* We only actually have one MMX instuction (palignr) */ assert(b =3D=3D 0x0f); =20 - op7->fn[0].op1(cpu_env, s->ptr0, s->ptr1, + op7->fn[0].op2(cpu_env, s->ptr0, s->ptr0, s->ptr1, tcg_const_i32(val)); break; } @@ -4498,7 +4538,13 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) =20 tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - op7->fn[b1].op1(cpu_env, s->ptr0, s->ptr1, tcg_const_i32(val)); + if (op7->flags & SSE_OPF_V0) { + op7->fn[b1].op1(cpu_env, s->ptr0, s->ptr1, tcg_const_i32(v= al)); + } else { + tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); + op7->fn[b1].op2(cpu_env, s->ptr0, s->ptr2, s->ptr1, + tcg_const_i32(val)); + } if (op7->flags & SSE_OPF_CMP) { set_cc_op(s, CC_OP_EFLAGS); } @@ -4590,26 +4636,46 @@ static void gen_sse(CPUX86State *env, DisasContext = *s, int b) return; } } + + tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - if (sse_op_flags & SSE_OPF_SHUF) { - val =3D x86_ldub_code(env, s); - sse_op_fn.op1i(s->ptr0, s->ptr1, tcg_const_i32(val)); - } else if (b =3D=3D 0xf7) { - /* maskmov : we must prepare A0 */ - if (mod !=3D 3) { - goto illegal_op; + if (sse_op_flags & SSE_OPF_V0) { + if (sse_op_flags & SSE_OPF_SHUF) { + val =3D x86_ldub_code(env, s); + sse_op_fn.op1i(s->ptr0, s->ptr1, tcg_const_i32(val)); + } else if (b =3D=3D 0xf7) { + /* maskmov : we must prepare A0 */ + if (mod !=3D 3) { + goto illegal_op; + } + tcg_gen_mov_tl(s->A0, cpu_regs[R_EDI]); + gen_extu(s->aflag, s->A0); + gen_add_A0_ds_seg(s); + + tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); + sse_op_fn.op1t(cpu_env, s->ptr0, s->ptr1, s->A0); + /* Does not write to the fist operand */ + return; + } else { + sse_op_fn.op1(cpu_env, s->ptr0, s->ptr1); } - tcg_gen_mov_tl(s->A0, cpu_regs[R_EDI]); - gen_extu(s->aflag, s->A0); - gen_add_A0_ds_seg(s); - sse_op_fn.op1t(cpu_env, s->ptr0, s->ptr1, s->A0); - } else if (b =3D=3D 0xc2) { - /* compare insns, bits 7:3 (7:5 for AVX) are ignored */ - val =3D x86_ldub_code(env, s) & 7; - sse_op_table4[val][b1](cpu_env, s->ptr0, s->ptr1); } else { - sse_op_fn.op1(cpu_env, s->ptr0, s->ptr1); + tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); + if (sse_op_flags & SSE_OPF_SHUF) { + val =3D x86_ldub_code(env, s); + sse_op_fn.op2i(s->ptr0, s->ptr2, s->ptr1, + tcg_const_i32(val)); + } else { + SSEFunc_0_eppp fn =3D sse_op_fn.op2; + if (b =3D=3D 0xc2) { + /* compare insns */ + val =3D x86_ldub_code(env, s) & 7; + fn =3D sse_op_table4[val][b1]; + } + fn(cpu_env, s->ptr0, s->ptr2, s->ptr1); + } } =20 if (sse_op_flags & SSE_OPF_CMP) { @@ -8599,6 +8665,7 @@ static void i386_tr_init_disas_context(DisasContextBa= se *dcbase, CPUState *cpu) dc->tmp4 =3D tcg_temp_new(); dc->ptr0 =3D tcg_temp_new_ptr(); dc->ptr1 =3D tcg_temp_new_ptr(); + dc->ptr2 =3D tcg_temp_new_ptr(); dc->cc_srcT =3D tcg_temp_local_new(); } =20 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103318; cv=none; d=zohomail.com; s=zohoarc; b=ll1dojge+w072hwqt6+Q2f/6oS5yE1/bSmgN2g1cbH5N06Xp8lY8dz5rueO3OB2HJA3oHxNHwcdVnPgSv+JVftd1n01YwzKL6GKuaAalIwbCnoU4KRtGDH4QjE2HOYl/iYmCmaVvhUrLUZxi9mSbbksjR+ZGOODT++JZtaxdRKY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103318; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=D/CaNeQ1w3CFkO4CLWwaCNSZW6YsiwflkbB1p4abvQo=; b=VT7CrFYc4w3O1uhYHqWVj5o7PuQoOJoNJskPOMrkmFhfmFPSGBy0CExmmXj52JybCgJV79sSAz6vS022CKJx9zkFLWj8rYwE7z0/NPAEl1XdC8aBboYpYrUPUvEd4WLrKDtM3UISqOcLH9wGvMpvv13iDlDPi9+F0+FNL6xKueo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16661033180501002.0496747189652; Tue, 18 Oct 2022 07:28:38 -0700 (PDT) Received: from localhost ([::1]:55628 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okna8-0004sY-91 for importer@patchew.org; Tue, 18 Oct 2022 10:28:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46222) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RR-8f for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:32622) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhs-0005G5-UO for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:35 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-158-AHF8yoTfPeuD_bVxr4Q_tQ-1; Tue, 18 Oct 2022 09:32:29 -0400 Received: by mail-ed1-f72.google.com with SMTP id w20-20020a05640234d400b0045d0d1afe8eso10133333edc.15 for ; Tue, 18 Oct 2022 06:32:29 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id y16-20020a056402359000b004589da5e5cesm9120727edc.41.2022.10.18.06.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099950; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=D/CaNeQ1w3CFkO4CLWwaCNSZW6YsiwflkbB1p4abvQo=; b=fSH6g43zrsZue9Svf1Rw8dlwhPiQuK6wG0Y8SejmwzU9mdJdHVxQ1/3KtbCDvU/G6hkZuc fzZDBxPJSjl+v8OJy2MGolyguG8963My9/xlRbyEShCnEL3lYfApvDzob/aZGgbJK732Pi Od457AwoT3SLjnvMhbkVKPyKST99k+g= X-MC-Unique: AHF8yoTfPeuD_bVxr4Q_tQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=D/CaNeQ1w3CFkO4CLWwaCNSZW6YsiwflkbB1p4abvQo=; b=5jdMyph4yxQoqbG4jhwh+mNhjw31JouXYBXKbwX30e0mMkeOwScCTlbbZha5Z7escy pmcwjOEbDzvQseuPbsf575ldjRlQVyFOJpUkIAHDTRdt8hpA/9nPDEwC5pyyV1EhHdCG slH7aK/gvGKmEBOIyWav3qfeFmo3n9czr6KvUSLwlVWlKOOHEvVuvY2ez9zxXp7qpM2V ES75bSar8giPitGdtMplLnY81dx4+qZCJrFm0GoHn6chl5dh+vjvdZE0JZGw0kp3ri8k Sa+g7rZ9PpF2afhNgVfs1fgCxN8HYmR5xstNjUB8TpFC+X/UH4zU9eFf2zgwoYAzGQGw WZ7Q== X-Gm-Message-State: ACrzQf0xUve+tE6swWFMtg44V7Q1eYYrKAfbDOAcRcaQfJCsokTXQpuj hO8vvIPntxn13MIZUJyOeH1mmoFpPYzFzx7fh7m/Tpqt7K9Gi5vCZhUv0OYb/JM54dcrAL5S+ZK 5nsc/h0vg+QTGpIdE84mHnJicZq90SRPMEcdAvM5GBM0HdZdynxZPmo/Qo33pHNlnEZs= X-Received: by 2002:a17:907:2c59:b0:78d:8e03:134 with SMTP id hf25-20020a1709072c5900b0078d8e030134mr2380647ejc.310.1666099947719; Tue, 18 Oct 2022 06:32:27 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7EnODfvR+gshFx9ijevknWiyh4ErC6wNOEjGlF14EFtkKhcmJ2MSYvQWwVNkcMIYCK4aATqQ== X-Received: by 2002:a17:907:2c59:b0:78d:8e03:134 with SMTP id hf25-20020a1709072c5900b0078d8e030134mr2380625ejc.310.1666099947406; Tue, 18 Oct 2022 06:32:27 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 31/53] target/i386: support operand merging in binary scalar helpers Date: Tue, 18 Oct 2022 15:30:20 +0200 Message-Id: <20221018133042.856368-32-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103319844100001 Content-Type: text/plain; charset="utf-8" Compared to Paul's implementation, the new decoder will use a different app= roach to implement AVX's merging of dst with src1 on scalar operations. Adjust t= he helpers to provide this functionality. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 5f0ee9db52..ddedc46f36 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -557,12 +557,20 @@ void glue(helper_pshufhw, SUFFIX)(Reg *d, Reg *s, int= order) \ void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *v, Reg *s)\ { \ + int i; \ d->ZMM_S(0) =3D F(32, v->ZMM_S(0), s->ZMM_S(0)); \ + for (i =3D 1; i < 2 << SHIFT; i++) { \ + d->ZMM_L(i) =3D v->ZMM_L(i); \ + } \ } \ \ void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *v, Reg *s)\ { \ + int i; \ d->ZMM_D(0) =3D F(64, v->ZMM_D(0), s->ZMM_D(0)); \ + for (i =3D 1; i < 1 << SHIFT; i++) { \ + d->ZMM_Q(i) =3D v->ZMM_Q(i); \ + } \ } =20 #else @@ -1027,12 +1035,20 @@ void glue(helper_addsubpd, SUFFIX)(CPUX86State *env= , Reg *d, Reg *v, Reg *s) SSE_HELPER_CMP_P(name, F, C) = \ void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *v, Reg *s) = \ { = \ + int i; = \ d->ZMM_L(0) =3D C(F(32, v->ZMM_S(0), s->ZMM_S(0))) ? -1 : 0; = \ + for (i =3D 1; i < 2 << SHIFT; i++) { = \ + d->ZMM_L(i) =3D v->ZMM_L(i); = \ + } = \ } = \ = \ void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *v, Reg *s) = \ { = \ + int i; = \ d->ZMM_Q(0) =3D C(F(64, v->ZMM_D(0), s->ZMM_D(0))) ? -1 : 0; = \ + for (i =3D 1; i < 1 << SHIFT; i++) { = \ + d->ZMM_Q(i) =3D v->ZMM_Q(i); = \ + } = \ } =20 #define FPU_EQ(x) (x =3D=3D float_relation_equal) --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102233; cv=none; d=zohomail.com; s=zohoarc; b=a6Izc/WRvfX2y6mtQ0D60HuXBF/dJJHdqnv6xvQcAHb+br++Es7ar4XzJjRQ4s3AHnRgGoYBfrGxCEwaGHv9X6r0nCZOzbO86w/OqwE9XePLPab/2XapEdXpD/dlievq5Jr1QrAKpwgg8xwu1xe8oPHnSv2SlCqEqErdQuV1o5A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102233; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=LAEjY/xNyqTgeKzJy6YzPoD6VgrDN6sxMKJZyZYomuc=; b=Wz/fKCK3T4Dgo4Qu5H++vYGyHnujo1dr0MKv0Vi+RTBnXFoN60VwCFV2K1x+qPkCYmXQRCPajplu0X/SIEgsN8bks2MPOWIAQD9cGyvulCtVHQRAei+KOWZZzFlIDGF1NsxutV2/qOT68CNSD+hPiiNap0srmaNDG6hJz6nRzSk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102233385658.3782975233529; Tue, 18 Oct 2022 07:10:33 -0700 (PDT) Received: from localhost ([::1]:47726 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknIc-0005WM-Dk for importer@patchew.org; Tue, 18 Oct 2022 10:10:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33112) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RU-4E for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:55709) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmhx-0005Gu-1y for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:50 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-170-tqoMIHVYO4yEpDfOm4zQpg-1; Tue, 18 Oct 2022 09:32:34 -0400 Received: by mail-ej1-f70.google.com with SMTP id hd11-20020a170907968b00b0078df60485fdso6464759ejc.17 for ; Tue, 18 Oct 2022 06:32:34 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id t5-20020a056402524500b0045726e8a22bsm9117088edd.46.2022.10.18.06.32.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099955; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LAEjY/xNyqTgeKzJy6YzPoD6VgrDN6sxMKJZyZYomuc=; b=Q+pNxZz/mrlZ9qpZgEjaaiTSNZe6pXrhz6pCNWzR8lkqr9ECeL+mxDB0yNm3utuu4USKPY GMAdRYLIZL/L7v18Jug/J83KNBAMfDeJ+DvUf0axYwJLlg64D9DsbCnE0UClVQ1/J9NBw7 VW7+ZmVe6WlTruGI2nIboUQoJW2Q9Uw= X-MC-Unique: tqoMIHVYO4yEpDfOm4zQpg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LAEjY/xNyqTgeKzJy6YzPoD6VgrDN6sxMKJZyZYomuc=; b=IFV7pZH7BA5penKEI118ebFlszk74ovFZmzchTxAvsrYerqkb1wFVaGad5iVjXqu/1 uU2VUBqiSiGMN6+va1BIgytkGvLsaRRZOzFLXrAOfhyUMgX5yJKd2Be2tRaH19h17HN5 rDgbdVBsOA/LWjQaXOT/F3gCj7Nc1v/L7oTGJX0Rx/cgEbinL6yJGLKut4kvxdv6FkI0 2Mteibn8awnkN20GbiQrwybMnvEwbu7mSGkQaLVXP655FpgqBqKmSGy5j7RBpyWI7s0B 9yPw3QjkITLeh5mGXe2Rey2HAJ+qIC5bP9ce1Qd73nfHtAcNYT8VqtgxIB2HsXwLcS24 FSHg== X-Gm-Message-State: ACrzQf39a7TmEcN7mA84+ewXhKBYYTE+kQcM7qj6prXIYD7fIInIvNTT OscH/vOK2p9YEz77ET3s6e3DOhoZC4b80vrrpxbW6JFem3UFfM+5FWydFi/NOhJeAZwdc6F5/Et 7clHWcSyLgiBuMVtS69xtAgwc5n+L2ovBv2XiIYnEG+Mn+au8crWl1vGfh1tR4Wt7q4E= X-Received: by 2002:a17:907:3f27:b0:78d:ad42:f733 with SMTP id hq39-20020a1709073f2700b0078dad42f733mr2533677ejc.320.1666099950742; Tue, 18 Oct 2022 06:32:30 -0700 (PDT) X-Google-Smtp-Source: AMsMyM64vxyiOVRxYG7Z1DAvAYQeTdbRALwp/nXOKYE8enHg4FxmpVW77TImaIHTnv3di2DdcnwrDw== X-Received: by 2002:a17:907:3f27:b0:78d:ad42:f733 with SMTP id hq39-20020a1709073f2700b0078dad42f733mr2533656ejc.320.1666099950317; Tue, 18 Oct 2022 06:32:30 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 32/53] target/i386: provide 3-operand versions of unary scalar helpers Date: Tue, 18 Oct 2022 15:30:21 +0200 Message-Id: <20221018133042.856368-33-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102235289100001 Content-Type: text/plain; charset="utf-8" Compared to Paul's implementation, the new decoder will use a different app= roach to implement AVX's merging of dst with src1 on scalar operations. Adjust t= he old SSE decoder to be compatible with new-style helpers. The affected instructions are CVTSx2Sx, ROUNDSx, RSQRTSx, SQRTSx, RCPSx. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 48 ++++++++++++++++++++++++++++++------ target/i386/ops_sse_header.h | 16 ++++++------ target/i386/tcg/translate.c | 22 ++++++++++------- 3 files changed, 61 insertions(+), 25 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index ddedc46f36..8bb7293975 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -617,14 +617,22 @@ void glue(helper_sqrtpd, SUFFIX)(CPUX86State *env, Re= g *d, Reg *s) } =20 #if SHIFT =3D=3D 1 -void helper_sqrtss(CPUX86State *env, Reg *d, Reg *s) +void helper_sqrtss(CPUX86State *env, Reg *d, Reg *v, Reg *s) { + int i; d->ZMM_S(0) =3D float32_sqrt(s->ZMM_S(0), &env->sse_status); + for (i =3D 1; i < 2 << SHIFT; i++) { + d->ZMM_L(i) =3D v->ZMM_L(i); + } } =20 -void helper_sqrtsd(CPUX86State *env, Reg *d, Reg *s) +void helper_sqrtsd(CPUX86State *env, Reg *d, Reg *v, Reg *s) { + int i; d->ZMM_D(0) =3D float64_sqrt(s->ZMM_D(0), &env->sse_status); + for (i =3D 1; i < 1 << SHIFT; i++) { + d->ZMM_Q(i) =3D v->ZMM_Q(i); + } } #endif =20 @@ -649,14 +657,22 @@ void glue(helper_cvtpd2ps, SUFFIX)(CPUX86State *env, = Reg *d, Reg *s) } =20 #if SHIFT =3D=3D 1 -void helper_cvtss2sd(CPUX86State *env, Reg *d, Reg *s) +void helper_cvtss2sd(CPUX86State *env, Reg *d, Reg *v, Reg *s) { + int i; d->ZMM_D(0) =3D float32_to_float64(s->ZMM_S(0), &env->sse_status); + for (i =3D 1; i < 1 << SHIFT; i++) { + d->ZMM_Q(i) =3D v->ZMM_Q(i); + } } =20 -void helper_cvtsd2ss(CPUX86State *env, Reg *d, Reg *s) +void helper_cvtsd2ss(CPUX86State *env, Reg *d, Reg *v, Reg *s) { + int i; d->ZMM_S(0) =3D float64_to_float32(s->ZMM_D(0), &env->sse_status); + for (i =3D 1; i < 2 << SHIFT; i++) { + d->ZMM_L(i) =3D v->ZMM_L(i); + } } #endif =20 @@ -876,13 +892,17 @@ void glue(helper_rsqrtps, SUFFIX)(CPUX86State *env, Z= MMReg *d, ZMMReg *s) } =20 #if SHIFT =3D=3D 1 -void helper_rsqrtss(CPUX86State *env, ZMMReg *d, ZMMReg *s) +void helper_rsqrtss(CPUX86State *env, ZMMReg *d, ZMMReg *v, ZMMReg *s) { uint8_t old_flags =3D get_float_exception_flags(&env->sse_status); + int i; d->ZMM_S(0) =3D float32_div(float32_one, float32_sqrt(s->ZMM_S(0), &env->sse_status), &env->sse_status); set_float_exception_flags(old_flags, &env->sse_status); + for (i =3D 1; i < 2 << SHIFT; i++) { + d->ZMM_L(i) =3D v->ZMM_L(i); + } } #endif =20 @@ -897,10 +917,14 @@ void glue(helper_rcpps, SUFFIX)(CPUX86State *env, ZMM= Reg *d, ZMMReg *s) } =20 #if SHIFT =3D=3D 1 -void helper_rcpss(CPUX86State *env, ZMMReg *d, ZMMReg *s) +void helper_rcpss(CPUX86State *env, ZMMReg *d, ZMMReg *v, ZMMReg *s) { uint8_t old_flags =3D get_float_exception_flags(&env->sse_status); + int i; d->ZMM_S(0) =3D float32_div(float32_one, s->ZMM_S(0), &env->sse_status= ); + for (i =3D 1; i < 2 << SHIFT; i++) { + d->ZMM_L(i) =3D v->ZMM_L(i); + } set_float_exception_flags(old_flags, &env->sse_status); } #endif @@ -1798,11 +1822,12 @@ void glue(helper_roundpd, SUFFIX)(CPUX86State *env,= Reg *d, Reg *s, } =20 #if SHIFT =3D=3D 1 -void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, +void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, uint32_t mode) { uint8_t old_flags =3D get_float_exception_flags(&env->sse_status); signed char prev_rounding_mode; + int i; =20 prev_rounding_mode =3D env->sse_status.float_rounding_mode; if (!(mode & (1 << 2))) { @@ -1823,6 +1848,9 @@ void glue(helper_roundss, SUFFIX)(CPUX86State *env, R= eg *d, Reg *s, } =20 d->ZMM_S(0) =3D float32_round_to_int(s->ZMM_S(0), &env->sse_status); + for (i =3D 1; i < 2 << SHIFT; i++) { + d->ZMM_L(i) =3D v->ZMM_L(i); + } =20 if (mode & (1 << 3) && !(old_flags & float_flag_inexact)) { set_float_exception_flags(get_float_exception_flags(&env->sse_stat= us) & @@ -1832,11 +1860,12 @@ void glue(helper_roundss, SUFFIX)(CPUX86State *env,= Reg *d, Reg *s, env->sse_status.float_rounding_mode =3D prev_rounding_mode; } =20 -void glue(helper_roundsd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, +void glue(helper_roundsd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, uint32_t mode) { uint8_t old_flags =3D get_float_exception_flags(&env->sse_status); signed char prev_rounding_mode; + int i; =20 prev_rounding_mode =3D env->sse_status.float_rounding_mode; if (!(mode & (1 << 2))) { @@ -1857,6 +1886,9 @@ void glue(helper_roundsd, SUFFIX)(CPUX86State *env, R= eg *d, Reg *s, } =20 d->ZMM_D(0) =3D float64_round_to_int(s->ZMM_D(0), &env->sse_status); + for (i =3D 1; i < 1 << SHIFT; i++) { + d->ZMM_Q(i) =3D v->ZMM_Q(i); + } =20 if (mode & (1 << 3) && !(old_flags & float_flag_inexact)) { set_float_exception_flags(get_float_exception_flags(&env->sse_stat= us) & diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index b60fe2f0d4..32ffa8445b 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -148,8 +148,8 @@ DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) DEF_HELPER_4(name ## sd, void, env, Reg, Reg, Reg) #define SSE_HELPER_S3(name) \ SSE_HELPER_P3(name) \ - DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ - DEF_HELPER_3(name ## sd, void, env, Reg, Reg) + DEF_HELPER_4(name ## ss, void, env, Reg, Reg, Reg) \ + DEF_HELPER_4(name ## sd, void, env, Reg, Reg, Reg) #else #define SSE_HELPER_S4(name, ...) SSE_HELPER_P4(name) #define SSE_HELPER_S3(name, ...) SSE_HELPER_P3(name) @@ -179,8 +179,8 @@ DEF_HELPER_3(glue(cvttps2dq, SUFFIX), void, env, ZMMReg= , ZMMReg) DEF_HELPER_3(glue(cvttpd2dq, SUFFIX), void, env, ZMMReg, ZMMReg) =20 #if SHIFT =3D=3D 1 -DEF_HELPER_3(cvtss2sd, void, env, Reg, Reg) -DEF_HELPER_3(cvtsd2ss, void, env, Reg, Reg) +DEF_HELPER_4(cvtss2sd, void, env, Reg, Reg, Reg) +DEF_HELPER_4(cvtsd2ss, void, env, Reg, Reg, Reg) DEF_HELPER_3(cvtpi2ps, void, env, ZMMReg, MMXReg) DEF_HELPER_3(cvtpi2pd, void, env, ZMMReg, MMXReg) DEF_HELPER_3(cvtsi2ss, void, env, ZMMReg, i32) @@ -214,8 +214,8 @@ DEF_HELPER_3(glue(rsqrtps, SUFFIX), void, env, ZMMReg, = ZMMReg) DEF_HELPER_3(glue(rcpps, SUFFIX), void, env, ZMMReg, ZMMReg) =20 #if SHIFT =3D=3D 1 -DEF_HELPER_3(rsqrtss, void, env, ZMMReg, ZMMReg) -DEF_HELPER_3(rcpss, void, env, ZMMReg, ZMMReg) +DEF_HELPER_4(rsqrtss, void, env, ZMMReg, ZMMReg, ZMMReg) +DEF_HELPER_4(rcpss, void, env, ZMMReg, ZMMReg, ZMMReg) DEF_HELPER_3(extrq_r, void, env, ZMMReg, ZMMReg) DEF_HELPER_4(extrq_i, void, env, ZMMReg, int, int) DEF_HELPER_3(insertq_r, void, env, ZMMReg, ZMMReg) @@ -342,8 +342,8 @@ DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, = Reg) DEF_HELPER_4(glue(roundps, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(roundpd, SUFFIX), void, env, Reg, Reg, i32) #if SHIFT =3D=3D 1 -DEF_HELPER_4(roundss_xmm, void, env, Reg, Reg, i32) -DEF_HELPER_4(roundsd_xmm, void, env, Reg, Reg, i32) +DEF_HELPER_5(roundss_xmm, void, env, Reg, Reg, Reg, i32) +DEF_HELPER_5(roundsd_xmm, void, env, Reg, Reg, Reg, i32) #endif DEF_HELPER_5(glue(blendps, SUFFIX), void, env, Reg, Reg, Reg, i32) DEF_HELPER_5(glue(blendpd, SUFFIX), void, env, Reg, Reg, Reg, i32) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 8e3066d70a..e2c01af02d 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -3011,6 +3011,9 @@ static bool first =3D true; static unsigned long limi= t; #define SSE_OP(sname, dname, op, flags) OP(op, flags, \ gen_helper_##sname##_xmm, gen_helper_##dname##_xmm, NULL, NULL) =20 +#define SSE_OP_UNARY(a, b, c, d) \ + {SSE_OPF_SCALAR | SSE_OPF_V0, {{.op1 =3D a}, {.op1 =3D b}, {.op2 =3D c= }, {.op2 =3D d} } } + typedef union SSEFuncs { SSEFunc_0_epp op1; SSEFunc_0_ppi op1i; @@ -3053,12 +3056,12 @@ static const struct SSEOpHelper_table1 sse_op_table= 1[256] =3D { [0x2f] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR | SSE_OPF_V0, gen_helper_comiss, gen_helper_comisd, NULL, NULL), [0x50] =3D SSE_SPECIAL, /* movmskps, movmskpd */ - [0x51] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, + [0x51] =3D SSE_OP_UNARY( gen_helper_sqrtps_xmm, gen_helper_sqrtpd_xmm, gen_helper_sqrtss, gen_helper_sqrtsd), - [0x52] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, + [0x52] =3D SSE_OP_UNARY( gen_helper_rsqrtps_xmm, NULL, gen_helper_rsqrtss, NULL), - [0x53] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, + [0x53] =3D SSE_OP_UNARY( gen_helper_rcpps_xmm, NULL, gen_helper_rcpss, NULL), [0x54] =3D SSE_OP(pand, pand, op2, 0), /* andps, andpd */ [0x55] =3D SSE_OP(pandn, pandn, op2, 0), /* andnps, andnpd */ @@ -3066,9 +3069,9 @@ static const struct SSEOpHelper_table1 sse_op_table1[= 256] =3D { [0x57] =3D SSE_OP(pxor, pxor, op2, 0), /* xorps, xorpd */ [0x58] =3D SSE_FOP(add), [0x59] =3D SSE_FOP(mul), - [0x5a] =3D OP(op1, SSE_OPF_SCALAR | SSE_OPF_V0, - gen_helper_cvtps2pd_xmm, gen_helper_cvtpd2ps_xmm, - gen_helper_cvtss2sd, gen_helper_cvtsd2ss), + [0x5a] =3D SSE_OP_UNARY( + gen_helper_cvtps2pd_xmm, gen_helper_cvtpd2ps_xmm, + gen_helper_cvtss2sd, gen_helper_cvtsd2ss), [0x5b] =3D OP(op1, SSE_OPF_V0, gen_helper_cvtdq2ps_xmm, gen_helper_cvtps2dq_xmm, gen_helper_cvttps2dq_xmm, NULL), @@ -3364,8 +3367,8 @@ static const struct SSEOpHelper_table6 sse_op_table6[= 256] =3D { static const struct SSEOpHelper_table7 sse_op_table7[256] =3D { [0x08] =3D UNARY_OP(roundps, SSE41, 0), [0x09] =3D UNARY_OP(roundpd, SSE41, 0), - [0x0a] =3D UNARY_OP(roundss, SSE41, SSE_OPF_SCALAR), - [0x0b] =3D UNARY_OP(roundsd, SSE41, SSE_OPF_SCALAR), + [0x0a] =3D BINARY_OP(roundss, SSE41, SSE_OPF_SCALAR), + [0x0b] =3D BINARY_OP(roundsd, SSE41, SSE_OPF_SCALAR), [0x0c] =3D BINARY_OP(blendps, SSE41, 0), [0x0d] =3D BINARY_OP(blendpd, SSE41, 0), [0x0e] =3D BINARY_OP(pblendw, SSE41, SSE_OPF_MMX), @@ -4640,7 +4643,8 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) =20 tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - if (sse_op_flags & SSE_OPF_V0) { + if ((sse_op_flags & SSE_OPF_V0) && + !((sse_op_flags & SSE_OPF_SCALAR) && b1 >=3D 2)) { if (sse_op_flags & SSE_OPF_SHUF) { val =3D x86_ldub_code(env, s); sse_op_fn.op1i(s->ptr0, s->ptr1, tcg_const_i32(val)); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101336; cv=none; d=zohomail.com; s=zohoarc; b=JcJilN+LqjNoR+4tWg8+ulUgkXfR//jgjHXd4ybmXY7fc/bXxCIRF+zOxlVMtYe4NdCd38S6GbMJ4dLlaH4bswTwJzFeykkp4w9cN/UfsX5APVQSpt+AlZjh2IFUcMwRTWf7yWQBTeVNIeBfSBywfdqhWxCShpFHCblJ6psaD8g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101336; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jGWfq6eTVwMpCraC7JzJ6/JuO3n3PCIS41bQQLFgqiA=; b=DlW4N5uI5i5lRHWxHyd8my232KcRA6iC+ndGG468UKLUQe0Xqez3yWat3sA0m/QO2ByodgTMFSFwod1F24E3o8KfrY8LhMVf6+ryHue+6EpQvqOEcTtkX5+9blapN4AtmMRg/eM7ZbMXexdC3xJ3E/qTUoGOElPfMtlDRakuTNU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101336087902.8517705965538; Tue, 18 Oct 2022 06:55:36 -0700 (PDT) Received: from localhost ([::1]:45996 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn48-0000rh-Gi for importer@patchew.org; Tue, 18 Oct 2022 09:55:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33120) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Ra-0o for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:42760) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiA-0005H3-QR for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:54 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-517-CN9Bt19fMkq_sD9eV1rooA-1; Tue, 18 Oct 2022 09:32:34 -0400 Received: by mail-ed1-f70.google.com with SMTP id z20-20020a05640240d400b0045cec07c3dcso11497373edb.3 for ; Tue, 18 Oct 2022 06:32:34 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id e26-20020a056402149a00b0043bbb3535d6sm8887707edv.66.2022.10.18.06.32.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099956; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jGWfq6eTVwMpCraC7JzJ6/JuO3n3PCIS41bQQLFgqiA=; b=gq6rQYz9dP6HjSZPNObe5kSKUHISAwtD+8WVQzYY6XZ3CLRUK4XEkQurxxQSSBohjFk08D MdYYrUW2D8asneSsHnP5i5j4jlXAfaSzxNALi7qpAlYOCIgeAhhghfC6S89Tp4tTQZ7lno VNpdREZSuHVsrnn93krlTiisRjGRn2c= X-MC-Unique: CN9Bt19fMkq_sD9eV1rooA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jGWfq6eTVwMpCraC7JzJ6/JuO3n3PCIS41bQQLFgqiA=; b=UHNt6/PhAq7u5R2Rj2Du3j8ADfWK5tz8Eyl/ffITQXuuAeHfkorDLxguEuuZGMoR6g zMSaENvvOKA+iHJvKdnq2w1rQY8A0T1aP+jDdcYyrDS+lYtVFXVQhE4FwCz6tEXy+/OL LyusGCcChUPeuHPtTEW6ycCk6NDRv/TFaUlQ5BRHyDW3fUx6yO0UjwDvMfHynFTK5gPE zjh7UfBik8vxfUv1ELNhJNq+G+BPKEkAej/D5K8jc0azwYFo2/WpSc+9d6t8ljj27SyL b++WFpg8ezQK555TJ3dNq+J5VrvQdr+OnagEwT3QRz5SqoP/r+AfuBt37H6gMiN9zH+R +yaQ== X-Gm-Message-State: ACrzQf3MOgpDG6E06qNLo4BZmpTNnq+VgJFJUCdfWz7Mdwywjfn/1zaR tXyCrIVOhwALS0FtZH4LOLSkDHbsXs13Vh9ib+pkFVUNQILYNzumZlSaEMGSNRuvf4MoYopFQy8 GUMyeXLdoaipfTgI2cFbtSeU7h/dAOfe5BQ3lldZqptMJU3I9hvt/UER4c+NVAQE+Tak= X-Received: by 2002:a17:906:dacd:b0:780:a90c:e144 with SMTP id xi13-20020a170906dacd00b00780a90ce144mr2393174ejb.153.1666099953235; Tue, 18 Oct 2022 06:32:33 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4b4EMhsLyxmzimHomtOeN+xTs4nR9UJLV+Wyt5tCDvz7CFhvB81D6MIWoC+3Md2/v9sQnaZQ== X-Received: by 2002:a17:906:dacd:b0:780:a90c:e144 with SMTP id xi13-20020a170906dacd00b00780a90ce144mr2393152ejb.153.1666099952930; Tue, 18 Oct 2022 06:32:32 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 33/53] target/i386: implement additional AVX comparison operators Date: Tue, 18 Oct 2022 15:30:22 +0200 Message-Id: <20221018133042.856368-34-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101336614100003 Content-Type: text/plain; charset="utf-8" The new implementation of SSE will cover AVX from the get go, so include the 24 extra comparison operators that are only available with the VEX prefix. Based on a patch by Paul Brook . Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 38 ++++++++++++++++++++++++++++++++++++ target/i386/ops_sse_header.h | 27 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 8bb7293975..18d217ebf5 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -1075,10 +1075,21 @@ void glue(helper_addsubpd, SUFFIX)(CPUX86State *env= , Reg *d, Reg *v, Reg *s) } = \ } =20 +static inline bool FPU_EQU(FloatRelation x) +{ + return (x =3D=3D float_relation_equal || x =3D=3D float_relation_unord= ered); +} +static inline bool FPU_GE(FloatRelation x) +{ + return (x =3D=3D float_relation_equal || x =3D=3D float_relation_great= er); +} #define FPU_EQ(x) (x =3D=3D float_relation_equal) #define FPU_LT(x) (x =3D=3D float_relation_less) #define FPU_LE(x) (x <=3D float_relation_equal) +#define FPU_GT(x) (x =3D=3D float_relation_greater) #define FPU_UNORD(x) (x =3D=3D float_relation_unordered) +/* We must make sure we evaluate the argument in case it is a signalling N= AN */ +#define FPU_FALSE(x) (x =3D=3D float_relation_equal && 0) =20 #define FPU_CMPQ(size, a, b) \ float ## size ## _compare_quiet(a, b, &env->sse_status) @@ -1098,6 +1109,33 @@ SSE_HELPER_CMP(cmpnlt, FPU_CMPS, !FPU_LT) SSE_HELPER_CMP(cmpnle, FPU_CMPS, !FPU_LE) SSE_HELPER_CMP(cmpord, FPU_CMPQ, !FPU_UNORD) =20 +SSE_HELPER_CMP(cmpequ, FPU_CMPQ, FPU_EQU) +SSE_HELPER_CMP(cmpnge, FPU_CMPS, !FPU_GE) +SSE_HELPER_CMP(cmpngt, FPU_CMPS, !FPU_GT) +SSE_HELPER_CMP(cmpfalse, FPU_CMPQ, FPU_FALSE) +SSE_HELPER_CMP(cmpnequ, FPU_CMPQ, !FPU_EQU) +SSE_HELPER_CMP(cmpge, FPU_CMPS, FPU_GE) +SSE_HELPER_CMP(cmpgt, FPU_CMPS, FPU_GT) +SSE_HELPER_CMP(cmptrue, FPU_CMPQ, !FPU_FALSE) + +SSE_HELPER_CMP(cmpeqs, FPU_CMPS, FPU_EQ) +SSE_HELPER_CMP(cmpltq, FPU_CMPQ, FPU_LT) +SSE_HELPER_CMP(cmpleq, FPU_CMPQ, FPU_LE) +SSE_HELPER_CMP(cmpunords, FPU_CMPS, FPU_UNORD) +SSE_HELPER_CMP(cmpneqq, FPU_CMPS, !FPU_EQ) +SSE_HELPER_CMP(cmpnltq, FPU_CMPQ, !FPU_LT) +SSE_HELPER_CMP(cmpnleq, FPU_CMPQ, !FPU_LE) +SSE_HELPER_CMP(cmpords, FPU_CMPS, !FPU_UNORD) + +SSE_HELPER_CMP(cmpequs, FPU_CMPS, FPU_EQU) +SSE_HELPER_CMP(cmpngeq, FPU_CMPQ, !FPU_GE) +SSE_HELPER_CMP(cmpngtq, FPU_CMPQ, !FPU_GT) +SSE_HELPER_CMP(cmpfalses, FPU_CMPS, FPU_FALSE) +SSE_HELPER_CMP(cmpnequs, FPU_CMPS, !FPU_EQU) +SSE_HELPER_CMP(cmpgeq, FPU_CMPQ, FPU_GE) +SSE_HELPER_CMP(cmpgtq, FPU_CMPQ, FPU_GT) +SSE_HELPER_CMP(cmptrues, FPU_CMPS, !FPU_FALSE) + #undef SSE_HELPER_CMP =20 #if SHIFT =3D=3D 1 diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 32ffa8445b..e7866a8395 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -237,6 +237,33 @@ SSE_HELPER_CMP(cmpnlt, FPU_CMPS, !FPU_LT) SSE_HELPER_CMP(cmpnle, FPU_CMPS, !FPU_LE) SSE_HELPER_CMP(cmpord, FPU_CMPQ, !FPU_UNORD) =20 +SSE_HELPER_CMP(cmpequ, FPU_CMPQ, FPU_EQU) +SSE_HELPER_CMP(cmpnge, FPU_CMPS, !FPU_GE) +SSE_HELPER_CMP(cmpngt, FPU_CMPS, !FPU_GT) +SSE_HELPER_CMP(cmpfalse, FPU_CMPQ, FPU_FALSE) +SSE_HELPER_CMP(cmpnequ, FPU_CMPQ, !FPU_EQU) +SSE_HELPER_CMP(cmpge, FPU_CMPS, FPU_GE) +SSE_HELPER_CMP(cmpgt, FPU_CMPS, FPU_GT) +SSE_HELPER_CMP(cmptrue, FPU_CMPQ, !FPU_FALSE) + +SSE_HELPER_CMP(cmpeqs, FPU_CMPS, FPU_EQ) +SSE_HELPER_CMP(cmpltq, FPU_CMPQ, FPU_LT) +SSE_HELPER_CMP(cmpleq, FPU_CMPQ, FPU_LE) +SSE_HELPER_CMP(cmpunords, FPU_CMPS, FPU_UNORD) +SSE_HELPER_CMP(cmpneqq, FPU_CMPS, !FPU_EQ) +SSE_HELPER_CMP(cmpnltq, FPU_CMPQ, !FPU_LT) +SSE_HELPER_CMP(cmpnleq, FPU_CMPQ, !FPU_LE) +SSE_HELPER_CMP(cmpords, FPU_CMPS, !FPU_UNORD) + +SSE_HELPER_CMP(cmpequs, FPU_CMPS, FPU_EQU) +SSE_HELPER_CMP(cmpngeq, FPU_CMPQ, !FPU_GE) +SSE_HELPER_CMP(cmpngtq, FPU_CMPQ, !FPU_GT) +SSE_HELPER_CMP(cmpfalses, FPU_CMPS, FPU_FALSE) +SSE_HELPER_CMP(cmpnequs, FPU_CMPS, !FPU_EQU) +SSE_HELPER_CMP(cmpgeq, FPU_CMPQ, FPU_GE) +SSE_HELPER_CMP(cmpgtq, FPU_CMPQ, FPU_GT) +SSE_HELPER_CMP(cmptrues, FPU_CMPS, !FPU_FALSE) + #if SHIFT =3D=3D 1 DEF_HELPER_3(ucomiss, void, env, Reg, Reg) DEF_HELPER_3(comiss, void, env, Reg, Reg) --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101479; cv=none; d=zohomail.com; s=zohoarc; b=lcxilQOXMshS6AZNWcFYKiJQo9HIx/xBqQeCRUTRuo6aK2evdPqClEB6lA1EzgyWJeZiA7gkwqE5+pb6ia0UR2d4RCkzq6iCvNNspi0Ft0YzeHwNMDdmRXYE/07GejOyx3dQhBZhDiNaGk69nRbXO/RrCnotvjF4+PP6q0kHvsw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101479; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=PJCZ+hmRZX0Jpm2zSyk7ySgDbKMl90N7cMnNG1VhTh0=; b=If48eLIDmlb16Uq9DTDLZ18UGlIUF51O99+2wL8sXgFIt/lu7Mn1sZkTOq8W7xMhczl+dEyE80ntKD4SzFljAX3Ze29NWNVjqEvo8165BgIfWFQNg0JquTXpfaYRkDjPo/Qd4DucLxrqITKZDspux7rEjgCp/E/oex0OvUKFoi0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101479667630.8964916206002; Tue, 18 Oct 2022 06:57:59 -0700 (PDT) Received: from localhost ([::1]:33714 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn6T-0005jF-HI for importer@patchew.org; Tue, 18 Oct 2022 09:57:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33114) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RV-3Q for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:42544) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiA-0005HJ-Q7 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:52 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-634-uVA50_DvOFaVd7PFow1s-g-1; Tue, 18 Oct 2022 09:32:37 -0400 Received: by mail-ed1-f71.google.com with SMTP id b8-20020a056402278800b0045d410dec69so7568474ede.2 for ; Tue, 18 Oct 2022 06:32:37 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id de13-20020a1709069bcd00b0078d957e65b6sm7517487ejc.23.2022.10.18.06.32.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099958; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PJCZ+hmRZX0Jpm2zSyk7ySgDbKMl90N7cMnNG1VhTh0=; b=glBOOOTsTzvBn9sdsilQPFbNFljw0bSo5xFwKos0xnvtK/8vD97jHqLVA/H+ZHiKbxYapH z+OnQdHw9vDCPFKtx/wLervlyj5oCn7MSCSbw8+3RMVNII72eygzHqW2y5ftD+kZNDSE// CxsHUSCyZon5DZIcKhiNRi5vfPXqK2I= X-MC-Unique: uVA50_DvOFaVd7PFow1s-g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PJCZ+hmRZX0Jpm2zSyk7ySgDbKMl90N7cMnNG1VhTh0=; b=Zn1+rAUb2+8E1FLenznETAG8YQkLTf8eHq9Awfs2iABCly7lZaebAdctS1BG5UwHwl i93cp0Ij9GgFKJdeNaUrnvMjjAzXn93bgVQEmmWHztAdFr1+gdoRMYVktQt4gclbE2p4 rmr0Zz3vU+5Mj/3ehMlQpnwHssdM9S5wVmQg/RH31RviPIAaVlAnINbyUbq5+LHJLoGg KXfdaca9l6y5e1I+N6iAo9dCZGdq2kj8EklXbT3T08Dnl7/oR8o2UhqsFLuHXGxDvPtH bgG1dyRcUUcQw3I5/jjkKhBz865cRCPJb1jpV0lk5Vt1cDKVKHXJ9ZEKOhvKtuYtip9+ 5oBQ== X-Gm-Message-State: ACrzQf3pRzClOuo+MMnMgb1muUU8wQA6PFUEEqG2gvL0m4OiaqVEgKAT Brc/EllzmcFKBYVaX3VgnG1yz2l7xPn9SAtYgceLpShoVXC2NUVWpV01/3Xigqc+Kk2KRULLDll C3R2/pXlb+mvzWiImEMrFfmNILba0RpEOBq5ajqMmhKqBEzU36H6LHRz7CJd7glKcIDQ= X-Received: by 2002:a17:906:a4a:b0:782:686d:a1b6 with SMTP id x10-20020a1709060a4a00b00782686da1b6mr2407407ejf.232.1666099955808; Tue, 18 Oct 2022 06:32:35 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7h3Ua28AwzepuaNJfCDjdLu7Nkz1RwdpTn2SnQOG2iTwH2XxAOx445X7vPJIMzw2DAv/8FAQ== X-Received: by 2002:a17:906:a4a:b0:782:686d:a1b6 with SMTP id x10-20020a1709060a4a00b00782686da1b6mr2407386ejf.232.1666099955550; Tue, 18 Oct 2022 06:32:35 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 34/53] target/i386: Introduce 256-bit vector helpers Date: Tue, 18 Oct 2022 15:30:23 +0200 Message-Id: <20221018133042.856368-35-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101480169100003 Content-Type: text/plain; charset="utf-8" The new implementation of SSE will cover AVX from the get go, because all the work for the helper functions is already done. We just need to build them. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/helper.h | 2 ++ target/i386/ops_sse.h | 5 +++++ target/i386/ops_sse_header.h | 4 ++++ target/i386/tcg/fpu_helper.c | 3 +++ 4 files changed, 14 insertions(+) diff --git a/target/i386/helper.h b/target/i386/helper.h index 39a3c24182..a2c2c085a3 100644 --- a/target/i386/helper.h +++ b/target/i386/helper.h @@ -218,6 +218,8 @@ DEF_HELPER_3(movq, void, env, ptr, ptr) #include "ops_sse_header.h" #define SHIFT 1 #include "ops_sse_header.h" +#define SHIFT 2 +#include "ops_sse_header.h" =20 DEF_HELPER_3(rclb, tl, env, tl, tl) DEF_HELPER_3(rclw, tl, env, tl, tl) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 18d217ebf5..090ba013b3 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -35,7 +35,11 @@ #define W(n) ZMM_W(n) #define L(n) ZMM_L(n) #define Q(n) ZMM_Q(n) +#if SHIFT =3D=3D 1 #define SUFFIX _xmm +#else +#define SUFFIX _ymm +#endif #endif =20 #define LANE_WIDTH (SHIFT ? 16 : 8) @@ -2379,6 +2383,7 @@ void glue(helper_aeskeygenassist, SUFFIX)(CPUX86State= *env, Reg *d, Reg *s, =20 #undef SSE_HELPER_S =20 +#undef LANE_WIDTH #undef SHIFT #undef XMM_ONLY #undef Reg diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index e7866a8395..440f1c0e78 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -21,7 +21,11 @@ #define SUFFIX _mmx #else #define Reg ZMMReg +#if SHIFT =3D=3D 1 #define SUFFIX _xmm +#else +#define SUFFIX _ymm +#endif #endif =20 #define dh_alias_Reg ptr diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c index 9b59026e37..5f3f7a1085 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -3065,3 +3065,6 @@ void helper_movq(CPUX86State *env, void *d, void *s) =20 #define SHIFT 1 #include "ops_sse.h" + +#define SHIFT 2 +#include "ops_sse.h" --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101159; cv=none; d=zohomail.com; s=zohoarc; b=kBnHHdbNK2D+bB5imdmbYkJIY8h3T15GgbBgoiUQxiJJy/1NuT07wwNtcezjq1scerTTZuY7ihU8E8Mu5AczkYX9SoDjCUPnGsxQFC4+FGm7xSn+DO6mpGpqY1Ud01sV57Q9M5WwmEht6fkH0PrYYlYwt/QAXYgEybShcZj+D/k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101159; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=M94LNBJ9aZEIQuFsUJHstxcBiq2v4UtctFBHVZSnvTM=; b=JHlm0HePVDPjdE9AjvZaTl5r+v01Pup2Rpj1LukTUMhJuUFW/7g6LeyIOygsHMJHSuHE5zF9hUaumQDGeEB9wqykV6Yiho1xeKbwNR28qtdMXMwdg7fbmqzOCncgNG3iDt2vAFhboj94Amk4UxE1tCDiGbouegtn3+quqAmyZU0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101159064316.68716496533125; Tue, 18 Oct 2022 06:52:39 -0700 (PDT) Received: from localhost ([::1]:47946 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn1J-0002IS-8v for importer@patchew.org; Tue, 18 Oct 2022 09:52:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33118) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004RZ-5J for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:20682) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiA-0005HX-3k for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:52 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-630-J05JrFj_M3W-pdGkGAsSrg-1; Tue, 18 Oct 2022 09:32:40 -0400 Received: by mail-ed1-f70.google.com with SMTP id y14-20020a056402440e00b0044301c7ccd9so11692115eda.19 for ; Tue, 18 Oct 2022 06:32:40 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id p22-20020a056402045600b0044e01e2533asm8915359edw.43.2022.10.18.06.32.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099961; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=M94LNBJ9aZEIQuFsUJHstxcBiq2v4UtctFBHVZSnvTM=; b=Cgt+LzV1SKJB7RzZT6buWHzqfEFB1ksjnwO381Imb7OVL2r7ijRSCtzVioMWP2+AGpbGYs sYaegFQDWmebBO7hc/t2zqQ1zs7PTEi4cWyt2nABnzN5F4KrRUzVexJbTBYd2We7OnGMV7 UStZ/lrOJO1qYqjYDGc534j4hiYQr+8= X-MC-Unique: J05JrFj_M3W-pdGkGAsSrg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=M94LNBJ9aZEIQuFsUJHstxcBiq2v4UtctFBHVZSnvTM=; b=2L3M73sRl2RxP0dO5pow4GDSdS1yqCiH0vGci1yLiIfqe35RRVuC32vEZn0PzfrwSs RFtPs+bfG75JM3wnJdlmbWjJ8yh3A9CLDBnL95JKoCPwm8zzdYoZuTKqk8zfRxcBzP2w WctDx/SruRyh6zZ24QgCgOD6p9ABI0JBd21pd7Nw4XEWwJkPjZsvBC6lsc4H5PNb0C5p BEkb2R/ywjCzxf12xWRMFv+ZUTjPv2HzFphhNRXgA9J6UGlXoJz8mi2iQc70DMQOazJM 9FKw+QLvVGEh8sEKBcKM/K1AAS4BketVzocTSEb71dcFTj3LxmL9Z/Z4ophmIU8gdqlB pTXA== X-Gm-Message-State: ACrzQf33mNeHAD6/bbYbWxBs6Rm94QJikLYlBR/RA3hI4NGaS28LXo+7 vKfxiL1VV++DRgqDO9TFXUvCvCGDKSXH9/fPOzlXjOXcTAeuEN2vw8T1xONuKLHSn5fyM8l2tjx O/VSRk2eJXwOqX6ecjQHddiK06UhdNdlb5r3r0wzbgIIXSjR2psV9wd7SlDU5H3JoRpA= X-Received: by 2002:a17:906:8a79:b0:78d:9c52:2196 with SMTP id hy25-20020a1709068a7900b0078d9c522196mr2480913ejc.328.1666099958630; Tue, 18 Oct 2022 06:32:38 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5NpsN7rXbg/tvnvZ9eIB/4DKqHHAd4zHCzf8lTtXQ6sn3LCgibfgdml14SxdxxwjJ02csYOg== X-Received: by 2002:a17:906:8a79:b0:78d:9c52:2196 with SMTP id hy25-20020a1709068a7900b0078d9c522196mr2480880ejc.328.1666099958153; Tue, 18 Oct 2022 06:32:38 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 35/53] target/i386: reimplement 0x0f 0x60-0x6f, add AVX Date: Tue, 18 Oct 2022 15:30:24 +0200 Message-Id: <20221018133042.856368-36-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101159523100001 Content-Type: text/plain; charset="utf-8" These are both MMX and SSE/AVX instructions, except for vmovdqu. In both cases the inputs and output is in s->ptr{0,1,2}, so the only difference between MMX, SSE, and AVX is which helper to call. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 42 +++++++ target/i386/tcg/emit.c.inc | 202 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 19 ++- 3 files changed, 262 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index dc04aa9cbb..8a749f33fd 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -135,6 +135,19 @@ static uint8_t get_modrm(DisasContext *s, CPUX86State = *env) return s->modrm; } =20 +static inline const X86OpEntry *decode_by_prefix(DisasContext *s, const X8= 6OpEntry entries[4]) +{ + if (s->prefix & PREFIX_REPNZ) { + return &entries[3]; + } else if (s->prefix & PREFIX_REPZ) { + return &entries[2]; + } else if (s->prefix & PREFIX_DATA) { + return &entries[1]; + } else { + return &entries[0]; + } +} + static void decode_group17(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) { static const X86GenFunc group17_gen[8] =3D { @@ -144,6 +157,17 @@ static void decode_group17(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, entry->gen =3D group17_gen[op]; } =20 +static void decode_0F6F(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F6F[4] =3D { + X86_OP_ENTRY3(MOVDQ, P,q, None,None, Q,q, vex1 mmx), /* mov= q */ + X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex1), /* mov= dqa */ + X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex4_unal), /* mov= dqu */ + {}, + }; + *entry =3D *decode_by_prefix(s, opcodes_0F6F); +} + static const X86OpEntry opcodes_0F38_00toEF[240] =3D { }; =20 @@ -229,8 +253,26 @@ static void decode_0F3A(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui } =20 static const X86OpEntry opcodes_0F[256] =3D { + [0x60] =3D X86_OP_ENTRY3(PUNPCKLBW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x61] =3D X86_OP_ENTRY3(PUNPCKLWD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x62] =3D X86_OP_ENTRY3(PUNPCKLDQ, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x63] =3D X86_OP_ENTRY3(PACKSSWB, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x64] =3D X86_OP_ENTRY3(PCMPGTB, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x65] =3D X86_OP_ENTRY3(PCMPGTW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x66] =3D X86_OP_ENTRY3(PCMPGTD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x67] =3D X86_OP_ENTRY3(PACKUSWB, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x38] =3D X86_OP_GROUP0(0F38), [0x3a] =3D X86_OP_GROUP0(0F3A), + + [0x68] =3D X86_OP_ENTRY3(PUNPCKHBW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x69] =3D X86_OP_ENTRY3(PUNPCKHWD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x6a] =3D X86_OP_ENTRY3(PUNPCKHDQ, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x6b] =3D X86_OP_ENTRY3(PACKSSDW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x6c] =3D X86_OP_ENTRY3(PUNPCKLQDQ, V,x, H,x, W,x, vex4 p_66 avx2_25= 6), + [0x6d] =3D X86_OP_ENTRY3(PUNPCKHQDQ, V,x, H,x, W,x, vex4 p_66 avx2_25= 6), + [0x6e] =3D X86_OP_ENTRY3(MOVD_to, V,x, None,None, E,y, vex5 mmx p_0= 0_66), /* wrong dest Vy on SDM! */ + [0x6f] =3D X86_OP_GROUP0(0F6F), }; =20 static void do_decode_0F(DisasContext *s, CPUX86State *env, X86OpEntry *en= try, uint8_t *b) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 947deacd37..8dbacc21ed 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -71,6 +71,56 @@ static inline int xmm_offset(MemOp ot) } } =20 +static int vector_reg_offset(X86DecodedOp *op) +{ + assert(op->unit =3D=3D X86_OP_MMX || op->unit =3D=3D X86_OP_SSE); + + if (op->unit =3D=3D X86_OP_MMX) { + return op->offset - mmx_offset(op->ot); + } else { + return op->offset - xmm_offset(op->ot); + } +} + +static int vector_elem_offset(X86DecodedOp *op, MemOp ot, int n) +{ + int base_ofs =3D vector_reg_offset(op); + switch(ot) { + case MO_8: + if (op->unit =3D=3D X86_OP_MMX) { + return base_ofs + offsetof(MMXReg, MMX_B(n)); + } else { + return base_ofs + offsetof(ZMMReg, ZMM_B(n)); + } + case MO_16: + if (op->unit =3D=3D X86_OP_MMX) { + return base_ofs + offsetof(MMXReg, MMX_W(n)); + } else { + return base_ofs + offsetof(ZMMReg, ZMM_W(n)); + } + case MO_32: + if (op->unit =3D=3D X86_OP_MMX) { + return base_ofs + offsetof(MMXReg, MMX_L(n)); + } else { + return base_ofs + offsetof(ZMMReg, ZMM_L(n)); + } + case MO_64: + if (op->unit =3D=3D X86_OP_MMX) { + return base_ofs; + } else { + return base_ofs + offsetof(ZMMReg, ZMM_Q(n)); + } + case MO_128: + assert(op->unit =3D=3D X86_OP_SSE); + return base_ofs + offsetof(ZMMReg, ZMM_X(n)); + case MO_256: + assert(op->unit =3D=3D X86_OP_SSE); + return base_ofs + offsetof(ZMMReg, ZMM_Y(n)); + default: + g_assert_not_reached(); + } +} + static void compute_mmx_offset(X86DecodedOp *op) { if (!op->has_ea) { @@ -183,6 +233,23 @@ static void gen_load(DisasContext *s, X86DecodedInsn *= decode, int opn, TCGv v) } } =20 +static TCGv_ptr op_ptr(X86DecodedInsn *decode, int opn) +{ + X86DecodedOp *op =3D &decode->op[opn]; + if (op->v_ptr) { + return op->v_ptr; + } + op->v_ptr =3D tcg_temp_new_ptr(); + + /* The temporary points to the MMXReg or ZMMReg. */ + tcg_gen_addi_ptr(op->v_ptr, cpu_env, vector_reg_offset(op)); + return op->v_ptr; +} + +#define OP_PTR0 op_ptr(decode, 0) +#define OP_PTR1 op_ptr(decode, 1) +#define OP_PTR2 op_ptr(decode, 2) + static void gen_writeback(DisasContext *s, X86DecodedInsn *decode, int opn= , TCGv v) { X86DecodedOp *op =3D &decode->op[opn]; @@ -216,6 +283,114 @@ static void gen_writeback(DisasContext *s, X86Decoded= Insn *decode, int opn, TCGv } } =20 +static inline int vector_len(DisasContext *s, X86DecodedInsn *decode) +{ + if (decode->e.special =3D=3D X86_SPECIAL_MMX && + !(s->prefix & (PREFIX_DATA | PREFIX_REPZ | PREFIX_REPNZ))) { + return 8; + } + return s->vex_l ? 32 : 16; +} + +static void gen_store_sse(DisasContext *s, X86DecodedInsn *decode, int src= _ofs) +{ + MemOp ot =3D decode->op[0].ot; + int vec_len =3D vector_len(s, decode); + bool aligned =3D sse_needs_alignment(s, decode, ot); + + if (!decode->op[0].has_ea) { + tcg_gen_gvec_mov(MO_64, decode->op[0].offset, src_ofs, vec_len, ve= c_len); + return; + } + + switch (ot) { + case MO_64: + gen_stq_env_A0(s, src_ofs); + break; + case MO_128: + gen_sto_env_A0(s, src_ofs, aligned); + break; + case MO_256: + gen_sty_env_A0(s, src_ofs, aligned); + break; + default: + g_assert_not_reached(); + } +} + +#define BINARY_INT_GVEC(uname, func, ...) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + int vec_len =3D vector_len(s, decode); = \ + = \ + func(__VA_ARGS__, = \ + decode->op[0].offset, decode->op[1].offset, = \ + decode->op[2].offset, vec_len, vec_len); = \ +} + +BINARY_INT_GVEC(PCMPGTB, tcg_gen_gvec_cmp, TCG_COND_GT, MO_8) +BINARY_INT_GVEC(PCMPGTW, tcg_gen_gvec_cmp, TCG_COND_GT, MO_16) +BINARY_INT_GVEC(PCMPGTD, tcg_gen_gvec_cmp, TCG_COND_GT, MO_32) + + +/* + * 00 =3D p* Pq, Qq (if mmx not NULL; no VEX) + * 66 =3D vp* Vx, Hx, Wx + * + * These are really the same encoding, because 1) V is the same as P when = VEX.V + * is not present 2) P and Q are the same as H and W apart from MM/XMM + */ +static inline void gen_binary_int_sse(DisasContext *s, CPUX86State *env, X= 86DecodedInsn *decode, + SSEFunc_0_eppp mmx, SSEFunc_0_eppp x= mm, SSEFunc_0_eppp ymm) +{ + assert(!!mmx =3D=3D !!(decode->e.special =3D=3D X86_SPECIAL_MMX)); + + if (mmx && (s->prefix & PREFIX_VEX) && !(s->prefix & PREFIX_DATA)) { + /* VEX encoding is not applicable to MMX instructions. */ + gen_illegal_opcode(s); + return; + } + if (!(s->prefix & PREFIX_DATA)) { + mmx(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); + } else if (!s->vex_l) { + xmm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); + } else { + ymm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); + } +} + + +#define BINARY_INT_MMX(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_binary_int_sse(s, env, decode, = \ + gen_helper_##lname##_mmx, = \ + gen_helper_##lname##_xmm, = \ + gen_helper_##lname##_ymm); = \ +} +BINARY_INT_MMX(PUNPCKLBW, punpcklbw) +BINARY_INT_MMX(PUNPCKLWD, punpcklwd) +BINARY_INT_MMX(PUNPCKLDQ, punpckldq) +BINARY_INT_MMX(PACKSSWB, packsswb) +BINARY_INT_MMX(PACKUSWB, packuswb) +BINARY_INT_MMX(PUNPCKHBW, punpckhbw) +BINARY_INT_MMX(PUNPCKHWD, punpckhwd) +BINARY_INT_MMX(PUNPCKHDQ, punpckhdq) +BINARY_INT_MMX(PACKSSDW, packssdw) + +/* Instructions with no MMX equivalent. */ +#define BINARY_INT_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_binary_int_sse(s, env, decode, = \ + NULL, = \ + gen_helper_##lname##_xmm, = \ + gen_helper_##lname##_ymm); = \ +} + +BINARY_INT_SSE(PUNPCKLQDQ, punpcklqdq) +BINARY_INT_SSE(PUNPCKHQDQ, punpckhqdq) + static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_= op) { TCGv carry_in =3D NULL; @@ -383,6 +558,33 @@ static void gen_MOVBE(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) } } =20 +static void gen_MOVD_to(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + MemOp ot =3D decode->op[2].ot; + int vec_len =3D vector_len(s, decode); + int lo_ofs =3D vector_elem_offset(&decode->op[0], ot, 0); + + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len, 0); + + switch (ot) { + case MO_32: +#ifdef TARGET_X86_64 + tcg_gen_st32_tl(s->T1, cpu_env, lo_ofs); + break; + case MO_64: +#endif + tcg_gen_st_tl(s->T1, cpu_env, lo_ofs); + break; + default: + g_assert_not_reached(); + } +} + +static void gen_MOVDQ(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + gen_store_sse(s, decode, decode->op[2].offset); +} + static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { MemOp ot =3D decode->op[0].ot; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index e2c01af02d..5133b8c23d 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -2935,6 +2935,23 @@ static void gen_ldy_env_A0(DisasContext *s, int offs= et, bool align) tcg_gen_st_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(3= ))); } =20 +static void gen_sty_env_A0(DisasContext *s, int offset, bool align) +{ + int mem_index =3D s->mem_index; + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(0= ))); + tcg_gen_qemu_st_i64(s->tmp1_i64, s->A0, mem_index, + MO_LEUQ | (align ? MO_ALIGN_32 : 0)); + tcg_gen_addi_tl(s->tmp0, s->A0, 8); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(1= ))); + tcg_gen_qemu_st_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); + tcg_gen_addi_tl(s->tmp0, s->A0, 16); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(2= ))); + tcg_gen_qemu_st_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); + tcg_gen_addi_tl(s->tmp0, s->A0, 24); + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, offset + offsetof(YMMReg, YMM_Q(3= ))); + tcg_gen_qemu_st_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); +} + static inline void gen_op_movo(DisasContext *s, int d_offset, int s_offset) { tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(XMMReg, XMM_Q= (0))); @@ -4764,7 +4781,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #ifndef CONFIG_USER_ONLY use_new &=3D b <=3D limit; #endif - if (use_new && 0) { + if (use_new && (b >=3D 0x160 && b <=3D 0x16f)) { disas_insn_new(s, cpu, b + 0x100); return s->pc; } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103371; cv=none; d=zohomail.com; s=zohoarc; b=eKI87ct7mXkJhofgzCGXNLQTT+WZ4ec+0CPuSQ4HjaQgBpbLhqPBNSbvAtOmzWW4G5eZNHOTLk5h7aLHMC/auwqdNUr5eQw0cgFm82wVQB4Fu6VvETIP3sbfOSOvrfjAGxh8xldQ6I5oQGUdkcz0e0qYsVjKDqEfgUOkudfcmj8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103371; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=fDXZjCYjQLrNOW0dqzxDO4h2X036GTnfY4eNA8ldCcQ=; b=kssSvEKBToGTUWpYnORuEMyCMbkWcg0d6u7ttxYLybpWBaydCKIfKmePJPaX0xkXZVheYAv4hVhXz+07fSED+fMFUlONawtArz1Htflcgxnq2mFxXcXu51nAfzMmQtIfLOvCcV4ybVNSVN1bdOKVvgIRRUV3YMpF8vzMTo7putk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16661033716021008.7210684822213; Tue, 18 Oct 2022 07:29:31 -0700 (PDT) Received: from localhost ([::1]:55456 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknb0-0006Jr-Bh for importer@patchew.org; Tue, 18 Oct 2022 10:29:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50448) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Rb-51 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:55722) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiB-0005Hd-Fb for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:56 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-454-o58CwZZNOLSW-KvBIWBFhQ-1; Tue, 18 Oct 2022 09:32:43 -0400 Received: by mail-ed1-f70.google.com with SMTP id dz9-20020a0564021d4900b0045d9a3aded4so4287704edb.22 for ; Tue, 18 Oct 2022 06:32:43 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id l3-20020aa7cac3000000b0045723aa48ccsm8757590edt.93.2022.10.18.06.32.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099964; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fDXZjCYjQLrNOW0dqzxDO4h2X036GTnfY4eNA8ldCcQ=; b=OqbwknJG6BkYsCQg8freQqJDNOypXBULl/SP9B9MJPLGYbtfMbQ5+r0bhVvTbs4boHeP3s uvgr4SxM9r0RGycL0OCvf1/Lp/BFQYYmYczuVYMKat29O2jXfOSM2iL/rV8vWvQZ+Ccrrj YsVhGTW8l38jH1c0OMm4dokZgZ0TOyw= X-MC-Unique: o58CwZZNOLSW-KvBIWBFhQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fDXZjCYjQLrNOW0dqzxDO4h2X036GTnfY4eNA8ldCcQ=; b=kD3P+bs04rQ2wav/pnGeFZ7nt7H+XGbDUy0jtzx5wMmrEAKe14aO4wbX0EqzCA7EpZ /+YoNLZY/Rve0vT4AwGLOG5opvPqugl8VI4nBJaeCubiSFEUCms1ERA7b/nftdmgIvrZ V/eAQH5xYaSD2FsOy1pPyoZUZcLNbWVdsIF7fMHYX1o2WHxWpAbLMH1n+hwyQ8Djiplh 12i9VXN0zOlKx5b/Dyx3w3ZWN5iTgX/JMj33UnlsMXvRYH0w6D0UkOe3UH0FcyQMMse+ guHdE3tmIUSIcOMlqOsblwS8zfuvYFFp94cQ+ytBuKZMQulks4XeVJLGhjDC2XEMfp5Z ZNeQ== X-Gm-Message-State: ACrzQf1v7eWQJYvDKufTXnuLy6BcKV6msaf+RAOAtNxnCEib2QslqizK aZuEUuFfAjHBEaGSBrv7zdQXEHGwBY6ZKkvcTJwYW4MoHVSSTseOzrlcXNpZj0AgBH/VUu2jhcI YAgRidpRDg5DCbJCyNSvwF4UusUSz7ItpNVhd2UB35gdi7QqShlUv9Fuo7Gl7xIgoKvE= X-Received: by 2002:a17:906:5dae:b0:78e:302f:4218 with SMTP id n14-20020a1709065dae00b0078e302f4218mr2586017ejv.22.1666099961547; Tue, 18 Oct 2022 06:32:41 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6hWK7+8rd9rO7lIitBbQagZmHeoYGHf85H+An8HAzeeDg/QMN3sdYKwDlHULBSW+FdoUjviQ== X-Received: by 2002:a17:906:5dae:b0:78e:302f:4218 with SMTP id n14-20020a1709065dae00b0078e302f4218mr2585990ejv.22.1666099961155; Tue, 18 Oct 2022 06:32:41 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 36/53] target/i386: reimplement 0x0f 0xd8-0xdf, 0xe8-0xef, 0xf8-0xff, add AVX Date: Tue, 18 Oct 2022 15:30:25 +0200 Message-Id: <20221018133042.856368-37-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103372356100001 Content-Type: text/plain; charset="utf-8" These are more simple integer instructions present in both MMX and SSE/AVX, with no holes that were later occupied by newer instructions. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 28 ++++++++++++++++++++++++++++ target/i386/tcg/emit.c.inc | 32 ++++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 4 +++- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 8a749f33fd..a160a0b7a3 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -273,6 +273,34 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x6d] =3D X86_OP_ENTRY3(PUNPCKHQDQ, V,x, H,x, W,x, vex4 p_66 avx2_25= 6), [0x6e] =3D X86_OP_ENTRY3(MOVD_to, V,x, None,None, E,y, vex5 mmx p_0= 0_66), /* wrong dest Vy on SDM! */ [0x6f] =3D X86_OP_GROUP0(0F6F), + + /* Incorrectly missing from 2-17 */ + [0xd8] =3D X86_OP_ENTRY3(PSUBUSB, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xd9] =3D X86_OP_ENTRY3(PSUBUSW, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xda] =3D X86_OP_ENTRY3(PMINUB, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xdb] =3D X86_OP_ENTRY3(PAND, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xdc] =3D X86_OP_ENTRY3(PADDUSB, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xdd] =3D X86_OP_ENTRY3(PADDUSW, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xde] =3D X86_OP_ENTRY3(PMAXUB, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + [0xdf] =3D X86_OP_ENTRY3(PANDN, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), + + [0xe8] =3D X86_OP_ENTRY3(PSUBSB, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xe9] =3D X86_OP_ENTRY3(PSUBSW, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xea] =3D X86_OP_ENTRY3(PMINSW, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xeb] =3D X86_OP_ENTRY3(POR, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xec] =3D X86_OP_ENTRY3(PADDSB, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xed] =3D X86_OP_ENTRY3(PADDSW, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xee] =3D X86_OP_ENTRY3(PMAXSW, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + [0xef] =3D X86_OP_ENTRY3(PXOR, V,x, H,x, W,x, vex4 mmx avx2_256 p_= 00_66), + + [0xf8] =3D X86_OP_ENTRY3(PSUBB, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + [0xf9] =3D X86_OP_ENTRY3(PSUBW, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + [0xfa] =3D X86_OP_ENTRY3(PSUBD, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + [0xfb] =3D X86_OP_ENTRY3(PSUBQ, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + [0xfc] =3D X86_OP_ENTRY3(PADDB, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + [0xfd] =3D X86_OP_ENTRY3(PADDW, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + [0xfe] =3D X86_OP_ENTRY3(PADDD, V,x, H,x, W,x, vex4 mmx avx2_256 p_0= 0_66), + /* 0xff =3D UD0 */ }; =20 static void do_decode_0F(DisasContext *s, CPUX86State *env, X86OpEntry *en= try, uint8_t *b) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 8dbacc21ed..0d35a8627f 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -328,9 +328,31 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod decode->op[2].offset, vec_len, vec_len); = \ } =20 +BINARY_INT_GVEC(PADDB, tcg_gen_gvec_add, MO_8) +BINARY_INT_GVEC(PADDW, tcg_gen_gvec_add, MO_16) +BINARY_INT_GVEC(PADDD, tcg_gen_gvec_add, MO_32) +BINARY_INT_GVEC(PADDSB, tcg_gen_gvec_ssadd, MO_8) +BINARY_INT_GVEC(PADDSW, tcg_gen_gvec_ssadd, MO_16) +BINARY_INT_GVEC(PADDUSB, tcg_gen_gvec_usadd, MO_8) +BINARY_INT_GVEC(PADDUSW, tcg_gen_gvec_usadd, MO_16) +BINARY_INT_GVEC(PAND, tcg_gen_gvec_and, MO_64) BINARY_INT_GVEC(PCMPGTB, tcg_gen_gvec_cmp, TCG_COND_GT, MO_8) BINARY_INT_GVEC(PCMPGTW, tcg_gen_gvec_cmp, TCG_COND_GT, MO_16) BINARY_INT_GVEC(PCMPGTD, tcg_gen_gvec_cmp, TCG_COND_GT, MO_32) +BINARY_INT_GVEC(PMAXSW, tcg_gen_gvec_smax, MO_16) +BINARY_INT_GVEC(PMAXUB, tcg_gen_gvec_umax, MO_8) +BINARY_INT_GVEC(PMINSW, tcg_gen_gvec_smin, MO_16) +BINARY_INT_GVEC(PMINUB, tcg_gen_gvec_umin, MO_8) +BINARY_INT_GVEC(POR, tcg_gen_gvec_or, MO_64) +BINARY_INT_GVEC(PSUBB, tcg_gen_gvec_sub, MO_8) +BINARY_INT_GVEC(PSUBW, tcg_gen_gvec_sub, MO_16) +BINARY_INT_GVEC(PSUBD, tcg_gen_gvec_sub, MO_32) +BINARY_INT_GVEC(PSUBQ, tcg_gen_gvec_sub, MO_64) +BINARY_INT_GVEC(PSUBSB, tcg_gen_gvec_sssub, MO_8) +BINARY_INT_GVEC(PSUBSW, tcg_gen_gvec_sssub, MO_16) +BINARY_INT_GVEC(PSUBUSB, tcg_gen_gvec_ussub, MO_8) +BINARY_INT_GVEC(PSUBUSW, tcg_gen_gvec_ussub, MO_16) +BINARY_INT_GVEC(PXOR, tcg_gen_gvec_xor, MO_64) =20 =20 /* @@ -608,6 +630,16 @@ static void gen_MULX(DisasContext *s, CPUX86State *env= , X86DecodedInsn *decode) =20 } =20 +static void gen_PANDN(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + int vec_len =3D vector_len(s, decode); + + /* Careful, operand order is reversed! */ + tcg_gen_gvec_andc(MO_64, + decode->op[0].offset, decode->op[2].offset, + decode->op[1].offset, vec_len, vec_len); +} + static void gen_PDEP(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { MemOp ot =3D decode->op[1].ot; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 5133b8c23d..ff5c4bbb56 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4781,7 +4781,9 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #ifndef CONFIG_USER_ONLY use_new &=3D b <=3D limit; #endif - if (use_new && (b >=3D 0x160 && b <=3D 0x16f)) { + if (use_new && + ((b >=3D 0x160 && b <=3D 0x16f) || + (b >=3D 0x1d8 && b <=3D 0x1ff && (b & 8)))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102316; cv=none; d=zohomail.com; s=zohoarc; b=iDI9wpZnwszRRcJInCaWMIFWy9aTp0/OeCg6X9ysIBFs7HPdapxzPGvmJxjwWgRacccM9NSOB2Gce66y6zs5TGj1n28k6Bt+b/H7Rc6KBUeSLTouBgLDQVw/Qa48ozCAoNxM2/XioX8byX1DXM3dtKI6yLx10b8DgLwYogb0Uxg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102316; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=OEH6gyhwfKzrBdd0m2d8k+AjX9Air0NZ8MLQdft/4O8=; b=D900g09P8/SHtJ/3PntHae9wdONmqP62r4HewbDj0vp3r11s8jPU1IsQFWheohYZrrgapfYKYjQvSa+Vet2+eelJ4xrrB+9AFrRVySHGBS/ixUED//RuVlhWYMDHlMWJpTBxzIRdn0EwCJWLwvMw11ho+/u2Ab2sc9b/JuS/npM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102316982140.84561199940094; Tue, 18 Oct 2022 07:11:56 -0700 (PDT) Received: from localhost ([::1]:53940 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknJy-0008QL-Hr for importer@patchew.org; Tue, 18 Oct 2022 10:11:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50452) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Ri-8s for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:59822) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiD-0005Li-2I for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:56 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-230-PJkcDir-P4CydiBl2gmTpA-1; Tue, 18 Oct 2022 09:32:46 -0400 Received: by mail-ed1-f72.google.com with SMTP id h9-20020a05640250c900b0045cfb639f56so10969675edb.13 for ; Tue, 18 Oct 2022 06:32:46 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id l17-20020a1709063d3100b0073cf6ec3276sm7516775ejf.207.2022.10.18.06.32.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099970; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OEH6gyhwfKzrBdd0m2d8k+AjX9Air0NZ8MLQdft/4O8=; b=RzKeXzfP1n1C1blxwzotrMwpPHHEPWT3ojXd0lyai+vailm/UV7oMoOj4LBuvWWBvz5PIQ pdf6AGTPdPvCXy9UjQVYe9GrhGsqkhx5E9rsnpG0DaTzVuLdUJ7MBFWx7IIMu1vJjBDY3a R+jEH2qkOa6ht5gDAkW3nKNF90+6zcs= X-MC-Unique: PJkcDir-P4CydiBl2gmTpA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OEH6gyhwfKzrBdd0m2d8k+AjX9Air0NZ8MLQdft/4O8=; b=Ef2SAG9hKhYMxu8u93RNNuzID/HbcjZT4ikt1X2+RGbhxOtRbMMN4yOjoIe1otbhCo iLVRpy6XtVYRv5LL+PDaLGvEQGYft4TOFoCOeLE6PrtoqDVp63Zxit+ORnm9C0mhTVHp vkHu4Jcrl1EfCJNeptlDZgBiR7myWBkfgjJ8zX9ZYeFff1V4iGLAiObKPhzDKBMkZ5+/ W7UykTtt2oHVbcn13nL08UI9W7ErX7CilEwIasDSTAvIDH0ta1fwHbhzkV/XcFO4TxxX okfm19qZhOn7HlqKZIBkPIsRjnxFJvWM9krtdqs6VgAScq+g+IImhujO66GF4FcN6ytm pLCQ== X-Gm-Message-State: ACrzQf3IPNzBikKLA6DyyTaH89urPCLbGTF54vXky2Lbm+Y7V0UCGkA4 DVy748f7hnMWdogGNV2aEbJcoMp4VMWnEBykI5Na9MiJCPxEV1Al6FwTix7x7tbfR9Q4HOeB9E1 kuEr/gDTzudGgW6g5FUwGPJQ41VM/X3cB2AGU4d7c3gAQOVzQi/gpSRp9uAEImos5ZiQ= X-Received: by 2002:a17:906:99c1:b0:6fe:b01d:134 with SMTP id s1-20020a17090699c100b006feb01d0134mr2427197ejn.598.1666099964791; Tue, 18 Oct 2022 06:32:44 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4cfEpBW/GTnhrtkb6oj4wYMFOtjJ/VG1Di4AMqX3s7GrZMOMDBtiEFe/zVtvVqwbz9SWb3ZA== X-Received: by 2002:a17:906:99c1:b0:6fe:b01d:134 with SMTP id s1-20020a17090699c100b006feb01d0134mr2427166ejn.598.1666099964318; Tue, 18 Oct 2022 06:32:44 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 37/53] target/i386: reimplement 0x0f 0x50-0x5f, add AVX Date: Tue, 18 Oct 2022 15:30:26 +0200 Message-Id: <20221018133042.856368-38-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102318703100003 Content-Type: text/plain; charset="utf-8" These are mostly floating-point SSE operations. The odd ones out are MOVMSK and CVTxx2yy, the others are straightforward. Unary operations are a bit special in AVX because they have 2 operands for PD/PS operands (VEX.vvvv must be 1111b), and 3 operands for SD/SS. They are handled using X86_OP_GROUP3 for compactness. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 43 ++++++++ target/i386/tcg/emit.c.inc | 166 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 2 +- 3 files changed, 210 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index a160a0b7a3..b20c38ca73 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -252,7 +252,41 @@ static void decode_0F3A(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui *entry =3D opcodes_0F3A[*b]; } =20 +static void decode_sse_unary(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) +{ + if (!(s->prefix & (PREFIX_REPZ | PREFIX_REPNZ))) { + entry->op1 =3D X86_TYPE_None; + entry->s1 =3D X86_SIZE_None; + } + switch (*b) { + case 0x51: entry->gen =3D gen_VSQRT; break; + case 0x52: entry->gen =3D gen_VRSQRT; break; + case 0x53: entry->gen =3D gen_VRCP; break; + case 0x5A: entry->gen =3D gen_VCVTfp2fp; break; + } +} + +static void decode_0F5B(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F5B[4] =3D { + X86_OP_ENTRY2(VCVTDQ2PS, V,x, W,x, vex2), + X86_OP_ENTRY2(VCVTPS2DQ, V,x, W,x, vex2), + X86_OP_ENTRY2(VCVTTPS2DQ, V,x, W,x, vex2), + {}, + }; + *entry =3D *decode_by_prefix(s, opcodes_0F5B); +} + static const X86OpEntry opcodes_0F[256] =3D { + [0x50] =3D X86_OP_ENTRY3(MOVMSK, G,y, None,None, U,x, vex7 p_00_66= ), + [0x51] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x52] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex5 p_00_f3), + [0x53] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex5 p_00_f3), + [0x54] =3D X86_OP_ENTRY3(PAND, V,x, H,x, W,x, vex4 p_00_66), /*= vand */ + [0x55] =3D X86_OP_ENTRY3(PANDN, V,x, H,x, W,x, vex4 p_00_66), /*= vandn */ + [0x56] =3D X86_OP_ENTRY3(POR, V,x, H,x, W,x, vex4 p_00_66), /*= vor */ + [0x57] =3D X86_OP_ENTRY3(PXOR, V,x, H,x, W,x, vex4 p_00_66), /*= vxor */ + [0x60] =3D X86_OP_ENTRY3(PUNPCKLBW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), [0x61] =3D X86_OP_ENTRY3(PUNPCKLWD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), [0x62] =3D X86_OP_ENTRY3(PUNPCKLDQ, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), @@ -265,6 +299,15 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x38] =3D X86_OP_GROUP0(0F38), [0x3a] =3D X86_OP_GROUP0(0F3A), =20 + [0x58] =3D X86_OP_ENTRY3(VADD, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x59] =3D X86_OP_ENTRY3(VMUL, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x5a] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex3 p_00_66_f3_f2= ), + [0x5b] =3D X86_OP_GROUP0(0F5B), + [0x5c] =3D X86_OP_ENTRY3(VSUB, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x5d] =3D X86_OP_ENTRY3(VMIN, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x5e] =3D X86_OP_ENTRY3(VDIV, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x5f] =3D X86_OP_ENTRY3(VMAX, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), + [0x68] =3D X86_OP_ENTRY3(PUNPCKHBW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), [0x69] =3D X86_OP_ENTRY3(PUNPCKHWD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), [0x6a] =3D X86_OP_ENTRY3(PUNPCKHDQ, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 0d35a8627f..e063d2fe04 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -318,6 +318,131 @@ static void gen_store_sse(DisasContext *s, X86Decoded= Insn *decode, int src_ofs) } } =20 +/* + * 00 =3D v*ps Vps, Hps, Wpd + * 66 =3D v*pd Vpd, Hpd, Wps + * f3 =3D v*ss Vss, Hss, Wps + * f2 =3D v*sd Vsd, Hsd, Wps + */ +static inline void gen_unary_fp_sse(DisasContext *s, CPUX86State *env, X86= DecodedInsn *decode, + SSEFunc_0_epp pd_xmm, SSEFunc_0_epp ps_xmm, + SSEFunc_0_epp pd_ymm, SSEFunc_0_epp ps_ymm, + SSEFunc_0_eppp sd, SSEFunc_0_eppp ss) +{ + if ((s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) !=3D 0) { + SSEFunc_0_eppp fn =3D s->prefix & PREFIX_REPZ ? ss : sd; + if (!fn) { + gen_illegal_opcode(s); + return; + } + fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); + } else { + SSEFunc_0_epp ps, pd, fn; + ps =3D s->vex_l ? ps_ymm : ps_xmm; + pd =3D s->vex_l ? pd_ymm : pd_xmm; + fn =3D s->prefix & PREFIX_DATA ? pd : ps; + if (!fn) { + gen_illegal_opcode(s); + return; + } + fn(cpu_env, OP_PTR0, OP_PTR2); + } +} +#define UNARY_FP_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_unary_fp_sse(s, env, decode, = \ + gen_helper_##lname##pd_xmm, = \ + gen_helper_##lname##ps_xmm, = \ + gen_helper_##lname##pd_ymm, = \ + gen_helper_##lname##ps_ymm, = \ + gen_helper_##lname##sd, = \ + gen_helper_##lname##ss); = \ +} +UNARY_FP_SSE(VSQRT, sqrt) + +/* + * 00 =3D v*ps Vps, Hps, Wpd + * 66 =3D v*pd Vpd, Hpd, Wps + * f3 =3D v*ss Vss, Hss, Wps + * f2 =3D v*sd Vsd, Hsd, Wps + */ +static inline void gen_fp_sse(DisasContext *s, CPUX86State *env, X86Decode= dInsn *decode, + SSEFunc_0_eppp pd_xmm, SSEFunc_0_eppp ps_xmm, + SSEFunc_0_eppp pd_ymm, SSEFunc_0_eppp ps_ymm, + SSEFunc_0_eppp sd, SSEFunc_0_eppp ss) +{ + SSEFunc_0_eppp ps, pd, fn; + if ((s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) !=3D 0) { + fn =3D s->prefix & PREFIX_REPZ ? ss : sd; + } else { + ps =3D s->vex_l ? ps_ymm : ps_xmm; + pd =3D s->vex_l ? pd_ymm : pd_xmm; + fn =3D s->prefix & PREFIX_DATA ? pd : ps; + } + if (fn) { + fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); + } else { + gen_illegal_opcode(s); + } +} +#define FP_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_fp_sse(s, env, decode, = \ + gen_helper_##lname##pd_xmm, = \ + gen_helper_##lname##ps_xmm, = \ + gen_helper_##lname##pd_ymm, = \ + gen_helper_##lname##ps_ymm, = \ + gen_helper_##lname##sd, = \ + gen_helper_##lname##ss); = \ +} +FP_SSE(VADD, add) +FP_SSE(VMUL, mul) +FP_SSE(VSUB, sub) +FP_SSE(VMIN, min) +FP_SSE(VDIV, div) +FP_SSE(VMAX, max) + +/* + * 00 =3D v*ps Vps, Wpd + * f3 =3D v*ss Vss, Wps + */ +static inline void gen_unary_fp32_sse(DisasContext *s, CPUX86State *env, X= 86DecodedInsn *decode, + SSEFunc_0_epp ps_xmm, + SSEFunc_0_epp ps_ymm, + SSEFunc_0_eppp ss) +{ + if ((s->prefix & (PREFIX_DATA | PREFIX_REPNZ)) !=3D 0) { + goto illegal_op; + } else if (s->prefix & PREFIX_REPZ) { + if (!ss) { + goto illegal_op; + } + ss(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); + } else { + SSEFunc_0_epp fn =3D s->vex_l ? ps_ymm : ps_xmm; + if (!fn) { + goto illegal_op; + } + fn(cpu_env, OP_PTR0, OP_PTR2); + } + return; + +illegal_op: + gen_illegal_opcode(s); +} +#define UNARY_FP32_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_unary_fp32_sse(s, env, decode, = \ + gen_helper_##lname##ps_xmm, = \ + gen_helper_##lname##ps_ymm, = \ + gen_helper_##lname##ss); = \ +} +UNARY_FP32_SSE(VRSQRT, rsqrt) +UNARY_FP32_SSE(VRCP, rcp) + #define BINARY_INT_GVEC(uname, func, ...) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ { = \ @@ -413,6 +538,29 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod BINARY_INT_SSE(PUNPCKLQDQ, punpcklqdq) BINARY_INT_SSE(PUNPCKHQDQ, punpckhqdq) =20 +static inline void gen_unary_int_sse(DisasContext *s, CPUX86State *env, X8= 6DecodedInsn *decode, + SSEFunc_0_epp xmm, SSEFunc_0_epp ymm) +{ + if (!s->vex_l) { + xmm(cpu_env, OP_PTR0, OP_PTR2); + } else { + ymm(cpu_env, OP_PTR0, OP_PTR2); + } +} + +#define UNARY_INT_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_unary_int_sse(s, env, decode, = \ + gen_helper_##lname##_xmm, = \ + gen_helper_##lname##_ymm); = \ +} + +UNARY_INT_SSE(VCVTDQ2PS, cvtdq2ps) +UNARY_INT_SSE(VCVTPS2DQ, cvtps2dq) +UNARY_INT_SSE(VCVTTPS2DQ, cvttps2dq) + + static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_= op) { TCGv carry_in =3D NULL; @@ -607,6 +755,16 @@ static void gen_MOVDQ(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) gen_store_sse(s, decode, decode->op[2].offset); } =20 +static void gen_MOVMSK(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + typeof(gen_helper_movmskps_ymm) *ps, *pd, *fn; + ps =3D s->vex_l ? gen_helper_movmskps_ymm : gen_helper_movmskps_xmm; + pd =3D s->vex_l ? gen_helper_movmskpd_ymm : gen_helper_movmskpd_xmm; + fn =3D s->prefix & PREFIX_DATA ? pd : ps; + fn(s->tmp2_i32, cpu_env, OP_PTR2); + tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); +} + static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { MemOp ot =3D decode->op[0].ot; @@ -707,3 +865,11 @@ static void gen_SHRX(DisasContext *s, CPUX86State *env= , X86DecodedInsn *decode) } tcg_gen_shr_tl(s->T0, s->T0, s->T1); } + +static void gen_VCVTfp2fp(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + gen_unary_fp_sse(s, env, decode, + gen_helper_cvtpd2ps_xmm, gen_helper_cvtps2pd_xmm, + gen_helper_cvtpd2ps_ymm, gen_helper_cvtps2pd_ymm, + gen_helper_cvtsd2ss, gen_helper_cvtss2sd); +} diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index ff5c4bbb56..dd831d7a1a 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4782,7 +4782,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) use_new &=3D b <=3D limit; #endif if (use_new && - ((b >=3D 0x160 && b <=3D 0x16f) || + ((b >=3D 0x150 && b <=3D 0x16f) || (b >=3D 0x1d8 && b <=3D 0x1ff && (b & 8)))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102225; cv=none; d=zohomail.com; s=zohoarc; b=LDqiLB8abL/m6st6PnTM+vhrQaUhhUNT+WyKVqfYLvRB+K5rOySZCXGv9kqr+jGLCygwEX0HIPIclmpkAcOQ4lXQKKpbQlAFek1wIyqCGrQz5v9jMKHDMebCwQEdBEYf7kvLVq3WIaVmcF6eWcIgCHVkPUFMqq6OcJ9osA4jRKY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102225; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Jhi/tpCe2fNA8vwq3Fsz6E2h5TJeeTrMTZYzMbcMGQg=; b=eiM5higo0BQXQ2hY/0r4pt3Nv4s4/QFKIPQd1/56QzZ3L0JRUv34zDQMoTw2jNs0ametVOElrb1c6tipdpEE6soSCBVUN//tot5ra8RX2pleVUyQBjTWKALw4FXd5vAgMYFiJUl4+tFaeeQzBhlU0N8BZmyj5+dBqLa7Hj801ZM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102225216262.3526630538573; Tue, 18 Oct 2022 07:10:25 -0700 (PDT) Received: from localhost ([::1]:47716 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknIS-0005Mw-1h for importer@patchew.org; Tue, 18 Oct 2022 10:10:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50450) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Rh-71 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:56198) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiE-0005Lo-BJ for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:56 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-552-zLy1sNx2MsKdJBGnD1sDCg-1; Tue, 18 Oct 2022 09:32:49 -0400 Received: by mail-ed1-f72.google.com with SMTP id dz9-20020a0564021d4900b0045d9a3aded4so4287912edb.22 for ; Tue, 18 Oct 2022 06:32:49 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id q5-20020aa7d445000000b0044bfdbd8a33sm8863645edr.88.2022.10.18.06.32.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099971; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Jhi/tpCe2fNA8vwq3Fsz6E2h5TJeeTrMTZYzMbcMGQg=; b=V7AoJlRvwEHPylz97uMY2bRaAM5sLmh7JJiJocCQY3zcdffLPvq79rdeJmM+Wtww/nJCC1 2YsytG5fZcwlJSbcfy1oNMFLxt0t5kozlN1CaVXiVc9X0O3biiitktgDiH0ljO+JVCRLYD Mw8DWm/sUowuMJPwKB9RbdK6UJzlkuU= X-MC-Unique: zLy1sNx2MsKdJBGnD1sDCg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Jhi/tpCe2fNA8vwq3Fsz6E2h5TJeeTrMTZYzMbcMGQg=; b=kv1vJDn3j369OOO1Yo5workMjyBLOnU1mvFDUBrkUnEm3bFSKbwgsgAZRDVyHRYFz9 mu6GPjSsnZaxk3QkQ3m9FdfJcGivXhcEQQRK3Se/76A6MJwkOPl+LJT7xM9R9XUcND7s isMZErfJnW+6RBe6Lvd7vHv4hxZOWfOaW5sNv/reTxXAxoMBilLzj2Xy0w4aMxaENWk7 J/KUV3HAP4CXKXfNBJsD+muqp4pl2zdQ2kTKKPeQbXKrDmDavcQn5sQiH2ttAWToXLNb 7U8RxabtKlmfTBqliKVNmPOPbjQr/IGfUSvzra28sOYtkryqrWehGyttErA0/Szk9IlM B5zQ== X-Gm-Message-State: ACrzQf2qxmHZm983//YDiKQDm/8m3AKiFgFlqr4HNcFLAEtFz7579ZEN FipMv155K8riXfnyPKEt1kR1zsTuk2LL++e3hCoBlFn2EgpIyEyIywrDWnbyllYr/ZZEcPqDDRK O26iWRcq3qxD/iG8U4VThQPINsfXHO9WKwKq/Oos61mOt0zNSkD67PqoGE2YA6EDB+CE= X-Received: by 2002:aa7:c58a:0:b0:459:1511:6cff with SMTP id g10-20020aa7c58a000000b0045915116cffmr2663722edq.27.1666099967678; Tue, 18 Oct 2022 06:32:47 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7SQyej8/OIb1YTHXXYubkbQZxOFgo6ybUjpOTVLwpxNIJjj9cU/L+xkdppfXhpF5dWALJtNw== X-Received: by 2002:aa7:c58a:0:b0:459:1511:6cff with SMTP id g10-20020aa7c58a000000b0045915116cffmr2663691edq.27.1666099967165; Tue, 18 Oct 2022 06:32:47 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 38/53] target/i386: reimplement 0x0f 0x78-0x7f, add AVX Date: Tue, 18 Oct 2022 15:30:27 +0200 Message-Id: <20221018133042.856368-39-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102227208100001 Content-Type: text/plain; charset="utf-8" These are a mixed batch, including the first two horizontal (66 and F2 only) operations, more moves, and SSE4a extract/insert. Because SSE4a is pretty rare, I chose to leave the helper as they are, but it is possible to unify them by loading index and length from the source XMM register and generating deposit or extract TCG ops. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 51 +++++++++++++++++++ target/i386/tcg/emit.c.inc | 86 ++++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 1 + 3 files changed, 138 insertions(+) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index b20c38ca73..90dac4c53e 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -168,6 +168,50 @@ static void decode_0F6F(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui *entry =3D *decode_by_prefix(s, opcodes_0F6F); } =20 +static void decode_0F78(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F78[4] =3D { + {}, + X86_OP_ENTRY3(EXTRQ_i, V,x, None,None, I,w, cpuid(SSE4A)), + {}, + X86_OP_ENTRY3(INSERTQ_i, V,x, U,x, I,w, cpuid(SSE4A)), + }; + *entry =3D *decode_by_prefix(s, opcodes_0F78); +} + +static void decode_0F79(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + if (s->prefix & PREFIX_REPNZ) { + entry->gen =3D gen_INSERTQ_r; + } else if (s->prefix & PREFIX_DATA) { + entry->gen =3D gen_EXTRQ_r; + } else { + entry->gen =3D NULL; + }; +} + +static void decode_0F7E(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F7E[4] =3D { + X86_OP_ENTRY3(MOVD_from, E,y, None,None, P,y, vex5 mmx), + X86_OP_ENTRY3(MOVD_from, E,y, None,None, V,y, vex5), + X86_OP_ENTRY3(MOVQ, V,x, None,None, W,q, vex5), /* wrong de= st Vy on SDM! */ + {}, + }; + *entry =3D *decode_by_prefix(s, opcodes_0F7E); +} + +static void decode_0F7F(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F7F[4] =3D { + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1 mmx), /* movq= */ + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1), /* movdqa */ + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex4_unal), /* mov= dqu */ + {}, + }; + *entry =3D *decode_by_prefix(s, opcodes_0F7F); +} + static const X86OpEntry opcodes_0F38_00toEF[240] =3D { }; =20 @@ -317,6 +361,13 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x6e] =3D X86_OP_ENTRY3(MOVD_to, V,x, None,None, E,y, vex5 mmx p_0= 0_66), /* wrong dest Vy on SDM! */ [0x6f] =3D X86_OP_GROUP0(0F6F), =20 + [0x78] =3D X86_OP_GROUP0(0F78), + [0x79] =3D X86_OP_GROUP2(0F79, V,x, U,x, cpuid(SSE4A)), + [0x7c] =3D X86_OP_ENTRY3(VHADD, V,x, H,x, W,x, vex2 cpuid(SSE3) = p_66_f2), + [0x7d] =3D X86_OP_ENTRY3(VHSUB, V,x, H,x, W,x, vex2 cpuid(SSE3) = p_66_f2), + [0x7e] =3D X86_OP_GROUP0(0F7E), + [0x7f] =3D X86_OP_GROUP0(0F7F), + /* Incorrectly missing from 2-17 */ [0xd8] =3D X86_OP_ENTRY3(PSUBUSB, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), [0xd9] =3D X86_OP_ENTRY3(PSUBUSW, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index e063d2fe04..7e13fb5869 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -443,6 +443,30 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod UNARY_FP32_SSE(VRSQRT, rsqrt) UNARY_FP32_SSE(VRCP, rcp) =20 +/* + * 66 =3D v*pd Vpd, Hpd, Wpd + * f2 =3D v*ps Vps, Hps, Wps + */ +static inline void gen_horizontal_fp_sse(DisasContext *s, CPUX86State *env= , X86DecodedInsn *decode, + SSEFunc_0_eppp pd_xmm, SSEFunc_0_= eppp ps_xmm, + SSEFunc_0_eppp pd_ymm, SSEFunc_0_= eppp ps_ymm) +{ + SSEFunc_0_eppp ps, pd, fn; + ps =3D s->vex_l ? ps_ymm : ps_xmm; + pd =3D s->vex_l ? pd_ymm : pd_xmm; + fn =3D s->prefix & PREFIX_DATA ? pd : ps; + fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); +} +#define HORIZONTAL_FP_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_horizontal_fp_sse(s, env, decode, = \ + gen_helper_##lname##pd_xmm, gen_helper_##lname##= ps_xmm, \ + gen_helper_##lname##pd_ymm, gen_helper_##lname##= ps_ymm); \ +} +HORIZONTAL_FP_SSE(VHADD, hadd) +HORIZONTAL_FP_SSE(VHSUB, hsub) + #define BINARY_INT_GVEC(uname, func, ...) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ { = \ @@ -716,6 +740,32 @@ static void gen_CRC32(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) gen_helper_crc32(s->T0, s->tmp2_i32, s->T1, tcg_constant_i32(8 << ot)); } =20 +static void gen_EXTRQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + TCGv_i32 length =3D tcg_constant_i32(decode->immediate & 63); + TCGv_i32 index =3D tcg_constant_i32((decode->immediate >> 8) & 63); + + gen_helper_extrq_i(cpu_env, OP_PTR0, index, length); +} + +static void gen_EXTRQ_r(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + gen_helper_extrq_r(cpu_env, OP_PTR0, OP_PTR2); +} + +static void gen_INSERTQ_i(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + TCGv_i32 length =3D tcg_constant_i32(decode->immediate & 63); + TCGv_i32 index =3D tcg_constant_i32((decode->immediate >> 8) & 63); + + gen_helper_insertq_i(cpu_env, OP_PTR0, OP_PTR1, index, length); +} + +static void gen_INSERTQ_r(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + gen_helper_insertq_r(cpu_env, OP_PTR0, OP_PTR2); +} + static void gen_MOVBE(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) { MemOp ot =3D decode->op[0].ot; @@ -728,6 +778,24 @@ static void gen_MOVBE(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) } } =20 +static void gen_MOVD_from(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + MemOp ot =3D decode->op[2].ot; + + switch (ot) { + case MO_32: +#ifdef TARGET_X86_64 + tcg_gen_ld32u_tl(s->T0, cpu_env, decode->op[2].offset); + break; + case MO_64: +#endif + tcg_gen_ld_tl(s->T0, cpu_env, decode->op[2].offset); + break; + default: + abort(); + } +} + static void gen_MOVD_to(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) { MemOp ot =3D decode->op[2].ot; @@ -765,6 +833,24 @@ static void gen_MOVMSK(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); } =20 +static void gen_MOVQ(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + int vec_len =3D vector_len(s, decode); + int lo_ofs =3D vector_elem_offset(&decode->op[0], MO_64, 0); + + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[2].offset); + /* + * tcg_gen_gvec_dup_i64(MO_64, op0.offset, 8, vec_len, s->tmp1_64) wou= ld + * seem to work, but it does not on big-endian platforms; the cleared = parts + * are always at higher addresses, but cross-endian emulation inverts = the + * byte order so that the cleared parts need to be at *lower* addresse= s. + * Because oprsz is 8, we see this here even for SSE; but more in gene= ral, + * it disqualifies using oprsz < maxsz to emulate VEX128. + */ + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len, 0); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, lo_ofs); +} + static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { MemOp ot =3D decode->op[0].ot; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index dd831d7a1a..53609473bf 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4783,6 +4783,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #endif if (use_new && ((b >=3D 0x150 && b <=3D 0x16f) || + (b >=3D 0x178 && b <=3D 0x17f) || (b >=3D 0x1d8 && b <=3D 0x1ff && (b & 8)))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102345; cv=none; d=zohomail.com; s=zohoarc; b=iGBxZIxAn6/EpyyvRHBZwAjFSN8lb7GCeV/nZIIFZmXRGQgYXkweBkKtYdVa4uZOckswo7GcIJ954nS8fcsBCvxE5P7EnaNEiCXcM6C1xBM5s3tNkraLrAegt1vC+ykx6fpTtossypXGecQdKoLTG8Naic91fd5dliJDx1l71dM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102345; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=issA6jNYtPFTip9J221iwsNRmNFH92n23F2KCH+K71k=; b=MER2rnrV/kMWNmWnJX7qxQSENszgtFQkrrFfdeOn+SLyvLDyaKycyYF67c7TWu8dHxbqWaC5FVmn5RP+XXm4J1Cra9V3avrUlNoF6f7neZ/T//AcoxY2/KD9V8dKeR584J/PcWF82T1lxSc5zhajXmQ4CINo9bAuKlE/TrueB7E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102345815280.04539012575754; Tue, 18 Oct 2022 07:12:25 -0700 (PDT) Received: from localhost ([::1]:48234 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknKR-0000bs-7N for importer@patchew.org; Tue, 18 Oct 2022 10:12:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50454) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Rk-33 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:42758) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiE-0005NB-DX for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:58 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-608-UhQe3O9KPrub2u38y8iFzg-1; Tue, 18 Oct 2022 09:32:52 -0400 Received: by mail-ed1-f69.google.com with SMTP id z11-20020a056402274b00b0045ca9510fc8so11922096edd.23 for ; Tue, 18 Oct 2022 06:32:52 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id q6-20020a17090676c600b0078c47463277sm7640926ejn.96.2022.10.18.06.32.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099973; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=issA6jNYtPFTip9J221iwsNRmNFH92n23F2KCH+K71k=; b=Sm00rvoJaN3m/+l6brzF9jCyOqQb036gRhG5YUOT5K2RBpgdWDef2PfUphloPH9TK3BYxT JcMqU6QzrZ8FLFHeVFnfxJeLEK6PfnHCqBgfn6SqLX8ieJh9Tkoz94LQXLKj/olXtYU1w5 Vz8hyaoZX35K4H13oMviSPZ45x1fB38= X-MC-Unique: UhQe3O9KPrub2u38y8iFzg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=issA6jNYtPFTip9J221iwsNRmNFH92n23F2KCH+K71k=; b=3A0NasuFBTTItQ9daQmUL1wPVn77wLJiLeeb/oo5OPDNWmwZU9nKl2GaUtzFggPpKg TMJaxwdjqvo5R5CdjpXsyZdexVZ7CIbsYg0UyNLlxG/h8Oqmrg6oPocCEUIMofJ4G6KC atlOyNPTQSfxvA53FluavgrCy+lgszbzWv5dqSKeIlD6OGXKVz8HvzeTtEJgyFAy/Rcq u6VXaWqLor2uYQESOBTLSKr+MaWgmgARlTB08Dp2wE9QoLIPNf4Kn4n5APkPdJ5daWp0 C3b+PXvqxRrzLkaDHBcnvca0gHyCdeAZNW2iqLBsIjpx4PPWRhInZxpP4HiEKmRyqU3P qVmA== X-Gm-Message-State: ACrzQf2egM6f7zp49VRsrGSABnHh6kFLo7YVFGHp+CgCBznCtCa8KNGk 7eukqax7Pbj9jQO/I8Dg0+RKki5MI9BB4T4rYKJi0jngaAp/kO2qYcIMxq37KruFLAs+osrdEuY Lj5o1Xky1RhWXwLFidN0jSF/0ZjM46MR9ivjouAs3rkCqIxQhbYY6d7Otfxa2pKXO5hE= X-Received: by 2002:aa7:c04f:0:b0:457:1b08:d056 with SMTP id k15-20020aa7c04f000000b004571b08d056mr2794010edo.146.1666099970547; Tue, 18 Oct 2022 06:32:50 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6FG6NLJmMFdCv67XadF/0WrDCJigQXbEMclLMX+72UCQ0tRZA8lqiywlEsckQpKZ8t23TOKQ== X-Received: by 2002:aa7:c04f:0:b0:457:1b08:d056 with SMTP id k15-20020aa7c04f000000b004571b08d056mr2793978edo.146.1666099970119; Tue, 18 Oct 2022 06:32:50 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 39/53] target/i386: reimplement 0x0f 0x70-0x77, add AVX Date: Tue, 18 Oct 2022 15:30:28 +0200 Message-Id: <20221018133042.856368-40-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102346754100001 Content-Type: text/plain; charset="utf-8" This includes shifts by immediate, which use bits 3-5 of the ModRM byte as an opcode extension. With the exception of 128-bit shifts, they are implemented using gvec. This also covers VZEROALL and VZEROUPPER, which use the same opcode as EMMS. If we were wanting to optimize out gen_clear_ymmh then this would be one of the starting points. The implementation of the VZEROALL and VZEROUPPER helpers is by Paul Brook. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 92 +++++++++++++- target/i386/tcg/emit.c.inc | 204 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 3 +- 3 files changed, 293 insertions(+), 6 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 90dac4c53e..306a9f344e 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -157,6 +157,58 @@ static void decode_group17(DisasContext *s, CPUX86Stat= e *env, X86OpEntry *entry, entry->gen =3D group17_gen[op]; } =20 +static void decode_group12(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + static const X86OpEntry opcodes_group12[8] =3D { + {}, + {}, + X86_OP_ENTRY3(PSRLW_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + {}, + X86_OP_ENTRY3(PSRAW_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + {}, + X86_OP_ENTRY3(PSLLW_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + {}, + }; + + int op =3D (get_modrm(s, env) >> 3) & 7; + *entry =3D opcodes_group12[op]; +} + +static void decode_group13(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + static const X86OpEntry opcodes_group13[8] =3D { + {}, + {}, + X86_OP_ENTRY3(PSRLD_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + {}, + X86_OP_ENTRY3(PSRAD_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + {}, + X86_OP_ENTRY3(PSLLD_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + {}, + }; + + int op =3D (get_modrm(s, env) >> 3) & 7; + *entry =3D opcodes_group13[op]; +} + +static void decode_group14(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + static const X86OpEntry opcodes_group14[8] =3D { + /* grp14 */ + {}, + {}, + X86_OP_ENTRY3(PSRLQ_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + X86_OP_ENTRY3(PSRLDQ_i, H,x, U,x, I,b, vex7 avx2_256 p_66), + {}, + {}, + X86_OP_ENTRY3(PSLLQ_i, H,x, U,x, I,b, vex7 mmx avx2_256 p_00_66), + X86_OP_ENTRY3(PSLLDQ_i, H,x, U,x, I,b, vex7 avx2_256 p_66), + }; + + int op =3D (get_modrm(s, env) >> 3) & 7; + *entry =3D opcodes_group14[op]; +} + static void decode_0F6F(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) { static const X86OpEntry opcodes_0F6F[4] =3D { @@ -168,6 +220,31 @@ static void decode_0F6F(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui *entry =3D *decode_by_prefix(s, opcodes_0F6F); } =20 +static void decode_0F70(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry pshufw[4] =3D { + X86_OP_ENTRY3(PSHUFW, P,q, Q,q, I,b, vex4 mmx), + X86_OP_ENTRY3(PSHUFD, V,x, W,x, I,b, vex4 avx2_256), + X86_OP_ENTRY3(PSHUFHW, V,x, W,x, I,b, vex4 avx2_256), + X86_OP_ENTRY3(PSHUFLW, V,x, W,x, I,b, vex4 avx2_256), + }; + + *entry =3D *decode_by_prefix(s, pshufw); +} + +static void decode_0F77(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + if (!(s->prefix & PREFIX_VEX)) { + entry->gen =3D gen_EMMS; + } else if (!s->vex_l) { + entry->gen =3D gen_VZEROUPPER; + entry->vex_class =3D 8; + } else { + entry->gen =3D gen_VZEROALL; + entry->vex_class =3D 8; + } +} + static void decode_0F78(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) { static const X86OpEntry opcodes_0F78[4] =3D { @@ -340,6 +417,15 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x66] =3D X86_OP_ENTRY3(PCMPGTD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), [0x67] =3D X86_OP_ENTRY3(PACKUSWB, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), =20 + [0x70] =3D X86_OP_GROUP0(0F70), + [0x71] =3D X86_OP_GROUP0(group12), + [0x72] =3D X86_OP_GROUP0(group13), + [0x73] =3D X86_OP_GROUP0(group14), + [0x74] =3D X86_OP_ENTRY3(PCMPEQB, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x75] =3D X86_OP_ENTRY3(PCMPEQW, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x76] =3D X86_OP_ENTRY3(PCMPEQD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), + [0x77] =3D X86_OP_GROUP0(0F77), + [0x38] =3D X86_OP_GROUP0(0F38), [0x3a] =3D X86_OP_GROUP0(0F3A), =20 @@ -941,10 +1027,8 @@ static bool validate_vex(DisasContext *s, X86DecodedI= nsn *decode) } break; case 8: - if (!(s->prefix & PREFIX_VEX)) { - /* EMMS */ - return true; - } + /* Non-VEX case handled in decode_0F77. */ + assert(s->prefix & PREFIX_VEX); if (!(s->flags & HF_AVX_EN_MASK)) { goto illegal; } diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 7e13fb5869..0d437686e6 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -19,6 +19,11 @@ * License along with this library; if not, see . */ =20 +static inline TCGv_i32 tcg_constant8u_i32(uint8_t val) +{ + return tcg_constant_i32(val); +} + static void gen_NM_exception(DisasContext *s) { gen_exception(s, EXCP07_PREX); @@ -485,6 +490,9 @@ BINARY_INT_GVEC(PADDSW, tcg_gen_gvec_ssadd, MO_16) BINARY_INT_GVEC(PADDUSB, tcg_gen_gvec_usadd, MO_8) BINARY_INT_GVEC(PADDUSW, tcg_gen_gvec_usadd, MO_16) BINARY_INT_GVEC(PAND, tcg_gen_gvec_and, MO_64) +BINARY_INT_GVEC(PCMPEQB, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_8) +BINARY_INT_GVEC(PCMPEQD, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_32) +BINARY_INT_GVEC(PCMPEQW, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_16) BINARY_INT_GVEC(PCMPGTB, tcg_gen_gvec_cmp, TCG_COND_GT, MO_8) BINARY_INT_GVEC(PCMPGTW, tcg_gen_gvec_cmp, TCG_COND_GT, MO_16) BINARY_INT_GVEC(PCMPGTD, tcg_gen_gvec_cmp, TCG_COND_GT, MO_32) @@ -585,6 +593,29 @@ UNARY_INT_SSE(VCVTPS2DQ, cvtps2dq) UNARY_INT_SSE(VCVTTPS2DQ, cvttps2dq) =20 =20 +static inline void gen_unary_imm_sse(DisasContext *s, CPUX86State *env, X8= 6DecodedInsn *decode, + SSEFunc_0_ppi xmm, SSEFunc_0_ppi ymm) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + if (!s->vex_l) { + xmm(OP_PTR0, OP_PTR1, imm); + } else { + ymm(OP_PTR0, OP_PTR1, imm); + } +} + +#define UNARY_IMM_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_unary_imm_sse(s, env, decode, = \ + gen_helper_##lname##_xmm, = \ + gen_helper_##lname##_ymm); = \ +} + +UNARY_IMM_SSE(PSHUFD, pshufd) +UNARY_IMM_SSE(PSHUFHW, pshufhw) +UNARY_IMM_SSE(PSHUFLW, pshuflw) + static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_= op) { TCGv carry_in =3D NULL; @@ -740,6 +771,11 @@ static void gen_CRC32(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) gen_helper_crc32(s->T0, s->tmp2_i32, s->T1, tcg_constant_i32(8 << ot)); } =20 +static void gen_EMMS(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + gen_helper_emms(cpu_env); +} + static void gen_EXTRQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) { TCGv_i32 length =3D tcg_constant_i32(decode->immediate & 63); @@ -902,6 +938,154 @@ static void gen_PEXT(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) gen_helper_pext(s->T0, s->T0, s->T1); } =20 +static void gen_PSHUFW(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + gen_helper_pshufw_mmx(OP_PTR0, OP_PTR1, imm); +} + +static void gen_PSRLW_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 16) { + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else { + tcg_gen_gvec_shri(MO_16, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); + } +} + +static void gen_PSLLW_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 16) { + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else { + tcg_gen_gvec_shli(MO_16, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); + } +} + +static void gen_PSRAW_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 16) { + decode->immediate =3D 15; + } + tcg_gen_gvec_sari(MO_16, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); +} + +static void gen_PSRLD_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 32) { + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else { + tcg_gen_gvec_shri(MO_32, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); + } +} + +static void gen_PSLLD_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 32) { + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else { + tcg_gen_gvec_shli(MO_32, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); + } +} + +static void gen_PSRAD_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 32) { + decode->immediate =3D 31; + } + tcg_gen_gvec_sari(MO_32, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); +} + +static void gen_PSRLQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 64) { + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else { + tcg_gen_gvec_shri(MO_64, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); + } +} + +static void gen_PSLLQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + if (decode->immediate >=3D 64) { + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else { + tcg_gen_gvec_shli(MO_64, + decode->op[0].offset, decode->op[1].offset, + decode->immediate, vec_len, vec_len); + } +} + +static TCGv_ptr make_imm8u_xmm_vec(uint8_t imm, int vec_len) +{ + MemOp ot =3D vec_len =3D=3D 16 ? MO_128 : MO_256; + TCGv_i32 imm_v =3D tcg_constant8u_i32(imm); + TCGv_ptr ptr =3D tcg_temp_new_ptr(); + + tcg_gen_gvec_dup_imm(MO_64, offsetof(CPUX86State, xmm_t0) + xmm_offset= (ot), + vec_len, vec_len, 0); + + tcg_gen_addi_ptr(ptr, cpu_env, offsetof(CPUX86State, xmm_t0)); + tcg_gen_st_i32(imm_v, cpu_env, offsetof(CPUX86State, xmm_t0.ZMM_L(0))); + return ptr; +} + +static void gen_PSRLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + int vec_len =3D vector_len(s, decode); + TCGv_ptr imm_vec =3D make_imm8u_xmm_vec(decode->immediate, vec_len); + + if (s->vex_l) { + gen_helper_psrldq_ymm(cpu_env, OP_PTR0, OP_PTR1, imm_vec); + } else { + gen_helper_psrldq_xmm(cpu_env, OP_PTR0, OP_PTR1, imm_vec); + } + tcg_temp_free_ptr(imm_vec); +} + +static void gen_PSLLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + int vec_len =3D vector_len(s, decode); + TCGv_ptr imm_vec =3D make_imm8u_xmm_vec(decode->immediate, vec_len); + + if (s->vex_l) { + gen_helper_pslldq_ymm(cpu_env, OP_PTR0, OP_PTR1, imm_vec); + } else { + gen_helper_pslldq_xmm(cpu_env, OP_PTR0, OP_PTR1, imm_vec); + } + tcg_temp_free_ptr(imm_vec); +} + static void gen_RORX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { MemOp ot =3D decode->op[0].ot; @@ -959,3 +1143,23 @@ static void gen_VCVTfp2fp(DisasContext *s, CPUX86Stat= e *env, X86DecodedInsn *dec gen_helper_cvtpd2ps_ymm, gen_helper_cvtps2pd_ymm, gen_helper_cvtsd2ss, gen_helper_cvtss2sd); } + +static void gen_VZEROALL(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + TCGv_ptr ptr =3D tcg_temp_new_ptr(); + + tcg_gen_addi_ptr(ptr, cpu_env, offsetof(CPUX86State, xmm_t0)); + gen_helper_memset(ptr, ptr, tcg_constant_i32(0), + tcg_constant_ptr(CPU_NB_REGS * sizeof(ZMMReg))); + tcg_temp_free_ptr(ptr); +} + +static void gen_VZEROUPPER(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + int i; + + for (i =3D 0; i < CPU_NB_REGS; i++) { + int offset =3D offsetof(CPUX86State, xmm_regs[i].ZMM_X(1)); + tcg_gen_gvec_dup_imm(MO_64, offset, 16, 16, 0); + } +} diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 53609473bf..defae79d3b 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4782,8 +4782,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) use_new &=3D b <=3D limit; #endif if (use_new && - ((b >=3D 0x150 && b <=3D 0x16f) || - (b >=3D 0x178 && b <=3D 0x17f) || + ((b >=3D 0x150 && b <=3D 0x17f) || (b >=3D 0x1d8 && b <=3D 0x1ff && (b & 8)))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101148; cv=none; d=zohomail.com; s=zohoarc; b=ebjBoa4N9KyObBNjn8lMbw3r5HB2Hi/3ui2HqJR1+9GZLLXZ0ugDBdGiPZ7Askkd8jFVAyC1Hw6wAy3Gsmv/lQRTXim995cyVZ2N/cwFNfbOqM1QwIEd7q+bHKQNk87SEsRfGYXDui8GvYl8uFHVDQ/yN8HEPcKjffG7wgZfyZo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101148; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=mSQBdP9IGP+TdAX9n1NZnZIRnFodu3yh9ZLqZkjo+kA=; b=jZNXZ+f+7XTO2nmY1sl2r2p5zXq6rsNV4MKaTkMkK2t0A1qYhP/P2QLXCu6QQKPFu6Gk2EkqTuDqjiN2EgHtJzT/sX5QU3tb369wG2Tmtyv4s3130WR8e1dEHvmeF6CKvTqOpsxzPMKbpuZujnaY5Oj4IJSOPbF0ZpQnmYRnSIo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101148618501.03290499316097; Tue, 18 Oct 2022 06:52:28 -0700 (PDT) Received: from localhost ([::1]:34684 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn16-0001ro-AY for importer@patchew.org; Tue, 18 Oct 2022 09:52:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50456) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Rl-1G for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:58630) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiH-0005Ns-8d for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:32:59 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-146-yz2FtVmbPFSq_HIIkqZTdw-1; Tue, 18 Oct 2022 09:32:55 -0400 Received: by mail-ej1-f70.google.com with SMTP id hc43-20020a17090716ab00b0078e28567ffbso4750168ejc.15 for ; Tue, 18 Oct 2022 06:32:55 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id x24-20020a170906b09800b0078d46aa3b82sm7496210ejy.21.2022.10.18.06.32.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099976; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mSQBdP9IGP+TdAX9n1NZnZIRnFodu3yh9ZLqZkjo+kA=; b=CzcmMuHl3yI+Hcx5Hi0ko/lQZGeizzHDUDeEx4Texwjlr5tvdNegFjJ7nXYyO2RNQqwWru sYIPfxm6RCg7gMGLbGUgyj6+d1TPXYkQXNuo465f6ZxJh6gWeUlk+oWh92fE5EGq9yyOdf d5lNiSLS2aMn+gi11oz4dpG6KqSs0Rk= X-MC-Unique: yz2FtVmbPFSq_HIIkqZTdw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mSQBdP9IGP+TdAX9n1NZnZIRnFodu3yh9ZLqZkjo+kA=; b=4rsAiAJroqE+Si2PyNafDxfHCTV9tCqD0ZkL+Nq7JJO9kTEC4p/YAlLL8MyaXmJOoD tJ3vOu/PO1AN3UKbCAxe8GZfWklNy55wwuWfLdYrawiAqeA/M4gLZoNEEpCBb5X2GMuY JtqsFtiWtKL3WzYUlD9TpzLwVB+Mz/s3FxQwgwVht8HUnqPDSt8pHEwqPU8iV58r1wjV f396hYr8wZG+YahOYnbDh/5zMwT1J+O/3f8+b/SE8TBXOjMVxMp3gO04FsjhWeO7+LzM u1cLEmKIEIJebjYHSo/MOY+5q9MKYXLQnlCLPS+4DmGOvNctyIU5DKJjqtXcNBQKvRmT V3fw== X-Gm-Message-State: ACrzQf1cmJvhWvL5Ge+z4cQezw7/KRFWxKHszqizdc7XAUjDGwBBehU7 nSWI8Ee1lU0u9U1GPwrYdbThyJ7ISipzWXuoHZQRc1LA7AQ9C4jfkHEPrTk/ewc/uzQ6aceFmS8 2hO+wMKpfdIbVijdJgVM0hqNNCyblnqZiRhB/rJZwv5jS/qRqsAuY6198dF46W7fL7R8= X-Received: by 2002:aa7:c314:0:b0:458:dc90:467a with SMTP id l20-20020aa7c314000000b00458dc90467amr2528511edq.284.1666099973515; Tue, 18 Oct 2022 06:32:53 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4RVoWl1POI2R/Ggp0gtAKx5Ltme0REFeL4Glh/NViESYnJQK0uAx/sfXVQwFW1h5ocbl23Hg== X-Received: by 2002:aa7:c314:0:b0:458:dc90:467a with SMTP id l20-20020aa7c314000000b00458dc90467amr2528480edq.284.1666099973120; Tue, 18 Oct 2022 06:32:53 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 40/53] target/i386: reimplement 0x0f 0xd0-0xd7, 0xe0-0xe7, 0xf0-0xf7, add AVX Date: Tue, 18 Oct 2022 15:30:29 +0200 Message-Id: <20221018133042.856368-41-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101149481100004 Content-Type: text/plain; charset="utf-8" The more complicated ones here are d6-d7, e6-e7, f7. The others are trivial. For LDDQU, using gen_load_sse directly might corrupt the register if the second part of the load fails. Therefore, add a custom X86_TYPE_WM value; like X86_TYPE_W it does call gen_load(), but it also rejects a value of 11 in the ModRM field like X86_TYPE_M. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 53 ++++++++++++++++++++++ target/i386/tcg/decode-new.h | 1 + target/i386/tcg/emit.c.inc | 77 +++++++++++++++++++++++++++----- target/i386/tcg/translate.c | 2 +- 4 files changed, 122 insertions(+), 11 deletions(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 306a9f344e..c1534719fa 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -289,6 +289,18 @@ static void decode_0F7F(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui *entry =3D *decode_by_prefix(s, opcodes_0F7F); } =20 +static void decode_0FD6(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry movq[4] =3D { + {}, + X86_OP_ENTRY3(MOVQ, W,x, None, None, V,q, vex5), + X86_OP_ENTRY3(MOVq_dq, V,dq, None, None, N,q), + X86_OP_ENTRY3(MOVq_dq, P,q, None, None, U,q), + }; + + *entry =3D *decode_by_prefix(s, movq); +} + static const X86OpEntry opcodes_0F38_00toEF[240] =3D { }; =20 @@ -398,6 +410,17 @@ static void decode_0F5B(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui *entry =3D *decode_by_prefix(s, opcodes_0F5B); } =20 +static void decode_0FE6(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0FE6[4] =3D { + {}, + X86_OP_ENTRY2(VCVTTPD2DQ, V,x, W,x, vex2), + X86_OP_ENTRY2(VCVTDQ2PD, V,x, W,x, vex2), + X86_OP_ENTRY2(VCVTPD2DQ, V,x, W,x, vex2), + }; + *entry =3D *decode_by_prefix(s, opcodes_0FE6); +} + static const X86OpEntry opcodes_0F[256] =3D { [0x50] =3D X86_OP_ENTRY3(MOVMSK, G,y, None,None, U,x, vex7 p_00_66= ), [0x51] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), @@ -454,6 +477,33 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x7e] =3D X86_OP_GROUP0(0F7E), [0x7f] =3D X86_OP_GROUP0(0F7F), =20 + [0xd0] =3D X86_OP_ENTRY3(VADDSUB, V,x, H,x, W,x, vex2 cpuid(S= SE3) p_66_f2), + [0xd1] =3D X86_OP_ENTRY3(PSRLW_r, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xd2] =3D X86_OP_ENTRY3(PSRLD_r, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xd3] =3D X86_OP_ENTRY3(PSRLQ_r, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xd4] =3D X86_OP_ENTRY3(PADDQ, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xd5] =3D X86_OP_ENTRY3(PMULLW, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xd6] =3D X86_OP_GROUP0(0FD6), + [0xd7] =3D X86_OP_ENTRY3(PMOVMSKB, G,d, None,None, U,x, vex7 mmx avx= 2_256 p_00_66), + + [0xe0] =3D X86_OP_ENTRY3(PAVGB, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xe1] =3D X86_OP_ENTRY3(PSRAW_r, V,x, H,x, W,x, vex7 mmx avx= 2_256 p_00_66), + [0xe2] =3D X86_OP_ENTRY3(PSRAD_r, V,x, H,x, W,x, vex7 mmx avx= 2_256 p_00_66), + [0xe3] =3D X86_OP_ENTRY3(PAVGW, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xe4] =3D X86_OP_ENTRY3(PMULHUW, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xe5] =3D X86_OP_ENTRY3(PMULHW, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xe6] =3D X86_OP_GROUP0(0FE6), + [0xe7] =3D X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1 mmx p_0= 0_66), /* MOVNTQ/MOVNTDQ */ + + [0xf0] =3D X86_OP_ENTRY3(MOVDQ, V,x, None,None, WM,x, vex4_unal cp= uid(SSE3) p_f2), /* LDDQU */ + [0xf1] =3D X86_OP_ENTRY3(PSLLW_r, V,x, H,x, W,x, vex7 mmx avx= 2_256 p_00_66), + [0xf2] =3D X86_OP_ENTRY3(PSLLD_r, V,x, H,x, W,x, vex7 mmx avx= 2_256 p_00_66), + [0xf3] =3D X86_OP_ENTRY3(PSLLQ_r, V,x, H,x, W,x, vex7 mmx avx= 2_256 p_00_66), + [0xf4] =3D X86_OP_ENTRY3(PMULUDQ, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xf5] =3D X86_OP_ENTRY3(PMADDWD, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xf6] =3D X86_OP_ENTRY3(PSADBW, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), + [0xf7] =3D X86_OP_ENTRY3(MASKMOV, None,None, V,dq, U,dq, vex4_unal av= x2_256 mmx p_00_66), + /* Incorrectly missing from 2-17 */ [0xd8] =3D X86_OP_ENTRY3(PSUBUSB, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), [0xd9] =3D X86_OP_ENTRY3(PSUBUSW, V,x, H,x, W,x, vex4 mmx avx2_256 p= _00_66), @@ -710,6 +760,9 @@ static bool decode_op(DisasContext *s, CPUX86State *env= , X86DecodedInsn *decode, } goto get_modrm; =20 + case X86_TYPE_WM: /* modrm byte selects an XMM/YMM memory operand */ + op->unit =3D X86_OP_SSE; + /* fall through */ case X86_TYPE_M: /* modrm byte selects a memory operand */ modrm =3D get_modrm(s, env); if ((modrm >> 6) =3D=3D 3) { diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 8456ae67ad..ef318a00ed 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -47,6 +47,7 @@ typedef enum X86OpType { X86_TYPE_Y, /* string destination */ =20 /* Custom */ + X86_TYPE_WM, /* modrm byte selects an XMM/YMM memory operand */ X86_TYPE_2op, /* 2-operand RMW instruction */ X86_TYPE_LoBits, /* encoded in bits 0-2 of the operand + REX.B */ X86_TYPE_0, /* Hard-coded GPRs (RAX..RDI) */ diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 0d437686e6..4227ddd9f3 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -471,6 +471,7 @@ static void gen_##uname(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decod } HORIZONTAL_FP_SSE(VHADD, hadd) HORIZONTAL_FP_SSE(VHSUB, hsub) +HORIZONTAL_FP_SSE(VADDSUB, addsub) =20 #define BINARY_INT_GVEC(uname, func, ...) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ @@ -485,6 +486,7 @@ static void gen_##uname(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decod BINARY_INT_GVEC(PADDB, tcg_gen_gvec_add, MO_8) BINARY_INT_GVEC(PADDW, tcg_gen_gvec_add, MO_16) BINARY_INT_GVEC(PADDD, tcg_gen_gvec_add, MO_32) +BINARY_INT_GVEC(PADDQ, tcg_gen_gvec_add, MO_64) BINARY_INT_GVEC(PADDSB, tcg_gen_gvec_ssadd, MO_8) BINARY_INT_GVEC(PADDSW, tcg_gen_gvec_ssadd, MO_16) BINARY_INT_GVEC(PADDUSB, tcg_gen_gvec_usadd, MO_8) @@ -500,6 +502,7 @@ BINARY_INT_GVEC(PMAXSW, tcg_gen_gvec_smax, MO_16) BINARY_INT_GVEC(PMAXUB, tcg_gen_gvec_umax, MO_8) BINARY_INT_GVEC(PMINSW, tcg_gen_gvec_smin, MO_16) BINARY_INT_GVEC(PMINUB, tcg_gen_gvec_umin, MO_8) +BINARY_INT_GVEC(PMULLW, tcg_gen_gvec_mul, MO_16) BINARY_INT_GVEC(POR, tcg_gen_gvec_or, MO_64) BINARY_INT_GVEC(PSUBB, tcg_gen_gvec_sub, MO_8) BINARY_INT_GVEC(PSUBW, tcg_gen_gvec_sub, MO_16) @@ -557,6 +560,23 @@ BINARY_INT_MMX(PUNPCKHWD, punpckhwd) BINARY_INT_MMX(PUNPCKHDQ, punpckhdq) BINARY_INT_MMX(PACKSSDW, packssdw) =20 +BINARY_INT_MMX(PAVGB, pavgb) +BINARY_INT_MMX(PAVGW, pavgw) +BINARY_INT_MMX(PMADDWD, pmaddwd) +BINARY_INT_MMX(PMULHUW, pmulhuw) +BINARY_INT_MMX(PMULHW, pmulhw) +BINARY_INT_MMX(PMULUDQ, pmuludq) +BINARY_INT_MMX(PSADBW, psadbw) + +BINARY_INT_MMX(PSLLW_r, psllw) +BINARY_INT_MMX(PSLLD_r, pslld) +BINARY_INT_MMX(PSLLQ_r, psllq) +BINARY_INT_MMX(PSRLW_r, psrlw) +BINARY_INT_MMX(PSRLD_r, psrld) +BINARY_INT_MMX(PSRLQ_r, psrlq) +BINARY_INT_MMX(PSRAW_r, psraw) +BINARY_INT_MMX(PSRAD_r, psrad) + /* Instructions with no MMX equivalent. */ #define BINARY_INT_SSE(uname, lname) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ @@ -588,6 +608,9 @@ static void gen_##uname(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decod gen_helper_##lname##_ymm); = \ } =20 +UNARY_INT_SSE(VCVTDQ2PD, cvtdq2pd) +UNARY_INT_SSE(VCVTPD2DQ, cvtpd2dq) +UNARY_INT_SSE(VCVTTPD2DQ, cvttpd2dq) UNARY_INT_SSE(VCVTDQ2PS, cvtdq2ps) UNARY_INT_SSE(VCVTPS2DQ, cvtps2dq) UNARY_INT_SSE(VCVTTPS2DQ, cvttps2dq) @@ -802,6 +825,19 @@ static void gen_INSERTQ_r(DisasContext *s, CPUX86State= *env, X86DecodedInsn *dec gen_helper_insertq_r(cpu_env, OP_PTR0, OP_PTR2); } =20 +static void gen_MASKMOV(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + tcg_gen_mov_tl(s->A0, cpu_regs[R_EDI]); + gen_extu(s->aflag, s->A0); + gen_add_A0_ds_seg(s); + + if (s->prefix & PREFIX_DATA) { + gen_helper_maskmov_xmm(cpu_env, OP_PTR1, OP_PTR2, s->A0); + } else { + gen_helper_maskmov_mmx(cpu_env, OP_PTR1, OP_PTR2, s->A0); + } +} + static void gen_MOVBE(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) { MemOp ot =3D decode->op[0].ot; @@ -875,16 +911,27 @@ static void gen_MOVQ(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) int lo_ofs =3D vector_elem_offset(&decode->op[0], MO_64, 0); =20 tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[2].offset); - /* - * tcg_gen_gvec_dup_i64(MO_64, op0.offset, 8, vec_len, s->tmp1_64) wou= ld - * seem to work, but it does not on big-endian platforms; the cleared = parts - * are always at higher addresses, but cross-endian emulation inverts = the - * byte order so that the cleared parts need to be at *lower* addresse= s. - * Because oprsz is 8, we see this here even for SSE; but more in gene= ral, - * it disqualifies using oprsz < maxsz to emulate VEX128. - */ - tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len, 0); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, lo_ofs); + if (decode->op[0].has_ea) { + tcg_gen_qemu_st_i64(s->tmp1_i64, s->A0, s->mem_index, MO_LEUQ); + } else { + /* + * tcg_gen_gvec_dup_i64(MO_64, op0.offset, 8, vec_len, s->tmp1_64)= would + * seem to work, but it does not on big-endian platforms; the clea= red parts + * are always at higher addresses, but cross-endian emulation inve= rts the + * byte order so that the cleared parts need to be at *lower* addr= esses. + * Because oprsz is 8, we see this here even for SSE; but more in = general, + * it disqualifies using oprsz < maxsz to emulate VEX128. + */ + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, lo_ofs); + } +} + +static void gen_MOVq_dq(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + gen_helper_enter_mmx(cpu_env); + /* Otherwise the same as any other movq. */ + return gen_MOVQ(s, env, decode); } =20 static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) @@ -938,6 +985,16 @@ static void gen_PEXT(DisasContext *s, CPUX86State *env= , X86DecodedInsn *decode) gen_helper_pext(s->T0, s->T0, s->T1); } =20 +static void gen_PMOVMSKB(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + if (s->prefix & PREFIX_DATA) { + gen_helper_pmovmskb_xmm(s->tmp2_i32, cpu_env, OP_PTR2); + } else { + gen_helper_pmovmskb_mmx(s->tmp2_i32, cpu_env, OP_PTR2); + } + tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); +} + static void gen_PSHUFW(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) { TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index defae79d3b..95d48eb508 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4783,7 +4783,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #endif if (use_new && ((b >=3D 0x150 && b <=3D 0x17f) || - (b >=3D 0x1d8 && b <=3D 0x1ff && (b & 8)))) { + (b >=3D 0x1d0 && b <=3D 0x1ff))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; } --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102131; cv=none; d=zohomail.com; s=zohoarc; b=DyYUVH+3g9yPs/rFBG35HyizspBSblAuoa4RkKFysQMNYKNOsWO2b7ti2b/fmICnSDlGmox6x0wzNfmUxCUKRniXbrZTFb0ahEjIdOLTD5Y1Cw2J2l6DdfcLH4psfNaM5WwpfzCGgsfUr/ab0imyTtmtC+UWBw9a4sg5rUBRhVE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102131; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=+rs1/WmHEQ070rb0qOWPUYpr19R9HQxlkUYPKI4/gTE=; b=idVrnxozG/a0+z2+89nKMauntHZQg9sQJMHxpQccAgyKxaJikCUeU9mF4af14VxEsQZKRX/vBuO4thTwj+12pbjUXFBJS9G39J5u7f6jIxiZG/t/ngFOnSHdjLb2L3lr+PLfkJ7u/SoKK81vdSThSTM9IcvHHIuFYk6k5YupjWc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102131701337.98915103771526; Tue, 18 Oct 2022 07:08:51 -0700 (PDT) Received: from localhost ([::1]:42320 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknH0-0003mg-3Y for importer@patchew.org; Tue, 18 Oct 2022 10:08:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50460) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiS-0004Rn-Az for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:50500) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiK-0005Oi-6Z for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:02 -0400 Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-32-FeQNZ2PoOwqtLJ6FGbySbQ-1; Tue, 18 Oct 2022 09:32:58 -0400 Received: by mail-ej1-f70.google.com with SMTP id hc43-20020a17090716ab00b0078e28567ffbso4750232ejc.15 for ; Tue, 18 Oct 2022 06:32:58 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id z20-20020a170906715400b0073ddff7e432sm7695141ejj.14.2022.10.18.06.32.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099979; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+rs1/WmHEQ070rb0qOWPUYpr19R9HQxlkUYPKI4/gTE=; b=Qziu+07xHuW0eqRKATqF2WLXfHhsFRtMPzm25M/fdBGyGAwid/yXq9Qqiqyn3HkllZ3bD3 VMD75tuMNLsdkWf5ZxP+Q3AY9hm1Rnxkyrqz1Nfl8aUIIWaMzIqUyLsUgNrLsMH/DP05pE 7o9nczgIWtD0FLNHuXvNsvXYYNFQhlk= X-MC-Unique: FeQNZ2PoOwqtLJ6FGbySbQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+rs1/WmHEQ070rb0qOWPUYpr19R9HQxlkUYPKI4/gTE=; b=2rs8Z48m+HzdLnACKxqSTUx5DYsle55y91pZd+lkGuKIwlYf9Q7+fkt8mhsC+qKuzc xuL2V2HizPeCYH049B5+HZRccYjnI39mURTOEPEruxhrhVYhMmDrHxdp4xwfOoqX8eOi gx7AeDExXeTGjhTE3FEL+Xf9gaEWzzrPxstuttVuEY6w7VJMyMbykE2LahDnchoJodrf G1kwTWfz3K9WE/ziEum/aK9daTiNF3wGChJEQX0DdjGmB+a6NDPjoOoAl8w6AsFV4Wu7 iP2+t+M4jMortJP7///Vl1dpn3OsC5TFJuB0qlRadbl/L0Ul8Tv3g620d+BdZ54YFOdd aGYg== X-Gm-Message-State: ACrzQf2IQ3i3i4taiJ7AlPYEGPaEr3SlIGMmyT2Z2DAs9FA+Z9/sBsJk eCGtIJrHZOCV7ZepU0lNeTCZF36f61tc0NWtHE0hlQHjQ4F1uCB0J3gRSAV3/lNuwpiNcJEILO4 1YkV8kSjlDNNmtyGnfDLeNptDaQFfpbk23sImC29R6L1yTbftAuyA/YPSiMvRHoKZJ20= X-Received: by 2002:a17:907:1624:b0:78d:d61c:2b4a with SMTP id hb36-20020a170907162400b0078dd61c2b4amr2406316ejc.208.1666099976739; Tue, 18 Oct 2022 06:32:56 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7Xh2+IWGaWKenm3wPOF8mMwEBHUUSDvif0etJMGykTxlgAf+bNjyJGZzTAolTn3OBgUXL/zg== X-Received: by 2002:a17:907:1624:b0:78d:d61c:2b4a with SMTP id hb36-20020a170907162400b0078dd61c2b4amr2406293ejc.208.1666099976428; Tue, 18 Oct 2022 06:32:56 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 41/53] target/i386: clarify (un)signedness of immediates from 0F3Ah opcodes Date: Tue, 18 Oct 2022 15:30:30 +0200 Message-Id: <20221018133042.856368-42-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102133873100001 Content-Type: text/plain; charset="utf-8" Three-byte opcodes from the 0F3Ah area all have an immediate byte which is usually unsigned. Clarify in the helper code that it is unsigned; the new decoder treats immediates as signed by default, and seeing an intN_t in the prototype might give the wrong impression that one can use decode->immediate directly. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 8 ++++---- target/i386/ops_sse_header.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 090ba013b3..e7830ff277 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -1605,17 +1605,17 @@ SSE_HELPER_W(helper_psignw, FSIGNW) SSE_HELPER_L(helper_psignd, FSIGNL) =20 void glue(helper_palignr, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s, - int32_t shift) + uint32_t imm) { int i; =20 /* XXX could be checked during translation */ - if (shift >=3D (SHIFT ? 32 : 16)) { + if (imm >=3D (SHIFT ? 32 : 16)) { for (i =3D 0; i < (1 << SHIFT); i++) { d->Q(i) =3D 0; } } else { - shift <<=3D 3; + int shift =3D imm * 8; #define SHR(v, i) (i < 64 && i > -64 ? i > 0 ? v >> (i) : (v << -(i)) : 0) #if SHIFT =3D=3D 0 d->Q(0) =3D SHR(s->Q(0), shift - 0) | @@ -2093,7 +2093,7 @@ static inline int pcmp_val(Reg *r, uint8_t ctrl, int = i) } =20 static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s, - int8_t ctrl, int valids, int validd) + uint8_t ctrl, int valids, int validd) { unsigned int res =3D 0; int v; diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 440f1c0e78..98178be148 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -335,7 +335,7 @@ DEF_HELPER_4(glue(pshufb, SUFFIX), void, env, Reg, Reg,= Reg) DEF_HELPER_4(glue(psignb, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(psignw, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(psignd, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_5(glue(palignr, SUFFIX), void, env, Reg, Reg, Reg, s32) +DEF_HELPER_5(glue(palignr, SUFFIX), void, env, Reg, Reg, Reg, i32) =20 /* SSE4.1 op helpers */ #if SHIFT >=3D 1 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103320; cv=none; d=zohomail.com; s=zohoarc; b=lcmLqiL/uGWSgvmpBCnBtvBOQP1rOdyLpXpveyJ2xM34NLHsYcEaUaKaFtRVp5ROp6vRp/awcU70z2tPpEf/4WnZbaMDSI5XvkrT/TdVHBrcto6ePhjeRw+utfk4xH64Vn2/3vxgm3OSUvTKXa+nD0yztdE/lKggW69cNKNxDv0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103320; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=RGry6puk38xjstyFRne2Kx+kKtBHIO/ygCENyUZBpIU=; b=NThEx1rduJ2Lmx8GhtP10RS79Hf3Kra0VxkhZw8ltRueQC6PNcrDxzADEG5DwSmB9ToyyNSsYpRwwZK+iF50PhKLPYJGYa6odoZVgeQvj5h766URG8taRv4yXLWwCapOOfZuj1jRPUuaIq3B7vSl8o8xk/nNwa3PaoWSTKfxSjE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103320252399.7738230933238; Tue, 18 Oct 2022 07:28:40 -0700 (PDT) Received: from localhost ([::1]:57722 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okna9-0004co-HT for importer@patchew.org; Tue, 18 Oct 2022 10:28:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46828) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiX-0004TZ-E5 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:14 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:25731) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiU-0005Pp-Ll for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-258-L2Gsw3jcNviln4izbv6wfw-1; Tue, 18 Oct 2022 09:33:01 -0400 Received: by mail-ed1-f69.google.com with SMTP id r18-20020a05640251d200b0045d4f995adeso6685886edd.5 for ; Tue, 18 Oct 2022 06:33:01 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id p4-20020a056402074400b0045bccd8ab83sm8959093edy.1.2022.10.18.06.32.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:32:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099990; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RGry6puk38xjstyFRne2Kx+kKtBHIO/ygCENyUZBpIU=; b=QHff/WNbCCNgkrbog5UuZevn4jBPE2FlrN7ryBKewFPU0KmsdAQAYAdtq+BesDPGGPPOPw tZzvMyahoqigFWl7qVRGb0qh/r1rsvp3sKotmbtglwdVvwyhFoYFXDn4xoXIV/YKtP1spB mIXoW4nWCoWQKuPLm2qN/Z6wF8GqE/Q= X-MC-Unique: L2Gsw3jcNviln4izbv6wfw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RGry6puk38xjstyFRne2Kx+kKtBHIO/ygCENyUZBpIU=; b=hq6sxOlxQynDS919EIaGmz4J+RwHab2uhoVpeoygshXePFM2OVubxYDMCJnWP/wTuo 31MOatd7gltsyfaTi7sp05p31qQsHRAafOpACO5rUqrx9uQphFkMueV/U4N9g84AMZMF 92JeP+FIsdQzUqKF1pWDlWDWLZLB4x8QOlMUx6GJPcCAwg2qqyU8fOOSuMw0DTWb2HRk abU29SSKpOznorC7/kin/CeEC56uwscIMe9waV7oQMNliM9uoXlpn/2wfMhVb4a9nR7Z y53fkbvZxc+KaTdr62dEb9B5fXuRsTVskDv+w8tixJq8251opz4d3rIOH3miPWXtqWqq 7oqg== X-Gm-Message-State: ACrzQf1I8a47rb2gneNgiRPpF9jOZ2XUOczc64zknSUsTkRBRMZRCKZc wH1Th/a2VgFkdJZo0rhdFnFmBG4O5sQLCsgNSQtvwqCCvA/T6pQ13A0JepxotB/rrNwxCJGdHEr VQ0q6f+ie1eK9KzyzbjTPnqqASfm3ksk3fCHaQyYCoyJeOjOqbWnXXoTTlHG1wwpwxsM= X-Received: by 2002:a17:906:eec7:b0:733:189f:b07a with SMTP id wu7-20020a170906eec700b00733189fb07amr2473030ejb.230.1666099979954; Tue, 18 Oct 2022 06:32:59 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4Mcg/D9mh2lwvIyqIjw3ocZatRm4MyLhR4bkXjhdf7J3BxDf3cEX/VFeqHZ+/K2EbvOjwyhA== X-Received: by 2002:a17:906:eec7:b0:733:189f:b07a with SMTP id wu7-20020a170906eec700b00733189fb07amr2472989ejb.230.1666099979324; Tue, 18 Oct 2022 06:32:59 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 42/53] target/i386: reimplement 0x0f 0x3a, add AVX Date: Tue, 18 Oct 2022 15:30:31 +0200 Message-Id: <20221018133042.856368-43-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103321702100003 Content-Type: text/plain; charset="utf-8" The more complicated operations here are insertions and extractions. Otherwise, there are just more entries than usual because the PS/PD/SS/SD variations are encoded in the opcode rater than in the prefixes. These three-byte opcodes also include AVX new instructions, whose implementation in the helpers was originally done by Paul Brook . Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 95 ++++++++++ target/i386/ops_sse_header.h | 10 + target/i386/tcg/decode-new.c.inc | 75 ++++++++ target/i386/tcg/emit.c.inc | 309 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 3 +- 5 files changed, 491 insertions(+), 1 deletion(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index e7830ff277..cb8909adcf 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -2381,6 +2381,101 @@ void glue(helper_aeskeygenassist, SUFFIX)(CPUX86Sta= te *env, Reg *d, Reg *s, #endif #endif =20 +#if SHIFT >=3D 1 +void glue(helper_vpermilpd_imm, SUFFIX)(Reg *d, Reg *s, uint32_t order) +{ + uint64_t r0, r1; + int i; + + for (i =3D 0; i < 1 << SHIFT; i +=3D 2) { + r0 =3D s->Q(i + ((order >> 0) & 1)); + r1 =3D s->Q(i + ((order >> 1) & 1)); + d->Q(i) =3D r0; + d->Q(i+1) =3D r1; + + order >>=3D 2; + } +} + +void glue(helper_vpermilps_imm, SUFFIX)(Reg *d, Reg *s, uint32_t order) +{ + uint32_t r0, r1, r2, r3; + int i; + + for (i =3D 0; i < 2 << SHIFT; i +=3D 4) { + r0 =3D s->L(i + ((order >> 0) & 3)); + r1 =3D s->L(i + ((order >> 2) & 3)); + r2 =3D s->L(i + ((order >> 4) & 3)); + r3 =3D s->L(i + ((order >> 6) & 3)); + d->L(i) =3D r0; + d->L(i+1) =3D r1; + d->L(i+2) =3D r2; + d->L(i+3) =3D r3; + } +} + +#if SHIFT >=3D 2 +void helper_vpermdq_ymm(Reg *d, Reg *v, Reg *s, uint32_t order) +{ + uint64_t r0, r1, r2, r3; + + switch (order & 3) { + case 0: + r0 =3D v->Q(0); + r1 =3D v->Q(1); + break; + case 1: + r0 =3D v->Q(2); + r1 =3D v->Q(3); + break; + case 2: + r0 =3D s->Q(0); + r1 =3D s->Q(1); + break; + case 3: + r0 =3D s->Q(2); + r1 =3D s->Q(3); + break; + } + switch ((order >> 4) & 3) { + case 0: + r2 =3D v->Q(0); + r3 =3D v->Q(1); + break; + case 1: + r2 =3D v->Q(2); + r3 =3D v->Q(3); + break; + case 2: + r2 =3D s->Q(0); + r3 =3D s->Q(1); + break; + case 3: + r2 =3D s->Q(2); + r3 =3D s->Q(3); + break; + } + d->Q(0) =3D r0; + d->Q(1) =3D r1; + d->Q(2) =3D r2; + d->Q(3) =3D r3; +} + +void helper_vpermq_ymm(Reg *d, Reg *s, uint32_t order) +{ + uint64_t r0, r1, r2, r3; + r0 =3D s->Q(order & 3); + r1 =3D s->Q((order >> 2) & 3); + r2 =3D s->Q((order >> 4) & 3); + r3 =3D s->Q((order >> 6) & 3); + d->Q(0) =3D r0; + d->Q(1) =3D r1; + d->Q(2) =3D r2; + d->Q(3) =3D r3; +} +#endif +#endif + #undef SSE_HELPER_S =20 #undef LANE_WIDTH diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 98178be148..1afc4ff6a1 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -411,6 +411,16 @@ DEF_HELPER_4(glue(aeskeygenassist, SUFFIX), void, env,= Reg, Reg, i32) DEF_HELPER_5(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, Reg, i32) #endif =20 +/* AVX helpers */ +#if SHIFT >=3D 1 +DEF_HELPER_3(glue(vpermilpd_imm, SUFFIX), void, Reg, Reg, i32) +DEF_HELPER_3(glue(vpermilps_imm, SUFFIX), void, Reg, Reg, i32) +#if SHIFT =3D=3D 2 +DEF_HELPER_4(vpermdq_ymm, void, Reg, Reg, Reg, i32) +DEF_HELPER_3(vpermq_ymm, void, Reg, Reg, i32) +#endif +#endif + #undef SHIFT #undef Reg #undef SUFFIX diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index c1534719fa..3330085b3e 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -375,7 +375,78 @@ static void decode_0F38(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui } } =20 +static void decode_VINSERTPS(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) +{ + static const X86OpEntry + vinsertps_reg =3D X86_OP_ENTRY4(VINSERTPS_r, V,dq, H,dq, U,dq, vex= 5 cpuid(SSE41) p_66), + vinsertps_mem =3D X86_OP_ENTRY4(VINSERTPS_m, V,dq, H,dq, M,d, vex= 5 cpuid(SSE41) p_66); + + int modrm =3D get_modrm(s, env); + *entry =3D (modrm >> 6) =3D=3D 3 ? vinsertps_reg : vinsertps_mem; +} + static const X86OpEntry opcodes_0F3A[256] =3D { + /* + * These are VEX-only, but incorrectly listed in the manual as excepti= on type 4. + * Also the "qq" instructions are sometimes omitted by Table 2-17, but= are VEX256 + * only. + */ + [0x00] =3D X86_OP_ENTRY3(VPERMQ, V,qq, W,qq, I,b, vex6 cpuid(AVX= 2) p_66), + [0x01] =3D X86_OP_ENTRY3(VPERMQ, V,qq, W,qq, I,b, vex6 cpuid(AVX= 2) p_66), /* VPERMPD */ + [0x02] =3D X86_OP_ENTRY4(VBLENDPS, V,x, H,x, W,x, vex6 cpuid(AVX= 2) p_66), /* VPBLENDD */ + [0x04] =3D X86_OP_ENTRY3(VPERMILPS_i, V,x, W,x, I,b, vex6 cpuid(AVX= ) p_66), + [0x05] =3D X86_OP_ENTRY3(VPERMILPD_i, V,x, W,x, I,b, vex6 cpuid(AVX= ) p_66), + [0x06] =3D X86_OP_ENTRY4(VPERM2x128, V,qq, H,qq, W,qq, vex6 cpuid(AVX= ) p_66), + + [0x14] =3D X86_OP_ENTRY3(PEXTRB, E,b, V,dq, I,b, vex5 cpuid(SSE4= 1) zext0 p_66), + [0x15] =3D X86_OP_ENTRY3(PEXTRW, E,w, V,dq, I,b, vex5 cpuid(SSE4= 1) zext0 p_66), + [0x16] =3D X86_OP_ENTRY3(PEXTR, E,y, V,dq, I,b, vex5 cpuid(SSE4= 1) p_66), + [0x17] =3D X86_OP_ENTRY3(VEXTRACTPS, E,d, V,dq, I,b, vex5 cpuid(SSE4= 1) p_66), + + [0x20] =3D X86_OP_ENTRY4(PINSRB, V,dq, H,dq, E,b, vex5 cpuid(SSE4= 1) zext2 p_66), + [0x21] =3D X86_OP_GROUP0(VINSERTPS), + [0x22] =3D X86_OP_ENTRY4(PINSR, V,dq, H,dq, E,y, vex5 cpuid(SSE4= 1) p_66), + + [0x40] =3D X86_OP_ENTRY4(VDDPS, V,x, H,x, W,x, vex2 cpuid(SSE4= 1) p_66), + [0x41] =3D X86_OP_ENTRY4(VDDPD, V,dq, H,dq, W,dq, vex2 cpuid(SSE4= 1) p_66), + [0x42] =3D X86_OP_ENTRY4(VMPSADBW, V,x, H,x, W,x, vex2 cpuid(SSE4= 1) avx2_256 p_66), + [0x44] =3D X86_OP_ENTRY4(PCLMULQDQ, V,dq, H,dq, W,dq, vex4 cpuid(PCLM= ULQDQ) p_66), + [0x46] =3D X86_OP_ENTRY4(VPERM2x128, V,qq, H,qq, W,qq, vex6 cpuid(AVX2= ) p_66), + + [0x60] =3D X86_OP_ENTRY4(PCMPESTRM, None,None, V,dq, W,dq, vex4_unal = cpuid(SSE42) p_66), + [0x61] =3D X86_OP_ENTRY4(PCMPESTRI, None,None, V,dq, W,dq, vex4_unal = cpuid(SSE42) p_66), + [0x62] =3D X86_OP_ENTRY4(PCMPISTRM, None,None, V,dq, W,dq, vex4_unal = cpuid(SSE42) p_66), + [0x63] =3D X86_OP_ENTRY4(PCMPISTRI, None,None, V,dq, W,dq, vex4_unal = cpuid(SSE42) p_66), + + [0x08] =3D X86_OP_ENTRY3(VROUNDPS, V,x, W,x, I,b, vex2 cpuid(SSE4= 1) p_66), + [0x09] =3D X86_OP_ENTRY3(VROUNDPD, V,x, W,x, I,b, vex2 cpuid(SSE4= 1) p_66), + /* + * Not listed as four operand in the manual. Also writes and reads 12= 8-bits + * from the first two operands due to the V operand picking higher ent= ries of + * the H operand; the "Vss,Hss,Wss" description from the manual is inc= orrect. + * For other unary operations such as VSQRTSx this is hidden by the "R= EPScalar" + * value of vex_special, because the table lists the operand types of = VSQRTPx. + */ + [0x0a] =3D X86_OP_ENTRY4(VROUNDSS, V,x, H,x, W,ss, vex3 cpuid(SSE41= ) p_66), + [0x0b] =3D X86_OP_ENTRY4(VROUNDSD, V,x, H,x, W,sd, vex3 cpuid(SSE41= ) p_66), + [0x0c] =3D X86_OP_ENTRY4(VBLENDPS, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) p_66), + [0x0d] =3D X86_OP_ENTRY4(VBLENDPD, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) p_66), + [0x0e] =3D X86_OP_ENTRY4(VPBLENDW, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) p_66), + [0x0f] =3D X86_OP_ENTRY4(PALIGNR, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx p_00_66), + + [0x18] =3D X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,qq, vex6 cpuid(AV= X) p_66), + [0x19] =3D X86_OP_ENTRY3(VEXTRACTx128, W,dq, V,qq, I,b, vex6 cpuid(AV= X) p_66), + + [0x38] =3D X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,qq, vex6 cpuid(AV= X2) p_66), + [0x39] =3D X86_OP_ENTRY3(VEXTRACTx128, W,dq, V,qq, I,b, vex6 cpuid(AV= X2) p_66), + + /* Listed incorrectly as type 4 */ + [0x4a] =3D X86_OP_ENTRY4(VBLENDVPS, V,x, H,x, W,x, vex6 cpuid(AVX)= p_66), + [0x4b] =3D X86_OP_ENTRY4(VBLENDVPD, V,x, H,x, W,x, vex6 cpuid(AVX)= p_66), + [0x4c] =3D X86_OP_ENTRY4(VPBLENDVB, V,x, H,x, W,x, vex6 cpuid(AVX)= p_66 avx2_256), + + [0xdf] =3D X86_OP_ENTRY3(VAESKEYGEN, V,dq, W,dq, I,b, vex4 cpuid(AES)= p_66), + [0xF0] =3D X86_OP_ENTRY3(RORX, G,y, E,y, I,b, vex13 cpuid(BMI2) p_f2), }; =20 @@ -916,6 +987,10 @@ static bool decode_insn(DisasContext *s, CPUX86State *= env, X86DecodeFunc decode_ } } if (e->op3 !=3D X86_TYPE_None) { + /* + * A couple instructions actually use the extra immediate byte for= an Lx + * register operand; those are handled in the gen_* functions as o= ne off. + */ assert(e->op3 =3D=3D X86_TYPE_I && e->s3 =3D=3D X86_SIZE_b); s->rip_offset +=3D 1; } diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 4227ddd9f3..062c92e45a 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -473,6 +473,55 @@ HORIZONTAL_FP_SSE(VHADD, hadd) HORIZONTAL_FP_SSE(VHSUB, hsub) HORIZONTAL_FP_SSE(VADDSUB, addsub) =20 +static inline void gen_ternary_sse(DisasContext *s, CPUX86State *env, X86D= ecodedInsn *decode, + int op3, SSEFunc_0_epppp xmm, SSEFunc_0= _epppp ymm) +{ + SSEFunc_0_epppp fn =3D s->vex_l ? ymm : xmm; + TCGv_ptr ptr3 =3D tcg_temp_new_ptr(); + + /* The format of the fourth input is Lx */ + tcg_gen_addi_ptr(ptr3, cpu_env, ZMM_OFFSET(op3)); + fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, ptr3); + tcg_temp_free_ptr(ptr3); +} +#define TERNARY_SSE(uvname, lname) = \ +static void gen_##uvname(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) \ +{ = \ + gen_ternary_sse(s, env, decode, (uint8_t)decode->immediate >> 4, = \ + gen_helper_##lname##_xmm, gen_helper_##lname##_ymm); = \ +} +TERNARY_SSE(VBLENDVPS, blendvps) +TERNARY_SSE(VBLENDVPD, blendvpd) +TERNARY_SSE(VPBLENDVB, pblendvb) + +static inline void gen_binary_imm_sse(DisasContext *s, CPUX86State *env, X= 86DecodedInsn *decode, + SSEFunc_0_epppi xmm, SSEFunc_0_epppi= ymm) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + if (!s->vex_l) { + xmm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); + } else { + ymm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); + } +} + +#define BINARY_IMM_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_binary_imm_sse(s, env, decode, = \ + gen_helper_##lname##_xmm, = \ + gen_helper_##lname##_ymm); = \ +} + +BINARY_IMM_SSE(VBLENDPD, blendpd) +BINARY_IMM_SSE(VBLENDPS, blendps) +BINARY_IMM_SSE(VPBLENDW, pblendw) +BINARY_IMM_SSE(VDDPS, dpps) +#define gen_helper_dppd_ymm NULL +BINARY_IMM_SSE(VDDPD, dppd) +BINARY_IMM_SSE(VMPSADBW, mpsadbw) +BINARY_IMM_SSE(PCLMULQDQ, pclmulqdq) + #define BINARY_INT_GVEC(uname, func, ...) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ { = \ @@ -638,6 +687,32 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod UNARY_IMM_SSE(PSHUFD, pshufd) UNARY_IMM_SSE(PSHUFHW, pshufhw) UNARY_IMM_SSE(PSHUFLW, pshuflw) +#define gen_helper_vpermq_xmm NULL +UNARY_IMM_SSE(VPERMQ, vpermq) +UNARY_IMM_SSE(VPERMILPS_i, vpermilps_imm) +UNARY_IMM_SSE(VPERMILPD_i, vpermilpd_imm) + +static inline void gen_unary_imm_fp_sse(DisasContext *s, CPUX86State *env,= X86DecodedInsn *decode, + SSEFunc_0_eppi xmm, SSEFunc_0_eppi= ymm) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + if (!s->vex_l) { + xmm(cpu_env, OP_PTR0, OP_PTR1, imm); + } else { + ymm(cpu_env, OP_PTR0, OP_PTR1, imm); + } +} + +#define UNARY_IMM_FP_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_unary_imm_fp_sse(s, env, decode, = \ + gen_helper_##lname##_xmm, = \ + gen_helper_##lname##_ymm); = \ +} + +UNARY_IMM_FP_SSE(VROUNDPS, roundps) +UNARY_IMM_FP_SSE(VROUNDPD, roundpd) =20 static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_= op) { @@ -957,6 +1032,18 @@ static void gen_MULX(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) =20 } =20 +static void gen_PALIGNR(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + if (!(s->prefix & PREFIX_DATA)) { + gen_helper_palignr_mmx(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); + } else if (!s->vex_l) { + gen_helper_palignr_xmm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); + } else { + gen_helper_palignr_ymm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); + } +} + static void gen_PANDN(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) { int vec_len =3D vector_len(s, decode); @@ -967,6 +1054,42 @@ static void gen_PANDN(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode) decode->op[1].offset, vec_len, vec_len); } =20 +static void gen_PCMPESTRI(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + gen_helper_pcmpestri_xmm(cpu_env, OP_PTR1, OP_PTR2, imm); + set_cc_op(s, CC_OP_EFLAGS); +} + +static void gen_PCMPESTRM(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + gen_helper_pcmpestrm_xmm(cpu_env, OP_PTR1, OP_PTR2, imm); + set_cc_op(s, CC_OP_EFLAGS); + if ((s->prefix & PREFIX_VEX) && !s->vex_l) { + tcg_gen_gvec_dup_imm(MO_64, offsetof(CPUX86State, xmm_regs[0].ZMM_= X(1)), + 16, 16, 0); + } +} + +static void gen_PCMPISTRI(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + gen_helper_pcmpistri_xmm(cpu_env, OP_PTR1, OP_PTR2, imm); + set_cc_op(s, CC_OP_EFLAGS); +} + +static void gen_PCMPISTRM(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + gen_helper_pcmpistrm_xmm(cpu_env, OP_PTR1, OP_PTR2, imm); + set_cc_op(s, CC_OP_EFLAGS); + if ((s->prefix & PREFIX_VEX) && !s->vex_l) { + tcg_gen_gvec_dup_imm(MO_64, offsetof(CPUX86State, xmm_regs[0].ZMM_= X(1)), + 16, 16, 0); + } +} + static void gen_PDEP(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { MemOp ot =3D decode->op[1].ot; @@ -985,6 +1108,89 @@ static void gen_PEXT(DisasContext *s, CPUX86State *en= v, X86DecodedInsn *decode) gen_helper_pext(s->T0, s->T0, s->T1); } =20 +static inline void gen_pextr(DisasContext *s, CPUX86State *env, X86Decoded= Insn *decode, MemOp ot) +{ + int vec_len =3D vector_len(s, decode); + int mask =3D (vec_len >> ot) - 1; + int val =3D decode->immediate & mask; + + switch (ot) { + case MO_8: + tcg_gen_ld8u_tl(s->T0, cpu_env, vector_elem_offset(&decode->op[1],= ot, val)); + break; + case MO_16: + tcg_gen_ld16u_tl(s->T0, cpu_env, vector_elem_offset(&decode->op[1]= , ot, val)); + break; + case MO_32: +#ifdef TARGET_X86_64 + tcg_gen_ld32u_tl(s->T0, cpu_env, vector_elem_offset(&decode->op[1]= , ot, val)); + break; + case MO_64: +#endif + tcg_gen_ld_tl(s->T0, cpu_env, vector_elem_offset(&decode->op[1], o= t, val)); + break; + default: + abort(); + } +} + +static void gen_PEXTRB(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + gen_pextr(s, env, decode, MO_8); +} + +static void gen_PEXTRW(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + gen_pextr(s, env, decode, MO_16); +} + +static void gen_PEXTR(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + MemOp ot =3D decode->op[0].ot; + gen_pextr(s, env, decode, ot); +} + +static inline void gen_pinsr(DisasContext *s, CPUX86State *env, X86Decoded= Insn *decode, MemOp ot) +{ + int vec_len =3D vector_len(s, decode); + int mask =3D (vec_len >> ot) - 1; + int val =3D decode->immediate & mask; + + if (decode->op[1].offset !=3D decode->op[0].offset) { + assert(vec_len =3D=3D 16); + gen_store_sse(s, decode, decode->op[1].offset); + } + + switch (ot) { + case MO_8: + tcg_gen_st8_tl(s->T1, cpu_env, vector_elem_offset(&decode->op[0], = ot, val)); + break; + case MO_16: + tcg_gen_st16_tl(s->T1, cpu_env, vector_elem_offset(&decode->op[0],= ot, val)); + break; + case MO_32: +#ifdef TARGET_X86_64 + tcg_gen_st32_tl(s->T1, cpu_env, vector_elem_offset(&decode->op[0],= ot, val)); + break; + case MO_64: +#endif + tcg_gen_st_tl(s->T1, cpu_env, vector_elem_offset(&decode->op[0], o= t, val)); + break; + default: + abort(); + } +} + +static void gen_PINSRB(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + gen_pinsr(s, env, decode, MO_8); +} + +static void gen_PINSR(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + gen_pinsr(s, env, decode, decode->op[2].ot); +} + static void gen_PMOVMSKB(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) { if (s->prefix & PREFIX_DATA) { @@ -1193,6 +1399,13 @@ static void gen_SHRX(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode) tcg_gen_shr_tl(s->T0, s->T0, s->T1); } =20 +static void gen_VAESKEYGEN(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + assert(!s->vex_l); + gen_helper_aeskeygenassist_xmm(cpu_env, OP_PTR0, OP_PTR1, imm); +} + static void gen_VCVTfp2fp(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) { gen_unary_fp_sse(s, env, decode, @@ -1201,6 +1414,102 @@ static void gen_VCVTfp2fp(DisasContext *s, CPUX86St= ate *env, X86DecodedInsn *dec gen_helper_cvtsd2ss, gen_helper_cvtss2sd); } =20 +static void gen_VEXTRACTx128(DisasContext *s, CPUX86State *env, X86Decoded= Insn *decode) +{ + int mask =3D decode->immediate & 1; + int src_ofs =3D vector_elem_offset(&decode->op[1], MO_128, mask); + if (decode->op[0].has_ea) { + /* VEX-only instruction, no alignment requirements. */ + gen_sto_env_A0(s, src_ofs, false); + } else { + tcg_gen_gvec_mov(MO_64, decode->op[0].offset, src_ofs, 16, 16); + } +} + +static void gen_VEXTRACTPS(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + gen_pextr(s, env, decode, MO_32); +} + +static void gen_vinsertps(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + int val =3D decode->immediate; + int dest_word =3D (val >> 4) & 3; + int new_mask =3D (val & 15) | (1 << dest_word); + int vec_len =3D 16; + + assert(!s->vex_l); + + if (new_mask =3D=3D 15) { + /* All zeroes except possibly for the inserted element */ + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len= , 0); + } else if (decode->op[1].offset !=3D decode->op[0].offset) { + gen_store_sse(s, decode, decode->op[1].offset); + } + + if (new_mask !=3D (val & 15)) { + tcg_gen_st_i32(s->tmp2_i32, cpu_env, + vector_elem_offset(&decode->op[0], MO_32, dest_word= )); + } + + if (new_mask !=3D 15) { + TCGv_i32 zero =3D tcg_constant_i32(0); /* float32_zero */ + int i; + for (i =3D 0; i < 4; i++) { + if ((val >> i) & 1) { + tcg_gen_st_i32(zero, cpu_env, + vector_elem_offset(&decode->op[0], MO_32, i= )); + } + } + } +} + +static void gen_VINSERTPS_r(DisasContext *s, CPUX86State *env, X86DecodedI= nsn *decode) +{ + int val =3D decode->immediate; + tcg_gen_ld_i32(s->tmp2_i32, cpu_env, + vector_elem_offset(&decode->op[2], MO_32, (val >> 6) & = 3)); + gen_vinsertps(s, env, decode); +} + +static void gen_VINSERTPS_m(DisasContext *s, CPUX86State *env, X86DecodedI= nsn *decode) +{ + tcg_gen_qemu_ld_i32(s->tmp2_i32, s->A0, s->mem_index, MO_LEUL); + gen_vinsertps(s, env, decode); +} + +static void gen_VINSERTx128(DisasContext *s, CPUX86State *env, X86DecodedI= nsn *decode) +{ + int mask =3D decode->immediate & 1; + tcg_gen_gvec_mov(MO_64, + decode->op[0].offset + offsetof(YMMReg, YMM_X(mask)), + decode->op[2].offset + offsetof(YMMReg, YMM_X(0)), 16= , 16); + tcg_gen_gvec_mov(MO_64, + decode->op[0].offset + offsetof(YMMReg, YMM_X(!mask)), + decode->op[1].offset + offsetof(YMMReg, YMM_X(!mask))= , 16, 16); +} + +static void gen_VPERM2x128(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + assert(s->vex_l); + gen_helper_vpermdq_ymm(OP_PTR0, OP_PTR1, OP_PTR2, imm); +} + +static void gen_VROUNDSD(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + assert(!s->vex_l); + gen_helper_roundsd_xmm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); +} + +static void gen_VROUNDSS(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); + assert(!s->vex_l); + gen_helper_roundss_xmm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); +} + static void gen_VZEROALL(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) { TCGv_ptr ptr =3D tcg_temp_new_ptr(); diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 95d48eb508..857008835a 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4782,7 +4782,8 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) use_new &=3D b <=3D limit; #endif if (use_new && - ((b >=3D 0x150 && b <=3D 0x17f) || + (b =3D=3D 0x13a || + (b >=3D 0x150 && b <=3D 0x17f) || (b >=3D 0x1d0 && b <=3D 0x1ff))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101148; cv=none; d=zohomail.com; s=zohoarc; b=Sx6svz/kJpPZi8SHlnb2djNgSer+rh0gl+JFRrDsUy2J/0LYE39PxJicRmore1GM4t2fqts0jOThgWMKHOomB7uFz9jZscTbJOwcfAnEcAmai68u9nwpjiIoYv/FZ45q3qkkDNuaP5gQgvc5Ez4wfmn8+9VxhfPq1W1k6L/JnJI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101148; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=k229EqfcdmSEeYRUd9pze+gwJ+qeSPgXw5lbUelqaYo=; b=Luaq7egjaAZcnUwq+FsrU6jpHA7A0FABGhbHziBM/mOBTJfdPZaUhcye+WhEwCEjdkqWisLSxNFX7xKdvXe5dA7EnvK7xEAju0yDXKrd+ZQX+xg2+t4uzGCnwox7cB7/ggpiUKMHqrCux4RjSAUibHBUCxzpICCSxGyeNBVOsts= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666101148730921.5126629298471; Tue, 18 Oct 2022 06:52:28 -0700 (PDT) Received: from localhost ([::1]:34698 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn18-0001wv-6H for importer@patchew.org; Tue, 18 Oct 2022 09:52:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46824) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiT-0004TA-UE for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:24387) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiR-0005P7-8Q for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:09 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-552-X-kBsRjWNSyuH-HSpRc9TA-1; Tue, 18 Oct 2022 09:33:04 -0400 Received: by mail-ed1-f71.google.com with SMTP id x19-20020a05640226d300b0045dc858ce29so2210169edd.7 for ; Tue, 18 Oct 2022 06:33:04 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id ky18-20020a170907779200b00780a26edfcesm7556087ejc.60.2022.10.18.06.33.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099986; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k229EqfcdmSEeYRUd9pze+gwJ+qeSPgXw5lbUelqaYo=; b=WdzOvogJ/b/RlS2R/8NjDfHQzsRADM1NH52rN3IlT8TDAK+0t7gMDT6ONWZGak+NBhReoK cN+FsGGu6gSe7pLtqo0Y6Rfp3sT3BZ73RvCwK+b6WEN0EXq8ls5P7PRLpp3cxFlFArws3t HpfeCoJI5ajsQFVJFKCIbjGsTWhMy3s= X-MC-Unique: X-kBsRjWNSyuH-HSpRc9TA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=k229EqfcdmSEeYRUd9pze+gwJ+qeSPgXw5lbUelqaYo=; b=DW65dV6n68AYfHjeE10mkkbIxVKOXtzSmGYKGTo8gkACWH3+LtHS1WAqryJ3vBylcS 3QSWTwX2BE4nx0oJJcaLZ1xv/ZKuLsXlPZD69aNEsGylHT6C/YxBmsI0SQeewSsZc74J 48gyheahZ7XziKRp0YUDfWn3lZpHWT7/+FkP8qmAYBOJrWH1OSpiaABVJok5oOz2k4Ay hKIORyDBgGMcYhzI+DpX/aoOY+TusDsblNLYO00qTKo1zftOxRYUA07imjuh+GaX2n/Q aHk/8xw4fpfHywevon78DL+BAuzbezv75ADr4tCK+kUGSpJwlpmsL+/MQgpmziA2Rth0 Dxrw== X-Gm-Message-State: ACrzQf26FO6JVJ4hx21yIlvbi5KXlTLR8sZav6Bqj5JqeNqiFRabSYmd UOTlC+TuNSKU/BK14fKtpR02cRyls4pwUwcHDrsZ9y3PdlKtALNaYq19KOEAoCGFWTk9zjZpNgB 0TNErZUOPr0Kheqbq/YUTyRXUoBKsoG7FG2YrKoLk2ODymFuHxfoTYoau9Og6HS3TC9U= X-Received: by 2002:a17:906:9be9:b0:78d:2f63:10dd with SMTP id de41-20020a1709069be900b0078d2f6310ddmr2424265ejc.479.1666099982930; Tue, 18 Oct 2022 06:33:02 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7ZeKi1lyzbkWtJK8MNj7BdjP1u61EgZ1At+aEZTUkujoBylJDo50RplQSaPXViuRmV5Xk2WA== X-Received: by 2002:a17:906:9be9:b0:78d:2f63:10dd with SMTP id de41-20020a1709069be900b0078d2f6310ddmr2424239ejc.479.1666099982550; Tue, 18 Oct 2022 06:33:02 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 43/53] target/i386: Use tcg gvec ops for pmovmskb Date: Tue, 18 Oct 2022 15:30:32 +0200 Message-Id: <20221018133042.856368-44-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101149451100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson As pmovmskb is used by strlen et al, this is the third highest overhead sse operation at %0.8. Signed-off-by: Richard Henderson [Reorganize to generate code for any vector size. - Paolo] Signed-off-by: Paolo Bonzini --- target/i386/tcg/emit.c.inc | 88 +++++++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 062c92e45a..ad93094ca8 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1191,14 +1191,92 @@ static void gen_PINSR(DisasContext *s, CPUX86State = *env, X86DecodedInsn *decode) gen_pinsr(s, env, decode, decode->op[2].ot); } =20 +static void gen_pmovmskb_i64(TCGv_i64 d, TCGv_i64 s) +{ + TCGv_i64 t =3D tcg_temp_new_i64(); + + tcg_gen_andi_i64(d, s, 0x8080808080808080ull); + + /* + * After each shift+or pair: + * 0: a.......b.......c.......d.......e.......f.......g.......h....... + * 7: ab......bc......cd......de......ef......fg......gh......h....... + * 14: abcd....bcde....cdef....defg....efgh....fgh.....gh......h....... + * 28: abcdefghbcdefgh.cdefgh..defgh...efgh....fgh.....gh......h....... + * The result is left in the high bits of the word. + */ + tcg_gen_shli_i64(t, d, 7); + tcg_gen_or_i64(d, d, t); + tcg_gen_shli_i64(t, d, 14); + tcg_gen_or_i64(d, d, t); + tcg_gen_shli_i64(t, d, 28); + tcg_gen_or_i64(d, d, t); +} + +static void gen_pmovmskb_vec(unsigned vece, TCGv_vec d, TCGv_vec s) +{ + TCGv_vec t =3D tcg_temp_new_vec_matching(d); + TCGv_vec m =3D tcg_constant_vec_matching(d, MO_8, 0x80); + + /* See above */ + tcg_gen_and_vec(vece, d, s, m); + tcg_gen_shli_vec(vece, t, d, 7); + tcg_gen_or_vec(vece, d, d, t); + tcg_gen_shli_vec(vece, t, d, 14); + tcg_gen_or_vec(vece, d, d, t); + tcg_gen_shli_vec(vece, t, d, 28); + tcg_gen_or_vec(vece, d, d, t); +} + +#ifdef TARGET_X86_64 +#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64 +#else +#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32 +#endif + static void gen_PMOVMSKB(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) { - if (s->prefix & PREFIX_DATA) { - gen_helper_pmovmskb_xmm(s->tmp2_i32, cpu_env, OP_PTR2); - } else { - gen_helper_pmovmskb_mmx(s->tmp2_i32, cpu_env, OP_PTR2); + static const TCGOpcode vecop_list[] =3D { INDEX_op_shli_vec, 0 }; + static const GVecGen2 g =3D { + .fni8 =3D gen_pmovmskb_i64, + .fniv =3D gen_pmovmskb_vec, + .opt_opc =3D vecop_list, + .vece =3D MO_64, + .prefer_i64 =3D TCG_TARGET_REG_BITS =3D=3D 64 + }; + MemOp ot =3D decode->op[2].ot; + int vec_len =3D vector_len(s, decode); + TCGv t =3D tcg_temp_new(); + + tcg_gen_gvec_2(offsetof(CPUX86State, xmm_t0) + xmm_offset(ot), decode-= >op[2].offset, + vec_len, vec_len, &g); + tcg_gen_ld8u_tl(s->T0, cpu_env, offsetof(CPUX86State, xmm_t0.ZMM_B(vec= _len - 1))); + while (vec_len > 8) { + vec_len -=3D 8; + if (TCG_TARGET_HAS_extract2_tl) { + /* + * Load the next byte of the result into the high byte of T. + * TCG does a similar expansion of deposit to shl+extract2; by + * loading the whole word, the shift left is avoided. + */ +#ifdef TARGET_X86_64 + tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, xmm_t0.ZMM_Q((= vec_len - 1) / 8))); +#else + tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, xmm_t0.ZMM_L((= vec_len - 1) / 4))); +#endif + + tcg_gen_extract2_tl(s->T0, t, s->T0, TARGET_LONG_BITS - 8); + } else { + /* + * The _previous_ value is deposited into bits 8 and higher of= t. Because + * those bits are known to be zero after ld8u, this becomes a = shift+or + * if deposit is not available. + */ + tcg_gen_ld8u_tl(t, cpu_env, offsetof(CPUX86State, xmm_t0.ZMM_B= (vec_len - 1))); + tcg_gen_deposit_tl(s->T0, t, s->T0, 8, TARGET_LONG_BITS - 8); + } } - tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); + tcg_temp_free(t); } =20 static void gen_PSHUFW(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103479; cv=none; d=zohomail.com; s=zohoarc; b=l1OGP6dzPiyx9vV0sAVqHUcyMmt1VKxVUwsO3594zaV0GxDztK0oIeZuUHcyZg9vFrkkQ5uHPw9nHBIfNgTsw8T8gd8TbuJfBu3K0TwXsyyzrAc2LXPAtui9pajXaLUkDgPTqSbeAaRH4QgV/v7urI1JwLZ5zF+c0NR4d0wnA9E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103479; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=H2tUGOXuI0TyN5MG0uj5kKIsjD0MT6rNQlPHoQhF8uI=; b=iuL4oJ1+4H7yoxodI1TYF27gMdF0ZpVAseFRTs0bhe2xW2kVZqufVRkP7Qv4HpJUaE1UlX26pP92ex2u/x6G3010sg1LQG/jD1BzQ8v8qlxmWLvum8i61YaDr5wNJ3Et+T2e2JWuAJ35k+qHi0VQzmqfloPqqy3VWbb0Urt/Tak= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103479388908.2353232303205; Tue, 18 Oct 2022 07:31:19 -0700 (PDT) Received: from localhost ([::1]:49638 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okncj-0008FA-4z for importer@patchew.org; Tue, 18 Oct 2022 10:31:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52852) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiu-0005DR-C3 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:40 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:24130) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmil-0005Rk-S1 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:32 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-621-ATNEBcAwME2Umcjm2NCqGg-1; Tue, 18 Oct 2022 09:33:17 -0400 Received: by mail-ed1-f72.google.com with SMTP id z20-20020a05640240d400b0045cec07c3dcso11498680edb.3 for ; Tue, 18 Oct 2022 06:33:17 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id 18-20020a170906211200b0078ddb518a90sm7433716ejt.223.2022.10.18.06.33.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100003; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H2tUGOXuI0TyN5MG0uj5kKIsjD0MT6rNQlPHoQhF8uI=; b=KDNbdpa79ObxtmqB+ViuMHmXDK68YdF+rLPJ3HBzf6RdNgYXz6fgpSxSqXEMaQUm0r7R6P /BI3ZME9/wM/A/L96itBcv/xAT8ek37N/DbU4K4celg7TyGWp1bRW4OpcKeQCJkUmMFzXT UTIFOMlp1FnTdr88oCC3fWYDBg5TKSw= X-MC-Unique: ATNEBcAwME2Umcjm2NCqGg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=H2tUGOXuI0TyN5MG0uj5kKIsjD0MT6rNQlPHoQhF8uI=; b=VDSkkjQTEpTCYFdkyJ7I3UX7l80MF+ZfGqCpADhjTz+ont0NWfDFCJcW3yCPnhYOwH choFdqpFuRItwfnZ+gwrHQDfcSJvILk48bhQvFxh3uMvc4Evm4tkk2i+mJvR1eRAdv0n BihqXObHLhVYxzfgXE/bnHhlWnxyH3CqhMYC8N+idmZcg0gl6YHrZi/vV4ymC8cauOUL HRa2hVy7v1aPAWuqw8QA4j/xaenyKau2bxIsTSRQiJyGMmWRSRng8dohL3ZD3a8Dzp5f CTrfi4WCQwGa8PdC8pzCbTbivfdUrMWjWyhh7Jwv9Dxp5nf1H1wQ7H+UfDZNv6iZHvGO IfLA== X-Gm-Message-State: ACrzQf39KRdiIWCZn+1NLLKC40+0+w7MetEQl1QwWtjjnrgmuWLUbBVZ DGylI02gT/2Oe14VT19jPe12SevPHtbT1cj86okrZ/p5L25wT+FZLKOutSa5yYEpa+BAqn+y2Uh njsqIo6BO7vqzih/msnkoctz8dgGiLXqJVeiATG/UXDGANqr4Iv4Ekca/rB0/BARVm5c= X-Received: by 2002:a05:6402:26cf:b0:45d:48d7:928e with SMTP id x15-20020a05640226cf00b0045d48d7928emr2544288edd.275.1666099988857; Tue, 18 Oct 2022 06:33:08 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7Xqa5eMU2i6Qf5FT3NvPuiSKDW+MTFG7pFV8tll6OjK/XNuQQZ7UsY88ulXPf7pt6VfR1KeQ== X-Received: by 2002:a05:6402:26cf:b0:45d:48d7:928e with SMTP id x15-20020a05640226cf00b0045d48d7928emr2544218edd.275.1666099987937; Tue, 18 Oct 2022 06:33:07 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 44/53] target/i386: reimplement 0x0f 0x38, add AVX Date: Tue, 18 Oct 2022 15:30:33 +0200 Message-Id: <20221018133042.856368-45-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103479877100001 Content-Type: text/plain; charset="utf-8" There are several special cases here: 1) extending moves have different widths for the helpers vs. for the memory loads, and the width for memory loads depends on VEX.L too. This is represented by X86_SPECIAL_AVXExtMov. 2) some instructions, such as variable-width shifts, select the vector elem= ent size via REX.W. 3) VSIB instructions (VGATHERxPy, VPGATHERxy) are also part of this group, and they have (among other things) two output operands. 3) the macros for 4-operand blends (which are under 0x0f 0x3a) have to be extended to support 2-operand blends. The 2-operand variant actually came a few years earlier, but it is clearer to implement them in the opposite order. X86_TYPE_WM, introduced earlier for unaligned loads, is reused for helpers that accept a Reg* but have a M argument. These three-byte opcodes also include AVX new instructions, for which the helpers were originally implemented by Paul Brook . Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 188 +++++++++++++++++++++++++++- target/i386/ops_sse_header.h | 19 +++ target/i386/tcg/decode-new.c.inc | 112 ++++++++++++++++- target/i386/tcg/decode-new.h | 6 + target/i386/tcg/emit.c.inc | 205 ++++++++++++++++++++++++++++++- target/i386/tcg/translate.c | 2 +- 6 files changed, 524 insertions(+), 8 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index cb8909adcf..e3cc6948dd 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -2382,6 +2382,36 @@ void glue(helper_aeskeygenassist, SUFFIX)(CPUX86Stat= e *env, Reg *d, Reg *s, #endif =20 #if SHIFT >=3D 1 +void glue(helper_vpermilpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg = *s) +{ + uint64_t r0, r1; + int i; + + for (i =3D 0; i < 1 << SHIFT; i +=3D 2) { + r0 =3D v->Q(i + ((s->Q(i) >> 1) & 1)); + r1 =3D v->Q(i + ((s->Q(i+1) >> 1) & 1)); + d->Q(i) =3D r0; + d->Q(i+1) =3D r1; + } +} + +void glue(helper_vpermilps, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg = *s) +{ + uint32_t r0, r1, r2, r3; + int i; + + for (i =3D 0; i < 2 << SHIFT; i +=3D 4) { + r0 =3D v->L(i + (s->L(i) & 3)); + r1 =3D v->L(i + (s->L(i+1) & 3)); + r2 =3D v->L(i + (s->L(i+2) & 3)); + r3 =3D v->L(i + (s->L(i+3) & 3)); + d->L(i) =3D r0; + d->L(i+1) =3D r1; + d->L(i+2) =3D r2; + d->L(i+3) =3D r3; + } +} + void glue(helper_vpermilpd_imm, SUFFIX)(Reg *d, Reg *s, uint32_t order) { uint64_t r0, r1; @@ -2414,6 +2444,150 @@ void glue(helper_vpermilps_imm, SUFFIX)(Reg *d, Reg= *s, uint32_t order) } } =20 +#if SHIFT =3D=3D 1 +#define FPSRLVD(x, c) (c < 32 ? ((x) >> c) : 0) +#define FPSRLVQ(x, c) (c < 64 ? ((x) >> c) : 0) +#define FPSRAVD(x, c) ((int32_t)(x) >> (c < 32 ? c : 31)) +#define FPSRAVQ(x, c) ((int64_t)(x) >> (c < 64 ? c : 63)) +#define FPSLLVD(x, c) (c < 32 ? ((x) << c) : 0) +#define FPSLLVQ(x, c) (c < 64 ? ((x) << c) : 0) +#endif + +SSE_HELPER_L(helper_vpsrlvd, FPSRLVD) +SSE_HELPER_L(helper_vpsravd, FPSRAVD) +SSE_HELPER_L(helper_vpsllvd, FPSLLVD) + +SSE_HELPER_Q(helper_vpsrlvq, FPSRLVQ) +SSE_HELPER_Q(helper_vpsravq, FPSRAVQ) +SSE_HELPER_Q(helper_vpsllvq, FPSLLVQ) + +void glue(helper_vtestps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + uint32_t zf =3D 0, cf =3D 0; + int i; + + for (i =3D 0; i < 2 << SHIFT; i++) { + zf |=3D (s->L(i) & d->L(i)); + cf |=3D (s->L(i) & ~d->L(i)); + } + CC_SRC =3D ((zf >> 31) ? 0 : CC_Z) | ((cf >> 31) ? 0 : CC_C); +} + +void glue(helper_vtestpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + uint64_t zf =3D 0, cf =3D 0; + int i; + + for (i =3D 0; i < 1 << SHIFT; i++) { + zf |=3D (s->Q(i) & d->Q(i)); + cf |=3D (s->Q(i) & ~d->Q(i)); + } + CC_SRC =3D ((zf >> 63) ? 0 : CC_Z) | ((cf >> 63) ? 0 : CC_C); +} + +void glue(helper_vpmaskmovd_st, SUFFIX)(CPUX86State *env, + Reg *v, Reg *s, target_ulong a0) +{ + int i; + + for (i =3D 0; i < (2 << SHIFT); i++) { + if (v->L(i) >> 31) { + cpu_stl_data_ra(env, a0 + i * 4, s->L(i), GETPC()); + } + } +} + +void glue(helper_vpmaskmovq_st, SUFFIX)(CPUX86State *env, + Reg *v, Reg *s, target_ulong a0) +{ + int i; + + for (i =3D 0; i < (1 << SHIFT); i++) { + if (v->Q(i) >> 63) { + cpu_stq_data_ra(env, a0 + i * 8, s->Q(i), GETPC()); + } + } +} + +void glue(helper_vpmaskmovd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg= *s) +{ + int i; + + for (i =3D 0; i < (2 << SHIFT); i++) { + d->L(i) =3D (v->L(i) >> 31) ? s->L(i) : 0; + } +} + +void glue(helper_vpmaskmovq, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg= *s) +{ + int i; + + for (i =3D 0; i < (1 << SHIFT); i++) { + d->Q(i) =3D (v->Q(i) >> 63) ? s->Q(i) : 0; + } +} + +void glue(helper_vpgatherdd, SUFFIX)(CPUX86State *env, + Reg *d, Reg *v, Reg *s, target_ulong a0, unsigned scale) +{ + int i; + for (i =3D 0; i < (2 << SHIFT); i++) { + if (v->L(i) >> 31) { + target_ulong addr =3D a0 + + ((target_ulong)(int32_t)s->L(i) << scale); + d->L(i) =3D cpu_ldl_data_ra(env, addr, GETPC()); + } + v->L(i) =3D 0; + } +} + +void glue(helper_vpgatherdq, SUFFIX)(CPUX86State *env, + Reg *d, Reg *v, Reg *s, target_ulong a0, unsigned scale) +{ + int i; + for (i =3D 0; i < (1 << SHIFT); i++) { + if (v->Q(i) >> 63) { + target_ulong addr =3D a0 + + ((target_ulong)(int32_t)s->L(i) << scale); + d->Q(i) =3D cpu_ldq_data_ra(env, addr, GETPC()); + } + v->Q(i) =3D 0; + } +} + +void glue(helper_vpgatherqd, SUFFIX)(CPUX86State *env, + Reg *d, Reg *v, Reg *s, target_ulong a0, unsigned scale) +{ + int i; + for (i =3D 0; i < (1 << SHIFT); i++) { + if (v->L(i) >> 31) { + target_ulong addr =3D a0 + + ((target_ulong)(int64_t)s->Q(i) << scale); + d->L(i) =3D cpu_ldl_data_ra(env, addr, GETPC()); + } + v->L(i) =3D 0; + } + for (i /=3D 2; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + v->Q(i) =3D 0; + } +} + +void glue(helper_vpgatherqq, SUFFIX)(CPUX86State *env, + Reg *d, Reg *v, Reg *s, target_ulong a0, unsigned scale) +{ + int i; + for (i =3D 0; i < (1 << SHIFT); i++) { + if (v->Q(i) >> 63) { + target_ulong addr =3D a0 + + ((target_ulong)(int64_t)s->Q(i) << scale); + d->Q(i) =3D cpu_ldq_data_ra(env, addr, GETPC()); + } + v->Q(i) =3D 0; + } +} +#endif + #if SHIFT >=3D 2 void helper_vpermdq_ymm(Reg *d, Reg *v, Reg *s, uint32_t order) { @@ -2473,7 +2647,19 @@ void helper_vpermq_ymm(Reg *d, Reg *s, uint32_t orde= r) d->Q(2) =3D r2; d->Q(3) =3D r3; } -#endif + +void helper_vpermd_ymm(Reg *d, Reg *v, Reg *s) +{ + uint32_t r[8]; + int i; + + for (i =3D 0; i < 8; i++) { + r[i] =3D s->L(v->L(i) & 7); + } + for (i =3D 0; i < 8; i++) { + d->L(i) =3D r[i]; + } +} #endif =20 #undef SSE_HELPER_S diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 1afc4ff6a1..dd8dcebc23 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -413,9 +413,28 @@ DEF_HELPER_5(glue(pclmulqdq, SUFFIX), void, env, Reg, = Reg, Reg, i32) =20 /* AVX helpers */ #if SHIFT >=3D 1 +DEF_HELPER_4(glue(vpermilpd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpermilps, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_3(glue(vpermilpd_imm, SUFFIX), void, Reg, Reg, i32) DEF_HELPER_3(glue(vpermilps_imm, SUFFIX), void, Reg, Reg, i32) +DEF_HELPER_4(glue(vpsrlvd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpsravd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpsllvd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpsrlvq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpsravq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpsllvq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_3(glue(vtestps, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(vtestpd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(vpmaskmovd_st, SUFFIX), void, env, Reg, Reg, tl) +DEF_HELPER_4(glue(vpmaskmovq_st, SUFFIX), void, env, Reg, Reg, tl) +DEF_HELPER_4(glue(vpmaskmovd, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_4(glue(vpmaskmovq, SUFFIX), void, env, Reg, Reg, Reg) +DEF_HELPER_6(glue(vpgatherdd, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) +DEF_HELPER_6(glue(vpgatherdq, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) +DEF_HELPER_6(glue(vpgatherqd, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) +DEF_HELPER_6(glue(vpgatherqq, SUFFIX), void, env, Reg, Reg, Reg, tl, i32) #if SHIFT =3D=3D 2 +DEF_HELPER_3(vpermd_ymm, void, Reg, Reg, Reg) DEF_HELPER_4(vpermdq_ymm, void, Reg, Reg, Reg, i32) DEF_HELPER_3(vpermq_ymm, void, Reg, Reg, i32) #endif diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 3330085b3e..e148edd819 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -92,6 +92,7 @@ #define mmx .special =3D X86_SPECIAL_MMX, #define zext0 .special =3D X86_SPECIAL_ZExtOp0, #define zext2 .special =3D X86_SPECIAL_ZExtOp2, +#define avx_movx .special =3D X86_SPECIAL_AVXExtMov, =20 #define vex1 .vex_class =3D 1, #define vex1_rep3 .vex_class =3D 1, .vex_special =3D X86_VEX_REPScalar, @@ -302,6 +303,105 @@ static void decode_0FD6(DisasContext *s, CPUX86State = *env, X86OpEntry *entry, ui } =20 static const X86OpEntry opcodes_0F38_00toEF[240] =3D { + [0x00] =3D X86_OP_ENTRY3(PSHUFB, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x01] =3D X86_OP_ENTRY3(PHADDW, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x02] =3D X86_OP_ENTRY3(PHADDD, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x03] =3D X86_OP_ENTRY3(PHADDSW, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x04] =3D X86_OP_ENTRY3(PMADDUBSW, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x05] =3D X86_OP_ENTRY3(PHSUBW, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x06] =3D X86_OP_ENTRY3(PHSUBD, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + [0x07] =3D X86_OP_ENTRY3(PHSUBSW, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), + + [0x10] =3D X86_OP_ENTRY2(PBLENDVB, V,x, W,x, vex4 cpuid(SSE4= 1) avx2_256 p_66), + [0x14] =3D X86_OP_ENTRY2(BLENDVPS, V,x, W,x, vex4 cpuid(SSE4= 1) p_66), + [0x15] =3D X86_OP_ENTRY2(BLENDVPD, V,x, W,x, vex4 cpuid(SSE4= 1) p_66), + /* Listed incorrectly as type 4 */ + [0x16] =3D X86_OP_ENTRY3(VPERMD, V,qq, H,qq, W,qq, vex6 cpuid= (AVX2) p_66), + [0x17] =3D X86_OP_ENTRY3(VPTEST, None,None, V,x, W,x, vex4 cpuid= (SSE41) p_66), + + /* + * Source operand listed as Mq/Ux and similar in the manual; incorrect= ly listed + * as 128-bit only in 2-17. + */ + [0x20] =3D X86_OP_ENTRY3(VPMOVSXBW, V,x, None,None, W,q, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x21] =3D X86_OP_ENTRY3(VPMOVSXBD, V,x, None,None, W,d, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x22] =3D X86_OP_ENTRY3(VPMOVSXBQ, V,x, None,None, W,w, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x23] =3D X86_OP_ENTRY3(VPMOVSXWD, V,x, None,None, W,q, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x24] =3D X86_OP_ENTRY3(VPMOVSXWQ, V,x, None,None, W,d, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x25] =3D X86_OP_ENTRY3(VPMOVSXDQ, V,x, None,None, W,q, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + + /* Same as PMOVSX. */ + [0x30] =3D X86_OP_ENTRY3(VPMOVZXBW, V,x, None,None, W,q, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x31] =3D X86_OP_ENTRY3(VPMOVZXBD, V,x, None,None, W,d, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x32] =3D X86_OP_ENTRY3(VPMOVZXBQ, V,x, None,None, W,w, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x33] =3D X86_OP_ENTRY3(VPMOVZXWD, V,x, None,None, W,q, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x34] =3D X86_OP_ENTRY3(VPMOVZXWQ, V,x, None,None, W,d, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x35] =3D X86_OP_ENTRY3(VPMOVZXDQ, V,x, None,None, W,q, vex5 cpuid= (SSE41) avx_movx avx2_256 p_66), + [0x36] =3D X86_OP_ENTRY3(VPERMD, V,qq, H,qq, W,qq, vex6 cpuid= (AVX2) p_66), + [0x37] =3D X86_OP_ENTRY3(PCMPGTQ, V,x, H,x, W,x, vex4 cpuid= (SSE42) avx2_256 p_66), + + [0x40] =3D X86_OP_ENTRY3(PMULLD, V,x, H,x, W,x, vex4 cpui= d(SSE41) avx2_256 p_66), + [0x41] =3D X86_OP_ENTRY3(VPHMINPOSUW, V,dq, None,None, W,dq, vex4 cpui= d(SSE41) p_66), + /* Listed incorrectly as type 4 */ + [0x45] =3D X86_OP_ENTRY3(VPSRLV, V,x, H,x, W,x, vex6 cpui= d(AVX2) p_66), + [0x46] =3D X86_OP_ENTRY3(VPSRAV, V,x, H,x, W,x, vex6 cpui= d(AVX2) p_66), + [0x47] =3D X86_OP_ENTRY3(VPSLLV, V,x, H,x, W,x, vex6 cpui= d(AVX2) p_66), + + [0x90] =3D X86_OP_ENTRY3(VPGATHERD, V,x, H,x, M,d, vex12 cpuid(AVX2= ) p_66), /* vpgatherdd/q */ + [0x91] =3D X86_OP_ENTRY3(VPGATHERQ, V,x, H,x, M,q, vex12 cpuid(AVX2= ) p_66), /* vpgatherqd/q */ + [0x92] =3D X86_OP_ENTRY3(VPGATHERD, V,x, H,x, M,d, vex12 cpuid(AVX2= ) p_66), /* vgatherdps/d */ + [0x93] =3D X86_OP_ENTRY3(VPGATHERQ, V,x, H,x, M,q, vex12 cpuid(AVX2= ) p_66), /* vgatherqps/d */ + + [0x08] =3D X86_OP_ENTRY3(PSIGNB, V,x, H,x, W,x, vex4 cpuid= (SSSE3) mmx avx2_256 p_00_66), + [0x09] =3D X86_OP_ENTRY3(PSIGNW, V,x, H,x, W,x, vex4 cpuid= (SSSE3) mmx avx2_256 p_00_66), + [0x0a] =3D X86_OP_ENTRY3(PSIGND, V,x, H,x, W,x, vex4 cpuid= (SSSE3) mmx avx2_256 p_00_66), + [0x0b] =3D X86_OP_ENTRY3(PMULHRSW, V,x, H,x, W,x, vex4 cpuid= (SSSE3) mmx avx2_256 p_00_66), + [0x0c] =3D X86_OP_ENTRY3(VPERMILPS, V,x, H,x, W,x, vex4 cpuid= (AVX) p_00_66), + [0x0d] =3D X86_OP_ENTRY3(VPERMILPD, V,x, H,x, W,x, vex4 cpuid= (AVX) p_66), + [0x0e] =3D X86_OP_ENTRY3(VTESTPS, None,None, V,x, W,x, vex4 cpuid= (AVX) p_66), + [0x0f] =3D X86_OP_ENTRY3(VTESTPD, None,None, V,x, W,x, vex4 cpuid= (AVX) p_66), + + [0x18] =3D X86_OP_ENTRY3(VPBROADCASTD, V,x, None,None, W,d, vex6 c= puid(AVX) p_66), /* vbroadcastss */ + [0x19] =3D X86_OP_ENTRY3(VPBROADCASTQ, V,qq, None,None, W,q, vex6 c= puid(AVX) p_66), /* vbroadcastsd */ + [0x1a] =3D X86_OP_ENTRY3(VBROADCASTx128, V,qq, None,None, WM,dq,vex6 c= puid(AVX) p_66), + [0x1c] =3D X86_OP_ENTRY3(PABSB, V,x, None,None, W,x, vex4 c= puid(SSSE3) mmx avx2_256 p_00_66), + [0x1d] =3D X86_OP_ENTRY3(PABSW, V,x, None,None, W,x, vex4 c= puid(SSSE3) mmx avx2_256 p_00_66), + [0x1e] =3D X86_OP_ENTRY3(PABSD, V,x, None,None, W,x, vex4 c= puid(SSSE3) mmx avx2_256 p_00_66), + + [0x28] =3D X86_OP_ENTRY3(PMULDQ, V,x, H,x, W,x, vex4 cpu= id(SSE41) avx2_256 p_66), + [0x29] =3D X86_OP_ENTRY3(PCMPEQQ, V,x, H,x, W,x, vex4 cpu= id(SSE41) avx2_256 p_66), + [0x2a] =3D X86_OP_ENTRY3(MOVDQ, V,x, None,None, WM,x, vex1 cpu= id(SSE41) avx2_256 p_66), /* movntdqa */ + [0x2b] =3D X86_OP_ENTRY3(VPACKUSDW, V,x, H,x, W,x, vex4 cpu= id(SSE41) avx2_256 p_66), + [0x2c] =3D X86_OP_ENTRY3(VMASKMOVPS, V,x, H,x, WM,x, vex6 cpu= id(AVX) p_66), + [0x2d] =3D X86_OP_ENTRY3(VMASKMOVPD, V,x, H,x, WM,x, vex6 cpu= id(AVX) p_66), + /* Incorrectly listed as Mx,Hx,Vx in the manual */ + [0x2e] =3D X86_OP_ENTRY3(VMASKMOVPS_st, M,x, V,x, H,x, vex6 cpu= id(AVX) p_66), + [0x2f] =3D X86_OP_ENTRY3(VMASKMOVPD_st, M,x, V,x, H,x, vex6 cpu= id(AVX) p_66), + + [0x38] =3D X86_OP_ENTRY3(PMINSB, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x39] =3D X86_OP_ENTRY3(PMINSD, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x3a] =3D X86_OP_ENTRY3(PMINUW, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x3b] =3D X86_OP_ENTRY3(PMINUD, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x3c] =3D X86_OP_ENTRY3(PMAXSB, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x3d] =3D X86_OP_ENTRY3(PMAXSD, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x3e] =3D X86_OP_ENTRY3(PMAXUW, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + [0x3f] =3D X86_OP_ENTRY3(PMAXUD, V,x, H,x, W,x, vex4 cpuid(SS= E41) avx2_256 p_66), + + [0x58] =3D X86_OP_ENTRY3(VPBROADCASTD, V,x, None,None, W,d, vex6 c= puid(AVX2) p_66), + [0x59] =3D X86_OP_ENTRY3(VPBROADCASTQ, V,x, None,None, W,q, vex6 c= puid(AVX2) p_66), + [0x5a] =3D X86_OP_ENTRY3(VBROADCASTx128, V,qq, None,None, WM,dq,vex6 c= puid(AVX2) p_66), + + [0x78] =3D X86_OP_ENTRY3(VPBROADCASTB, V,x, None,None, W,b, vex6 c= puid(AVX2) p_66), + [0x79] =3D X86_OP_ENTRY3(VPBROADCASTW, V,x, None,None, W,w, vex6 c= puid(AVX2) p_66), + + [0x8c] =3D X86_OP_ENTRY3(VPMASKMOV, V,x, H,x, WM,x, vex6 cpuid(AVX= 2) p_66), + [0x8e] =3D X86_OP_ENTRY3(VPMASKMOV_st, M,x, V,x, H,x, vex6 cpuid(AVX= 2) p_66), + + [0xdb] =3D X86_OP_ENTRY3(VAESIMC, V,dq, None,None, W,dq, vex4 cpui= d(AES) p_66), + [0xdc] =3D X86_OP_ENTRY3(VAESENC, V,x, H,x, W,x, vex4 cpui= d(AES) p_66), + [0xdd] =3D X86_OP_ENTRY3(VAESENCLAST, V,x, H,x, W,x, vex4 cpui= d(AES) p_66), + [0xde] =3D X86_OP_ENTRY3(VAESDEC, V,x, H,x, W,x, vex4 cpui= d(AES) p_66), + [0xdf] =3D X86_OP_ENTRY3(VAESDECLAST, V,x, H,x, W,x, vex4 cpui= d(AES) p_66), }; =20 /* five rows for no prefix, 66, F3, F2, 66+F2 */ @@ -431,8 +531,8 @@ static const X86OpEntry opcodes_0F3A[256] =3D { [0x0b] =3D X86_OP_ENTRY4(VROUNDSD, V,x, H,x, W,sd, vex3 cpuid(SSE41= ) p_66), [0x0c] =3D X86_OP_ENTRY4(VBLENDPS, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) p_66), [0x0d] =3D X86_OP_ENTRY4(VBLENDPD, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) p_66), - [0x0e] =3D X86_OP_ENTRY4(VPBLENDW, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) p_66), - [0x0f] =3D X86_OP_ENTRY4(PALIGNR, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx p_00_66), + [0x0e] =3D X86_OP_ENTRY4(VPBLENDW, V,x, H,x, W,x, vex4 cpuid(SSE4= 1) avx2_256 p_66), + [0x0f] =3D X86_OP_ENTRY4(PALIGNR, V,x, H,x, W,x, vex4 cpuid(SSSE= 3) mmx avx2_256 p_00_66), =20 [0x18] =3D X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,qq, vex6 cpuid(AV= X) p_66), [0x19] =3D X86_OP_ENTRY3(VEXTRACTx128, W,dq, V,qq, I,b, vex6 cpuid(AV= X) p_66), @@ -1428,6 +1528,14 @@ static void disas_insn_new(DisasContext *s, CPUState= *cpu, int b) } break; =20 + case X86_SPECIAL_AVXExtMov: + if (!decode.op[2].has_ea) { + decode.op[2].ot =3D s->vex_l ? MO_256 : MO_128; + } else if (s->vex_l) { + decode.op[2].ot++; + } + break; + case X86_SPECIAL_MMX: if (!(s->prefix & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))) { gen_helper_enter_mmx(cpu_env); diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index ef318a00ed..2f0b0e4cfd 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -142,6 +142,12 @@ typedef enum X86InsnSpecial { X86_SPECIAL_ZExtOp0, X86_SPECIAL_ZExtOp2, =20 + /* + * Register operand 2 is extended to full width, while a memory operand + * is doubled in size if VEX.L=3D1. + */ + X86_SPECIAL_AVXExtMov, + /* * MMX instruction exists with no prefix; if there is no prefix, V/H/W= /U operands * become P/P/Q/N, and size "x" becomes "q". diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index ad93094ca8..e33688f672 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -19,6 +19,9 @@ * License along with this library; if not, see . */ =20 +typedef void (*SSEFunc_0_epppti)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr re= g_b, + TCGv_ptr reg_c, TCGv a0, TCGv_i32 scale); + static inline TCGv_i32 tcg_constant8u_i32(uint8_t val) { return tcg_constant_i32(val); @@ -484,15 +487,20 @@ static inline void gen_ternary_sse(DisasContext *s, C= PUX86State *env, X86Decoded fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, ptr3); tcg_temp_free_ptr(ptr3); } -#define TERNARY_SSE(uvname, lname) = \ +#define TERNARY_SSE(uname, uvname, lname) = \ static void gen_##uvname(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) \ { = \ gen_ternary_sse(s, env, decode, (uint8_t)decode->immediate >> 4, = \ gen_helper_##lname##_xmm, gen_helper_##lname##_ymm); = \ +} = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_ternary_sse(s, env, decode, 0, = \ + gen_helper_##lname##_xmm, gen_helper_##lname##_ymm); = \ } -TERNARY_SSE(VBLENDVPS, blendvps) -TERNARY_SSE(VBLENDVPD, blendvpd) -TERNARY_SSE(VPBLENDVB, pblendvb) +TERNARY_SSE(BLENDVPS, VBLENDVPS, blendvps) +TERNARY_SSE(BLENDVPD, VBLENDVPD, blendvpd) +TERNARY_SSE(PBLENDVB, VPBLENDVB, pblendvb) =20 static inline void gen_binary_imm_sse(DisasContext *s, CPUX86State *env, X= 86DecodedInsn *decode, SSEFunc_0_epppi xmm, SSEFunc_0_epppi= ymm) @@ -522,6 +530,25 @@ BINARY_IMM_SSE(VDDPD, dppd) BINARY_IMM_SSE(VMPSADBW, mpsadbw) BINARY_IMM_SSE(PCLMULQDQ, pclmulqdq) =20 + +#define UNARY_INT_GVEC(uname, func, ...) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + int vec_len =3D vector_len(s, decode); = \ + = \ + func(__VA_ARGS__, decode->op[0].offset, = \ + decode->op[2].offset, vec_len, vec_len); = \ +} +UNARY_INT_GVEC(PABSB, tcg_gen_gvec_abs, MO_8) +UNARY_INT_GVEC(PABSW, tcg_gen_gvec_abs, MO_16) +UNARY_INT_GVEC(PABSD, tcg_gen_gvec_abs, MO_32) +UNARY_INT_GVEC(VBROADCASTx128, tcg_gen_gvec_dup_mem, MO_128) +UNARY_INT_GVEC(VPBROADCASTB, tcg_gen_gvec_dup_mem, MO_8) +UNARY_INT_GVEC(VPBROADCASTW, tcg_gen_gvec_dup_mem, MO_16) +UNARY_INT_GVEC(VPBROADCASTD, tcg_gen_gvec_dup_mem, MO_32) +UNARY_INT_GVEC(VPBROADCASTQ, tcg_gen_gvec_dup_mem, MO_64) + + #define BINARY_INT_GVEC(uname, func, ...) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ { = \ @@ -544,14 +571,25 @@ BINARY_INT_GVEC(PAND, tcg_gen_gvec_and, MO_64) BINARY_INT_GVEC(PCMPEQB, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_8) BINARY_INT_GVEC(PCMPEQD, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_32) BINARY_INT_GVEC(PCMPEQW, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_16) +BINARY_INT_GVEC(PCMPEQQ, tcg_gen_gvec_cmp, TCG_COND_EQ, MO_64) BINARY_INT_GVEC(PCMPGTB, tcg_gen_gvec_cmp, TCG_COND_GT, MO_8) BINARY_INT_GVEC(PCMPGTW, tcg_gen_gvec_cmp, TCG_COND_GT, MO_16) BINARY_INT_GVEC(PCMPGTD, tcg_gen_gvec_cmp, TCG_COND_GT, MO_32) +BINARY_INT_GVEC(PCMPGTQ, tcg_gen_gvec_cmp, TCG_COND_GT, MO_64) +BINARY_INT_GVEC(PMAXSB, tcg_gen_gvec_smax, MO_8) BINARY_INT_GVEC(PMAXSW, tcg_gen_gvec_smax, MO_16) +BINARY_INT_GVEC(PMAXSD, tcg_gen_gvec_smax, MO_32) BINARY_INT_GVEC(PMAXUB, tcg_gen_gvec_umax, MO_8) +BINARY_INT_GVEC(PMAXUW, tcg_gen_gvec_umax, MO_16) +BINARY_INT_GVEC(PMAXUD, tcg_gen_gvec_umax, MO_32) +BINARY_INT_GVEC(PMINSB, tcg_gen_gvec_smin, MO_8) BINARY_INT_GVEC(PMINSW, tcg_gen_gvec_smin, MO_16) +BINARY_INT_GVEC(PMINSD, tcg_gen_gvec_smin, MO_32) BINARY_INT_GVEC(PMINUB, tcg_gen_gvec_umin, MO_8) +BINARY_INT_GVEC(PMINUW, tcg_gen_gvec_umin, MO_16) +BINARY_INT_GVEC(PMINUD, tcg_gen_gvec_umin, MO_32) BINARY_INT_GVEC(PMULLW, tcg_gen_gvec_mul, MO_16) +BINARY_INT_GVEC(PMULLD, tcg_gen_gvec_mul, MO_32) BINARY_INT_GVEC(POR, tcg_gen_gvec_or, MO_64) BINARY_INT_GVEC(PSUBB, tcg_gen_gvec_sub, MO_8) BINARY_INT_GVEC(PSUBW, tcg_gen_gvec_sub, MO_16) @@ -626,6 +664,19 @@ BINARY_INT_MMX(PSRLQ_r, psrlq) BINARY_INT_MMX(PSRAW_r, psraw) BINARY_INT_MMX(PSRAD_r, psrad) =20 +BINARY_INT_MMX(PHADDW, phaddw) +BINARY_INT_MMX(PHADDSW, phaddsw) +BINARY_INT_MMX(PHADDD, phaddd) +BINARY_INT_MMX(PHSUBW, phsubw) +BINARY_INT_MMX(PHSUBSW, phsubsw) +BINARY_INT_MMX(PHSUBD, phsubd) +BINARY_INT_MMX(PMADDUBSW, pmaddubsw) +BINARY_INT_MMX(PSHUFB, pshufb) +BINARY_INT_MMX(PSIGNB, psignb) +BINARY_INT_MMX(PSIGNW, psignw) +BINARY_INT_MMX(PSIGND, psignd) +BINARY_INT_MMX(PMULHRSW, pmulhrsw) + /* Instructions with no MMX equivalent. */ #define BINARY_INT_SSE(uname, lname) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ @@ -636,8 +687,35 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod gen_helper_##lname##_ymm); = \ } =20 +/* Instructions with no MMX equivalent. */ BINARY_INT_SSE(PUNPCKLQDQ, punpcklqdq) BINARY_INT_SSE(PUNPCKHQDQ, punpckhqdq) +BINARY_INT_SSE(VPACKUSDW, packusdw) +BINARY_INT_SSE(VPERMILPS, vpermilps) +BINARY_INT_SSE(VPERMILPD, vpermilpd) +BINARY_INT_SSE(VMASKMOVPS, vpmaskmovd) +BINARY_INT_SSE(VMASKMOVPD, vpmaskmovq) + +BINARY_INT_SSE(PMULDQ, pmuldq) + +BINARY_INT_SSE(VAESDEC, aesdec) +BINARY_INT_SSE(VAESDECLAST, aesdeclast) +BINARY_INT_SSE(VAESENC, aesenc) +BINARY_INT_SSE(VAESENCLAST, aesenclast) + +#define UNARY_CMP_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + if (!s->vex_l) { = \ + gen_helper_##lname##_xmm(cpu_env, OP_PTR1, OP_PTR2); = \ + } else { = \ + gen_helper_##lname##_ymm(cpu_env, OP_PTR1, OP_PTR2); = \ + } = \ + set_cc_op(s, CC_OP_EFLAGS); = \ +} +UNARY_CMP_SSE(VPTEST, ptest) +UNARY_CMP_SSE(VTESTPS, vtestps) +UNARY_CMP_SSE(VTESTPD, vtestpd) =20 static inline void gen_unary_int_sse(DisasContext *s, CPUX86State *env, X8= 6DecodedInsn *decode, SSEFunc_0_epp xmm, SSEFunc_0_epp ymm) @@ -657,6 +735,20 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod gen_helper_##lname##_ymm); = \ } =20 +UNARY_INT_SSE(VPMOVSXBW, pmovsxbw) +UNARY_INT_SSE(VPMOVSXBD, pmovsxbd) +UNARY_INT_SSE(VPMOVSXBQ, pmovsxbq) +UNARY_INT_SSE(VPMOVSXWD, pmovsxwd) +UNARY_INT_SSE(VPMOVSXWQ, pmovsxwq) +UNARY_INT_SSE(VPMOVSXDQ, pmovsxdq) + +UNARY_INT_SSE(VPMOVZXBW, pmovzxbw) +UNARY_INT_SSE(VPMOVZXBD, pmovzxbd) +UNARY_INT_SSE(VPMOVZXBQ, pmovzxbq) +UNARY_INT_SSE(VPMOVZXWD, pmovzxwd) +UNARY_INT_SSE(VPMOVZXWQ, pmovzxwq) +UNARY_INT_SSE(VPMOVZXDQ, pmovzxdq) + UNARY_INT_SSE(VCVTDQ2PD, cvtdq2pd) UNARY_INT_SSE(VCVTPD2DQ, cvtpd2dq) UNARY_INT_SSE(VCVTTPD2DQ, cvttpd2dq) @@ -714,6 +806,64 @@ static void gen_##uname(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decod UNARY_IMM_FP_SSE(VROUNDPS, roundps) UNARY_IMM_FP_SSE(VROUNDPD, roundpd) =20 +static inline void gen_vexw_avx(DisasContext *s, CPUX86State *env, X86Deco= dedInsn *decode, + SSEFunc_0_eppp d_xmm, SSEFunc_0_eppp q_xmm, + SSEFunc_0_eppp d_ymm, SSEFunc_0_eppp q_ymm) +{ + SSEFunc_0_eppp d =3D s->vex_l ? d_ymm : d_xmm; + SSEFunc_0_eppp q =3D s->vex_l ? q_ymm : q_xmm; + SSEFunc_0_eppp fn =3D s->vex_w ? q : d; + fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); +} + +/* VEX.W affects whether to operate on 32- or 64-bit elements. */ +#define VEXW_AVX(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_vexw_avx(s, env, decode, = \ + gen_helper_##lname##d_xmm, gen_helper_##lname##q_xmm, = \ + gen_helper_##lname##d_ymm, gen_helper_##lname##q_ymm); = \ +} +VEXW_AVX(VPSLLV, vpsllv) +VEXW_AVX(VPSRLV, vpsrlv) +VEXW_AVX(VPSRAV, vpsrav) +VEXW_AVX(VPMASKMOV, vpmaskmov) + +/* Same as above, but with extra arguments to the helper. */ +static inline void gen_vsib_avx(DisasContext *s, CPUX86State *env, X86Deco= dedInsn *decode, + SSEFunc_0_epppti d_xmm, SSEFunc_0_epppti q= _xmm, + SSEFunc_0_epppti d_ymm, SSEFunc_0_epppti q= _ymm) +{ + SSEFunc_0_epppti d =3D s->vex_l ? d_ymm : d_xmm; + SSEFunc_0_epppti q =3D s->vex_l ? q_ymm : q_xmm; + SSEFunc_0_epppti fn =3D s->vex_w ? q : d; + TCGv_i32 scale =3D tcg_constant_i32(decode->mem.scale); + TCGv_ptr index =3D tcg_temp_new_ptr(); + + /* Pass third input as (index, base, scale) */ + tcg_gen_addi_ptr(index, cpu_env, ZMM_OFFSET(decode->mem.index)); + fn(cpu_env, OP_PTR0, OP_PTR1, index, s->A0, scale); + + /* + * There are two output operands, so zero OP1's high 128 bits + * in the VEX.128 case. + */ + if (!s->vex_l) { + int ymmh_ofs =3D vector_elem_offset(&decode->op[1], MO_128, 1); + tcg_gen_gvec_dup_imm(MO_64, ymmh_ofs, 16, 16, 0); + } + tcg_temp_free_ptr(index); +} +#define VSIB_AVX(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + gen_vsib_avx(s, env, decode, = \ + gen_helper_##lname##d_xmm, gen_helper_##lname##q_xmm, = \ + gen_helper_##lname##d_ymm, gen_helper_##lname##q_ymm); = \ +} +VSIB_AVX(VPGATHERD, vpgatherd) +VSIB_AVX(VPGATHERQ, vpgatherq) + static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_= op) { TCGv carry_in =3D NULL; @@ -1484,6 +1634,12 @@ static void gen_VAESKEYGEN(DisasContext *s, CPUX86St= ate *env, X86DecodedInsn *de gen_helper_aeskeygenassist_xmm(cpu_env, OP_PTR0, OP_PTR1, imm); } =20 +static void gen_VAESIMC(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + assert(!s->vex_l); + gen_helper_aesimc_xmm(cpu_env, OP_PTR0, OP_PTR2); +} + static void gen_VCVTfp2fp(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) { gen_unary_fp_sse(s, env, decode, @@ -1567,6 +1723,41 @@ static void gen_VINSERTx128(DisasContext *s, CPUX86S= tate *env, X86DecodedInsn *d decode->op[1].offset + offsetof(YMMReg, YMM_X(!mask))= , 16, 16); } =20 +static inline void gen_maskmov(DisasContext *s, CPUX86State *env, X86Decod= edInsn *decode, + SSEFunc_0_eppt xmm, SSEFunc_0_eppt ymm) +{ + if (!s->vex_l) { + xmm(cpu_env, OP_PTR2, OP_PTR1, s->A0); + } else { + ymm(cpu_env, OP_PTR2, OP_PTR1, s->A0); + } +} + +static void gen_VMASKMOVPD_st(DisasContext *s, CPUX86State *env, X86Decode= dInsn *decode) +{ + gen_maskmov(s, env, decode, gen_helper_vpmaskmovq_st_xmm, gen_helper_v= pmaskmovq_st_ymm); +} + +static void gen_VMASKMOVPS_st(DisasContext *s, CPUX86State *env, X86Decode= dInsn *decode) +{ + gen_maskmov(s, env, decode, gen_helper_vpmaskmovd_st_xmm, gen_helper_v= pmaskmovd_st_ymm); +} + +static void gen_VPMASKMOV_st(DisasContext *s, CPUX86State *env, X86Decoded= Insn *decode) +{ + if (s->vex_w) { + gen_VMASKMOVPD_st(s, env, decode); + } else { + gen_VMASKMOVPS_st(s, env, decode); + } +} + +static void gen_VPERMD(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + assert(s->vex_l); + gen_helper_vpermd_ymm(OP_PTR0, OP_PTR1, OP_PTR2); +} + static void gen_VPERM2x128(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) { TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); @@ -1574,6 +1765,12 @@ static void gen_VPERM2x128(DisasContext *s, CPUX86St= ate *env, X86DecodedInsn *de gen_helper_vpermdq_ymm(OP_PTR0, OP_PTR1, OP_PTR2, imm); } =20 +static void gen_VPHMINPOSUW(DisasContext *s, CPUX86State *env, X86DecodedI= nsn *decode) +{ + assert(!s->vex_l); + gen_helper_phminposuw_xmm(cpu_env, OP_PTR0, OP_PTR2); +} + static void gen_VROUNDSD(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) { TCGv_i32 imm =3D tcg_constant8u_i32(decode->immediate); diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 857008835a..0e269e9d44 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4782,7 +4782,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) use_new &=3D b <=3D limit; #endif if (use_new && - (b =3D=3D 0x13a || + (b =3D=3D 0x138 || b =3D=3D 0x13a || (b >=3D 0x150 && b <=3D 0x17f) || (b >=3D 0x1d0 && b <=3D 0x1ff))) { disas_insn_new(s, cpu, b + 0x100); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102182; cv=none; d=zohomail.com; s=zohoarc; b=eo3yWUXxUt0Jxp874WsVf5xXyQrB4DL5eXnJ//7gcAN/ulpAE/exU8B2pFOU7DfHb8HHvIG+XDDnAafedcW4ivq3ydAA3PWKbeY3WSFaKVnaFtxRYZRguAUjL+ZI/7oIPVgyALeVvpMqNgeJX258owkvyosYD/2SW0e5vg6Wh4c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102182; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=R/o5CAnxOa2M2TwFHrSb6+UYpM5QFfq1Fs4ftAtY3h8=; b=eUOkI+OADo2iRADHWZBs/AyCqQBJJN6DJqcoDURtC/FAQsi1FyC6ClDZbaDyicUwZXEltIWDb09l8ME9lU4bBaF1pUKKQOHbssWR8/z1E6Y/ZLXTa0F6cDj0RGck1Ly6erKWcJWKVwlC6uddn5J7Rhxw4hwEMI+4Imn9BBHsFd4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102182121301.97948376537397; Tue, 18 Oct 2022 07:09:42 -0700 (PDT) Received: from localhost ([::1]:53208 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknHo-0004Db-Jk for importer@patchew.org; Tue, 18 Oct 2022 10:09:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39646) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmie-0004ua-AJ for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:20 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:24511) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiZ-0005Qd-3o for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:19 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-456-82CwPjlENh2lxVmazQc2AQ-1; Tue, 18 Oct 2022 09:33:13 -0400 Received: by mail-ed1-f71.google.com with SMTP id h9-20020a05640250c900b0045cfb639f56so10970685edb.13 for ; Tue, 18 Oct 2022 06:33:12 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id k10-20020a1709062a4a00b007838e332d78sm7549812eje.128.2022.10.18.06.33.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099994; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R/o5CAnxOa2M2TwFHrSb6+UYpM5QFfq1Fs4ftAtY3h8=; b=L9bOxzWyxZXxz4d50+0DOXmFCbykyZTb8ykwK3b23BHTKTB6ZsKi9hwIn7PaJwpBiQPpNA a4iRAxKOzuGdly1K0c2sNriujOJCz5dacmfkfi19zbvdjEFt33FVYj95nKck7db/rBNvcm XGS7rD6bj6nA1Kn5N539GZVCf755sg4= X-MC-Unique: 82CwPjlENh2lxVmazQc2AQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=R/o5CAnxOa2M2TwFHrSb6+UYpM5QFfq1Fs4ftAtY3h8=; b=Ob0oHyCgNa/LxTRPKMk0ss1hBrMaoHi3JHVtcaEEAA/n5HXBx7Q0MOGOl312drqo4K tx947jNFggcXJxz6dUcHqL2wRH5U1lOt4gzHwBIX7wJcuc/O8C48hX2BL8ezME0e1HnR ZCmcd9UDsxOEtiH+9XGfGdXULiBO38P2+uajARwa/t3rq/AxcwvSxcuMAAlxs/7D8t/Y EMfOfpeaT7oEI0Z4ptsiJ0I2nyhEhwowiKT463YfTnDhVSfvkMwa3QIPVIUOsz/ECOGX Fi1dyZ46sy5SwJewKt7oZX4aK72z6BSjbbDxXu1ZRjqg4FX4jE4P2Pm6bCG2wTTYWuRJ bL0w== X-Gm-Message-State: ACrzQf2X6IYt0FJ7AgOuqQpeAJEkRytyL9OSJ2VhfyVxxteDUYEHwdwL NML4Jps1o5TXeJ/8TT2azUpdIZokd2iJH1D1he/FynpNCw518vbYrd7ctucB97ByMPwT/vvrGF6 8GwMPxVOl46Ao+PmTyfDOpVE9l2ORdVmk9mJtaN4qaOhRW6U4M5a0THvvTsVWim4z6Sc= X-Received: by 2002:a17:907:980e:b0:78d:b6d8:f53c with SMTP id ji14-20020a170907980e00b0078db6d8f53cmr2531988ejc.70.1666099991453; Tue, 18 Oct 2022 06:33:11 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5ZtltS5SX1K1wS9n9+k2ULNYSxBvckwG8tuysV3k7e6LgkcoVKy3wPWtFBNghRRTuT6B3Q4w== X-Received: by 2002:a17:907:980e:b0:78d:b6d8:f53c with SMTP id ji14-20020a170907980e00b0078db6d8f53cmr2531973ejc.70.1666099991178; Tue, 18 Oct 2022 06:33:11 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 45/53] target/i386: reimplement 0x0f 0xc2, 0xc4-0xc6, add AVX Date: Tue, 18 Oct 2022 15:30:34 +0200 Message-Id: <20221018133042.856368-46-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -22 X-Spam_score: -2.3 X-Spam_bar: -- X-Spam_report: (-2.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_PASS=-0.001, T_SPF_HELO_TEMPERROR=0.01 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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102184056100003 Content-Type: text/plain; charset="utf-8" Nothing special going on here, for once. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 5 +++ target/i386/tcg/emit.c.inc | 75 ++++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 1 + 3 files changed, 81 insertions(+) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index e148edd819..6a82d58b23 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -648,6 +648,11 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x7e] =3D X86_OP_GROUP0(0F7E), [0x7f] =3D X86_OP_GROUP0(0F7F), =20 + [0xc2] =3D X86_OP_ENTRY4(VCMP, V,x, H,x, W,x, vex2_rep3 p_= 00_66_f3_f2), + [0xc4] =3D X86_OP_ENTRY4(PINSRW, V,dq,H,dq,E,w, vex5 mmx p_0= 0_66), + [0xc5] =3D X86_OP_ENTRY3(PEXTRW, G,d, U,dq,I,b, vex5 mmx p_0= 0_66), + [0xc6] =3D X86_OP_ENTRY4(VSHUF, V,x, H,x, W,x, vex4 p_00_66= ), + [0xd0] =3D X86_OP_ENTRY3(VADDSUB, V,x, H,x, W,x, vex2 cpuid(S= SE3) p_66_f2), [0xd1] =3D X86_OP_ENTRY3(PSRLW_r, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), [0xd2] =3D X86_OP_ENTRY3(PSRLD_r, V,x, H,x, W,x, vex4 mmx avx= 2_256 p_00_66), diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index e33688f672..f7ac481203 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1336,6 +1336,11 @@ static void gen_PINSRB(DisasContext *s, CPUX86State = *env, X86DecodedInsn *decode gen_pinsr(s, env, decode, MO_8); } =20 +static void gen_PINSRW(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + gen_pinsr(s, env, decode, MO_16); +} + static void gen_PINSR(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) { gen_pinsr(s, env, decode, decode->op[2].ot); @@ -1640,6 +1645,66 @@ static void gen_VAESIMC(DisasContext *s, CPUX86State= *env, X86DecodedInsn *decod gen_helper_aesimc_xmm(cpu_env, OP_PTR0, OP_PTR2); } =20 +/* + * 00 =3D v*ps Vps, Hps, Wpd + * 66 =3D v*pd Vpd, Hpd, Wps + * f3 =3D v*ss Vss, Hss, Wps + * f2 =3D v*sd Vsd, Hsd, Wps + */ +#define SSE_CMP(x) { \ + gen_helper_ ## x ## ps ## _xmm, gen_helper_ ## x ## pd ## _xmm, \ + gen_helper_ ## x ## ss, gen_helper_ ## x ## sd, \ + gen_helper_ ## x ## ps ## _ymm, gen_helper_ ## x ## pd ## _ymm} +static const SSEFunc_0_eppp gen_helper_cmp_funcs[32][6] =3D { + SSE_CMP(cmpeq), + SSE_CMP(cmplt), + SSE_CMP(cmple), + SSE_CMP(cmpunord), + SSE_CMP(cmpneq), + SSE_CMP(cmpnlt), + SSE_CMP(cmpnle), + SSE_CMP(cmpord), + + SSE_CMP(cmpequ), + SSE_CMP(cmpnge), + SSE_CMP(cmpngt), + SSE_CMP(cmpfalse), + SSE_CMP(cmpnequ), + SSE_CMP(cmpge), + SSE_CMP(cmpgt), + SSE_CMP(cmptrue), + + SSE_CMP(cmpeqs), + SSE_CMP(cmpltq), + SSE_CMP(cmpleq), + SSE_CMP(cmpunords), + SSE_CMP(cmpneqq), + SSE_CMP(cmpnltq), + SSE_CMP(cmpnleq), + SSE_CMP(cmpords), + + SSE_CMP(cmpequs), + SSE_CMP(cmpngeq), + SSE_CMP(cmpngtq), + SSE_CMP(cmpfalses), + SSE_CMP(cmpnequs), + SSE_CMP(cmpgeq), + SSE_CMP(cmpgtq), + SSE_CMP(cmptrues), +}; +#undef SSE_CMP + +static void gen_VCMP(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) +{ + int index =3D decode->immediate & (s->prefix & PREFIX_VEX ? 31 : 7); + int b =3D + s->prefix & PREFIX_REPZ ? 2 /* ss */ : + s->prefix & PREFIX_REPNZ ? 3 /* sd */ : + !!(s->prefix & PREFIX_DATA) /* pd */ + (s->vex_l << 2); + + gen_helper_cmp_funcs[index][b](cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); +} + static void gen_VCVTfp2fp(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) { gen_unary_fp_sse(s, env, decode, @@ -1785,6 +1850,16 @@ static void gen_VROUNDSS(DisasContext *s, CPUX86Stat= e *env, X86DecodedInsn *deco gen_helper_roundss_xmm(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, imm); } =20 +static void gen_VSHUF(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + TCGv_i32 imm =3D tcg_constant_i32(decode->immediate); + SSEFunc_0_pppi ps, pd, fn; + ps =3D s->vex_l ? gen_helper_shufps_ymm : gen_helper_shufps_xmm; + pd =3D s->vex_l ? gen_helper_shufpd_ymm : gen_helper_shufpd_xmm; + fn =3D s->prefix & PREFIX_DATA ? pd : ps; + fn(OP_PTR0, OP_PTR1, OP_PTR2, imm); +} + static void gen_VZEROALL(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) { TCGv_ptr ptr =3D tcg_temp_new_ptr(); diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 0e269e9d44..c79dffd6f9 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4784,6 +4784,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) if (use_new && (b =3D=3D 0x138 || b =3D=3D 0x13a || (b >=3D 0x150 && b <=3D 0x17f) || + b =3D=3D 0x1c2 || (b >=3D 0x1c4 && b <=3D 0x1c6) || (b >=3D 0x1d0 && b <=3D 0x1ff))) { disas_insn_new(s, cpu, b + 0x100); return s->pc; --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103325; cv=none; d=zohomail.com; s=zohoarc; b=FWZnRk5bHUA5ZFPhlKv34jBlz6xEYIp+Dg+8YEZSBmbvy4qdMafmegX9g1F3jY1Mvh7PlZwDNEMJdWgi7zjZC5tuMGiRDVsh4IP7NTd3f7nUyKP16kqqBWcCzVme38BU/ONv/frHzS1/x+KdUY/gmNA5CUPwuRckyt8EBBBpBN0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103325; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oE5EoiMNP6CCsUh47mxMyCIamiXym7QqLUT9X2x8a28=; b=A9Fs/gFTMF2c9OWV+pJmnWSMvSXPn60OTnKjGwWJi/BXSxzaUH9tKGaKYwq0eE5bnGVR2tpMkFjIUSri0xDbuSYl0Qno5gJuO9hILxbLK4+76ayULOyivo+TuRYdGSHrPpiTkAhuhYfvdH50LRVXRd1ab8HFwTuxPbxiKG6at0s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103325323573.9579629884871; Tue, 18 Oct 2022 07:28:45 -0700 (PDT) Received: from localhost ([::1]:55652 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknaE-0004vT-4N for importer@patchew.org; Tue, 18 Oct 2022 10:28:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39648) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmij-0004yy-3c for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:25 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:44969) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmie-0005RN-KN for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:22 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-467-7mQxAlGINXyoVQq7opAtHA-1; Tue, 18 Oct 2022 09:33:16 -0400 Received: by mail-ed1-f70.google.com with SMTP id c9-20020a05640227c900b0045d4a88c750so6977863ede.12 for ; Tue, 18 Oct 2022 06:33:16 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id l10-20020a1709060cca00b0078d21574986sm7588726ejh.203.2022.10.18.06.33.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099997; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oE5EoiMNP6CCsUh47mxMyCIamiXym7QqLUT9X2x8a28=; b=i3sMOERkGRW8mB1wOyALJddVB02ruSraeWmR6AeGU3T2aDZpE9P9GOy9u+nER3VhQM1oFZ v/GZWE7yKwWdt60fHHZcXXqHmhnM8HX2nobOujvqGhWOGNEsppJ9uiv8EWza8uVw6UZIsN y6ECtcvTcm4vQmad8GjeX7bEw1rDaGA= X-MC-Unique: 7mQxAlGINXyoVQq7opAtHA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oE5EoiMNP6CCsUh47mxMyCIamiXym7QqLUT9X2x8a28=; b=1SV4Yc0pbML0WVfmHfCFLG7H+FzhRolan4BasA6krB1pLnh546RdGe4fmigyr2pm9y MCeBUJEsfHCiYwLnpqks/9LPansupgz6pZoApTPLXf4lZdaaB4KIJpgpuBnZewyHSAlB cRB4AP+cwVx0PqpMQvDoKroXedzXk3RmCVSUKOCRvS+cJRIWh8X67HSuxSRy9iPXemzm AezG45aYQDQ5LVDKbXij9pp7fHAvC41T6w7KJlNaIxyX2HC2wlkiv4+fmffBBBs4r/jG 7OfPuNA2JV66Te0vNTS8qdwQ1ew7LOo3jS0CxVQkL18uiZHkX3F4XiZY8HtLG9VfHhEL nMmw== X-Gm-Message-State: ACrzQf1/K3w5nF0kL7a7CzASDGP3a39Jt+JCa459mkqAt9IYj0axKP9d wdB30Nwd+UKIE0QlMmSxmJzef3oZnBx6PGMZyH6/pGNs4OC1A+sR4U8X/+aeOT8AEeSwwtlGI+L Idrhg/D1tMYPehWNQYlkIbpUJ1JdOsxVp/WXKa8ztK2y3lP26WHTmyIAdLJ5rV6Qw+uk= X-Received: by 2002:a17:906:65c6:b0:73c:8897:65b0 with SMTP id z6-20020a17090665c600b0073c889765b0mr2472452ejn.322.1666099994851; Tue, 18 Oct 2022 06:33:14 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7VOM4vdpVreq4lbSl6yFJzzjLKl9jh28ZkXYEMdrwgpP5lNSkpLxpA/sHuosoXMuBxrHm42Q== X-Received: by 2002:a17:906:65c6:b0:73c:8897:65b0 with SMTP id z6-20020a17090665c600b0073c889765b0mr2472424ejn.322.1666099994411; Tue, 18 Oct 2022 06:33:14 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 46/53] target/i386: reimplement 0x0f 0x10-0x17, add AVX Date: Tue, 18 Oct 2022 15:30:35 +0200 Message-Id: <20221018133042.856368-47-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103325983100001 Content-Type: text/plain; charset="utf-8" These are mostly moves, and yet are a total pain. The main issue is that: 1) some instructions are selected by mod=3D=3D11 (register operand) vs. mod=3D00/01/10 (memory operand) 2) stores to memory are two-operand operations, while the 3-register and load-from-memory versions operate on the entire contents of the destination; this makes it easier to separate the gen_* function for the store case 3) it's inefficient to load into xmm_T0 only to move the value out again, so the gen_* function for the load case is separated too The manual also has various mistakes in the operands here, for example the store case of MOVHPS operates on a 128-bit source (albeit discarding the bottom 64 bits) and therefore should be Mq,Vdq rather than Mq,Vq. Likewise for the destination and source of MOVHLPS. VUNPCK?PS and VUNPCK?PD are the same as VUNPCK?DQ and VUNPCK?QDQ, but encoded as prefixes rather than separate operands. The helpers can be reused however. For MOVSLDUP, MOVSHDUP and MOVDDUP I chose to reimplement them as helpers. I named the helper for MOVDDUP "movdldup" in preparation for possible future introduction of MOVDHDUP and to clarify the similarity with MOVSLDUP. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 7 ++ target/i386/ops_sse_header.h | 3 + target/i386/tcg/decode-new.c.inc | 126 ++++++++++++++++++++++++++++++ target/i386/tcg/emit.c.inc | 127 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 1 + 5 files changed, 264 insertions(+) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index e3cc6948dd..0037f92e5f 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -1683,6 +1683,10 @@ void glue(helper_ptest, SUFFIX)(CPUX86State *env, Re= g *d, Reg *s) CC_SRC =3D (zf ? 0 : CC_Z) | (cf ? 0 : CC_C); } =20 +#define FMOVSLDUP(i) s->L((i) & ~1) +#define FMOVSHDUP(i) s->L((i) | 1) +#define FMOVDLDUP(i) s->Q((i) & ~1) + #define SSE_HELPER_F(name, elem, num, F) \ void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ { \ @@ -1705,6 +1709,9 @@ SSE_HELPER_F(helper_pmovzxbq, Q, 1 << SHIFT, s->B) SSE_HELPER_F(helper_pmovzxwd, L, 2 << SHIFT, s->W) SSE_HELPER_F(helper_pmovzxwq, Q, 1 << SHIFT, s->W) SSE_HELPER_F(helper_pmovzxdq, Q, 1 << SHIFT, s->L) +SSE_HELPER_F(helper_pmovsldup, L, 2 << SHIFT, FMOVSLDUP) +SSE_HELPER_F(helper_pmovshdup, L, 2 << SHIFT, FMOVSHDUP) +SSE_HELPER_F(helper_pmovdldup, Q, 1 << SHIFT, FMOVDLDUP) #endif =20 void glue(helper_pmuldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s) diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index dd8dcebc23..00de6d69f1 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -355,6 +355,9 @@ DEF_HELPER_3(glue(pmovzxbq, SUFFIX), void, env, Reg, Re= g) DEF_HELPER_3(glue(pmovzxwd, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovzxwq, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovzxdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsldup, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovshdup, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovdldup, SUFFIX), void, env, Reg, Reg) DEF_HELPER_4(glue(pmuldq, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(pcmpeqq, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(packusdw, SUFFIX), void, env, Reg, Reg, Reg) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 6a82d58b23..5435447e07 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -556,6 +556,122 @@ static void decode_0F3A(DisasContext *s, CPUX86State = *env, X86OpEntry *entry, ui *entry =3D opcodes_0F3A[*b]; } =20 +/* + * There are some mistakes in the operands in the manual, and the load/sto= re/register + * cases are easiest to keep separate, so the entries for 10-17 follow sim= plicity and + * efficiency of implementation rather than copying what the manual says. + * + * In particular: + * + * 1) "VMOVSS m32, xmm1" and "VMOVSD m64, xmm1" do not support VEX.vvvv != =3D 1111b, + * but this is not mentioned in the tables. + * + * 2) MOVHLPS, MOVHPS, MOVHPD, MOVLPD, MOVLPS read the high quadword of on= e of their + * operands, which must therefore be dq; MOVLPD and MOVLPS also write the = high + * quadword of the V operand. + */ +static void decode_0F10(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F10_reg[4] =3D { + X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex4_unal), /* MOVUPS= */ + X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex4_unal), /* MOVUPD= */ + X86_OP_ENTRY3(VMOVSS, V,x, H,x, W,x, vex4), + X86_OP_ENTRY3(VMOVLPx, V,x, H,x, W,x, vex4), /* MOVSD */ + }; + + static const X86OpEntry opcodes_0F10_mem[4] =3D { + X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex4_unal), /* MO= VUPS */ + X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex4_unal), /* MO= VUPD */ + X86_OP_ENTRY3(VMOVSS_ld, V,x, H,x, M,ss, vex4), + X86_OP_ENTRY3(VMOVSD_ld, V,x, H,x, M,sd, vex4), + }; + + if ((get_modrm(s, env) >> 6) =3D=3D 3) { + *entry =3D *decode_by_prefix(s, opcodes_0F10_reg); + } else { + *entry =3D *decode_by_prefix(s, opcodes_0F10_mem); + } +} + +static void decode_0F11(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F11_reg[4] =3D { + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex4), /* MOVPS */ + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex4), /* MOVPD */ + X86_OP_ENTRY3(VMOVSS, W,x, H,x, V,x, vex4), + X86_OP_ENTRY3(VMOVLPx, W,x, H,x, V,q, vex4), /* MOVSD */ + }; + + static const X86OpEntry opcodes_0F11_mem[4] =3D { + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex4), /* MOVPS */ + X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex4), /* MOVPD */ + X86_OP_ENTRY3(VMOVSS_st, M,ss, None,None, V,x, vex4), + X86_OP_ENTRY3(VMOVLPx_st, M,sd, None,None, V,x, vex4), /* MOVSD */ + }; + + if ((get_modrm(s, env) >> 6) =3D=3D 3) { + *entry =3D *decode_by_prefix(s, opcodes_0F11_reg); + } else { + *entry =3D *decode_by_prefix(s, opcodes_0F11_mem); + } +} + +static void decode_0F12(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F12_mem[4] =3D { + /* + * Use dq for operand for compatibility with gen_MOVSD and + * to allow VEX128 only. + */ + X86_OP_ENTRY3(VMOVLPx_ld, V,dq, H,dq, M,q, vex4), /* MOVLPS */ + X86_OP_ENTRY3(VMOVLPx_ld, V,dq, H,dq, M,q, vex4), /* MOVLPD */ + X86_OP_ENTRY3(VMOVSLDUP, V,x, None,None, W,x, vex4 cpuid(SSE3)), + X86_OP_ENTRY3(VMOVDDUP, V,x, None,None, WM,q, vex4 cpuid(SSE3))= , /* qq if VEX.256 */ + }; + static const X86OpEntry opcodes_0F12_reg[4] =3D { + X86_OP_ENTRY3(VMOVHLPS, V,dq, H,dq, U,dq, vex4), + X86_OP_ENTRY3(VMOVLPx, W,x, H,x, U,q, vex4), /* MOVLPD = */ + X86_OP_ENTRY3(VMOVSLDUP, V,x, None,None, U,x, vex4 cpuid(SSE3)), + X86_OP_ENTRY3(VMOVDDUP, V,x, None,None, U,x, vex4 cpuid(SSE3)), + }; + + if ((get_modrm(s, env) >> 6) =3D=3D 3) { + *entry =3D *decode_by_prefix(s, opcodes_0F12_reg); + } else { + *entry =3D *decode_by_prefix(s, opcodes_0F12_mem); + if ((s->prefix & PREFIX_REPNZ) && s->vex_l) { + entry->s2 =3D X86_SIZE_qq; + } + } +} + +static void decode_0F16(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F16_mem[4] =3D { + /* + * Operand 1 technically only reads the low 64 bits, but uses dq s= o that + * it is easier to check for op0 =3D=3D op1 in an endianness-neutr= al manner. + */ + X86_OP_ENTRY3(VMOVHPx_ld, V,dq, H,dq, M,q, vex4), /* MOVHPS */ + X86_OP_ENTRY3(VMOVHPx_ld, V,dq, H,dq, M,q, vex4), /* MOVHPD */ + X86_OP_ENTRY3(VMOVSHDUP, V,x, None,None, W,x, vex4 cpuid(SSE3)), + {}, + }; + static const X86OpEntry opcodes_0F16_reg[4] =3D { + /* Same as above, operand 1 could be Hq if it wasn't for big-endia= n. */ + X86_OP_ENTRY3(VMOVLHPS, V,dq, H,dq, U,q, vex4), + X86_OP_ENTRY3(VMOVHPx, V,x, H,x, U,x, vex4), /* MOVHPD */ + X86_OP_ENTRY3(VMOVSHDUP, V,x, None,None, U,x, vex4 cpuid(SSE3)), + {}, + }; + + if ((get_modrm(s, env) >> 6) =3D=3D 3) { + *entry =3D *decode_by_prefix(s, opcodes_0F16_reg); + } else { + *entry =3D *decode_by_prefix(s, opcodes_0F16_mem); + } +} + static void decode_sse_unary(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) { if (!(s->prefix & (PREFIX_REPZ | PREFIX_REPNZ))) { @@ -593,6 +709,16 @@ static void decode_0FE6(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui } =20 static const X86OpEntry opcodes_0F[256] =3D { + [0x10] =3D X86_OP_GROUP0(0F10), + [0x11] =3D X86_OP_GROUP0(0F11), + [0x12] =3D X86_OP_GROUP0(0F12), + [0x13] =3D X86_OP_ENTRY3(VMOVLPx_st, M,q, None,None, V,q, vex4 p_00_= 66), + [0x14] =3D X86_OP_ENTRY3(VUNPCKLPx, V,x, H,x, W,x, vex4 p_00_= 66), + [0x15] =3D X86_OP_ENTRY3(VUNPCKHPx, V,x, H,x, W,x, vex4 p_00_= 66), + [0x16] =3D X86_OP_GROUP0(0F16), + /* Incorrectly listed as Mq,Vq in the manual */ + [0x17] =3D X86_OP_ENTRY3(VMOVHPx_st, M,q, None,None, V,dq, vex4 p_00_= 66), + [0x50] =3D X86_OP_ENTRY3(MOVMSK, G,y, None,None, U,x, vex7 p_00_66= ), [0x51] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex2_rep3 p_00_66_= f3_f2), [0x52] =3D X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex5 p_00_f3), diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index f7ac481203..d87f6016d9 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -394,6 +394,7 @@ static inline void gen_fp_sse(DisasContext *s, CPUX86St= ate *env, X86DecodedInsn gen_illegal_opcode(s); } } + #define FP_SSE(uname, lname) = \ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ { = \ @@ -412,6 +413,20 @@ FP_SSE(VMIN, min) FP_SSE(VDIV, div) FP_SSE(VMAX, max) =20 +#define FP_UNPACK_SSE(uname, lname) = \ +static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) \ +{ = \ + /* PS maps to the DQ integer instruction, PD maps to QDQ. */ = \ + gen_fp_sse(s, env, decode, = \ + gen_helper_##lname##qdq_xmm, = \ + gen_helper_##lname##dq_xmm, = \ + gen_helper_##lname##qdq_ymm, = \ + gen_helper_##lname##dq_ymm, = \ + NULL, NULL); = \ +} +FP_UNPACK_SSE(VUNPCKLPx, punpckl) +FP_UNPACK_SSE(VUNPCKHPx, punpckh) + /* * 00 =3D v*ps Vps, Wpd * f3 =3D v*ss Vss, Wps @@ -749,6 +764,10 @@ UNARY_INT_SSE(VPMOVZXWD, pmovzxwd) UNARY_INT_SSE(VPMOVZXWQ, pmovzxwq) UNARY_INT_SSE(VPMOVZXDQ, pmovzxdq) =20 +UNARY_INT_SSE(VMOVSLDUP, pmovsldup) +UNARY_INT_SSE(VMOVSHDUP, pmovshdup) +UNARY_INT_SSE(VMOVDDUP, pmovdldup) + UNARY_INT_SSE(VCVTDQ2PD, cvtdq2pd) UNARY_INT_SSE(VCVTPD2DQ, cvtpd2dq) UNARY_INT_SSE(VCVTTPD2DQ, cvttpd2dq) @@ -1808,6 +1827,114 @@ static void gen_VMASKMOVPS_st(DisasContext *s, CPUX= 86State *env, X86DecodedInsn gen_maskmov(s, env, decode, gen_helper_vpmaskmovd_st_xmm, gen_helper_v= pmaskmovd_st_ymm); } =20 +static void gen_VMOVHPx_ld(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + gen_ldq_env_A0(s, decode->op[0].offset + offsetof(XMMReg, XMM_Q(1))); + if (decode->op[0].offset !=3D decode->op[1].offset) { + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[1].offset + offset= of(XMMReg, XMM_Q(0))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offset= of(XMMReg, XMM_Q(0))); + } +} + +static void gen_VMOVHPx_st(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + gen_stq_env_A0(s, decode->op[2].offset + offsetof(XMMReg, XMM_Q(1))); +} + +static void gen_VMOVHPx(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + if (decode->op[0].offset !=3D decode->op[2].offset) { + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[2].offset + offset= of(XMMReg, XMM_Q(1))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offset= of(XMMReg, XMM_Q(1))); + } + if (decode->op[0].offset !=3D decode->op[1].offset) { + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[1].offset + offset= of(XMMReg, XMM_Q(0))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offset= of(XMMReg, XMM_Q(0))); + } +} + +static void gen_VMOVHLPS(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[2].offset + offsetof(X= MMReg, XMM_Q(1))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offsetof(X= MMReg, XMM_Q(0))); + if (decode->op[0].offset !=3D decode->op[1].offset) { + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[1].offset + offset= of(XMMReg, XMM_Q(1))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offset= of(XMMReg, XMM_Q(1))); + } +} + +static void gen_VMOVLHPS(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[2].offset); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offsetof(X= MMReg, XMM_Q(1))); + if (decode->op[0].offset !=3D decode->op[1].offset) { + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[1].offset + offset= of(XMMReg, XMM_Q(0))); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offset= of(XMMReg, XMM_Q(0))); + } +} + +/* + * Note that MOVLPx supports 256-bit operation unlike MOVHLPx, MOVLHPx, MO= XHPx. + * Use a gvec move to move everything above the bottom 64 bits. + */ + +static void gen_VMOVLPx(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + int vec_len =3D vector_len(s, decode); + + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[2].offset + offsetof(X= MMReg, XMM_Q(0))); + tcg_gen_gvec_mov(MO_64, decode->op[0].offset, decode->op[1].offset, ve= c_len, vec_len); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset + offsetof(X= MMReg, XMM_Q(0))); +} + +static void gen_VMOVLPx_ld(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + int vec_len =3D vector_len(s, decode); + + tcg_gen_qemu_ld_i64(s->tmp1_i64, s->A0, s->mem_index, MO_LEUQ); + tcg_gen_gvec_mov(MO_64, decode->op[0].offset, decode->op[1].offset, ve= c_len, vec_len); + tcg_gen_st_i64(s->tmp1_i64, OP_PTR0, offsetof(ZMMReg, ZMM_Q(0))); +} + +static void gen_VMOVLPx_st(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + tcg_gen_ld_i64(s->tmp1_i64, OP_PTR2, offsetof(ZMMReg, ZMM_Q(0))); + tcg_gen_qemu_st_i64(s->tmp1_i64, s->A0, s->mem_index, MO_LEUQ); +} + +static void gen_VMOVSD_ld(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + TCGv_i64 zero =3D tcg_constant_i64(0); + + tcg_gen_qemu_ld_i64(s->tmp1_i64, s->A0, s->mem_index, MO_LEUQ); + tcg_gen_st_i64(zero, OP_PTR0, offsetof(ZMMReg, ZMM_Q(1))); + tcg_gen_st_i64(s->tmp1_i64, OP_PTR0, offsetof(ZMMReg, ZMM_Q(0))); +} + +static void gen_VMOVSS(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + int vec_len =3D vector_len(s, decode); + + tcg_gen_ld_i32(s->tmp2_i32, OP_PTR2, offsetof(ZMMReg, ZMM_L(0))); + tcg_gen_gvec_mov(MO_64, decode->op[0].offset, decode->op[1].offset, ve= c_len, vec_len); + tcg_gen_st_i32(s->tmp2_i32, OP_PTR0, offsetof(ZMMReg, ZMM_L(0))); +} + +static void gen_VMOVSS_ld(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + int vec_len =3D vector_len(s, decode); + + tcg_gen_qemu_ld_i32(s->tmp2_i32, s->A0, s->mem_index, MO_LEUL); + tcg_gen_gvec_dup_imm(MO_64, decode->op[0].offset, vec_len, vec_len, 0); + tcg_gen_st_i32(s->tmp2_i32, OP_PTR0, offsetof(ZMMReg, ZMM_L(0))); +} + +static void gen_VMOVSS_st(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + tcg_gen_ld_i32(s->tmp2_i32, OP_PTR2, offsetof(ZMMReg, ZMM_L(0))); + tcg_gen_qemu_st_i32(s->tmp2_i32, s->A0, s->mem_index, MO_LEUL); +} + static void gen_VPMASKMOV_st(DisasContext *s, CPUX86State *env, X86Decoded= Insn *decode) { if (s->vex_w) { diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index c79dffd6f9..90bdd0994e 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4783,6 +4783,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #endif if (use_new && (b =3D=3D 0x138 || b =3D=3D 0x13a || + (b >=3D 0x110 && b <=3D 0x117) || (b >=3D 0x150 && b <=3D 0x17f) || b =3D=3D 0x1c2 || (b >=3D 0x1c4 && b <=3D 0x1c6) || (b >=3D 0x1d0 && b <=3D 0x1ff))) { --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103328; cv=none; d=zohomail.com; s=zohoarc; b=eOm5MXLP4u6i7u9T8lO9mzExCmivjVzqtOxCaYxTrZlAlkzFGUdVlHqZ5vb/OAqH18x4pbZ7R9wAGx3ePB23EHrBBbR7u6ec1MXta697qNcwl8tsq5Rx+2LZwI0j6B5gQgja60milfxegcqYPF2BDOaXJ1sVke8vFUbXpItCbvY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103328; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ZSR2lpDNC8IBgBSkWZiMfu9tJ4GXzzplaFKR04jADyg=; b=defh36ojmeovxaa9MImIK/oZ3MFr12mUPw05Jy/Xbk4sKZkoebQUZ6PQ5RouzZ/jw4ud9tuI5DzjrZDgEgxcO6aV1BoPqBNLv3wBYLmNIZ0iWLmpkdVts0765bvwRdTpLIu+hWu9HxP8KaAxMEFYnuektcAlKqL3UBGsG3I8INM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103328653264.25586272575697; Tue, 18 Oct 2022 07:28:48 -0700 (PDT) Received: from localhost ([::1]:55642 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknaI-0004t9-Tg for importer@patchew.org; Tue, 18 Oct 2022 10:28:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60244) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmil-00056D-6L for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:27 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:57959) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmii-0005Rc-Qn for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:26 -0400 Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-247-8ePw6XB0PD-f-o7g8GxsBA-1; Tue, 18 Oct 2022 09:33:19 -0400 Received: by mail-ed1-f70.google.com with SMTP id m7-20020a056402430700b0045daff6ee5dso3492505edc.10 for ; Tue, 18 Oct 2022 06:33:19 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id sd42-20020a1709076e2a00b00722e50dab2csm7555257ejc.109.2022.10.18.06.33.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100000; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZSR2lpDNC8IBgBSkWZiMfu9tJ4GXzzplaFKR04jADyg=; b=e41VqZCg8CZUTNQLR7J8dl125Efv+bGmydpz6QOmcEwhmmYfh9uRYPkWz+bcrIn/CNfm/l j341E5LDnMGf4zJ/gI7z9r1OFkKnnvlNI1JLdqKFZ1o7tgwZ8uDMCmQq0E60DK/m3rPJtg 73++cWszj+TVyiskDascQ3NM5v/SHsA= X-MC-Unique: 8ePw6XB0PD-f-o7g8GxsBA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZSR2lpDNC8IBgBSkWZiMfu9tJ4GXzzplaFKR04jADyg=; b=IllNpKH4WIwPNdXlAa35x3z/2iwmk03wHQkIKS8U+CvEDGMayupdHmAGZBS6bPNvrj fNya2HbNAOHrANUPEhkr/uFJnfZjGxWhfUzS9lJauyNRCjTi8XS15kYYEkHc+w4HmVFn 3Gd25ZN/KuUpRCvoJERqjX/RhjdaOettfNUQelSCi0Jk0V74gYnMM3aZnREPEEDYzf4K ru2gE96g7j/1B7opmehjsC0IAOEnLQaE0zYxq/mjl55z+o28h9RgS6mBqYCWIs56Hrtz fmT2JZ76f5WWBOzmBwTpt0KKIT7TEJI0ihqgYg1JClLVYkLSEAr8bD5P8hAEScz+8iAl 2jrg== X-Gm-Message-State: ACrzQf1htRtmW9otvjJrMrqHVrzBo2nB9oGzBkX0uHUC/7RKtSOG+YAv s11+Tq1YDz07Hmy2pfmPBXlvvUratKougrwDLNLbYeeCLGDyyCqLV5PLNSbWGJ50uut7/5cZk9E SmUC3eyN6MwDzJX9+7IZVJYez58RyyxCxRFedJ67AaCm56Fil/RLdMSU5tX9g8D+7yyk= X-Received: by 2002:a05:6402:401e:b0:45c:a1ce:94bf with SMTP id d30-20020a056402401e00b0045ca1ce94bfmr2602675eda.177.1666099997636; Tue, 18 Oct 2022 06:33:17 -0700 (PDT) X-Google-Smtp-Source: AMsMyM740oPZe9c+b7mYaCcMqEoqgWDbwefK+UnFugmFtGzXA2EFYcdgtgaVav/RTD+nufJYzA2+Qg== X-Received: by 2002:a05:6402:401e:b0:45c:a1ce:94bf with SMTP id d30-20020a056402401e00b0045ca1ce94bfmr2602646eda.177.1666099997237; Tue, 18 Oct 2022 06:33:17 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 47/53] target/i386: reimplement 0x0f 0x28-0x2f, add AVX Date: Tue, 18 Oct 2022 15:30:36 +0200 Message-Id: <20221018133042.856368-48-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103329979100001 Content-Type: text/plain; charset="utf-8" Here the code is a bit uglier due to the truncation and extension of registers to and from 32-bit. There is also a mistake in the manual with respect to the size of the memory operand of CVTPS2PI and CVTTPS2PI, reported by Ricky Zhou. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 56 ++++++++++++++ target/i386/tcg/emit.c.inc | 128 +++++++++++++++++++++++++++++++ target/i386/tcg/translate.c | 1 + 3 files changed, 185 insertions(+) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 5435447e07..a5d5428260 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -672,6 +672,53 @@ static void decode_0F16(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui } } =20 +static void decode_0F2A(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F2A[4] =3D { + X86_OP_ENTRY3(CVTPI2Px, V,x, None,None, Q,q), + X86_OP_ENTRY3(CVTPI2Px, V,x, None,None, Q,q), + X86_OP_ENTRY3(VCVTSI2Sx, V,x, H,x, E,y, vex3), + X86_OP_ENTRY3(VCVTSI2Sx, V,x, H,x, E,y, vex3), + }; + *entry =3D *decode_by_prefix(s, opcodes_0F2A); +} + +static void decode_0F2B(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F2B[4] =3D { + X86_OP_ENTRY3(MOVDQ, M,x, None,None, V,x, vex4), /* MOVNTPS = */ + X86_OP_ENTRY3(MOVDQ, M,x, None,None, V,x, vex4), /* MOVNTPD = */ + X86_OP_ENTRY3(VMOVSS_st, M,ss, None,None, V,x, vex4 cpuid(SSE4A))= , /* MOVNTSS */ + X86_OP_ENTRY3(VMOVLPx_st, M,sd, None,None, V,x, vex4 cpuid(SSE4A))= , /* MOVNTSD */ + }; + + *entry =3D *decode_by_prefix(s, opcodes_0F2B); +} + +static void decode_0F2C(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F2C[4] =3D { + /* Listed as ps/pd in the manual, but CVTTPS2PI only reads 64-bit.= */ + X86_OP_ENTRY3(CVTTPx2PI, P,q, None,None, W,q), + X86_OP_ENTRY3(CVTTPx2PI, P,q, None,None, W,dq), + X86_OP_ENTRY3(VCVTTSx2SI, G,y, None,None, W,ss, vex3), + X86_OP_ENTRY3(VCVTTSx2SI, G,y, None,None, W,sd, vex3), + }; + *entry =3D *decode_by_prefix(s, opcodes_0F2C); +} + +static void decode_0F2D(DisasContext *s, CPUX86State *env, X86OpEntry *ent= ry, uint8_t *b) +{ + static const X86OpEntry opcodes_0F2D[4] =3D { + /* Listed as ps/pd in the manual, but CVTPS2PI only reads 64-bit. = */ + X86_OP_ENTRY3(CVTPx2PI, P,q, None,None, W,q), + X86_OP_ENTRY3(CVTPx2PI, P,q, None,None, W,dq), + X86_OP_ENTRY3(VCVTSx2SI, G,y, None,None, W,ss, vex3), + X86_OP_ENTRY3(VCVTSx2SI, G,y, None,None, W,sd, vex3), + }; + *entry =3D *decode_by_prefix(s, opcodes_0F2D); +} + static void decode_sse_unary(DisasContext *s, CPUX86State *env, X86OpEntry= *entry, uint8_t *b) { if (!(s->prefix & (PREFIX_REPZ | PREFIX_REPNZ))) { @@ -746,6 +793,15 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x76] =3D X86_OP_ENTRY3(PCMPEQD, V,x, H,x, W,x, vex4 mmx avx2_256= p_00_66), [0x77] =3D X86_OP_GROUP0(0F77), =20 + [0x28] =3D X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex1 p_00_6= 6), /* MOVAPS */ + [0x29] =3D X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1 p_00_6= 6), /* MOVAPS */ + [0x2A] =3D X86_OP_GROUP0(0F2A), + [0x2B] =3D X86_OP_GROUP0(0F2B), + [0x2C] =3D X86_OP_GROUP0(0F2C), + [0x2D] =3D X86_OP_GROUP0(0F2D), + [0x2E] =3D X86_OP_ENTRY3(VUCOMI, None,None, V,x, W,x, vex4 p_00_6= 6), + [0x2F] =3D X86_OP_ENTRY3(VCOMI, None,None, V,x, W,x, vex4 p_00_6= 6), + [0x38] =3D X86_OP_GROUP0(0F38), [0x3a] =3D X86_OP_GROUP0(0F3A), =20 diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index d87f6016d9..266e7499ad 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1038,6 +1038,36 @@ static void gen_CRC32(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decode) gen_helper_crc32(s->T0, s->tmp2_i32, s->T1, tcg_constant_i32(8 << ot)); } =20 +static void gen_CVTPI2Px(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + gen_helper_enter_mmx(cpu_env); + if (s->prefix & PREFIX_DATA) { + gen_helper_cvtpi2pd(cpu_env, OP_PTR0, OP_PTR2); + } else { + gen_helper_cvtpi2ps(cpu_env, OP_PTR0, OP_PTR2); + } +} + +static void gen_CVTPx2PI(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) +{ + gen_helper_enter_mmx(cpu_env); + if (s->prefix & PREFIX_DATA) { + gen_helper_cvtpd2pi(cpu_env, OP_PTR0, OP_PTR2); + } else { + gen_helper_cvtps2pi(cpu_env, OP_PTR0, OP_PTR2); + } +} + +static void gen_CVTTPx2PI(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + gen_helper_enter_mmx(cpu_env); + if (s->prefix & PREFIX_DATA) { + gen_helper_cvttpd2pi(cpu_env, OP_PTR0, OP_PTR2); + } else { + gen_helper_cvttps2pi(cpu_env, OP_PTR0, OP_PTR2); + } +} + static void gen_EMMS(DisasContext *s, CPUX86State *env, X86DecodedInsn *de= code) { gen_helper_emms(cpu_env); @@ -1724,6 +1754,14 @@ static void gen_VCMP(DisasContext *s, CPUX86State *e= nv, X86DecodedInsn *decode) gen_helper_cmp_funcs[index][b](cpu_env, OP_PTR0, OP_PTR1, OP_PTR2); } =20 +static void gen_VCOMI(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + SSEFunc_0_epp fn; + fn =3D s->prefix & PREFIX_DATA ? gen_helper_comisd : gen_helper_comiss; + fn(cpu_env, OP_PTR1, OP_PTR2); + set_cc_op(s, CC_OP_EFLAGS); +} + static void gen_VCVTfp2fp(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) { gen_unary_fp_sse(s, env, decode, @@ -1732,6 +1770,88 @@ static void gen_VCVTfp2fp(DisasContext *s, CPUX86Sta= te *env, X86DecodedInsn *dec gen_helper_cvtsd2ss, gen_helper_cvtss2sd); } =20 +static void gen_VCVTSI2Sx(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + int vec_len =3D vector_len(s, decode); + TCGv_i32 in; + + tcg_gen_gvec_mov(MO_64, decode->op[0].offset, decode->op[1].offset, ve= c_len, vec_len); + +#ifdef TARGET_X86_64 + MemOp ot =3D decode->op[2].ot; + if (ot =3D=3D MO_64) { + if (s->prefix & PREFIX_REPNZ) { + gen_helper_cvtsq2sd(cpu_env, OP_PTR0, s->T1); + } else { + gen_helper_cvtsq2ss(cpu_env, OP_PTR0, s->T1); + } + return; + } + in =3D s->tmp2_i32; + tcg_gen_trunc_tl_i32(in, s->T1); +#else + in =3D s->T1; +#endif + + if (s->prefix & PREFIX_REPNZ) { + gen_helper_cvtsi2sd(cpu_env, OP_PTR0, in); + } else { + gen_helper_cvtsi2ss(cpu_env, OP_PTR0, in); + } +} + +static inline void gen_VCVTtSx2SI(DisasContext *s, CPUX86State *env, X86De= codedInsn *decode, + SSEFunc_i_ep ss2si, SSEFunc_l_ep ss2sq, + SSEFunc_i_ep sd2si, SSEFunc_l_ep sd2sq) +{ + TCGv_i32 out; + +#ifdef TARGET_X86_64 + MemOp ot =3D decode->op[0].ot; + if (ot =3D=3D MO_64) { + if (s->prefix & PREFIX_REPNZ) { + sd2sq(s->T0, cpu_env, OP_PTR2); + } else { + ss2sq(s->T0, cpu_env, OP_PTR2); + } + return; + } + + out =3D s->tmp2_i32; +#else + out =3D s->T0; +#endif + if (s->prefix & PREFIX_REPNZ) { + sd2si(out, cpu_env, OP_PTR2); + } else { + ss2si(out, cpu_env, OP_PTR2); + } +#ifdef TARGET_X86_64 + tcg_gen_extu_i32_tl(s->T0, out); +#endif +} + +#ifndef TARGET_X86_64 +#define gen_helper_cvtss2sq NULL +#define gen_helper_cvtsd2sq NULL +#define gen_helper_cvttss2sq NULL +#define gen_helper_cvttsd2sq NULL +#endif + +static void gen_VCVTSx2SI(DisasContext *s, CPUX86State *env, X86DecodedIns= n *decode) +{ + gen_VCVTtSx2SI(s, env, decode, + gen_helper_cvtss2si, gen_helper_cvtss2sq, + gen_helper_cvtsd2si, gen_helper_cvtsd2sq); +} + +static void gen_VCVTTSx2SI(DisasContext *s, CPUX86State *env, X86DecodedIn= sn *decode) +{ + gen_VCVTtSx2SI(s, env, decode, + gen_helper_cvttss2si, gen_helper_cvttss2sq, + gen_helper_cvttsd2si, gen_helper_cvttsd2sq); +} + static void gen_VEXTRACTx128(DisasContext *s, CPUX86State *env, X86Decoded= Insn *decode) { int mask =3D decode->immediate & 1; @@ -1987,6 +2107,14 @@ static void gen_VSHUF(DisasContext *s, CPUX86State *= env, X86DecodedInsn *decode) fn(OP_PTR0, OP_PTR1, OP_PTR2, imm); } =20 +static void gen_VUCOMI(DisasContext *s, CPUX86State *env, X86DecodedInsn *= decode) +{ + SSEFunc_0_epp fn; + fn =3D s->prefix & PREFIX_DATA ? gen_helper_ucomisd : gen_helper_ucomi= ss; + fn(cpu_env, OP_PTR1, OP_PTR2); + set_cc_op(s, CC_OP_EFLAGS); +} + static void gen_VZEROALL(DisasContext *s, CPUX86State *env, X86DecodedInsn= *decode) { TCGv_ptr ptr =3D tcg_temp_new_ptr(); diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 90bdd0994e..cf895e4132 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -4784,6 +4784,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) if (use_new && (b =3D=3D 0x138 || b =3D=3D 0x13a || (b >=3D 0x110 && b <=3D 0x117) || + (b >=3D 0x128 && b <=3D 0x12f) || (b >=3D 0x150 && b <=3D 0x17f) || b =3D=3D 0x1c2 || (b >=3D 0x1c4 && b <=3D 0x1c6) || (b >=3D 0x1d0 && b <=3D 0x1ff))) { --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102415; cv=none; d=zohomail.com; s=zohoarc; b=hG+p7OJBUzPJ3eK6LnsnyFbIdt5wuu+v0NIyd96nrIDYanCgerdFotwJbwTefpcRNIEI7qUtob2jHdrH/LzTOfHOr/aArgGbPeEGi/iLy7tMyCOuZTepAjAEMVZfCyYcnZVMam+ZfaKsp8lCoAd+srOFEbX44nkQTZ5EuCXRUes= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102415; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Y/RkhR7opaZ4IzoG7vXtx6p3CuSbT28royjK2MZw64A=; b=R1h0gpu/EO4SbfM5Ux80HtIXVAUn34QzazYXHd6cyWUas6QxgVfMrCuihR1Pd+jG9FEHsP6kwbALwJS9L+rElJhrllYqK1I391kYK5b+e0cL3OLBz8uetAqeRlcB0DqnmlUYOr1DWfCN6OGsyZnIl5tNKKM3C6l9emTE4enBj/s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102415268767.7186631727536; Tue, 18 Oct 2022 07:13:35 -0700 (PDT) Received: from localhost ([::1]:51802 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknLa-0003OJ-0a for importer@patchew.org; Tue, 18 Oct 2022 10:13:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52854) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiu-0005DT-Qc for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:40 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:41876) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmij-0005Ro-72 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:36 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-483-YPm12SjoOIKTyzx2n-J-ag-1; Tue, 18 Oct 2022 09:33:23 -0400 Received: by mail-ed1-f72.google.com with SMTP id dz9-20020a0564021d4900b0045d9a3aded4so4289230edb.22 for ; Tue, 18 Oct 2022 06:33:22 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id b22-20020a170906d11600b0078d2d5b90f4sm7568318ejz.32.2022.10.18.06.33.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100004; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Y/RkhR7opaZ4IzoG7vXtx6p3CuSbT28royjK2MZw64A=; b=dh4+GCirpNQT6u6D9tKhJtCZU5n/by+6wVm+2i7PGy4C1BN4o3kLN5mUAeTqPDw5FMOw8m ie4WcrmVtw8szf1cMVjFllAvTP10yqh4sddc9TvZrpgRzHIghwbGZeiVbQFuDBOZUTGmEZ qHzJI2qkhPt0uQjk64JLVsMYbRCI41U= X-MC-Unique: YPm12SjoOIKTyzx2n-J-ag-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y/RkhR7opaZ4IzoG7vXtx6p3CuSbT28royjK2MZw64A=; b=b8kyTBkFkMjK7cDsUg1elD5TK2AxljnXqmw0L1VXsdI3Orvg6+CpdSyXwSKOMm6ax7 NVQQs8yEd/985TzpynP93vGM+6tLWAhTwTZWhrycKrOu0Keec2SW0oiLkI430j7b4Yg3 aEn319In2D9JPzbvQD5BxFK+sPED3CO3erajEYyx0HTyCnQAzeq+fTU4XYyYbTndHaCY jk5bx4M58Z/PSUAouDAWTLfI7SFa7OjXYOYxy0np621RCKpUcKCHqALDrHUdhXYBddMu 6AFTN+aYpBBgofBVwGtsiDkt3gxNP7MAp8zU7i14XseQTY23ykLVHDBrDHQIx1td2TwE hdMw== X-Gm-Message-State: ACrzQf37N4/2tYEufA0y9ZBdQZQz88rfy542wadP128l6/6VHf8by/eR ueGNwRz9J6WHW4b/titU9wy2eupSia+lNY3Ixnwtmj3RnlhB2W7Iw9cHHvHz8wb1zuD5kvH2LhK hmNe3uxxRo+GQGE2rW0qlcx+de6ZaZG+Eze+ki5EmNKvg2/esX+Y69FLMQBssQFAqLZ0= X-Received: by 2002:a05:6402:1604:b0:458:b2b7:bd5a with SMTP id f4-20020a056402160400b00458b2b7bd5amr2514612edv.73.1666100000638; Tue, 18 Oct 2022 06:33:20 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7VBpcAOeu2OCw67g3LyQv8tG4Na1JRtckpbdkE8JAyY5LIatc2lBty59qlEEJkRvbufRCt/Q== X-Received: by 2002:a05:6402:1604:b0:458:b2b7:bd5a with SMTP id f4-20020a056402160400b00458b2b7bd5amr2514587edv.73.1666100000327; Tue, 18 Oct 2022 06:33:20 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 48/53] target/i386: implement XSAVE and XRSTOR of AVX registers Date: Tue, 18 Oct 2022 15:30:37 +0200 Message-Id: <20221018133042.856368-49-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102416666100001 Content-Type: text/plain; charset="utf-8" Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/fpu_helper.c | 78 ++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c index 5f3f7a1085..7670739abe 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -2559,6 +2559,22 @@ static void do_xsave_sse(CPUX86State *env, target_ul= ong ptr, uintptr_t ra) } } =20 +static void do_xsave_ymmh(CPUX86State *env, target_ulong ptr, uintptr_t ra) +{ + int i, nb_xmm_regs; + + if (env->hflags & HF_CS64_MASK) { + nb_xmm_regs =3D 16; + } else { + nb_xmm_regs =3D 8; + } + + for (i =3D 0; i < nb_xmm_regs; i++, ptr +=3D 16) { + cpu_stq_data_ra(env, ptr, env->xmm_regs[i].ZMM_Q(2), ra); + cpu_stq_data_ra(env, ptr + 8, env->xmm_regs[i].ZMM_Q(3), ra); + } +} + static void do_xsave_bndregs(CPUX86State *env, target_ulong ptr, uintptr_t= ra) { target_ulong addr =3D ptr + offsetof(XSaveBNDREG, bnd_regs); @@ -2651,6 +2667,9 @@ static void do_xsave(CPUX86State *env, target_ulong p= tr, uint64_t rfbm, if (opt & XSTATE_SSE_MASK) { do_xsave_sse(env, ptr, ra); } + if (opt & XSTATE_YMM_MASK) { + do_xsave_ymmh(env, ptr + XO(avx_state), ra); + } if (opt & XSTATE_BNDREGS_MASK) { do_xsave_bndregs(env, ptr + XO(bndreg_state), ra); } @@ -2725,6 +2744,54 @@ static void do_xrstor_sse(CPUX86State *env, target_u= long ptr, uintptr_t ra) } } =20 +static void do_clear_sse(CPUX86State *env) +{ + int i, nb_xmm_regs; + + if (env->hflags & HF_CS64_MASK) { + nb_xmm_regs =3D 16; + } else { + nb_xmm_regs =3D 8; + } + + for (i =3D 0; i < nb_xmm_regs; i++) { + env->xmm_regs[i].ZMM_Q(0) =3D 0; + env->xmm_regs[i].ZMM_Q(1) =3D 0; + } +} + +static void do_xrstor_ymmh(CPUX86State *env, target_ulong ptr, uintptr_t r= a) +{ + int i, nb_xmm_regs; + + if (env->hflags & HF_CS64_MASK) { + nb_xmm_regs =3D 16; + } else { + nb_xmm_regs =3D 8; + } + + for (i =3D 0; i < nb_xmm_regs; i++, ptr +=3D 16) { + env->xmm_regs[i].ZMM_Q(2) =3D cpu_ldq_data_ra(env, ptr, ra); + env->xmm_regs[i].ZMM_Q(3) =3D cpu_ldq_data_ra(env, ptr + 8, ra); + } +} + +static void do_clear_ymmh(CPUX86State *env) +{ + int i, nb_xmm_regs; + + if (env->hflags & HF_CS64_MASK) { + nb_xmm_regs =3D 16; + } else { + nb_xmm_regs =3D 8; + } + + for (i =3D 0; i < nb_xmm_regs; i++) { + env->xmm_regs[i].ZMM_Q(2) =3D 0; + env->xmm_regs[i].ZMM_Q(3) =3D 0; + } +} + static void do_xrstor_bndregs(CPUX86State *env, target_ulong ptr, uintptr_= t ra) { target_ulong addr =3D ptr + offsetof(XSaveBNDREG, bnd_regs); @@ -2831,9 +2898,14 @@ static void do_xrstor(CPUX86State *env, target_ulong= ptr, uint64_t rfbm, uintptr if (xstate_bv & XSTATE_SSE_MASK) { do_xrstor_sse(env, ptr, ra); } else { - /* ??? When AVX is implemented, we may have to be more - selective in the clearing. */ - memset(env->xmm_regs, 0, sizeof(env->xmm_regs)); + do_clear_sse(env); + } + } + if (rfbm & XSTATE_YMM_MASK) { + if (xstate_bv & XSTATE_YMM_MASK) { + do_xrstor_ymmh(env, ptr + XO(avx_state), ra); + } else { + do_clear_ymmh(env); } } if (rfbm & XSTATE_BNDREGS_MASK) { --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666104961; cv=none; d=zohomail.com; s=zohoarc; b=XzmvKf0LlsVTYsgALQVYzCfzfDexmkIaU3KVldsnCAZ7HjZJH/iDcAhUf33SWXIAbgtM1am8dWW/MmOLyycmUb71n3cfdxZkDFgiZxZosnZ1pr71l52VS5Rxo1CxFy+DvNuI8vpSPpWa389Cb1NnICtiaAU9vYjKaEk7MAsFd8U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666104961; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=3+rTt+0maihMoL88ENhVH0IoVmTHIVkAzWPxPUgXPkI=; b=Y1xFGQOPeDQbxy3p6PmoIoV0N/9EZbkimzFmnSXQpBEp6c8UCHePBijHqHf6uXHfJRePwpuoCimXcDRMeX5X+eaipOR5gOvmxKh0HFajEySBy8yarBt3LUuf3NX5MYf6pxpHslaG0gfgPS4Thf73F9YZ2lJjVYOQd0WGiStOrik= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666104961263576.7674092654279; Tue, 18 Oct 2022 07:56:01 -0700 (PDT) Received: from localhost ([::1]:38818 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oko0c-0002Ao-LK for importer@patchew.org; Tue, 18 Oct 2022 10:55:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60246) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmin-0005AJ-LN for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:31 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:33866) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmil-0005SC-Nt for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:29 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-171-cAxmkME-MQe4f3SQ0Sr0aQ-1; Tue, 18 Oct 2022 09:33:25 -0400 Received: by mail-ej1-f71.google.com with SMTP id jg38-20020a170907972600b007919b3ad75aso1267095ejc.10 for ; Tue, 18 Oct 2022 06:33:25 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id v1-20020a170906292100b00773f3cb67ffsm7535672ejd.28.2022.10.18.06.33.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100006; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3+rTt+0maihMoL88ENhVH0IoVmTHIVkAzWPxPUgXPkI=; b=Gpxm2eB3OoTzkUJzTZxvmKrP1yGE8hZH8gZXA/8qgT7rm39CaT5wnAeATVHGMS3VBSGCn/ MLYVbPkoLVZizNLxY4Kc11YK0ThVro6WKaewltHDyHFMaOa49MC9NMFa11If19ERXzuTIA e90drdrvwi4Lq8z393JKPsHmrWlDGls= X-MC-Unique: cAxmkME-MQe4f3SQ0Sr0aQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3+rTt+0maihMoL88ENhVH0IoVmTHIVkAzWPxPUgXPkI=; b=hHXjDLLeOqJCfuoi0iHgZlam+jQGCxYWMRpYJFqNOBrPgNtmXV1sgXY4WaTelA0obw 6gIfnUl3DhJER5hKAHBgAjB80Ef9et3kUpFjEEvBWJfyoFjqtznOqz0OMsALLoZXOYbn 1fsvzmW+gfuLTsLQkcigSZTm9+gvI9nsulmtuJV2xmDqPV1v5WPp0j1RNREvUKF96lf9 KhkT/vEGSptXf4QginrQjetW7vehcNNRf/4T3X+vxszLu+bjjrK9+Y4/SYuJaAWPvBJq WL55uet7NWTPI8al2VhcwWU6r1sucEYsz+5GmcB0APasOlKWyVgoGHycqVuNdEoM5JhC QdQw== X-Gm-Message-State: ACrzQf0RQeUPzAxxsThKUmAKrlF0jdCuQpecEo0Kj7aEb8DoPQxqZk8D 8DHSGcREYOvu2c83JK8Pg9PEOBEeuHAvlJxWSKfxbeKKC9J+Wqc39UgL+pTPmeVfyeyJiVctIsu Bwgh+lnw16UtPAbZh0kBbQ9xzwbOZGmz6WCk8GmUejZ1HXRcVGzGVNch19I9qupyeNJY= X-Received: by 2002:a17:907:2c75:b0:78d:c201:e9aa with SMTP id ib21-20020a1709072c7500b0078dc201e9aamr2430542ejc.235.1666100003602; Tue, 18 Oct 2022 06:33:23 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6/e+VPxC9etXpEBameACk9hgPyWhYIMLHMvulthSvzphF01eFY2TdgW83hzb+nMfPXTNLUyg== X-Received: by 2002:a17:907:2c75:b0:78d:c201:e9aa with SMTP id ib21-20020a1709072c7500b0078dc201e9aamr2430524ejc.235.1666100003318; Tue, 18 Oct 2022 06:33:23 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 49/53] target/i386: implement VLDMXCSR/VSTMXCSR Date: Tue, 18 Oct 2022 15:30:38 +0200 Message-Id: <20221018133042.856368-50-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666104961749100001 Content-Type: text/plain; charset="utf-8" These are exactly the same as the non-VEX version, but one has to be careful that only VEX.L=3D0 is allowed. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 25 +++++++++++++++++++++++++ target/i386/tcg/emit.c.inc | 20 ++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index a5d5428260..5f4268bdfb 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -82,6 +82,10 @@ =20 #define X86_OP_ENTRY2(op, op0, s0, op1, s1, ...) \ X86_OP_ENTRY3(op, op0, s0, 2op, s0, op1, s1, ## __VA_ARGS__) +#define X86_OP_ENTRYw(op, op0, s0, ...) \ + X86_OP_ENTRY3(op, op0, s0, None, None, None, None, ## __VA_ARGS__) +#define X86_OP_ENTRYr(op, op0, s0, ...) \ + X86_OP_ENTRY3(op, None, None, None, None, op0, s0, ## __VA_ARGS__) #define X86_OP_ENTRY0(op, ...) \ X86_OP_ENTRY3(op, None, None, None, None, None, None, ## __VA_ARGS__) =20 @@ -149,6 +153,25 @@ static inline const X86OpEntry *decode_by_prefix(Disas= Context *s, const X86OpEnt } } =20 +static void decode_group15(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) +{ + /* only includes ldmxcsr and stmxcsr, because they have AVX variants. = */ + static const X86OpEntry group15_reg[8] =3D { + }; + + static const X86OpEntry group15_mem[8] =3D { + [2] =3D X86_OP_ENTRYr(LDMXCSR, E,d, vex5), + [3] =3D X86_OP_ENTRYw(STMXCSR, E,d, vex5), + }; + + uint8_t modrm =3D get_modrm(s, env); + if ((modrm >> 6) =3D=3D 3) { + *entry =3D group15_reg[(modrm >> 3) & 7]; + } else { + *entry =3D group15_mem[(modrm >> 3) & 7]; + } +} + static void decode_group17(DisasContext *s, CPUX86State *env, X86OpEntry *= entry, uint8_t *b) { static const X86GenFunc group17_gen[8] =3D { @@ -830,6 +853,8 @@ static const X86OpEntry opcodes_0F[256] =3D { [0x7e] =3D X86_OP_GROUP0(0F7E), [0x7f] =3D X86_OP_GROUP0(0F7F), =20 + [0xae] =3D X86_OP_GROUP0(group15), + [0xc2] =3D X86_OP_ENTRY4(VCMP, V,x, H,x, W,x, vex2_rep3 p_= 00_66_f3_f2), [0xc4] =3D X86_OP_ENTRY4(PINSRW, V,dq,H,dq,E,w, vex5 mmx p_0= 0_66), [0xc5] =3D X86_OP_ENTRY3(PEXTRW, G,d, U,dq,I,b, vex5 mmx p_0= 0_66), diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 266e7499ad..d7c2290db1 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1099,6 +1099,16 @@ static void gen_INSERTQ_r(DisasContext *s, CPUX86Sta= te *env, X86DecodedInsn *dec gen_helper_insertq_r(cpu_env, OP_PTR0, OP_PTR2); } =20 +static void gen_LDMXCSR(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + if (s->vex_l) { + gen_illegal_opcode(s); + return; + } + tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T1); + gen_helper_ldmxcsr(cpu_env, s->tmp2_i32); +} + static void gen_MASKMOV(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) { tcg_gen_mov_tl(s->A0, cpu_regs[R_EDI]); @@ -1688,6 +1698,16 @@ static void gen_VAESKEYGEN(DisasContext *s, CPUX86St= ate *env, X86DecodedInsn *de gen_helper_aeskeygenassist_xmm(cpu_env, OP_PTR0, OP_PTR1, imm); } =20 +static void gen_STMXCSR(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) +{ + if (s->vex_l) { + gen_illegal_opcode(s); + return; + } + gen_helper_update_mxcsr(cpu_env); + tcg_gen_ld32u_tl(s->T0, cpu_env, offsetof(CPUX86State, mxcsr)); +} + static void gen_VAESIMC(DisasContext *s, CPUX86State *env, X86DecodedInsn = *decode) { assert(!s->vex_l); --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103403; cv=none; d=zohomail.com; s=zohoarc; b=K3TYgum/Rq2Zd2u964lmMoTLcgqyO/q5yPBFQm2y/xcxV75YlnLLfXcdeE6gx96MEBJW2uyfzwj7n/U0MmHf3t+NK7iDG6l5S2ORu16zU+BSdzZThTtlci+y4T/OWHeffuM4ghcmNyWZk3+FBny1Vnp66CRPFz/vKZBIst8AN5w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103403; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=mHCgtN0uSyy5PmaDYvnnmfJvqZURg/C6c66f+sm+l6s=; b=g7q784SZewDsqe1tF6PvYmKFx6b0uEJHCmZTI2Xck0jKDxnplAE2+8rCU8bjTaFt9C789HY/ir0jotB2PArstWnbPxo6hYPAtN8DpErzE5rz9w6UeOyWjIDp4UOX+6muUirnK1cthtJyrgbzLRvsg8zWqdwLNjrverZ9rpjzhaI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103403989260.8092352803719; Tue, 18 Oct 2022 07:30:03 -0700 (PDT) Received: from localhost ([::1]:55468 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknbW-0006Y9-Hl for importer@patchew.org; Tue, 18 Oct 2022 10:30:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiv-0005DW-OL for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:29208) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiu-0005Sn-5L for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:37 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-275-w88RCa63PMWOQGtM-XvKhA-1; Tue, 18 Oct 2022 09:33:30 -0400 Received: by mail-ed1-f69.google.com with SMTP id z7-20020a05640235c700b0045d3841ccf2so8257362edc.9 for ; Tue, 18 Oct 2022 06:33:30 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id vj21-20020a170907131500b0078d4ee47c82sm7409199ejb.129.2022.10.18.06.33.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mHCgtN0uSyy5PmaDYvnnmfJvqZURg/C6c66f+sm+l6s=; b=GeYS7IrW+dtCzqqNI6SbrPq5z8luh2C1XZAWuvnXbp3Bv0YJuj6dOaWfKRAO8Kz8i2dP+z Wz+KA+/n5IJBp6Sehd8rghAGtuQ/7ojVYTk6Sbvm3eeAVWf6icl3lXQs/ox3QD1WbGsoys fKwB10wT1mVXctKmPhsD4Cwmcu6YGIY= X-MC-Unique: w88RCa63PMWOQGtM-XvKhA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mHCgtN0uSyy5PmaDYvnnmfJvqZURg/C6c66f+sm+l6s=; b=thhP7Pgv360IyvkiEw6adhqpKyG09UKDphuWqN2yVs2n7NFI2IQINgCtcwqjBFWU9G 3LlZ+ZqyIl2K3/l53Yj08xewmqS04xuULSV7QT/5eGMr9T5OcBEL6J1Cel6FoHz7rRfq lx6MgWIYVnwlrQ+9OmojQ1wucbEQYDY3pGFxpTYF28L0tMs8E+ThnixJYTnzRHbcVA1d kUbkqmK77y9DcUl8aVVR58YSMc5HblBOiWM0xEF7/RzeEpWEoFUvyW9ra5fHj6pH2iUQ Bt2MiPstkQvoB/v71nYeVKQ6m/zu1BIrInVhxmMUj1LxcAju9EAO5opSC1uGQI/BGHtt eNfw== X-Gm-Message-State: ACrzQf3Irn9Qk0SdabQZpYYMo4ALogu1/sKRJt4+iVBEgHfiUCiUFsTx R8fYhCgWVbYhCAKrbqJEn443xN70XzqM1jsn9JfLfY57Ly4KQPUMz16Sn1FECLOTarsNp12Jmh2 Im1YGJCqsq3hMLlpXNwX+6sBKGUCn23SHAK54ZrnqlqKq9rnfD9DI/rEKBxJH/jJT0uE= X-Received: by 2002:a17:906:9745:b0:78d:480f:cee7 with SMTP id o5-20020a170906974500b0078d480fcee7mr2456002ejy.192.1666100008393; Tue, 18 Oct 2022 06:33:28 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7xLlLpoA8cxvwJvxHkBVmlDpVb685+5ElXAniwsYSo7mZP+MkRaYL07LFNFIBhBBpBK568zg== X-Received: by 2002:a17:906:9745:b0:78d:480f:cee7 with SMTP id o5-20020a170906974500b0078d480fcee7mr2455851ejy.192.1666100006332; Tue, 18 Oct 2022 06:33:26 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Paul Brook , Richard Henderson Subject: [PULL 50/53] target/i386: Enable AVX cpuid bits when using TCG Date: Tue, 18 Oct 2022 15:30:39 +0200 Message-Id: <20221018133042.856368-51-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -22 X-Spam_score: -2.3 X-Spam_bar: -- X-Spam_report: (-2.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UPPERCASE_50_75=0.008 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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103404602100001 Content-Type: text/plain; charset="utf-8" From: Paul Brook Include AVX, AVX2 and VAES in the guest cpuid features supported by TCG. Signed-off-by: Paul Brook Message-Id: <20220424220204.2493824-40-paul@nowt.org> Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 6279745f79..0ebd610faa 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -625,12 +625,12 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t ven= dor1, CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \ CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \ CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \ - CPUID_EXT_RDRAND) + CPUID_EXT_RDRAND | CPUID_EXT_AVX) /* missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX, CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA, - CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX, + CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_F16C */ =20 #ifdef TARGET_X86_64 @@ -653,14 +653,14 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t ven= dor1, CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \ CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \ CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE = | \ - CPUID_7_0_EBX_ERMS) + CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2) /* missing: - CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2, + CPUID_7_0_EBX_HLE CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM, CPUID_7_0_EBX_RDSEED */ #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | \ /* CPUID_7_0_ECX_OSPKE is dynamic */ \ - CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS) + CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS | CPUID_7_0_ECX_VAES) #define TCG_7_0_EDX_FEATURES 0 #define TCG_7_1_EAX_FEATURES 0 #define TCG_APM_FEATURES 0 --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666103494; cv=none; d=zohomail.com; s=zohoarc; b=D8ZPk90QAROB3KseIyWNOKOnFmvo5sM/vNyQ6yFOzBaOyVClsdgI+o9J22O7LbJ2r4SfG3sAlE5dzz2YLT5192P8TCC+f9tcBeZHt8ahLgajXJ3O0sDYO/CJzmmG8xp2WrsPhIVNTXONq/SVK0rFxwAURUeRB4bwj7vDTAJMiac= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666103494; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=U+ejBRt0mE7OFKY0qV7RwIYNK6gjjdwQfuVTwdsT9r8=; b=YMKgJi0iG+5hpSZd0D/HS5BVP+Rb18872NeeTOQkovDMg9y27fAIc4nCmG9dFTG+eJLxaJT98gzPKMZsPoq82ALWJXBIKhVaRwguEUVFWEgV4RK69az/k+pBWjaxwGq36uq3Ci3VHCmOCV4iYBemdylznxHJOfQQRtBf07Sbuzw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666103494595781.7833546573706; Tue, 18 Oct 2022 07:31:34 -0700 (PDT) Received: from localhost ([::1]:59868 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okncz-0000fr-6L for importer@patchew.org; Tue, 18 Oct 2022 10:31:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52858) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiw-0005DX-IO for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:30450) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmiu-0005Sr-AT for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:38 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-639-xLaPvi-1N9aLh2TrQJg5Ow-1; Tue, 18 Oct 2022 09:33:32 -0400 Received: by mail-ej1-f71.google.com with SMTP id hq13-20020a1709073f0d00b0078dce6a32fcso6380418ejc.13 for ; Tue, 18 Oct 2022 06:33:32 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id v24-20020aa7d658000000b00458f82462a5sm8774480edr.25.2022.10.18.06.33.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=U+ejBRt0mE7OFKY0qV7RwIYNK6gjjdwQfuVTwdsT9r8=; b=ZwbqlIKp/bFlAmyd5LleidkvxOBvU2tRdgHQn3rJdbry+IrTE9k4qOr6/+8BhNPu4aeeSx L9wZb4QDkAcxkdcxSfojESMUkoU5rTqZuMw2srHz3B1V8Rbqkvnyt58ctKjA8tmE4wUKFw TJjZ0/+cKbcqb437aypDvdre0XVJGUw= X-MC-Unique: xLaPvi-1N9aLh2TrQJg5Ow-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=U+ejBRt0mE7OFKY0qV7RwIYNK6gjjdwQfuVTwdsT9r8=; b=jHRqRH5aH5ZYEprvZhSKWlxzArr8GKqjlQYRhC4Ttzd0aONci+swhFWX5AA5/ISHlB 3A+4DXZmkWg+PSgmKpSce96sm3u6MB1Mhnlt1NBqmit0i0Pg3gytfatCyW5ysQyH1zB8 7Sgf6JMERVc+6k0jU4dvVicG03cZIluORx2eiq+gtbzMV6gBcY/ejk80l0Q4MeS5sAIP nF8pwTIvlWYDHUVxAYzsqh/oMTcgcPMYp8du6acw6oZWn89bPBNfXHUxXMR/PcY/bJmk zBc6U8QK76XD3Ix5xiQFCcDTIG9AqzrB+U5hqSAU0sb17U1DSHs9uk18kwQJ2Qr6EIW8 XsQQ== X-Gm-Message-State: ACrzQf0ErioJ3/pa/m+vaZ25sgcNyOux4uEUQnVFGDCbRz6DPAbo2WwI JfaFHXnQ6CeIQLJLMLHUAt4CyS9uOtaVvrIh9kus5T13X8O+hB3V9Necwnb/gOtKbkPuv0ilJm/ kobOHsNMR1BG5eMDsed6926jfI4dR56JW352UwQf261H634rdpGAOv/gY2HnIhoqrPwk= X-Received: by 2002:a17:907:628a:b0:781:bbff:1d42 with SMTP id nd10-20020a170907628a00b00781bbff1d42mr2373086ejc.375.1666100010654; Tue, 18 Oct 2022 06:33:30 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7mjwNOpU5fbMXOJA+VMeFH5eXTi1O6haPIWM5Oik+2IRpLi8ciWtF6tT9cPPoq8VPOIizoig== X-Received: by 2002:a17:907:628a:b0:781:bbff:1d42 with SMTP id nd10-20020a170907628a00b00781bbff1d42mr2373053ejc.375.1666100010200; Tue, 18 Oct 2022 06:33:30 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 51/53] tests/tcg: extend SSE tests to AVX Date: Tue, 18 Oct 2022 15:30:40 +0200 Message-Id: <20221018133042.856368-52-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666103496158100003 Content-Type: text/plain; charset="utf-8" Extracted from a patch by Paul Brook . Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- tests/tcg/i386/Makefile.target | 2 +- tests/tcg/i386/test-avx.c | 201 ++++++++++++++++++--------------- tests/tcg/i386/test-avx.py | 5 +- 3 files changed, 113 insertions(+), 95 deletions(-) diff --git a/tests/tcg/i386/Makefile.target b/tests/tcg/i386/Makefile.target index 3273aa8061..81831cafbc 100644 --- a/tests/tcg/i386/Makefile.target +++ b/tests/tcg/i386/Makefile.target @@ -107,7 +107,7 @@ run-test-mmx: QEMU_OPTS +=3D -cpu max run-plugin-test-mmx: QEMU_OPTS +=3D -cpu max test-mmx: test-mmx.h =20 -test-avx: CFLAGS +=3D -masm=3Dintel -O -I. +test-avx: CFLAGS +=3D -mavx -masm=3Dintel -O -I. run-test-avx: QEMU_OPTS +=3D -cpu max run-plugin-test-avx: QEMU_OPTS +=3D -cpu max test-avx: test-avx.h diff --git a/tests/tcg/i386/test-avx.c b/tests/tcg/i386/test-avx.c index 23c170dd79..953e2906fe 100644 --- a/tests/tcg/i386/test-avx.c +++ b/tests/tcg/i386/test-avx.c @@ -6,18 +6,18 @@ typedef void (*testfn)(void); =20 typedef struct { - uint64_t q0, q1; -} __attribute__((aligned(16))) v2di; + uint64_t q0, q1, q2, q3; +} __attribute__((aligned(32))) v4di; =20 typedef struct { uint64_t mm[8]; - v2di xmm[16]; + v4di ymm[16]; uint64_t r[16]; uint64_t flags; uint32_t ff; uint64_t pad; - v2di mem[4]; - v2di mem0[4]; + v4di mem[4]; + v4di mem0[4]; } reg_state; =20 typedef struct { @@ -31,20 +31,20 @@ reg_state initI; reg_state initF32; reg_state initF64; =20 -static void dump_xmm(const char *name, int n, const v2di *r, int ff) +static void dump_ymm(const char *name, int n, const v4di *r, int ff) { - printf("%s%d =3D %016lx %016lx\n", - name, n, r->q1, r->q0); + printf("%s%d =3D %016lx %016lx %016lx %016lx\n", + name, n, r->q3, r->q2, r->q1, r->q0); if (ff =3D=3D 64) { - double v[2]; + double v[4]; memcpy(v, r, sizeof(v)); - printf(" %16g %16g\n", - v[1], v[0]); - } else if (ff =3D=3D 32) { - float v[4]; - memcpy(v, r, sizeof(v)); - printf(" %8g %8g %8g %8g\n", + printf(" %16g %16g %16g %16g\n", v[3], v[2], v[1], v[0]); + } else if (ff =3D=3D 32) { + float v[8]; + memcpy(v, r, sizeof(v)); + printf(" %8g %8g %8g %8g %8g %8g %8g %8g\n", + v[7], v[6], v[5], v[4], v[3], v[2], v[1], v[0]); } } =20 @@ -53,10 +53,10 @@ static void dump_regs(reg_state *s) int i; =20 for (i =3D 0; i < 16; i++) { - dump_xmm("xmm", i, &s->xmm[i], 0); + dump_ymm("ymm", i, &s->ymm[i], 0); } for (i =3D 0; i < 4; i++) { - dump_xmm("mem", i, &s->mem0[i], 0); + dump_ymm("mem", i, &s->mem0[i], 0); } } =20 @@ -74,13 +74,13 @@ static void compare_state(const reg_state *a, const reg= _state *b) } } for (i =3D 0; i < 16; i++) { - if (memcmp(&a->xmm[i], &b->xmm[i], 16)) { - dump_xmm("xmm", i, &b->xmm[i], a->ff); + if (memcmp(&a->ymm[i], &b->ymm[i], 32)) { + dump_ymm("ymm", i, &b->ymm[i], a->ff); } } for (i =3D 0; i < 4; i++) { - if (memcmp(&a->mem0[i], &a->mem[i], 16)) { - dump_xmm("mem", i, &a->mem[i], a->ff); + if (memcmp(&a->mem0[i], &a->mem[i], 32)) { + dump_ymm("mem", i, &a->mem[i], a->ff); } } if (a->flags !=3D b->flags) { @@ -89,9 +89,9 @@ static void compare_state(const reg_state *a, const reg_s= tate *b) } =20 #define LOADMM(r, o) "movq " #r ", " #o "[%0]\n\t" -#define LOADXMM(r, o) "movdqa " #r ", " #o "[%0]\n\t" +#define LOADYMM(r, o) "vmovdqa " #r ", " #o "[%0]\n\t" #define STOREMM(r, o) "movq " #o "[%1], " #r "\n\t" -#define STOREXMM(r, o) "movdqa " #o "[%1], " #r "\n\t" +#define STOREYMM(r, o) "vmovdqa " #o "[%1], " #r "\n\t" #define MMREG(F) \ F(mm0, 0x00) \ F(mm1, 0x08) \ @@ -101,39 +101,39 @@ static void compare_state(const reg_state *a, const r= eg_state *b) F(mm5, 0x28) \ F(mm6, 0x30) \ F(mm7, 0x38) -#define XMMREG(F) \ - F(xmm0, 0x040) \ - F(xmm1, 0x050) \ - F(xmm2, 0x060) \ - F(xmm3, 0x070) \ - F(xmm4, 0x080) \ - F(xmm5, 0x090) \ - F(xmm6, 0x0a0) \ - F(xmm7, 0x0b0) \ - F(xmm8, 0x0c0) \ - F(xmm9, 0x0d0) \ - F(xmm10, 0x0e0) \ - F(xmm11, 0x0f0) \ - F(xmm12, 0x100) \ - F(xmm13, 0x110) \ - F(xmm14, 0x120) \ - F(xmm15, 0x130) +#define YMMREG(F) \ + F(ymm0, 0x040) \ + F(ymm1, 0x060) \ + F(ymm2, 0x080) \ + F(ymm3, 0x0a0) \ + F(ymm4, 0x0c0) \ + F(ymm5, 0x0e0) \ + F(ymm6, 0x100) \ + F(ymm7, 0x120) \ + F(ymm8, 0x140) \ + F(ymm9, 0x160) \ + F(ymm10, 0x180) \ + F(ymm11, 0x1a0) \ + F(ymm12, 0x1c0) \ + F(ymm13, 0x1e0) \ + F(ymm14, 0x200) \ + F(ymm15, 0x220) #define LOADREG(r, o) "mov " #r ", " #o "[rax]\n\t" #define STOREREG(r, o) "mov " #o "[rax], " #r "\n\t" #define REG(F) \ - F(rbx, 0x148) \ - F(rcx, 0x150) \ - F(rdx, 0x158) \ - F(rsi, 0x160) \ - F(rdi, 0x168) \ - F(r8, 0x180) \ - F(r9, 0x188) \ - F(r10, 0x190) \ - F(r11, 0x198) \ - F(r12, 0x1a0) \ - F(r13, 0x1a8) \ - F(r14, 0x1b0) \ - F(r15, 0x1b8) \ + F(rbx, 0x248) \ + F(rcx, 0x250) \ + F(rdx, 0x258) \ + F(rsi, 0x260) \ + F(rdi, 0x268) \ + F(r8, 0x280) \ + F(r9, 0x288) \ + F(r10, 0x290) \ + F(r11, 0x298) \ + F(r12, 0x2a0) \ + F(r13, 0x2a8) \ + F(r14, 0x2b0) \ + F(r15, 0x2b8) \ =20 static void run_test(const TestDef *t) { @@ -143,7 +143,7 @@ static void run_test(const TestDef *t) printf("%5d %s\n", t->n, t->s); asm volatile( MMREG(LOADMM) - XMMREG(LOADXMM) + YMMREG(LOADYMM) "sub rsp, 128\n\t" "push rax\n\t" "push rbx\n\t" @@ -156,26 +156,26 @@ static void run_test(const TestDef *t) "pop rbx\n\t" "shr rbx, 8\n\t" "shl rbx, 8\n\t" - "mov rcx, 0x1c0[rax]\n\t" + "mov rcx, 0x2c0[rax]\n\t" "and rcx, 0xff\n\t" "or rbx, rcx\n\t" "push rbx\n\t" "popf\n\t" REG(LOADREG) - "mov rax, 0x140[rax]\n\t" + "mov rax, 0x240[rax]\n\t" "call [rsp]\n\t" "mov [rsp], rax\n\t" "mov rax, 8[rsp]\n\t" REG(STOREREG) "mov rbx, [rsp]\n\t" - "mov 0x140[rax], rbx\n\t" + "mov 0x240[rax], rbx\n\t" "mov rbx, 0\n\t" - "mov 0x170[rax], rbx\n\t" - "mov 0x178[rax], rbx\n\t" + "mov 0x270[rax], rbx\n\t" + "mov 0x278[rax], rbx\n\t" "pushf\n\t" "pop rbx\n\t" "and rbx, 0xff\n\t" - "mov 0x1c0[rax], rbx\n\t" + "mov 0x2c0[rax], rbx\n\t" "add rsp, 16\n\t" "pop rdx\n\t" "pop rcx\n\t" @@ -183,15 +183,15 @@ static void run_test(const TestDef *t) "pop rax\n\t" "add rsp, 128\n\t" MMREG(STOREMM) - XMMREG(STOREXMM) + YMMREG(STOREYMM) : : "r"(init), "r"(&result), "r"(t->fn) : "memory", "cc", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", - "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", - "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", - "xmm12", "xmm13", "xmm14", "xmm15" + "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", + "ymm6", "ymm7", "ymm8", "ymm9", "ymm10", "ymm11", + "ymm12", "ymm13", "ymm14", "ymm15" ); compare_state(init, &result); } @@ -223,22 +223,30 @@ static void run_all(void) =20 float val_f32[] =3D {2.0, -1.0, 4.8, 0.8, 3, -42.0, 5e6, 7.5, 8.3}; double val_f64[] =3D {2.0, -1.0, 4.8, 0.8, 3, -42.0, 5e6, 7.5}; -v2di val_i64[] =3D { - {0x3d6b3b6a9e4118f2lu, 0x355ae76d2774d78clu}, - {0xd851c54a56bf1f29lu, 0x4a84d1d50bf4c4fflu}, - {0x5826475e2c5fd799lu, 0xfd32edc01243f5e9lu}, +v4di val_i64[] =3D { + {0x3d6b3b6a9e4118f2lu, 0x355ae76d2774d78clu, + 0xac3ff76c4daa4b28lu, 0xe7fabd204cb54083lu}, + {0xd851c54a56bf1f29lu, 0x4a84d1d50bf4c4fflu, + 0x56621e553d52b56clu, 0xd0069553da8f584alu}, + {0x5826475e2c5fd799lu, 0xfd32edc01243f5e9lu, + 0x738ba2c66d3fe126lu, 0x5707219c6e6c26b4lu}, }; =20 -v2di deadbeef =3D {0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull}; -v2di indexq =3D {0x000000000000001full, 0x000000000000008full}; -v2di indexd =3D {0x00000002000000efull, 0xfffffff500000010ull}; +v4di deadbeef =3D {0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull, + 0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull}; +v4di indexq =3D {0x000000000000001full, 0x000000000000008full, + 0xffffffffffffffffull, 0xffffffffffffff5full}; +v4di indexd =3D {0x00000002000000efull, 0xfffffff500000010ull, + 0x0000000afffffff0ull, 0x000000000000000eull}; =20 -void init_f32reg(v2di *r) +v4di gather_mem[0x20]; + +void init_f32reg(v4di *r) { static int n; - float v[4]; + float v[8]; int i; - for (i =3D 0; i < 4; i++) { + for (i =3D 0; i < 8; i++) { v[i] =3D val_f32[n++]; if (n =3D=3D ARRAY_LEN(val_f32)) { n =3D 0; @@ -247,12 +255,12 @@ void init_f32reg(v2di *r) memcpy(r, v, sizeof(*r)); } =20 -void init_f64reg(v2di *r) +void init_f64reg(v4di *r) { static int n; - double v[2]; + double v[4]; int i; - for (i =3D 0; i < 2; i++) { + for (i =3D 0; i < 4; i++) { v[i] =3D val_f64[n++]; if (n =3D=3D ARRAY_LEN(val_f64)) { n =3D 0; @@ -261,13 +269,15 @@ void init_f64reg(v2di *r) memcpy(r, v, sizeof(*r)); } =20 -void init_intreg(v2di *r) +void init_intreg(v4di *r) { static uint64_t mask; static int n; =20 r->q0 =3D val_i64[n].q0 ^ mask; r->q1 =3D val_i64[n].q1 ^ mask; + r->q2 =3D val_i64[n].q2 ^ mask; + r->q3 =3D val_i64[n].q3 ^ mask; n++; if (n =3D=3D ARRAY_LEN(val_i64)) { n =3D 0; @@ -280,46 +290,53 @@ static void init_all(reg_state *s) int i; =20 s->r[3] =3D (uint64_t)&s->mem[0]; /* rdx */ + s->r[4] =3D (uint64_t)&gather_mem[ARRAY_LEN(gather_mem) / 2]; /* rsi */ s->r[5] =3D (uint64_t)&s->mem[2]; /* rdi */ s->flags =3D 2; - for (i =3D 0; i < 8; i++) { - s->xmm[i] =3D deadbeef; + for (i =3D 0; i < 16; i++) { + s->ymm[i] =3D deadbeef; } - s->xmm[13] =3D indexd; - s->xmm[14] =3D indexq; - for (i =3D 0; i < 2; i++) { + s->ymm[13] =3D indexd; + s->ymm[14] =3D indexq; + for (i =3D 0; i < 4; i++) { s->mem0[i] =3D deadbeef; } } =20 int main(int argc, char *argv[]) { + int i; + init_all(&initI); - init_intreg(&initI.xmm[10]); - init_intreg(&initI.xmm[11]); - init_intreg(&initI.xmm[12]); + init_intreg(&initI.ymm[10]); + init_intreg(&initI.ymm[11]); + init_intreg(&initI.ymm[12]); init_intreg(&initI.mem0[1]); printf("Int:\n"); dump_regs(&initI); =20 init_all(&initF32); - init_f32reg(&initF32.xmm[10]); - init_f32reg(&initF32.xmm[11]); - init_f32reg(&initF32.xmm[12]); + init_f32reg(&initF32.ymm[10]); + init_f32reg(&initF32.ymm[11]); + init_f32reg(&initF32.ymm[12]); init_f32reg(&initF32.mem0[1]); initF32.ff =3D 32; printf("F32:\n"); dump_regs(&initF32); =20 init_all(&initF64); - init_f64reg(&initF64.xmm[10]); - init_f64reg(&initF64.xmm[11]); - init_f64reg(&initF64.xmm[12]); + init_f64reg(&initF64.ymm[10]); + init_f64reg(&initF64.ymm[11]); + init_f64reg(&initF64.ymm[12]); init_f64reg(&initF64.mem0[1]); initF64.ff =3D 64; printf("F64:\n"); dump_regs(&initF64); =20 + for (i =3D 0; i < ARRAY_LEN(gather_mem); i++) { + init_intreg(&gather_mem[i]); + } + if (argc > 1) { int n =3D atoi(argv[1]); run_test(&test_table[n]); diff --git a/tests/tcg/i386/test-avx.py b/tests/tcg/i386/test-avx.py index e16a3d8bee..02982329f1 100755 --- a/tests/tcg/i386/test-avx.py +++ b/tests/tcg/i386/test-avx.py @@ -8,6 +8,7 @@ =20 archs =3D [ "SSE", "SSE2", "SSE3", "SSSE3", "SSE4_1", "SSE4_2", + "AES", "AVX", "AVX2", "AES+AVX", "VAES+AVX", ] =20 ignore =3D set(["FISTTP", @@ -42,7 +43,7 @@ 'vROUND[PS][SD]': 0x7, 'vSHUFPD': 0x0f, 'vSHUFPS': 0xff, - 'vAESKEYGENASSIST': 0, + 'vAESKEYGENASSIST': 0xff, 'VEXTRACT[FI]128': 0x01, 'VINSERT[FI]128': 0x01, 'VPBLENDD': 0xff, @@ -85,7 +86,7 @@ def mem_w(w): else: raise Exception() =20 - return t + " PTR 16[rdx]" + return t + " PTR 32[rdx]" =20 class XMMArg(): isxmm =3D True --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666102310; cv=none; d=zohomail.com; s=zohoarc; b=Is8/9IykLugNl9IROpBgcrXmHALI/3CPTdcQ9+NfPxHdNXBDOJZtbhSD6iZpYyA0HXGVjYXy+N/8EdZF2D42qiS9CeBZaRmFX6aKQB0ErbbFqi8tQlmSg5loFzHaiqR4COjwIW42tHQNmOW6kCsxgP3ghwuusl9tkc7D+fuhYSk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666102310; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8XKBrZnEXl7y7qau6rYYfoKI0WeRGGmOfcj2rNTCRGw=; b=LPsFb68oWvPos3MM5gtzE4fTk75yGUfmhrj5rn8n75ZLBJ0bL4mXY2JkMvF2b63JtOlNw4SeR9cvw89WLiqD7qTOKB2UE2pouOtZ+OVmGoi19f6LGu9DkKb0POv0drFnH7jZAEZhFq+Gr3yuKvuHLWNnmC9xY1O9Zj4UwJdr4NM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666102310064157.2305473329543; Tue, 18 Oct 2022 07:11:50 -0700 (PDT) Received: from localhost ([::1]:33268 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oknJs-0007Tj-NK for importer@patchew.org; Tue, 18 Oct 2022 10:11:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55392) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmjE-0005Kx-La for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:34:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:49248) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmj9-0005Tw-Nw for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:56 -0400 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-528-F5mwxT26NpWL-pnXFDJcQA-1; Tue, 18 Oct 2022 09:33:49 -0400 Received: by mail-ed1-f69.google.com with SMTP id y14-20020a056402440e00b0044301c7ccd9so11694691eda.19 for ; Tue, 18 Oct 2022 06:33:49 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id v1-20020a1709060b4100b0078d3a075525sm7540406ejg.56.2022.10.18.06.33.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100030; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8XKBrZnEXl7y7qau6rYYfoKI0WeRGGmOfcj2rNTCRGw=; b=MLlxtDDlN/aOeXqgtINJV0s3Yj6KanK0RjPDW5Sv84scJRHfnukUwpA86f25TyTpv+NtEa 1RItWau4z8KdlctuuCvSLZAk4hgyq++Zhu3x992OhEu9rccx1e20EHu0OPc/M06VFdf+XY J1pvA/zrdjjzunU/dDe5QmRY7LQBZ7o= X-MC-Unique: F5mwxT26NpWL-pnXFDJcQA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8XKBrZnEXl7y7qau6rYYfoKI0WeRGGmOfcj2rNTCRGw=; b=xyjTGaSnhc+HdSae8t2gNrScssAlm5swzVyG13cvcbm9i10yPGaNOCH674na1t7u6E 4bcFfRqdxEHrNd1yvom5ZYFicfMVYLn9Fq0+J7T2FrynM/iJK6hRymO63aMUquwxu8l8 332LLtNZ7vpROVttSiW0iuqTUDeJDLUk3A5VUZO+24tkC2nJx287BzKXNlC3OdWZ747O g6UlbNlMROYQPnAz8of6Ox8YslxM4a2093x8bZ/fTlI3kXW7RYGVShl+yTQuFcngNZx3 LxFLqYfTwcn2QzLsak95cRfozwnttKZejVuazOqQ848EHBzg+LOOS96B1WpIUuTqUtF5 Ow9w== X-Gm-Message-State: ACrzQf1N5hR0zSCjQuep3o36x4iCjU6tCjWE6xzhl04dxhTNGmmzkw8l lihv7AF17kf974lG39tI0utY/e+p3TbtSJVjFmP6vg6f0i49IK9znnGzkml7FCPx89tTN35hsCc FCgz6RbR5rrllkMFFyVfOoTA5ZSqBQVx6+5MDkn/9N6bDyq2roSxWVfWJr6qlHoQcf2I= X-Received: by 2002:a17:906:da85:b0:741:40a7:d08d with SMTP id xh5-20020a170906da8500b0074140a7d08dmr2582733ejb.263.1666100025939; Tue, 18 Oct 2022 06:33:45 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4xFq5kvtL0r31NZVVSU1k8HcmtmpEmdwQKW0OkWqSxGU3zec8uXfwrJwDm3aLVf/MYk1E0EQ== X-Received: by 2002:a17:906:da85:b0:741:40a7:d08d with SMTP id xh5-20020a170906da8500b0074140a7d08dmr2582014ejb.263.1666100014772; Tue, 18 Oct 2022 06:33:34 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 52/53] target/i386: move 3DNow to the new decoder Date: Tue, 18 Oct 2022 15:30:41 +0200 Message-Id: <20221018133042.856368-53-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666102312890100001 Content-Type: text/plain; charset="utf-8" This adds another kind of weirdness when you thought you had seen it all: an opcode byte that comes _after_ the address, not before. It's not worth adding a new X86_SPECIAL_* constant for it, but it's actually not unlike VCMP; so, forgive me for exploiting the similarity and just deciding to dispatch to the right gen_helper_* call in a single code generation function. In fact, the old decoder had a bug where s->rip_offset should have been set to 1 for 3DNow! instructions, and it's fixed now. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/helper.h | 1 - target/i386/tcg/decode-new.c.inc | 10 +++++ target/i386/tcg/decode-new.h | 1 + target/i386/tcg/emit.c.inc | 61 +++++++++++++++++++++++++++ target/i386/tcg/fpu_helper.c | 6 --- target/i386/tcg/translate.c | 71 +------------------------------- 6 files changed, 74 insertions(+), 76 deletions(-) diff --git a/target/i386/helper.h b/target/i386/helper.h index a2c2c085a3..88143b2a24 100644 --- a/target/i386/helper.h +++ b/target/i386/helper.h @@ -212,7 +212,6 @@ DEF_HELPER_2(ldmxcsr, void, env, i32) DEF_HELPER_1(update_mxcsr, void, env) DEF_HELPER_1(enter_mmx, void, env) DEF_HELPER_1(emms, void, env) -DEF_HELPER_3(movq, void, env, ptr, ptr) =20 #define SHIFT 0 #include "ops_sse_header.h" diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 5f4268bdfb..9e43de6827 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -779,6 +779,14 @@ static void decode_0FE6(DisasContext *s, CPUX86State *= env, X86OpEntry *entry, ui } =20 static const X86OpEntry opcodes_0F[256] =3D { + [0x0E] =3D X86_OP_ENTRY0(EMMS, cpuid(3DNO= W)), /* femms */ + /* + * 3DNow!'s opcode byte comes *after* modrm and displacements, making = it + * more like an Ib operand. Dispatch to the right helper in a single = gen_* + * function. + */ + [0x0F] =3D X86_OP_ENTRY3(3dnow, P,q, Q,q, I,b, cpuid(3DNO= W)), + [0x10] =3D X86_OP_GROUP0(0F10), [0x11] =3D X86_OP_GROUP0(0F11), [0x12] =3D X86_OP_GROUP0(0F12), @@ -1364,6 +1372,8 @@ static bool has_cpuid_feature(DisasContext *s, X86CPU= IDFeature cpuid) case X86_FEAT_AVX: return (s->cpuid_ext_features & CPUID_EXT_AVX); =20 + case X86_FEAT_3DNOW: + return (s->cpuid_ext2_features & CPUID_EXT2_3DNOW); case X86_FEAT_SSE4A: return (s->cpuid_ext3_features & CPUID_EXT3_SSE4A); =20 diff --git a/target/i386/tcg/decode-new.h b/target/i386/tcg/decode-new.h index 2f0b0e4cfd..f159c26850 100644 --- a/target/i386/tcg/decode-new.h +++ b/target/i386/tcg/decode-new.h @@ -96,6 +96,7 @@ typedef enum X86OpSize { =20 typedef enum X86CPUIDFeature { X86_FEAT_None, + X86_FEAT_3DNOW, X86_FEAT_ADX, X86_FEAT_AES, X86_FEAT_AVX, diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index d7c2290db1..63af60ba65 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -19,6 +19,7 @@ * License along with this library; if not, see . */ =20 +typedef void (*SSEFunc_0_epp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b= ); typedef void (*SSEFunc_0_epppti)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr re= g_b, TCGv_ptr reg_c, TCGv a0, TCGv_i32 scale); =20 @@ -326,6 +327,66 @@ static void gen_store_sse(DisasContext *s, X86DecodedI= nsn *decode, int src_ofs) } } =20 +static void gen_helper_pavgusb(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b) +{ + gen_helper_pavgb_mmx(env, reg_a, reg_a, reg_b); +} + +#define FN_3DNOW_MOVE ((SSEFunc_0_epp) (uintptr_t) 1) +static const SSEFunc_0_epp fns_3dnow[] =3D { + [0x0c] =3D gen_helper_pi2fw, + [0x0d] =3D gen_helper_pi2fd, + [0x1c] =3D gen_helper_pf2iw, + [0x1d] =3D gen_helper_pf2id, + [0x8a] =3D gen_helper_pfnacc, + [0x8e] =3D gen_helper_pfpnacc, + [0x90] =3D gen_helper_pfcmpge, + [0x94] =3D gen_helper_pfmin, + [0x96] =3D gen_helper_pfrcp, + [0x97] =3D gen_helper_pfrsqrt, + [0x9a] =3D gen_helper_pfsub, + [0x9e] =3D gen_helper_pfadd, + [0xa0] =3D gen_helper_pfcmpgt, + [0xa4] =3D gen_helper_pfmax, + [0xa6] =3D FN_3DNOW_MOVE, /* PFRCPIT1; no need to actually increase pr= ecision */ + [0xa7] =3D FN_3DNOW_MOVE, /* PFRSQIT1 */ + [0xb6] =3D FN_3DNOW_MOVE, /* PFRCPIT2 */ + [0xaa] =3D gen_helper_pfsubr, + [0xae] =3D gen_helper_pfacc, + [0xb0] =3D gen_helper_pfcmpeq, + [0xb4] =3D gen_helper_pfmul, + [0xb7] =3D gen_helper_pmulhrw_mmx, + [0xbb] =3D gen_helper_pswapd, + [0xbf] =3D gen_helper_pavgusb, +}; + +static void gen_3dnow(DisasContext *s, CPUX86State *env, X86DecodedInsn *d= ecode) +{ + uint8_t b =3D decode->immediate; + SSEFunc_0_epp fn =3D b < ARRAY_SIZE(fns_3dnow) ? fns_3dnow[b] : NULL; + + if (!fn) { + gen_illegal_opcode(s); + return; + } + if (s->flags & HF_TS_MASK) { + gen_NM_exception(s); + return; + } + if (s->flags & HF_EM_MASK) { + gen_illegal_opcode(s); + return; + } + + gen_helper_enter_mmx(cpu_env); + if (fn =3D=3D FN_3DNOW_MOVE) { + tcg_gen_ld_i64(s->tmp1_i64, cpu_env, decode->op[1].offset); + tcg_gen_st_i64(s->tmp1_i64, cpu_env, decode->op[0].offset); + } else { + fn(cpu_env, OP_PTR0, OP_PTR1); + } +} + /* * 00 =3D v*ps Vps, Hps, Wpd * 66 =3D v*pd Vpd, Hpd, Wps diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c index 7670739abe..a6a90a1817 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -3126,12 +3126,6 @@ void helper_emms(CPUX86State *env) *(uint32_t *)(env->fptags + 4) =3D 0x01010101; } =20 -/* XXX: suppress */ -void helper_movq(CPUX86State *env, void *d, void *s) -{ - *(uint64_t *)d =3D *(uint64_t *)s; -} - #define SHIFT 0 #include "ops_sse.h" =20 diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index cf895e4132..e9af467d6f 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -3011,7 +3011,6 @@ static bool first =3D true; static unsigned long limi= t; #define SSE_OPF_CMP (1 << 1) /* does not write for first operand */ #define SSE_OPF_BLENDV (1 << 2) /* blendv* instruction */ #define SSE_OPF_SPECIAL (1 << 3) /* magic */ -#define SSE_OPF_3DNOW (1 << 4) /* 3DNow! instruction */ #define SSE_OPF_MMX (1 << 5) /* MMX/integer/AVX2 instruction */ #define SSE_OPF_SCALAR (1 << 6) /* Has SSE scalar variants */ #define SSE_OPF_SHUF (1 << 9) /* pshufx/shufpx */ @@ -3045,13 +3044,9 @@ struct SSEOpHelper_table1 { SSEFuncs fn[4]; }; =20 -#define SSE_3DNOW { SSE_OPF_3DNOW } #define SSE_SPECIAL { SSE_OPF_SPECIAL } =20 static const struct SSEOpHelper_table1 sse_op_table1[256] =3D { - /* 3DNow! extensions */ - [0x0e] =3D SSE_SPECIAL, /* femms */ - [0x0f] =3D SSE_3DNOW, /* pf... (sse_op_table5) */ /* pure SSE operations */ [0x10] =3D SSE_SPECIAL, /* movups, movupd, movss, movsd */ [0x11] =3D SSE_SPECIAL, /* movups, movupd, movss, movsd */ @@ -3260,38 +3255,6 @@ static const SSEFunc_0_eppp sse_op_table4[8][4] =3D { }; #undef SSE_CMP =20 -static void gen_helper_pavgusb(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b) -{ - gen_helper_pavgb_mmx(env, reg_a, reg_a, reg_b); -} - -static const SSEFunc_0_epp sse_op_table5[256] =3D { - [0x0c] =3D gen_helper_pi2fw, - [0x0d] =3D gen_helper_pi2fd, - [0x1c] =3D gen_helper_pf2iw, - [0x1d] =3D gen_helper_pf2id, - [0x8a] =3D gen_helper_pfnacc, - [0x8e] =3D gen_helper_pfpnacc, - [0x90] =3D gen_helper_pfcmpge, - [0x94] =3D gen_helper_pfmin, - [0x96] =3D gen_helper_pfrcp, - [0x97] =3D gen_helper_pfrsqrt, - [0x9a] =3D gen_helper_pfsub, - [0x9e] =3D gen_helper_pfadd, - [0xa0] =3D gen_helper_pfcmpgt, - [0xa4] =3D gen_helper_pfmax, - [0xa6] =3D gen_helper_movq, /* pfrcpit1; no need to actually increase = precision */ - [0xa7] =3D gen_helper_movq, /* pfrsqit1 */ - [0xaa] =3D gen_helper_pfsubr, - [0xae] =3D gen_helper_pfacc, - [0xb0] =3D gen_helper_pfcmpeq, - [0xb4] =3D gen_helper_pfmul, - [0xb6] =3D gen_helper_movq, /* pfrcpit2 */ - [0xb7] =3D gen_helper_pmulhrw_mmx, - [0xbb] =3D gen_helper_pswapd, - [0xbf] =3D gen_helper_pavgusb, -}; - struct SSEOpHelper_table6 { SSEFuncs fn[2]; uint32_t ext_mask; @@ -3443,7 +3406,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s= , int b) b1 =3D 0; sse_op_flags =3D sse_op_table1[b].flags; sse_op_fn =3D sse_op_table1[b].fn[b1]; - if ((sse_op_flags & (SSE_OPF_SPECIAL | SSE_OPF_3DNOW)) =3D=3D 0 + if ((sse_op_flags & SSE_OPF_SPECIAL) =3D=3D 0 && !sse_op_fn.op1) { goto unknown_op; } @@ -3457,11 +3420,6 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) is_xmm =3D 1; } } - if (sse_op_flags & SSE_OPF_3DNOW) { - if (!(s->cpuid_ext2_features & CPUID_EXT2_3DNOW)) { - goto illegal_op; - } - } /* simple MMX/SSE operation */ if (s->flags & HF_TS_MASK) { gen_exception(s, EXCP07_PREX); @@ -3477,15 +3435,6 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) && (b !=3D 0x38 && b !=3D 0x3a)) { goto unknown_op; } - if (b =3D=3D 0x0e) { - if (!(s->cpuid_ext2_features & CPUID_EXT2_3DNOW)) { - /* If we were fully decoding this we might use illegal_op. */ - goto unknown_op; - } - /* femms */ - gen_helper_emms(cpu_env); - return; - } if (b =3D=3D 0x77) { /* emms */ gen_helper_emms(cpu_env); @@ -4643,18 +4592,6 @@ static void gen_sse(CPUX86State *env, DisasContext *= s, int b) rm =3D (modrm & 7); op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); } - if (sse_op_flags & SSE_OPF_3DNOW) { - /* 3DNow! data insns */ - val =3D x86_ldub_code(env, s); - SSEFunc_0_epp op_3dnow =3D sse_op_table5[val]; - if (!op_3dnow) { - goto unknown_op; - } - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - op_3dnow(cpu_env, s->ptr0, s->ptr1); - return; - } } =20 =20 @@ -4783,7 +4720,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) #endif if (use_new && (b =3D=3D 0x138 || b =3D=3D 0x13a || - (b >=3D 0x110 && b <=3D 0x117) || + (b >=3D 0x10e && b <=3D 0x117) || (b >=3D 0x128 && b <=3D 0x12f) || (b >=3D 0x150 && b <=3D 0x17f) || b =3D=3D 0x1c2 || (b >=3D 0x1c4 && b <=3D 0x1c6) || @@ -8512,10 +8449,6 @@ static bool disas_insn(DisasContext *s, CPUState *cp= u) =20 set_cc_op(s, CC_OP_POPCNT); break; - case 0x10e ... 0x10f: - /* 3DNow! instructions, ignore prefixes */ - s->prefix &=3D ~(PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA); - /* fall through */ case 0x110 ... 0x117: case 0x128 ... 0x12f: case 0x138 ... 0x13a: --=20 2.37.3 From nobody Mon Feb 9 07:06:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1666101197; cv=none; d=zohomail.com; s=zohoarc; b=SocqTn1Xs4BNSTEQMEsbLDmQoxfOrH1LUqUxY7qYxSFNBmuqvWIFyKU3pgYvExlXnDoWKU8lLhRPiylWee4rOg12yUTCbLgNJJniRMT52VAQr5DiPGw3qmUwSongYL5m/meFOe1S/5cszyRnzCnsfWXqqjcmC9QWTrptOj1oPuA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1666101197; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oRlWJl7xu1etVNfJCy8cHT1/xWQN1we3BBzzCrYI2C0=; b=do1jzLKORDoTUgVH36JivSppFAKpbQBT97kkmcWuf/Le0wjUp+f03+TyrIqmREfxRiC/WNT+C8ujsrhPZv1ZyIpTcfHxL52N8dwDB1nx4QGH+84f0A2fvLLMmRR/rhdWC/NCDOD2UO5BHMTjgA6UBlaXSwZ9qFL4CuRm+dcSrFs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16661011974811014.5455723130485; Tue, 18 Oct 2022 06:53:17 -0700 (PDT) Received: from localhost ([::1]:40172 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1okn1u-0002t4-B4 for importer@patchew.org; Tue, 18 Oct 2022 09:53:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41016) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmjC-0005KX-U8 for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:57 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:45002) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1okmj8-0005Tq-DV for qemu-devel@nongnu.org; Tue, 18 Oct 2022 09:33:54 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-433-MTEl8GxpPCmtsHvG-s2VyA-1; Tue, 18 Oct 2022 09:33:46 -0400 Received: by mail-ed1-f72.google.com with SMTP id h13-20020a056402280d00b0045cb282161cso11717801ede.8 for ; Tue, 18 Oct 2022 06:33:46 -0700 (PDT) Received: from avogadro.local ([2001:b07:6468:f312:2f4b:62da:3159:e077]) by smtp.gmail.com with ESMTPSA id f17-20020a50fc91000000b00458f077aecasm8854243edq.17.2022.10.18.06.33.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 06:33:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666100027; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oRlWJl7xu1etVNfJCy8cHT1/xWQN1we3BBzzCrYI2C0=; b=LFpDpjo0y0UtYPf/MBNBDpPqssyqqsND8K4719glOTy4UCto6+N0QXuXMLA4869NH4/Nke QWlkf3KJ0vAxp95GiclmAIg9voSloRnwDa642+7ZzpHzCOHf6Jn6Rd+6BFFI8h97YX1l8F e1/NoRawyOx2CMTHYnggrG38HW884rs= X-MC-Unique: MTEl8GxpPCmtsHvG-s2VyA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oRlWJl7xu1etVNfJCy8cHT1/xWQN1we3BBzzCrYI2C0=; b=g+LE7O3bB0tvPIjQ8iyCkoORRkr9G5oVRfQhVfkOTOPrEQdEl7lVQ3j1gSmYReSBO3 5I7j5A9hU/mGxH2AbP1puiaFCf8hrVDpBe9RMXJrAyIi618Bwt1adEf7MWUUenM2VVLF TA5VYiUlVAr7ERz5Ji/Jw4suuetclnNVH2A1fdiTpSSkydULhz8v9bDAprHFoNfTjtuQ i8ggKObBDDssUZIbxEg+PLdXZgD7NbM7r6Bn2oAx/BHwUvSADzpbhvvKyeTjPzU9tmKA UKetL0yrkPIyMtlw4l2r2Cqvi9DwXKlH8SCFSuZ4AIc5VUPhOcQC+ZDm9hBAQzjNzXqg epMQ== X-Gm-Message-State: ACrzQf2Is/Un9NF1EUEVHruvEHZ2aD/eTf4W6OOVm71lD93s8Aq9ju0r Q+5FyfsQrjN673TLIIqguyuqklQb2kTZaEjNQjQfLqKYHw274n5bYLsX9nUsyhRecoWq+JadAfw u+xiM0Ie82qzXoJcPOy+YYb14w9WctT7Mr5U1S6e55VITwJafLeBqjxUzfZR8oGUV0q4= X-Received: by 2002:a05:6402:550e:b0:456:f79f:2bed with SMTP id fi14-20020a056402550e00b00456f79f2bedmr2691911edb.106.1666100023454; Tue, 18 Oct 2022 06:33:43 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5QgXkFfALKllcsfYO2YwJFQ+cJFwapvlrcDnTHbsaDkHJ9MLk0cx6v9w2tRYsr1Mmg29qiZQ== X-Received: by 2002:a05:6402:550e:b0:456:f79f:2bed with SMTP id fi14-20020a056402550e00b00456f79f2bedmr2691812edb.106.1666100022021; Tue, 18 Oct 2022 06:33:42 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Richard Henderson Subject: [PULL 53/53] target/i386: remove old SSE decoder Date: Tue, 18 Oct 2022 15:30:42 +0200 Message-Id: <20221018133042.856368-54-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221018133042.856368-1-pbonzini@redhat.com> References: <20221018133042.856368-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: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.256, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1666101197748100005 Content-Type: text/plain; charset="utf-8" With all SSE (and AVX!) instructions now implemented in disas_insn_new, it's possible to remove gen_sse, as well as the helpers for instructions that now use gvec. Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 124 --- target/i386/ops_sse_header.h | 61 -- target/i386/tcg/decode-new.c.inc | 3 - target/i386/tcg/emit.c.inc | 17 + target/i386/tcg/translate.c | 1721 +----------------------------- 5 files changed, 19 insertions(+), 1907 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 0037f92e5f..d35fc15c65 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -297,17 +297,6 @@ static inline int satsw(int x) #define FMAXUB(a, b) ((a) > (b)) ? (a) : (b) #define FMAXSW(a, b) ((int16_t)(a) > (int16_t)(b)) ? (a) : (b) =20 -#define FAND(a, b) ((a) & (b)) -#define FANDN(a, b) ((~(a)) & (b)) -#define FOR(a, b) ((a) | (b)) -#define FXOR(a, b) ((a) ^ (b)) - -#define FCMPGTB(a, b) ((int8_t)(a) > (int8_t)(b) ? -1 : 0) -#define FCMPGTW(a, b) ((int16_t)(a) > (int16_t)(b) ? -1 : 0) -#define FCMPGTL(a, b) ((int32_t)(a) > (int32_t)(b) ? -1 : 0) -#define FCMPEQ(a, b) ((a) =3D=3D (b) ? -1 : 0) - -#define FMULLW(a, b) ((a) * (b)) #define FMULHRW(a, b) (((int16_t)(a) * (int16_t)(b) + 0x8000) >> 16) #define FMULHUW(a, b) ((a) * (b) >> 16) #define FMULHW(a, b) ((int16_t)(a) * (int16_t)(b) >> 16) @@ -315,46 +304,6 @@ static inline int satsw(int x) #define FAVG(a, b) (((a) + (b) + 1) >> 1) #endif =20 -SSE_HELPER_B(helper_paddb, FADD) -SSE_HELPER_W(helper_paddw, FADD) -SSE_HELPER_L(helper_paddl, FADD) -SSE_HELPER_Q(helper_paddq, FADD) - -SSE_HELPER_B(helper_psubb, FSUB) -SSE_HELPER_W(helper_psubw, FSUB) -SSE_HELPER_L(helper_psubl, FSUB) -SSE_HELPER_Q(helper_psubq, FSUB) - -SSE_HELPER_B(helper_paddusb, FADDUB) -SSE_HELPER_B(helper_paddsb, FADDSB) -SSE_HELPER_B(helper_psubusb, FSUBUB) -SSE_HELPER_B(helper_psubsb, FSUBSB) - -SSE_HELPER_W(helper_paddusw, FADDUW) -SSE_HELPER_W(helper_paddsw, FADDSW) -SSE_HELPER_W(helper_psubusw, FSUBUW) -SSE_HELPER_W(helper_psubsw, FSUBSW) - -SSE_HELPER_B(helper_pminub, FMINUB) -SSE_HELPER_B(helper_pmaxub, FMAXUB) - -SSE_HELPER_W(helper_pminsw, FMINSW) -SSE_HELPER_W(helper_pmaxsw, FMAXSW) - -SSE_HELPER_Q(helper_pand, FAND) -SSE_HELPER_Q(helper_pandn, FANDN) -SSE_HELPER_Q(helper_por, FOR) -SSE_HELPER_Q(helper_pxor, FXOR) - -SSE_HELPER_B(helper_pcmpgtb, FCMPGTB) -SSE_HELPER_W(helper_pcmpgtw, FCMPGTW) -SSE_HELPER_L(helper_pcmpgtl, FCMPGTL) - -SSE_HELPER_B(helper_pcmpeqb, FCMPEQ) -SSE_HELPER_W(helper_pcmpeqw, FCMPEQ) -SSE_HELPER_L(helper_pcmpeql, FCMPEQ) - -SSE_HELPER_W(helper_pmullw, FMULLW) SSE_HELPER_W(helper_pmulhuw, FMULHUW) SSE_HELPER_W(helper_pmulhw, FMULHW) =20 @@ -432,29 +381,6 @@ void glue(helper_maskmov, SUFFIX)(CPUX86State *env, Re= g *d, Reg *s, } #endif =20 -void glue(helper_movl_mm_T0, SUFFIX)(Reg *d, uint32_t val) -{ - int i; - - d->L(0) =3D val; - d->L(1) =3D 0; - for (i =3D 1; i < (1 << SHIFT); i++) { - d->Q(i) =3D 0; - } -} - -#ifdef TARGET_X86_64 -void glue(helper_movq_mm_T0, SUFFIX)(Reg *d, uint64_t val) -{ - int i; - - d->Q(0) =3D val; - for (i =3D 1; i < (1 << SHIFT); i++) { - d->Q(i) =3D 0; - } -} -#endif - #define SHUFFLE4(F, a, b, offset) do { \ r0 =3D a->F((order & 3) + offset); \ r1 =3D a->F(((order >> 2) & 3) + offset); \ @@ -1216,27 +1142,6 @@ uint32_t glue(helper_movmskpd, SUFFIX)(CPUX86State *= env, Reg *s) =20 #endif =20 -uint32_t glue(helper_pmovmskb, SUFFIX)(CPUX86State *env, Reg *s) -{ - uint32_t val; - int i; - - val =3D 0; - for (i =3D 0; i < (1 << SHIFT); i++) { - uint8_t byte =3D 0; - byte |=3D (s->B(8 * i + 0) >> 7); - byte |=3D (s->B(8 * i + 1) >> 6) & 0x02; - byte |=3D (s->B(8 * i + 2) >> 5) & 0x04; - byte |=3D (s->B(8 * i + 3) >> 4) & 0x08; - byte |=3D (s->B(8 * i + 4) >> 3) & 0x10; - byte |=3D (s->B(8 * i + 5) >> 2) & 0x20; - byte |=3D (s->B(8 * i + 6) >> 1) & 0x40; - byte |=3D (s->B(8 * i + 7)) & 0x80; - val |=3D byte << (8 * i); - } - return val; -} - #define PACK_HELPER_B(name, F) \ void glue(helper_pack ## name, SUFFIX)(CPUX86State *env, \ Reg *d, Reg *v, Reg *s) \ @@ -1587,13 +1492,6 @@ void glue(helper_pmaddubsw, SUFFIX)(CPUX86State *env= , Reg *d, Reg *v, Reg *s) } } =20 -#define FABSB(x) (x > INT8_MAX ? -(int8_t)x : x) -#define FABSW(x) (x > INT16_MAX ? -(int16_t)x : x) -#define FABSL(x) (x > INT32_MAX ? -(int32_t)x : x) -SSE_HELPER_1(helper_pabsb, B, 8 << SHIFT, FABSB) -SSE_HELPER_1(helper_pabsw, W, 4 << SHIFT, FABSW) -SSE_HELPER_1(helper_pabsd, L, 2 << SHIFT, FABSL) - #define FMULHRSW(d, s) (((int16_t) d * (int16_t)s + 0x4000) >> 15) SSE_HELPER_W(helper_pmulhrsw, FMULHRSW) =20 @@ -1723,9 +1621,6 @@ void glue(helper_pmuldq, SUFFIX)(CPUX86State *env, Re= g *d, Reg *v, Reg *s) } } =20 -#define FCMPEQQ(d, s) (d =3D=3D s ? -1 : 0) -SSE_HELPER_Q(helper_pcmpeqq, FCMPEQQ) - void glue(helper_packusdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *= s) { uint16_t r[8]; @@ -1746,22 +1641,6 @@ void glue(helper_packusdw, SUFFIX)(CPUX86State *env,= Reg *d, Reg *v, Reg *s) } } =20 -#define FMINSB(d, s) MIN((int8_t)d, (int8_t)s) -#define FMINSD(d, s) MIN((int32_t)d, (int32_t)s) -#define FMAXSB(d, s) MAX((int8_t)d, (int8_t)s) -#define FMAXSD(d, s) MAX((int32_t)d, (int32_t)s) -SSE_HELPER_B(helper_pminsb, FMINSB) -SSE_HELPER_L(helper_pminsd, FMINSD) -SSE_HELPER_W(helper_pminuw, MIN) -SSE_HELPER_L(helper_pminud, MIN) -SSE_HELPER_B(helper_pmaxsb, FMAXSB) -SSE_HELPER_L(helper_pmaxsd, FMAXSD) -SSE_HELPER_W(helper_pmaxuw, MAX) -SSE_HELPER_L(helper_pmaxud, MAX) - -#define FMULLD(d, s) ((int32_t)d * (int32_t)s) -SSE_HELPER_L(helper_pmulld, FMULLD) - #if SHIFT =3D=3D 1 void glue(helper_phminposuw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) { @@ -2042,9 +1921,6 @@ void glue(helper_mpsadbw, SUFFIX)(CPUX86State *env, R= eg *d, Reg *v, Reg *s, } =20 /* SSE4.2 op helpers */ -#define FCMPGTQ(d, s) ((int64_t)d > (int64_t)s ? -1 : 0) -SSE_HELPER_Q(helper_pcmpgtq, FCMPGTQ) - #if SHIFT =3D=3D 1 static inline int pcmp_elen(CPUX86State *env, int reg, uint32_t ctrl) { diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 00de6d69f1..2f1f811f9f 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -64,46 +64,6 @@ DEF_HELPER_4(glue(pslldq, SUFFIX), void, env, Reg, Reg, = Reg) #define SSE_HELPER_Q(name, F)\ DEF_HELPER_4(glue(name, SUFFIX), void, env, Reg, Reg, Reg) =20 -SSE_HELPER_B(paddb, FADD) -SSE_HELPER_W(paddw, FADD) -SSE_HELPER_L(paddl, FADD) -SSE_HELPER_Q(paddq, FADD) - -SSE_HELPER_B(psubb, FSUB) -SSE_HELPER_W(psubw, FSUB) -SSE_HELPER_L(psubl, FSUB) -SSE_HELPER_Q(psubq, FSUB) - -SSE_HELPER_B(paddusb, FADDUB) -SSE_HELPER_B(paddsb, FADDSB) -SSE_HELPER_B(psubusb, FSUBUB) -SSE_HELPER_B(psubsb, FSUBSB) - -SSE_HELPER_W(paddusw, FADDUW) -SSE_HELPER_W(paddsw, FADDSW) -SSE_HELPER_W(psubusw, FSUBUW) -SSE_HELPER_W(psubsw, FSUBSW) - -SSE_HELPER_B(pminub, FMINUB) -SSE_HELPER_B(pmaxub, FMAXUB) - -SSE_HELPER_W(pminsw, FMINSW) -SSE_HELPER_W(pmaxsw, FMAXSW) - -SSE_HELPER_Q(pand, FAND) -SSE_HELPER_Q(pandn, FANDN) -SSE_HELPER_Q(por, FOR) -SSE_HELPER_Q(pxor, FXOR) - -SSE_HELPER_B(pcmpgtb, FCMPGTB) -SSE_HELPER_W(pcmpgtw, FCMPGTW) -SSE_HELPER_L(pcmpgtl, FCMPGTL) - -SSE_HELPER_B(pcmpeqb, FCMPEQ) -SSE_HELPER_W(pcmpeqw, FCMPEQ) -SSE_HELPER_L(pcmpeql, FCMPEQ) - -SSE_HELPER_W(pmullw, FMULLW) #if SHIFT =3D=3D 0 DEF_HELPER_3(glue(pmulhrw, SUFFIX), void, env, Reg, Reg) #endif @@ -120,10 +80,6 @@ DEF_HELPER_4(glue(psadbw, SUFFIX), void, env, Reg, Reg,= Reg) #if SHIFT < 2 DEF_HELPER_4(glue(maskmov, SUFFIX), void, env, Reg, Reg, tl) #endif -DEF_HELPER_2(glue(movl_mm_T0, SUFFIX), void, Reg, i32) -#ifdef TARGET_X86_64 -DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64) -#endif =20 #if SHIFT =3D=3D 0 DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int) @@ -279,7 +235,6 @@ DEF_HELPER_2(glue(movmskps, SUFFIX), i32, env, Reg) DEF_HELPER_2(glue(movmskpd, SUFFIX), i32, env, Reg) #endif =20 -DEF_HELPER_2(glue(pmovmskb, SUFFIX), i32, env, Reg) DEF_HELPER_4(glue(packsswb, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(packuswb, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(packssdw, SUFFIX), void, env, Reg, Reg, Reg) @@ -326,9 +281,6 @@ DEF_HELPER_4(glue(phaddsw, SUFFIX), void, env, Reg, Reg= , Reg) DEF_HELPER_4(glue(phsubw, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(phsubd, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(phsubsw, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_3(glue(pabsb, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pabsw, SUFFIX), void, env, Reg, Reg) -DEF_HELPER_3(glue(pabsd, SUFFIX), void, env, Reg, Reg) DEF_HELPER_4(glue(pmaddubsw, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(pmulhrsw, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(pshufb, SUFFIX), void, env, Reg, Reg, Reg) @@ -359,17 +311,7 @@ DEF_HELPER_3(glue(pmovsldup, SUFFIX), void, env, Reg, = Reg) DEF_HELPER_3(glue(pmovshdup, SUFFIX), void, env, Reg, Reg) DEF_HELPER_3(glue(pmovdldup, SUFFIX), void, env, Reg, Reg) DEF_HELPER_4(glue(pmuldq, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pcmpeqq, SUFFIX), void, env, Reg, Reg, Reg) DEF_HELPER_4(glue(packusdw, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pminsb, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pminsd, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pminuw, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pminud, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pmaxsb, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pmaxsd, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pmaxuw, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pmaxud, SUFFIX), void, env, Reg, Reg, Reg) -DEF_HELPER_4(glue(pmulld, SUFFIX), void, env, Reg, Reg, Reg) #if SHIFT =3D=3D 1 DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, Reg) #endif @@ -390,9 +332,6 @@ DEF_HELPER_5(glue(mpsadbw, SUFFIX), void, env, Reg, Reg= , Reg, i32) #endif =20 /* SSE4.2 op helpers */ -#if SHIFT >=3D 1 -DEF_HELPER_4(glue(pcmpgtq, SUFFIX), void, env, Reg, Reg, Reg) -#endif #if SHIFT =3D=3D 1 DEF_HELPER_4(glue(pcmpestri, SUFFIX), void, env, Reg, Reg, i32) DEF_HELPER_4(glue(pcmpestrm, SUFFIX), void, env, Reg, Reg, i32) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index 9e43de6827..8e1eb9db42 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1542,9 +1542,6 @@ static void disas_insn_new(DisasContext *s, CPUState = *cpu, int b) X86DecodedInsn decode; X86DecodeFunc decode_func =3D decode_root; =20 -#ifdef CONFIG_USER_ONLY - if (limit) { --limit; } -#endif s->has_modrm =3D false; =20 next_byte: diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 63af60ba65..27eca591a9 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -19,7 +19,24 @@ * License along with this library; if not, see . */ =20 +#define ZMM_OFFSET(reg) offsetof(CPUX86State, xmm_regs[reg]) + +typedef void (*SSEFunc_i_ep)(TCGv_i32 val, TCGv_ptr env, TCGv_ptr reg); +typedef void (*SSEFunc_l_ep)(TCGv_i64 val, TCGv_ptr env, TCGv_ptr reg); typedef void (*SSEFunc_0_epp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b= ); +typedef void (*SSEFunc_0_eppp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, + TCGv_ptr reg_c); +typedef void (*SSEFunc_0_epppp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, + TCGv_ptr reg_c, TCGv_ptr reg_d); +typedef void (*SSEFunc_0_eppi)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, + TCGv_i32 val); +typedef void (*SSEFunc_0_epppi)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, + TCGv_ptr reg_c, TCGv_i32 val); +typedef void (*SSEFunc_0_ppi)(TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_i32 val= ); +typedef void (*SSEFunc_0_pppi)(TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_ptr re= g_c, + TCGv_i32 val); +typedef void (*SSEFunc_0_eppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, + TCGv val); typedef void (*SSEFunc_0_epppti)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr re= g_b, TCGv_ptr reg_c, TCGv a0, TCGv_i32 scale); =20 diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index e9af467d6f..e19d5c1c64 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -129,9 +129,6 @@ typedef struct DisasContext { /* TCG local register indexes (only used inside old micro ops) */ TCGv tmp0; TCGv tmp4; - TCGv_ptr ptr0; - TCGv_ptr ptr1; - TCGv_ptr ptr2; TCGv_i32 tmp2_i32; TCGv_i32 tmp3_i32; TCGv_i64 tmp1_i64; @@ -2952,1696 +2949,10 @@ static void gen_sty_env_A0(DisasContext *s, int o= ffset, bool align) tcg_gen_qemu_st_i64(s->tmp1_i64, s->tmp0, mem_index, MO_LEUQ); } =20 -static inline void gen_op_movo(DisasContext *s, int d_offset, int s_offset) -{ - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(XMMReg, XMM_Q= (0))); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset + offsetof(XMMReg, XMM_Q= (0))); - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset + offsetof(XMMReg, XMM_Q= (1))); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset + offsetof(XMMReg, XMM_Q= (1))); -} - -static inline void gen_op_movq(DisasContext *s, int d_offset, int s_offset) -{ - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, s_offset); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset); -} - -static inline void gen_op_movl(DisasContext *s, int d_offset, int s_offset) -{ - tcg_gen_ld_i32(s->tmp2_i32, cpu_env, s_offset); - tcg_gen_st_i32(s->tmp2_i32, cpu_env, d_offset); -} - -static inline void gen_op_movq_env_0(DisasContext *s, int d_offset) -{ - tcg_gen_movi_i64(s->tmp1_i64, 0); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, d_offset); -} - -#define ZMM_OFFSET(reg) offsetof(CPUX86State, xmm_regs[reg]) -#define XMM_OFFSET(reg) offsetof(CPUX86State, xmm_regs[reg].ZMM_X(0)) - -typedef void (*SSEFunc_i_ep)(TCGv_i32 val, TCGv_ptr env, TCGv_ptr reg); -typedef void (*SSEFunc_l_ep)(TCGv_i64 val, TCGv_ptr env, TCGv_ptr reg); -typedef void (*SSEFunc_0_epi)(TCGv_ptr env, TCGv_ptr reg, TCGv_i32 val); -typedef void (*SSEFunc_0_epl)(TCGv_ptr env, TCGv_ptr reg, TCGv_i64 val); -typedef void (*SSEFunc_0_epp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b= ); -typedef void (*SSEFunc_0_eppp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, - TCGv_ptr reg_c); -typedef void (*SSEFunc_0_epppp)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, - TCGv_ptr reg_c, TCGv_ptr reg_d); -typedef void (*SSEFunc_0_eppi)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, - TCGv_i32 val); -typedef void (*SSEFunc_0_epppi)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, - TCGv_ptr reg_c, TCGv_i32 val); -typedef void (*SSEFunc_0_ppi)(TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_i32 val= ); -typedef void (*SSEFunc_0_pppi)(TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_ptr re= g_c, - TCGv_i32 val); -typedef void (*SSEFunc_0_eppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_= b, - TCGv val); -typedef void (*SSEFunc_0_epppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg= _b, - TCGv_ptr reg_c, TCGv val); - -static bool first =3D true; static unsigned long limit; #include "decode-new.h" #include "emit.c.inc" #include "decode-new.c.inc" =20 -#define SSE_OPF_V0 (1 << 0) /* vex.v must be 1111b (only 2 operands= ) */ -#define SSE_OPF_CMP (1 << 1) /* does not write for first operand */ -#define SSE_OPF_BLENDV (1 << 2) /* blendv* instruction */ -#define SSE_OPF_SPECIAL (1 << 3) /* magic */ -#define SSE_OPF_MMX (1 << 5) /* MMX/integer/AVX2 instruction */ -#define SSE_OPF_SCALAR (1 << 6) /* Has SSE scalar variants */ -#define SSE_OPF_SHUF (1 << 9) /* pshufx/shufpx */ - -#define OP(op, flags, a, b, c, d) \ - {flags, {{.op =3D a}, {.op =3D b}, {.op =3D c}, {.op =3D d} } } - -#define MMX_OP(x) OP(op2, SSE_OPF_MMX, \ - gen_helper_ ## x ## _mmx, gen_helper_ ## x ## _xmm, NULL, NULL) - -#define SSE_FOP(name) OP(op2, SSE_OPF_SCALAR, \ - gen_helper_##name##ps##_xmm, gen_helper_##name##pd##_xmm, \ - gen_helper_##name##ss, gen_helper_##name##sd) -#define SSE_OP(sname, dname, op, flags) OP(op, flags, \ - gen_helper_##sname##_xmm, gen_helper_##dname##_xmm, NULL, NULL) - -#define SSE_OP_UNARY(a, b, c, d) \ - {SSE_OPF_SCALAR | SSE_OPF_V0, {{.op1 =3D a}, {.op1 =3D b}, {.op2 =3D c= }, {.op2 =3D d} } } - -typedef union SSEFuncs { - SSEFunc_0_epp op1; - SSEFunc_0_ppi op1i; - SSEFunc_0_eppt op1t; - SSEFunc_0_eppp op2; - SSEFunc_0_pppi op2i; - SSEFunc_0_epppp op3; -} SSEFuncs; - -struct SSEOpHelper_table1 { - int flags; - SSEFuncs fn[4]; -}; - -#define SSE_SPECIAL { SSE_OPF_SPECIAL } - -static const struct SSEOpHelper_table1 sse_op_table1[256] =3D { - /* pure SSE operations */ - [0x10] =3D SSE_SPECIAL, /* movups, movupd, movss, movsd */ - [0x11] =3D SSE_SPECIAL, /* movups, movupd, movss, movsd */ - [0x12] =3D SSE_SPECIAL, /* movlps, movlpd, movsldup, movddup */ - [0x13] =3D SSE_SPECIAL, /* movlps, movlpd */ - [0x14] =3D SSE_OP(punpckldq, punpcklqdq, op2, 0), /* unpcklps, unpcklp= d */ - [0x15] =3D SSE_OP(punpckhdq, punpckhqdq, op2, 0), /* unpckhps, unpckhp= d */ - [0x16] =3D SSE_SPECIAL, /* movhps, movhpd, movshdup */ - [0x17] =3D SSE_SPECIAL, /* movhps, movhpd */ - - [0x28] =3D SSE_SPECIAL, /* movaps, movapd */ - [0x29] =3D SSE_SPECIAL, /* movaps, movapd */ - [0x2a] =3D SSE_SPECIAL, /* cvtpi2ps, cvtpi2pd, cvtsi2ss, cvtsi2sd */ - [0x2b] =3D SSE_SPECIAL, /* movntps, movntpd, movntss, movntsd */ - [0x2c] =3D SSE_SPECIAL, /* cvttps2pi, cvttpd2pi, cvttsd2si, cvttss2si = */ - [0x2d] =3D SSE_SPECIAL, /* cvtps2pi, cvtpd2pi, cvtsd2si, cvtss2si */ - [0x2e] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR | SSE_OPF_V0, - gen_helper_ucomiss, gen_helper_ucomisd, NULL, NULL), - [0x2f] =3D OP(op1, SSE_OPF_CMP | SSE_OPF_SCALAR | SSE_OPF_V0, - gen_helper_comiss, gen_helper_comisd, NULL, NULL), - [0x50] =3D SSE_SPECIAL, /* movmskps, movmskpd */ - [0x51] =3D SSE_OP_UNARY( - gen_helper_sqrtps_xmm, gen_helper_sqrtpd_xmm, - gen_helper_sqrtss, gen_helper_sqrtsd), - [0x52] =3D SSE_OP_UNARY( - gen_helper_rsqrtps_xmm, NULL, gen_helper_rsqrtss, NULL), - [0x53] =3D SSE_OP_UNARY( - gen_helper_rcpps_xmm, NULL, gen_helper_rcpss, NULL), - [0x54] =3D SSE_OP(pand, pand, op2, 0), /* andps, andpd */ - [0x55] =3D SSE_OP(pandn, pandn, op2, 0), /* andnps, andnpd */ - [0x56] =3D SSE_OP(por, por, op2, 0), /* orps, orpd */ - [0x57] =3D SSE_OP(pxor, pxor, op2, 0), /* xorps, xorpd */ - [0x58] =3D SSE_FOP(add), - [0x59] =3D SSE_FOP(mul), - [0x5a] =3D SSE_OP_UNARY( - gen_helper_cvtps2pd_xmm, gen_helper_cvtpd2ps_xmm, - gen_helper_cvtss2sd, gen_helper_cvtsd2ss), - [0x5b] =3D OP(op1, SSE_OPF_V0, - gen_helper_cvtdq2ps_xmm, gen_helper_cvtps2dq_xmm, - gen_helper_cvttps2dq_xmm, NULL), - [0x5c] =3D SSE_FOP(sub), - [0x5d] =3D SSE_FOP(min), - [0x5e] =3D SSE_FOP(div), - [0x5f] =3D SSE_FOP(max), - - [0xc2] =3D SSE_FOP(cmpeq), /* sse_op_table4 */ - [0xc6] =3D SSE_OP(shufps, shufpd, op2i, SSE_OPF_SHUF), - - /* SSSE3, SSE4, MOVBE, CRC32, BMI1, BMI2, ADX. */ - [0x38] =3D SSE_SPECIAL, - [0x3a] =3D SSE_SPECIAL, - - /* MMX ops and their SSE extensions */ - [0x60] =3D MMX_OP(punpcklbw), - [0x61] =3D MMX_OP(punpcklwd), - [0x62] =3D MMX_OP(punpckldq), - [0x63] =3D MMX_OP(packsswb), - [0x64] =3D MMX_OP(pcmpgtb), - [0x65] =3D MMX_OP(pcmpgtw), - [0x66] =3D MMX_OP(pcmpgtl), - [0x67] =3D MMX_OP(packuswb), - [0x68] =3D MMX_OP(punpckhbw), - [0x69] =3D MMX_OP(punpckhwd), - [0x6a] =3D MMX_OP(punpckhdq), - [0x6b] =3D MMX_OP(packssdw), - [0x6c] =3D OP(op2, SSE_OPF_MMX, - NULL, gen_helper_punpcklqdq_xmm, NULL, NULL), - [0x6d] =3D OP(op2, SSE_OPF_MMX, - NULL, gen_helper_punpckhqdq_xmm, NULL, NULL), - [0x6e] =3D SSE_SPECIAL, /* movd mm, ea */ - [0x6f] =3D SSE_SPECIAL, /* movq, movdqa, , movqdu */ - [0x70] =3D OP(op1i, SSE_OPF_SHUF | SSE_OPF_MMX | SSE_OPF_V0, - gen_helper_pshufw_mmx, gen_helper_pshufd_xmm, - gen_helper_pshufhw_xmm, gen_helper_pshuflw_xmm), - [0x71] =3D SSE_SPECIAL, /* shiftw */ - [0x72] =3D SSE_SPECIAL, /* shiftd */ - [0x73] =3D SSE_SPECIAL, /* shiftq */ - [0x74] =3D MMX_OP(pcmpeqb), - [0x75] =3D MMX_OP(pcmpeqw), - [0x76] =3D MMX_OP(pcmpeql), - [0x77] =3D SSE_SPECIAL, /* emms */ - [0x78] =3D SSE_SPECIAL, /* extrq_i, insertq_i (sse4a) */ - [0x79] =3D OP(op1, SSE_OPF_V0, - NULL, gen_helper_extrq_r, NULL, gen_helper_insertq_r), - [0x7c] =3D OP(op2, 0, - NULL, gen_helper_haddpd_xmm, NULL, gen_helper_haddps_xmm), - [0x7d] =3D OP(op2, 0, - NULL, gen_helper_hsubpd_xmm, NULL, gen_helper_hsubps_xmm), - [0x7e] =3D SSE_SPECIAL, /* movd, movd, , movq */ - [0x7f] =3D SSE_SPECIAL, /* movq, movdqa, movdqu */ - [0xc4] =3D SSE_SPECIAL, /* pinsrw */ - [0xc5] =3D SSE_SPECIAL, /* pextrw */ - [0xd0] =3D OP(op2, 0, - NULL, gen_helper_addsubpd_xmm, NULL, gen_helper_addsubps_x= mm), - [0xd1] =3D MMX_OP(psrlw), - [0xd2] =3D MMX_OP(psrld), - [0xd3] =3D MMX_OP(psrlq), - [0xd4] =3D MMX_OP(paddq), - [0xd5] =3D MMX_OP(pmullw), - [0xd6] =3D SSE_SPECIAL, - [0xd7] =3D SSE_SPECIAL, /* pmovmskb */ - [0xd8] =3D MMX_OP(psubusb), - [0xd9] =3D MMX_OP(psubusw), - [0xda] =3D MMX_OP(pminub), - [0xdb] =3D MMX_OP(pand), - [0xdc] =3D MMX_OP(paddusb), - [0xdd] =3D MMX_OP(paddusw), - [0xde] =3D MMX_OP(pmaxub), - [0xdf] =3D MMX_OP(pandn), - [0xe0] =3D MMX_OP(pavgb), - [0xe1] =3D MMX_OP(psraw), - [0xe2] =3D MMX_OP(psrad), - [0xe3] =3D MMX_OP(pavgw), - [0xe4] =3D MMX_OP(pmulhuw), - [0xe5] =3D MMX_OP(pmulhw), - [0xe6] =3D OP(op1, SSE_OPF_V0, - NULL, gen_helper_cvttpd2dq_xmm, - gen_helper_cvtdq2pd_xmm, gen_helper_cvtpd2dq_xmm), - [0xe7] =3D SSE_SPECIAL, /* movntq, movntq */ - [0xe8] =3D MMX_OP(psubsb), - [0xe9] =3D MMX_OP(psubsw), - [0xea] =3D MMX_OP(pminsw), - [0xeb] =3D MMX_OP(por), - [0xec] =3D MMX_OP(paddsb), - [0xed] =3D MMX_OP(paddsw), - [0xee] =3D MMX_OP(pmaxsw), - [0xef] =3D MMX_OP(pxor), - [0xf0] =3D SSE_SPECIAL, /* lddqu */ - [0xf1] =3D MMX_OP(psllw), - [0xf2] =3D MMX_OP(pslld), - [0xf3] =3D MMX_OP(psllq), - [0xf4] =3D MMX_OP(pmuludq), - [0xf5] =3D MMX_OP(pmaddwd), - [0xf6] =3D MMX_OP(psadbw), - [0xf7] =3D OP(op1t, SSE_OPF_MMX | SSE_OPF_V0, - gen_helper_maskmov_mmx, gen_helper_maskmov_xmm, NULL, NULL= ), - [0xf8] =3D MMX_OP(psubb), - [0xf9] =3D MMX_OP(psubw), - [0xfa] =3D MMX_OP(psubl), - [0xfb] =3D MMX_OP(psubq), - [0xfc] =3D MMX_OP(paddb), - [0xfd] =3D MMX_OP(paddw), - [0xfe] =3D MMX_OP(paddl), -}; -#undef MMX_OP -#undef OP -#undef SSE_FOP -#undef SSE_OP -#undef SSE_SPECIAL - -#define MMX_OP2(x) { gen_helper_ ## x ## _mmx, gen_helper_ ## x ## _xmm } - -static const SSEFunc_0_eppp sse_op_table2[3 * 8][2] =3D { - [0 + 2] =3D MMX_OP2(psrlw), - [0 + 4] =3D MMX_OP2(psraw), - [0 + 6] =3D MMX_OP2(psllw), - [8 + 2] =3D MMX_OP2(psrld), - [8 + 4] =3D MMX_OP2(psrad), - [8 + 6] =3D MMX_OP2(pslld), - [16 + 2] =3D MMX_OP2(psrlq), - [16 + 3] =3D { NULL, gen_helper_psrldq_xmm }, - [16 + 6] =3D MMX_OP2(psllq), - [16 + 7] =3D { NULL, gen_helper_pslldq_xmm }, -}; - -static const SSEFunc_0_epi sse_op_table3ai[] =3D { - gen_helper_cvtsi2ss, - gen_helper_cvtsi2sd -}; - -#ifdef TARGET_X86_64 -static const SSEFunc_0_epl sse_op_table3aq[] =3D { - gen_helper_cvtsq2ss, - gen_helper_cvtsq2sd -}; -#endif - -static const SSEFunc_i_ep sse_op_table3bi[] =3D { - gen_helper_cvttss2si, - gen_helper_cvtss2si, - gen_helper_cvttsd2si, - gen_helper_cvtsd2si -}; - -#ifdef TARGET_X86_64 -static const SSEFunc_l_ep sse_op_table3bq[] =3D { - gen_helper_cvttss2sq, - gen_helper_cvtss2sq, - gen_helper_cvttsd2sq, - gen_helper_cvtsd2sq -}; -#endif - -#define SSE_CMP(x) { \ - gen_helper_ ## x ## ps ## _xmm, gen_helper_ ## x ## pd ## _xmm, \ - gen_helper_ ## x ## ss, gen_helper_ ## x ## sd} -static const SSEFunc_0_eppp sse_op_table4[8][4] =3D { - SSE_CMP(cmpeq), - SSE_CMP(cmplt), - SSE_CMP(cmple), - SSE_CMP(cmpunord), - SSE_CMP(cmpneq), - SSE_CMP(cmpnlt), - SSE_CMP(cmpnle), - SSE_CMP(cmpord), -}; -#undef SSE_CMP - -struct SSEOpHelper_table6 { - SSEFuncs fn[2]; - uint32_t ext_mask; - int flags; -}; - -struct SSEOpHelper_table7 { - union { - SSEFunc_0_eppi op1; - SSEFunc_0_epppi op2; - SSEFunc_0_epppp op3; - } fn[2]; - uint32_t ext_mask; - int flags; -}; - -#define gen_helper_special_xmm NULL - -#define OP(name, op, flags, ext, mmx_name) \ - {{{.op =3D mmx_name}, {.op =3D gen_helper_ ## name ## _xmm} }, \ - CPUID_EXT_ ## ext, flags} -#define BINARY_OP_MMX(name, ext) \ - OP(name, op2, SSE_OPF_MMX, ext, gen_helper_ ## name ## _mmx) -#define BINARY_OP(name, ext, flags) \ - OP(name, op2, flags, ext, NULL) -#define UNARY_OP_MMX(name, ext) \ - OP(name, op1, SSE_OPF_V0 | SSE_OPF_MMX, ext, gen_helper_ ## name ## _m= mx) -#define UNARY_OP(name, ext, flags) \ - OP(name, op1, SSE_OPF_V0 | flags, ext, NULL) -#define BLENDV_OP(name, ext, flags) OP(name, op3, SSE_OPF_BLENDV, ext, NUL= L) -#define CMP_OP(name, ext) OP(name, op1, SSE_OPF_CMP | SSE_OPF_V0, ext, NUL= L) -#define SPECIAL_OP(ext) OP(special, op1, SSE_OPF_SPECIAL, ext, NULL) - -/* prefix [66] 0f 38 */ -static const struct SSEOpHelper_table6 sse_op_table6[256] =3D { - [0x00] =3D BINARY_OP_MMX(pshufb, SSSE3), - [0x01] =3D BINARY_OP_MMX(phaddw, SSSE3), - [0x02] =3D BINARY_OP_MMX(phaddd, SSSE3), - [0x03] =3D BINARY_OP_MMX(phaddsw, SSSE3), - [0x04] =3D BINARY_OP_MMX(pmaddubsw, SSSE3), - [0x05] =3D BINARY_OP_MMX(phsubw, SSSE3), - [0x06] =3D BINARY_OP_MMX(phsubd, SSSE3), - [0x07] =3D BINARY_OP_MMX(phsubsw, SSSE3), - [0x08] =3D BINARY_OP_MMX(psignb, SSSE3), - [0x09] =3D BINARY_OP_MMX(psignw, SSSE3), - [0x0a] =3D BINARY_OP_MMX(psignd, SSSE3), - [0x0b] =3D BINARY_OP_MMX(pmulhrsw, SSSE3), - [0x10] =3D BLENDV_OP(pblendvb, SSE41, SSE_OPF_MMX), - [0x14] =3D BLENDV_OP(blendvps, SSE41, 0), - [0x15] =3D BLENDV_OP(blendvpd, SSE41, 0), - [0x17] =3D CMP_OP(ptest, SSE41), - [0x1c] =3D UNARY_OP_MMX(pabsb, SSSE3), - [0x1d] =3D UNARY_OP_MMX(pabsw, SSSE3), - [0x1e] =3D UNARY_OP_MMX(pabsd, SSSE3), - [0x20] =3D UNARY_OP(pmovsxbw, SSE41, SSE_OPF_MMX), - [0x21] =3D UNARY_OP(pmovsxbd, SSE41, SSE_OPF_MMX), - [0x22] =3D UNARY_OP(pmovsxbq, SSE41, SSE_OPF_MMX), - [0x23] =3D UNARY_OP(pmovsxwd, SSE41, SSE_OPF_MMX), - [0x24] =3D UNARY_OP(pmovsxwq, SSE41, SSE_OPF_MMX), - [0x25] =3D UNARY_OP(pmovsxdq, SSE41, SSE_OPF_MMX), - [0x28] =3D BINARY_OP(pmuldq, SSE41, SSE_OPF_MMX), - [0x29] =3D BINARY_OP(pcmpeqq, SSE41, SSE_OPF_MMX), - [0x2a] =3D SPECIAL_OP(SSE41), /* movntdqa */ - [0x2b] =3D BINARY_OP(packusdw, SSE41, SSE_OPF_MMX), - [0x30] =3D UNARY_OP(pmovzxbw, SSE41, SSE_OPF_MMX), - [0x31] =3D UNARY_OP(pmovzxbd, SSE41, SSE_OPF_MMX), - [0x32] =3D UNARY_OP(pmovzxbq, SSE41, SSE_OPF_MMX), - [0x33] =3D UNARY_OP(pmovzxwd, SSE41, SSE_OPF_MMX), - [0x34] =3D UNARY_OP(pmovzxwq, SSE41, SSE_OPF_MMX), - [0x35] =3D UNARY_OP(pmovzxdq, SSE41, SSE_OPF_MMX), - [0x37] =3D BINARY_OP(pcmpgtq, SSE41, SSE_OPF_MMX), - [0x38] =3D BINARY_OP(pminsb, SSE41, SSE_OPF_MMX), - [0x39] =3D BINARY_OP(pminsd, SSE41, SSE_OPF_MMX), - [0x3a] =3D BINARY_OP(pminuw, SSE41, SSE_OPF_MMX), - [0x3b] =3D BINARY_OP(pminud, SSE41, SSE_OPF_MMX), - [0x3c] =3D BINARY_OP(pmaxsb, SSE41, SSE_OPF_MMX), - [0x3d] =3D BINARY_OP(pmaxsd, SSE41, SSE_OPF_MMX), - [0x3e] =3D BINARY_OP(pmaxuw, SSE41, SSE_OPF_MMX), - [0x3f] =3D BINARY_OP(pmaxud, SSE41, SSE_OPF_MMX), - [0x40] =3D BINARY_OP(pmulld, SSE41, SSE_OPF_MMX), - [0x41] =3D UNARY_OP(phminposuw, SSE41, 0), - [0xdb] =3D UNARY_OP(aesimc, AES, 0), - [0xdc] =3D BINARY_OP(aesenc, AES, 0), - [0xdd] =3D BINARY_OP(aesenclast, AES, 0), - [0xde] =3D BINARY_OP(aesdec, AES, 0), - [0xdf] =3D BINARY_OP(aesdeclast, AES, 0), -}; - -/* prefix [66] 0f 3a */ -static const struct SSEOpHelper_table7 sse_op_table7[256] =3D { - [0x08] =3D UNARY_OP(roundps, SSE41, 0), - [0x09] =3D UNARY_OP(roundpd, SSE41, 0), - [0x0a] =3D BINARY_OP(roundss, SSE41, SSE_OPF_SCALAR), - [0x0b] =3D BINARY_OP(roundsd, SSE41, SSE_OPF_SCALAR), - [0x0c] =3D BINARY_OP(blendps, SSE41, 0), - [0x0d] =3D BINARY_OP(blendpd, SSE41, 0), - [0x0e] =3D BINARY_OP(pblendw, SSE41, SSE_OPF_MMX), - [0x0f] =3D BINARY_OP_MMX(palignr, SSSE3), - [0x14] =3D SPECIAL_OP(SSE41), /* pextrb */ - [0x15] =3D SPECIAL_OP(SSE41), /* pextrw */ - [0x16] =3D SPECIAL_OP(SSE41), /* pextrd/pextrq */ - [0x17] =3D SPECIAL_OP(SSE41), /* extractps */ - [0x20] =3D SPECIAL_OP(SSE41), /* pinsrb */ - [0x21] =3D SPECIAL_OP(SSE41), /* insertps */ - [0x22] =3D SPECIAL_OP(SSE41), /* pinsrd/pinsrq */ - [0x40] =3D BINARY_OP(dpps, SSE41, 0), - [0x41] =3D BINARY_OP(dppd, SSE41, 0), - [0x42] =3D BINARY_OP(mpsadbw, SSE41, SSE_OPF_MMX), - [0x44] =3D BINARY_OP(pclmulqdq, PCLMULQDQ, 0), - [0x60] =3D CMP_OP(pcmpestrm, SSE42), - [0x61] =3D CMP_OP(pcmpestri, SSE42), - [0x62] =3D CMP_OP(pcmpistrm, SSE42), - [0x63] =3D CMP_OP(pcmpistri, SSE42), - [0xdf] =3D UNARY_OP(aeskeygenassist, AES, 0), -}; - -#undef OP -#undef BINARY_OP_MMX -#undef BINARY_OP -#undef UNARY_OP_MMX -#undef UNARY_OP -#undef BLENDV_OP -#undef SPECIAL_OP - -/* VEX prefix not allowed */ -#define CHECK_NO_VEX(s) do { \ - if (s->prefix & PREFIX_VEX) \ - goto illegal_op; \ - } while (0) - -static void gen_sse(CPUX86State *env, DisasContext *s, int b) -{ - int b1, op1_offset, op2_offset, is_xmm, val; - int modrm, mod, rm, reg; - int sse_op_flags; - SSEFuncs sse_op_fn; - const struct SSEOpHelper_table6 *op6; - const struct SSEOpHelper_table7 *op7; - MemOp ot; - - b &=3D 0xff; - if (s->prefix & PREFIX_DATA) - b1 =3D 1; - else if (s->prefix & PREFIX_REPZ) - b1 =3D 2; - else if (s->prefix & PREFIX_REPNZ) - b1 =3D 3; - else - b1 =3D 0; - sse_op_flags =3D sse_op_table1[b].flags; - sse_op_fn =3D sse_op_table1[b].fn[b1]; - if ((sse_op_flags & SSE_OPF_SPECIAL) =3D=3D 0 - && !sse_op_fn.op1) { - goto unknown_op; - } - if ((b <=3D 0x5f && b >=3D 0x10) || b =3D=3D 0xc6 || b =3D=3D 0xc2) { - is_xmm =3D 1; - } else { - if (b1 =3D=3D 0) { - /* MMX case */ - is_xmm =3D 0; - } else { - is_xmm =3D 1; - } - } - /* simple MMX/SSE operation */ - if (s->flags & HF_TS_MASK) { - gen_exception(s, EXCP07_PREX); - return; - } - if (s->flags & HF_EM_MASK) { - illegal_op: - gen_illegal_opcode(s); - return; - } - if (is_xmm - && !(s->flags & HF_OSFXSR_MASK) - && (b !=3D 0x38 && b !=3D 0x3a)) { - goto unknown_op; - } - if (b =3D=3D 0x77) { - /* emms */ - gen_helper_emms(cpu_env); - return; - } - /* prepare MMX state (XXX: optimize by storing fptt and fptags in - the static cpu state) */ - if (!is_xmm) { - gen_helper_enter_mmx(cpu_env); - } - - modrm =3D x86_ldub_code(env, s); - reg =3D ((modrm >> 3) & 7); - if (is_xmm) { - reg |=3D REX_R(s); - } - mod =3D (modrm >> 6) & 3; - if (sse_op_flags & SSE_OPF_SPECIAL) { - b |=3D (b1 << 8); - switch(b) { - case 0x0e7: /* movntq */ - CHECK_NO_VEX(s); - if (mod =3D=3D 3) { - goto illegal_op; - } - gen_lea_modrm(env, s, modrm); - gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); - break; - case 0x1e7: /* movntdq */ - case 0x02b: /* movntps */ - case 0x12b: /* movntpd */ - if (mod =3D=3D 3) - goto illegal_op; - gen_lea_modrm(env, s, modrm); - gen_sto_env_A0(s, XMM_OFFSET(reg), true); - break; - case 0x3f0: /* lddqu */ - if (mod =3D=3D 3) - goto illegal_op; - gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, XMM_OFFSET(reg), true); - break; - case 0x22b: /* movntss */ - case 0x32b: /* movntsd */ - if (mod =3D=3D 3) - goto illegal_op; - gen_lea_modrm(env, s, modrm); - if (b1 & 1) { - gen_stq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - tcg_gen_ld32u_tl(s->T0, cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(0))); - gen_op_st_v(s, MO_32, s->T0, s->A0); - } - break; - case 0x6e: /* movd mm, ea */ - CHECK_NO_VEX(s); -#ifdef TARGET_X86_64 - if (s->dflag =3D=3D MO_64) { - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); - tcg_gen_st_tl(s->T0, cpu_env, - offsetof(CPUX86State, fpregs[reg].mmx)); - } else -#endif - { - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); - tcg_gen_addi_ptr(s->ptr0, cpu_env, - offsetof(CPUX86State,fpregs[reg].mmx)); - tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); - gen_helper_movl_mm_T0_mmx(s->ptr0, s->tmp2_i32); - } - break; - case 0x16e: /* movd xmm, ea */ -#ifdef TARGET_X86_64 - if (s->dflag =3D=3D MO_64) { - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); - tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(reg)); - gen_helper_movq_mm_T0_xmm(s->ptr0, s->T0); - } else -#endif - { - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); - tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(reg)); - tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); - gen_helper_movl_mm_T0_xmm(s->ptr0, s->tmp2_i32); - } - break; - case 0x6f: /* movq mm, ea */ - CHECK_NO_VEX(s); - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); - } else { - rm =3D (modrm & 7); - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, - offsetof(CPUX86State,fpregs[rm].mmx)); - tcg_gen_st_i64(s->tmp1_i64, cpu_env, - offsetof(CPUX86State,fpregs[reg].mmx)); - } - break; - case 0x010: /* movups */ - case 0x110: /* movupd */ - case 0x028: /* movaps */ - case 0x128: /* movapd */ - case 0x16f: /* movdqa xmm, ea */ - case 0x26f: /* movdqu xmm, ea */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, XMM_OFFSET(reg), - /* movaps, movapd, movdqa */ - b =3D=3D 0x028 || b =3D=3D 0x128 || b =3D= =3D 0x16f); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movo(s, XMM_OFFSET(reg), XMM_OFFSET(rm)); - } - break; - case 0x210: /* movss xmm, ea */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_op_ld_v(s, MO_32, s->T0, s->A0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(= 0))); - tcg_gen_movi_tl(s->T0, 0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(= 1))); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(= 2))); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(= 3))); - } else { - rm =3D (modrm & 7) | REX_B(s); - tcg_gen_ld_i32(s->tmp2_i32, cpu_env, - offsetof(CPUX86State, xmm_regs[rm].ZMM_L(0)= )); - tcg_gen_st_i32(s->tmp2_i32, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(0= ))); - } - break; - case 0x310: /* movsd xmm, ea */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - tcg_gen_movi_tl(s->T0, 0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(= 2))); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L(= 3))); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(0= )), - offsetof(CPUX86State, xmm_regs[rm].ZMM_Q(0))); - } - break; - case 0x012: /* movlps */ - case 0x112: /* movlpd */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - /* movhlps */ - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(0= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_Q(1))); - } - break; - case 0x212: /* movsldup */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, XMM_OFFSET(reg), true); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(0= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_L(0))); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(2= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_L(2))); - } - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(1)), - offsetof(CPUX86State,xmm_regs[reg].ZMM_L(0))); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(3)), - offsetof(CPUX86State,xmm_regs[reg].ZMM_L(2))); - break; - case 0x312: /* movddup */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(0= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_Q(0))); - } - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(1)), - offsetof(CPUX86State,xmm_regs[reg].ZMM_Q(0))); - break; - case 0x016: /* movhps */ - case 0x116: /* movhpd */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(1))); - } else { - /* movlhps */ - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(1= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_Q(0))); - } - break; - case 0x216: /* movshdup */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, XMM_OFFSET(reg), true); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(1= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_L(1))); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(3= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_L(3))); - } - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(0)), - offsetof(CPUX86State,xmm_regs[reg].ZMM_L(1))); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_L(2)), - offsetof(CPUX86State,xmm_regs[reg].ZMM_L(3))); - break; - case 0x178: - case 0x378: - CHECK_NO_VEX(s); - { - int bit_index, field_length; - - if (b1 =3D=3D 1 && reg !=3D 0) - goto illegal_op; - field_length =3D x86_ldub_code(env, s) & 0x3F; - bit_index =3D x86_ldub_code(env, s) & 0x3F; - tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(reg)); - if (b1 =3D=3D 1) - gen_helper_extrq_i(cpu_env, s->ptr0, - tcg_const_i32(bit_index), - tcg_const_i32(field_length)); - else { - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - op2_offset =3D offsetof(CPUX86State, xmm_t0); - gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.ZMM= _D(0))); - } else { - rm =3D (modrm & 7) | REX_B(s); - op2_offset =3D ZMM_OFFSET(rm); - } - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - gen_helper_insertq_i(cpu_env, s->ptr0, s->ptr1, - tcg_const_i32(bit_index), - tcg_const_i32(field_length)); - } - } - break; - case 0x7e: /* movd ea, mm */ - CHECK_NO_VEX(s); -#ifdef TARGET_X86_64 - if (s->dflag =3D=3D MO_64) { - tcg_gen_ld_i64(s->T0, cpu_env, - offsetof(CPUX86State,fpregs[reg].mmx)); - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); - } else -#endif - { - tcg_gen_ld32u_tl(s->T0, cpu_env, - offsetof(CPUX86State,fpregs[reg].mmx.MMX_= L(0))); - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); - } - break; - case 0x17e: /* movd ea, xmm */ -#ifdef TARGET_X86_64 - if (s->dflag =3D=3D MO_64) { - tcg_gen_ld_i64(s->T0, cpu_env, - offsetof(CPUX86State,xmm_regs[reg].ZMM_Q(0)= )); - gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); - } else -#endif - { - tcg_gen_ld32u_tl(s->T0, cpu_env, - offsetof(CPUX86State,xmm_regs[reg].ZMM_L(= 0))); - gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); - } - break; - case 0x27e: /* movq xmm, ea */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(0= )), - offsetof(CPUX86State,xmm_regs[rm].ZMM_Q(0))); - } - gen_op_movq_env_0(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q= (1))); - break; - case 0x7f: /* movq ea, mm */ - CHECK_NO_VEX(s); - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); - } else { - rm =3D (modrm & 7); - gen_op_movq(s, offsetof(CPUX86State, fpregs[rm].mmx), - offsetof(CPUX86State,fpregs[reg].mmx)); - } - break; - case 0x011: /* movups */ - case 0x111: /* movupd */ - case 0x029: /* movaps */ - case 0x129: /* movapd */ - case 0x17f: /* movdqa ea, xmm */ - case 0x27f: /* movdqu ea, xmm */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_sto_env_A0(s, XMM_OFFSET(reg), - /* movaps, movapd, movdqa */ - b =3D=3D 0x029 || b =3D=3D 0x129 || b =3D= =3D 0x17f); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movo(s, XMM_OFFSET(rm), XMM_OFFSET(reg)); - } - break; - case 0x211: /* movss ea, xmm */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - tcg_gen_ld32u_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_regs[reg].ZMM_L= (0))); - gen_op_st_v(s, MO_32, s->T0, s->A0); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movl(s, offsetof(CPUX86State, xmm_regs[rm].ZMM_L(0)= ), - offsetof(CPUX86State,xmm_regs[reg].ZMM_L(0))); - } - break; - case 0x311: /* movsd ea, xmm */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_stq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[rm].ZMM_Q(0)= ), - offsetof(CPUX86State,xmm_regs[reg].ZMM_Q(0))); - } - break; - case 0x013: /* movlps */ - case 0x113: /* movlpd */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_stq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - goto illegal_op; - } - break; - case 0x017: /* movhps */ - case 0x117: /* movhpd */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_stq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(1))); - } else { - goto illegal_op; - } - break; - case 0x71: /* shift mm, im */ - case 0x72: - case 0x73: - case 0x171: /* shift xmm, im */ - case 0x172: - case 0x173: - val =3D x86_ldub_code(env, s); - if (is_xmm) { - tcg_gen_movi_tl(s->T0, val); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_t0.ZMM_L(0))); - tcg_gen_movi_tl(s->T0, 0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_t0.ZMM_L(1))); - op1_offset =3D offsetof(CPUX86State,xmm_t0); - } else { - CHECK_NO_VEX(s); - tcg_gen_movi_tl(s->T0, val); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, mmx_t0.MMX_L(0))); - tcg_gen_movi_tl(s->T0, 0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, mmx_t0.MMX_L(1))); - op1_offset =3D offsetof(CPUX86State,mmx_t0); - } - assert(b1 < 2); - SSEFunc_0_eppp fn =3D sse_op_table2[((b - 1) & 3) * 8 + - (((modrm >> 3)) & 7)][b1]; - if (!fn) { - goto unknown_op; - } - if (is_xmm) { - rm =3D (modrm & 7) | REX_B(s); - op2_offset =3D ZMM_OFFSET(rm); - } else { - rm =3D (modrm & 7); - op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); - } - tcg_gen_addi_ptr(s->ptr0, cpu_env, op2_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); - fn(cpu_env, s->ptr0, s->ptr1, s->ptr2); - break; - case 0x050: /* movmskps */ - rm =3D (modrm & 7) | REX_B(s); - tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(rm)); - gen_helper_movmskps_xmm(s->tmp2_i32, cpu_env, s->ptr0); - tcg_gen_extu_i32_tl(cpu_regs[reg], s->tmp2_i32); - break; - case 0x150: /* movmskpd */ - rm =3D (modrm & 7) | REX_B(s); - tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(rm)); - gen_helper_movmskpd_xmm(s->tmp2_i32, cpu_env, s->ptr0); - tcg_gen_extu_i32_tl(cpu_regs[reg], s->tmp2_i32); - break; - case 0x02a: /* cvtpi2ps */ - case 0x12a: /* cvtpi2pd */ - CHECK_NO_VEX(s); - gen_helper_enter_mmx(cpu_env); - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - op2_offset =3D offsetof(CPUX86State,mmx_t0); - gen_ldq_env_A0(s, op2_offset); - } else { - rm =3D (modrm & 7); - op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); - } - op1_offset =3D ZMM_OFFSET(reg); - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - switch(b >> 8) { - case 0x0: - gen_helper_cvtpi2ps(cpu_env, s->ptr0, s->ptr1); - break; - default: - case 0x1: - gen_helper_cvtpi2pd(cpu_env, s->ptr0, s->ptr1); - break; - } - break; - case 0x22a: /* cvtsi2ss */ - case 0x32a: /* cvtsi2sd */ - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - op1_offset =3D ZMM_OFFSET(reg); - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - if (ot =3D=3D MO_32) { - SSEFunc_0_epi sse_fn_epi =3D sse_op_table3ai[(b >> 8) & 1]; - tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); - sse_fn_epi(cpu_env, s->ptr0, s->tmp2_i32); - } else { -#ifdef TARGET_X86_64 - SSEFunc_0_epl sse_fn_epl =3D sse_op_table3aq[(b >> 8) & 1]; - sse_fn_epl(cpu_env, s->ptr0, s->T0); -#else - goto illegal_op; -#endif - } - break; - case 0x02c: /* cvttps2pi */ - case 0x12c: /* cvttpd2pi */ - case 0x02d: /* cvtps2pi */ - case 0x12d: /* cvtpd2pi */ - CHECK_NO_VEX(s); - gen_helper_enter_mmx(cpu_env); - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - op2_offset =3D offsetof(CPUX86State, xmm_t0.ZMM_X(0)); - /* FIXME: should be 64-bit access if b1 =3D=3D 0. */ - gen_ldo_env_A0(s, op2_offset, !!b1); - } else { - rm =3D (modrm & 7) | REX_B(s); - op2_offset =3D ZMM_OFFSET(rm); - } - op1_offset =3D offsetof(CPUX86State,fpregs[reg & 7].mmx); - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - switch(b) { - case 0x02c: - gen_helper_cvttps2pi(cpu_env, s->ptr0, s->ptr1); - break; - case 0x12c: - gen_helper_cvttpd2pi(cpu_env, s->ptr0, s->ptr1); - break; - case 0x02d: - gen_helper_cvtps2pi(cpu_env, s->ptr0, s->ptr1); - break; - case 0x12d: - gen_helper_cvtpd2pi(cpu_env, s->ptr0, s->ptr1); - break; - } - break; - case 0x22c: /* cvttss2si */ - case 0x32c: /* cvttsd2si */ - case 0x22d: /* cvtss2si */ - case 0x32d: /* cvtsd2si */ - ot =3D mo_64_32(s->dflag); - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - if ((b >> 8) & 1) { - gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.ZMM_Q(0= ))); - } else { - gen_op_ld_v(s, MO_32, s->T0, s->A0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_t0.ZMM_L(0))= ); - } - op2_offset =3D offsetof(CPUX86State,xmm_t0); - } else { - rm =3D (modrm & 7) | REX_B(s); - op2_offset =3D ZMM_OFFSET(rm); - } - tcg_gen_addi_ptr(s->ptr0, cpu_env, op2_offset); - if (ot =3D=3D MO_32) { - SSEFunc_i_ep sse_fn_i_ep =3D - sse_op_table3bi[((b >> 7) & 2) | (b & 1)]; - sse_fn_i_ep(s->tmp2_i32, cpu_env, s->ptr0); - tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); - } else { -#ifdef TARGET_X86_64 - SSEFunc_l_ep sse_fn_l_ep =3D - sse_op_table3bq[((b >> 7) & 2) | (b & 1)]; - sse_fn_l_ep(s->T0, cpu_env, s->ptr0); -#else - goto illegal_op; -#endif - } - gen_op_mov_reg_v(s, ot, reg, s->T0); - break; - case 0xc4: /* pinsrw */ - case 0x1c4: - s->rip_offset =3D 1; - gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); - val =3D x86_ldub_code(env, s); - if (b1) { - val &=3D 7; - tcg_gen_st16_tl(s->T0, cpu_env, - offsetof(CPUX86State,xmm_regs[reg].ZMM_W(v= al))); - } else { - CHECK_NO_VEX(s); - val &=3D 3; - tcg_gen_st16_tl(s->T0, cpu_env, - offsetof(CPUX86State,fpregs[reg].mmx.MMX_W= (val))); - } - break; - case 0xc5: /* pextrw */ - case 0x1c5: - if (mod !=3D 3) - goto illegal_op; - ot =3D mo_64_32(s->dflag); - val =3D x86_ldub_code(env, s); - if (b1) { - val &=3D 7; - rm =3D (modrm & 7) | REX_B(s); - tcg_gen_ld16u_tl(s->T0, cpu_env, - offsetof(CPUX86State,xmm_regs[rm].ZMM_W(v= al))); - } else { - val &=3D 3; - rm =3D (modrm & 7); - tcg_gen_ld16u_tl(s->T0, cpu_env, - offsetof(CPUX86State,fpregs[rm].mmx.MMX_W(= val))); - } - reg =3D ((modrm >> 3) & 7) | REX_R(s); - gen_op_mov_reg_v(s, ot, reg, s->T0); - break; - case 0x1d6: /* movq ea, xmm */ - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - gen_stq_env_A0(s, offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(0))); - } else { - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[rm].ZMM_Q(0)= ), - offsetof(CPUX86State,xmm_regs[reg].ZMM_Q(0))); - gen_op_movq_env_0(s, - offsetof(CPUX86State, xmm_regs[rm].ZMM_Q= (1))); - } - break; - case 0x2d6: /* movq2dq */ - CHECK_NO_VEX(s); - gen_helper_enter_mmx(cpu_env); - rm =3D (modrm & 7); - gen_op_movq(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q(0)), - offsetof(CPUX86State,fpregs[rm].mmx)); - gen_op_movq_env_0(s, offsetof(CPUX86State, xmm_regs[reg].ZMM_Q= (1))); - break; - case 0x3d6: /* movdq2q */ - CHECK_NO_VEX(s); - gen_helper_enter_mmx(cpu_env); - rm =3D (modrm & 7) | REX_B(s); - gen_op_movq(s, offsetof(CPUX86State, fpregs[reg & 7].mmx), - offsetof(CPUX86State,xmm_regs[rm].ZMM_Q(0))); - break; - case 0xd7: /* pmovmskb */ - case 0x1d7: - if (mod !=3D 3) - goto illegal_op; - if (b1) { - rm =3D (modrm & 7) | REX_B(s); - tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(rm)); - gen_helper_pmovmskb_xmm(s->tmp2_i32, cpu_env, s->ptr0); - } else { - CHECK_NO_VEX(s); - rm =3D (modrm & 7); - tcg_gen_addi_ptr(s->ptr0, cpu_env, - offsetof(CPUX86State, fpregs[rm].mmx)); - gen_helper_pmovmskb_mmx(s->tmp2_i32, cpu_env, s->ptr0); - } - reg =3D ((modrm >> 3) & 7) | REX_R(s); - tcg_gen_extu_i32_tl(cpu_regs[reg], s->tmp2_i32); - break; - - case 0x138: - case 0x038: - b =3D modrm; - if ((b & 0xf0) =3D=3D 0xf0) { - goto do_0f_38_fx; - } - modrm =3D x86_ldub_code(env, s); - rm =3D modrm & 7; - reg =3D ((modrm >> 3) & 7) | REX_R(s); - mod =3D (modrm >> 6) & 3; - - assert(b1 < 2); - op6 =3D &sse_op_table6[b]; - if (op6->ext_mask =3D=3D 0) { - goto unknown_op; - } - if (!(s->cpuid_ext_features & op6->ext_mask)) { - goto illegal_op; - } - - if (b1) { - op1_offset =3D ZMM_OFFSET(reg); - if (mod =3D=3D 3) { - op2_offset =3D ZMM_OFFSET(rm | REX_B(s)); - } else { - op2_offset =3D offsetof(CPUX86State,xmm_t0); - gen_lea_modrm(env, s, modrm); - switch (b) { - case 0x20: case 0x30: /* pmovsxbw, pmovzxbw */ - case 0x23: case 0x33: /* pmovsxwd, pmovzxwd */ - case 0x25: case 0x35: /* pmovsxdq, pmovzxdq */ - gen_ldq_env_A0(s, op2_offset + - offsetof(ZMMReg, ZMM_Q(0))); - break; - case 0x21: case 0x31: /* pmovsxbd, pmovzxbd */ - case 0x24: case 0x34: /* pmovsxwq, pmovzxwq */ - tcg_gen_qemu_ld_i32(s->tmp2_i32, s->A0, - s->mem_index, MO_LEUL); - tcg_gen_st_i32(s->tmp2_i32, cpu_env, op2_offset + - offsetof(ZMMReg, ZMM_L(0))); - break; - case 0x22: case 0x32: /* pmovsxbq, pmovzxbq */ - tcg_gen_qemu_ld_tl(s->tmp0, s->A0, - s->mem_index, MO_LEUW); - tcg_gen_st16_tl(s->tmp0, cpu_env, op2_offset + - offsetof(ZMMReg, ZMM_W(0))); - break; - case 0x2a: /* movntdqa */ - gen_ldo_env_A0(s, op1_offset + offsetof(ZMMReg, ZM= M_X(0)), true); - return; - default: - gen_ldo_env_A0(s, op2_offset + offsetof(ZMMReg, ZM= M_X(0)), true); - } - } - if (!op6->fn[b1].op1) { - goto illegal_op; - } - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - if (op6->flags & SSE_OPF_V0) { - op6->fn[b1].op1(cpu_env, s->ptr0, s->ptr1); - } else { - tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); - if (op6->flags & SSE_OPF_BLENDV) { - TCGv_ptr mask =3D tcg_temp_new_ptr(); - tcg_gen_addi_ptr(mask, cpu_env, ZMM_OFFSET(0)); - op6->fn[b1].op3(cpu_env, s->ptr0, s->ptr2, s->ptr1, - mask); - tcg_temp_free_ptr(mask); - } else { - SSEFunc_0_eppp fn =3D op6->fn[b1].op2; - fn(cpu_env, s->ptr0, s->ptr2, s->ptr1); - } - } - } else { - CHECK_NO_VEX(s); - if ((op6->flags & SSE_OPF_MMX) =3D=3D 0) { - goto unknown_op; - } - op1_offset =3D offsetof(CPUX86State,fpregs[reg].mmx); - if (mod =3D=3D 3) { - op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); - } else { - op2_offset =3D offsetof(CPUX86State,mmx_t0); - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, op2_offset); - } - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - if (op6->flags & SSE_OPF_V0) { - op6->fn[0].op1(cpu_env, s->ptr0, s->ptr1); - } else { - op6->fn[0].op2(cpu_env, s->ptr0, s->ptr0, s->ptr1); - } - } - - if (op6->flags & SSE_OPF_CMP) { - set_cc_op(s, CC_OP_EFLAGS); - } - break; - - case 0x238: - case 0x338: - do_0f_38_fx: - /* Various integer extensions at 0f 38 f[0-f]. */ - b =3D modrm | (b1 << 8); - modrm =3D x86_ldub_code(env, s); - reg =3D ((modrm >> 3) & 7) | REX_R(s); - - switch (b) { - case 0x3f0: /* crc32 Gd,Eb */ - case 0x3f1: /* crc32 Gd,Ey */ - do_crc32: - CHECK_NO_VEX(s); - if (!(s->cpuid_ext_features & CPUID_EXT_SSE42)) { - goto illegal_op; - } - if ((b & 0xff) =3D=3D 0xf0) { - ot =3D MO_8; - } else if (s->dflag !=3D MO_64) { - ot =3D (s->prefix & PREFIX_DATA ? MO_16 : MO_32); - } else { - ot =3D MO_64; - } - - tcg_gen_trunc_tl_i32(s->tmp2_i32, cpu_regs[reg]); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - gen_helper_crc32(s->T0, s->tmp2_i32, - s->T0, tcg_const_i32(8 << ot)); - - ot =3D mo_64_32(s->dflag); - gen_op_mov_reg_v(s, ot, reg, s->T0); - break; - - case 0x1f0: /* crc32 or movbe */ - case 0x1f1: - CHECK_NO_VEX(s); - /* For these insns, the f3 prefix is supposed to have prio= rity - over the 66 prefix, but that's not what we implement ab= ove - setting b1. */ - if (s->prefix & PREFIX_REPNZ) { - goto do_crc32; - } - /* FALLTHRU */ - case 0x0f0: /* movbe Gy,My */ - case 0x0f1: /* movbe My,Gy */ - CHECK_NO_VEX(s); - if (!(s->cpuid_ext_features & CPUID_EXT_MOVBE)) { - goto illegal_op; - } - if (s->dflag !=3D MO_64) { - ot =3D (s->prefix & PREFIX_DATA ? MO_16 : MO_32); - } else { - ot =3D MO_64; - } - - gen_lea_modrm(env, s, modrm); - if ((b & 1) =3D=3D 0) { - tcg_gen_qemu_ld_tl(s->T0, s->A0, - s->mem_index, ot | MO_BE); - gen_op_mov_reg_v(s, ot, reg, s->T0); - } else { - tcg_gen_qemu_st_tl(cpu_regs[reg], s->A0, - s->mem_index, ot | MO_BE); - } - break; - case 0x1f6: /* adcx Gy, Ey */ - case 0x2f6: /* adox Gy, Ey */ - CHECK_NO_VEX(s); - if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_ADX)) { - goto illegal_op; - } else { - TCGv carry_in, carry_out, zero; - int end_op; - - ot =3D mo_64_32(s->dflag); - gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); - - /* Re-use the carry-out from a previous round. */ - carry_in =3D NULL; - carry_out =3D (b =3D=3D 0x1f6 ? cpu_cc_dst : cpu_cc_sr= c2); - switch (s->cc_op) { - case CC_OP_ADCX: - if (b =3D=3D 0x1f6) { - carry_in =3D cpu_cc_dst; - end_op =3D CC_OP_ADCX; - } else { - end_op =3D CC_OP_ADCOX; - } - break; - case CC_OP_ADOX: - if (b =3D=3D 0x1f6) { - end_op =3D CC_OP_ADCOX; - } else { - carry_in =3D cpu_cc_src2; - end_op =3D CC_OP_ADOX; - } - break; - case CC_OP_ADCOX: - end_op =3D CC_OP_ADCOX; - carry_in =3D carry_out; - break; - default: - end_op =3D (b =3D=3D 0x1f6 ? CC_OP_ADCX : CC_OP_AD= OX); - break; - } - /* If we can't reuse carry-out, get it out of EFLAGS. = */ - if (!carry_in) { - if (s->cc_op !=3D CC_OP_ADCX && s->cc_op !=3D CC_O= P_ADOX) { - gen_compute_eflags(s); - } - carry_in =3D s->tmp0; - tcg_gen_extract_tl(carry_in, cpu_cc_src, - ctz32(b =3D=3D 0x1f6 ? CC_C : C= C_O), 1); - } - - switch (ot) { -#ifdef TARGET_X86_64 - case MO_32: - /* If we know TL is 64-bit, and we want a 32-bit - result, just do everything in 64-bit arithmetic= . */ - tcg_gen_ext32u_i64(cpu_regs[reg], cpu_regs[reg]); - tcg_gen_ext32u_i64(s->T0, s->T0); - tcg_gen_add_i64(s->T0, s->T0, cpu_regs[reg]); - tcg_gen_add_i64(s->T0, s->T0, carry_in); - tcg_gen_ext32u_i64(cpu_regs[reg], s->T0); - tcg_gen_shri_i64(carry_out, s->T0, 32); - break; -#endif - default: - /* Otherwise compute the carry-out in two steps. = */ - zero =3D tcg_const_tl(0); - tcg_gen_add2_tl(s->T0, carry_out, - s->T0, zero, - carry_in, zero); - tcg_gen_add2_tl(cpu_regs[reg], carry_out, - cpu_regs[reg], carry_out, - s->T0, zero); - tcg_temp_free(zero); - break; - } - set_cc_op(s, end_op); - } - break; - - } - break; - - case 0x03a: - case 0x13a: - b =3D modrm; - modrm =3D x86_ldub_code(env, s); - rm =3D modrm & 7; - reg =3D ((modrm >> 3) & 7) | REX_R(s); - mod =3D (modrm >> 6) & 3; - - assert(b1 < 2); - op7 =3D &sse_op_table7[b]; - if (op7->ext_mask =3D=3D 0) { - goto unknown_op; - } - if (!(s->cpuid_ext_features & op7->ext_mask)) { - goto illegal_op; - } - - s->rip_offset =3D 1; - - if (op7->flags & SSE_OPF_SPECIAL) { - /* None of the "special" ops are valid on mmx registers */ - if (b1 =3D=3D 0) { - goto illegal_op; - } - ot =3D mo_64_32(s->dflag); - rm =3D (modrm & 7) | REX_B(s); - if (mod !=3D 3) - gen_lea_modrm(env, s, modrm); - reg =3D ((modrm >> 3) & 7) | REX_R(s); - val =3D x86_ldub_code(env, s); - switch (b) { - case 0x14: /* pextrb */ - tcg_gen_ld8u_tl(s->T0, cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_B(val & 15))= ); - if (mod =3D=3D 3) { - gen_op_mov_reg_v(s, ot, rm, s->T0); - } else { - tcg_gen_qemu_st_tl(s->T0, s->A0, - s->mem_index, MO_UB); - } - break; - case 0x15: /* pextrw */ - tcg_gen_ld16u_tl(s->T0, cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_W(val & 7))); - if (mod =3D=3D 3) { - gen_op_mov_reg_v(s, ot, rm, s->T0); - } else { - tcg_gen_qemu_st_tl(s->T0, s->A0, - s->mem_index, MO_LEUW); - } - break; - case 0x16: - if (ot =3D=3D MO_32) { /* pextrd */ - tcg_gen_ld_i32(s->tmp2_i32, cpu_env, - offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(val & = 3))); - if (mod =3D=3D 3) { - tcg_gen_extu_i32_tl(cpu_regs[rm], s->tmp2_i32); - } else { - tcg_gen_qemu_st_i32(s->tmp2_i32, s->A0, - s->mem_index, MO_LEUL); - } - } else { /* pextrq */ -#ifdef TARGET_X86_64 - tcg_gen_ld_i64(s->tmp1_i64, cpu_env, - offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(val & = 1))); - if (mod =3D=3D 3) { - tcg_gen_mov_i64(cpu_regs[rm], s->tmp1_i64); - } else { - tcg_gen_qemu_st_i64(s->tmp1_i64, s->A0, - s->mem_index, MO_LEUQ); - } -#else - goto illegal_op; -#endif - } - break; - case 0x17: /* extractps */ - tcg_gen_ld32u_tl(s->T0, cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(val & 3))); - if (mod =3D=3D 3) { - gen_op_mov_reg_v(s, ot, rm, s->T0); - } else { - tcg_gen_qemu_st_tl(s->T0, s->A0, - s->mem_index, MO_LEUL); - } - break; - case 0x20: /* pinsrb */ - if (mod =3D=3D 3) { - gen_op_mov_v_reg(s, MO_32, s->T0, rm); - } else { - tcg_gen_qemu_ld_tl(s->T0, s->A0, - s->mem_index, MO_UB); - } - tcg_gen_st8_tl(s->T0, cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_B(val & 15))= ); - break; - case 0x21: /* insertps */ - if (mod =3D=3D 3) { - tcg_gen_ld_i32(s->tmp2_i32, cpu_env, - offsetof(CPUX86State,xmm_regs[rm] - .ZMM_L((val >> 6) & 3))); - } else { - tcg_gen_qemu_ld_i32(s->tmp2_i32, s->A0, - s->mem_index, MO_LEUL); - } - tcg_gen_st_i32(s->tmp2_i32, cpu_env, - offsetof(CPUX86State,xmm_regs[reg] - .ZMM_L((val >> 4) & 3))); - if ((val >> 0) & 1) - tcg_gen_st_i32(tcg_const_i32(0 /*float32_zero*/), - cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(0))); - if ((val >> 1) & 1) - tcg_gen_st_i32(tcg_const_i32(0 /*float32_zero*/), - cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(1))); - if ((val >> 2) & 1) - tcg_gen_st_i32(tcg_const_i32(0 /*float32_zero*/), - cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(2))); - if ((val >> 3) & 1) - tcg_gen_st_i32(tcg_const_i32(0 /*float32_zero*/), - cpu_env, offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(3))); - break; - case 0x22: - if (ot =3D=3D MO_32) { /* pinsrd */ - if (mod =3D=3D 3) { - tcg_gen_trunc_tl_i32(s->tmp2_i32, cpu_regs[rm]= ); - } else { - tcg_gen_qemu_ld_i32(s->tmp2_i32, s->A0, - s->mem_index, MO_LEUL); - } - tcg_gen_st_i32(s->tmp2_i32, cpu_env, - offsetof(CPUX86State, - xmm_regs[reg].ZMM_L(val & = 3))); - } else { /* pinsrq */ -#ifdef TARGET_X86_64 - if (mod =3D=3D 3) { - gen_op_mov_v_reg(s, ot, s->tmp1_i64, rm); - } else { - tcg_gen_qemu_ld_i64(s->tmp1_i64, s->A0, - s->mem_index, MO_LEUQ); - } - tcg_gen_st_i64(s->tmp1_i64, cpu_env, - offsetof(CPUX86State, - xmm_regs[reg].ZMM_Q(val & = 1))); -#else - goto illegal_op; -#endif - } - break; - } - return; - } - - if (b1 =3D=3D 0) { - CHECK_NO_VEX(s); - /* MMX */ - if ((op7->flags & SSE_OPF_MMX) =3D=3D 0) { - goto illegal_op; - } - op1_offset =3D offsetof(CPUX86State,fpregs[reg].mmx); - if (mod =3D=3D 3) { - op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); - } else { - op2_offset =3D offsetof(CPUX86State,mmx_t0); - gen_lea_modrm(env, s, modrm); - gen_ldq_env_A0(s, op2_offset); - } - val =3D x86_ldub_code(env, s); - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - - /* We only actually have one MMX instuction (palignr) */ - assert(b =3D=3D 0x0f); - - op7->fn[0].op2(cpu_env, s->ptr0, s->ptr0, s->ptr1, - tcg_const_i32(val)); - break; - } - - /* SSE */ - op1_offset =3D ZMM_OFFSET(reg); - if (mod =3D=3D 3) { - op2_offset =3D ZMM_OFFSET(rm | REX_B(s)); - } else { - op2_offset =3D offsetof(CPUX86State, xmm_t0); - gen_lea_modrm(env, s, modrm); - gen_ldo_env_A0(s, op2_offset + offsetof(ZMMReg, ZMM_X(0)),= true); - } - - val =3D x86_ldub_code(env, s); - if ((b & 0xfc) =3D=3D 0x60) { /* pcmpXstrX */ - set_cc_op(s, CC_OP_EFLAGS); - - if (s->dflag =3D=3D MO_64) { - /* The helper must use entire 64-bit gp registers */ - val |=3D 1 << 8; - } - } - - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - if (op7->flags & SSE_OPF_V0) { - op7->fn[b1].op1(cpu_env, s->ptr0, s->ptr1, tcg_const_i32(v= al)); - } else { - tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); - op7->fn[b1].op2(cpu_env, s->ptr0, s->ptr2, s->ptr1, - tcg_const_i32(val)); - } - if (op7->flags & SSE_OPF_CMP) { - set_cc_op(s, CC_OP_EFLAGS); - } - break; - - default: - unknown_op: - gen_unknown_opcode(env, s); - return; - } - } else { - /* generic MMX or SSE operation */ - switch(b) { - case 0x70: /* pshufx insn */ - case 0xc6: /* pshufx insn */ - case 0xc2: /* compare insns */ - s->rip_offset =3D 1; - break; - default: - break; - } - if (is_xmm) { - op1_offset =3D ZMM_OFFSET(reg); - if (mod !=3D 3) { - int sz =3D 4; - - gen_lea_modrm(env, s, modrm); - op2_offset =3D offsetof(CPUX86State, xmm_t0); - - if (sse_op_flags & SSE_OPF_SCALAR) { - if (sse_op_flags & SSE_OPF_CMP) { - /* ucomis[sd], comis[sd] */ - if (b1 =3D=3D 0) { - sz =3D 2; - } else { - sz =3D 3; - } - } else { - /* Most sse scalar operations. */ - if (b1 =3D=3D 2) { - sz =3D 2; - } else if (b1 =3D=3D 3) { - sz =3D 3; - } - } - } - - switch (sz) { - case 2: - /* 32 bit access */ - gen_op_ld_v(s, MO_32, s->T0, s->A0); - tcg_gen_st32_tl(s->T0, cpu_env, - offsetof(CPUX86State, xmm_t0.ZMM_L(0))= ); - break; - case 3: - /* 64 bit access */ - gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.ZMM_D(0= ))); - break; - default: - /* 128 bit access */ - gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_t0.ZMM_X(0= )), true); - break; - } - } else { - rm =3D (modrm & 7) | REX_B(s); - op2_offset =3D ZMM_OFFSET(rm); - } - } else { - CHECK_NO_VEX(s); - op1_offset =3D offsetof(CPUX86State,fpregs[reg].mmx); - if (mod !=3D 3) { - gen_lea_modrm(env, s, modrm); - op2_offset =3D offsetof(CPUX86State,mmx_t0); - gen_ldq_env_A0(s, op2_offset); - } else { - rm =3D (modrm & 7); - op2_offset =3D offsetof(CPUX86State,fpregs[rm].mmx); - } - } - - - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - if ((sse_op_flags & SSE_OPF_V0) && - !((sse_op_flags & SSE_OPF_SCALAR) && b1 >=3D 2)) { - if (sse_op_flags & SSE_OPF_SHUF) { - val =3D x86_ldub_code(env, s); - sse_op_fn.op1i(s->ptr0, s->ptr1, tcg_const_i32(val)); - } else if (b =3D=3D 0xf7) { - /* maskmov : we must prepare A0 */ - if (mod !=3D 3) { - goto illegal_op; - } - tcg_gen_mov_tl(s->A0, cpu_regs[R_EDI]); - gen_extu(s->aflag, s->A0); - gen_add_A0_ds_seg(s); - - tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset); - tcg_gen_addi_ptr(s->ptr1, cpu_env, op2_offset); - sse_op_fn.op1t(cpu_env, s->ptr0, s->ptr1, s->A0); - /* Does not write to the fist operand */ - return; - } else { - sse_op_fn.op1(cpu_env, s->ptr0, s->ptr1); - } - } else { - tcg_gen_addi_ptr(s->ptr2, cpu_env, op1_offset); - if (sse_op_flags & SSE_OPF_SHUF) { - val =3D x86_ldub_code(env, s); - sse_op_fn.op2i(s->ptr0, s->ptr2, s->ptr1, - tcg_const_i32(val)); - } else { - SSEFunc_0_eppp fn =3D sse_op_fn.op2; - if (b =3D=3D 0xc2) { - /* compare insns */ - val =3D x86_ldub_code(env, s) & 7; - fn =3D sse_op_table4[val][b1]; - } - fn(cpu_env, s->ptr0, s->ptr2, s->ptr1); - } - } - - if (sse_op_flags & SSE_OPF_CMP) { - set_cc_op(s, CC_OP_EFLAGS); - } - } -} - /* convert one instruction. s->base.is_jmp is set if the translation must be stopped. Return the next pc value */ static bool disas_insn(DisasContext *s, CPUState *cpu) @@ -4694,40 +3005,15 @@ static bool disas_insn(DisasContext *s, CPUState *c= pu) =20 prefixes =3D 0; =20 - if (first) first =3D false, limit =3D getenv("LIMIT") ? atol(getenv("L= IMIT")) : -1; - bool use_new =3D true; -#ifdef CONFIG_USER_ONLY - use_new &=3D limit > 0; -#endif next_byte: s->prefix =3D prefixes; b =3D x86_ldub_code(env, s); /* Collect prefixes. */ switch (b) { default: -#ifndef CONFIG_USER_ONLY - use_new &=3D b <=3D limit; -#endif - if (use_new && 0) { - disas_insn_new(s, cpu, b); - return s->pc; - } break; case 0x0f: b =3D x86_ldub_code(env, s) + 0x100; -#ifndef CONFIG_USER_ONLY - use_new &=3D b <=3D limit; -#endif - if (use_new && - (b =3D=3D 0x138 || b =3D=3D 0x13a || - (b >=3D 0x10e && b <=3D 0x117) || - (b >=3D 0x128 && b <=3D 0x12f) || - (b >=3D 0x150 && b <=3D 0x17f) || - b =3D=3D 0x1c2 || (b >=3D 0x1c4 && b <=3D 0x1c6) || - (b >=3D 0x1d0 && b <=3D 0x1ff))) { - disas_insn_new(s, cpu, b + 0x100); - return s->pc; - } break; case 0xf3: prefixes |=3D PREFIX_REPZ; @@ -8449,7 +6735,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) =20 set_cc_op(s, CC_OP_POPCNT); break; - case 0x110 ... 0x117: + case 0x10e ... 0x117: case 0x128 ... 0x12f: case 0x138 ... 0x13a: case 0x150 ... 0x179: @@ -8457,7 +6743,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) case 0x1c2: case 0x1c4 ... 0x1c6: case 0x1d0 ... 0x1fe: - gen_sse(env, s, b); + disas_insn_new(s, cpu, b); break; default: goto unknown_op; @@ -8623,9 +6909,6 @@ static void i386_tr_init_disas_context(DisasContextBa= se *dcbase, CPUState *cpu) dc->tmp2_i32 =3D tcg_temp_new_i32(); dc->tmp3_i32 =3D tcg_temp_new_i32(); dc->tmp4 =3D tcg_temp_new(); - dc->ptr0 =3D tcg_temp_new_ptr(); - dc->ptr1 =3D tcg_temp_new_ptr(); - dc->ptr2 =3D tcg_temp_new_ptr(); dc->cc_srcT =3D tcg_temp_local_new(); } =20 --=20 2.37.3