From patchwork Wed Sep 2 08:38:25 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dhruv Chawla X-Patchwork-Id: 142684 X-Patchwork-Delegate: kyrylo.tkachov@arm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 10EA04BA79BA for ; Wed, 2 Sep 2026 08:40:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 10EA04BA79BA Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=nGrqCxzM X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazlp170100005.outbound.protection.outlook.com [IPv6:2a01:111:f403:c111::5]) by sourceware.org (Postfix) with ESMTPS id AE5E34BA23E9 for ; Wed, 2 Sep 2026 08:39:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AE5E34BA23E9 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=nvidia.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org AE5E34BA23E9 Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:c111::5 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1788338361; cv=pass; b=yFDqNQQ+H4GGmCem9dPgOoysqn0YUsqJ3fOcnSn1EMfoUZGBZKgYhdgAc9SFQCbaHgJXtmCF0xEqpQ1v65gBWczHsHvtAd4hr1IYfW/LQN19GPmow5b053cHg1dAaLHqhZiw0ScXY4+yqq20T2GSgJvViZrAZ/A5NJa5wBC8ljQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1788338361; c=relaxed/simple; bh=ZX12URrdEbc210b/f4g/ZxaHAntSjWSKxZQ9nK28Szk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=rdytwmxZNgY/BFDG6Esxx+5veCatKno9K+Kn5s/3yZd/qS0lvIEUQY1onenwaF4IDWoAv87bbtiBzzTl6chPXLUGSHHaKL/KjRolcVSSs5tbX5ZJo2Er1KFHLziCB1N8zOjYr4MzsRJWdBscIPhKYNYs6fZzogtvcU4lDbv8Ick= ARC-Authentication-Results: i=2; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=nGrqCxzM DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AE5E34BA23E9 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=buiBfiNKGT+Kcjy40DGqzWV5OoWwKCskwonG1Ti9yoc147jhZkWLiOGXIw8+JoJEIi3YqRHArhuP9rEdmZYbnDWPcepzZMlNsxp1/LCOvkXNoytHemw8Rvr4/vXKnPpY2a9RDovls8rWL2+V+nFmLyIwxZ6xMYwY6lIVSIAVEMlHNH5qlkivjhyw1pQLJvdJ/cwW0wPe7eTaWS4w9xNNNC//z/ygrmXSyx6QttAUIb443HqlGvHb7rMJQhSwxlfeTMfz09fBLDqeYx+7EzqoTX+rNtQK7QzJzb6IsR+nEKgPClzgno4YeyQgQBDXxi6k6qMpy8UENC/P86iwDt4ezw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=jJ6z55yNAZDl1QqDhLArW0hwpk6Q4N/qg7jownYVzec=; b=GxUS/Ewj5J6SaNFbQCTLutTKmLzE5MwcnCMYif1PAMKvr6bzDokhRzs2d5xXpg/DUxpKNgaPh5fDQjG/2zFwZ4Zj7DINMdnZNSp6+EIsnMINQT8ZhAHxM41Bf5/SEe0z/+hljnWzUJlDIFRiG1zsRQO2a2vAARVcwnIaDkXSOeNoAemkcYCLTpnY94LZD8GSu6fUyod6BLQSN8h0d2DUt7VxEQs1sUzqZ6wkiPMr3DPSXLE1yjWr+NvrYVOXLyjrYfejdyDJETHIwjqhBoE6LphwIpyvyApu8pduga8T8l1Tn+OCXBpCKH3jQ7F/fg2UMdmanZRGEAyXF1T10YxbQQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jJ6z55yNAZDl1QqDhLArW0hwpk6Q4N/qg7jownYVzec=; b=nGrqCxzMLKxSylMNbU1PHVMqL9+GBIh3txm1p2xt3X6+3wJWi6qAK9qBfKbeHWGyxYoK2CoiorSbzklKqBx2IS+A5nH88NI2IGag80RHqAssUxbANjtSXBnJV9VV/kklLQRKbPE6U67duq9D9BOvUF4wplq/a93MKtkg3LI3syVPhzWWYS6CUJMbadOQJNLi04CI9Ar2xaGwGv469hppBYmtqqYvEvMaT+xuNxJgJpMgqhIUT0Ksu77g/zQvPVZOmN1w3fRBWQwJjG9keoAU8Q64xoyUaPyQzHQwePIsyp01kOvw+OOdrcXj8vPTNiTlkJ7EV04qg3A6AHQqX9RR4w== Received: from DM6PR08CA0057.namprd08.prod.outlook.com (2603:10b6:5:1e0::31) by DS4PR12MB9683.namprd12.prod.outlook.com (2603:10b6:8:280::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 08:39:15 +0000 Received: from DS3PEPF000099E2.namprd04.prod.outlook.com (2603:10b6:5:1e0:cafe::5c) by DM6PR08CA0057.outlook.office365.com (2603:10b6:5:1e0::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.11 via Frontend Transport; Wed, 2 Sep 2026 08:39:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by DS3PEPF000099E2.mail.protection.outlook.com (10.167.17.201) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Wed, 2 Sep 2026 08:39:15 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Wed, 2 Sep 2026 01:38:59 -0700 Received: from MVD4TP25H0.nvidia.com (10.126.230.37) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Wed, 2 Sep 2026 01:38:57 -0700 From: To: CC: , Subject: [PATCH 3/6] aarch64: Port NEON halving-add intrinsics to pragma-based framework Date: Wed, 2 Sep 2026 14:08:25 +0530 Message-ID: <20260902083828.45767-4-dhruvc@nvidia.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260902083828.45767-1-dhruvc@nvidia.com> References: <20260902083828.45767-1-dhruvc@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.37] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS3PEPF000099E2:EE_|DS4PR12MB9683:EE_ X-MS-Office365-Filtering-Correlation-Id: 2d26a0ee-3d74-4fac-f04a-08df08cdabcc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700016|376014|23010399003|1800799024|82310400026|13003099007|10067099003|6133799003|56012099006|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: cqdTWPt9La17mPN58csxoWtr38VQp01bPcWtnhq7wSx7YC0q7GDZtMUjqP588U9v4RmUwil6l1ExrLwkHg2VAf6078HVCxoAcj6GmXTg++OZzB0rSy/3s3mErRYa1esIQJCa86sGyHSOoz8V82ccTpf/oak2N+Aq08OjpyYBXOddUsUrWuqiFvMRy5DcTQQihPSh/S82DhThtmu+yNnIkbbvFHx9zEY4IyDhb+MB3zMPas8Iu4VRjImOdm9f2RDbi+Mu8VsYt5jfm7dbVDQrUoN90srMe7/ESmjgzZB+x6vzca4sgt7Ihu9HH/4K6A4LfzBMu3SsNv9hPslGs7rLrfsLdtms/6WBE6j0kYvqpeJTtncNL0GMSEcNuGHlULysW1NACMnk1zHZS9mAPXmK66zePvepKx8RMIqSZ3Q6Io9QPPrAcvWyfRvaSRwOoVPHT1TRdG+zHisnFOwExpKVMbhRD2lI95D+PcE6Ry/fWGVt0buiZZKYF6xADzD/da1L94Pir5IuR36ezx00DR/MQh2akZ+pWUQSRrPp85a8q3rBcEAZYvkNzhH5WXeD3h/8beyIxZLVkl5CkDilN7LbibPUJ97BruaEhVCZjyXQm/7+AviPfQdZ9YZU/uf0hJjnZw0jlukJCvSxMqTWk1Y7bOXLy7zg3HG5HTuW7UZ4uuIg4tG3ot4/L/ZxEOFDFhaS39EAoQR9y2D/fiVDwkdbmA== X-Forefront-Antispam-Report: CIP:216.228.117.161; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge2.nvidia.com; CAT:NONE; SFS:(13230040)(36860700016)(376014)(23010399003)(1800799024)(82310400026)(13003099007)(10067099003)(6133799003)(56012099006)(11063799006)(22082099003)(18002099003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: E3WtCgS9I9BaUkClW+BvUr5Ri7PeAU9O3mqT2LQ/2EbaIaxV6yOjP+3cBTz8nv8reraRzBKmtyd25tlngTHy5UmINdCGh58Czufvq+EY2c6DxE5/46UAnXfXMh+YcHnT65XCN1I30RbGN4H31XXXEOwAXdPdzwtLPkjQcttDEf65rMT1CGOiV0ijnX56lYQXLr2mZZdHQU71V9c48r69AxuowNlqUDYiUB0Hn7XKT2u70Sb9QRRcQP+o1fH9h0fTAXBZj4mjufP6oL8Vz504MrSDtrt7vIztQhF0Kn5mdB11ESxWvPsTjW1JmMzTbmzq2phjprbAiOsbnwes2hwoHgh3zEtuYYZp85j2Wed/3rqqitA+50ZC+bBlqaWii3a+18NzURCPIN81jXdJA5cpZzT/Oa788rQvMNBASiUoQIraHukoMYlDC/Hr+tq4j4Zz X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 08:39:15.1942 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2d26a0ee-3d74-4fac-f04a-08df08cdabcc X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.161]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS3PEPF000099E2.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS4PR12MB9683 X-Spam-Status: No, score=-8.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FORGED_SPF_HELO, GIT_PATCH_0, KAM_SHORT, LOCAL_AUTHENTICATION_FAIL_SPF, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org From: Dhruv Chawla Port the following intrinsics to the pragma-based framework: * vhadd * vrhadd The arm_neon_{1,2,3}.c test cases now expect the ACLE streaming-mode diagnostic instead of an inlining failure. The inlining_10.c and inlining_11.c test cases are updated to use the vqtbl intrinsic instead of vhadd as the latter is no longer implemented as an always_inline function in arm_neon.h. Bootstrapped and regtested on aarch64-linux-gnu. Signed-off-by: Dhruv Chawla gcc/ChangeLog: * config/aarch64/aarch64-neon-builtins-base.cc (vhadd, vhaddq, vrhadd, vrhaddq): New function bases. * config/aarch64/aarch64-neon-builtins-base.def (vhadd, vhaddq, vrhadd, vrhaddq): New function groups. * config/aarch64/arm_neon.h (vhadd_s8, vhadd_s16, vhadd_s32, vhadd_u8, vhadd_u16, vhadd_u32, vhaddq_s8, vhaddq_s16, vhaddq_s32, vhaddq_u8, vhaddq_u16, vhaddq_u32, vrhadd_s8, vrhadd_s16, vrhadd_s32, vrhadd_u8, vrhadd_u16, vrhadd_u32, vrhaddq_s8, vrhaddq_s16, vrhaddq_s32, vrhaddq_u8, vrhaddq_u16, vrhaddq_u32): Delete functions. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sme/arm_neon_1.c: Update the expected dg-error message. * gcc.target/aarch64/sme/arm_neon_2.c: Likewise. * gcc.target/aarch64/sme/arm_neon_3.c: Likewise. * gcc.target/aarch64/sme/inlining_10.c: Replace vhadd with vqtbl as vhadd is no longer always_inline. * gcc.target/aarch64/sme/inlining_11.c: Likewise. * gcc.target/aarch64/neon/vhadd.c: New test. * gcc.target/aarch64/neon/vrhadd.c: Likewise. --- .../aarch64/aarch64-neon-builtins-base.cc | 6 + .../aarch64/aarch64-neon-builtins-base.def | 8 + gcc/config/aarch64/arm_neon.h | 168 ------------------ gcc/testsuite/gcc.target/aarch64/neon/vhadd.c | 88 +++++++++ .../gcc.target/aarch64/neon/vrhadd.c | 88 +++++++++ .../gcc.target/aarch64/sme/arm_neon_1.c | 4 +- .../gcc.target/aarch64/sme/arm_neon_2.c | 4 +- .../gcc.target/aarch64/sme/arm_neon_3.c | 4 +- .../gcc.target/aarch64/sme/inlining_10.c | 6 +- .../gcc.target/aarch64/sme/inlining_11.c | 6 +- 10 files changed, 199 insertions(+), 183 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vhadd.c create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vrhadd.c diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc b/gcc/config/aarch64/aarch64-neon-builtins-base.cc index ca122d65a51..39f8892e35f 100644 --- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc @@ -779,6 +779,12 @@ NEON_FUNCTION (vmaxnmvq, gimple_ifn, (IFN_REDUC_FMAX)) NEON_FUNCTION (vminnmv, gimple_ifn, (IFN_REDUC_FMIN)) NEON_FUNCTION (vminnmvq, gimple_ifn, (IFN_REDUC_FMIN)) +// Halving add +NEON_FUNCTION (vhadd, gimple_ifn, (IFN_AVG_FLOOR)) +NEON_FUNCTION (vhaddq, gimple_ifn, (IFN_AVG_FLOOR)) +NEON_FUNCTION (vrhadd, gimple_ifn, (IFN_AVG_CEIL)) +NEON_FUNCTION (vrhaddq, gimple_ifn, (IFN_AVG_CEIL)) + // Bitwise operations NEON_FUNCTION (vand, gimple_expr, (BIT_AND_EXPR)) NEON_FUNCTION (vandq, gimple_expr, (BIT_AND_EXPR)) diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def b/gcc/config/aarch64/aarch64-neon-builtins-base.def index b3c0fc42298..ddb12c497bb 100644 --- a/gcc/config/aarch64/aarch64-neon-builtins-base.def +++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def @@ -114,6 +114,14 @@ DEF_NEON_FUNCTION (vminnmv, h_float, ("s0,D0")) DEF_NEON_FUNCTION (vminnmvq, h_float, ("s0,Q0")) #undef REQUIRED_EXTENSIONS +// Halving add +#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) +DEF_NEON_FUNCTION (vhadd, bhs_integer, ("D0,D0,D0")) +DEF_NEON_FUNCTION (vhaddq, bhs_integer, ("Q0,Q0,Q0")) +DEF_NEON_FUNCTION (vrhadd, bhs_integer, ("D0,D0,D0")) +DEF_NEON_FUNCTION (vrhaddq, bhs_integer, ("Q0,Q0,Q0")) +#undef REQUIRED_EXTENSIONS + // Bitwise operations #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD) DEF_NEON_FUNCTION (vand, all_integer, ("D0,D0,D0")) diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index 1fccc7e3237..d23b59504f4 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -273,174 +273,6 @@ vaddw_high_u32 (uint64x2_t __a, uint32x4_t __b) return __builtin_aarch64_uaddw2v4si_uuu (__a, __b); } -__extension__ extern __inline int8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhadd_s8 (int8x8_t __a, int8x8_t __b) -{ - return __builtin_aarch64_shaddv8qi (__a, __b); -} - -__extension__ extern __inline int16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhadd_s16 (int16x4_t __a, int16x4_t __b) -{ - return __builtin_aarch64_shaddv4hi (__a, __b); -} - -__extension__ extern __inline int32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhadd_s32 (int32x2_t __a, int32x2_t __b) -{ - return __builtin_aarch64_shaddv2si (__a, __b); -} - -__extension__ extern __inline uint8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhadd_u8 (uint8x8_t __a, uint8x8_t __b) -{ - return __builtin_aarch64_uhaddv8qi_uuu (__a, __b); -} - -__extension__ extern __inline uint16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhadd_u16 (uint16x4_t __a, uint16x4_t __b) -{ - return __builtin_aarch64_uhaddv4hi_uuu (__a, __b); -} - -__extension__ extern __inline uint32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhadd_u32 (uint32x2_t __a, uint32x2_t __b) -{ - return __builtin_aarch64_uhaddv2si_uuu (__a, __b); -} - -__extension__ extern __inline int8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhaddq_s8 (int8x16_t __a, int8x16_t __b) -{ - return __builtin_aarch64_shaddv16qi (__a, __b); -} - -__extension__ extern __inline int16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhaddq_s16 (int16x8_t __a, int16x8_t __b) -{ - return __builtin_aarch64_shaddv8hi (__a, __b); -} - -__extension__ extern __inline int32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhaddq_s32 (int32x4_t __a, int32x4_t __b) -{ - return __builtin_aarch64_shaddv4si (__a, __b); -} - -__extension__ extern __inline uint8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhaddq_u8 (uint8x16_t __a, uint8x16_t __b) -{ - return __builtin_aarch64_uhaddv16qi_uuu (__a, __b); -} - -__extension__ extern __inline uint16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhaddq_u16 (uint16x8_t __a, uint16x8_t __b) -{ - return __builtin_aarch64_uhaddv8hi_uuu (__a, __b); -} - -__extension__ extern __inline uint32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vhaddq_u32 (uint32x4_t __a, uint32x4_t __b) -{ - return __builtin_aarch64_uhaddv4si_uuu (__a, __b); -} - -__extension__ extern __inline int8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhadd_s8 (int8x8_t __a, int8x8_t __b) -{ - return __builtin_aarch64_srhaddv8qi (__a, __b); -} - -__extension__ extern __inline int16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhadd_s16 (int16x4_t __a, int16x4_t __b) -{ - return __builtin_aarch64_srhaddv4hi (__a, __b); -} - -__extension__ extern __inline int32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhadd_s32 (int32x2_t __a, int32x2_t __b) -{ - return __builtin_aarch64_srhaddv2si (__a, __b); -} - -__extension__ extern __inline uint8x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhadd_u8 (uint8x8_t __a, uint8x8_t __b) -{ - return __builtin_aarch64_urhaddv8qi_uuu (__a, __b); -} - -__extension__ extern __inline uint16x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhadd_u16 (uint16x4_t __a, uint16x4_t __b) -{ - return __builtin_aarch64_urhaddv4hi_uuu (__a, __b); -} - -__extension__ extern __inline uint32x2_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhadd_u32 (uint32x2_t __a, uint32x2_t __b) -{ - return __builtin_aarch64_urhaddv2si_uuu (__a, __b); -} - -__extension__ extern __inline int8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhaddq_s8 (int8x16_t __a, int8x16_t __b) -{ - return __builtin_aarch64_srhaddv16qi (__a, __b); -} - -__extension__ extern __inline int16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhaddq_s16 (int16x8_t __a, int16x8_t __b) -{ - return __builtin_aarch64_srhaddv8hi (__a, __b); -} - -__extension__ extern __inline int32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhaddq_s32 (int32x4_t __a, int32x4_t __b) -{ - return __builtin_aarch64_srhaddv4si (__a, __b); -} - -__extension__ extern __inline uint8x16_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhaddq_u8 (uint8x16_t __a, uint8x16_t __b) -{ - return __builtin_aarch64_urhaddv16qi_uuu (__a, __b); -} - -__extension__ extern __inline uint16x8_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhaddq_u16 (uint16x8_t __a, uint16x8_t __b) -{ - return __builtin_aarch64_urhaddv8hi_uuu (__a, __b); -} - -__extension__ extern __inline uint32x4_t -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) -vrhaddq_u32 (uint32x4_t __a, uint32x4_t __b) -{ - return __builtin_aarch64_urhaddv4si_uuu (__a, __b); -} - __extension__ extern __inline int8x8_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vaddhn_s16 (int16x8_t __a, int16x8_t __b) diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vhadd.c b/gcc/testsuite/gcc.target/aarch64/neon/vhadd.c new file mode 100644 index 00000000000..8411f6a4e30 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vhadd.c @@ -0,0 +1,88 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +/* +** test_vhadd_u8: +** uhadd v0\.8b, (v0\.8b, v1\.8b|v1\.8b, v0\.8b) +** ret +*/ +TEST_UNIFORM_BINARY (vhadd_u8, uint8x8_t) + +/* +** test_vhadd_s8: +** shadd v0\.8b, (v0\.8b, v1\.8b|v1\.8b, v0\.8b) +** ret +*/ +TEST_UNIFORM_BINARY (vhadd_s8, int8x8_t) + +/* +** test_vhadd_u16: +** uhadd v0\.4h, (v0\.4h, v1\.4h|v1\.4h, v0\.4h) +** ret +*/ +TEST_UNIFORM_BINARY (vhadd_u16, uint16x4_t) + +/* +** test_vhadd_s16: +** shadd v0\.4h, (v0\.4h, v1\.4h|v1\.4h, v0\.4h) +** ret +*/ +TEST_UNIFORM_BINARY (vhadd_s16, int16x4_t) + +/* +** test_vhadd_u32: +** uhadd v0\.2s, (v0\.2s, v1\.2s|v1\.2s, v0\.2s) +** ret +*/ +TEST_UNIFORM_BINARY (vhadd_u32, uint32x2_t) + +/* +** test_vhadd_s32: +** shadd v0\.2s, (v0\.2s, v1\.2s|v1\.2s, v0\.2s) +** ret +*/ +TEST_UNIFORM_BINARY (vhadd_s32, int32x2_t) + +/* +** test_vhaddq_u8: +** uhadd v0\.16b, (v0\.16b, v1\.16b|v1\.16b, v0\.16b) +** ret +*/ +TEST_UNIFORM_BINARY (vhaddq_u8, uint8x16_t) + +/* +** test_vhaddq_s8: +** shadd v0\.16b, (v0\.16b, v1\.16b|v1\.16b, v0\.16b) +** ret +*/ +TEST_UNIFORM_BINARY (vhaddq_s8, int8x16_t) + +/* +** test_vhaddq_u16: +** uhadd v0\.8h, (v0\.8h, v1\.8h|v1\.8h, v0\.8h) +** ret +*/ +TEST_UNIFORM_BINARY (vhaddq_u16, uint16x8_t) + +/* +** test_vhaddq_s16: +** shadd v0\.8h, (v0\.8h, v1\.8h|v1\.8h, v0\.8h) +** ret +*/ +TEST_UNIFORM_BINARY (vhaddq_s16, int16x8_t) + +/* +** test_vhaddq_u32: +** uhadd v0\.4s, (v0\.4s, v1\.4s|v1\.4s, v0\.4s) +** ret +*/ +TEST_UNIFORM_BINARY (vhaddq_u32, uint32x4_t) + +/* +** test_vhaddq_s32: +** shadd v0\.4s, (v0\.4s, v1\.4s|v1\.4s, v0\.4s) +** ret +*/ +TEST_UNIFORM_BINARY (vhaddq_s32, int32x4_t) diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vrhadd.c b/gcc/testsuite/gcc.target/aarch64/neon/vrhadd.c new file mode 100644 index 00000000000..46e3cb864c8 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/neon/vrhadd.c @@ -0,0 +1,88 @@ +/* { dg-do compile } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include "arm_neon_test.h" + +/* +** test_vrhadd_u8: +** urhadd v0\.8b, (v0\.8b, v1\.8b|v1\.8b, v0\.8b) +** ret +*/ +TEST_UNIFORM_BINARY (vrhadd_u8, uint8x8_t) + +/* +** test_vrhadd_s8: +** srhadd v0\.8b, (v0\.8b, v1\.8b|v1\.8b, v0\.8b) +** ret +*/ +TEST_UNIFORM_BINARY (vrhadd_s8, int8x8_t) + +/* +** test_vrhadd_u16: +** urhadd v0\.4h, (v0\.4h, v1\.4h|v1\.4h, v0\.4h) +** ret +*/ +TEST_UNIFORM_BINARY (vrhadd_u16, uint16x4_t) + +/* +** test_vrhadd_s16: +** srhadd v0\.4h, (v0\.4h, v1\.4h|v1\.4h, v0\.4h) +** ret +*/ +TEST_UNIFORM_BINARY (vrhadd_s16, int16x4_t) + +/* +** test_vrhadd_u32: +** urhadd v0\.2s, (v0\.2s, v1\.2s|v1\.2s, v0\.2s) +** ret +*/ +TEST_UNIFORM_BINARY (vrhadd_u32, uint32x2_t) + +/* +** test_vrhadd_s32: +** srhadd v0\.2s, (v0\.2s, v1\.2s|v1\.2s, v0\.2s) +** ret +*/ +TEST_UNIFORM_BINARY (vrhadd_s32, int32x2_t) + +/* +** test_vrhaddq_u8: +** urhadd v0\.16b, (v0\.16b, v1\.16b|v1\.16b, v0\.16b) +** ret +*/ +TEST_UNIFORM_BINARY (vrhaddq_u8, uint8x16_t) + +/* +** test_vrhaddq_s8: +** srhadd v0\.16b, (v0\.16b, v1\.16b|v1\.16b, v0\.16b) +** ret +*/ +TEST_UNIFORM_BINARY (vrhaddq_s8, int8x16_t) + +/* +** test_vrhaddq_u16: +** urhadd v0\.8h, (v0\.8h, v1\.8h|v1\.8h, v0\.8h) +** ret +*/ +TEST_UNIFORM_BINARY (vrhaddq_u16, uint16x8_t) + +/* +** test_vrhaddq_s16: +** srhadd v0\.8h, (v0\.8h, v1\.8h|v1\.8h, v0\.8h) +** ret +*/ +TEST_UNIFORM_BINARY (vrhaddq_s16, int16x8_t) + +/* +** test_vrhaddq_u32: +** urhadd v0\.4s, (v0\.4s, v1\.4s|v1\.4s, v0\.4s) +** ret +*/ +TEST_UNIFORM_BINARY (vrhaddq_u32, uint32x4_t) + +/* +** test_vrhaddq_s32: +** srhadd v0\.4s, (v0\.4s, v1\.4s|v1\.4s, v0\.4s) +** ret +*/ +TEST_UNIFORM_BINARY (vrhaddq_s32, int32x4_t) diff --git a/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_1.c b/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_1.c index 5b5346cf435..9f50bb92722 100644 --- a/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_1.c @@ -4,10 +4,8 @@ #pragma GCC target "+nosme" -// { dg-error {inlining failed.*'vhaddq_s32'} "" { target *-*-* } 0 } - int32x4_t foo (int32x4_t x, int32x4_t y) [[arm::streaming_compatible]] { - return vhaddq_s32 (x, y); + return vhaddq_s32 (x, y); // { dg-error {ACLE function 'vhaddq_s32' cannot be called when SME streaming mode is enabled} } } diff --git a/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_2.c b/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_2.c index 2092c4471f0..9a4fff5e98c 100644 --- a/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_2.c +++ b/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_2.c @@ -2,10 +2,8 @@ #include -// { dg-error {inlining failed.*'vhaddq_s32'} "" { target *-*-* } 0 } - int32x4_t foo (int32x4_t x, int32x4_t y) [[arm::streaming_compatible]] { - return vhaddq_s32 (x, y); + return vhaddq_s32 (x, y); // { dg-error {ACLE function 'vhaddq_s32' cannot be called when SME streaming mode is enabled} } } diff --git a/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_3.c b/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_3.c index 36794e5b0df..19f633e1849 100644 --- a/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_3.c +++ b/gcc/testsuite/gcc.target/aarch64/sme/arm_neon_3.c @@ -2,10 +2,8 @@ #include -// { dg-error {inlining failed.*'vhaddq_s32'} "" { target *-*-* } 0 } - int32x4_t foo (int32x4_t x, int32x4_t y) [[arm::streaming]] { - return vhaddq_s32 (x, y); + return vhaddq_s32 (x, y); // { dg-error {ACLE function 'vhaddq_s32' cannot be called when SME streaming mode is enabled} } } diff --git a/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c b/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c index 131fb7a6637..3e9af18265f 100644 --- a/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c +++ b/gcc/testsuite/gcc.target/aarch64/sme/inlining_10.c @@ -18,9 +18,9 @@ call_vadd () } inline void __attribute__((always_inline)) -call_vhadd () // { dg-error "inlining failed" } +call_vqtbl () // { dg-error "inlining failed" } { - neon[0] = vhaddq_u8 (neon[1], neon[2]); + neon[0] = vqtbl1q_u8 (neon[1], neon[2]); } inline void __attribute__((always_inline)) @@ -51,7 +51,7 @@ void sc_caller () [[arm::inout("za"), arm::streaming_compatible]] { call_vadd (); - call_vhadd (); + call_vqtbl (); call_svadd (); call_svld1_gather (); call_svzero (); diff --git a/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c b/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c index d500a62743d..e60b357dfa2 100644 --- a/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c +++ b/gcc/testsuite/gcc.target/aarch64/sme/inlining_11.c @@ -18,9 +18,9 @@ call_vadd () } inline void __attribute__((always_inline)) -call_vhadd () // { dg-error "inlining failed" } +call_vqtbl () // { dg-error "inlining failed" } { - neon[0] = vhaddq_u8 (neon[1], neon[2]); + neon[0] = vqtbl1q_u8 (neon[1], neon[2]); } inline void __attribute__((always_inline)) @@ -51,7 +51,7 @@ void sc_caller () [[arm::inout("za"), arm::streaming]] { call_vadd (); - call_vhadd (); + call_vqtbl (); call_svadd (); call_svld1_gather (); call_svzero ();