From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02on2040.outbound.protection.outlook.com [40.107.249.40]) by sourceware.org (Postfix) with ESMTPS id 6ABA33839D1C for ; Mon, 19 Dec 2022 10:44:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6ABA33839D1C 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-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SSt/BnQVQ/3qSoF/YPYvhL41JN8juwrDF22/cAouQH+6ezH6HuVk02lGpMqYGJHP9jlSNARbPKQ4BE7g7LD0MC5IO4+FOSOC5qw0Uo7V5F8J4K8o03OuzA38+vUeYNYlNzxuqQpioLlO/akVb31Sb3QwmudqujkMz6i5Fd55IIDr0e0R8YwXeRfUh+jwGzDLIq9kegmUncW5MtSsS0UIEU1gOdFE39CwSpnaEtOKLPV7NAIRA3CxwEOtjwz4ymnQWg/CIs1xDxX+YgpF5WjBWnm8WCHuuzxPr3p3zWQd2eHmJIFRcluDNY+aMW1h4CqU2nKDzjfGELDuCkPm/EO3pQ== 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=193C+uKAHIEy1k+umaDOToKSDC+rro3m+r+skNUDE/E=; b=ffWdf7Db8IoE21D5ryuH9v7ccKP8Hsn4FeOWkoMzNFebhXnF43glpzEj+b9IYUBmLD2VQJlclzSPucK9m5CSay38ITdIL8c+QHezv8a3yU3N/Koh+e5dn2XC+LK83eiAeWzjScdGVrBCP6fATej1jymD3sRDTz1Ctj6SLPex3D86KNzY4OmnqDhSMrutQA0VHkrMChqLyEeZelKrkCGhNiGqUJkPQLEXTxczIardeFXqzWzhlR5t61oiC7fShxHJ/thX3502tnsDRhn+tWjRywrGV68YDh1DsoAcyj3bIRRdcFa+nDLSchihXnn0/34nZLmK6Ae1lzd3MJ4gwDVpIA== 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=193C+uKAHIEy1k+umaDOToKSDC+rro3m+r+skNUDE/E=; b=CJkigmP0OK/PlxUBzVU/JLN0hA69lGFYZLUQH0uP65bkETwKltEGKyLWNZ82QFlFZQSvDWYtSHNmYoYTnCxUZt7rMEIHGfiZuUCBTs+kuljYbt8/mz2qJnC1KIzeMZB/iDW5oNSKBXqWGG8XmmVLDwMm6JRSnnjF4HVYsu0W6BXpyG8GtFIwYgJxeT5XmHvDX/Qe0efzBbgrQtRTyPJqgfQbv5v4fQymeV9om3neutEUCss1YHBqRmK2VxWH9+CvoJ/IiZUhy3O29M+6VCHHYMjx+WvgP0QjJe3bGm2lAcYdU6G59C8TL1qXmbwVr8S4ZSOjgCVml0yRvsKnmFRzEw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by AM0PR04MB6962.eurprd04.prod.outlook.com (2603:10a6:208:188::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5924.16; Mon, 19 Dec 2022 10:44:40 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::4da2:ea8b:e71e:b8d8]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::4da2:ea8b:e71e:b8d8%4]) with mapi id 15.20.5924.016; Mon, 19 Dec 2022 10:44:40 +0000 Message-ID: <63033af0-eb22-a8eb-c8cb-f268344c5a14@suse.com> Date: Mon, 19 Dec 2022 11:44:40 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: [PATCH 01/10] x86: re-work ISA extension dependency handling Content-Language: en-US To: Binutils Cc: "H.J. Lu" References: <973d3274-7adc-3a7c-5aaa-916fd5adc093@suse.com> From: Jan Beulich In-Reply-To: <973d3274-7adc-3a7c-5aaa-916fd5adc093@suse.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR3P281CA0199.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a5::16) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|AM0PR04MB6962:EE_ X-MS-Office365-Filtering-Correlation-Id: e69d89f1-f761-4c09-434d-08dae1ae07e0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: IlBj4q+RnHP3PY2NcW9/vPeAM5RnGpXp/SJbHoGYCv0hTiNh1AZvfICHJ6hgsH2JKvjmdKcijjmUsJO2qjX8xTAoBtXwN49FBq/y850HnNEwC3iphR9+as5U1wOA9YZIE1hH4cDlT8MTklOulYwMjOUDAJL/463zsQiXqHegrmS2sBOVl0z2mDLLh9IBukiW1cdtPvbEBKP7bWuB8Cjdsk+ggUTXQ3rGBB8q9m441OvOuxc+N385vv3vN5Woj1uKopUqpaU9ys/7KiyuqdBP5sagtTeFthqec2QsW7hZkAHaAZd/Q09cNZT6QXPcD1TXfbWRTO/kxnQtGsm+cnD4G11G3kAGpbDpLUvcqIcJrMdB2yCVk68tPy2419sqINiwVmYPF4g4BN/qFFqV5qYiEc70q1Mtr7mk8u/FxrD7pCWJMfrxTyMf9OaT/EdnXF54VUoeAzw4hbI01mb7g3d4pezfDd9BzskJV743XGfD2pQ95IfHC71tV26r3vv+ViAfK3Y+R5EJnID/7SVy1MmRbKDm0/ezY6yLR1sRwT1WvPnstLjqenw1uRfooK5kv0QBrmlLMkj74YbY+yR6cnBzcgCtXi4QqcG/v5GyG7MkMzHmwlKc36BmZLbqBrr+JrfGoJKm6DKjl99rx2fiuiNmR1b4TN8ACHkBi/Sfr+gU5wey1P5KnOzplbMhGkHzIzBVnUJW5on/yQLJOjkMvTwEYGstCTrpt8ZbBOeWX+73kkkpA/04cQyDmTFxmlpOurDf X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VE1PR04MB6560.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(39860400002)(346002)(376002)(136003)(366004)(396003)(451199015)(6916009)(36756003)(2906002)(316002)(83380400001)(6486002)(478600001)(6506007)(86362001)(2616005)(31696002)(6512007)(186003)(26005)(8936002)(38100700002)(41300700001)(30864003)(31686004)(4326008)(66946007)(5660300002)(66476007)(66556008)(8676002)(21314003)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MmlGQm50bVVoUXlpUVFybE1KWmx2eUh0bm9MQjF5THptT1F1Z01NNmJXNmR6?= =?utf-8?B?QmJZQ09kb2wzWkE3R1Z3OC9jVnpjN0QyRFk5ZGdmWHJXRnpWeUNKd1R2c2J4?= =?utf-8?B?U3I2QW5IazZ5TmJSMkxzZzdoTmVLWVp0M0h2b21ER08rTDJrVXhoemJ2VmJD?= =?utf-8?B?VjB1R2hmMWFoaWtsUGdnSjI1VjdhcXNTL1VYMVF2ckNtbjkyTkNMcHphZnNB?= =?utf-8?B?UDBmZXJhbXNiMUxTQXNrSmpkNGRQQjJ0VHBPTWVFeUgvUHFVL0dqWExIRVV0?= =?utf-8?B?Nk1CVjVVUWJDam5UdEZKRTB1UjlxSStzTng4Ri9BM1pnb2lHejFjdHY1REpr?= =?utf-8?B?RklId244a3hacUxvbklvcFk5NUpRM1I0a0p3TW44L2dpekpFRUZ2QzMrOVc0?= =?utf-8?B?YUsrbVRYcjFWK1JyeVNTQ0FLOVBFZkthQWwvMExWRmt3SVZ0ZFJwWlFhVkJ2?= =?utf-8?B?Mm9FTUllQkhBb3FVN3ViWGZtTHJyLzkxcytEbm5kaEF4ak1oSG11b1ArclA4?= =?utf-8?B?Rm16c3pWQ3ROakFpakxkSVdkSzlpWWlBa09VUk4xeEZycmNadWppUkZYSXZM?= =?utf-8?B?aDhIVy9QN3luUmUyUERVN0ltL1ZUZEtHbFB3SGgzMHJ4VUNUQndua290Z1Rt?= =?utf-8?B?Y1FQNmhlWHZJdm91QzFmbFdMNlpPeHRuMHMyQWFrNjhJczM0NmtuQUdLNXdh?= =?utf-8?B?NFU1TjBjU0EwMWVhY25NZ2lKcW9kaWJIajIzMXJ0M2RtZEJmaExKcUl5U0Qr?= =?utf-8?B?SGtjdmo3eHJPcWlZaWV6bEVGMEpiUFo1Tm1UKzJVNFU0L1hjRDN5aG1tak11?= =?utf-8?B?dTVHeVA4VHpTcUxQRzNzWnkralRHc3E4N1l2YUtJMk9GVnBTT3o4ZzZyVG84?= =?utf-8?B?aXZEUG5yZUJNaXhNdUpwVXJTM0RsNUZiLzZTeUlQaUp5Z1lXUXlWdnp0eEhE?= =?utf-8?B?MUg1Q1JlQ1BHd0x5UGZOMzdaR1dYWmhJdjFwcFVyb21jTVRyL2tzbzhlK1RK?= =?utf-8?B?YlFrTDJPRDJLbFRXNWoxSVBobW9aY2g5NkYzU0RuVFgrbWVFUnRWcCtiNUp4?= =?utf-8?B?aWpZeHpMb3lkS04rTzlGalVWQlp4Q3paajUyeVJHeldEcEFDWkEwb212TW5k?= =?utf-8?B?Y3l6VS9oMTFDcVhhNFBHenBoZHlwS2VvUHUrK2FBSWplaWdZaTR4S0xIYm5C?= =?utf-8?B?bnBoOFdsZjIwR0ZUZFQvR3pmNVFHZ3FKMzVyR0JoblVneUVmVmFQY3I5SnpU?= =?utf-8?B?VFFXdVpGdlBWNVN3WHlWL2JncFVlN2xCWklVQzJJa01iZDZHT0NUS1E4RTFx?= =?utf-8?B?WHVnSHZ5aGxXajY3a0NjeEcySi9DZEpnMDVlUzBQWGdWbzJRdFByMUF4YVZY?= =?utf-8?B?NFd3VytObzBOeitDbFNKeDFOeGR2VFNjL0N0VnNER0NCSjE0YmNNUnI5OUJz?= =?utf-8?B?Q3F6QWFqYVRGVFpuWnIvSFlSdGNhTldBcVZKYnB3YUpzN2g5OGR1SHpHeGRB?= =?utf-8?B?MVFEb3pnZlhzbjkzWjhmUUJaZmdGODdNbWpDM0c2bHh0Z2lCcXFhaUw0K1dq?= =?utf-8?B?eERLMHRXMGlUaFJlNjVSblV2TVF3b2JrRSt6eWIwRVJmZzhaM1hMZUE2ektB?= =?utf-8?B?YTlhY3ZGOUpoV0p1eFZoSXBCYnRxNG1rUG1LNUNDNnA3YlNPdTVIU1BIOTV2?= =?utf-8?B?VGtWU0FEbHRUbXBzbHRCdldiSC9wdXNwcUtPVHpIbkFONlZZZElVYlltTjRJ?= =?utf-8?B?UGxGc2VhWnlwUWIrMVlWaUo0TFJoVHN3OWhaVksvOGFYL24wcjVITGtnOWdz?= =?utf-8?B?eXVYVjRwMzdyRHFzb2tqOGRuR3ZTaWs2RjZFcWRYWUE3WU5tNk5XSmloMStS?= =?utf-8?B?VVlHbFpFZjhlSU9pcjVCZ0hWNVEycnMzS3l2cFhIZkYydDMrQlMzeFNiSUFo?= =?utf-8?B?eDdYemZEVHd1c0gybTlXRlNxLzRma1UzMzh6Zi9HV0I4RlVLSTlVd1RWTC9S?= =?utf-8?B?bjVqeElXNFpITGFNbGYyOUlhVVBRR0FLTWNBaldIL1VtOXV1dTdKdEFyMjlE?= =?utf-8?B?UmNJM1E0dHl0K2Z5clQ3SWgzOU14aVZRZ2tITmxQbmtFUXFmY3A1Y3NLSkJs?= =?utf-8?Q?WxHq9CixsUHvg5wU5loZIdgIM?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: e69d89f1-f761-4c09-434d-08dae1ae07e0 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Dec 2022 10:44:40.0449 (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: SeYnQUnUXn1HIgOqEPGiL0FV84Vj+bqqimuQP9IJ/yy+o1qFVUzQfUqJV2xFmOLwgy57p16MpC5X/5T0zrpYFw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6962 X-Spam-Status: No, score=-3029.2 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,UPPERCASE_50_75 autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Getting both forward and reverse ISA dependencies right / consistent has been a permanent source of mistakes. Reduce what needs specifying manually to just the direct forward dependencies. Transitive forward dependencies as well as reverse ones are now derived and hence cannot go out of sync anymore (at least in the vast majority of cases; there are a few special cases to still take care of manually). In the course of this several CPU_ANY_*_FLAGS disappear, requiring adjustment to the assembler's cpu_arch[]. Note that to retain the correct reverse dependency of AVX512F wrt AVX512-VP2INTERSECT, the latter has the previously missing AVX512F prereq added. Note further that to avoid adding the following undue prereqs: * ATHLON, K8, and AMDFAM10 gain CMOV and FXSR, * IAMCU gains 387, auxiliary table entries (including a colon-separated modifier) are introduced in addition to the ones representing from converting the old table. To maintain forward-only dependencies between AVX (XOP) and SSE* (SSE4a) (i.e. "nosse" not disabling AVX), reverse dependency tracking is artifically suppressed. As a side effect disabling of SSE or SSE2 will now also disable AES, PCLMUL, and SHA (respective elements were missing from CPU_ANY_SSE2_FLAGS). --- An option would be to generate #define CPU_ANY_XYZ_FLAGS CPU_XYZ_FLAGS for all XYZ which don't otherwise have CPU_ANY_XYZ_FLAGS generated. This would allow cpu_arch[] to become more uniform. But maybe this would, if desired in the first place, better be a separate, follow-on change. I wonder whether isa_dependencies[] wouldn't better be in a separate input file (e.g. i386-isa.tbl), just like the other inputs are also separate files. If we wanted to switch, perhaps again better as a follow-on change. --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -964,13 +964,13 @@ static const arch_entry cpu_arch[] = ARCH (generic32, GENERIC32, GENERIC32, false), ARCH (generic64, GENERIC64, GENERIC64, false), ARCH (i8086, UNKNOWN, NONE, false), - ARCH (i186, UNKNOWN, I186, false), - ARCH (i286, UNKNOWN, I286, false), - ARCH (i386, I386, I386, false), - ARCH (i486, I486, I486, false), - ARCH (i586, PENTIUM, I586, false), - ARCH (i686, PENTIUMPRO, I686, false), - ARCH (pentium, PENTIUM, I586, false), + ARCH (i186, UNKNOWN, 186, false), + ARCH (i286, UNKNOWN, 286, false), + ARCH (i386, I386, 386, false), + ARCH (i486, I486, 486, false), + ARCH (i586, PENTIUM, 586, false), + ARCH (i686, PENTIUMPRO, 686, false), + ARCH (pentium, PENTIUM, 586, false), ARCH (pentiumpro, PENTIUMPRO, PENTIUMPRO, false), ARCH (pentiumii, PENTIUMPRO, P2, false), ARCH (pentiumiii, PENTIUMPRO, P3, false), @@ -1001,13 +1001,13 @@ static const arch_entry cpu_arch[] = ARCH (btver1, BT, BTVER1, false), ARCH (btver2, BT, BTVER2, false), - SUBARCH (8087, 8087, ANY_X87, false), - SUBARCH (87, NONE, ANY_X87, false), /* Disable only! */ + SUBARCH (8087, 8087, ANY_8087, false), + SUBARCH (87, NONE, ANY_8087, false), /* Disable only! */ SUBARCH (287, 287, ANY_287, false), SUBARCH (387, 387, ANY_387, false), SUBARCH (687, 687, ANY_687, false), - SUBARCH (cmov, CMOV, ANY_CMOV, false), - SUBARCH (fxsr, FXSR, ANY_FXSR, false), + SUBARCH (cmov, CMOV, CMOV, false), + SUBARCH (fxsr, FXSR, FXSR, false), SUBARCH (mmx, MMX, ANY_MMX, false), SUBARCH (sse, SSE, ANY_SSE, false), SUBARCH (sse2, SSE2, ANY_SSE2, false), @@ -1088,8 +1088,8 @@ static const arch_entry cpu_arch[] = SUBARCH (ospke, OSPKE, OSPKE, false), SUBARCH (rdpid, RDPID, RDPID, false), SUBARCH (ptwrite, PTWRITE, PTWRITE, false), - SUBARCH (ibt, IBT, ANY_IBT, false), - SUBARCH (shstk, SHSTK, ANY_SHSTK, false), + SUBARCH (ibt, IBT, IBT, false), + SUBARCH (shstk, SHSTK, SHSTK, false), SUBARCH (gfni, GFNI, GFNI, false), SUBARCH (vaes, VAES, VAES, false), SUBARCH (vpclmulqdq, VPCLMULQDQ, VPCLMULQDQ, false), @@ -1101,31 +1101,31 @@ static const arch_entry cpu_arch[] = SUBARCH (amx_bf16, AMX_BF16, ANY_AMX_BF16, false), SUBARCH (amx_fp16, AMX_FP16, AMX_FP16, false), SUBARCH (amx_tile, AMX_TILE, ANY_AMX_TILE, false), - SUBARCH (movdiri, MOVDIRI, ANY_MOVDIRI, false), - SUBARCH (movdir64b, MOVDIR64B, ANY_MOVDIR64B, false), + SUBARCH (movdiri, MOVDIRI, MOVDIRI, false), + SUBARCH (movdir64b, MOVDIR64B, MOVDIR64B, false), SUBARCH (avx512_bf16, AVX512_BF16, ANY_AVX512_BF16, false), SUBARCH (avx512_vp2intersect, AVX512_VP2INTERSECT, ANY_AVX512_VP2INTERSECT, false), - SUBARCH (tdx, TDX, ANY_TDX, false), - SUBARCH (enqcmd, ENQCMD, ANY_ENQCMD, false), - SUBARCH (serialize, SERIALIZE, ANY_SERIALIZE, false), + SUBARCH (tdx, TDX, TDX, false), + SUBARCH (enqcmd, ENQCMD, ENQCMD, false), + SUBARCH (serialize, SERIALIZE, SERIALIZE, false), SUBARCH (rdpru, RDPRU, RDPRU, false), SUBARCH (mcommit, MCOMMIT, MCOMMIT, false), SUBARCH (sev_es, SEV_ES, SEV_ES, false), - SUBARCH (tsxldtrk, TSXLDTRK, ANY_TSXLDTRK, false), - SUBARCH (kl, KL, ANY_KL, false), - SUBARCH (widekl, WIDEKL, ANY_WIDEKL, false), - SUBARCH (uintr, UINTR, ANY_UINTR, false), - SUBARCH (hreset, HRESET, ANY_HRESET, false), + SUBARCH (tsxldtrk, TSXLDTRK, TSXLDTRK, false), + SUBARCH (kl, KL, KL, false), + SUBARCH (widekl, WIDEKL, WIDEKL, false), + SUBARCH (uintr, UINTR, UINTR, false), + SUBARCH (hreset, HRESET, HRESET, false), SUBARCH (avx512_fp16, AVX512_FP16, ANY_AVX512_FP16, false), SUBARCH (prefetchi, PREFETCHI, PREFETCHI, false), SUBARCH (avx_ifma, AVX_IFMA, ANY_AVX_IFMA, false), SUBARCH (avx_vnni_int8, AVX_VNNI_INT8, ANY_AVX_VNNI_INT8, false), - SUBARCH (cmpccxadd, CMPCCXADD, ANY_CMPCCXADD, false), - SUBARCH (wrmsrns, WRMSRNS, ANY_WRMSRNS, false), - SUBARCH (msrlist, MSRLIST, ANY_MSRLIST, false), + SUBARCH (cmpccxadd, CMPCCXADD, CMPCCXADD, false), + SUBARCH (wrmsrns, WRMSRNS, WRMSRNS, false), + SUBARCH (msrlist, MSRLIST, MSRLIST, false), SUBARCH (avx_ne_convert, AVX_NE_CONVERT, ANY_AVX_NE_CONVERT, false), - SUBARCH (rao_int, RAO_INT, ANY_RAO_INT, false), + SUBARCH (rao_int, RAO_INT, RAO_INT, false), SUBARCH (rmpquery, RMPQUERY, RMPQUERY, false), }; --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -18,6 +18,7 @@ MA 02110-1301, USA. */ #include "sysdep.h" +#include #include #include #include "getopt.h" @@ -37,446 +38,192 @@ static const char *program_name = NULL; static int debug = 0; -typedef struct initializer +typedef struct dependency { const char *name; - const char *init; -} initializer; + /* Note: Only direct dependencies should be enumerated. */ + const char *deps; +} dependency; -static initializer cpu_flag_init[] = +static const dependency isa_dependencies[] = { - { "CPU_UNKNOWN_FLAGS", + { "UNKNOWN", "~IAMCU" }, - { "CPU_GENERIC32_FLAGS", - "186|286|386" }, - { "CPU_GENERIC64_FLAGS", - "CPU_PENTIUMPRO_FLAGS|Clflush|SYSCALL|CPU_MMX_FLAGS|CPU_SSE2_FLAGS|LM" }, - { "CPU_NONE_FLAGS", - "0" }, - { "CPU_I186_FLAGS", + { "GENERIC32", + "386" }, + { "GENERIC64", + "PENTIUMPRO|Clflush|SYSCALL|MMX|SSE2|LM" }, + { "NONE", + "0" }, + { "PENTIUMPRO", + "686|Nop" }, + { "P2", + "PENTIUMPRO|MMX" }, + { "P3", + "P2|SSE" }, + { "P4", + "P3|Clflush|SSE2" }, + { "NOCONA", + "GENERIC64|FISTTP|SSE3|CX16" }, + { "CORE", + "P4|FISTTP|SSE3|CX16" }, + { "CORE2", + "NOCONA|SSSE3" }, + { "COREI7", + "CORE2|SSE4_2|Rdtscp" }, + { "K6", + "186|286|386|486|586|SYSCALL|387|MMX" }, + { "K6_2", + "K6|3dnow" }, + { "ATHLON", + "K6_2|686:min|687|Nop|3dnowA" }, + { "K8", + "ATHLON|Rdtscp|SSE2|LM" }, + { "AMDFAM10", + "K8|FISTTP|SSE4A|ABM" }, + { "BDVER1", + "GENERIC64|FISTTP|Rdtscp|CX16|XOP|ABM|LWP|SVME|AES|PCLMUL|PRFCHW" }, + { "BDVER2", + "BDVER1|FMA|BMI|TBM|F16C" }, + { "BDVER3", + "BDVER2|Xsaveopt|FSGSBase" }, + { "BDVER4", + "BDVER3|AVX2|Movbe|BMI2|RdRnd|MWAITX" }, + { "ZNVER1", + "GENERIC64|FISTTP|Rdtscp|CX16|AVX2|SSE4A|ABM|SVME|AES|PCLMUL|PRFCHW|FMA|BMI|F16C|Xsaveopt|FSGSBase|Movbe|BMI2|RdRnd|ADX|RdSeed|SMAP|SHA|XSAVEC|XSAVES|ClflushOpt|CLZERO|MWAITX" }, + { "ZNVER2", + "ZNVER1|CLWB|RDPID|RDPRU|MCOMMIT|WBNOINVD" }, + { "ZNVER3", + "ZNVER2|INVLPGB|TLBSYNC|VAES|VPCLMULQDQ|INVPCID|SNP|OSPKE" }, + { "ZNVER4", + "ZNVER3|AVX512F|AVX512DQ|AVX512IFMA|AVX512CD|AVX512BW|AVX512VL|AVX512_BF16|AVX512VBMI|AVX512_VBMI2|AVX512_VNNI|AVX512_BITALG|AVX512_VPOPCNTDQ|GFNI|RMPQUERY" }, + { "BTVER1", + "GENERIC64|FISTTP|CX16|Rdtscp|SSSE3|SSE4A|ABM|PRFCHW|CX16|Clflush|FISTTP|SVME" }, + { "BTVER2", + "BTVER1|AVX|BMI|F16C|AES|PCLMUL|Movbe|Xsaveopt|PRFCHW" }, + { "286", "186" }, - { "CPU_I286_FLAGS", - "CPU_I186_FLAGS|286" }, - { "CPU_I386_FLAGS", - "CPU_I286_FLAGS|386" }, - { "CPU_I486_FLAGS", - "CPU_I386_FLAGS|486" }, - { "CPU_I586_FLAGS", - "CPU_I486_FLAGS|387|586" }, - { "CPU_I686_FLAGS", - "CPU_I586_FLAGS|686|687|CMOV|FXSR" }, - { "CPU_PENTIUMPRO_FLAGS", - "CPU_I686_FLAGS|Nop" }, - { "CPU_P2_FLAGS", - "CPU_PENTIUMPRO_FLAGS|CPU_MMX_FLAGS" }, - { "CPU_P3_FLAGS", - "CPU_P2_FLAGS|CPU_SSE_FLAGS" }, - { "CPU_P4_FLAGS", - "CPU_P3_FLAGS|Clflush|CPU_SSE2_FLAGS" }, - { "CPU_NOCONA_FLAGS", - "CPU_GENERIC64_FLAGS|FISTTP|CPU_SSE3_FLAGS|CX16" }, - { "CPU_CORE_FLAGS", - "CPU_P4_FLAGS|FISTTP|CPU_SSE3_FLAGS|CX16" }, - { "CPU_CORE2_FLAGS", - "CPU_NOCONA_FLAGS|CPU_SSSE3_FLAGS" }, - { "CPU_COREI7_FLAGS", - "CPU_CORE2_FLAGS|CPU_SSE4_2_FLAGS|Rdtscp" }, - { "CPU_K6_FLAGS", - "186|286|386|486|586|SYSCALL|387|CPU_MMX_FLAGS" }, - { "CPU_K6_2_FLAGS", - "CPU_K6_FLAGS|3dnow" }, - { "CPU_ATHLON_FLAGS", - "CPU_K6_2_FLAGS|686|687|Nop|3dnowA" }, - { "CPU_K8_FLAGS", - "CPU_ATHLON_FLAGS|Rdtscp|CPU_SSE2_FLAGS|LM" }, - { "CPU_AMDFAM10_FLAGS", - "CPU_K8_FLAGS|FISTTP|CPU_SSE4A_FLAGS|LZCNT|POPCNT" }, - { "CPU_BDVER1_FLAGS", - "CPU_GENERIC64_FLAGS|FISTTP|Rdtscp|CX16|CPU_XOP_FLAGS|LZCNT|POPCNT|LWP|SVME|AES|PCLMUL|PRFCHW" }, - { "CPU_BDVER2_FLAGS", - "CPU_BDVER1_FLAGS|FMA|BMI|TBM|F16C" }, - { "CPU_BDVER3_FLAGS", - "CPU_BDVER2_FLAGS|Xsaveopt|FSGSBase" }, - { "CPU_BDVER4_FLAGS", - "CPU_BDVER3_FLAGS|AVX2|Movbe|BMI2|RdRnd|MWAITX" }, - { "CPU_ZNVER1_FLAGS", - "CPU_GENERIC64_FLAGS|FISTTP|Rdtscp|CX16|CPU_AVX2_FLAGS|SSE4A|LZCNT|POPCNT|SVME|AES|PCLMUL|PRFCHW|FMA|BMI|F16C|Xsaveopt|FSGSBase|Movbe|BMI2|RdRnd|ADX|RdSeed|SMAP|SHA|XSAVEC|XSAVES|ClflushOpt|CLZERO|MWAITX" }, - { "CPU_ZNVER2_FLAGS", - "CPU_ZNVER1_FLAGS|CLWB|RDPID|RDPRU|MCOMMIT|WBNOINVD" }, - { "CPU_ZNVER3_FLAGS", - "CPU_ZNVER2_FLAGS|INVLPGB|TLBSYNC|VAES|VPCLMULQDQ|INVPCID|SNP|OSPKE" }, - { "CPU_ZNVER4_FLAGS", - "CPU_ZNVER3_FLAGS|AVX512F|AVX512DQ|AVX512IFMA|AVX512CD|AVX512BW|AVX512VL|AVX512_BF16|AVX512VBMI|AVX512_VBMI2|AVX512_VNNI|AVX512_BITALG|AVX512_VPOPCNTDQ|GFNI|RMPQUERY" }, - { "CPU_BTVER1_FLAGS", - "CPU_GENERIC64_FLAGS|FISTTP|CX16|Rdtscp|CPU_SSSE3_FLAGS|SSE4A|LZCNT|POPCNT|PRFCHW|CX16|Clflush|FISTTP|SVME" }, - { "CPU_BTVER2_FLAGS", - "CPU_BTVER1_FLAGS|CPU_AVX_FLAGS|BMI|F16C|AES|PCLMUL|Movbe|Xsaveopt|PRFCHW" }, - { "CPU_8087_FLAGS", - "8087" }, - { "CPU_287_FLAGS", - "287" }, - { "CPU_387_FLAGS", + { "386", + "286" }, + { "486", + "386" }, + { "586", + "486|387" }, + { "586:nofpu", + "486" }, + { "686", + "586|687|CMOV|FXSR" }, + { "686:min", + "586|687" }, + { "687", "387" }, - { "CPU_687_FLAGS", - "CPU_387_FLAGS|687" }, - { "CPU_CMOV_FLAGS", - "CMOV" }, - { "CPU_FXSR_FLAGS", - "FXSR" }, - { "CPU_CLFLUSH_FLAGS", - "Clflush" }, - { "CPU_NOP_FLAGS", - "Nop" }, - { "CPU_SYSCALL_FLAGS", - "SYSCALL" }, - { "CPU_MMX_FLAGS", - "MMX" }, - { "CPU_SSE_FLAGS", + { "FISTTP", + "687" }, + { "SSE2", "SSE" }, - { "CPU_SSE2_FLAGS", - "CPU_SSE_FLAGS|SSE2" }, - { "CPU_SSE3_FLAGS", - "CPU_SSE2_FLAGS|SSE3" }, - { "CPU_SSSE3_FLAGS", - "CPU_SSE3_FLAGS|SSSE3" }, - { "CPU_SSE4_1_FLAGS", - "CPU_SSSE3_FLAGS|SSE4_1" }, - { "CPU_SSE4_2_FLAGS", - "CPU_SSE4_1_FLAGS|SSE4_2|POPCNT" }, - { "CPU_VMX_FLAGS", - "VMX" }, - { "CPU_SMX_FLAGS", - "SMX" }, - { "CPU_XSAVE_FLAGS", - "Xsave" }, - { "CPU_XSAVEOPT_FLAGS", - "CPU_XSAVE_FLAGS|Xsaveopt" }, - { "CPU_AES_FLAGS", - "CPU_SSE2_FLAGS|AES" }, - { "CPU_PCLMUL_FLAGS", - "CPU_SSE2_FLAGS|PCLMUL" }, - { "CPU_FMA_FLAGS", - "CPU_AVX_FLAGS|FMA" }, - { "CPU_FMA4_FLAGS", - "CPU_AVX_FLAGS|FMA4" }, - { "CPU_XOP_FLAGS", - "CPU_SSE4A_FLAGS|CPU_FMA4_FLAGS|XOP" }, - { "CPU_LWP_FLAGS", - "CPU_XSAVE_FLAGS|LWP" }, - { "CPU_BMI_FLAGS", - "BMI" }, - { "CPU_TBM_FLAGS", - "TBM" }, - { "CPU_MOVBE_FLAGS", - "Movbe" }, - { "CPU_CX16_FLAGS", - "CX16" }, - { "CPU_RDTSCP_FLAGS", - "Rdtscp" }, - { "CPU_EPT_FLAGS", - "EPT" }, - { "CPU_FSGSBASE_FLAGS", - "FSGSBase" }, - { "CPU_RDRND_FLAGS", - "RdRnd" }, - { "CPU_F16C_FLAGS", - "CPU_AVX_FLAGS|F16C" }, - { "CPU_BMI2_FLAGS", - "BMI2" }, - { "CPU_LZCNT_FLAGS", - "LZCNT" }, - { "CPU_POPCNT_FLAGS", - "POPCNT" }, - { "CPU_HLE_FLAGS", - "HLE" }, - { "CPU_RTM_FLAGS", - "RTM" }, - { "CPU_INVPCID_FLAGS", - "INVPCID" }, - { "CPU_VMFUNC_FLAGS", - "VMFUNC" }, - { "CPU_3DNOW_FLAGS", - "CPU_MMX_FLAGS|3dnow" }, - { "CPU_3DNOWA_FLAGS", - "CPU_3DNOW_FLAGS|3dnowA" }, - { "CPU_PADLOCK_FLAGS", - "PadLock" }, - { "CPU_SVME_FLAGS", - "SVME" }, - { "CPU_SSE4A_FLAGS", - "CPU_SSE3_FLAGS|SSE4a" }, - { "CPU_ABM_FLAGS", + { "SSE3", + "SSE2" }, + { "SSSE3", + "SSE3" }, + { "SSE4_1", + "SSSE3" }, + { "SSE4_2", + "SSE4_1|POPCNT" }, + { "Xsaveopt", + "XSAVE" }, + { "AES", + "SSE2" }, + { "PCLMUL", + "SSE2" }, + { "FMA", + "AVX" }, + { "FMA4", + "AVX" }, + { "XOP", + "SSE4A|FMA4" }, + { "LWP", + "XSAVE" }, + { "F16C", + "AVX" }, + { "3dnow", + "MMX" }, + { "3dnowA", + "3dnow" }, + { "SSE4a", + "SSE3" }, + { "ABM", "LZCNT|POPCNT" }, - { "CPU_AVX_FLAGS", - "CPU_SSE4_2_FLAGS|CPU_XSAVE_FLAGS|AVX" }, - { "CPU_AVX2_FLAGS", - "CPU_AVX_FLAGS|AVX2" }, - { "CPU_AVX_VNNI_FLAGS", - "CPU_AVX2_FLAGS|AVX_VNNI" }, - { "CPU_AVX512F_FLAGS", - "CPU_AVX2_FLAGS|AVX512F" }, - { "CPU_AVX512CD_FLAGS", - "CPU_AVX512F_FLAGS|AVX512CD" }, - { "CPU_AVX512ER_FLAGS", - "CPU_AVX512F_FLAGS|AVX512ER" }, - { "CPU_AVX512PF_FLAGS", - "CPU_AVX512F_FLAGS|AVX512PF" }, - { "CPU_AVX512DQ_FLAGS", - "CPU_AVX512F_FLAGS|AVX512DQ" }, - { "CPU_AVX512BW_FLAGS", - "CPU_AVX512F_FLAGS|AVX512BW" }, - { "CPU_AVX512VL_FLAGS", - "CPU_AVX512F_FLAGS|AVX512VL" }, - { "CPU_AVX512IFMA_FLAGS", - "CPU_AVX512F_FLAGS|AVX512IFMA" }, - { "CPU_AVX512VBMI_FLAGS", - "CPU_AVX512F_FLAGS|AVX512VBMI" }, - { "CPU_AVX512_4FMAPS_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_4FMAPS" }, - { "CPU_AVX512_4VNNIW_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_4VNNIW" }, - { "CPU_AVX512_VPOPCNTDQ_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_VPOPCNTDQ" }, - { "CPU_AVX512_VBMI2_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_VBMI2" }, - { "CPU_AVX512_VNNI_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_VNNI" }, - { "CPU_AVX512_BITALG_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_BITALG" }, - { "CPU_AVX512_BF16_FLAGS", - "CPU_AVX512F_FLAGS|AVX512_BF16" }, - { "CPU_AVX512_FP16_FLAGS", - "CPU_AVX512BW_FLAGS|AVX512_FP16" }, - { "CPU_PREFETCHI_FLAGS", - "PREFETCHI"}, - { "CPU_AVX_IFMA_FLAGS", - "CPU_AVX2_FLAGS|AVX_IFMA" }, - { "CPU_AVX_VNNI_INT8_FLAGS", - "CPU_AVX2_FLAGS|AVX_VNNI_INT8" }, - { "CPU_CMPCCXADD_FLAGS", - "CMPCCXADD" }, - { "CPU_WRMSRNS_FLAGS", - "WRMSRNS" }, - { "CPU_MSRLIST_FLAGS", - "MSRLIST" }, - { "CPU_AVX_NE_CONVERT_FLAGS", - "CPU_AVX2_FLAGS|AVX_NE_CONVERT" }, - { "CPU_RAO_INT_FLAGS", - "RAO_INT" }, - { "CPU_IAMCU_FLAGS", - "186|286|386|486|586|IAMCU" }, - { "CPU_ADX_FLAGS", - "ADX" }, - { "CPU_RDSEED_FLAGS", - "RdSeed" }, - { "CPU_PRFCHW_FLAGS", - "PRFCHW" }, - { "CPU_SMAP_FLAGS", - "SMAP" }, - { "CPU_MPX_FLAGS", - "CPU_XSAVE_FLAGS|MPX" }, - { "CPU_SHA_FLAGS", - "CPU_SSE2_FLAGS|SHA" }, - { "CPU_CLFLUSHOPT_FLAGS", - "ClflushOpt" }, - { "CPU_XSAVES_FLAGS", - "CPU_XSAVE_FLAGS|XSAVES" }, - { "CPU_XSAVEC_FLAGS", - "CPU_XSAVE_FLAGS|XSAVEC" }, - { "CPU_PREFETCHWT1_FLAGS", - "PREFETCHWT1" }, - { "CPU_SE1_FLAGS", - "SE1" }, - { "CPU_CLWB_FLAGS", - "CLWB" }, - { "CPU_CLZERO_FLAGS", - "CLZERO" }, - { "CPU_MWAITX_FLAGS", - "MWAITX" }, - { "CPU_OSPKE_FLAGS", - "CPU_XSAVE_FLAGS|OSPKE" }, - { "CPU_RDPID_FLAGS", - "RDPID" }, - { "CPU_PTWRITE_FLAGS", - "PTWRITE" }, - { "CPU_IBT_FLAGS", - "IBT" }, - { "CPU_SHSTK_FLAGS", - "SHSTK" }, - { "CPU_GFNI_FLAGS", - "GFNI" }, - { "CPU_VAES_FLAGS", - "VAES" }, - { "CPU_VPCLMULQDQ_FLAGS", - "VPCLMULQDQ" }, - { "CPU_WBNOINVD_FLAGS", - "WBNOINVD" }, - { "CPU_PCONFIG_FLAGS", - "PCONFIG" }, - { "CPU_WAITPKG_FLAGS", - "WAITPKG" }, - { "CPU_UINTR_FLAGS", - "UINTR" }, - { "CPU_CLDEMOTE_FLAGS", - "CLDEMOTE" }, - { "CPU_AMX_INT8_FLAGS", - "CPU_AMX_TILE_FLAGS|AMX_INT8" }, - { "CPU_AMX_BF16_FLAGS", - "CPU_AMX_TILE_FLAGS|AMX_BF16" }, - { "CPU_AMX_FP16_FLAGS", - "CPU_AMX_TILE_FLAGS|AMX_FP16" }, - { "CPU_AMX_TILE_FLAGS", + { "AVX", + "SSE4_2|XSAVE" }, + { "AVX2", + "AVX" }, + { "AVX_VNNI", + "AVX2" }, + { "AVX_IFMA", + "AVX2" }, + { "AVX_VNNI_INT8", + "AVX2" }, + { "AVX_NE_CONVERT", + "AVX2" }, + { "AVX512F", + "AVX2" }, + { "AVX512CD", + "AVX512F" }, + { "AVX512ER", + "AVX512F" }, + { "AVX512PF", + "AVX512F" }, + { "AVX512DQ", + "AVX512F" }, + { "AVX512BW", + "AVX512F" }, + { "AVX512VL", + "AVX512F" }, + { "AVX512IFMA", + "AVX512F" }, + { "AVX512VBMI", + "AVX512F" }, + { "AVX512_4FMAPS", + "AVX512F" }, + { "AVX512_4VNNIW", + "AVX512F" }, + { "AVX512_VPOPCNTDQ", + "AVX512F" }, + { "AVX512_VBMI2", + "AVX512F" }, + { "AVX512_VNNI", + "AVX512F" }, + { "AVX512_BITALG", + "AVX512F" }, + { "AVX512_VP2INTERSECT", + "AVX512F" }, + { "AVX512_BF16", + "AVX512F" }, + { "AVX512_FP16", + "AVX512BW" }, + { "IAMCU", + "586:nofpu" }, + { "MPX", + "XSAVE" }, + { "SHA", + "SSE2" }, + { "XSAVES", + "XSAVE" }, + { "XSAVEC", + "XSAVE" }, + { "OSPKE", + "XSAVE" }, + { "AMX_INT8", + "AMX_TILE" }, + { "AMX_BF16", + "AMX_TILE" }, + { "AMX_FP16", "AMX_TILE" }, - { "CPU_MOVDIRI_FLAGS", - "MOVDIRI" }, - { "CPU_MOVDIR64B_FLAGS", - "MOVDIR64B" }, - { "CPU_ENQCMD_FLAGS", - "ENQCMD" }, - { "CPU_SERIALIZE_FLAGS", - "SERIALIZE" }, - { "CPU_AVX512_VP2INTERSECT_FLAGS", - "AVX512_VP2INTERSECT" }, - { "CPU_TDX_FLAGS", - "TDX" }, - { "CPU_RDPRU_FLAGS", - "RDPRU" }, - { "CPU_MCOMMIT_FLAGS", - "MCOMMIT" }, - { "CPU_SEV_ES_FLAGS", - "SEV_ES" }, - { "CPU_TSXLDTRK_FLAGS", - "TSXLDTRK"}, - { "CPU_KL_FLAGS", - "KL" }, - { "CPU_WIDEKL_FLAGS", - "WideKL" }, - { "CPU_HRESET_FLAGS", - "HRESET"}, - { "CPU_INVLPGB_FLAGS", - "INVLPGB" }, - { "CPU_TLBSYNC_FLAGS", - "TLBSYNC" }, - { "CPU_SNP_FLAGS", - "SNP" }, - { "CPU_RMPQUERY_FLAGS", - "RMPQUERY" }, - { "CPU_ANY_X87_FLAGS", - "CPU_ANY_287_FLAGS|8087" }, - { "CPU_ANY_287_FLAGS", - "CPU_ANY_387_FLAGS|287" }, - { "CPU_ANY_387_FLAGS", - "CPU_ANY_687_FLAGS|387" }, - { "CPU_ANY_687_FLAGS", - "687|FISTTP" }, - { "CPU_ANY_CMOV_FLAGS", - "CMOV" }, - { "CPU_ANY_FXSR_FLAGS", - "FXSR" }, - { "CPU_ANY_MMX_FLAGS", - "CPU_3DNOWA_FLAGS" }, - { "CPU_ANY_SSE_FLAGS", - "CPU_ANY_SSE2_FLAGS|SSE" }, - { "CPU_ANY_SSE2_FLAGS", - "CPU_ANY_SSE3_FLAGS|SSE2" }, - { "CPU_ANY_SSE3_FLAGS", - "CPU_ANY_SSSE3_FLAGS|SSE3|SSE4a" }, - { "CPU_ANY_SSSE3_FLAGS", - "CPU_ANY_SSE4_1_FLAGS|SSSE3" }, - { "CPU_ANY_SSE4_1_FLAGS", - "CPU_ANY_SSE4_2_FLAGS|SSE4_1" }, - { "CPU_ANY_SSE4_2_FLAGS", - "SSE4_2" }, - { "CPU_ANY_SSE4A_FLAGS", - "SSE4a" }, - { "CPU_ANY_AVX_FLAGS", - "CPU_ANY_AVX2_FLAGS|F16C|FMA|FMA4|XOP|AVX" }, - { "CPU_ANY_AVX2_FLAGS", - "CPU_ANY_AVX512F_FLAGS|AVX2|AVX_VNNI|AVX_IFMA|AVX_VNNI_INT8|AVX_NE_CONVERT" }, - { "CPU_ANY_AVX512F_FLAGS", - "AVX512F|AVX512CD|AVX512ER|AVX512PF|AVX512DQ|CPU_ANY_AVX512BW_FLAGS|AVX512VL|AVX512IFMA|AVX512VBMI|AVX512_4FMAPS|AVX512_4VNNIW|AVX512_VPOPCNTDQ|AVX512_VBMI2|AVX512_VNNI|AVX512_BITALG|AVX512_BF16|AVX512_VP2INTERSECT" }, - { "CPU_ANY_AVX512CD_FLAGS", - "AVX512CD" }, - { "CPU_ANY_AVX512ER_FLAGS", - "AVX512ER" }, - { "CPU_ANY_AVX512PF_FLAGS", - "AVX512PF" }, - { "CPU_ANY_AVX512DQ_FLAGS", - "AVX512DQ" }, - { "CPU_ANY_AVX512BW_FLAGS", - "AVX512BW|CPU_ANY_AVX512_FP16_FLAGS" }, - { "CPU_ANY_AVX512VL_FLAGS", - "AVX512VL" }, - { "CPU_ANY_AVX512IFMA_FLAGS", - "AVX512IFMA" }, - { "CPU_ANY_AVX512VBMI_FLAGS", - "AVX512VBMI" }, - { "CPU_ANY_AVX512_4FMAPS_FLAGS", - "AVX512_4FMAPS" }, - { "CPU_ANY_AVX512_4VNNIW_FLAGS", - "AVX512_4VNNIW" }, - { "CPU_ANY_AVX512_VPOPCNTDQ_FLAGS", - "AVX512_VPOPCNTDQ" }, - { "CPU_ANY_IBT_FLAGS", - "IBT" }, - { "CPU_ANY_SHSTK_FLAGS", - "SHSTK" }, - { "CPU_ANY_AVX512_VBMI2_FLAGS", - "AVX512_VBMI2" }, - { "CPU_ANY_AVX512_VNNI_FLAGS", - "AVX512_VNNI" }, - { "CPU_ANY_AVX512_BITALG_FLAGS", - "AVX512_BITALG" }, - { "CPU_ANY_AVX512_BF16_FLAGS", - "AVX512_BF16" }, - { "CPU_ANY_AMX_INT8_FLAGS", - "AMX_INT8" }, - { "CPU_ANY_AMX_BF16_FLAGS", - "AMX_BF16" }, - { "CPU_ANY_AMX_TILE_FLAGS", - "AMX_TILE|AMX_INT8|AMX_BF16|AMX_FP16" }, - { "CPU_ANY_AVX_VNNI_FLAGS", - "AVX_VNNI" }, - { "CPU_ANY_MOVDIRI_FLAGS", - "MOVDIRI" }, - { "CPU_ANY_UINTR_FLAGS", - "UINTR" }, - { "CPU_ANY_MOVDIR64B_FLAGS", - "MOVDIR64B" }, - { "CPU_ANY_ENQCMD_FLAGS", - "ENQCMD" }, - { "CPU_ANY_SERIALIZE_FLAGS", - "SERIALIZE" }, - { "CPU_ANY_AVX512_VP2INTERSECT_FLAGS", - "AVX512_VP2INTERSECT" }, - { "CPU_ANY_TDX_FLAGS", - "TDX" }, - { "CPU_ANY_TSXLDTRK_FLAGS", - "TSXLDTRK" }, - { "CPU_ANY_KL_FLAGS", - "KL|WideKL" }, - { "CPU_ANY_WIDEKL_FLAGS", - "WideKL" }, - { "CPU_ANY_HRESET_FLAGS", - "HRESET" }, - { "CPU_ANY_AVX512_FP16_FLAGS", - "AVX512_FP16" }, - { "CPU_ANY_AVX_IFMA_FLAGS", - "AVX_IFMA" }, - { "CPU_ANY_AVX_VNNI_INT8_FLAGS", - "AVX_VNNI_INT8" }, - { "CPU_ANY_CMPCCXADD_FLAGS", - "CMPCCXADD" }, - { "CPU_ANY_WRMSRNS_FLAGS", - "WRMSRNS" }, - { "CPU_ANY_MSRLIST_FLAGS", - "MSRLIST" }, - { "CPU_ANY_AVX_NE_CONVERT_FLAGS", - "AVX_NE_CONVERT" }, - { "CPU_ANY_RAO_INT_FLAGS", - "RAO_INT"}, }; +/* This array is populated as process_i386_initializers() walks cpu_flags[]. */ +static unsigned char isa_reverse_deps[Cpu64][Cpu64]; + typedef struct bitfield { int position; @@ -867,32 +614,6 @@ next_field (char *str, char sep, char ** static void set_bitfield (char *, bitfield *, int, unsigned int, int); -static int -set_bitfield_from_cpu_flag_init (char *f, bitfield *array, unsigned int size, - int lineno) -{ - char *str, *next, *last; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE (cpu_flag_init); i++) - if (strcmp (cpu_flag_init[i].name, f) == 0) - { - /* Turn on selective bits. */ - char *init = xstrdup (cpu_flag_init[i].init); - last = init + strlen (init); - for (next = init; next && next < last; ) - { - str = next_field (next, '|', &next, last); - if (str) - set_bitfield (str, array, 1, size, lineno); - } - free (init); - return 0; - } - - return -1; -} - static void set_bitfield (char *f, bitfield *array, int value, unsigned int size, int lineno) @@ -933,10 +654,6 @@ set_bitfield (char *f, bitfield *array, } } - /* Handle CPU_XXX_FLAGS. */ - if (value == 1 && !set_bitfield_from_cpu_flag_init (f, array, size, lineno)) - return; - if (lineno != -1) fail (_("%s: %d: unknown bitfield: %s\n"), filename, lineno, f); else @@ -944,6 +661,73 @@ set_bitfield (char *f, bitfield *array, } static void +add_isa_dependencies (bitfield *flags, const char *f, int value, + unsigned int reverse) +{ + unsigned int i; + char *str = NULL; + const char *isa = f; + bool is_isa = false, is_avx = false; + + /* Need to find base entry for references to auxiliary ones. */ + if (strchr (f, ':')) + { + str = xstrdup (f); + *strchr (str, ':') = '\0'; + isa = str; + } + for (i = 0; i < Cpu64; ++i) + if (strcasecmp (flags[i].name, isa) == 0) + { + flags[i].value = value; + if (reverse < ARRAY_SIZE (isa_reverse_deps[0]) + /* Don't record the feature itself here. */ + && reverse != i + /* Don't record base architectures. */ + && reverse > Cpu686) + isa_reverse_deps[i][reverse] = 1; + is_isa = true; + if (i == CpuAVX || i == CpuXOP) + is_avx = true; + break; + } + free (str); + + /* Do not turn off dependencies. */ + if (is_isa && !value) + return; + + for (i = 0; i < ARRAY_SIZE (isa_dependencies); ++i) + if (strcasecmp (isa_dependencies[i].name, f) == 0) + { + char *deps = xstrdup (isa_dependencies[i].deps); + char *next = deps; + char *last = deps + strlen (deps); + + for (; next && next < last; ) + { + char *str = next_field (next, '|', &next, last); + + /* No AVX/XOP -> SSE reverse dependencies. */ + if (is_avx && strncmp (str, "SSE", 3) == 0) + add_isa_dependencies (flags, str, value, CpuMax); + else + add_isa_dependencies (flags, str, value, reverse); + } + free (deps); + + /* ISA extensions with dependencies need CPU_ANY_*_FLAGS emitted. */ + if (reverse < ARRAY_SIZE (isa_reverse_deps[0])) + isa_reverse_deps[reverse][reverse] = 1; + + return; + } + + if (!is_isa) + fail (_("unknown bitfield: %s\n"), f); +} + +static void output_cpu_flags (FILE *table, bitfield *flags, unsigned int size, int macro, const char *comma, const char *indent) { @@ -975,18 +759,27 @@ output_cpu_flags (FILE *table, bitfield } static void -process_i386_cpu_flag (FILE *table, char *flag, int macro, +process_i386_cpu_flag (FILE *table, char *flag, + const char *name, const char *comma, const char *indent, - int lineno) + int lineno, unsigned int reverse) { char *str, *next = flag, *last; unsigned int i; int value = 1; + bool is_isa = false; bitfield flags [ARRAY_SIZE (cpu_flags)]; /* Copy the default cpu flags. */ memcpy (flags, cpu_flags, sizeof (cpu_flags)); + if (flag == NULL) + { + for (i = 0; i < ARRAY_SIZE (isa_reverse_deps[0]); ++i) + flags[i].value = isa_reverse_deps[reverse][i]; + goto output; + } + if (flag[0] == '~') { last = flag + strlen (flag); @@ -1013,19 +806,54 @@ process_i386_cpu_flag (FILE *table, char value = 0; } + if (name != NULL && value != 0) + { + for (i = 0; i < ARRAY_SIZE (flags); i++) + if (strcasecmp (flags[i].name, name) == 0) + { + add_isa_dependencies (flags, name, 1, reverse); + is_isa = true; + break; + } + } + if (strcmp (flag, "0")) { + if (is_isa) + return; + /* Turn on/off selective bits. */ last = flag + strlen (flag); for (; next && next < last; ) { str = next_field (next, '|', &next, last); - if (str) + if (name == NULL) set_bitfield (str, flags, value, ARRAY_SIZE (flags), lineno); + else + add_isa_dependencies (flags, str, value, reverse); } } - output_cpu_flags (table, flags, ARRAY_SIZE (flags), macro, + output: + if (name != NULL) + { + size_t len = strlen (name); + char *upper = xmalloc (len + 1); + + for (i = 0; i < len; ++i) + { + /* Don't emit #define-s for auxiliary entries. */ + if (name[i] == ':') + return; + upper[i] = TOUPPER (name[i]); + } + upper[i] = '\0'; + fprintf (table, "\n#define CPU_%s%s_FLAGS \\\n", + flag != NULL ? "": "ANY_", upper); + free (upper); + } + + output_cpu_flags (table, flags, ARRAY_SIZE (flags), name != NULL, comma, indent); } @@ -1396,7 +1224,7 @@ output_i386_opcode (FILE *table, const c process_i386_opcode_modifier (table, opcode_modifier, space, prefix, operand_types, lineno); - process_i386_cpu_flag (table, cpu_flags, 0, ",", " ", lineno); + process_i386_cpu_flag (table, cpu_flags, NULL, ",", " ", lineno, CpuMax); fprintf (table, " { "); @@ -1935,7 +1763,6 @@ process_i386_initializers (void) { unsigned int i; FILE *fp = fopen ("i386-init.h", "w"); - char *init; if (fp == NULL) fail (_("can't create i386-init.h, errno = %s\n"), @@ -1943,12 +1770,44 @@ process_i386_initializers (void) process_copyright (fp); - for (i = 0; i < ARRAY_SIZE (cpu_flag_init); i++) + for (i = 0; i < Cpu64; i++) + process_i386_cpu_flag (fp, "0", cpu_flags[i].name, "", " ", -1, i); + + for (i = 0; i < ARRAY_SIZE (isa_dependencies); i++) { - fprintf (fp, "\n#define %s \\\n", cpu_flag_init[i].name); - init = xstrdup (cpu_flag_init[i].init); - process_i386_cpu_flag (fp, init, 1, "", " ", -1); - free (init); + char *deps = xstrdup (isa_dependencies[i].deps); + + process_i386_cpu_flag (fp, deps, isa_dependencies[i].name, + "", " ", -1, CpuMax); + free (deps); + } + + /* Early x87 is somewhat special: Both 287 and 387 not only add new insns + but also remove some. Hence 8087 isn't a prereq to 287, and 287 isn't + one to 387. We want the reverse to be true though: Disabling 8087 also + is to disable 287+ and later; disabling 287 also means disabling 387+. */ + memcpy (isa_reverse_deps[Cpu287], isa_reverse_deps[Cpu387], + sizeof (isa_reverse_deps[0])); + isa_reverse_deps[Cpu287][Cpu387] = 1; + memcpy (isa_reverse_deps[Cpu8087], isa_reverse_deps[Cpu287], + sizeof (isa_reverse_deps[0])); + isa_reverse_deps[Cpu8087][Cpu287] = 1; + + /* While we treat POPCNT as a prereq to SSE4.2, its disabling should not + lead to disabling of anything else. */ + memset (isa_reverse_deps[CpuPOPCNT], 0, sizeof (isa_reverse_deps[0])); + + for (i = Cpu686 + 1; i < ARRAY_SIZE (isa_reverse_deps); i++) + { + size_t len; + char *upper; + + if (memchr(isa_reverse_deps[i], 1, + ARRAY_SIZE (isa_reverse_deps[0])) == NULL) + continue; + + isa_reverse_deps[i][i] = 1; + process_i386_cpu_flag (fp, NULL, cpu_flags[i].name, "", " ", -1, i); } fprintf (fp, "\n");