From patchwork Tue Nov 7 13:07:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 162453 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:aa0b:0:b0:403:3b70:6f57 with SMTP id k11csp220080vqo; Tue, 7 Nov 2023 05:07:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IHyS2jtpVVicoErYlFyid0vljef/M0mBkD/9qMSjXLpNKJrSGCaNqeoy32WEi2KiMjk8VZF X-Received: by 2002:a05:6102:1624:b0:45f:3fb2:3bd3 with SMTP id cu36-20020a056102162400b0045f3fb23bd3mr4588611vsb.0.1699362479133; Tue, 07 Nov 2023 05:07:59 -0800 (PST) ARC-Seal: i=3; a=rsa-sha256; t=1699362479; cv=pass; d=google.com; s=arc-20160816; b=HsPI5EITEub4HP4wDKUfbyxwtPXmWPo9/guzgZS8+JVi3cSInHe6MYwapWKcF94xwy nHdfhN5sWXv1D2/UZryUYRXk7nEQiCtjAbJd0mWr2N/KIrfB8PYAd8jzcRE3x+DdbXYk WxorSybj8R51FnVfZN2pPsUlr9pnIkY/3XdahyJmGVCRty1UO38nWbnWy03RNr1VLQlf HDERhQzAtBL634T0iwNhXRYyYdvDMkCQ4hy7JrqLo4MRv4Lyp2MGq4+JQxtsXmvBmqAY dW3Ojlw32x4NuXEtvFo0vPmjMkm0wMpYbt9tetAhbY7y6vNFte/A7Pja1Dvq3Mo73k4d /FXA== ARC-Message-Signature: i=3; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mime-version :content-transfer-encoding:in-reply-to:references:cc:to:from :content-language:subject:user-agent:date:message-id:dkim-signature :arc-filter:dmarc-filter:delivered-to; bh=1wolWFh8RFpWGB7JGmb4ehbCVeHVzcBm3K7skZFbhLg=; fh=2DbSPqOhyO7CNtGa024QKgSiHKlKGVt2h+1rlgWLnZI=; b=U7szC8n7rJnlEUvlIXRkkW/K8QfKo/ksUe1R5V66bn31OGqkz0c0lIcyEhQ2VYIwbM rrSY2t+fCQURw+IENNX8iUcpEUMvp/LOBW/SIQAMt278x3Ah/7i5a1UbRLlaGzgDB6GJ 6fbAHoaFKWIEIh0Cv3f6LMgRUNo92WBQXxq+pA0PVXoHaaDXxe8HkPct/xnClhRxHmNa ZxEehmlrU3xouVWAw7RBrISYmOetV2gn4NoNdLavTf02PI1KDYP0Vkyf3lbzCcxt/Wkv uH9ff9C7chiHiDU26D0s01l68F/B20WGDEhWdXoY+wIYAAKmHJWOOnZSCAaLwcuMG0HD yFaw== ARC-Authentication-Results: i=3; mx.google.com; dkim=pass header.i=@suse.com header.s=selector1 header.b="IL/a6USF"; arc=pass (i=2); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=suse.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id y10-20020a67e8ca000000b0045277959e5csi996854vsn.588.2023.11.07.05.07.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Nov 2023 05:07:59 -0800 (PST) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.com header.s=selector1 header.b="IL/a6USF"; arc=pass (i=2); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=suse.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D970A3858422 for ; Tue, 7 Nov 2023 13:07:58 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2067.outbound.protection.outlook.com [40.107.21.67]) by sourceware.org (Postfix) with ESMTPS id 63CDF3858CDB for ; Tue, 7 Nov 2023 13:07:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 63CDF3858CDB Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 63CDF3858CDB Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.21.67 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1699362474; cv=pass; b=n92wsmmZu98hWFd4RnMvKk6HFRpyDXg3kmK6Qs2CeY6/p87LOMlp93aLX6GmZRkXiiTRvofkdwOWhD7txf8ahpu7lD9nxr/9ZJS2RcNUxS8LfH9hYQLAOSA3onKr7N6BnvHb4zjkuA7vF7bkmxaS+mVcpSOlR3rFvIjoGdj2Z7c= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1699362474; c=relaxed/simple; bh=0ufmKGfp5nV/LdWlPqcgKoRAk+c47/MIMPCGye0894E=; h=DKIM-Signature:Message-ID:Date:Subject:From:To:MIME-Version; b=WisLSaojRq5/BqVRbUDYqgOwueaze/wdiqzoCVzmpkme8LN9u7uINcYyCssVkCH/gAREUHHQsq20RVWnox1Rhc267lUhzgoLLeXA/slMc1HB2vmIBMin8eiyQCY7GbHkQ/NspY4P4cK5bklbR3lDYZZiEXllXJp68te416kq/H8= ARC-Authentication-Results: i=2; server2.sourceware.org ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kw4KVu3w/aLZxpX/KTibovD1N4ReWa+ohl3lBNAsrSkBms19TDZRu7Gyb6na6g/fbSpr3C6oMkSu3/GjH8ONyVVlo0nglut53eTH0HKeVgX3O5dOnlfKmgzRKQ/eIabyeRvh7YIymgvuo8X8XRvyO7ceLjb3/DzZ7YixGSNh0N7KtK8ESyX5o+WBm9j3cLQwH5zRgFw+DMlFPnO4HuaaacrhmB49ApDn4fX/Wb5bQpECtOKRPYbnJpz7OPCIxlhVtAuZJyqFF94u8UaV+T93yq9oqgi6ujlHwK24+pS9LX5rz2NXbQia4NG8wtz5ryRqbho74Ykf+Hw38wU1PajMvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1wolWFh8RFpWGB7JGmb4ehbCVeHVzcBm3K7skZFbhLg=; b=WPjxt4J8RteiaRbtUv7WgFLgcnv6pNR14DeQ9KXjFM7YlP25P6YFxDAcKVnFBFiAokH6a7MGlmiL4qPbMRhJ916DCvKLW7wF0hkZzCiz/bbsyEt6f6ClvCm8fTSMh6e07/IVcq/hCiMBa/4DtzmRe0IAwu82dV9WV7Wzq8jDB6oSaqDCKIDCCEqES/snA/tM7JVnu38vF/uRCcIaKxkVUrBlJNQOU8VbEGxiUx/wIDMgcHI/uQecUwCqpTKb6BNQhIjkK2Eityoi+RNjio0qhIP1vXuKeXgnQkO3i3EFg5HWNzUqVMSVnq7cxuJPys2VzIGuSSEMA0evnxoWcdNNPA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1wolWFh8RFpWGB7JGmb4ehbCVeHVzcBm3K7skZFbhLg=; b=IL/a6USFSs+zt4dIPnzMvc0dPNdna5zXzTUPD42y5pOl1juGHT5DF3jrZTMnX6IOdjCSTKMYDc0zg+saY6hi76GW3eSIIVNWuNS2tJYZpSZPhX/teIPqRzTIsi6NPOI5MbYHroy2IzcdyL+aczPu1qOFTxenNuPBV8GmY5U/zKxRAf98JxU/S2uBTMtr8rIubKjXmfE+N2TkhzIB/KJk6YQtWuPYgYySb1NW7MFlDahpS7tyIKFc0DPWFiwywq69DS+valeB+x7U7dX0qC69HZ4ffIrAHNv838elz6SGTDsRJ0kXjYKEooaorGmafJSjGDuTRc0egjeaS5wV+gwDOA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Received: from DU2PR04MB8790.eurprd04.prod.outlook.com (2603:10a6:10:2e1::23) by PAXPR04MB8797.eurprd04.prod.outlook.com (2603:10a6:102:20c::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.16; Tue, 7 Nov 2023 13:07:48 +0000 Received: from DU2PR04MB8790.eurprd04.prod.outlook.com ([fe80::eb8e:fa24:44c1:5d44]) by DU2PR04MB8790.eurprd04.prod.outlook.com ([fe80::eb8e:fa24:44c1:5d44%3]) with mapi id 15.20.6977.017; Tue, 7 Nov 2023 13:07:48 +0000 Message-ID: Date: Tue, 7 Nov 2023 14:07:46 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.15.1 Subject: [PATCH v3 1/2] x86: Cpu64 handling improvements Content-Language: en-US From: Jan Beulich To: Binutils Cc: "H.J. Lu" , Lili Cui References: In-Reply-To: X-ClientProxiedBy: FR0P281CA0103.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a9::16) To DU2PR04MB8790.eurprd04.prod.outlook.com (2603:10a6:10:2e1::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PR04MB8790:EE_|PAXPR04MB8797:EE_ X-MS-Office365-Filtering-Correlation-Id: 4986b4a2-acdc-4aca-da31-08dbdf928a42 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: HO0UtpgH9Mf2Dy1Wl66cH38wyjudTe0vSjXNUHlaKAsSho3dF2iVyepEwdJEDjxf1I6jozeNDeibcFjnRwZL05GpF413znx4e4xc0vlhpfx1nbN/cD8QkOIsdydjhypfgDV8E6beg8J958+3UPFKqAiqqEoxlP6vOLUTk1BTR16KYJ4ndWtMEXnMhhXDhpnPHIPX9I9gu5hMMkGqFZskrwyI3H6A5enXVYTTRLUaBZ45QNZsKr/OVV67/bfOUUZmNWW2mOJLJxWaxNLEz2Nd6EuxOQMW+wUkt56+BJOfXrdDp43r3Mkzm7w+Jh/3LIqoFzTeX7IrVuM8Xx6NRTM+oLUDK/faBAVU8vQMtaVfq3aivc/pH3aK5eVTjvBWNLa5DyxvyZLfnakFah9I6XGjG4Tj8ZaEkZFTnN4AKjB52ZTddj1xZovTtue7n7bQhF4/tL1SKxm3VKqUTqwRb4q3sICVTvft7vVvJv4EYgACW6KTT/NTi0Jfp60sulN+2pVqhJ3bw2TBvmemcw++mJZQMRU2ls3wu7DMApvI0hF6iqCu6KpncAWVJk8KXRSEOqy4I+k1GVcN1XIzfqNnuKfOQxTY4oemY4DdzszdPCvRDUpsNSD2qtkp7msc+Rb2Aa0d+eJvFi72pObjlU+eQ8rFig== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DU2PR04MB8790.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(346002)(39860400002)(396003)(136003)(376002)(366004)(230922051799003)(64100799003)(451199024)(1800799009)(186009)(66899024)(31686004)(26005)(2616005)(6506007)(41300700001)(6512007)(38100700002)(36756003)(86362001)(31696002)(6486002)(5660300002)(2906002)(66946007)(83380400001)(4326008)(8936002)(8676002)(30864003)(66556008)(6916009)(66476007)(478600001)(316002)(54906003)(43740500002)(45980500001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?GMAm6t6jPWlSbKHa+IpnqWmkFJI4?= =?utf-8?q?0hnq0Y7+nzewhEVXk8BMydCQryfAg+gXHSHI+RMVaRQo67wdEnScHTCAr6hkd1ve5?= =?utf-8?q?MOK+YD9ixfDp8r9L8XINWkAq+gpH5pu/l5N+5dF5eIRSnVzhEAYxjGwYT8Qu0XRzM?= =?utf-8?q?IKsaRxCXSUoKHBrW6z3ChKgtjnHs8j0y03nYzuF5LG7fI5BMm+3S6UIPzTXTiENwA?= =?utf-8?q?+aM7YCJB2pCNMaDKJ+ij6eHc7fu3b/bvIq/hhMayYgoLWwa/K9K42VaCGeiKH/gO1?= =?utf-8?q?DRARJr36nn6yNuyGwRYyboAaIZ9iSRSJGwKksocgrJud3hGrxFzhMkM64cMx+agkP?= =?utf-8?q?+0DcvPOOZ4TGXE0JojHgCZru0ht92x2X/WjkhHJq2QQ0JjbXjX0b+lwjkpymO56iz?= =?utf-8?q?VzzTEQh2mwmYKXqm6d4vmFfZe3mQZ8iY9RLodE/ky9hNOLPrAQjxVJj35gdJ8RzuE?= =?utf-8?q?HKrZ7QpcmJNcvDYWNAQsW2FCnX9fhvUwJtB5nLWZ9DQRUsXXSYhiHpSrWdmFBsCHU?= =?utf-8?q?UvZOIEY9eq1JsD2sHLQuuyR4OCHqPz7P8LnzybmNtq7eqstxeZn+pYsv++wVq55iL?= =?utf-8?q?VgZVdhoxXl3t+QBJyFBFQly13PUce3BLaT7EUXYfjMjqRwVhJQbEytmoru9bgSxe6?= =?utf-8?q?c6cisFL4vrFtaHv8Nj7viP82zR2ClLcDzXevkdwriaySyuF1HvRj3S2IJSEBq3o95?= =?utf-8?q?tIVh3F/pMAV+DbQIRJ7ZcWb0060kgr3lqxIvbPrFb5Nx49wI2G84Rm04iKaXMh7xn?= =?utf-8?q?CtYIljTrgyVkSpXGfdfYZ6vYgSKxuGUbVqfOkTwA0QWpfKGQWl6J2rirJIWfXeCGJ?= =?utf-8?q?wj86Pd2y/NoECYToSdIbKqSZ8Jv5Kgfn94lWZDZFU6mRl7pTao0hgOdtWKHEfApd1?= =?utf-8?q?FvYVLAxnMvUQ1+Jtz0YAQsByLWdhmhxD+PEXHj1aryQRNWLTXOHitjdK/RQy1Yt+9?= =?utf-8?q?nBcvM4q2jaF/8i4sb/T+q060a1C0pZ+goXY4JI4xDvqqp52DyMIUp9VMyKQiGY9xz?= =?utf-8?q?2qvgJYEwHmw6eM8hHj7usbuZHzdeqS7q5zXKUzcF5R+m8Y81V+9AzaWzyqFa1kPdi?= =?utf-8?q?J6PsLLteWbGHHpPejRhbesz6gfoay3j0cXsH5HOlQTPspHcjjfG/lkU9Byehv/aRi?= =?utf-8?q?7QPm/deDd6nnamVbvQrIvCQHndv0LcVYQSUFSZG97+fLuUfOhJBkxWiS8CCKcWnTN?= =?utf-8?q?plrRo2BsdAbtT3F3FlBu0c2nvqzjdi2vVUPUIEGXSjulWEGZw+y7gHXnFVDsi5WdL?= =?utf-8?q?0D5FqjU7AUlRDG1p3Xf9gkAxkx2c0vxpBOFjWUj7wbH7i0tubcsRngDweEvyS+Kz6?= =?utf-8?q?iu+cc3XCB5HTWRA+MrYItoQlZ4rYwYp0mmEh4XUGzSAF+ZD3hCbG3w41Onwk3MVrT?= =?utf-8?q?2xnD2QZ2AOICK/bESy7k5t4VjyvkbqEtVRlQgsGmHF5E4CvMBLUJi9ujG2MaPJCkv?= =?utf-8?q?CuKs2y9zScZGho2d0lmaeWZfTx22ieb0l7DJRKiu0Z+XrDujAuGuhMehvCFz4QUNV?= =?utf-8?q?YBZSvMDoWXUW?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4986b4a2-acdc-4aca-da31-08dbdf928a42 X-MS-Exchange-CrossTenant-AuthSource: DU2PR04MB8790.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Nov 2023 13:07:48.2053 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: o0FwtvXibzMtAbbBamSs8jZ9dN4sCVkqoSV5sHxwqIZjJr8p8BocFaTV4MG1AXRoR4kxaqHnb322npffOsKnfg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8797 X-Spam-Status: No, score=-3026.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781910711070119587 X-GMAIL-MSGID: 1781910711070119587 First of all we want to also accumulate its reverse dependencies, such that we can use them in cpu_flags_match(). This is in particular in preparation of APX additions, such that e.g. BMI VEX-encoding templates can become combined VEX/EVEX ones. Once we have the reverse dependencies, we can further leverage them to omit explicit "&x64" from any insn templates dealing with 64-bit-mode- only ISA extensions. Besides helping readability for several insn templates we already have, this will also help with what is going to be added for APX (as all of the new templates would otherwise need to have "&x64"). Note that rather than leaving a meaningless CPU_64_FLAGS (which is unused anyway), its emitting is now also suppressed. --- The new "active" local variable is initialized based on just flag_code. cpu_flags_match() being a relatively hot path may want us to consider introducing yet another global instead, which would be updated whenever a .code directive is processed. --- v3: New. --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -804,6 +804,9 @@ static char *cpu_sub_arch_name = NULL; /* CPU feature flags. */ i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS; +/* ISA extensions available in 64-bit mode only. */ +static const i386_cpu_flags cpu_64_flags = CPU_ANY_64_FLAGS; + /* If we have selected a cpu we are generating instructions for. */ static int cpu_arch_tune_set = 0; @@ -1874,7 +1877,12 @@ cpu_flags_match (const insn_template *t) else { /* This instruction is available only on some archs. */ - i386_cpu_flags cpu = cpu_arch_flags; + i386_cpu_flags active, cpu; + + if (flag_code != CODE_64BIT) + active = cpu_flags_and_not (cpu_arch_flags, cpu_64_flags); + else + active = cpu_arch_flags; /* Dual VEX/EVEX templates may need stripping of one of the flags. */ if (t->opcode_modifier.vex && t->opcode_modifier.evex) @@ -1895,14 +1903,14 @@ cpu_flags_match (const insn_template *t) { x.bitfield.cpuavx512f = 0; x.bitfield.cpuavx512vl = 0; - if (x.bitfield.cpufma && !cpu.bitfield.cpufma) + if (x.bitfield.cpufma && !active.bitfield.cpufma) x.bitfield.cpuavx = 0; } } } /* AVX512VL is no standalone feature - match it and then strip it. */ - if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl) + if (x.bitfield.cpuavx512vl && !active.bitfield.cpuavx512vl) return match; x.bitfield.cpuavx512vl = 0; @@ -1912,7 +1920,7 @@ cpu_flags_match (const insn_template *t) if (x.bitfield.cpuavx && x.bitfield.cpuavx2) x.bitfield.cpuavx2 = 0; - cpu = cpu_flags_and (x, cpu); + cpu = cpu_flags_and (x, active); if (!cpu_flags_all_zero (&cpu)) { if (t->cpu.bitfield.cpuavx && t->cpu.bitfield.cpuavx512f) @@ -1921,7 +1929,7 @@ cpu_flags_match (const insn_template *t) ? cpu.bitfield.cpuavx512f : cpu.bitfield.cpuavx) && (!x.bitfield.cpufma || cpu.bitfield.cpufma - || cpu_arch_flags.bitfield.cpuavx512f) + || active.bitfield.cpuavx512f) && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni) && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes) && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq)) --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -166,6 +166,10 @@ static const dependency isa_dependencies "AVX2" }, { "AVX_NE_CONVERT", "AVX2" }, + { "CX16", + "64" }, + { "LKGS", + "64" }, { "FRED", "LKGS" }, { "AVX512F", @@ -240,13 +244,13 @@ static const dependency isa_dependencies { "SNP", "SEV_ES" }, { "RMPQUERY", - "SNP" }, + "SNP|64" }, { "TSX", "RTM|HLE" }, { "TSXLDTRK", "RTM" }, { "AMX_TILE", - "XSAVE" }, + "XSAVE|64" }, { "AMX_INT8", "AMX_TILE" }, { "AMX_BF16", @@ -259,6 +263,18 @@ static const dependency isa_dependencies "SSE2" }, { "WIDEKL", "KL" }, + { "PBNDKB", + "64" }, + { "UINTR", + "64" }, + { "PREFETCHI", + "64" }, + { "CMPCCXADD", + "64" }, + { "MSRLIST", + "64" }, + { "USER_MSR", + "64" }, }; /* This array is populated as process_i386_initializers() walks cpu_flags[]. */ @@ -772,8 +788,10 @@ add_isa_dependencies (bitfield *flags, c } free (deps); - /* ISA extensions with dependencies need CPU_ANY_*_FLAGS emitted. */ - if (reverse < ARRAY_SIZE (isa_reverse_deps[0])) + /* ISA extensions with dependencies need CPU_ANY_*_FLAGS emitted, + unless the sole dependency is the "64-bit mode only" one. */ + if (reverse < ARRAY_SIZE (isa_reverse_deps[0]) + && strcmp (isa_dependencies[i].deps, "64")) isa_reverse_deps[reverse][reverse] = 1; is_avx = orig_is_avx; @@ -919,6 +937,15 @@ process_i386_cpu_flag (FILE *table, char size_t len = strlen (name); char *upper = xmalloc (len + 1); + /* Cpu64 is special: It specifies a mode dependency, not an ISA one. Zap + the flag from ISA initializer macros (and from CPU_ANY_64_FLAGS + itself we only care about tracking its dependents. Also don't emit the + (otherwise all zero) CPU_64_FLAGS. */ + if (flag != NULL && reverse == Cpu64) + return; + if (is_isa || flag == NULL) + flags[Cpu64].value = 0; + for (i = 0; i < len; ++i) { /* Don't emit #define-s for auxiliary entries. */ @@ -931,6 +958,14 @@ process_i386_cpu_flag (FILE *table, char flag != NULL ? "": "ANY_", upper); free (upper); } + else + { + /* Synthesize "64-bit mode only" dependencies from the dependencies we + have accumulated. */ + for (i = 0; i < ARRAY_SIZE (isa_reverse_deps[0]); ++i) + if (flags[i].value && isa_reverse_deps[Cpu64][i]) + flags[Cpu64].value = 1; + } output_cpu_flags (table, flags, ARRAY_SIZE (flags), name != NULL, comma, indent, lineno); @@ -2142,6 +2177,8 @@ main (int argc, char **argv) qsort (operand_types, ARRAY_SIZE (operand_types), sizeof (operand_types [0]), compare); + process_i386_initializers (); + table = fopen ("i386-tbl.h", "w"); if (table == NULL) fail ("can't create i386-tbl.h, errno = %s\n", @@ -2151,7 +2188,6 @@ main (int argc, char **argv) process_i386_opcodes (table); process_i386_registers (table); - process_i386_initializers (); fclose (table); --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -158,6 +158,8 @@ #define i287 287 #define i387 387 #define i687 687 +// Note: Don't add this one to any templates already specifying a 64-bit-mode- +// only ISA extension: i386-gen takes care of adding such dependencies. #define x64 64 ### MARKER ### @@ -1273,7 +1275,7 @@ fisttpll, 0xdd/1, FISTTP, Modrm|NoSuf|AT // CMPXCHG16B instruction. -cmpxchg16b, 0xfc7/1, CX16|x64, Modrm|NoSuf|Size64|LockPrefixOk, { Oword|Unspecified|BaseIndex } +cmpxchg16b, 0xfc7/1, CX16, Modrm|NoSuf|Size64|LockPrefixOk, { Oword|Unspecified|BaseIndex } // MONITOR instructions. @@ -3013,7 +3015,7 @@ pconfig, 0x0f01c5, PCONFIG, NoSuf, {} // PBNDKB instruction. -pbndkb, 0x0f01c7, PBNDKB|x64, NoSuf, {} +pbndkb, 0x0f01c7, PBNDKB, NoSuf, {} // PBNDKB instruction end. @@ -3100,8 +3102,8 @@ rmpadjust, 0xf30f01fe, SNP|x64, AddrPref // RMPQUERY instruction -rmpquery, 0xf30f01fd, RMPQUERY|x64, NoSuf, {} -rmpquery, 0xf30f01fd, RMPQUERY|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } +rmpquery, 0xf30f01fd, RMPQUERY, NoSuf, {} +rmpquery, 0xf30f01fd, RMPQUERY, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } // RMPQUERY instruction end @@ -3126,26 +3128,26 @@ xresldtrk, 0xf20f01e9, TSXLDTRK, NoSuf, // AMX instructions. -ldtilecfg, 0x49/0, AMX_TILE|x64, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } -sttilecfg, 0x6649/0, AMX_TILE|x64, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } +ldtilecfg, 0x49/0, AMX_TILE, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } +sttilecfg, 0x6649/0, AMX_TILE, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } -tcmmimfp16ps, 0x666c, AMX_COMPLEX|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tcmmrlfp16ps, 0x6c, AMX_COMPLEX|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tcmmimfp16ps, 0x666c, AMX_COMPLEX, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tcmmrlfp16ps, 0x6c, AMX_COMPLEX, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tdpbf16ps, 0xf35c, AMX_BF16|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tdpfp16ps, 0xf25c, AMX_FP16|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tdpbssd, 0xf25e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tdpbuud, 0x5e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tdpbusd, 0x665e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -tdpbsud, 0xf35e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } - -tileloadd, 0xf24b, AMX_TILE|x64, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } -tileloaddt1, 0x664b, AMX_TILE|x64, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } -tilestored, 0xf34b, AMX_TILE|x64, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { RegTMM, Unspecified|BaseIndex } +tdpbf16ps, 0xf35c, AMX_BF16, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tdpfp16ps, 0xf25c, AMX_FP16, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tdpbssd, 0xf25e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tdpbuud, 0x5e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tdpbusd, 0x665e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } +tdpbsud, 0xf35e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } + +tileloadd, 0xf24b, AMX_TILE, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } +tileloaddt1, 0x664b, AMX_TILE, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } +tilestored, 0xf34b, AMX_TILE, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { RegTMM, Unspecified|BaseIndex } -tilerelease, 0x49c0, AMX_TILE|x64, Vex128|Space0F38|VexW0|NoSuf, {} +tilerelease, 0x49c0, AMX_TILE, Vex128|Space0F38|VexW0|NoSuf, {} -tilezero, 0xf249, AMX_TILE|x64, Modrm|Vex128|Space0F38|VexW0|NoSuf, { RegTMM } +tilezero, 0xf249, AMX_TILE, Modrm|Vex128|Space0F38|VexW0|NoSuf, { RegTMM } // AMX instructions end. @@ -3176,11 +3178,11 @@ seamcall, 0x660f01cf, TDX|x64, NoSuf, {} // UINTR instructions. -uiret, 0xf30f01ec, UINTR|x64, NoSuf, {} -clui, 0xf30f01ee, UINTR|x64, NoSuf, {} -stui, 0xf30f01ef, UINTR|x64, NoSuf, {} -testui, 0xf30f01ed, UINTR|x64, NoSuf, {} -senduipi, 0xf30fc7/6, UINTR|x64, Modrm|NoSuf|NoRex64, { Reg64 } +uiret, 0xf30f01ec, UINTR, NoSuf, {} +clui, 0xf30f01ee, UINTR, NoSuf, {} +stui, 0xf30f01ef, UINTR, NoSuf, {} +testui, 0xf30f01ed, UINTR, NoSuf, {} +senduipi, 0xf30fc7/6, UINTR, Modrm|NoSuf|NoRex64, { Reg64 } // UINTR instructions end. @@ -3302,14 +3304,14 @@ vrsqrtsh, 0x664f, AVX512_FP16, Modrm|EVe // PREFETCHI instructions. -prefetchit0, 0xf18/7, PREFETCHI|x64, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } -prefetchit1, 0xf18/6, PREFETCHI|x64, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } +prefetchit0, 0xf18/7, PREFETCHI, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } +prefetchit1, 0xf18/6, PREFETCHI, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } // PREFETCHI instructions end. // CMPCCXADD instructions. -cmpxadd, 0x66e, CMPCCXADD|x64, Modrm|Vex|Space0F38|VexVVVV|SwapSources|CheckOperandSize|NoSuf, { Reg32|Reg64, Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } +cmpxadd, 0x66e, CMPCCXADD, Modrm|Vex|Space0F38|VexVVVV|SwapSources|CheckOperandSize|NoSuf, { Reg32|Reg64, Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } // CMPCCXADD instructions end. @@ -3321,8 +3323,8 @@ wrmsrns, 0x0f01c6, WRMSRNS, NoSuf, {} // MSRLIST instructions. -rdmsrlist, 0xf20f01c6, MSRLIST|x64, NoSuf, {} -wrmsrlist, 0xf30f01c6, MSRLIST|x64, NoSuf, {} +rdmsrlist, 0xf20f01c6, MSRLIST, NoSuf, {} +wrmsrlist, 0xf30f01c6, MSRLIST, NoSuf, {} // MSRLIST instructions end. @@ -3337,23 +3339,23 @@ axor, 0xf30f38fc, RAO_INT, Modrm|IgnoreS // LKGS instruction. -lkgs, 0xf20f00/6, LKGS|x64, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } -lkgs, 0xf20f00/6, LKGS|x64, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } +lkgs, 0xf20f00/6, LKGS, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } +lkgs, 0xf20f00/6, LKGS, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } // LKGS instruction end. // FRED instructions. -erets, 0xf20f01ca, FRED|x64, NoSuf, {} -eretu, 0xf30f01ca, FRED|x64, NoSuf, {} +erets, 0xf20f01ca, FRED, NoSuf, {} +eretu, 0xf30f01ca, FRED, NoSuf, {} // FRED instructions end. // USER_MSR instructions. -urdmsr, 0xf20f38f8, USER_MSR|x64, RegMem|NoSuf|NoRex64, { Reg64, Reg64 } -urdmsr, 0xf2f8/0, USER_MSR|x64, Modrm|Vex128|VexMap7|VexW0|NoSuf, { Imm32, Reg64 } -uwrmsr, 0xf30f38f8, USER_MSR|x64, Modrm|NoSuf|NoRex64, { Reg64, Reg64 } -uwrmsr, 0xf3f8/0, USER_MSR|x64, Modrm|Vex128|VexMap7|VexW0|NoSuf, { Reg64, Imm32 } +urdmsr, 0xf20f38f8, USER_MSR, RegMem|NoSuf|NoRex64, { Reg64, Reg64 } +urdmsr, 0xf2f8/0, USER_MSR, Modrm|Vex128|VexMap7|VexW0|NoSuf, { Imm32, Reg64 } +uwrmsr, 0xf30f38f8, USER_MSR, Modrm|NoSuf|NoRex64, { Reg64, Reg64 } +uwrmsr, 0xf3f8/0, USER_MSR, Modrm|Vex128|VexMap7|VexW0|NoSuf, { Reg64, Imm32 } // USER_MSR instructions end.