From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on20601.outbound.protection.outlook.com [IPv6:2a01:111:f403:260d::601]) by sourceware.org (Postfix) with ESMTPS id 893753875DD1 for ; Wed, 12 Jun 2024 14:52:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 893753875DD1 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 893753875DD1 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:260d::601 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1718203936; cv=pass; b=vx47QhysLbCDUBwEtxmMmW5nyJY5tpRpOkSI/6vXtjGqtOvj5zF/ij/siaNF1b/DJ+C0N2TYEJuLqRqYpLzxjxCfc1gfPNMB1caf9241GBFzCNSFUmdIYtEe5tvnXKbRCu4Bn+wx0t7Zjb7TNpc49M7B4fHTGicSjaFrTuajSQo= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1718203936; c=relaxed/simple; bh=x7LabSU8hNiNyECcKhoO/yaskY+QWj/QZoGJaVzMjek=; h=DKIM-Signature:DKIM-Signature:Date:From:To:Subject:Message-ID: MIME-Version; b=HO3tb4Jmul9dqQwhPCyfUjPRWe/xQKzEroR5ONWERAOkwPgBLNgX5Id841ObKJ7zcYjuIoZi+/eva8BTCVUfPbCuk4+Merr/hsQsZ4zmL6foZTzPMZn7hPrDG3IqxZqpheo59XL2OTp2OTa/Z9gPW80RRvRu81N+hAd2mkkqeNY= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=j9+P0g38iZmtiPqakqfgrtYY3audKyvLSo+VRV0KZDa1CSTw315SKnYyb6yckUZWAOUZ1rQJAbdqRD2xqIeOmwZToesq/M6KBo6CLArP58PNsgcgc6oD897NJGQdwL8Qlhn15UlPnwdhKocxOJP6REa1YmKqakkavAMPHyjwY3tgGo9RsjGAzFyH/aeQZtqPTbnnfvMpdRg93V5ucs2Rhyve+dTPvcMvHGMPwDUoDjRw9n3YJzFh9ZAoApN2PU5Z3PEnTZdSHR9YnyfIhK+jMipERk3fTDB4g5vruMSrXvZHH1pvOPM9CMTuXv9igtxvBj6uyH2CLAW7qMiZbiSlOA== 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=n6UGlvmdAwOZS82rcWr4+erAEokP/RUeYkya45fwpSE=; b=MxCg2qzNgKd1QKzWJBKUp2i6STdZGyd4bi9KE9LVCqMGtC6iIWSxBYr54h3viH2QhjrzvPh8acZIDvrWTNEnJ1gxX3StCdibhzsSGzpEYtR75DVl7ZW2GMsBDdgXt+HSfob//74QbrKorwze7aDh9n92GR3wiNIth7grfcs6Q3rPdhTHWP/fKugQ6yzuyDACauR4cYpl7afTJME1I8q1sTuYkJwBeZK9jNRpOU/KFX9NbbtBm6RMtNEBcHiUrO2AWbHC0gRpc4L4N3d0gzo0YFCiyjVssf5Vzj9Ixfp/xLAqOFcnvRBl8auAWv4qdfxb11lZqXuzEkRenBg5Zs6awQ== 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=n6UGlvmdAwOZS82rcWr4+erAEokP/RUeYkya45fwpSE=; b=qLl4izTBYPx8HfR8/z+J5+7xo8JsSDKhRV7P5RyCAgdffv9jE3VYtWNQIw5OO/OFzthcV9ljQR4Z7Y3BiZnPprDIF6n1ya+GU3NOPsk5aUXSyPZ0HUh61iENxYCxKNi/Sk/53bsxSybX1b5nXkOJ2CTYfDwf/nG9bayMtWKzqEA= Received: from DB9PR02CA0011.eurprd02.prod.outlook.com (2603:10a6:10:1d9::16) by AS8PR08MB8223.eurprd08.prod.outlook.com (2603:10a6:20b:520::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.36; Wed, 12 Jun 2024 14:52:09 +0000 Received: from DU2PEPF00028D09.eurprd03.prod.outlook.com (2603:10a6:10:1d9:cafe::7d) by DB9PR02CA0011.outlook.office365.com (2603:10a6:10:1d9::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7677.17 via Frontend Transport; Wed, 12 Jun 2024 14:52:09 +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 DU2PEPF00028D09.mail.protection.outlook.com (10.167.242.169) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.7677.15 via Frontend Transport; Wed, 12 Jun 2024 14:52:09 +0000 Received: ("Tessian outbound 949243bb8c19:v332"); Wed, 12 Jun 2024 14:52:09 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 937d518e493dc23b X-CR-MTA-TID: 64aa7808 Received: from 605a86f0ed68.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 1EA95A4D-3F26-4463-9B87-8E845A2D3C56.1; Wed, 12 Jun 2024 14:52:02 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 605a86f0ed68.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 12 Jun 2024 14:52:02 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=W6wVxKIKA/RrGRep0m0bahytMcym094kmtzInOw1sh9vmJhd+lE/aw+GmzmsA56vwEsuXfvgYT217vKCQER5Cyzz0/hSBMaqD//pWNoy8W8UgHqQ3jJYGAVfMS8GJdSbGZzllYYqzqvZi5x15S1hI6V/K0Dei867ypdNRREfsKnAjeGUSEGSPlPf6/I5Q8MRIvUyhCgNtoPfbGmJhd1e5sFKlcfh5I4qYlZRR3jRjARnfk/Gs3hI/bwClbQSj8T1yqtmELdPg4hFF/CNPQ3gihIJFmIEL2c38vaGpORxZDmlLMW4TFNf7oYxZUk6E+3k6Efq9uK/AYV2IeBvjEDmaA== 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=n6UGlvmdAwOZS82rcWr4+erAEokP/RUeYkya45fwpSE=; b=ct9BgE3/EE1QT/3QCb4pc4UWRJisVZgtTmiT1xmO4zAhbJU7U1qosykso0dNdh5lZyST7Y4vepxqEhw6y3unUn1uSRM++BG5RxfRBqYYcWBpvW5lB0HyQo7mka/Hz33eGXI/cET8IU0mZinSFRX0Csy8cyidWQzNTWiRUQIrAsVspDR9i+kSabJ+1/eA50HeDpKQ19hTeqWkWLXvCzQXFUObw+2eBl1Fnv86nhNCm+XgSoh/QE+C5b7zw6jGdeuNzIPLuOOrepe3wrdXv50eNr56QdfOGmenTlEPw6ueBr6QaZvQreYrhQdA+vgMgL0s1uDJQDHoLA4RrL8+o8PO1w== 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=n6UGlvmdAwOZS82rcWr4+erAEokP/RUeYkya45fwpSE=; b=qLl4izTBYPx8HfR8/z+J5+7xo8JsSDKhRV7P5RyCAgdffv9jE3VYtWNQIw5OO/OFzthcV9ljQR4Z7Y3BiZnPprDIF6n1ya+GU3NOPsk5aUXSyPZ0HUh61iENxYCxKNi/Sk/53bsxSybX1b5nXkOJ2CTYfDwf/nG9bayMtWKzqEA= 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 PAWPR08MB9099.eurprd08.prod.outlook.com (2603:10a6:102:343::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.36; Wed, 12 Jun 2024 14:51:58 +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.7677.019; Wed, 12 Jun 2024 14:51:58 +0000 Date: Wed, 12 Jun 2024 15:51:56 +0100 From: Andrew Carlotti To: "Richard Earnshaw (lists)" Cc: binutils@sourceware.org Subject: Re: [PATCH] aarch64: Enable gating instructions with FEAT_X || FEAT_Y Message-ID: References: <050f9e2e-b73a-4bf8-b37d-6b537cb662bf@arm.com> Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <050f9e2e-b73a-4bf8-b37d-6b537cb662bf@arm.com> X-ClientProxiedBy: LO2P265CA0271.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a1::19) To AS8PR08MB6678.eurprd08.prod.outlook.com (2603:10a6:20b:398::8) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR08MB6678:EE_|PAWPR08MB9099:EE_|DU2PEPF00028D09:EE_|AS8PR08MB8223:EE_ X-MS-Office365-Filtering-Correlation-Id: 9a57ac82-55a5-4eaa-961e-08dc8aef3c6a x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230032|1800799016|366008|376006; X-Microsoft-Antispam-Message-Info-Original: =?us-ascii?Q?QtSLz6sEIdql5W9Lhnob4k1se+wZMXDhIj0JDVJG+H5Cb3qYsjBBz4PScsYF?= =?us-ascii?Q?7NCGlsPsCemAAL2E1nFZcx2cPPytfcoKty051CNs4TqmN/o6Bj0nsfM3SyGx?= =?us-ascii?Q?LIGXPTLQ6C+XDd/1PGq1//vj1ZMeI9yyxZpoWXjSQIyOTgW49vo5gSmPjsEi?= =?us-ascii?Q?YHqlEfgpJWv6CVYM3wzfD+oG2a8QIGVvM1NlZ6pFP697Ce5u0y4EDfFtsXDb?= =?us-ascii?Q?rcdELQqLece32woY8topl+gvAgrvmu12fvRyZUwuRs4tn335HnibnVfBo6UT?= =?us-ascii?Q?ldFPSK/4N5/D9JEvRgWjaskptVQfKnUeObVdccF4S6PRNzPFfyAMoF/7gp8l?= =?us-ascii?Q?gLdEpNpY9b08ENPE80P2D8fWeZkiGlenTXzFv8XvvCaXXyrgfGwvN0JTPE+6?= =?us-ascii?Q?r53UndPcSKVHX6wT46Qslz04fc4KonDMYAoyOGs2iXfdPGSNNMUYQ36xxfTr?= =?us-ascii?Q?vC1akVow/l0fNYQ/d9ltkUy40pyCYdJIvoo4QOhwGhGGMYZx1LKb3DBDShIf?= =?us-ascii?Q?r4fwdFbwmsWBIXhbLH0j0tzfekH2k49gXFHgtRSJxcF+HvSb9ClxMvYwIXb4?= =?us-ascii?Q?3aJjM1hZevZXn9/CLS1BR7EhYb6ML/ln+hvwD5wnEmI//QK2yyTGKf3BjP+O?= =?us-ascii?Q?+hE5It0f6ud1erqGJHjrmr/o4xBG4F6vXZeLkbss21nqSFbc/wbd5EE1oEXe?= =?us-ascii?Q?Vb4kIOhTZ/S5ao1/ZFUwEjh0CNyNER9jQXa2hs/JHkSp0dBUx8fRdhOPDOwv?= =?us-ascii?Q?SFHVceHRGMbdE0vLPh2nriYasy/DstvxvmW0LPhlUuoH/wKRoT3WKiF25tzE?= =?us-ascii?Q?GhNKHkiOLdREOD1krFTv62MhXkB3E1h4rVN6kG0U4BOYRc9TlMPhIdseezt6?= =?us-ascii?Q?Tu4Sd3CmY5jNkUmY1/cw0CWlbCj8I5Np1I7ZGzCL4fkzEDQnKwVtvHtihIc+?= =?us-ascii?Q?StZK3aZd1DQ189vWEtr7bI13XjwDkpgj+RNFdp8TXtYazB52MajjQ801GtDK?= =?us-ascii?Q?st3mxC+imqgb3aMbeINJcSjGILf5T4KTm8pAVUvMnBxDT5OUNOVZTuOmfosg?= =?us-ascii?Q?kofr/8R/DwUPKt6RBFgxGjW47H6x78pMeyLtzO5xYPfUfU9VkLhh0qhdPAYd?= =?us-ascii?Q?EtLxIZmhglt48t5JFPOZkH36x6IkYb/Wjm4vZPS6H1ZKJKM1Cx95I+e3WR+A?= =?us-ascii?Q?8W8mEzMFhamvRbUakECzZMz6IH7H81lV3xyzfkELUchWR7rPskZohhmSFNfC?= =?us-ascii?Q?UjSeq7+ZMyyGslYMhGbhPkawmpPfBkK8BZmgeWzF4e9oZ9ONbh8G6VxQVUQI?= =?us-ascii?Q?CqmcXtD2Nrl/pvoMeAaPnrVK?= 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:(13230032)(1800799016)(366008)(376006);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAWPR08MB9099 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: DU2PEPF00028D09.eurprd03.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 406e206b-bad6-4502-4c45-08dc8aef35f6 X-Microsoft-Antispam: BCL:0;ARA:13230032|1800799016|36860700005|376006|35042699014|82310400018; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?LKefbjaQ6vBAcQl/rI197Yk4/RM1v4QmInMG6s/r+CDSL12j8X4pZJA9nTU+?= =?us-ascii?Q?a3W7o0RI0fmpa8UrUzUUuYm5mmxkoWykZM5QCRs/DrYHApsdDbmKv/XIqoZn?= =?us-ascii?Q?jUZ5rsJOK8eFLEsXY92c89nFTiFOzP6wqRIDWXonm/85IkJOwwWc10obORll?= =?us-ascii?Q?E3cmnfZ5Erqwh46x8+RGyienZMHgTA6ODcq2XhNHY5UzLboiWcvLttur0TZP?= =?us-ascii?Q?t6CQTrP8xqkVc0c6YYFgqa1Jt5VZH6j8BsfAnuTPTRoGPY7DUamxKKHmhmgM?= =?us-ascii?Q?0lkR6G+gGvHlMp/CZM6J4lnq0oCtFni/pmxhBoRzRnoO89GRZ+ueWiLnFCbU?= =?us-ascii?Q?XajWkUFvyw/q49S1LCObDDGhe/+Vo+DvO37a7Y9PKVwgG84vM6PS29IRixrp?= =?us-ascii?Q?CPqOgNRHtJ19nTyoBCSSDrnp/UKPcecaVuHQGqxKQ3ptVhU2gmKzhV8Q+2U7?= =?us-ascii?Q?Ghf32a/eU0Xk5Eg1bFcKhS/MnDN2PoFr9+D51GpQPDjApUNJb9KKbnOn02ID?= =?us-ascii?Q?dG/2cbn20JDJY6jN9qaS1LgcgGVBldMiwlqtU6KwlgMjiR+RZnliPDK+JgAC?= =?us-ascii?Q?ooTlzyy+pJCCmFz+Z3cK7Jt8XwNe6GPtiIZ8D9SVnYyrPjd0TJfiYUzC0g9e?= =?us-ascii?Q?YrpLqlxRyQcnANESIH/aC2enk+H0HAtVZUUHmShXZD/cJq65POTNKFju45Kz?= =?us-ascii?Q?Cb8vERS59vgksyXnoDt+W/1VdSQclYoY90VNXVBWicxznV87Vqvx84exDLsp?= =?us-ascii?Q?mnclkbAzwXa2qJ0xCizW/wWT+urcMb4qMcRXMzD7YBryYr1t1ZQ6JIR4qncl?= =?us-ascii?Q?1eyKpnnet7A/GFgKc0UgBJK+WiBdKmHnL0LLWGuc9KKHd8/kyewIPqjWZo4n?= =?us-ascii?Q?bGOK/aoYD+vHzF5U4RcOhWOLQSwAg5wNoFy/vedYDun7Ql2hfRiDDhWn8xVk?= =?us-ascii?Q?MNrJgerqpfFMJTlSnyqUpv4M++8yXel6mSLdJaH7tIckUwRS4WOIJlY5fLKV?= =?us-ascii?Q?VpjaDQTdC+7bab/jKzLEeymF12jdAiKyP3uWgBTC6NpLkJEbpojFBi91sLhr?= =?us-ascii?Q?QISbFIR3eMZs84JmVkm5IpHj5p3UefaVbwTg81v88rCjmh2GOz08ck6IbI0H?= =?us-ascii?Q?MUwAo+1EmKWZy289UeDjXT/5qIkcYMfRxviSxAN2WIYodbJPMEr+/hBMJ1HC?= =?us-ascii?Q?obPVjBaXskxd53w+H93xvLLSXkotjTISwqKmYNSu5bj9+CkVl6o3+ny2vpru?= =?us-ascii?Q?RY20mpcgjQBQRqDV7nUtt2T80Sc/9y9sgEze2n+9Q5s22Vc8iMw46jH4VnNg?= =?us-ascii?Q?ix+iV0ZOk5VZ7NHitJsFeP3fSuBEpZVju+m0yDA4eRz53SEGMhSevQiDXYNK?= =?us-ascii?Q?aiwQ/Xecl3gs1k3mLMdwuFtFAJAn5zIqDCa8Cz2Q+mAxcsD4dg=3D=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:(13230032)(1800799016)(36860700005)(376006)(35042699014)(82310400018);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jun 2024 14:52:09.5202 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9a57ac82-55a5-4eaa-961e-08dc8aef3c6a 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: DU2PEPF00028D09.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB8223 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_LOTSOFHASH,SPF_HELO_NONE,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: On Wed, Jun 12, 2024 at 02:31:58PM +0100, Richard Earnshaw (lists) wrote: > On 04/06/2024 14:25, Andrew Carlotti wrote: > > 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? > > Given that we already have some features that are enabled on, for example, variants of armv8 and armv9, don't we already have a mechanism for doing this in general? That is, to define an internal feature and then use (feata, featb) -> featc? as part of the feata and featb definitions? > > R. A simple implementation with internal feature bits and the existing dependency mechanism would fail to handle `+nofeat` correctly. It also wouldn't be able to support (A && B) || C. The only way I can see to handle this with extra internal feature bits is to add a separate post-processing step that runs each time the feature flags has changed and recomputes all the internal feature bits from scratch. This recomputation would need to be either written manually in code, or represented by adding another table of complicated feature dependencies. > > > > > > 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 >