From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2062b.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::62b]) by sourceware.org (Postfix) with ESMTPS id 1E05A3836DA8 for ; Tue, 4 Jun 2024 13:26:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1E05A3836DA8 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1E05A3836DA8 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:2612::62b ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1717507590; cv=pass; b=xcCNcS24mBB9XGQwWxKx03gHLIIKO5VTkV0dqAU7fQtBC/SHncXX3mlIngpgR9EnhNkf4a1+yGWw8SmRjFp1FxVlIS5ZjgmAhIVyyxa2sysB1UJuzedusiLuJGgQ7Sd5fJNiIZzgIEEHHr65y8Jiuk2OnMuMoyvpyor//4AHbWc= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1717507590; c=relaxed/simple; bh=y7zL8Xa+eQuFseXuSghe/9DG7yvxHKB+nbwBOtHw0KE=; h=DKIM-Signature:DKIM-Signature:Date:From:To:Subject:Message-ID: MIME-Version; b=PYKEWbsM4QRyYC0pV5fZJGzdP1fDz2SeQGbe7qYiITPZxLy45PMafSMuMatj0j5llhI/vFgox8KV5qLLME0LQRDdAaXLaHN2zT7yO5vaQ0thcDa138UYRM6WmdvV92Jw0Di2i4TERgiMFzQoyuEqwCBvUx/TpNh1BWaz2rQ3OJs= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=nqiCqDeWnqX2WUIPHIbCTeAeCjpOfhi/I+/arFyRhs6pW+PVz6zNw2e6DS/PcCMJju0Nl6zgUgi7IkkJg+K2nS4kopoIEylAbWfMNlwTq4nBiRoIjYdEXf1HIN6PtzGNY3cz9hiw05hpV8FBtNRzEFugfKN14QlWwgC4M7SDSXU5KI5a1ZA0NHjW/Z+1DiNWSMmzR+REIFyHv64JPiluRe4aHWGen9bPiWx+jAZgxx8ULMc9adg97a+0CrwXmuitNfK+XeGDYTVh8UiL2LMK9IztL7p5308lc6g6BShZet58hXTCIBrqmmQKcFIUQRteqbvE8c2u2DXAd1jqF9tHew== ARC-Message-Signature: i=2; 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=a1xgV+7vxEive7B7zs7N2JvJLR9riDzeaoNk+3JdKVY=; b=hAlRvLZBo1qxM21Ld/4D/NcPbFtmi2xI7vD2TTDTQq8b2v7X7CKpniZH/cL5UH6QXo2y8EnuUxttqR2jETxVdeGzW3YkwkZjMciiOVnhYJvtpTKAWZSPfKXSddVVyRWN51xPOnOQsrys4nHRdVYKZzIN8EiV6OIBUuZx0LmdhwC560+h+RXdBe6WlUl+5oVdKMJJnrcLHe69lfG0hsmvZMTAzWoo1hjfqSCb2MeuoX4cM4OYEYaaKiagbCp0ypdLOAI6FFzU67S3T8/mLp5VRfw8TlmG0iPEuJuJ5I0k1ITLlSNj8mRuPHdriOOvfJKi+yahOLmKlEMP7bH74rmEQg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=sourceware.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=a1xgV+7vxEive7B7zs7N2JvJLR9riDzeaoNk+3JdKVY=; b=QbvU1mqR4G9IZdf7dNG6b/Iw/kHWkzI+PUFbq9DpVaz+GrZtYirdDCZf81chSDC45BAzh9dMdyTOMVTNheLgAQUXxYDZWE5VHJP7R2zcGEDJg3HLyuCpzUvLPz53N06H/CsZubEFUG5aTTJjenUjx/S+CIMedYWwn/6Q5kj4vuE= Received: from AM0PR03CA0101.eurprd03.prod.outlook.com (2603:10a6:208:69::42) by DB3PR08MB8913.eurprd08.prod.outlook.com (2603:10a6:10:43a::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.21; Tue, 4 Jun 2024 13:26:17 +0000 Received: from AM2PEPF0001C711.eurprd05.prod.outlook.com (2603:10a6:208:69:cafe::ea) by AM0PR03CA0101.outlook.office365.com (2603:10a6:208:69::42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.31 via Frontend Transport; Tue, 4 Jun 2024 13:26:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=arm.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM2PEPF0001C711.mail.protection.outlook.com (10.167.16.181) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.7633.15 via Frontend Transport; Tue, 4 Jun 2024 13:26:17 +0000 Received: ("Tessian outbound 9d4318e1cabb:v327"); Tue, 04 Jun 2024 13:26:17 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 1945aabd360d2d67 X-CR-MTA-TID: 64aa7808 Received: from 315a219b4abc.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 1AD60743-47F5-4076-8C6B-33C3F1DDFC02.1; Tue, 04 Jun 2024 13:26:06 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 315a219b4abc.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 04 Jun 2024 13:26:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=h+SLxU+DTsMRlRiPS9+zvbfXHhmbPyzVsHhH4aXsiVhrWGnAHB9SuFGISj1mbzKJ6gwSQh36g7ABq7DFj9UVSHF2anlu8jvm05hpR2FbBApnpEISb4r9rwS69haMgD4dNeXKEkzVj6P17St7/VKkrgQgriVqexyROqTwQ0tW1VyLJYabyRw/5m5/yv8UGDA2OO2wuOW7mSi2MHDj6IDY5JOTAhaUR6aNH5F5FFWCu8+IJPM6dYGSvGj50dDsO3PRFzd9gWY1P7e27OF78bs582hlyOlUYFbd/wjODNq4h/x2WMxgcYfSZ3spY29JgJqthc1WOtmbXb2G+aYvMum2BA== 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=a1xgV+7vxEive7B7zs7N2JvJLR9riDzeaoNk+3JdKVY=; b=RRW5zHm2KpGDCN9FioHpbEZy0VQgYJm0krCh/d5RWnaWMaCe4glStaLAETDYBAkxWsd5FCyY/jdW7i2xZ1zURrwu34cDamsUEp0mTYmROOv9pmCdgAHsvU7eXEj5jChnbLsSCFIniHv9yw2u9SkU/rh5nyyjEBT0I1XRC7qOMovg3eM4r4tTUOPYdbFhd2LB7FuT80AxfKR/uUSGcn+hElZccePL7BudAOEayY+vWIqbXED0Eragv5ss5KvuUzw2a4tc0B8Wo5VbE/nKBHLT0YkAT/fv0DnO8Me/YegVErsSWoJH0PFSRwRfN7wfEVYZB5ySN9d4KBW8xygXvQHPxw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=a1xgV+7vxEive7B7zs7N2JvJLR9riDzeaoNk+3JdKVY=; b=QbvU1mqR4G9IZdf7dNG6b/Iw/kHWkzI+PUFbq9DpVaz+GrZtYirdDCZf81chSDC45BAzh9dMdyTOMVTNheLgAQUXxYDZWE5VHJP7R2zcGEDJg3HLyuCpzUvLPz53N06H/CsZubEFUG5aTTJjenUjx/S+CIMedYWwn/6Q5kj4vuE= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from AS8PR08MB6678.eurprd08.prod.outlook.com (2603:10a6:20b:398::8) by FRZPR08MB11022.eurprd08.prod.outlook.com (2603:10a6:d10:13d::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7611.27; Tue, 4 Jun 2024 13:25:55 +0000 Received: from AS8PR08MB6678.eurprd08.prod.outlook.com ([fe80::3b48:ae45:5b79:cc29]) by AS8PR08MB6678.eurprd08.prod.outlook.com ([fe80::3b48:ae45:5b79:cc29%6]) with mapi id 15.20.7633.021; Tue, 4 Jun 2024 13:25:55 +0000 Date: Tue, 4 Jun 2024 14:25:51 +0100 From: Andrew Carlotti To: binutils@sourceware.org Cc: Richard Earnshaw Subject: [PATCH] aarch64: Enable gating instructions with FEAT_X || FEAT_Y Message-ID: Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-ClientProxiedBy: LO2P265CA0323.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a4::23) To AS8PR08MB6678.eurprd08.prod.outlook.com (2603:10a6:20b:398::8) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR08MB6678:EE_|FRZPR08MB11022:EE_|AM2PEPF0001C711:EE_|DB3PR08MB8913:EE_ X-MS-Office365-Filtering-Correlation-Id: 1e14f516-a6b5-4fdc-85ff-08dc8499ea3b x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230031|366007|376005|1800799015; X-Microsoft-Antispam-Message-Info-Original: =?us-ascii?Q?eRS7XAVKF7XFuh2x8/Cd2a9nMNw+RPR9atBW11nWVett1mjiddeYjROyr9k9?= =?us-ascii?Q?T0vBi1cXbUfhFF25Nwaq6Ew+dQFfXHCcxm6RHc9x26FphKgUFtVdly93zatJ?= =?us-ascii?Q?hakTR3LK9c7kH4pSC7ZpDG843GwwxDLovcPHZttrzH1OhISjL6hdDMij4zzI?= =?us-ascii?Q?deEp9NCSp3YB/aZ93jU2hGu8MvxTcyv/81OWRwVJhwbqXpdkIvE29H/1hWyP?= =?us-ascii?Q?KRNNOzV6mzxkaSo9+FamyxCXt9Fcn+erEow3CJrQty7N8SzvMIKZNrdTgz7k?= =?us-ascii?Q?odufroV4ZJaRIXTsiokOPSXPGEvAG6idD9RvSHBtY7LiPzL0i/O7Y+89V1dv?= =?us-ascii?Q?N5baS7nsEncLgpAgVl1g6v/t1Dv2pc0exg8696rVRgCjB6kviZp5Ppc3oUhj?= =?us-ascii?Q?2Nf1h/BT6fU+8nQ48RgumYxktr3UmKsM0yJ4UoKseeeAkprShsCCtJIE8mkt?= =?us-ascii?Q?toz73I7uyzRKPOhV1jyuhuYvk/1rreIgx6weUxOuJXqYTj7YetrAaF13NITF?= =?us-ascii?Q?N5cXKVa6GZ7C7v791GDiJaNxrx9I1PRVsujJXgapoL3+ho4Ed2/TgZpo7OOg?= =?us-ascii?Q?4hF3HqEB1U7Z5N+USoCt/oP5Kf77B76+QdjdbKP6/vY9OnOvpC+RkpKkymCM?= =?us-ascii?Q?jx7lF+jebhaj50e/yvKw5aSopWNwN80zwnhbAX6vw9fYV2G5Rk+0ZIk0qa4P?= =?us-ascii?Q?O7MOqxw6XCMj7BPPAiHgSEuVBTK2mPeb67smDale5huRUj6cvJDpgeEK7DD8?= =?us-ascii?Q?xj3tOCTVhIirXZKFHQa9/0AYVhE9OOoXjbaYcsoNldrLbxECME6iB99TviE3?= =?us-ascii?Q?vxEuLN+RCOU6HnEaFzc2B86yj2k0emu37RSkr/0EO9dQyoufd2tbWoqrzzrg?= =?us-ascii?Q?WBn/Mfl+leTJEekrp6g5JEdLJlTz8XNy3xC8cyhAz0ZZ6LkdTb2GqYDX0vhP?= =?us-ascii?Q?PudFgWR3UTUWiLOxCoZwYbrMzI2izpTMjJdCgFO8JnNTI6lknz4a5xoKXCIh?= =?us-ascii?Q?KIRzk7FJxcy7M8IejHioCS787WICNmOoIDdFum72Kj1MoFamE+JSl5ZSqYzo?= =?us-ascii?Q?UD1ANHxRvjmwiCeU1OZzaEnY/Av1PQSPc+aN/D/CaQN0kgycHOVf0JxaQqt0?= =?us-ascii?Q?jKj7HX1t8kjXirV6tBKBndZf3JvwsVCHAgj6wAfs2VF8lf/5P0O7UYDWGDrF?= =?us-ascii?Q?YZxuwTxhdACWvFbLrXcj4Cs91ctWG5ejwHI7l4lnYXhiRPkwpn9+BXYX5l57?= =?us-ascii?Q?KpqhgteEXTH0OcId9Kry0WcJL5mTl+72HTWSLj/GGg=3D=3D?= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR08MB6678.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366007)(376005)(1800799015);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: FRZPR08MB11022 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM2PEPF0001C711.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 435a905c-04df-478d-1a09-08dc8499dd43 X-Microsoft-Antispam: BCL:0;ARA:13230031|35042699013|1800799015|36860700004|82310400017|376005; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?mxEH6Os5/HZ7jFOCcxmpuyzaHn8rzCC4OCIf/WlJNq3RQXRd1+waTRQv+vcH?= =?us-ascii?Q?Znus6SAi8tKBpnlHcwgnchdaQ484TtOE65J4uhNANm5Gr9xxXnZnSAMS47If?= =?us-ascii?Q?xEqqafdeQVWOUFf/lLZihApIQDV/3ERRRE/WXujrPV50T8bvrVSQOaCeUz5i?= =?us-ascii?Q?jx1N11SqdhFHWl3Kp2/PmEp6iwCnzSMfSJdc+MHdmUxabfjzp738v3dhdlEd?= =?us-ascii?Q?fuEfoxvGlZtSwIlmbk5aM0dAT70CyvMDikeaf+YmvzwCLjtq6sX+1Q/wVB2I?= =?us-ascii?Q?dY9dZVkVf+kefIUBRC9MtghifoV5X6iac5oryUWWGjOj9lw2zH+kmJaw1aeK?= =?us-ascii?Q?Yjce7CFzZaD/xtT3dtMoy8iHKSwwaEcDYuiyiQCSW0JzevIi0D+V9+rejJsl?= =?us-ascii?Q?zQgntJisaVUgg9ySGPvRiV+9G/0rS7Grt5Z042/obVU3KA8LYwR8Klf3o+pq?= =?us-ascii?Q?ZHJZ4yV9L+xfrzzf7Z/fC8XimUmuAiLSMDnHdA2ozs32Nf164ftO8nvbfM45?= =?us-ascii?Q?GQeMAuKNVojM55JCTb/0RLSQqVnE7gSGUh2qKDJKyMw0YX2nqUSSb3x/9Fzx?= =?us-ascii?Q?3DBCmuG+ZA1QoNYdhTOCeKIsPUYhbivjko6VvsEjbIPpuSIVla3CzEdDXgwi?= =?us-ascii?Q?fcCxcwItOUEI9XS1ifrb6WODXD68yV2wq6x2RNNrcX3RAbE4SaAx0yhGe9XB?= =?us-ascii?Q?ly/QPTlBi96tYG22voluRgbEfNkefZdFJenkxIljVgHZ3EqMOEGFscKseMWl?= =?us-ascii?Q?bkd1YpjBE92o4o2UyFzsBCbaj1lgqXkQmEhfh3Yk31vCf4Ni825ZJdkdujRG?= =?us-ascii?Q?FvDXI2T9LwOh8+sJ8YTgdJQmNAGX5JWgZCe6mBu1vG9NGPH2T5xGOOVgI7v5?= =?us-ascii?Q?91fYlU2HhsElf7P8AJ5qHYpYPlp6VTzA9QlMo1BJ+RVwpsLK4HcdLbg12mUp?= =?us-ascii?Q?OJxSvqVJTXUIQkF+34eT5Ot81aSjjrYkTs581E5HIrN81vojUB3volQFMDb+?= =?us-ascii?Q?NxKRDXLoQ5UUkEVZ/a8m9uGy6KofSdseatGtNBnYxfe71ZqhyUR+0DFJUR1I?= =?us-ascii?Q?nXhTPE7u8PSermG9N4XocQCZaFJnz/6esr/zUpJjlpUPoag+CYGYdrx7ABIX?= =?us-ascii?Q?sn1Qi3xbSCWPSd/uFe/O7hkX3hkTPD41LRSCaM8tWP2adAZD/DJZeOmcG0bx?= =?us-ascii?Q?8L6F0ZiRRZMdTyNSkpEdoTCBLi2bnofoKR+rF0hcYTzNTKWzhmS1xHFT/Tqx?= =?us-ascii?Q?+/iHBk9KqbkshlHuGHyE+oNbTvBm7IcEyzwzR7ZOFLgoStlF4m8SjoiJGAGC?= =?us-ascii?Q?ckEcfSa27F5g4XJQgpW9peQmQg9CqwLkJw/T7FK3CHeOTN0IwHh5vDNiEoKj?= =?us-ascii?Q?LjOiVNw=3D?= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230031)(35042699013)(1800799015)(36860700004)(82310400017)(376005);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2024 13:26:17.3618 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1e14f516-a6b5-4fdc-85ff-08dc8499ea3b X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM2PEPF0001C711.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR08MB8913 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_SPF_HELO,GIT_PATCH_0,KAM_LOTSOFHASH,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Some aarch64 instructions can be enabled independently by two different feature sets. This patch extends aarch64_opcode->avariant to a 2-element array of feature sets. Checks for opcode enablement now use a new inline function that tests both feature sets. These two feature sets are identical for all currently supported instructions, so there is no functional change. This passes all existing tests, and is further tested via its usage in my subsequent FP8 patches. I've additionally tested the new behaviour by changing one or both features sets in arch64_feature_dotprod, and verifying that assembly only fails when both specied feature sets are not present. Is this ok for master? diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index fec17c40a43e60e294b6aab8976e5926a3c49230..c421bfdac1f423344f5ecdb998d1d0b8d24f3ae5 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -6567,10 +6567,10 @@ parse_operands (char *str, const aarch64_opcode *opcode) clear_error (); skip_whitespace (str); - if (AARCH64_CPU_HAS_FEATURE (*opcode->avariant, SME2)) + if (AARCH64_CPU_HAS_FEATURE ((*opcode->avariant)[0], SME2)) imm_reg_type = REG_TYPE_R_ZR_SP_BHSDQ_VZP_PN; - else if (AARCH64_CPU_HAS_FEATURE (*opcode->avariant, SVE) - || AARCH64_CPU_HAS_FEATURE (*opcode->avariant, SVE2)) + else if (AARCH64_CPU_HAS_FEATURE ((*opcode->avariant)[0], SVE) + || AARCH64_CPU_HAS_FEATURE ((*opcode->avariant)[0], SVE2)) imm_reg_type = REG_TYPE_R_ZR_SP_BHSDQ_VZP; else imm_reg_type = REG_TYPE_R_ZR_BHSDQ_V; diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h index 8a21611e3ff59220ae5e25120c375ac2db111b77..9da73a932f7083b0e6d9964eda5e38124808f5da 100644 --- a/include/opcode/aarch64.h +++ b/include/opcode/aarch64.h @@ -1183,6 +1183,10 @@ typedef struct aarch64_instr_sequence aarch64_instr_sequence; /* Forward declare instruction definition. */ typedef struct aarch64_inst aarch64_inst; +/* Maximum number of architecture feature sets that can independently enable + an instruction. */ +#define AARCH64_MAX_AVARIANT_NUM 2 + /* This structure holds information for a particular opcode. */ struct aarch64_opcode @@ -1207,7 +1211,7 @@ struct aarch64_opcode enum aarch64_op op; /* Which architecture variant provides this instruction. */ - const aarch64_feature_set *avariant; + const aarch64_feature_set (*avariant)[AARCH64_MAX_AVARIANT_NUM]; /* An array of operand codes. Each code is an index into the operand table. They appear in the order which the operands must @@ -1327,6 +1331,14 @@ extern const aarch64_opcode aarch64_opcode_table[]; #define C_SCAN_MOPS_PME (3U << 2) /* Next bit is 4. */ +static inline bool +cpu_enables_opcode_p (const aarch64_feature_set cpu, + const aarch64_opcode *opcode) +{ + return AARCH64_CPU_HAS_ALL_FEATURES (cpu, (*opcode->avariant)[0]) + || AARCH64_CPU_HAS_ALL_FEATURES (cpu, (*opcode->avariant)[1]); +} + static inline bool alias_opcode_p (const aarch64_opcode *opcode) { diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c index 213df616608b3ea3159b4f6b92b65ea319999a0a..d92bc38ab6075a0bc989b576785a125ba67d696c 100644 --- a/opcodes/aarch64-dis.c +++ b/opcodes/aarch64-dis.c @@ -3315,7 +3315,7 @@ determine_disassembling_preference (struct aarch64_inst *inst, continue; } - if (!AARCH64_CPU_HAS_ALL_FEATURES (arch_variant, *alias->avariant)) + if (!cpu_enables_opcode_p(arch_variant, alias)) { DEBUG_TRACE ("skip %s: we're missing features", alias->name); continue; diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c index bbe6f09808b6e85307b1fad039b5ebca7b489bf0..29909606dc27798de57d568775efb7e8dc822a70 100644 --- a/opcodes/aarch64-opc.c +++ b/opcodes/aarch64-opc.c @@ -5515,8 +5515,8 @@ verify_constraints (const struct aarch64_inst *inst, /* Check to see if the MOVPRFX SVE instruction is followed by an SVE instruction for better error messages. */ if (!opcode->avariant - || (!AARCH64_CPU_HAS_FEATURE (*opcode->avariant, SVE) - && !AARCH64_CPU_HAS_FEATURE (*opcode->avariant, SVE2))) + || (!AARCH64_CPU_HAS_FEATURE ((*opcode->avariant)[0], SVE) + && !AARCH64_CPU_HAS_FEATURE ((*opcode->avariant)[0], SVE2))) { mismatch_detail->kind = AARCH64_OPDE_SYNTAX_ERROR; mismatch_detail->error = _("SVE instruction expected after " @@ -5761,7 +5761,7 @@ aarch64_cpu_supports_inst_p (aarch64_feature_set cpu_variant, aarch64_inst *inst) { if (!inst->opcode->avariant - || !AARCH64_CPU_HAS_ALL_FEATURES (cpu_variant, *inst->opcode->avariant)) + || !cpu_enables_opcode_p (cpu_variant, inst->opcode)) return false; if (inst->opcode->iclass == sme_fp_sd diff --git a/opcodes/aarch64-tbl.h b/opcodes/aarch64-tbl.h index 1d12630273e063bc7171b1f8f16dd687f7ec954f..117806621484aad4c2d7907957d4b7c74bfa745f 100644 --- a/opcodes/aarch64-tbl.h +++ b/opcodes/aarch64-tbl.h @@ -2588,163 +2588,104 @@ QLF3(V_4S, V_8H, S_H), \ } -/* Opcode table. - - Any SVE or SVE2 feature must include AARCH64_FEATURE_{SVE|SVE2} in its - bitmask, even if this is implied by other selected feature bits. This - allows verify_constraints to identify SVE instructions when selecting an - error message for MOVPRFX constraint violations. */ - -static const aarch64_feature_set aarch64_feature_v8 = - AARCH64_FEATURE (V8); -static const aarch64_feature_set aarch64_feature_fp = - AARCH64_FEATURE (FP); -static const aarch64_feature_set aarch64_feature_simd = - AARCH64_FEATURE (SIMD); -static const aarch64_feature_set aarch64_feature_crc = - AARCH64_FEATURE (CRC); -static const aarch64_feature_set aarch64_feature_lse = - AARCH64_FEATURE (LSE); -static const aarch64_feature_set aarch64_feature_lse128 = - AARCH64_FEATURES (2, LSE, LSE128); -static const aarch64_feature_set aarch64_feature_lor = - AARCH64_FEATURE (LOR); -static const aarch64_feature_set aarch64_feature_rdma = - AARCH64_FEATURE (RDMA); -static const aarch64_feature_set aarch64_feature_fp_f16 = - AARCH64_FEATURES (2, F16, FP); -static const aarch64_feature_set aarch64_feature_simd_f16 = - AARCH64_FEATURES (2, F16, SIMD); -static const aarch64_feature_set aarch64_feature_sve = - AARCH64_FEATURE (SVE); -static const aarch64_feature_set aarch64_feature_pauth = - AARCH64_FEATURE (PAUTH); -static const aarch64_feature_set aarch64_feature_compnum = - AARCH64_FEATURE (COMPNUM); -static const aarch64_feature_set aarch64_feature_jscvt = - AARCH64_FEATURE (JSCVT); -static const aarch64_feature_set aarch64_feature_rcpc = - AARCH64_FEATURE (RCPC); -static const aarch64_feature_set aarch64_feature_rcpc2 = - AARCH64_FEATURE (RCPC2); -static const aarch64_feature_set aarch64_feature_dotprod = - AARCH64_FEATURE (DOTPROD); -static const aarch64_feature_set aarch64_feature_sha2 = - AARCH64_FEATURES (2, V8, SHA2); -static const aarch64_feature_set aarch64_feature_aes = - AARCH64_FEATURES (2, V8, AES); -static const aarch64_feature_set aarch64_feature_sm4 = - AARCH64_FEATURES (3, SM4, SIMD, FP); -static const aarch64_feature_set aarch64_feature_sha3 = - AARCH64_FEATURES (4, SHA2, SHA3, SIMD, FP); -static const aarch64_feature_set aarch64_feature_fp_16_v8_2a = - AARCH64_FEATURES (3, F16_FML, F16, FP); -static const aarch64_feature_set aarch64_feature_flagmanip = - AARCH64_FEATURE (FLAGMANIP); -static const aarch64_feature_set aarch64_feature_frintts = - AARCH64_FEATURE (FRINTTS); -static const aarch64_feature_set aarch64_feature_sb = - AARCH64_FEATURE (SB); -static const aarch64_feature_set aarch64_feature_predres = - AARCH64_FEATURE (PREDRES); -static const aarch64_feature_set aarch64_feature_predres2 = - AARCH64_FEATURES (2, PREDRES, PREDRES2); -static const aarch64_feature_set aarch64_feature_memtag = - AARCH64_FEATURE (MEMTAG); -static const aarch64_feature_set aarch64_feature_bfloat16 = - AARCH64_FEATURE (BFLOAT16); -static const aarch64_feature_set aarch64_feature_bfloat16_sve = - AARCH64_FEATURES (2, BFLOAT16, SVE); -static const aarch64_feature_set aarch64_feature_tme = - AARCH64_FEATURE (TME); -static const aarch64_feature_set aarch64_feature_sve2 = - AARCH64_FEATURE (SVE2); -static const aarch64_feature_set aarch64_feature_sve2aes = - AARCH64_FEATURES (2, SVE2, SVE2_AES); -static const aarch64_feature_set aarch64_feature_sve2sha3 = - AARCH64_FEATURES (2, SVE2, SVE2_SHA3); -static const aarch64_feature_set aarch64_feature_sve2sm4 = - AARCH64_FEATURES (2, SVE2, SVE2_SM4); -static const aarch64_feature_set aarch64_feature_sve2bitperm = - AARCH64_FEATURES (2, SVE2, SVE2_BITPERM); -static const aarch64_feature_set aarch64_feature_sme = - AARCH64_FEATURES (2, SVE2, SME); -static const aarch64_feature_set aarch64_feature_sme_f64f64 = - AARCH64_FEATURES (3, SVE2, SME, SME_F64F64); -static const aarch64_feature_set aarch64_feature_sme_i16i64 = - AARCH64_FEATURES (3, SVE2, SME, SME_I16I64); -static const aarch64_feature_set aarch64_feature_sme2 = - AARCH64_FEATURES (3, SVE2, SME, SME2); -static const aarch64_feature_set aarch64_feature_sme2_i16i64 = - AARCH64_FEATURES (2, SME2, SME_I16I64); -static const aarch64_feature_set aarch64_feature_sme2_f64f64 = - AARCH64_FEATURES (2, SME2, SME_F64F64); -static const aarch64_feature_set aarch64_feature_i8mm = - AARCH64_FEATURE (I8MM); -static const aarch64_feature_set aarch64_feature_i8mm_sve = - AARCH64_FEATURES (2, I8MM, SVE); -static const aarch64_feature_set aarch64_feature_f32mm_sve = - AARCH64_FEATURES (2, F32MM, SVE); -static const aarch64_feature_set aarch64_feature_f64mm_sve = - AARCH64_FEATURES (2, F64MM, SVE); -static const aarch64_feature_set aarch64_feature_v8r = - AARCH64_FEATURE (V8R); -static const aarch64_feature_set aarch64_feature_ls64 = - AARCH64_FEATURE (LS64); -static const aarch64_feature_set aarch64_feature_flagm = - AARCH64_FEATURE (FLAGM); -static const aarch64_feature_set aarch64_feature_xs = - AARCH64_FEATURE (XS); -static const aarch64_feature_set aarch64_feature_wfxt = - AARCH64_FEATURE (WFXT); -static const aarch64_feature_set aarch64_feature_mops = - AARCH64_FEATURE (MOPS); -static const aarch64_feature_set aarch64_feature_mops_memtag = - AARCH64_FEATURES (2, MOPS, MEMTAG); -static const aarch64_feature_set aarch64_feature_hbc = - AARCH64_FEATURE (HBC); -static const aarch64_feature_set aarch64_feature_cssc = - AARCH64_FEATURE (CSSC); -static const aarch64_feature_set aarch64_feature_chk = - AARCH64_FEATURE (CHK); -static const aarch64_feature_set aarch64_feature_gcs = - AARCH64_FEATURE (GCS); -static const aarch64_feature_set aarch64_feature_ite = - AARCH64_FEATURE (ITE); -static const aarch64_feature_set aarch64_feature_d128 = - AARCH64_FEATURE (D128); -static const aarch64_feature_set aarch64_feature_the = - AARCH64_FEATURE (THE); -static const aarch64_feature_set aarch64_feature_d128_the = - AARCH64_FEATURES (2, D128, THE); -static const aarch64_feature_set aarch64_feature_b16b16 = - AARCH64_FEATURE (B16B16); -static const aarch64_feature_set aarch64_feature_sme2p1 = - AARCH64_FEATURE (SME2p1); -static const aarch64_feature_set aarch64_feature_sve2p1 = - AARCH64_FEATURE (SVE2p1); -static const aarch64_feature_set aarch64_feature_rcpc3 = - AARCH64_FEATURE (RCPC3); -static const aarch64_feature_set aarch64_feature_cpa = - AARCH64_FEATURE (CPA); -static const aarch64_feature_set aarch64_feature_cpa_sve = - AARCH64_FEATURES (2, CPA, SVE); -static const aarch64_feature_set aarch64_feature_faminmax = - AARCH64_FEATURE (FAMINMAX); -static const aarch64_feature_set aarch64_feature_faminmax_sve2 = - AARCH64_FEATURES (2, FAMINMAX, SVE2); -static const aarch64_feature_set aarch64_feature_faminmax_sme2 = - AARCH64_FEATURES (3, SVE2, FAMINMAX, SME2); -static const aarch64_feature_set aarch64_feature_fp8 = - AARCH64_FEATURE (FP8); -static const aarch64_feature_set aarch64_feature_fp8_sve2 = - AARCH64_FEATURES (2, FP8, SVE2); -static const aarch64_feature_set aarch64_feature_fp8_sme2 = - AARCH64_FEATURES (2, FP8, SME2); -static const aarch64_feature_set aarch64_feature_lut = - AARCH64_FEATURE (LUT); -static const aarch64_feature_set aarch64_feature_lut_sve2 = - AARCH64_FEATURES (2, LUT, SVE2); + +#define FEATURE_SET_OR_1(NAME,FEATS1) \ +static const aarch64_feature_set \ +aarch64_feature_##NAME[AARCH64_MAX_AVARIANT_NUM] = {FEATS1, FEATS1}; + +#define FEATURE_SET_OR_2(NAME,FEATS1,FEATS2) \ +static const aarch64_feature_set \ +aarch64_feature_##NAME[AARCH64_MAX_AVARIANT_NUM] = {FEATS1, FEATS2}; + + +/* Any SVE or SVE2 feature must include AARCH64_FEATURE_{SVE|SVE2} in its + bitmask in the first feature set, even if this is implied by other selected + feature bits. Similarly, any SME feature must include AARCH64_FEATURE_SME. + + This restriction allows parse operands to select appropriate reg types to + exclude when parsing immediate values, and allows verify_constraints to + identify SVE instructions when selecting an error message for MOVPRFX + constraint violations. + + Only the first feature set is checked in these cases, so that existing + opcode parsing is not changed when adding an alternative enabling feature + set. */ + +FEATURE_SET_OR_1(v8, AARCH64_FEATURE (V8)) +FEATURE_SET_OR_1(fp, AARCH64_FEATURE (FP)) +FEATURE_SET_OR_1(simd, AARCH64_FEATURE (SIMD)) +FEATURE_SET_OR_1(crc, AARCH64_FEATURE (CRC)) +FEATURE_SET_OR_1(lse, AARCH64_FEATURE (LSE)) +FEATURE_SET_OR_1(lse128, AARCH64_FEATURES (2, LSE, LSE128)) +FEATURE_SET_OR_1(lor, AARCH64_FEATURE (LOR)) +FEATURE_SET_OR_1(rdma, AARCH64_FEATURE (RDMA)) +FEATURE_SET_OR_1(fp_f16, AARCH64_FEATURES (2, F16, FP)) +FEATURE_SET_OR_1(simd_f16, AARCH64_FEATURES (2, F16, SIMD)) +FEATURE_SET_OR_1(sve, AARCH64_FEATURE (SVE)) +FEATURE_SET_OR_1(pauth, AARCH64_FEATURE (PAUTH)) +FEATURE_SET_OR_1(compnum, AARCH64_FEATURE (COMPNUM)) +FEATURE_SET_OR_1(jscvt, AARCH64_FEATURE (JSCVT)) +FEATURE_SET_OR_1(rcpc, AARCH64_FEATURE (RCPC)) +FEATURE_SET_OR_1(rcpc2, AARCH64_FEATURE (RCPC2)) +FEATURE_SET_OR_1(dotprod, AARCH64_FEATURE (DOTPROD)) +FEATURE_SET_OR_1(sha2, AARCH64_FEATURES (2, V8, SHA2)) +FEATURE_SET_OR_1(aes, AARCH64_FEATURES (2, V8, AES)) +FEATURE_SET_OR_1(sm4, AARCH64_FEATURES (3, SM4, SIMD, FP)) +FEATURE_SET_OR_1(sha3, AARCH64_FEATURES (4, SHA2, SHA3, SIMD, FP)) +FEATURE_SET_OR_1(fp_16_v8_2a, AARCH64_FEATURES (3, F16_FML, F16, FP)) +FEATURE_SET_OR_1(flagmanip, AARCH64_FEATURE (FLAGMANIP)) +FEATURE_SET_OR_1(frintts, AARCH64_FEATURE (FRINTTS)) +FEATURE_SET_OR_1(sb, AARCH64_FEATURE (SB)) +FEATURE_SET_OR_1(predres, AARCH64_FEATURE (PREDRES)) +FEATURE_SET_OR_1(predres2, AARCH64_FEATURES (2, PREDRES, PREDRES2)) +FEATURE_SET_OR_1(memtag, AARCH64_FEATURE (MEMTAG)) +FEATURE_SET_OR_1(bfloat16, AARCH64_FEATURE (BFLOAT16)) +FEATURE_SET_OR_1(bfloat16_sve, AARCH64_FEATURES (2, BFLOAT16, SVE)) +FEATURE_SET_OR_1(tme, AARCH64_FEATURE (TME)) +FEATURE_SET_OR_1(sve2, AARCH64_FEATURE (SVE2)) +FEATURE_SET_OR_1(sve2aes, AARCH64_FEATURES (2, SVE2, SVE2_AES)) +FEATURE_SET_OR_1(sve2sha3, AARCH64_FEATURES (2, SVE2, SVE2_SHA3)) +FEATURE_SET_OR_1(sve2sm4, AARCH64_FEATURES (2, SVE2, SVE2_SM4)) +FEATURE_SET_OR_1(sve2bitperm, AARCH64_FEATURES (2, SVE2, SVE2_BITPERM)) +FEATURE_SET_OR_1(sme, AARCH64_FEATURES (2, SVE2, SME)) +FEATURE_SET_OR_1(sme_f64f64, AARCH64_FEATURES (3, SVE2, SME, SME_F64F64)) +FEATURE_SET_OR_1(sme_i16i64, AARCH64_FEATURES (3, SVE2, SME, SME_I16I64)) +FEATURE_SET_OR_1(sme2, AARCH64_FEATURES (3, SVE2, SME, SME2)) +FEATURE_SET_OR_1(sme2_i16i64, AARCH64_FEATURES (2, SME2, SME_I16I64)) +FEATURE_SET_OR_1(sme2_f64f64, AARCH64_FEATURES (2, SME2, SME_F64F64)) +FEATURE_SET_OR_1(i8mm, AARCH64_FEATURE (I8MM)) +FEATURE_SET_OR_1(i8mm_sve, AARCH64_FEATURES (2, I8MM, SVE)) +FEATURE_SET_OR_1(f32mm_sve, AARCH64_FEATURES (2, F32MM, SVE)) +FEATURE_SET_OR_1(f64mm_sve, AARCH64_FEATURES (2, F64MM, SVE)) +FEATURE_SET_OR_1(v8r, AARCH64_FEATURE (V8R)) +FEATURE_SET_OR_1(ls64, AARCH64_FEATURE (LS64)) +FEATURE_SET_OR_1(flagm, AARCH64_FEATURE (FLAGM)) +FEATURE_SET_OR_1(xs, AARCH64_FEATURE (XS)) +FEATURE_SET_OR_1(wfxt, AARCH64_FEATURE (WFXT)) +FEATURE_SET_OR_1(mops, AARCH64_FEATURE (MOPS)) +FEATURE_SET_OR_1(mops_memtag, AARCH64_FEATURES (2, MOPS, MEMTAG)) +FEATURE_SET_OR_1(hbc, AARCH64_FEATURE (HBC)) +FEATURE_SET_OR_1(cssc, AARCH64_FEATURE (CSSC)) +FEATURE_SET_OR_1(chk, AARCH64_FEATURE (CHK)) +FEATURE_SET_OR_1(gcs, AARCH64_FEATURE (GCS)) +FEATURE_SET_OR_1(ite, AARCH64_FEATURE (ITE)) +FEATURE_SET_OR_1(d128, AARCH64_FEATURE (D128)) +FEATURE_SET_OR_1(the, AARCH64_FEATURE (THE)) +FEATURE_SET_OR_1(d128_the, AARCH64_FEATURES (2, D128, THE)) +FEATURE_SET_OR_1(b16b16, AARCH64_FEATURE (B16B16)) +FEATURE_SET_OR_1(sme2p1, AARCH64_FEATURE (SME2p1)) +FEATURE_SET_OR_1(sve2p1, AARCH64_FEATURE (SVE2p1)) +FEATURE_SET_OR_1(rcpc3, AARCH64_FEATURE (RCPC3)) +FEATURE_SET_OR_1(cpa, AARCH64_FEATURE (CPA)) +FEATURE_SET_OR_1(cpa_sve, AARCH64_FEATURES (2, CPA, SVE)) +FEATURE_SET_OR_1(faminmax, AARCH64_FEATURE (FAMINMAX)) +FEATURE_SET_OR_1(faminmax_sve2, AARCH64_FEATURES (2, FAMINMAX, SVE2)) +FEATURE_SET_OR_1(faminmax_sme2, AARCH64_FEATURES (3, SVE2, FAMINMAX, SME2)) +FEATURE_SET_OR_1(fp8, AARCH64_FEATURE (FP8)) +FEATURE_SET_OR_1(fp8_sve2, AARCH64_FEATURES (2, FP8, SVE2)) +FEATURE_SET_OR_1(fp8_sme2, AARCH64_FEATURES (2, FP8, SME2)) +FEATURE_SET_OR_1(lut, AARCH64_FEATURE (LUT)) +FEATURE_SET_OR_1(lut_sve2, AARCH64_FEATURES (2, LUT, SVE2)) #define CORE &aarch64_feature_v8 #define FP &aarch64_feature_fp