From nobody Mon Feb 9 11:07:01 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=1662937666; cv=none; d=zohomail.com; s=zohoarc; b=Garv/oegXFKGjK+cDt7gSfC87sFzITDEBQvDL/FD5oc/dJTUWGfzG9qczjBX2/UzGhA+k/MVYjKOdYvoZ37P5egnUj6+VyVGeaFoZsDsxKgumZjWLS+2ZUG7VvqqFCOtyUO/hq7xnKUvHmC6JRlUIRPWCNRWjl7YD/Pi2bQ0FDw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1662937666; 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=QDX1UMHUn3xQ6hIBz5bc12HygCihV0paTI0fj1irANs=; b=N/4knMa+plA5FjnIdEwWmRvjYkGmPKzBd6FRf8ru6uYKPMyotWECQYjNN8XL17wtViokYHYaN+Ygq0gWw0fS2ds1QmXAeS9ewSX12nYogJAyYTvYTVKReKZukorb3Ca5+i47CMAKc2kH2L2tw/I8AsQ14AoHTnPujMwsW5kLQEs= 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 1662937666571325.3763335206552; Sun, 11 Sep 2022 16:07:46 -0700 (PDT) Received: from localhost ([::1]:54710 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oXW3E-00040p-Og for importer@patchew.org; Sun, 11 Sep 2022 19:07:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:36498) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwB-0004m4-TP for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:27 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:36822) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwA-0006Nr-BG for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:27 -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-669-laSDWz1tMxeGVyY_D52wkA-1; Sun, 11 Sep 2022 19:00:23 -0400 Received: by mail-ed1-f71.google.com with SMTP id r11-20020a05640251cb00b004516feb8c09so2147737edd.10 for ; Sun, 11 Sep 2022 16:00:23 -0700 (PDT) Received: from goa-sendmail (93-44-39-154.ip95.fastwebnet.it. [93.44.39.154]) by smtp.gmail.com with ESMTPSA id 23-20020a170906311700b0077958ddaec6sm3442659ejx.186.2022.09.11.16.00.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Sep 2022 16:00:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1662937225; 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=QDX1UMHUn3xQ6hIBz5bc12HygCihV0paTI0fj1irANs=; b=MYtOW5/nSDglpLUCS92bP8smV/KYoiTMJPhXgDj1Vp8L49w2HEn0MQ7i6FtxQtDSK3R+Kn k0B8ojTaTZ+lEWY8/2f8MQju2OwR0dIsyW8wvmv0fw+3z41vFVxqzwnipLF619Cgr5/p4r x/uLil5XVSVHxAVmBj1bK93QrHrCeLg= X-MC-Unique: laSDWz1tMxeGVyY_D52wkA-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; bh=QDX1UMHUn3xQ6hIBz5bc12HygCihV0paTI0fj1irANs=; b=Vgxz7Oph03Tr/CPUnhmSPO0bJtXKJDj+f0XpV+79S07hUMouRRYpkRBwcAR7c6X0QG M5eqkqQAz3QVyq7W2WsJISwB3M2i+ARqZR3XxCKD2DJaaRctdC5HNj1ChdH6NBIVWjzB XMcnVKzg16ovAucR/e68wWlFeo/Omk03Mwc8q7QotAysUIKU9POo/+bK29UUyCLOY6VE LcDfVP9tOkJr4uso7/JqIAFVgozQwFcJxTmoI6M/fcWU3tvd6wxO3cYTkn6Z+EPLhWRW N6M9SKZQRhBm+A2LnCbvwWJNhT7q7Bii0A8I9dF6fe/cjVMNGorIUjZ//vBf+StX8OrY uOyw== X-Gm-Message-State: ACgBeo0HHBfIkN4FgwzWY2XFyCbF2/QxXpAJ43k/I5C4qna11MMKjJ7Q MGjFH6s52ty7gocIgcI95MR2nEPh3tYD/1RR3CXz7c92ZDdjUSmv20mRAU7pYUqyXiKGhzjzl/N o31hrbTJQItPZopesA6QSqgoxncbHD/BagUqz/I/iv+lZrVg4iTmJLoXaxDk2kxSg/5o= X-Received: by 2002:a17:907:2e0d:b0:77e:8a08:96d0 with SMTP id ig13-20020a1709072e0d00b0077e8a0896d0mr360665ejc.378.1662937222543; Sun, 11 Sep 2022 16:00:22 -0700 (PDT) X-Google-Smtp-Source: AA6agR6R0qZWDCxgZCWvijxMaVHX9mq2Eubr/btUWTIzmzdCkNhFMss93bog8XT5A/90/JYilSjWhg== X-Received: by 2002:a17:907:2e0d:b0:77e:8a08:96d0 with SMTP id ig13-20020a1709072e0d00b0077e8a0896d0mr360648ejc.378.1662937222208; Sun, 11 Sep 2022 16:00:22 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 1/4] tests/tcg: i386: fix typos in 3DNow! instructions Date: Mon, 12 Sep 2022 01:00:11 +0200 Message-Id: <20220911230014.340601-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220911230014.340601-1-pbonzini@redhat.com> References: <20220911230014.340601-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: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, WEIRD_QUOTING=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: 1662937667347100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- tests/tcg/i386/x86.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/tcg/i386/x86.csv b/tests/tcg/i386/x86.csv index d5d0c17f1b..c43bf42dd3 100644 --- a/tests/tcg/i386/x86.csv +++ b/tests/tcg/i386/x86.csv @@ -1469,16 +1469,16 @@ "PFCMPEQ mm1, mm2/m64","PFCMPEQ mm2/m64, mm1","pfcmpeq mm2/m64, mm1","0F 0= F B0 /r","V","V","3DNOW","amd","rw,r","","" "PFCMPGE mm1, mm2/m64","PFCMPGE mm2/m64, mm1","pfcmpge mm2/m64, mm1","0F 0= F 90 /r","V","V","3DNOW","amd","rw,r","","" "PFCMPGT mm1, mm2/m64","PFCMPGT mm2/m64, mm1","pfcmpgt mm2/m64, mm1","0F 0= F A0 /r","V","V","3DNOW","amd","rw,r","","" -"PFCPIT1 mm1, mm2/m64","PFCPIT1 mm2/m64, mm1","pfcpit1 mm2/m64, mm1","0F 0= F A6 /r","V","V","3DNOW","amd","rw,r","","" "PFMAX mm1, mm2/m64","PFMAX mm2/m64, mm1","pfmax mm2/m64, mm1","0F 0F A4 /= r","V","V","3DNOW","amd","rw,r","","" "PFMIN mm1, mm2/m64","PFMIN mm2/m64, mm1","pfmin mm2/m64, mm1","0F 0F 94 /= r","V","V","3DNOW","amd","rw,r","","" "PFMUL mm1, mm2/m64","PFMUL mm2/m64, mm1","pfmul mm2/m64, mm1","0F 0F B4 /= r","V","V","3DNOW","amd","rw,r","","" "PFNACC mm1, mm2/m64","PFNACC mm2/m64, mm1","pfnacc mm2/m64, mm1","0F 0F 8= A /r","V","V","3DNOW","amd","rw,r","","" "PFPNACC mm1, mm2/m64","PFPNACC mm2/m64, mm1","pfpnacc mm2/m64, mm1","0F 0= F 8E /r","V","V","3DNOW","amd","rw,r","","" "PFRCP mm1, mm2/m64","PFRCP mm2/m64, mm1","pfrcp mm2/m64, mm1","0F 0F 96 /= r","V","V","3DNOW","amd","rw,r","","" +"PFRCPIT1 mm1, mm2/m64","PFRCPIT1 mm2/m64, mm1","pfrcpit1 mm2/m64, mm1","0= F 0F A6 /r","V","V","3DNOW","amd","rw,r","","" "PFRCPIT2 mm1, mm2/m64","PFRCPIT2 mm2/m64, mm1","pfrcpit2 mm2/m64, mm1","0= F 0F B6 /r","V","V","3DNOW","amd","rw,r","","" "PFRSQIT1 mm1, mm2/m64","PFRSQIT1 mm2/m64, mm1","pfrsqit1 mm2/m64, mm1","0= F 0F A7 /r","V","V","3DNOW","amd","rw,r","","" -"PFSQRT mm1, mm2/m64","PFSQRT mm2/m64, mm1","pfsqrt mm2/m64, mm1","0F 0F 9= 7 /r","V","V","3DNOW","amd","rw,r","","" +"PFRSQRT mm1, mm2/m64","PFRSQRT mm2/m64, mm1","pfrsqrt mm2/m64, mm1","0F 0= F 97 /r","V","V","3DNOW","amd","rw,r","","" "PFSUB mm1, mm2/m64","PFSUB mm2/m64, mm1","pfsub mm2/m64, mm1","0F 0F 9A /= r","V","V","3DNOW","amd","rw,r","","" "PFSUBR mm1, mm2/m64","PFSUBR mm2/m64, mm1","pfsubr mm2/m64, mm1","0F 0F A= A /r","V","V","3DNOW","amd","rw,r","","" "PHADDD mm1, mm2/m64","PHADDD mm2/m64, mm1","phaddd mm2/m64, mm1","0F 38 0= 2 /r","V","V","SSSE3","","rw,r","","" --=20 2.37.2 From nobody Mon Feb 9 11:07:01 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=1662937429; cv=none; d=zohomail.com; s=zohoarc; b=OTxbVkkr/HqDUFypf9eq2FCkyIRiNxPmak3jZeucYAJANRXKsMBdoC5OJcLmdCYaOaisotqgqQDjwutMArXxlcBoDYHKYHtMzYsKUJf8kB72c85avq+q6Ow2r3X/Y91mzFBYSs8OAkzf88TGxK+mPdVohup0nZYuLxhh5+UONKo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1662937429; 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=8jHZa3eb+zjmS6qcxsMkyihbbwP8UhRCmQoRiVRocQM=; b=ZQsGgF5PsIp2NhoFdwa+uWJLo8zG+d1+98HAq2JO2bE22nZKLfig29H6eq7x4iooDB1fTkS9XxumD/ehwjLcHMdVw7F4kHMwhMQqhOiOpgYAtqYFq0KESviqsiFIOqyLSt5Ak/DHQXiwQ1IaZarhDEWI+2IF3im11daPR3tzLYU= 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 1662937429053289.321450534923; Sun, 11 Sep 2022 16:03:49 -0700 (PDT) Received: from localhost ([::1]:54660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oXVzP-00078z-H8 for importer@patchew.org; Sun, 11 Sep 2022 19:03:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:36500) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwI-0004si-Pl for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:34 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:57391) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwF-0006OL-2F for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:34 -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-554-bt6Ebx4uOrqr_rnVuMHItw-1; Sun, 11 Sep 2022 19:00:27 -0400 Received: by mail-ed1-f70.google.com with SMTP id e15-20020a056402190f00b0044f41e776a0so4953508edz.0 for ; Sun, 11 Sep 2022 16:00:27 -0700 (PDT) Received: from goa-sendmail (93-44-39-154.ip95.fastwebnet.it. [93.44.39.154]) by smtp.gmail.com with ESMTPSA id bo24-20020a0564020b3800b0044e8ecb9d25sm4684667edb.52.2022.09.11.16.00.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Sep 2022 16:00:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1662937230; 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=8jHZa3eb+zjmS6qcxsMkyihbbwP8UhRCmQoRiVRocQM=; b=KY/YQiWHT0+8nNSoNr3EjlAMCuOgh7VHE4PyW+9e/+X09LmVUKd4RXR6v+XoR4O1Gvlg3a eFNb8bcoEVqdd7Vw3v+iYoFvJH6c2NkgtEnoygI6jNIIZLE5ANr5T9sxjvYcMSgS7freTa cRW/C8ZnoypCPa6YunopWkX1rjmiXBw= X-MC-Unique: bt6Ebx4uOrqr_rnVuMHItw-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; bh=8jHZa3eb+zjmS6qcxsMkyihbbwP8UhRCmQoRiVRocQM=; b=Pg3Bt43r9B/YBxRBlIHefWq0YEoVS1mtasyMTNZmjDu1xQ9bctIdRHUwtBzoIkvC/H 5qQC6/pyVwyHNswzWKqYfwO3yidun/cLNVCmMuU22fb7ovk1GyesTJksgmreSz+pQVzq RgjdCw02WCCVUkyP8ZOiY6DN35Lai4fvktUeFj4jJ1abK50nwgMPMJ5Hb2Ay3SbTSvda +MzU8sWnrYlduwMB8LXavey2FoIMtgZyyFB5nmcVJYkVg3qiSTxDpYkzNH3kxvZTkumH NWypPhUJcAfoCQs+66WWfaQwfDXibdR6+sFNstSnOn+6WOzQPDQqmN9tUEiSCWy9AMyf +QdA== X-Gm-Message-State: ACgBeo1bPvU+xHIjikebzfl7BGkxfCRkUJOk5/uqSX5nYP3xcf/vNQXX XDgiN9hywiwNAOQGi2j8OIy6HXQxSD+q4d1ZcmoRFPNj90ghxuZ5vA0SCk998jNcghegMxIiFqC 5BvkRb6BQJYluJMUYQKPRhRGcX5jC6M1dll6Rd2v7UxksOBJWEwT7W39pGL7yfg+ET2g= X-Received: by 2002:a17:906:8442:b0:77c:6b3d:bec2 with SMTP id e2-20020a170906844200b0077c6b3dbec2mr3349922ejy.224.1662937225928; Sun, 11 Sep 2022 16:00:25 -0700 (PDT) X-Google-Smtp-Source: AA6agR4+qesOeOu5y0y7zBsULXo2o92XqqlspFzqPFl3rDUYKpYevqAtbye++wlDgJXzqIGjLqyrOA== X-Received: by 2002:a17:906:8442:b0:77c:6b3d:bec2 with SMTP id e2-20020a170906844200b0077c6b3dbec2mr3349867ejy.224.1662937225389; Sun, 11 Sep 2022 16:00:25 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 2/4] tests/tcg: i386: add MMX and 3DNow! tests Date: Mon, 12 Sep 2022 01:00:12 +0200 Message-Id: <20220911230014.340601-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220911230014.340601-1-pbonzini@redhat.com> References: <20220911230014.340601-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: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-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: 1662937432478100002 Content-Type: text/plain; charset="utf-8" Adjust the test-avx.py generator to produce tests specifically for MMX and 3DNow. Using a separate generator introduces some code duplication, but is a simpler approach because of test-avx's extra complexity to support 3- and 4-operand AVX instructions. If needed, a common library can be introduced later. Signed-off-by: Paolo Bonzini --- tests/tcg/i386/Makefile.target | 18 +- tests/tcg/i386/test-3dnow.c | 3 + tests/tcg/i386/test-avx.py | 1 - tests/tcg/i386/test-mmx.c | 315 +++++++++++++++++++++++++++++++++ tests/tcg/i386/test-mmx.py | 244 +++++++++++++++++++++++++ 5 files changed, 577 insertions(+), 4 deletions(-) create mode 100644 tests/tcg/i386/test-3dnow.c create mode 100644 tests/tcg/i386/test-mmx.c create mode 100755 tests/tcg/i386/test-mmx.py diff --git a/tests/tcg/i386/Makefile.target b/tests/tcg/i386/Makefile.target index be21b81b96..ae71e7f748 100644 --- a/tests/tcg/i386/Makefile.target +++ b/tests/tcg/i386/Makefile.target @@ -7,8 +7,8 @@ VPATH +=3D $(I386_SRC) =20 I386_SRCS=3D$(notdir $(wildcard $(I386_SRC)/*.c)) ALL_X86_TESTS=3D$(I386_SRCS:.c=3D) -SKIP_I386_TESTS=3Dtest-i386-ssse3 test-avx -X86_64_TESTS:=3D$(filter test-i386-bmi2 test-i386-ssse3 test-avx, $(ALL_X8= 6_TESTS)) +SKIP_I386_TESTS=3Dtest-i386-ssse3 test-avx test-3dnow test-mmx +X86_64_TESTS:=3D$(filter test-i386-bmi2 $(SKIP_I386_TESTS), $(ALL_X86_TEST= S)) =20 test-i386-sse-exceptions: CFLAGS +=3D -msse4.1 -mfpmath=3Dsse run-test-i386-sse-exceptions: QEMU_OPTS +=3D -cpu max @@ -82,9 +82,21 @@ run-plugin-sha512-sse-with-%: QEMU_OPTS+=3D-cpu max =20 TESTS+=3Dsha512-sse =20 -CLEANFILES +=3D test-avx.h +CLEANFILES +=3D test-avx.h test-mmx.h test-3dnow.h +test-3dnow.h: test-mmx.py x86.csv + $(PYTHON) $(I386_SRC)/test-mmx.py $(I386_SRC)/x86.csv $@ 3DNOW + +test-mmx.h: test-mmx.py x86.csv + $(PYTHON) $(I386_SRC)/test-mmx.py $(I386_SRC)/x86.csv $@ MMX SSE SSE2 SSE= 3 SSSE3 + test-avx.h: test-avx.py x86.csv $(PYTHON) $(I386_SRC)/test-avx.py $(I386_SRC)/x86.csv $@ =20 +test-3dnow: CFLAGS +=3D -masm=3Dintel -O -I. +test-3dnow: test-3dnow.h + +test-mmx: CFLAGS +=3D -masm=3Dintel -O -I. +test-mmx: test-mmx.h + test-avx: CFLAGS +=3D -masm=3Dintel -O -I. test-avx: test-avx.h diff --git a/tests/tcg/i386/test-3dnow.c b/tests/tcg/i386/test-3dnow.c new file mode 100644 index 0000000000..67abc68677 --- /dev/null +++ b/tests/tcg/i386/test-3dnow.c @@ -0,0 +1,3 @@ +#define EMMS "femms" +#define TEST_FILE "test-3dnow.h" +#include "test-mmx.c" diff --git a/tests/tcg/i386/test-avx.py b/tests/tcg/i386/test-avx.py index 6eb455a8b4..2516c66445 100755 --- a/tests/tcg/i386/test-avx.py +++ b/tests/tcg/i386/test-avx.py @@ -7,7 +7,6 @@ from fnmatch import fnmatch =20 archs =3D [ - # TODO: MMX? "SSE", "SSE2", "SSE3", "SSSE3", "SSE4_1", "SSE4_2", ] =20 diff --git a/tests/tcg/i386/test-mmx.c b/tests/tcg/i386/test-mmx.c new file mode 100644 index 0000000000..09e5d583ff --- /dev/null +++ b/tests/tcg/i386/test-mmx.c @@ -0,0 +1,315 @@ +#include +#include +#include +#include + +#ifndef TEST_FILE +#define TEST_FILE "test-mmx.h" +#endif +#ifndef EMMS +#define EMMS "emms" +#endif + +typedef void (*testfn)(void); + +typedef struct { + uint64_t q0, q1; +} __attribute__((aligned(16))) v2di; + +typedef struct { + uint64_t mm[8]; + v2di xmm[8]; + uint64_t r[16]; + uint64_t flags; + uint32_t ff; + uint64_t pad; + v2di mem[4]; + v2di mem0[4]; +} reg_state; + +typedef struct { + int n; + testfn fn; + const char *s; + reg_state *init; +} TestDef; + +reg_state initI; +reg_state initF32; +reg_state initF64; + +static void dump_mmx(int n, const uint64_t *r, int ff) +{ + if (ff =3D=3D 32) { + float v[2]; + memcpy(v, r, sizeof(v)); + printf("MM%d =3D %016lx %8g %8g\n", n, *r, v[1], v[0]); + } else { + printf("MM%d =3D %016lx\n", n, *r); + } +} + +static void dump_xmm(const char *name, int n, const v2di *r, int ff) +{ + printf("%s%d =3D %016lx %016lx\n", + name, n, r->q1, r->q0); + if (ff =3D=3D 32) { + float v[4]; + memcpy(v, r, sizeof(v)); + printf(" %8g %8g %8g %8g\n", + v[3], v[2], v[1], v[0]); + } +} + +static void dump_regs(reg_state *s, int ff) +{ + int i; + + for (i =3D 0; i < 8; i++) { + dump_mmx(i, &s->mm[i], ff); + } + for (i =3D 0; i < 4; i++) { + dump_xmm("mem", i, &s->mem0[i], 0); + } +} + +static void compare_state(const reg_state *a, const reg_state *b) +{ + int i; + for (i =3D 0; i < 8; i++) { + if (a->mm[i] !=3D b->mm[i]) { + printf("MM%d =3D %016lx\n", i, b->mm[i]); + } + } + for (i =3D 0; i < 16; i++) { + if (a->r[i] !=3D b->r[i]) { + printf("r%d =3D %016lx\n", i, b->r[i]); + } + } + for (i =3D 0; i < 8; i++) { + if (memcmp(&a->xmm[i], &b->xmm[i], 8)) { + dump_xmm("xmm", i, &b->xmm[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 (a->flags !=3D b->flags) { + printf("FLAGS =3D %016lx\n", b->flags); + } +} + +#define LOADMM(r, o) "movq " #r ", " #o "[%0]\n\t" +#define LOADXMM(r, o) "movdqa " #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 MMREG(F) \ + F(mm0, 0x00) \ + F(mm1, 0x08) \ + F(mm2, 0x10) \ + F(mm3, 0x18) \ + F(mm4, 0x20) \ + 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) +#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, 0xc8) \ + F(rcx, 0xd0) \ + F(rdx, 0xd8) \ + F(rsi, 0xe0) \ + F(rdi, 0xe8) \ + F(r8, 0x100) \ + F(r9, 0x108) \ + F(r10, 0x110) \ + F(r11, 0x118) \ + F(r12, 0x120) \ + F(r13, 0x128) \ + F(r14, 0x130) \ + F(r15, 0x138) \ + +static void run_test(const TestDef *t) +{ + reg_state result; + reg_state *init =3D t->init; + memcpy(init->mem, init->mem0, sizeof(init->mem)); + printf("%5d %s\n", t->n, t->s); + asm volatile( + MMREG(LOADMM) + XMMREG(LOADXMM) + "sub rsp, 128\n\t" + "push rax\n\t" + "push rbx\n\t" + "push rcx\n\t" + "push rdx\n\t" + "push %1\n\t" + "push %2\n\t" + "mov rax, %0\n\t" + "pushf\n\t" + "pop rbx\n\t" + "shr rbx, 8\n\t" + "shl rbx, 8\n\t" + "mov rcx, 0x140[rax]\n\t" + "and rcx, 0xff\n\t" + "or rbx, rcx\n\t" + "push rbx\n\t" + "popf\n\t" + REG(LOADREG) + "mov rax, 0xc0[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 0xc0[rax], rbx\n\t" + "mov rbx, 0\n\t" + "mov 0xf0[rax], rbx\n\t" + "mov 0xf8[rax], rbx\n\t" + "pushf\n\t" + "pop rbx\n\t" + "and rbx, 0xff\n\t" + "mov 0x140[rax], rbx\n\t" + "add rsp, 16\n\t" + "pop rdx\n\t" + "pop rcx\n\t" + "pop rbx\n\t" + "pop rax\n\t" + "add rsp, 128\n\t" + MMREG(STOREMM) + EMMS "\n\t" + XMMREG(STOREXMM) + : : "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" + ); + compare_state(init, &result); +} + +#define TEST(n, cmd, type) \ +static void __attribute__((naked)) test_##n(void) \ +{ \ + asm volatile(cmd); \ + asm volatile("ret"); \ +} +#include TEST_FILE + + +static const TestDef test_table[] =3D { +#define TEST(n, cmd, type) {n, test_##n, cmd, &init##type}, +#include TEST_FILE + {-1, NULL, "", NULL} +}; + +static void run_all(void) +{ + const TestDef *t; + for (t =3D test_table; t->fn; t++) { + run_test(t); + } +} + +#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0])) + +float val_f32[] =3D {2.0, -1.0, 4.8, 0.8, 3, -42.0, 5e6, 7.5, 8.3}; +uint64_t val_i64[] =3D { + 0x3d6b3b6a9e4118f2lu, 0x355ae76d2774d78clu, + 0xd851c54a56bf1f29lu, 0x4a84d1d50bf4c4fflu, + 0x5826475e2c5fd799lu, 0xfd32edc01243f5e9lu, +}; + +v2di deadbeef =3D {0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull}; + +void init_f32reg(uint64_t *r) +{ + static int n; + float v[2]; + int i; + for (i =3D 0; i < 2; i++) { + v[i] =3D val_f32[n++]; + if (n =3D=3D ARRAY_LEN(val_f32)) { + n =3D 0; + } + } + memcpy(r, v, sizeof(*r)); +} + +void init_intreg(uint64_t *r) +{ + static uint64_t mask; + static int n; + + *r =3D val_i64[n] ^ mask; + n++; + if (n =3D=3D ARRAY_LEN(val_i64)) { + n =3D 0; + mask *=3D 0x104C11DB7; + } +} + +static void init_all(reg_state *s) +{ + int i; + + for (i =3D 0; i < 16; i++) { + init_intreg(&s->r[i]); + } + s->r[3] =3D (uint64_t)&s->mem[0]; /* rdx */ + s->r[5] =3D (uint64_t)&s->mem[2]; /* rdi */ + s->r[6] =3D 0; + s->r[7] =3D 0; + s->flags =3D 2; + for (i =3D 0; i < 8; i++) { + s->xmm[i] =3D deadbeef; + memcpy(&s->mm[i], &s->xmm[i], sizeof(s->mm[i])); + } + for (i =3D 0; i < 2; i++) { + s->mem0[i] =3D deadbeef; + } +} + +int main(int argc, char *argv[]) +{ + init_all(&initI); + init_intreg(&initI.mm[5]); + init_intreg(&initI.mm[6]); + init_intreg(&initI.mm[7]); + init_intreg(&initI.mem0[1].q0); + init_intreg(&initI.mem0[1].q1); + printf("Int:\n"); + dump_regs(&initI, 0); + + init_all(&initF32); + init_f32reg(&initF32.mm[5]); + init_f32reg(&initF32.mm[6]); + init_f32reg(&initF32.mm[7]); + init_f32reg(&initF32.mem0[1].q0); + init_f32reg(&initF32.mem0[1].q1); + initF32.ff =3D 32; + printf("F32:\n"); + dump_regs(&initF32, 32); + + if (argc > 1) { + int n =3D atoi(argv[1]); + run_test(&test_table[n]); + } else { + run_all(); + } + return 0; +} diff --git a/tests/tcg/i386/test-mmx.py b/tests/tcg/i386/test-mmx.py new file mode 100755 index 0000000000..392315e176 --- /dev/null +++ b/tests/tcg/i386/test-mmx.py @@ -0,0 +1,244 @@ +#! /usr/bin/env python3 + +# Generate test-avx.h from x86.csv + +import csv +import sys +from fnmatch import fnmatch + +ignore =3D set(["EMMS", "FEMMS", "FISTTP", + "LDMXCSR", "VLDMXCSR", "STMXCSR", "VSTMXCSR"]) + +imask =3D { + 'PALIGNR': 0x3f, + 'PEXTRB': 0x0f, + 'PEXTRW': 0x07, + 'PEXTRD': 0x03, + 'PEXTRQ': 0x01, + 'PINSRB': 0x0f, + 'PINSRW': 0x07, + 'PINSRD': 0x03, + 'PINSRQ': 0x01, + 'PSHUF[DW]': 0xff, + 'PSHUF[LH]W': 0xff, + 'PS[LR][AL][WDQ]': 0x3f, +} + +def strip_comments(x): + for l in x: + if l !=3D '' and l[0] !=3D '#': + yield l + +def reg_w(w): + if w =3D=3D 8: + return 'al' + elif w =3D=3D 16: + return 'ax' + elif w =3D=3D 32: + return 'eax' + elif w =3D=3D 64: + return 'rax' + raise Exception("bad reg_w %d" % w) + +def mem_w(w): + if w =3D=3D 8: + t =3D "BYTE" + elif w =3D=3D 16: + t =3D "WORD" + elif w =3D=3D 32: + t =3D "DWORD" + elif w =3D=3D 64: + t =3D "QWORD" + else: + raise Exception() + + return t + " PTR 32[rdx]" + +class MMArg(): + isxmm =3D True + + def __init__(self, mw): + if mw not in [0, 32, 64]: + raise Exception("Bad /m width: %s" % w) + self.mw =3D mw + self.ismem =3D mw !=3D 0 + def regstr(self, n): + if n < 0: + return mem_w(self.mw) + else: + return "mm%d" % (n, ) + +def match(op, pattern): + return fnmatch(op, pattern) + +class ArgImm8u(): + isxmm =3D False + ismem =3D False + def __init__(self, op): + for k, v in imask.items(): + if match(op, k): + self.mask =3D imask[k]; + return + raise Exception("Unknown immediate") + def vals(self): + mask =3D self.mask + yield 0 + n =3D 0 + while n !=3D mask: + n +=3D 1 + while (n & ~mask) !=3D 0: + n +=3D (n & ~mask) + yield n + +class ArgRM(): + isxmm =3D False + def __init__(self, rw, mw): + if rw not in [8, 16, 32, 64]: + raise Exception("Bad r/w width: %s" % w) + if mw not in [0, 8, 16, 32, 64]: + raise Exception("Bad r/w width: %s" % w) + self.rw =3D rw + self.mw =3D mw + self.ismem =3D mw !=3D 0 + def regstr(self, n): + if n < 0: + return mem_w(self.mw) + else: + return reg_w(self.rw) + +class ArgMem(): + isxmm =3D False + ismem =3D True + def __init__(self, w): + if w not in [8, 16, 32, 64, 128, 256]: + raise Exception("Bad mem width: %s" % w) + self.w =3D w + def regstr(self, n): + return mem_w(self.w) + +class SkipInstruction(Exception): + pass + +def ArgGenerator(arg, op): + if arg[:2] =3D=3D 'mm': + if "/" in arg: + r, m =3D arg.split('/') + if (m[0] !=3D 'm'): + raise Exception("Expected /m: %s", arg) + return MMArg(int(m[1:])); + else: + return MMArg(0); + elif arg[:4] =3D=3D 'imm8': + return ArgImm8u(op); + elif arg[0] =3D=3D 'r': + if '/m' in arg: + r, m =3D arg.split('/') + if (m[0] !=3D 'm'): + raise Exception("Expected /m: %s", arg) + mw =3D int(m[1:]) + if r =3D=3D 'r': + rw =3D mw + else: + rw =3D int(r[1:]) + return ArgRM(rw, mw) + + return ArgRM(int(arg[1:]), 0); + elif arg[0] =3D=3D 'm': + return ArgMem(int(arg[1:])) + else: + raise SkipInstruction + +class InsnGenerator: + def __init__(self, op, args): + self.op =3D op + if op[0:2] =3D=3D "PF": + self.optype =3D 'F32' + else: + self.optype =3D 'I' + + try: + self.args =3D list(ArgGenerator(a, op) for a in args) + if len(self.args) > 0 and self.args[-1] is None: + self.args =3D self.args[:-1] + except SkipInstruction: + raise + except Exception as e: + raise Exception("Bad arg %s: %s" % (op, e)) + + def gen(self): + regs =3D (5, 6, 7) + dest =3D 4 + + nreg =3D len(self.args) + if nreg =3D=3D 0: + yield self.op + return + if isinstance(self.args[-1], ArgImm8u): + nreg -=3D 1 + immarg =3D self.args[-1] + else: + immarg =3D None + memarg =3D -1 + for n, arg in enumerate(self.args): + if arg.ismem: + memarg =3D n + + if nreg =3D=3D 1: + regset =3D [(regs[0],)] + if memarg if immarg is None: + yield self.op + ' ' + ','.join(argstr) + else: + for immval in immarg.vals(): + yield self.op + ' ' + ','.join(argstr) + ',' + str(imm= val) + +def split0(s): + if s =3D=3D '': + return [] + return s.split(',') + +def main(): + n =3D 0 + if len(sys.argv) <=3D 3: + print("Usage: test-mmx.py x86.csv test-mmx.h CPUID...") + exit(1) + csvfile =3D open(sys.argv[1], 'r', newline=3D'') + archs =3D sys.argv[3:] + with open(sys.argv[2], "w") as outf: + outf.write("// Generated by test-mmx.py. Do not edit.\n") + for row in csv.reader(strip_comments(csvfile)): + insn =3D row[0].replace(',', '').split() + if insn[0] in ignore: + continue + cpuid =3D row[6] + if cpuid in archs: + try: + g =3D InsnGenerator(insn[0], insn[1:]) + for insn in g.gen(): + outf.write('TEST(%d, "%s", %s)\n' % (n, insn, g.op= type)) + n +=3D 1 + except SkipInstruction: + pass + outf.write("#undef TEST\n") + csvfile.close() + +if __name__ =3D=3D "__main__": + main() --=20 2.37.2 From nobody Mon Feb 9 11:07:01 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=1662937923; cv=none; d=zohomail.com; s=zohoarc; b=LDCxMQdH5BvUWwSnUbye+386bGrlUehqPktc+B8L6sIeTHrvmj96SG3pK3XuR5EFcacJnyPtiK4iUpPmxvmCUyCYasuerpuIHFDWSNFBSh6Pp7kGAv1vyLNtXsJuG58+H0J/Zx71J1eRL7dJFBHLrjQ54oZGRwf2iWwOjZjrqVo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1662937923; 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=60ZCEpPNxCwMjWmNStrObBA/6q5Os6NikAkMLpEdLr4=; b=SYPOWMmk43O2M0Gk/2MA8RcArMDAyvydI+FTETZAqT05ITMW1tIeTX9qcU1I3vdqA1BqEmLX/f8k1N61mlUcg7TS6tj6EyT3KPJ8DjMWDpfCUiiozUzMvyxrMhb61ACluhQhD8p/j7u5lH41/tx+rOwk8EsnDLXXYg28mD8eZFo= 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 1662937923738135.9976763841463; Sun, 11 Sep 2022 16:12:03 -0700 (PDT) Received: from localhost ([::1]:36706 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oXW7N-0001IG-KQ for importer@patchew.org; Sun, 11 Sep 2022 19:12:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:36502) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwI-0004sq-VD for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:34 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:49514) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwG-0006OS-2J for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:34 -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-607-pzyCTK2qPta-lOXalVTeIg-1; Sun, 11 Sep 2022 19:00:29 -0400 Received: by mail-ed1-f69.google.com with SMTP id b13-20020a056402350d00b0043dfc84c533so4909069edd.5 for ; Sun, 11 Sep 2022 16:00:29 -0700 (PDT) Received: from goa-sendmail (93-44-39-154.ip95.fastwebnet.it. [93.44.39.154]) by smtp.gmail.com with ESMTPSA id k16-20020a170906681000b0072b13ac9ca3sm3491189ejr.183.2022.09.11.16.00.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Sep 2022 16:00:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1662937231; 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=60ZCEpPNxCwMjWmNStrObBA/6q5Os6NikAkMLpEdLr4=; b=hiJ6pQkA299QUvIzLQmdwKyiolOTHmvwJ34leDSqyJGt6Av6VwlxOETqvDTrirpcBr9rE/ deFooM5NdOL0AuR8315Zxc8ZLjYcmPkwTnuXEKqvsFls7VLktwTXn0uGyGK0SLx9mU6z20 UXq1fmmL8Dfb+f14F/a5lD9sKo0hBUI= X-MC-Unique: pzyCTK2qPta-lOXalVTeIg-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; bh=60ZCEpPNxCwMjWmNStrObBA/6q5Os6NikAkMLpEdLr4=; b=wzlbCM+47ImepSLtq1iulVE547sFtrYj5OB9Q9XImHL6cpIUp0Z0T5N9X5QQutPHeK dBXloxr3/qdYAcvxw/WbBgLOk2w7fsqeAL5W6GRbxgDjkwNxGAqxypNtqIoFkPTlehsM 1gWHOGmzNghbzMNNhoce8yEmMq1duNAsad1SuRm1uH7IoB21QuLtbYgw+HlfLn8LEvgy F10DonevtiklQJrZzhw11ynZSl16FI0/zzgNt0VMjQT1t6VOSpdAbHYmnY96D8WgCyt3 dQmGz5lBPLpXsvPda7iZiyYLwoZnlHNErpmyerESMK6rddB3M7hATuoZB7oEM6fbueAj Ik1g== X-Gm-Message-State: ACgBeo0xVkYnJejBcAItM4dHwQwflxBp33CBj8dEE5Eial0bKSYXyTvZ Gu5YqLQtNkgFjuRHAD36jfGCjJXgpgUIA2r39hTHSY4Akzz1AQJw5sgd7uaaxv4uQQDWDRUDP+k ofwyIwd5lkjgumgTMi3VvLRPGtv1z3cucoNQHIml9Y4QnP74Un9LmDtpm8qbOZ+w30CI= X-Received: by 2002:aa7:c78e:0:b0:441:c311:9dcd with SMTP id n14-20020aa7c78e000000b00441c3119dcdmr19707501eds.155.1662937228584; Sun, 11 Sep 2022 16:00:28 -0700 (PDT) X-Google-Smtp-Source: AA6agR6GIK8JOl53CFHXy/HEiJqy2O/25+RgqOOquuqf335gOdzjTqwdnP1vr9cdwoW0SZ/VFtY8Dg== X-Received: by 2002:aa7:c78e:0:b0:441:c311:9dcd with SMTP id n14-20020aa7c78e000000b00441c3119dcdmr19707483eds.155.1662937228292; Sun, 11 Sep 2022 16:00:28 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 3/4] tests/tcg: refine MMX support in SSE tests Date: Mon, 12 Sep 2022 01:00:13 +0200 Message-Id: <20220911230014.340601-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220911230014.340601-1-pbonzini@redhat.com> References: <20220911230014.340601-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: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-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: 1662937924581100001 Content-Type: text/plain; charset="utf-8" Extend the support to memory operands, and skip MMX instructions that were introduced in SSE times, because they are now covered in test-mmx. Signed-off-by: Paolo Bonzini --- tests/tcg/i386/test-avx.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/tests/tcg/i386/test-avx.py b/tests/tcg/i386/test-avx.py index 2516c66445..e16a3d8bee 100755 --- a/tests/tcg/i386/test-avx.py +++ b/tests/tcg/i386/test-avx.py @@ -103,7 +103,11 @@ def regstr(self, n): =20 class MMArg(): isxmm =3D True - ismem =3D False # TODO + def __init__(self, mw): + if mw not in [0, 32, 64]: + raise Exception("Bad mem width: %s" % mw) + self.mw =3D mw + self.ismem =3D mw !=3D 0 def regstr(self, n): return "mm%d" % (n & 7) =20 @@ -169,6 +173,9 @@ def __init__(self, w): def regstr(self, n): return mem_w(self.w) =20 +class SkipInstruction(Exception): + pass + def ArgGenerator(arg, op): if arg[:3] =3D=3D 'xmm' or arg[:3] =3D=3D "ymm": if "/" in arg: @@ -179,7 +186,13 @@ def ArgGenerator(arg, op): else: return XMMArg(arg[0], 0); elif arg[:2] =3D=3D 'mm': - return MMArg(); + if "/" in arg: + r, m =3D arg.split('/') + if (m[0] !=3D 'm'): + raise Exception("Expected /m: %s", arg) + return MMArg(int(m[1:])); + else: + return MMArg(0); elif arg[:4] =3D=3D 'imm8': return ArgImm8u(op); elif arg =3D=3D '': @@ -217,8 +230,12 @@ def __init__(self, op, args): =20 try: self.args =3D list(ArgGenerator(a, op) for a in args) + if not any((x.isxmm for x in self.args)): + raise SkipInstruction if len(self.args) > 0 and self.args[-1] is None: self.args =3D self.args[:-1] + except SkipInstruction: + raise except Exception as e: raise Exception("Bad arg %s: %s" % (op, e)) =20 @@ -339,10 +356,13 @@ def main(): continue cpuid =3D row[6] if cpuid in archs: - g =3D InsnGenerator(insn[0], insn[1:]) - for insn in g.gen(): - outf.write('TEST(%d, "%s", %s)\n' % (n, insn, g.optype= )) - n +=3D 1 + try: + g =3D InsnGenerator(insn[0], insn[1:]) + for insn in g.gen(): + outf.write('TEST(%d, "%s", %s)\n' % (n, insn, g.op= type)) + n +=3D 1 + except SkipInstruction: + pass outf.write("#undef TEST\n") csvfile.close() =20 --=20 2.37.2 From nobody Mon Feb 9 11:07:01 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=1662937430; cv=none; d=zohomail.com; s=zohoarc; b=DfU4+z8O7e7SX1nMbm3bujTYRrmFOVbsv9Rj2MdbblZ6OuMyC9UwL37yyve0l0K/iozsPCHBj4wyu1B+zIpK9UZf/K808idWbJwLouLEbHiC9dWOGGqVE2m1k0F8hfEaeRSdrIsoh1+vlIHFJ9DbrrYmZU3G/IC1E+hgKAlnKvQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1662937430; 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=0QutVkQWh3O0i0W03jJrxQ1aHn2WdaciPl0ofdtkKFo=; b=VHWcWkmmQujOATNn9CsGhx+fX3d89DJZlqbSOtxR2XklBoKxXa0MPSAT6/dBFDNR8BRbPdAomP7OIavyoek567iqBtsdoceh5cXk4Xr598YKOMoASFOYeWQnHROioJ6hOz9gA8VM/oU+SI01yAkIQyQrEVtM8nCCfJneNwaErl4= 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 166293743070068.65993409752957; Sun, 11 Sep 2022 16:03:50 -0700 (PDT) Received: from localhost ([::1]:54662 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oXVzR-0007JV-Jf for importer@patchew.org; Sun, 11 Sep 2022 19:03:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60770) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwL-0004xk-ST for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:38 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:58514) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oXVwJ-0006P0-HW for qemu-devel@nongnu.org; Sun, 11 Sep 2022 19:00:37 -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-189-LY-tCYyrM3C30G65BoFypA-1; Sun, 11 Sep 2022 19:00:33 -0400 Received: by mail-ed1-f70.google.com with SMTP id w20-20020a05640234d400b00450f24c8ca6so4940181edc.13 for ; Sun, 11 Sep 2022 16:00:33 -0700 (PDT) Received: from goa-sendmail (93-44-39-154.ip95.fastwebnet.it. [93.44.39.154]) by smtp.gmail.com with ESMTPSA id z13-20020a1709060acd00b0077d371a8f29sm1007697ejf.204.2022.09.11.16.00.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Sep 2022 16:00:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1662937235; 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=0QutVkQWh3O0i0W03jJrxQ1aHn2WdaciPl0ofdtkKFo=; b=WJLi/Ssl3LlPU8JncLjaRcXPix/MHBnccDuIAFSOczE/UHBLf31mksdXnHEBuQnip4VK/2 wmsF64j72oHBC7nHCP20Q6lHp+bMHK56JUP4Zy+7Dco4Tq1zBjXxeqpfLjGdAtYUkEM1A+ 5wSK+S7fI7CTDTlnJ/OsoGi0IsGDEMI= X-MC-Unique: LY-tCYyrM3C30G65BoFypA-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; bh=0QutVkQWh3O0i0W03jJrxQ1aHn2WdaciPl0ofdtkKFo=; b=W90TTw+gC4MYK5AqDLbipCIL4+dX5tfRPjX4V8qT62npveDoKwdZclpLdkO2UfBojB ArgG3fOmG6yHXO570X99Sv9xByCXRDFDFPCx4xdV/c/ahAihlfBSqkyFQWYInGULXK2I g69PPi0AzfAfIDPRQAgA3XK5K6BUiQMl5B6mRdZdttcYNbIAZUGebVN3KVDp2ViuVVX4 snIanKx0w40nKXHSBVrQZQq56nG61Ja0cszOxlzb7ZxfArhU4ttYBAK63U3AX2/eHSgL VCLMX+r9K6GZlJsHmnjYE/RC0UpiZpNH+BZopJxlzLkgbJTqfgLcNjPAuDWLhgLByyWq 5ycQ== X-Gm-Message-State: ACgBeo0IuHsGH7pMfVX1x/h77tBDj1kX/iwtorc+VDdB5dPL5mqgRmKG l0eTXaLgUzluLMY0UGPBxZV8Xvo2gqzBuBYx2DkWulJ6IgvU3RJxRhQRiU0eEwRfwgDaI/nhRbw ANdoNvg9JuPzK2l0q9LP5SPtLz0xcFKWI8rZfUuRzR3CKmDaU/Q8tPIyPjeu8GA3KtCc= X-Received: by 2002:a17:907:2724:b0:779:7545:5df6 with SMTP id d4-20020a170907272400b0077975455df6mr10036164ejl.325.1662937231885; Sun, 11 Sep 2022 16:00:31 -0700 (PDT) X-Google-Smtp-Source: AA6agR6K1GHrn2hOOZXspEHyQXmhIjvAMhBZchmg1nNSprG7uYoQ6F3Cbe7ufseUCY7ZJ1IszF6XkQ== X-Received: by 2002:a17:907:2724:b0:779:7545:5df6 with SMTP id d4-20020a170907272400b0077975455df6mr10036132ejl.325.1662937231352; Sun, 11 Sep 2022 16:00:31 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 4/4] tests/tcg: remove old SSE tests Date: Mon, 12 Sep 2022 01:00:14 +0200 Message-Id: <20220911230014.340601-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220911230014.340601-1-pbonzini@redhat.com> References: <20220911230014.340601-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: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-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: 1662937432292100001 Content-Type: text/plain; charset="utf-8" The new testsuite is much more comprehensive, so remove the old one; it is also buggy (the pinsrw test uses incorrect constraints, with =3D instead of +, and the golden output for the fxsave tests differs depending on how the C library uses SSE and AVX instructions). Signed-off-by: Paolo Bonzini --- tests/tcg/i386/test-i386.c | 573 ------------------------------------- 1 file changed, 573 deletions(-) diff --git a/tests/tcg/i386/test-i386.c b/tests/tcg/i386/test-i386.c index e6b308a2c0..864c4e620d 100644 --- a/tests/tcg/i386/test-i386.c +++ b/tests/tcg/i386/test-i386.c @@ -34,15 +34,8 @@ #endif //#define LINUX_VM86_IOPL_FIX //#define TEST_P4_FLAGS -#ifdef __SSE__ -#define TEST_SSE #define TEST_CMOV 1 #define TEST_FCOMI 1 -#else -#undef TEST_SSE -#define TEST_CMOV 1 -#define TEST_FCOMI 1 -#endif =20 #if defined(__x86_64__) #define FMT64X "%016lx" @@ -2104,568 +2097,6 @@ static void test_enter(void) TEST_ENTER("w", uint16_t, 31); } =20 -#ifdef TEST_SSE - -typedef int __m64 __attribute__ ((vector_size(8))); -typedef float __m128 __attribute__ ((vector_size(16))); - -typedef union { - double d[2]; - float s[4]; - uint32_t l[4]; - uint64_t q[2]; - __m128 dq; -} XMMReg; - -static uint64_t __attribute__((aligned(16))) test_values[4][2] =3D { - { 0x456723c698694873, 0xdc515cff944a58ec }, - { 0x1f297ccd58bad7ab, 0x41f21efba9e3e146 }, - { 0x007c62c2085427f8, 0x231be9e8cde7438d }, - { 0x0f76255a085427f8, 0xc233e9e8c4c9439a }, -}; - -#define SSE_OP(op)\ -{\ - asm volatile (#op " %2, %0" : "=3Dx" (r.dq) : "0" (a.dq), "x" (b.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " b=3D" FMT64X "" FMT64X " r=3D" = FMT64X "" FMT64X "\n",\ - #op,\ - a.q[1], a.q[0],\ - b.q[1], b.q[0],\ - r.q[1], r.q[0]);\ -} - -#define SSE_OP2(op)\ -{\ - int i;\ - for(i=3D0;i<2;i++) {\ - a.q[0] =3D test_values[2*i][0];\ - a.q[1] =3D test_values[2*i][1];\ - b.q[0] =3D test_values[2*i+1][0];\ - b.q[1] =3D test_values[2*i+1][1];\ - SSE_OP(op);\ - }\ -} - -#define MMX_OP2(op)\ -{\ - int i;\ - for(i=3D0;i<2;i++) {\ - a.q[0] =3D test_values[2*i][0];\ - b.q[0] =3D test_values[2*i+1][0];\ - asm volatile (#op " %2, %0" : "=3Dy" (r.q[0]) : "0" (a.q[0]), "y" (b.q= [0]));\ - printf("%-9s: a=3D" FMT64X " b=3D" FMT64X " r=3D" FMT64X "\n",\ - #op,\ - a.q[0],\ - b.q[0],\ - r.q[0]);\ - }\ - SSE_OP2(op);\ -} - -#define SHUF_OP(op, ib)\ -{\ - a.q[0] =3D test_values[0][0];\ - a.q[1] =3D test_values[0][1];\ - b.q[0] =3D test_values[1][0];\ - b.q[1] =3D test_values[1][1];\ - asm volatile (#op " $" #ib ", %2, %0" : "=3Dx" (r.dq) : "0" (a.dq), "x= " (b.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " b=3D" FMT64X "" FMT64X " ib=3D%= 02x r=3D" FMT64X "" FMT64X "\n",\ - #op,\ - a.q[1], a.q[0],\ - b.q[1], b.q[0],\ - ib,\ - r.q[1], r.q[0]);\ -} - -#define PSHUF_OP(op, ib)\ -{\ - int i;\ - for(i=3D0;i<2;i++) {\ - a.q[0] =3D test_values[2*i][0];\ - a.q[1] =3D test_values[2*i][1];\ - asm volatile (#op " $" #ib ", %1, %0" : "=3Dx" (r.dq) : "x" (a.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " ib=3D%02x r=3D" FMT64X "" FMT64= X "\n",\ - #op,\ - a.q[1], a.q[0],\ - ib,\ - r.q[1], r.q[0]);\ - }\ -} - -#define SHIFT_IM(op, ib)\ -{\ - int i;\ - for(i=3D0;i<2;i++) {\ - a.q[0] =3D test_values[2*i][0];\ - a.q[1] =3D test_values[2*i][1];\ - asm volatile (#op " $" #ib ", %0" : "=3Dx" (r.dq) : "0" (a.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " ib=3D%02x r=3D" FMT64X "" FMT64= X "\n",\ - #op,\ - a.q[1], a.q[0],\ - ib,\ - r.q[1], r.q[0]);\ - }\ -} - -#define SHIFT_OP(op, ib)\ -{\ - int i;\ - SHIFT_IM(op, ib);\ - for(i=3D0;i<2;i++) {\ - a.q[0] =3D test_values[2*i][0];\ - a.q[1] =3D test_values[2*i][1];\ - b.q[0] =3D ib;\ - b.q[1] =3D 0;\ - asm volatile (#op " %2, %0" : "=3Dx" (r.dq) : "0" (a.dq), "x" (b.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " b=3D" FMT64X "" FMT64X " r=3D" = FMT64X "" FMT64X "\n",\ - #op,\ - a.q[1], a.q[0],\ - b.q[1], b.q[0],\ - r.q[1], r.q[0]);\ - }\ -} - -#define MOVMSK(op)\ -{\ - int i, reg;\ - for(i=3D0;i<2;i++) {\ - a.q[0] =3D test_values[2*i][0];\ - a.q[1] =3D test_values[2*i][1];\ - asm volatile (#op " %1, %0" : "=3Dr" (reg) : "x" (a.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " r=3D%08x\n",\ - #op,\ - a.q[1], a.q[0],\ - reg);\ - }\ -} - -#define SSE_OPS(a) \ -SSE_OP(a ## ps);\ -SSE_OP(a ## ss); - -#define SSE_OPD(a) \ -SSE_OP(a ## pd);\ -SSE_OP(a ## sd); - -#define SSE_COMI(op, field)\ -{\ - unsigned long eflags;\ - XMMReg a, b;\ - a.field[0] =3D a1;\ - b.field[0] =3D b1;\ - asm volatile (#op " %2, %1\n"\ - "pushf\n"\ - "pop %0\n"\ - : "=3Drm" (eflags)\ - : "x" (a.dq), "x" (b.dq));\ - printf("%-9s: a=3D%f b=3D%f cc=3D%04lx\n",\ - #op, a1, b1,\ - eflags & (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));\ -} - -void test_sse_comi(double a1, double b1) -{ - SSE_COMI(ucomiss, s); - SSE_COMI(ucomisd, d); - SSE_COMI(comiss, s); - SSE_COMI(comisd, d); -} - -#define CVT_OP_XMM(op)\ -{\ - asm volatile (#op " %1, %0" : "=3Dx" (r.dq) : "x" (a.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " r=3D" FMT64X "" FMT64X "\n",\ - #op,\ - a.q[1], a.q[0],\ - r.q[1], r.q[0]);\ -} - -/* Force %xmm0 usage to avoid the case where both register index are 0 - to test instruction decoding more extensively */ -#define CVT_OP_XMM2MMX(op)\ -{\ - asm volatile (#op " %1, %0" : "=3Dy" (r.q[0]) : "x" (a.dq) \ - : "%xmm0"); \ - asm volatile("emms\n"); \ - printf("%-9s: a=3D" FMT64X "" FMT64X " r=3D" FMT64X "\n",\ - #op,\ - a.q[1], a.q[0],\ - r.q[0]);\ -} - -#define CVT_OP_MMX2XMM(op)\ -{\ - asm volatile (#op " %1, %0" : "=3Dx" (r.dq) : "y" (a.q[0]));\ - asm volatile("emms\n"); \ - printf("%-9s: a=3D" FMT64X " r=3D" FMT64X "" FMT64X "\n",\ - #op,\ - a.q[0],\ - r.q[1], r.q[0]);\ -} - -#define CVT_OP_REG2XMM(op)\ -{\ - asm volatile (#op " %1, %0" : "=3Dx" (r.dq) : "r" (a.l[0]));\ - printf("%-9s: a=3D%08x r=3D" FMT64X "" FMT64X "\n",\ - #op,\ - a.l[0],\ - r.q[1], r.q[0]);\ -} - -#define CVT_OP_XMM2REG(op)\ -{\ - asm volatile (#op " %1, %0" : "=3Dr" (r.l[0]) : "x" (a.dq));\ - printf("%-9s: a=3D" FMT64X "" FMT64X " r=3D%08x\n",\ - #op,\ - a.q[1], a.q[0],\ - r.l[0]);\ -} - -struct fpxstate { - uint16_t fpuc; - uint16_t fpus; - uint16_t fptag; - uint16_t fop; - uint32_t fpuip; - uint16_t cs_sel; - uint16_t dummy0; - uint32_t fpudp; - uint16_t ds_sel; - uint16_t dummy1; - uint32_t mxcsr; - uint32_t mxcsr_mask; - uint8_t fpregs1[8 * 16]; - uint8_t xmm_regs[8 * 16]; - uint8_t dummy2[224]; -}; - -static struct fpxstate fpx_state __attribute__((aligned(16))); -static struct fpxstate fpx_state2 __attribute__((aligned(16))); - -void test_fxsave(void) -{ - struct fpxstate *fp =3D &fpx_state; - struct fpxstate *fp2 =3D &fpx_state2; - int i, nb_xmm; - XMMReg a, b; - a.q[0] =3D test_values[0][0]; - a.q[1] =3D test_values[0][1]; - b.q[0] =3D test_values[1][0]; - b.q[1] =3D test_values[1][1]; - - asm("movdqa %2, %%xmm0\n" - "movdqa %3, %%xmm7\n" -#if defined(__x86_64__) - "movdqa %2, %%xmm15\n" -#endif - " fld1\n" - " fldpi\n" - " fldln2\n" - " fxsave %0\n" - " fxrstor %0\n" - " fxsave %1\n" - " fninit\n" - : "=3Dm" (*(uint32_t *)fp2), "=3Dm" (*(uint32_t *)fp) - : "m" (a), "m" (b)); - printf("fpuc=3D%04x\n", fp->fpuc); - printf("fpus=3D%04x\n", fp->fpus); - printf("fptag=3D%04x\n", fp->fptag); - for(i =3D 0; i < 3; i++) { - printf("ST%d: " FMT64X " %04x\n", - i, - *(uint64_t *)&fp->fpregs1[i * 16], - *(uint16_t *)&fp->fpregs1[i * 16 + 8]); - } - printf("mxcsr=3D%08x\n", fp->mxcsr & 0x1f80); -#if defined(__x86_64__) - nb_xmm =3D 16; -#else - nb_xmm =3D 8; -#endif - for(i =3D 0; i < nb_xmm; i++) { - printf("xmm%d: " FMT64X "" FMT64X "\n", - i, - *(uint64_t *)&fp->xmm_regs[i * 16], - *(uint64_t *)&fp->xmm_regs[i * 16 + 8]); - } -} - -void test_sse(void) -{ - XMMReg r, a, b; - int i; - - MMX_OP2(punpcklbw); - MMX_OP2(punpcklwd); - MMX_OP2(punpckldq); - MMX_OP2(packsswb); - MMX_OP2(pcmpgtb); - MMX_OP2(pcmpgtw); - MMX_OP2(pcmpgtd); - MMX_OP2(packuswb); - MMX_OP2(punpckhbw); - MMX_OP2(punpckhwd); - MMX_OP2(punpckhdq); - MMX_OP2(packssdw); - MMX_OP2(pcmpeqb); - MMX_OP2(pcmpeqw); - MMX_OP2(pcmpeqd); - - MMX_OP2(paddq); - MMX_OP2(pmullw); - MMX_OP2(psubusb); - MMX_OP2(psubusw); - MMX_OP2(pminub); - MMX_OP2(pand); - MMX_OP2(paddusb); - MMX_OP2(paddusw); - MMX_OP2(pmaxub); - MMX_OP2(pandn); - - MMX_OP2(pmulhuw); - MMX_OP2(pmulhw); - - MMX_OP2(psubsb); - MMX_OP2(psubsw); - MMX_OP2(pminsw); - MMX_OP2(por); - MMX_OP2(paddsb); - MMX_OP2(paddsw); - MMX_OP2(pmaxsw); - MMX_OP2(pxor); - MMX_OP2(pmuludq); - MMX_OP2(pmaddwd); - MMX_OP2(psadbw); - MMX_OP2(psubb); - MMX_OP2(psubw); - MMX_OP2(psubd); - MMX_OP2(psubq); - MMX_OP2(paddb); - MMX_OP2(paddw); - MMX_OP2(paddd); - - MMX_OP2(pavgb); - MMX_OP2(pavgw); - - asm volatile ("pinsrw $1, %1, %0" : "=3Dy" (r.q[0]) : "r" (0x12345678)= ); - printf("%-9s: r=3D" FMT64X "\n", "pinsrw", r.q[0]); - - asm volatile ("pinsrw $5, %1, %0" : "=3Dx" (r.dq) : "r" (0x12345678)); - printf("%-9s: r=3D" FMT64X "" FMT64X "\n", "pinsrw", r.q[1], r.q[0]); - - a.q[0] =3D test_values[0][0]; - a.q[1] =3D test_values[0][1]; - asm volatile ("pextrw $1, %1, %0" : "=3Dr" (r.l[0]) : "y" (a.q[0])); - printf("%-9s: r=3D%08x\n", "pextrw", r.l[0]); - - asm volatile ("pextrw $5, %1, %0" : "=3Dr" (r.l[0]) : "x" (a.dq)); - printf("%-9s: r=3D%08x\n", "pextrw", r.l[0]); - - asm volatile ("pmovmskb %1, %0" : "=3Dr" (r.l[0]) : "y" (a.q[0])); - printf("%-9s: r=3D%08x\n", "pmovmskb", r.l[0]); - - asm volatile ("pmovmskb %1, %0" : "=3Dr" (r.l[0]) : "x" (a.dq)); - printf("%-9s: r=3D%08x\n", "pmovmskb", r.l[0]); - - { - r.q[0] =3D -1; - r.q[1] =3D -1; - - a.q[0] =3D test_values[0][0]; - a.q[1] =3D test_values[0][1]; - b.q[0] =3D test_values[1][0]; - b.q[1] =3D test_values[1][1]; - asm volatile("maskmovq %1, %0" : - : "y" (a.q[0]), "y" (b.q[0]), "D" (&r) - : "memory"); - printf("%-9s: r=3D" FMT64X " a=3D" FMT64X " b=3D" FMT64X "\n", - "maskmov", - r.q[0], - a.q[0], - b.q[0]); - asm volatile("maskmovdqu %1, %0" : - : "x" (a.dq), "x" (b.dq), "D" (&r) - : "memory"); - printf("%-9s: r=3D" FMT64X "" FMT64X " a=3D" FMT64X "" FMT64X " b= =3D" FMT64X "" FMT64X "\n", - "maskmov", - r.q[1], r.q[0], - a.q[1], a.q[0], - b.q[1], b.q[0]); - } - - asm volatile ("emms"); - - SSE_OP2(punpcklqdq); - SSE_OP2(punpckhqdq); - SSE_OP2(andps); - SSE_OP2(andpd); - SSE_OP2(andnps); - SSE_OP2(andnpd); - SSE_OP2(orps); - SSE_OP2(orpd); - SSE_OP2(xorps); - SSE_OP2(xorpd); - - SSE_OP2(unpcklps); - SSE_OP2(unpcklpd); - SSE_OP2(unpckhps); - SSE_OP2(unpckhpd); - - SHUF_OP(shufps, 0x78); - SHUF_OP(shufpd, 0x02); - - PSHUF_OP(pshufd, 0x78); - PSHUF_OP(pshuflw, 0x78); - PSHUF_OP(pshufhw, 0x78); - - SHIFT_OP(psrlw, 7); - SHIFT_OP(psrlw, 16); - SHIFT_OP(psraw, 7); - SHIFT_OP(psraw, 16); - SHIFT_OP(psllw, 7); - SHIFT_OP(psllw, 16); - - SHIFT_OP(psrld, 7); - SHIFT_OP(psrld, 32); - SHIFT_OP(psrad, 7); - SHIFT_OP(psrad, 32); - SHIFT_OP(pslld, 7); - SHIFT_OP(pslld, 32); - - SHIFT_OP(psrlq, 7); - SHIFT_OP(psrlq, 32); - SHIFT_OP(psllq, 7); - SHIFT_OP(psllq, 32); - - SHIFT_IM(psrldq, 16); - SHIFT_IM(psrldq, 7); - SHIFT_IM(pslldq, 16); - SHIFT_IM(pslldq, 7); - - MOVMSK(movmskps); - MOVMSK(movmskpd); - - /* FPU specific ops */ - - { - uint32_t mxcsr; - asm volatile("stmxcsr %0" : "=3Dm" (mxcsr)); - printf("mxcsr=3D%08x\n", mxcsr & 0x1f80); - asm volatile("ldmxcsr %0" : : "m" (mxcsr)); - } - - test_sse_comi(2, -1); - test_sse_comi(2, 2); - test_sse_comi(2, 3); - test_sse_comi(2, q_nan.d); - test_sse_comi(q_nan.d, -1); - - for(i =3D 0; i < 2; i++) { - a.s[0] =3D 2.7; - a.s[1] =3D 3.4; - a.s[2] =3D 4; - a.s[3] =3D -6.3; - b.s[0] =3D 45.7; - b.s[1] =3D 353.4; - b.s[2] =3D 4; - b.s[3] =3D 56.3; - if (i =3D=3D 1) { - a.s[0] =3D q_nan.d; - b.s[3] =3D q_nan.d; - } - - SSE_OPS(add); - SSE_OPS(mul); - SSE_OPS(sub); - SSE_OPS(min); - SSE_OPS(div); - SSE_OPS(max); - SSE_OPS(sqrt); - SSE_OPS(cmpeq); - SSE_OPS(cmplt); - SSE_OPS(cmple); - SSE_OPS(cmpunord); - SSE_OPS(cmpneq); - SSE_OPS(cmpnlt); - SSE_OPS(cmpnle); - SSE_OPS(cmpord); - - - a.d[0] =3D 2.7; - a.d[1] =3D -3.4; - b.d[0] =3D 45.7; - b.d[1] =3D -53.4; - if (i =3D=3D 1) { - a.d[0] =3D q_nan.d; - b.d[1] =3D q_nan.d; - } - SSE_OPD(add); - SSE_OPD(mul); - SSE_OPD(sub); - SSE_OPD(min); - SSE_OPD(div); - SSE_OPD(max); - SSE_OPD(sqrt); - SSE_OPD(cmpeq); - SSE_OPD(cmplt); - SSE_OPD(cmple); - SSE_OPD(cmpunord); - SSE_OPD(cmpneq); - SSE_OPD(cmpnlt); - SSE_OPD(cmpnle); - SSE_OPD(cmpord); - } - - /* float to float/int */ - a.s[0] =3D 2.7; - a.s[1] =3D 3.4; - a.s[2] =3D 4; - a.s[3] =3D -6.3; - CVT_OP_XMM(cvtps2pd); - CVT_OP_XMM(cvtss2sd); - CVT_OP_XMM2MMX(cvtps2pi); - CVT_OP_XMM2MMX(cvttps2pi); - CVT_OP_XMM2REG(cvtss2si); - CVT_OP_XMM2REG(cvttss2si); - CVT_OP_XMM(cvtps2dq); - CVT_OP_XMM(cvttps2dq); - - a.d[0] =3D 2.6; - a.d[1] =3D -3.4; - CVT_OP_XMM(cvtpd2ps); - CVT_OP_XMM(cvtsd2ss); - CVT_OP_XMM2MMX(cvtpd2pi); - CVT_OP_XMM2MMX(cvttpd2pi); - CVT_OP_XMM2REG(cvtsd2si); - CVT_OP_XMM2REG(cvttsd2si); - CVT_OP_XMM(cvtpd2dq); - CVT_OP_XMM(cvttpd2dq); - - /* sse/mmx moves */ - CVT_OP_XMM2MMX(movdq2q); - CVT_OP_MMX2XMM(movq2dq); - - /* int to float */ - a.l[0] =3D -6; - a.l[1] =3D 2; - a.l[2] =3D 100; - a.l[3] =3D -60000; - CVT_OP_MMX2XMM(cvtpi2ps); - CVT_OP_MMX2XMM(cvtpi2pd); - CVT_OP_REG2XMM(cvtsi2ss); - CVT_OP_REG2XMM(cvtsi2sd); - CVT_OP_XMM(cvtdq2ps); - CVT_OP_XMM(cvtdq2pd); - - /* XXX: test PNI insns */ -#if 0 - SSE_OP2(movshdup); -#endif - asm volatile ("emms"); -} - -#endif - #define TEST_CONV_RAX(op)\ {\ unsigned long a, r;\ @@ -2756,9 +2187,5 @@ int main(int argc, char **argv) #endif test_enter(); test_conv(); -#ifdef TEST_SSE - test_sse(); - test_fxsave(); -#endif return 0; } --=20 2.37.2