From patchwork Wed Oct 30 16:31:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Bantaloukas X-Patchwork-Id: 99832 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A00933857C6E for ; Wed, 30 Oct 2024 16:33:38 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on20619.outbound.protection.outlook.com [IPv6:2a01:111:f403:2614::619]) by sourceware.org (Postfix) with ESMTPS id 055373857B9F for ; Wed, 30 Oct 2024 16:32:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 055373857B9F 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 055373857B9F Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:2614::619 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1730305965; cv=pass; b=UoSgRxQCJCOpn8Q9kInZhPaDtbdvw0X9sAhb4FmrfaXw2RHW4MzSXAAtvRsA4ROOuPlBgm1wF+Qn583dRWAQmIy2qmcSNhvoZ4zI/TjxuV7fJuEpDq+UGnB+DJrRd5pT9YjzqaK9k9MTDp6ygrBIe6WJQyKwWpmjChe+c22N8Q4= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1730305965; c=relaxed/simple; bh=OcUZRRJ3RTK5Dze8KqQ1JtO7sj5kCVCCLHqiJufKt/w=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=UhESY4TyUZT8Y8JaB0vqOpHO9k+QTuDfyEEGU559K2YTkaPLNQkXpNfKKDuQ3NX12Wd4aDhwXsL3x0aWwGKt0P/NSz5drLYmi17rBNcA99I4Yr8igUv+V3kaVAHB7NWZGKoHCDry12jGcdGNUr4SlMXOAvv9y82HBOLk7AlhmFI= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=ewli4NgJ9TUrfscIFelUT1D7ayEDBkxxUhAQyEKo+iWQA9/6eUyCrqyRbDQpwbUZnzJXqwwlhMW2eQrg/yl5LE+0tBceWT9GtFZCObRrhOkRfwMUuNm8UE4wzVjZp4TZuPb0jyny+SuRz3OBGHF8otGD8dhzch45tCmBCN24jUBBaYL0W5jkIidJimHVxh2nuSuPCfG2eVe0g7pg6yb47UFgD24UavulcRjDQPhL2muv4JKR5DG96UCTeqhS6P6aB1BOtOvmasGQvv58qWasoK5zUiaESXULLzccpDfXkyVIPPqFIqhlOfrPwXgCwSrkWtJpUHQPLrndrhm3uqfV7w== ARC-Message-Signature: i=2; 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=4N7ku8E+LaulZ0fWvko0OPOGH0kv6gwf39SWrVTwwFA=; b=xeu1ir5ma6CaUma7wIcEra+pLuiLLMNQ2jSAE5pSehp0C775LmkyLa6iPnrq+/5KFBMNg1/BdkBf4d9Yodv9HX9gXiSxVJIGTiJNzRTgubHsFa8vN9m7RNVnJc8J7As+CP6Uu+blcQtMvPrxECE11JTn8ABHS4zthYgcvEfBAWyjqoJl1MyJ894F2RPnHnsXlDEcHiaLBguJ4sR3UGW8gsmwlo8sD/CBlyUCNTDQQekCsdAKuRlQZqldDrF1ij5rCVeI57cuXeEMjT0uvC6O1FOA4KnrLz/a+9V3ZsLFLbDP1sSgyXq6F7WEM1A7J75UlocQDffVGSTu6NTwr9sjnw== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.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] 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=4N7ku8E+LaulZ0fWvko0OPOGH0kv6gwf39SWrVTwwFA=; b=kpngFrd7wdneTkX7c9OGggRhkaKRImlngOQSe2C08wCQQpbOzcBbbPJM3LuvkoRSEioJykBIOHpfLb7wJxKOy/ASCyw+5iF1sl/190dCeo6fYZOX9UdEUW/bQet10yut3a6GjRqVzK9WqQ/Gpqi6I9ZBLxGjhzVcVHCtPp+rHZw= Received: from DU7P190CA0007.EURP190.PROD.OUTLOOK.COM (2603:10a6:10:550::31) by AS4PR08MB7926.eurprd08.prod.outlook.com (2603:10a6:20b:575::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8093.32; Wed, 30 Oct 2024 16:32:29 +0000 Received: from DB5PEPF00014B89.eurprd02.prod.outlook.com (2603:10a6:10:550:cafe::10) by DU7P190CA0007.outlook.office365.com (2603:10a6:10:550::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.20 via Frontend Transport; Wed, 30 Oct 2024 16:32:29 +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 DB5PEPF00014B89.mail.protection.outlook.com (10.167.8.197) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8114.16 via Frontend Transport; Wed, 30 Oct 2024 16:32:29 +0000 Received: ("Tessian outbound 373849c2df5a:v490"); Wed, 30 Oct 2024 16:32:29 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 06018e13dc9b03cc X-TessianGatewayMetadata: 20YJm7s7bR0lWogLy8+Bs8l3Lq3e5RO3XEH0BljAUukgADM0YNC1JO/uLkvswxanqIqIZBf5v48yBDZFxsMjG4hA33APKdnfI6KCqIEDUMTyL83b2r1QgRb90T5Uc64gToSx2rhDvG4MVmzhWOiSzYKcn8d4XjP+6UClGZemp08= X-CR-MTA-TID: 64aa7808 Received: from Ld1a9f3cdac8e.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 69F4F05E-1A2A-483A-9EB5-7D8E846FBC07.1; Wed, 30 Oct 2024 16:32:06 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id Ld1a9f3cdac8e.2 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Wed, 30 Oct 2024 16:32:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zF7+WzP0uIjXV+xgDewS6nhVX00rrd/KBv0EraYS0QfWQBJsCQzAGmPvB4csYt2etJ0VX3tx3GnhZoa8LqGOPOVQgIj24CNduFuAyh/QmgS/Hdg4NfsW+s1IyiS5VWXNyDWges6rYNJa1RrzSDXUYkwTsdsTKpcBe5QriHkhWf5BJcQSiazhsMG0oElskyPDgo21CAyOA03cBdWlIQfotwJ2QJ8kwpHscf7LU99OOD4c1hWvYTPAhuZtlJG8VomspT8N9iltKTsU34Ycc0yozcRqC0rd0YU4TD44QfApWU5pZ9D3HFAWoL4Yibi9l3OE8NdIwDlxZx99alemFryfGw== 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=4N7ku8E+LaulZ0fWvko0OPOGH0kv6gwf39SWrVTwwFA=; b=UTDi3Vqi0f3gZ8fNGxJQ9+NKkthpRh/uU5FwwMIly6abmDYxkLV6kVcxAfiPvDDY8xcIDIuFN5hId6lE2TWJBNZpoBED7jOzJdNHUMcj65hClxhYnNaUHD2IE8801lut7tDZRolkTaFrc9G2T3Kg19tz1r4daX9h1ClBSEjBRD8XF5SHTVw+NOoF+ilnTuXzQgl7xn0x4veo+rZrAq0WrUroZNEN9bXXlF07t9rwWwMUFvLmRPI/T4L2RchU6gMaR8DTQRXi+BHNsYWgxqyqwVMjsQ+nf9B3dmT4vDtSYNyM8kJL+fHXVVJn//7QKj9xqJQzdADl3aDC072KNGcA6A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none (0) 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=4N7ku8E+LaulZ0fWvko0OPOGH0kv6gwf39SWrVTwwFA=; b=kpngFrd7wdneTkX7c9OGggRhkaKRImlngOQSe2C08wCQQpbOzcBbbPJM3LuvkoRSEioJykBIOHpfLb7wJxKOy/ASCyw+5iF1sl/190dCeo6fYZOX9UdEUW/bQet10yut3a6GjRqVzK9WqQ/Gpqi6I9ZBLxGjhzVcVHCtPp+rHZw= Received: from DU7P194CA0001.EURP194.PROD.OUTLOOK.COM (2603:10a6:10:553::16) by GVXPR08MB10449.eurprd08.prod.outlook.com (2603:10a6:150:157::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8093.25; Wed, 30 Oct 2024 16:32:00 +0000 Received: from DB1PEPF00039230.eurprd03.prod.outlook.com (2603:10a6:10:553:cafe::d4) by DU7P194CA0001.outlook.office365.com (2603:10a6:10:553::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.23 via Frontend Transport; Wed, 30 Oct 2024 16:32:00 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; pr=C Received: from nebula.arm.com (40.67.248.234) by DB1PEPF00039230.mail.protection.outlook.com (10.167.8.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8114.16 via Frontend Transport; Wed, 30 Oct 2024 16:32:00 +0000 Received: from AZ-NEU-EX04.Arm.com (10.251.24.32) by AZ-NEU-EX03.Arm.com (10.251.24.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Wed, 30 Oct 2024 16:31:58 +0000 Received: from 221664dbf3aa.euhpc2.arm.com (10.58.86.32) by mail.arm.com (10.251.24.32) with Microsoft SMTP Server id 15.1.2507.39 via Frontend Transport; Wed, 30 Oct 2024 16:31:58 +0000 From: Claudio Bantaloukas To: CC: Claudio Bantaloukas Subject: [PATCH v1 1/2] aarch64: Add basic svmfloat8_t support to arm_sve.h Date: Wed, 30 Oct 2024 16:31:55 +0000 Message-ID: <20241030163156.775854-2-claudio.bantaloukas@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241030163156.775854-1-claudio.bantaloukas@arm.com> References: <20241030163156.775854-1-claudio.bantaloukas@arm.com> MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: DB1PEPF00039230:EE_|GVXPR08MB10449:EE_|DB5PEPF00014B89:EE_|AS4PR08MB7926:EE_ X-MS-Office365-Filtering-Correlation-Id: b38aa2f0-0c64-4d86-11a6-08dcf9007251 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; ARA:13230040|82310400026|36860700013|1800799024|376014; X-Microsoft-Antispam-Message-Info-Original: xxUt0p0q7vKn7+0vjE09m1PNtEh+7eSEAoqyTxwxI8O6/qnDUhCgsp2ijLCiwLSFAO82M2eKewb9/1700xgX9RdTM9QcIpAeE8XHxcDu/1eJFw9H/rRO21xjHgxi9KwYfrmRZReuC4v4YbJnWgsSjeuIDAnmZSblyfdBhGBxPFrzbDebJjxHz+Ucmqxn15f1Hk2COvds8Hn1HBT3mN39kA43wZSTsHbnREUAKNIILs3Z08YYBgivDeesMOQ9DLLF2RBWwppYdUpFnF9sSVJzhR6K6xpWhRkTBhAjl4XLQTfrV24jtAq6qvV7TF/L/f1xwSsERIOGLYM/G0Egoj9xdo4d73h8LTCJMMm2Gut6d6bKTvNpe0/YjiIJjteH/K+RB/pbFjLrHvOf4RntknzQ9vg6yOmoShBt8Wnf7TubCrssrVyQYakMWFheAHx+FSFYJJEvtA+z9irolxW2tCbsaag2k7G3f20cEilYiiTscraBD9MwaljpCg2phollT3HHdmyMyxHlKJATkjkpgD1x/n+6PLM1lT0/s262vyPmwrOOakS/ohg5BtVkOmQx0XCtsYTHhPI5jtvln93RSX5Iy37EX+SIqz6+QeRzpRJL3a3rUIvJfcrbMeR4G0mY51QUrAiNCeet21IBXOa+yHll2W+CWJyHt0TW4bLB4D2m5c1bUVqcb9XDcnJCAEdhbGlDGhNvccJ4cHfliCw+I/XvcZcaBte1zy36QNP8sQnuVP0HLg+Szv3/oga+cMDsLQ10MJaf17/NUxDg496z7QaxkgkO3dpON22kgHcQUQT0DrEERV4144/JtI0Fb1Syzm1ZkQRJ0BCWy+a6yrO5oyb9HIMmGPfxv8YVRNo5zTogMEtkJEyr3U0HucBDe0Is+9rvez/wfI1i7xTFkpwDMjNVW9LCteeMdhcNWyPk1K+1uWzSPPGf1EvljNMUxru6xM+kTouisw3nmn9anR+Rga/fKSu9LjT1apv0wQ80DHk0E0ECzQVT6EZ7/gViUiILEXrjR1+A2PMgY53XNT2rNSHE6Mn8exvtttNZWpKclr3B/3xB6xjm56EmR6oM4mauPo/BKdmCp4GX4K3t3xChF7+8QGbC6o7hK/7esWfdHNUfeD45aRYoZ51rK62iAwFoS7+JFbIXeE1fnh+82AivSlnjq8nRgSF6kErVtAMhExv1PzsJXvaa8L7C2+2WtLHBzMHOQCJxtAcOASqUWoVemk49MYDtgMCjHbv1QrY0pUH3bNzof3X+O08MNFE/VBBiD1DQbF+q/68+ca2fxgZE+mxE2tOZWomHAKy4GuQc+oM1gL+KzVzNk4nX59spJ8pGMYOeoiYtYLrk4wB0/i4ie0qsYl9mjSLtXmiKrnE459/EfII= X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(82310400026)(36860700013)(1800799024)(376014); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR08MB10449 X-MS-Exchange-SkipListedInternetSender: ip=[2603:10a6:10:553::16]; domain=DU7P194CA0001.EURP194.PROD.OUTLOOK.COM X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5PEPF00014B89.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 1240ef63-5ef1-4825-cd98-08dcf900613d X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|35042699022|376014|36860700013|82310400026; X-Microsoft-Antispam-Message-Info: =?utf-8?q?o4/QN25ZOi6WgmuNnULcp49sV5B44gF?= =?utf-8?q?mViiSfIfr2yHN7mzn70MDCoqJXHroAQNDRhnfMqmliLivp4o/ht7doqaERv6xoJJW?= =?utf-8?q?6YRDVzeQFIS68/dsxGcdKjvoZ7cp+jUCxbHsdtBcoJEs/a4N/Fjrot8yM3NaJadKm?= =?utf-8?q?fSsCjcBsJQvm4Y8f1I6CmFn7c4ElqPOPUX3JSDUvwDd5puPvwYwUjqUQK8ZbOF742?= =?utf-8?q?h1XkBx3EBTkJVQgqqE/dRVmHKh6GTQq+ZJE7pjPw/tb7dNPuwIsPapoB8mU8GeodI?= =?utf-8?q?OJhbCXg1cMKpgxCpTgYlXnFZsIfImNxcWUUzwACEGFTIPJ/Q8IyEb5Jbc35/7XvaO?= =?utf-8?q?8tKXz/kWGGdZZBHVEyhUesOCLXeoqLQ61MapkNPsLnVw2wS4McR2n+0xDuLVjzdGy?= =?utf-8?q?c9v+gkHaJTmvUNntWZXO6J8hcSPhgFbi6gFiZ+kjpDmnG96JXt6e0wFci2AOqAkEk?= =?utf-8?q?Gdl8HdWah+jmP1dEA0PxUXOGPftC2rNvyYb36qohlnIVjviNverqC9FFo8yhxXwX1?= =?utf-8?q?LHCBr4S5qR5whWNdvO5aEuFcOMkQlfppix3kUYS5Ns/qTTE+TgtvvTEbXh9BdEarO?= =?utf-8?q?kyX/WgVk4ihzum5T/8mPGY3GeFCBEzmd2Z+8dPXv9doWqyEBPhNwc0BZGFxNr5cGT?= =?utf-8?q?PLxqvDh0dO/YeqKtISjprfncq5xsuWVS9zSx50x5Va2/1kzRll1uoHLTCYwe/UxKS?= =?utf-8?q?T4Ot7VqsGT/3lyGZF0mKBbfgZ4nS9OLDjnwDnc3V/GwotzBq3PYS8IPHAjy4Yi0Z/?= =?utf-8?q?YeE7nBkvuEK+/aklM7H0YjH846uKtl8Ad80xH7YNZQC2inQYvro5EfZfXE+p/BVP+?= =?utf-8?q?H2aBn938RweZz7jdn+6Djb91YDWKP9F0IZ+pKMYVyiX76bFbcDnuwPJ0Qd8pRPG3Z?= =?utf-8?q?o4QbqnYLWKty28t8WnZy/O1/umUGN9mPLO3yheHJXb1f8VV49HHwApqqxI4uGT5Wf?= =?utf-8?q?1w6JMWibbd1P45EHxYdHhDvASaK3Q6dnj2NeQYQ+WJNvdABuJSAIPOkrR6kkKm0CQ?= =?utf-8?q?saUxfkmtwSWAce+8M8UxXCIYDYGALfi8Y3KOsW+5iStXpSht/KACVYqDDLAoDHNm7?= =?utf-8?q?bLhs4GgUdEoI8fJSp8BxJS0rQcxGDMN2uBbuaQLlPUWrMkI6AXBZ61OOxFsTr/TYH?= =?utf-8?q?QMxJZDEhEPFdW/7WS2447izP5mp1pYH4S9vm+8yyWUXpoMvvdOwmyOSWdxDoxmENC?= =?utf-8?q?Iz75D/WsnjTDsYmOhhY+7yjhqHKME2Rk/p00hnrG5gZa548gTw35QovyBGMB3dFYs?= =?utf-8?q?KtsvOvqSPonzkUxsUJJIUQP2PKsBCA8GyB3ZdNGIHaG8a8e5fK2njTNo=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:(13230040)(1800799024)(35042699022)(376014)(36860700013)(82310400026); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2024 16:32:29.2999 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b38aa2f0-0c64-4d86-11a6-08dcf9007251 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: DB5PEPF00014B89.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7926 X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FORGED_SPF_HELO, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NONE, TXREP, 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 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 This patch adds support for the fp8 related vectors to arm_sve.h. It also adds support for functions that just treat mfloat8_t as a bag of 8 bits (reinterpret casts, vector manipulation, loads, stores, element selection, vector tuples, table lookups); these functions are available for fp8 whenever they're available for other 8-bit types. Arithmetic operations, bit manipulation, conversions are notably absent. The generated asm is mostly consistent with the _u8 equivalents and this can be used to validate tests, except where immediates are used. These cannot be expressed for mf8 and thus we resort to the use of function arguments found in registers w(0-9). gcc/ * config/aarch64/aarch64-sve-builtins.cc (TYPES_all_data): Add mf8. (TYPES_reinterpret1, TYPES_reinterpret): Likewise. * config/aarch64/aarch64-sve-builtins.def (svmfloat8_t): New type. (mf8): New type suffix. * config/aarch64/aarch64-sve-builtins.h (TYPE_mfloat): New type_class_index. gcc/testsuite/ * g++.target/aarch64/sve/acle/general-c++/mangle_1.C: Test mangling of svmfloat8_t. * g++.target/aarch64/sve/acle/general-c++/mangle_2.C: Likewise for __SVMfloat8_t. * gcc.target/aarch64/sve/acle/asm/clasta_mf8.c: New test. * gcc.target/aarch64/sve/acle/asm/clastb_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/create2_1.c (create2_mf8): Likewise. * gcc.target/aarch64/sve/acle/asm/create3_1.c (create_mf8): Likewise. * gcc.target/aarch64/sve/acle/asm/create4_1.c (create_mf8): Likewise. * gcc.target/aarch64/sve/acle/asm/dup_lane_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/dup_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/dupq_lane_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ext_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/get2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/get3_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/get4_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/insr_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/lasta_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/lastb_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ld1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ld1ro_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ld1rq_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ld2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ld3_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ld4_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ldff1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ldnf1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/ldnt1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/len_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_bf16.c (reinterpret_bf16_mf8_tied1, reinterpret_bf16_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_f16.c (reinterpret_f16_mf8_tied1, reinterpret_f16_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_f32.c (reinterpret_f32_mf8_tied1, reinterpret_f32_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_f64.c (reinterpret_f64_mf8_tied1, reinterpret_f64_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_s16.c (reinterpret_s16_mf8_tied1, reinterpret_s16_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_s32.c (reinterpret_s32_mf8_tied1, reinterpret_s32_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_s64.c (reinterpret_s64_mf8_tied1, reinterpret_s64_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_s8.c (reinterpret_s8_mf8_tied1, reinterpret_s8_mf8_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_u16.c (reinterpret_u16_mf8_tied1, reinterpret_u16_mf8_untied) (reinterpret_u16_mf8_x3_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_u32.c (reinterpret_u32_mf8_tied1, reinterpret_u32_mf8_untied) (reinterpret_u32_mf8_x3_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_u64.c (reinterpret_u64_mf8_tied1, reinterpret_u64_mf8_untied) (reinterpret_u64_mf8_x3_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/reinterpret_u8.c (reinterpret_u8_mf8_tied1, reinterpret_u8_mf8_untied) (reinterpret_u8_mf8_x3_untied): Likewise. * gcc.target/aarch64/sve/acle/asm/rev_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/sel_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/set2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/set3_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/set4_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/splice_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/st1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/st2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/st3_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/st4_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/stnt1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/tbl_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/trn1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/trn1q_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/trn2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/trn2q_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/undef2_1.c (mfloat8_t): Likewise. * gcc.target/aarch64/sve/acle/asm/undef3_1.c (mfloat8_t): Likewise. * gcc.target/aarch64/sve/acle/asm/undef4_1.c (mfloat8_t): Likewise. * gcc.target/aarch64/sve/acle/asm/undef_1.c (mfloat8_t): Likewise. * gcc.target/aarch64/sve/acle/asm/uzp1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/uzp1q_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/uzp2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/uzp2q_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/zip1_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/zip1q_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/zip2_mf8.c: Likewise. * gcc.target/aarch64/sve/acle/asm/zip2q_mf8.c: Likewise. * gcc.target/aarch64/sve/pcs/annotate_1.c (ret_mf8, ret_mf8x2) (ret_mf8x3, ret_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/annotate_2.c (fn_mf8, fn_mf8x2) (fn_mf8x3, fn_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/annotate_3.c (fn_mf8, fn_mf8x2) (fn_mf8x3, fn_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/annotate_4.c (fn_mf8, fn_mf8x2) (fn_mf8x3, fn_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/annotate_5.c (fn_mf8, fn_mf8x2) (fn_mf8x3, fn_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/annotate_6.c (fn_mf8, fn_mf8x2) (fn_mf8x3, fn_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/annotate_7.c (fn_mf8, fn_mf8x2) (fn_mf8x3, fn_mf8x4): Likewise. * gcc.target/aarch64/sve/pcs/args_5_be_mf8.c: Likewise. * gcc.target/aarch64/sve/pcs/args_5_le_mf8.c: Likewise. * gcc.target/aarch64/sve/pcs/args_6_be_mf8.c: Likewise. * gcc.target/aarch64/sve/pcs/args_6_le_mf8.c: Likewise. * gcc.target/aarch64/sve/pcs/gnu_vectors_1.c (mfloat8x32_t): New typedef. (mfloat8_callee, mfloat8_caller): New tests. * gcc.target/aarch64/sve/pcs/gnu_vectors_2.c (mfloat8x32_t): New typedef. (mfloat8_callee, mfloat8_caller): New tests. * gcc.target/aarch64/sve/pcs/return_4_128.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_4_256.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_4_512.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_4_1024.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_4_2048.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_4.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_5_128.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_5_256.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_5_512.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_5_1024.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_5_2048.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_5.c (CALLER_NON_NUMERIC): Renamed CALLER_BF16 macro. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_6.c (mfloat8_t): New typedef. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_6_128.c (mfloat8_t): New typedef. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_6_256.c (mfloat8_t): New typedef. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_6_512.c (mfloat8_t): New typedef. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_6_1024.c (mfloat8_t): New typedef. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_6_2048.c (mfloat8_t): New typedef. (callee_mf8, caller_mf8): New tests. * gcc.target/aarch64/sve/pcs/return_7.c (callee_mf8): New tests. (caller_mf8): Likewise. * gcc.target/aarch64/sve/pcs/return_8.c (callee_mf8): Likewise (caller_mf8): Likewise. * gcc.target/aarch64/sve/pcs/return_9.c (callee_mf8): Likewise (caller_mf8): Likewise. * gcc.target/aarch64/sve/pcs/varargs_2_mf8.c: New tests * gcc.target/aarch64/sve2/acle/asm/tbl2_mf8.c: Likewise. * gcc.target/aarch64/sve2/acle/asm/tbx_mf8.c: Likewise. * gcc.target/aarch64/sve2/acle/asm/whilerw_mf8.c: Likewise. * gcc.target/aarch64/sve2/acle/asm/whilewr_mf8.c: Likewise. --- gcc/config/aarch64/aarch64-sve-builtins.cc | 8 +- gcc/config/aarch64/aarch64-sve-builtins.def | 3 + gcc/config/aarch64/aarch64-sve-builtins.h | 1 + .../aarch64/sve/acle/general-c++/mangle_1.C | 2 + .../aarch64/sve/acle/general-c++/mangle_2.C | 2 + .../aarch64/sve/acle/asm/clasta_mf8.c | 52 +++ .../aarch64/sve/acle/asm/clastb_mf8.c | 52 +++ .../aarch64/sve/acle/asm/create2_1.c | 15 + .../aarch64/sve/acle/asm/create3_1.c | 11 + .../aarch64/sve/acle/asm/create4_1.c | 12 + .../aarch64/sve/acle/asm/dup_lane_mf8.c | 124 ++++++++ .../gcc.target/aarch64/sve/acle/asm/dup_mf8.c | 31 ++ .../aarch64/sve/acle/asm/dupq_lane_mf8.c | 48 +++ .../gcc.target/aarch64/sve/acle/asm/ext_mf8.c | 73 +++++ .../aarch64/sve/acle/asm/get2_mf8.c | 55 ++++ .../aarch64/sve/acle/asm/get3_mf8.c | 108 +++++++ .../aarch64/sve/acle/asm/get4_mf8.c | 179 +++++++++++ .../aarch64/sve/acle/asm/insr_mf8.c | 22 ++ .../aarch64/sve/acle/asm/lasta_mf8.c | 12 + .../aarch64/sve/acle/asm/lastb_mf8.c | 12 + .../gcc.target/aarch64/sve/acle/asm/ld1_mf8.c | 162 ++++++++++ .../aarch64/sve/acle/asm/ld1ro_mf8.c | 121 +++++++ .../aarch64/sve/acle/asm/ld1rq_mf8.c | 137 ++++++++ .../gcc.target/aarch64/sve/acle/asm/ld2_mf8.c | 204 ++++++++++++ .../gcc.target/aarch64/sve/acle/asm/ld3_mf8.c | 246 +++++++++++++++ .../gcc.target/aarch64/sve/acle/asm/ld4_mf8.c | 290 +++++++++++++++++ .../aarch64/sve/acle/asm/ldff1_mf8.c | 91 ++++++ .../aarch64/sve/acle/asm/ldnf1_mf8.c | 155 +++++++++ .../aarch64/sve/acle/asm/ldnt1_mf8.c | 162 ++++++++++ .../gcc.target/aarch64/sve/acle/asm/len_mf8.c | 12 + .../aarch64/sve/acle/asm/reinterpret_bf16.c | 17 + .../aarch64/sve/acle/asm/reinterpret_f16.c | 17 + .../aarch64/sve/acle/asm/reinterpret_f32.c | 17 + .../aarch64/sve/acle/asm/reinterpret_f64.c | 17 + .../aarch64/sve/acle/asm/reinterpret_mf8.c | 297 ++++++++++++++++++ .../aarch64/sve/acle/asm/reinterpret_s16.c | 17 + .../aarch64/sve/acle/asm/reinterpret_s32.c | 17 + .../aarch64/sve/acle/asm/reinterpret_s64.c | 17 + .../aarch64/sve/acle/asm/reinterpret_s8.c | 17 + .../aarch64/sve/acle/asm/reinterpret_u16.c | 28 ++ .../aarch64/sve/acle/asm/reinterpret_u32.c | 28 ++ .../aarch64/sve/acle/asm/reinterpret_u64.c | 28 ++ .../aarch64/sve/acle/asm/reinterpret_u8.c | 28 ++ .../gcc.target/aarch64/sve/acle/asm/rev_mf8.c | 21 ++ .../gcc.target/aarch64/sve/acle/asm/sel_mf8.c | 30 ++ .../aarch64/sve/acle/asm/set2_mf8.c | 41 +++ .../aarch64/sve/acle/asm/set3_mf8.c | 63 ++++ .../aarch64/sve/acle/asm/set4_mf8.c | 87 +++++ .../aarch64/sve/acle/asm/splice_mf8.c | 33 ++ .../gcc.target/aarch64/sve/acle/asm/st1_mf8.c | 162 ++++++++++ .../gcc.target/aarch64/sve/acle/asm/st2_mf8.c | 204 ++++++++++++ .../gcc.target/aarch64/sve/acle/asm/st3_mf8.c | 246 +++++++++++++++ .../gcc.target/aarch64/sve/acle/asm/st4_mf8.c | 290 +++++++++++++++++ .../aarch64/sve/acle/asm/stnt1_mf8.c | 162 ++++++++++ .../gcc.target/aarch64/sve/acle/asm/tbl_mf8.c | 30 ++ .../aarch64/sve/acle/asm/trn1_mf8.c | 30 ++ .../aarch64/sve/acle/asm/trn1q_mf8.c | 32 ++ .../aarch64/sve/acle/asm/trn2_mf8.c | 30 ++ .../aarch64/sve/acle/asm/trn2q_mf8.c | 32 ++ .../aarch64/sve/acle/asm/undef2_1.c | 7 + .../aarch64/sve/acle/asm/undef3_1.c | 7 + .../aarch64/sve/acle/asm/undef4_1.c | 7 + .../gcc.target/aarch64/sve/acle/asm/undef_1.c | 7 + .../aarch64/sve/acle/asm/uzp1_mf8.c | 30 ++ .../aarch64/sve/acle/asm/uzp1q_mf8.c | 32 ++ .../aarch64/sve/acle/asm/uzp2_mf8.c | 30 ++ .../aarch64/sve/acle/asm/uzp2q_mf8.c | 32 ++ .../aarch64/sve/acle/asm/zip1_mf8.c | 30 ++ .../aarch64/sve/acle/asm/zip1q_mf8.c | 32 ++ .../aarch64/sve/acle/asm/zip2_mf8.c | 30 ++ .../aarch64/sve/acle/asm/zip2q_mf8.c | 32 ++ .../gcc.target/aarch64/sve/pcs/annotate_1.c | 8 + .../gcc.target/aarch64/sve/pcs/annotate_2.c | 8 + .../gcc.target/aarch64/sve/pcs/annotate_3.c | 8 + .../gcc.target/aarch64/sve/pcs/annotate_4.c | 12 + .../gcc.target/aarch64/sve/pcs/annotate_5.c | 12 + .../gcc.target/aarch64/sve/pcs/annotate_6.c | 12 + .../gcc.target/aarch64/sve/pcs/annotate_7.c | 8 + .../aarch64/sve/pcs/args_5_be_mf8.c | 63 ++++ .../aarch64/sve/pcs/args_5_le_mf8.c | 58 ++++ .../aarch64/sve/pcs/args_6_be_mf8.c | 71 +++++ .../aarch64/sve/pcs/args_6_le_mf8.c | 70 +++++ .../aarch64/sve/pcs/gnu_vectors_1.c | 12 +- .../aarch64/sve/pcs/gnu_vectors_2.c | 10 +- .../gcc.target/aarch64/sve/pcs/return_4.c | 22 +- .../aarch64/sve/pcs/return_4_1024.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_4_128.c | 22 +- .../aarch64/sve/pcs/return_4_2048.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_4_256.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_4_512.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_5.c | 22 +- .../aarch64/sve/pcs/return_5_1024.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_5_128.c | 22 +- .../aarch64/sve/pcs/return_5_2048.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_5_256.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_5_512.c | 22 +- .../gcc.target/aarch64/sve/pcs/return_6.c | 24 ++ .../aarch64/sve/pcs/return_6_1024.c | 22 ++ .../gcc.target/aarch64/sve/pcs/return_6_128.c | 19 ++ .../aarch64/sve/pcs/return_6_2048.c | 22 ++ .../gcc.target/aarch64/sve/pcs/return_6_256.c | 22 ++ .../gcc.target/aarch64/sve/pcs/return_6_512.c | 22 ++ .../gcc.target/aarch64/sve/pcs/return_7.c | 28 ++ .../gcc.target/aarch64/sve/pcs/return_8.c | 29 ++ .../gcc.target/aarch64/sve/pcs/return_9.c | 33 ++ .../aarch64/sve/pcs/varargs_2_mf8.c | 170 ++++++++++ .../aarch64/sve2/acle/asm/tbl2_mf8.c | 31 ++ .../aarch64/sve2/acle/asm/tbx_mf8.c | 37 +++ .../aarch64/sve2/acle/asm/whilerw_mf8.c | 50 +++ .../aarch64/sve2/acle/asm/whilewr_mf8.c | 50 +++ 110 files changed, 5861 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clasta_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clastb_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_lane_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dupq_lane_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ext_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get3_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get4_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/insr_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lasta_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lastb_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1rq_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld3_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld4_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldff1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnf1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnt1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/len_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rev_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/sel_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set3_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set4_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/splice_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st3_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st4_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/stnt1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/tbl_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1q_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2q_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1q_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2q_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1q_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2q_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_be_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_le_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_be_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_le_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pcs/varargs_2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_mf8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_mf8.c diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc index ef14f8cd39d..c6dc28eff55 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc @@ -232,12 +232,12 @@ CONSTEXPR const group_suffix_info group_suffixes[] = { #define TYPES_all_arith(S, D) \ TYPES_all_float (S, D), TYPES_all_integer (S, D) -/* _bf16 +/* _mf8 _bf16 _f16 _f32 _f64 _s8 _s16 _s32 _s64 _u8 _u16 _u32 _u64. */ #define TYPES_all_data(S, D) \ - S (bf16), TYPES_all_arith (S, D) + S(mf8), S (bf16), TYPES_all_arith (S, D) /* _b only. */ #define TYPES_b(S, D) \ @@ -513,16 +513,18 @@ CONSTEXPR const group_suffix_info group_suffixes[] = { D (u8, s32), \ D (u16, s64) -/* { _bf16 } { _bf16 } +/* { _mf8 _bf16 } { _mf8 _bf16 } { _f16 _f32 _f64 } { _f16 _f32 _f64 } { _s8 _s16 _s32 _s64 } x { _s8 _s16 _s32 _s64 } { _u8 _u16 _u32 _u64 } { _u8 _u16 _u32 _u64 }. */ #define TYPES_reinterpret1(D, A) \ + D (A, mf8), \ D (A, bf16), \ D (A, f16), D (A, f32), D (A, f64), \ D (A, s8), D (A, s16), D (A, s32), D (A, s64), \ D (A, u8), D (A, u16), D (A, u32), D (A, u64) #define TYPES_reinterpret(S, D) \ + TYPES_reinterpret1 (D, mf8), \ TYPES_reinterpret1 (D, bf16), \ TYPES_reinterpret1 (D, f16), \ TYPES_reinterpret1 (D, f32), \ diff --git a/gcc/config/aarch64/aarch64-sve-builtins.def b/gcc/config/aarch64/aarch64-sve-builtins.def index a9243c40a97..47c396b866d 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.def +++ b/gcc/config/aarch64/aarch64-sve-builtins.def @@ -81,6 +81,7 @@ DEF_SVE_MODE (vnum, none, none, vectors) DEF_SVE_TYPE (svbool_t, 10, __SVBool_t, boolean_type_node) DEF_SVE_TYPE (svcount_t, 11, __SVCount_t, boolean_type_node) +DEF_SVE_TYPE (svmfloat8_t, 13, __SVMfloat8_t, aarch64_mfp8_type_node) DEF_SVE_TYPE (svbfloat16_t, 14, __SVBfloat16_t, bfloat16_type_node) DEF_SVE_TYPE (svfloat16_t, 13, __SVFloat16_t, aarch64_fp16_type_node) DEF_SVE_TYPE (svfloat32_t, 13, __SVFloat32_t, float_type_node) @@ -107,6 +108,8 @@ DEF_SVE_TYPE_SUFFIX (c8, svcount_t, count, 8, VNx16BImode) DEF_SVE_TYPE_SUFFIX (c16, svcount_t, count, 16, VNx16BImode) DEF_SVE_TYPE_SUFFIX (c32, svcount_t, count, 32, VNx16BImode) DEF_SVE_TYPE_SUFFIX (c64, svcount_t, count, 64, VNx16BImode) +DEF_SVE_NEON_TYPE_SUFFIX (mf8, svmfloat8_t, mfloat, 8, VNx16QImode, + Mfloat8x8_t, Mfloat8x16_t) DEF_SVE_NEON_TYPE_SUFFIX (bf16, svbfloat16_t, bfloat, 16, VNx8BFmode, Bfloat16x4_t, Bfloat16x8_t) DEF_SVE_NEON_TYPE_SUFFIX (f16, svfloat16_t, float, 16, VNx8HFmode, diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h index 4cdc0541bdc..93de4254657 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.h +++ b/gcc/config/aarch64/aarch64-sve-builtins.h @@ -173,6 +173,7 @@ enum type_class_index TYPE_bfloat, TYPE_count, TYPE_float, + TYPE_mfloat, TYPE_signed, TYPE_unsigned, NUM_TYPE_CLASSES diff --git a/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_1.C b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_1.C index 2ad0c7f9838..c4984065416 100644 --- a/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_1.C +++ b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_1.C @@ -16,6 +16,7 @@ void f11(svfloat32_t) {} void f12(svfloat64_t) {} void f13(svbfloat16_t) {} void f14(svcount_t) {} +void f15(svmfloat8_t) {} /* { dg-final { scan-assembler "_Z2f1u10__SVBool_t:" } } */ /* { dg-final { scan-assembler "_Z2f2u10__SVInt8_t:" } } */ @@ -31,3 +32,4 @@ void f14(svcount_t) {} /* { dg-final { scan-assembler "_Z3f12u13__SVFloat64_t:" } } */ /* { dg-final { scan-assembler "_Z3f13u14__SVBfloat16_t:" } } */ /* { dg-final { scan-assembler "_Z3f14u11__SVCount_t:" } } */ +/* { dg-final { scan-assembler "_Z3f15u13__SVMfloat8_t:" } } */ diff --git a/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_2.C b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_2.C index c8bfcc5a9c2..3d83ddb7ab4 100644 --- a/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_2.C +++ b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_2.C @@ -14,6 +14,7 @@ void f11(__SVFloat32_t) {} void f12(__SVFloat64_t) {} void f13(__SVBfloat16_t) {} void f14(__SVCount_t) {} +void f15(__SVMfloat8_t) {} /* { dg-final { scan-assembler "_Z2f1u10__SVBool_t:" } } */ /* { dg-final { scan-assembler "_Z2f2u10__SVInt8_t:" } } */ @@ -29,3 +30,4 @@ void f14(__SVCount_t) {} /* { dg-final { scan-assembler "_Z3f12u13__SVFloat64_t:" } } */ /* { dg-final { scan-assembler "_Z3f13u14__SVBfloat16_t:" } } */ /* { dg-final { scan-assembler "_Z3f14u11__SVCount_t:" } } */ +/* { dg-final { scan-assembler "_Z3f15u13__SVMfloat8_t:" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clasta_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clasta_mf8.c new file mode 100644 index 00000000000..81d8816172b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clasta_mf8.c @@ -0,0 +1,52 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** clasta_mf8_tied1: +** clasta z0\.b, p0, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (clasta_mf8_tied1, svmfloat8_t, + z0 = svclasta_mf8 (p0, z0, z1), + z0 = svclasta (p0, z0, z1)) + +/* +** clasta_mf8_tied2: +** mov (z[0-9]+)\.d, z0\.d +** movprfx z0, z1 +** clasta z0\.b, p0, z0\.b, \1\.b +** ret +*/ +TEST_UNIFORM_Z (clasta_mf8_tied2, svmfloat8_t, + z0 = svclasta_mf8 (p0, z1, z0), + z0 = svclasta (p0, z1, z0)) + +/* +** clasta_mf8_untied: +** movprfx z0, z1 +** clasta z0\.b, p0, z0\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (clasta_mf8_untied, svmfloat8_t, + z0 = svclasta_mf8 (p0, z1, z2), + z0 = svclasta (p0, z1, z2)) + +/* +** clasta_x0_mf8: +** clasta w0, p0, w0, z0\.b +** ret +*/ +TEST_FOLD_LEFT_X (clasta_x0_mf8, mfloat8_t, svmfloat8_t, + x0 = svclasta_n_mf8 (p0, x0, z0), + x0 = svclasta (p0, x0, z0)) + +/* +** clasta_x1_mf8: +** mov w0, w1 +** clasta w0, p0, w0, z0\.b +** ret +*/ +TEST_FOLD_LEFT_X (clasta_x1_mf8, mfloat8_t, svmfloat8_t, + x0 = svclasta_n_mf8 (p0, x1, z0), + x0 = svclasta (p0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clastb_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clastb_mf8.c new file mode 100644 index 00000000000..1ce7dc78546 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/clastb_mf8.c @@ -0,0 +1,52 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** clastb_mf8_tied1: +** clastb z0\.b, p0, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (clastb_mf8_tied1, svmfloat8_t, + z0 = svclastb_mf8 (p0, z0, z1), + z0 = svclastb (p0, z0, z1)) + +/* +** clastb_mf8_tied2: +** mov (z[0-9]+)\.d, z0\.d +** movprfx z0, z1 +** clastb z0\.b, p0, z0\.b, \1\.b +** ret +*/ +TEST_UNIFORM_Z (clastb_mf8_tied2, svmfloat8_t, + z0 = svclastb_mf8 (p0, z1, z0), + z0 = svclastb (p0, z1, z0)) + +/* +** clastb_mf8_untied: +** movprfx z0, z1 +** clastb z0\.b, p0, z0\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (clastb_mf8_untied, svmfloat8_t, + z0 = svclastb_mf8 (p0, z1, z2), + z0 = svclastb (p0, z1, z2)) + +/* +** clastb_x0_mf8: +** clastb w0, p0, w0, z0\.b +** ret +*/ +TEST_FOLD_LEFT_X (clastb_x0_mf8, mfloat8_t, svmfloat8_t, + x0 = svclastb_n_mf8 (p0, x0, z0), + x0 = svclastb (p0, x0, z0)) + +/* +** clastb_x1_mf8: +** mov w0, w1 +** clastb w0, p0, w0, z0\.b +** ret +*/ +TEST_FOLD_LEFT_X (clastb_x1_mf8, mfloat8_t, svmfloat8_t, + x0 = svclastb_n_mf8 (p0, x1, z0), + x0 = svclastb (p0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create2_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create2_1.c index 7e7d8901d21..a9369c8bdf8 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create2_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create2_1.c @@ -62,6 +62,21 @@ TEST_CREATE (create2_u16, svuint16x2_t, svuint16_t, z0 = svcreate2_u16 (z6, z5), z0 = svcreate2 (z6, z5)) +/* +** create2_mf8: +** ( +** mov z0\.d, z4\.d +** mov z1\.d, z5\.d +** | +** mov z1\.d, z5\.d +** mov z0\.d, z4\.d +** ) +** ret +*/ +TEST_CREATE (create2_mf8, svmfloat8x2_t, svmfloat8_t, + z0 = svcreate2_mf8 (z4, z5), + z0 = svcreate2 (z4, z5)) + /* ** create2_bf16: ** ( diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create3_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create3_1.c index 0bea95195b8..da787cb1b3b 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create3_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create3_1.c @@ -46,6 +46,17 @@ TEST_CREATE (create3_u16, svuint16x3_t, svuint16_t, z0 = svcreate3_u16 (z6, z5, z4), z0 = svcreate3 (z6, z5, z4)) +/* +** create3_mf8: +** mov [^\n]+ +** mov [^\n]+ +** mov [^\n]+ +** ret +*/ +TEST_CREATE (create3_mf8, svmfloat8x3_t, svmfloat8_t, + z0 = svcreate3_mf8 (z4, z5, z6), + z0 = svcreate3 (z4, z5, z6)) + /* ** create3_bf16: ** mov [^\n]+ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create4_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create4_1.c index b5ffd4e6aaf..618a80001d9 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create4_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/create4_1.c @@ -50,6 +50,18 @@ TEST_CREATE (create4_u16, svuint16x4_t, svuint16_t, z0 = svcreate4_u16 (z6, z5, z4, z7), z0 = svcreate4 (z6, z5, z4, z7)) +/* +** create4_mf8: +** mov [^\n]+ +** mov [^\n]+ +** mov [^\n]+ +** mov [^\n]+ +** ret +*/ +TEST_CREATE (create4_mf8, svmfloat8x4_t, svmfloat8_t, + z0 = svcreate4_mf8 (z4, z5, z6, z7), + z0 = svcreate4 (z4, z5, z6, z7)) + /* ** create4_bf16: ** mov [^\n]+ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_lane_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_lane_mf8.c new file mode 100644 index 00000000000..22bf4185d08 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_lane_mf8.c @@ -0,0 +1,124 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** dup_lane_w0_mf8_tied1: +** mov (z[0-9]+\.b), w0 +** tbl z0\.b, z0\.b, \1 +** ret +*/ +TEST_UNIFORM_ZX (dup_lane_w0_mf8_tied1, svmfloat8_t, uint8_t, + z0 = svdup_lane_mf8 (z0, x0), + z0 = svdup_lane (z0, x0)) + +/* +** dup_lane_w0_mf8_untied: +** mov (z[0-9]+\.b), w0 +** tbl z0\.b, z1\.b, \1 +** ret +*/ +TEST_UNIFORM_ZX (dup_lane_w0_mf8_untied, svmfloat8_t, uint8_t, + z0 = svdup_lane_mf8 (z1, x0), + z0 = svdup_lane (z1, x0)) + +/* +** dup_lane_0_mf8_tied1: +** dup z0\.b, z0\.b\[0\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_0_mf8_tied1, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 0), + z0 = svdup_lane (z0, 0)) + +/* +** dup_lane_0_mf8_untied: +** dup z0\.b, z1\.b\[0\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_0_mf8_untied, svmfloat8_t, + z0 = svdup_lane_mf8 (z1, 0), + z0 = svdup_lane (z1, 0)) + +/* +** dup_lane_7_mf8: +** dup z0\.b, z0\.b\[7\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_7_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 7), + z0 = svdup_lane (z0, 7)) + +/* +** dup_lane_8_mf8: +** dup z0\.b, z0\.b\[8\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_8_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 8), + z0 = svdup_lane (z0, 8)) + +/* +** dup_lane_15_mf8: +** dup z0\.b, z0\.b\[15\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_15_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 15), + z0 = svdup_lane (z0, 15)) + +/* +** dup_lane_16_mf8: +** dup z0\.b, z0\.b\[16\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_16_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 16), + z0 = svdup_lane (z0, 16)) + +/* +** dup_lane_31_mf8: +** dup z0\.b, z0\.b\[31\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_31_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 31), + z0 = svdup_lane (z0, 31)) + +/* +** dup_lane_32_mf8: +** dup z0\.b, z0\.b\[32\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_32_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 32), + z0 = svdup_lane (z0, 32)) + +/* +** dup_lane_63_mf8: +** dup z0\.b, z0\.b\[63\] +** ret +*/ +TEST_UNIFORM_Z (dup_lane_63_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 63), + z0 = svdup_lane (z0, 63)) + +/* +** dup_lane_64_mf8: +** mov (z[0-9]+\.b), #64 +** tbl z0\.b, z0\.b, \1 +** ret +*/ +TEST_UNIFORM_Z (dup_lane_64_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 64), + z0 = svdup_lane (z0, 64)) + +/* +** dup_lane_255_mf8: +** mov (z[0-9]+\.b), #-1 +** tbl z0\.b, z0\.b, \1 +** ret +*/ +TEST_UNIFORM_Z (dup_lane_255_mf8, svmfloat8_t, + z0 = svdup_lane_mf8 (z0, 255), + z0 = svdup_lane (z0, 255)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_mf8.c new file mode 100644 index 00000000000..b5bc1308ee3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dup_mf8.c @@ -0,0 +1,31 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** dup_w0_mf8: +** mov z0\.b, w0 +** ret +*/ +TEST_UNIFORM_ZX (dup_w0_mf8, svmfloat8_t, mfloat8_t, + z0 = svdup_n_mf8 (x0), + z0 = svdup_mf8 (x0)) + +/* +** dup_w0_mf8_m: +** movprfx z0, z1 +** mov z0\.b, p0/m, w0 +** ret +*/ +TEST_UNIFORM_ZX (dup_w0_mf8_m, svmfloat8_t, mfloat8_t, + z0 = svdup_n_mf8_m (z1, p0, x0), + z0 = svdup_mf8_m (z1, p0, x0)) + +/* +** dup_w0_mf8_x: +** mov z0\.b, w0 +** ret +*/ +TEST_UNIFORM_ZX (dup_w0_mf8_x, svmfloat8_t, mfloat8_t, + z0 = svdup_n_mf8_x (p0, x0), + z0 = svdup_mf8_x (p0, x0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dupq_lane_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dupq_lane_mf8.c new file mode 100644 index 00000000000..02e95f73c19 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/dupq_lane_mf8.c @@ -0,0 +1,48 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** dupq_lane_0_mf8_tied: +** dup z0\.q, z0\.q\[0\] +** ret +*/ +TEST_UNIFORM_Z (dupq_lane_0_mf8_tied, svmfloat8_t, + z0 = svdupq_lane_mf8 (z0, 0), + z0 = svdupq_lane (z0, 0)) + +/* +** dupq_lane_0_mf8_untied: +** dup z0\.q, z1\.q\[0\] +** ret +*/ +TEST_UNIFORM_Z (dupq_lane_0_mf8_untied, svmfloat8_t, + z0 = svdupq_lane_mf8 (z1, 0), + z0 = svdupq_lane (z1, 0)) + +/* +** dupq_lane_1_mf8: +** dup z0\.q, z0\.q\[1\] +** ret +*/ +TEST_UNIFORM_Z (dupq_lane_1_mf8, svmfloat8_t, + z0 = svdupq_lane_mf8 (z0, 1), + z0 = svdupq_lane (z0, 1)) + +/* +** dupq_lane_2_mf8: +** dup z0\.q, z0\.q\[2\] +** ret +*/ +TEST_UNIFORM_Z (dupq_lane_2_mf8, svmfloat8_t, + z0 = svdupq_lane_mf8 (z0, 2), + z0 = svdupq_lane (z0, 2)) + +/* +** dupq_lane_3_mf8: +** dup z0\.q, z0\.q\[3\] +** ret +*/ +TEST_UNIFORM_Z (dupq_lane_3_mf8, svmfloat8_t, + z0 = svdupq_lane_mf8 (z0, 3), + z0 = svdupq_lane (z0, 3)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ext_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ext_mf8.c new file mode 100644 index 00000000000..ceeca3dd367 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ext_mf8.c @@ -0,0 +1,73 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** ext_0_mf8_tied1: +** ext z0\.b, z0\.b, z1\.b, #0 +** ret +*/ +TEST_UNIFORM_Z (ext_0_mf8_tied1, svmfloat8_t, + z0 = svext_mf8 (z0, z1, 0), + z0 = svext (z0, z1, 0)) + +/* +** ext_0_mf8_tied2: +** mov (z[0-9]+)\.d, z0\.d +** movprfx z0, z1 +** ext z0\.b, z0\.b, \1\.b, #0 +** ret +*/ +TEST_UNIFORM_Z (ext_0_mf8_tied2, svmfloat8_t, + z0 = svext_mf8 (z1, z0, 0), + z0 = svext (z1, z0, 0)) + +/* +** ext_0_mf8_untied: +** movprfx z0, z1 +** ext z0\.b, z0\.b, z2\.b, #0 +** ret +*/ +TEST_UNIFORM_Z (ext_0_mf8_untied, svmfloat8_t, + z0 = svext_mf8 (z1, z2, 0), + z0 = svext (z1, z2, 0)) + +/* +** ext_1_mf8: +** movprfx z0, z1 +** ext z0\.b, z0\.b, z2\.b, #1 +** ret +*/ +TEST_UNIFORM_Z (ext_1_mf8, svmfloat8_t, + z0 = svext_mf8 (z1, z2, 1), + z0 = svext (z1, z2, 1)) + +/* +** ext_2_mf8: +** movprfx z0, z1 +** ext z0\.b, z0\.b, z2\.b, #2 +** ret +*/ +TEST_UNIFORM_Z (ext_2_mf8, svmfloat8_t, + z0 = svext_mf8 (z1, z2, 2), + z0 = svext (z1, z2, 2)) + +/* +** ext_3_mf8: +** movprfx z0, z1 +** ext z0\.b, z0\.b, z2\.b, #3 +** ret +*/ +TEST_UNIFORM_Z (ext_3_mf8, svmfloat8_t, + z0 = svext_mf8 (z1, z2, 3), + z0 = svext (z1, z2, 3)) + +/* +** ext_255_mf8: +** movprfx z0, z1 +** ext z0\.b, z0\.b, z2\.b, #255 +** ret +*/ +TEST_UNIFORM_Z (ext_255_mf8, svmfloat8_t, + z0 = svext_mf8 (z1, z2, 255), + z0 = svext (z1, z2, 255)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get2_mf8.c new file mode 100644 index 00000000000..e365f09d17e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get2_mf8.c @@ -0,0 +1,55 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** get2_mf8_z0_0: +** mov z0\.d, z4\.d +** ret +*/ +TEST_GET (get2_mf8_z0_0, svmfloat8x2_t, svmfloat8_t, + z0 = svget2_mf8 (z4, 0), + z0 = svget2 (z4, 0)) + +/* +** get2_mf8_z0_1: +** mov z0\.d, z5\.d +** ret +*/ +TEST_GET (get2_mf8_z0_1, svmfloat8x2_t, svmfloat8_t, + z0 = svget2_mf8 (z4, 1), + z0 = svget2 (z4, 1)) + +/* +** get2_mf8_z4_0: +** ret +*/ +TEST_GET (get2_mf8_z4_0, svmfloat8x2_t, svmfloat8_t, + z4_res = svget2_mf8 (z4, 0), + z4_res = svget2 (z4, 0)) + +/* +** get2_mf8_z4_1: +** mov z4\.d, z5\.d +** ret +*/ +TEST_GET (get2_mf8_z4_1, svmfloat8x2_t, svmfloat8_t, + z4_res = svget2_mf8 (z4, 1), + z4_res = svget2 (z4, 1)) + +/* +** get2_mf8_z5_0: +** mov z5\.d, z4\.d +** ret +*/ +TEST_GET (get2_mf8_z5_0, svmfloat8x2_t, svmfloat8_t, + z5_res = svget2_mf8 (z4, 0), + z5_res = svget2 (z4, 0)) + +/* +** get2_mf8_z5_1: +** ret +*/ +TEST_GET (get2_mf8_z5_1, svmfloat8x2_t, svmfloat8_t, + z5_res = svget2_mf8 (z4, 1), + z5_res = svget2 (z4, 1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get3_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get3_mf8.c new file mode 100644 index 00000000000..6acab814c59 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get3_mf8.c @@ -0,0 +1,108 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** get3_mf8_z0_0: +** mov z0\.d, z4\.d +** ret +*/ +TEST_GET (get3_mf8_z0_0, svmfloat8x3_t, svmfloat8_t, + z0 = svget3_mf8 (z4, 0), + z0 = svget3 (z4, 0)) + +/* +** get3_mf8_z0_1: +** mov z0\.d, z5\.d +** ret +*/ +TEST_GET (get3_mf8_z0_1, svmfloat8x3_t, svmfloat8_t, + z0 = svget3_mf8 (z4, 1), + z0 = svget3 (z4, 1)) + +/* +** get3_mf8_z0_2: +** mov z0\.d, z6\.d +** ret +*/ +TEST_GET (get3_mf8_z0_2, svmfloat8x3_t, svmfloat8_t, + z0 = svget3_mf8 (z4, 2), + z0 = svget3 (z4, 2)) + +/* +** get3_mf8_z4_0: +** ret +*/ +TEST_GET (get3_mf8_z4_0, svmfloat8x3_t, svmfloat8_t, + z4_res = svget3_mf8 (z4, 0), + z4_res = svget3 (z4, 0)) + +/* +** get3_mf8_z4_1: +** mov z4\.d, z5\.d +** ret +*/ +TEST_GET (get3_mf8_z4_1, svmfloat8x3_t, svmfloat8_t, + z4_res = svget3_mf8 (z4, 1), + z4_res = svget3 (z4, 1)) + +/* +** get3_mf8_z4_2: +** mov z4\.d, z6\.d +** ret +*/ +TEST_GET (get3_mf8_z4_2, svmfloat8x3_t, svmfloat8_t, + z4_res = svget3_mf8 (z4, 2), + z4_res = svget3 (z4, 2)) + +/* +** get3_mf8_z5_0: +** mov z5\.d, z4\.d +** ret +*/ +TEST_GET (get3_mf8_z5_0, svmfloat8x3_t, svmfloat8_t, + z5_res = svget3_mf8 (z4, 0), + z5_res = svget3 (z4, 0)) + +/* +** get3_mf8_z5_1: +** ret +*/ +TEST_GET (get3_mf8_z5_1, svmfloat8x3_t, svmfloat8_t, + z5_res = svget3_mf8 (z4, 1), + z5_res = svget3 (z4, 1)) + +/* +** get3_mf8_z5_2: +** mov z5\.d, z6\.d +** ret +*/ +TEST_GET (get3_mf8_z5_2, svmfloat8x3_t, svmfloat8_t, + z5_res = svget3_mf8 (z4, 2), + z5_res = svget3 (z4, 2)) + +/* +** get3_mf8_z6_0: +** mov z6\.d, z4\.d +** ret +*/ +TEST_GET (get3_mf8_z6_0, svmfloat8x3_t, svmfloat8_t, + z6_res = svget3_mf8 (z4, 0), + z6_res = svget3 (z4, 0)) + +/* +** get3_mf8_z6_1: +** mov z6\.d, z5\.d +** ret +*/ +TEST_GET (get3_mf8_z6_1, svmfloat8x3_t, svmfloat8_t, + z6_res = svget3_mf8 (z4, 1), + z6_res = svget3 (z4, 1)) + +/* +** get3_mf8_z6_2: +** ret +*/ +TEST_GET (get3_mf8_z6_2, svmfloat8x3_t, svmfloat8_t, + z6_res = svget3_mf8 (z4, 2), + z6_res = svget3 (z4, 2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get4_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get4_mf8.c new file mode 100644 index 00000000000..cdee90adb4a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/get4_mf8.c @@ -0,0 +1,179 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** get4_mf8_z0_0: +** mov z0\.d, z4\.d +** ret +*/ +TEST_GET (get4_mf8_z0_0, svmfloat8x4_t, svmfloat8_t, + z0 = svget4_mf8 (z4, 0), + z0 = svget4 (z4, 0)) + +/* +** get4_mf8_z0_1: +** mov z0\.d, z5\.d +** ret +*/ +TEST_GET (get4_mf8_z0_1, svmfloat8x4_t, svmfloat8_t, + z0 = svget4_mf8 (z4, 1), + z0 = svget4 (z4, 1)) + +/* +** get4_mf8_z0_2: +** mov z0\.d, z6\.d +** ret +*/ +TEST_GET (get4_mf8_z0_2, svmfloat8x4_t, svmfloat8_t, + z0 = svget4_mf8 (z4, 2), + z0 = svget4 (z4, 2)) + +/* +** get4_mf8_z0_3: +** mov z0\.d, z7\.d +** ret +*/ +TEST_GET (get4_mf8_z0_3, svmfloat8x4_t, svmfloat8_t, + z0 = svget4_mf8 (z4, 3), + z0 = svget4 (z4, 3)) + +/* +** get4_mf8_z4_0: +** ret +*/ +TEST_GET (get4_mf8_z4_0, svmfloat8x4_t, svmfloat8_t, + z4_res = svget4_mf8 (z4, 0), + z4_res = svget4 (z4, 0)) + +/* +** get4_mf8_z4_1: +** mov z4\.d, z5\.d +** ret +*/ +TEST_GET (get4_mf8_z4_1, svmfloat8x4_t, svmfloat8_t, + z4_res = svget4_mf8 (z4, 1), + z4_res = svget4 (z4, 1)) + +/* +** get4_mf8_z4_2: +** mov z4\.d, z6\.d +** ret +*/ +TEST_GET (get4_mf8_z4_2, svmfloat8x4_t, svmfloat8_t, + z4_res = svget4_mf8 (z4, 2), + z4_res = svget4 (z4, 2)) + +/* +** get4_mf8_z4_3: +** mov z4\.d, z7\.d +** ret +*/ +TEST_GET (get4_mf8_z4_3, svmfloat8x4_t, svmfloat8_t, + z4_res = svget4_mf8 (z4, 3), + z4_res = svget4 (z4, 3)) + +/* +** get4_mf8_z5_0: +** mov z5\.d, z4\.d +** ret +*/ +TEST_GET (get4_mf8_z5_0, svmfloat8x4_t, svmfloat8_t, + z5_res = svget4_mf8 (z4, 0), + z5_res = svget4 (z4, 0)) + +/* +** get4_mf8_z5_1: +** ret +*/ +TEST_GET (get4_mf8_z5_1, svmfloat8x4_t, svmfloat8_t, + z5_res = svget4_mf8 (z4, 1), + z5_res = svget4 (z4, 1)) + +/* +** get4_mf8_z5_2: +** mov z5\.d, z6\.d +** ret +*/ +TEST_GET (get4_mf8_z5_2, svmfloat8x4_t, svmfloat8_t, + z5_res = svget4_mf8 (z4, 2), + z5_res = svget4 (z4, 2)) + +/* +** get4_mf8_z5_3: +** mov z5\.d, z7\.d +** ret +*/ +TEST_GET (get4_mf8_z5_3, svmfloat8x4_t, svmfloat8_t, + z5_res = svget4_mf8 (z4, 3), + z5_res = svget4 (z4, 3)) + +/* +** get4_mf8_z6_0: +** mov z6\.d, z4\.d +** ret +*/ +TEST_GET (get4_mf8_z6_0, svmfloat8x4_t, svmfloat8_t, + z6_res = svget4_mf8 (z4, 0), + z6_res = svget4 (z4, 0)) + +/* +** get4_mf8_z6_1: +** mov z6\.d, z5\.d +** ret +*/ +TEST_GET (get4_mf8_z6_1, svmfloat8x4_t, svmfloat8_t, + z6_res = svget4_mf8 (z4, 1), + z6_res = svget4 (z4, 1)) + +/* +** get4_mf8_z6_2: +** ret +*/ +TEST_GET (get4_mf8_z6_2, svmfloat8x4_t, svmfloat8_t, + z6_res = svget4_mf8 (z4, 2), + z6_res = svget4 (z4, 2)) + +/* +** get4_mf8_z6_3: +** mov z6\.d, z7\.d +** ret +*/ +TEST_GET (get4_mf8_z6_3, svmfloat8x4_t, svmfloat8_t, + z6_res = svget4_mf8 (z4, 3), + z6_res = svget4 (z4, 3)) + +/* +** get4_mf8_z7_0: +** mov z7\.d, z4\.d +** ret +*/ +TEST_GET (get4_mf8_z7_0, svmfloat8x4_t, svmfloat8_t, + z7_res = svget4_mf8 (z4, 0), + z7_res = svget4 (z4, 0)) + +/* +** get4_mf8_z7_1: +** mov z7\.d, z5\.d +** ret +*/ +TEST_GET (get4_mf8_z7_1, svmfloat8x4_t, svmfloat8_t, + z7_res = svget4_mf8 (z4, 1), + z7_res = svget4 (z4, 1)) + +/* +** get4_mf8_z7_2: +** mov z7\.d, z6\.d +** ret +*/ +TEST_GET (get4_mf8_z7_2, svmfloat8x4_t, svmfloat8_t, + z7_res = svget4_mf8 (z4, 2), + z7_res = svget4 (z4, 2)) + +/* +** get4_mf8_z7_3: +** ret +*/ +TEST_GET (get4_mf8_z7_3, svmfloat8x4_t, svmfloat8_t, + z7_res = svget4_mf8 (z4, 3), + z7_res = svget4 (z4, 3)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/insr_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/insr_mf8.c new file mode 100644 index 00000000000..be328d27749 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/insr_mf8.c @@ -0,0 +1,22 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** insr_w0_mf8_tied1: +** insr z0\.b, w0 +** ret +*/ +TEST_UNIFORM_ZX (insr_w0_mf8_tied1, svmfloat8_t, mfloat8_t, + z0 = svinsr_n_mf8 (z0, x0), + z0 = svinsr (z0, x0)) + +/* +** insr_w0_mf8_untied: +** movprfx z0, z1 +** insr z0\.b, w0 +** ret +*/ +TEST_UNIFORM_ZX (insr_w0_mf8_untied, svmfloat8_t, mfloat8_t, + z0 = svinsr_n_mf8 (z1, x0), + z0 = svinsr (z1, x0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lasta_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lasta_mf8.c new file mode 100644 index 00000000000..a9118d271ab --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lasta_mf8.c @@ -0,0 +1,12 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** lasta_x0_mf8: +** lasta w0, p0, z0\.b +** ret +*/ +TEST_REDUCTION_X (lasta_x0_mf8, mfloat8_t, svmfloat8_t, + x0 = svlasta_mf8 (p0, z0), + x0 = svlasta (p0, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lastb_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lastb_mf8.c new file mode 100644 index 00000000000..c07dc956c6e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/lastb_mf8.c @@ -0,0 +1,12 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** lastb_x0_mf8: +** lastb w0, p0, z0\.b +** ret +*/ +TEST_REDUCTION_X (lastb_x0_mf8, mfloat8_t, svmfloat8_t, + x0 = svlastb_mf8 (p0, z0), + x0 = svlastb (p0, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1_mf8.c new file mode 100644 index 00000000000..7fdc60faeec --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1_mf8.c @@ -0,0 +1,162 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ld1_mf8_base: +** ld1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1_mf8_base, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0), + z0 = svld1 (p0, x0)) + +/* +** ld1_mf8_index: +** ld1b z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld1_mf8_index, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 + x1), + z0 = svld1 (p0, x0 + x1)) + +/* +** ld1_mf8_1: +** ld1b z0\.b, p0/z, \[x0, #1, mul vl\] +** ret +*/ +TEST_LOAD (ld1_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 + svcntb ()), + z0 = svld1 (p0, x0 + svcntb ())) + +/* +** ld1_mf8_7: +** ld1b z0\.b, p0/z, \[x0, #7, mul vl\] +** ret +*/ +TEST_LOAD (ld1_mf8_7, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 + svcntb () * 7), + z0 = svld1 (p0, x0 + svcntb () * 7)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld1_mf8_8: +** incb x0, all, mul #8 +** ld1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 + svcntb () * 8), + z0 = svld1 (p0, x0 + svcntb () * 8)) + +/* +** ld1_mf8_m1: +** ld1b z0\.b, p0/z, \[x0, #-1, mul vl\] +** ret +*/ +TEST_LOAD (ld1_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 - svcntb ()), + z0 = svld1 (p0, x0 - svcntb ())) + +/* +** ld1_mf8_m8: +** ld1b z0\.b, p0/z, \[x0, #-8, mul vl\] +** ret +*/ +TEST_LOAD (ld1_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 - svcntb () * 8), + z0 = svld1 (p0, x0 - svcntb () * 8)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld1_mf8_m9: +** decb x0, all, mul #9 +** ld1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1_mf8_m9, svmfloat8_t, mfloat8_t, + z0 = svld1_mf8 (p0, x0 - svcntb () * 9), + z0 = svld1 (p0, x0 - svcntb () * 9)) + +/* +** ld1_vnum_mf8_0: +** ld1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_0, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, 0), + z0 = svld1_vnum (p0, x0, 0)) + +/* +** ld1_vnum_mf8_1: +** ld1b z0\.b, p0/z, \[x0, #1, mul vl\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, 1), + z0 = svld1_vnum (p0, x0, 1)) + +/* +** ld1_vnum_mf8_7: +** ld1b z0\.b, p0/z, \[x0, #7, mul vl\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_7, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, 7), + z0 = svld1_vnum (p0, x0, 7)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld1_vnum_mf8_8: +** incb x0, all, mul #8 +** ld1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, 8), + z0 = svld1_vnum (p0, x0, 8)) + +/* +** ld1_vnum_mf8_m1: +** ld1b z0\.b, p0/z, \[x0, #-1, mul vl\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, -1), + z0 = svld1_vnum (p0, x0, -1)) + +/* +** ld1_vnum_mf8_m8: +** ld1b z0\.b, p0/z, \[x0, #-8, mul vl\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, -8), + z0 = svld1_vnum (p0, x0, -8)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld1_vnum_mf8_m9: +** decb x0, all, mul #9 +** ld1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_m9, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, -9), + z0 = svld1_vnum (p0, x0, -9)) + +/* +** ld1_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ld1b z0\.b, p0/z, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** ld1b z0\.b, p0/z, \[x0, \3\] +** ) +** ret +*/ +TEST_LOAD (ld1_vnum_mf8_x1, svmfloat8_t, mfloat8_t, + z0 = svld1_vnum_mf8 (p0, x0, x1), + z0 = svld1_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_mf8.c new file mode 100644 index 00000000000..08b7f68f7d7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_mf8.c @@ -0,0 +1,121 @@ +/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ +/* { dg-additional-options "-march=armv8.6-a+f64mm" } */ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_mf8_base: +** ld1rob z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_base, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_mf8_index: +** ld1rob z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_index, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_mf8_1: +** add (x[0-9]+), x0, #?1 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_mf8_16: +** add (x[0-9]+), x0, #?16 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_16, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 + 16), + z0 = svld1ro (p0, x0 + 16)) + +/* +** ld1ro_mf8_256: +** add (x[0-9]+), x0, #?256 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_256, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 + 256), + z0 = svld1ro (p0, x0 + 256)) + +/* +** ld1ro_mf8_m1: +** sub (x[0-9]+), x0, #?1 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_mf8_m16: +** sub (x[0-9]+), x0, #?16 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_m16, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 - 16), + z0 = svld1ro (p0, x0 - 16)) + +/* +** ld1ro_mf8_m288: +** sub (x[0-9]+), x0, #?288 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_m288, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 - 288), + z0 = svld1ro (p0, x0 - 288)) + +/* +** ld1ro_mf8_32: +** ld1rob z0\.b, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_32, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 + 32), + z0 = svld1ro (p0, x0 + 32)) + +/* +** ld1ro_mf8_224: +** ld1rob z0\.b, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_224, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 + 224), + z0 = svld1ro (p0, x0 + 224)) + +/* +** ld1ro_mf8_m32: +** ld1rob z0\.b, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_m32, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 - 32), + z0 = svld1ro (p0, x0 - 32)) + +/* +** ld1ro_mf8_m256: +** ld1rob z0\.b, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_mf8_m256, svmfloat8_t, mfloat8_t, + z0 = svld1ro_mf8 (p0, x0 - 256), + z0 = svld1ro (p0, x0 - 256)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1rq_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1rq_mf8.c new file mode 100644 index 00000000000..b3a3f4f09bc --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1rq_mf8.c @@ -0,0 +1,137 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ld1rq_mf8_base: +** ld1rqb z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_base, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0), + z0 = svld1rq (p0, x0)) + +/* +** ld1rq_mf8_index: +** ld1rqb z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_index, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + x1), + z0 = svld1rq (p0, x0 + x1)) + +/* +** ld1rq_mf8_1: +** add (x[0-9]+), x0, #?1 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + 1), + z0 = svld1rq (p0, x0 + 1)) + +/* +** ld1rq_mf8_8: +** add (x[0-9]+), x0, #?8 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + 8), + z0 = svld1rq (p0, x0 + 8)) + +/* +** ld1rq_mf8_15: +** add (x[0-9]+), x0, #?15 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_15, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + 15), + z0 = svld1rq (p0, x0 + 15)) + +/* +** ld1rq_mf8_16: +** ld1rqb z0\.b, p0/z, \[x0, #?16\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_16, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + 16), + z0 = svld1rq (p0, x0 + 16)) + +/* +** ld1rq_mf8_112: +** ld1rqb z0\.b, p0/z, \[x0, #?112\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_112, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + 112), + z0 = svld1rq (p0, x0 + 112)) + +/* +** ld1rq_mf8_128: +** add (x[0-9]+), x0, #?128 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_128, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 + 128), + z0 = svld1rq (p0, x0 + 128)) + +/* +** ld1rq_mf8_m1: +** sub (x[0-9]+), x0, #?1 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 - 1), + z0 = svld1rq (p0, x0 - 1)) + +/* +** ld1rq_mf8_m8: +** sub (x[0-9]+), x0, #?8 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 - 8), + z0 = svld1rq (p0, x0 - 8)) + +/* +** ld1rq_mf8_m15: +** sub (x[0-9]+), x0, #?15 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_m15, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 - 15), + z0 = svld1rq (p0, x0 - 15)) + +/* +** ld1rq_mf8_m16: +** ld1rqb z0\.b, p0/z, \[x0, #?-16\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_m16, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 - 16), + z0 = svld1rq (p0, x0 - 16)) + +/* +** ld1rq_mf8_m128: +** ld1rqb z0\.b, p0/z, \[x0, #?-128\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_m128, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 - 128), + z0 = svld1rq (p0, x0 - 128)) + +/* +** ld1rq_mf8_m144: +** sub (x[0-9]+), x0, #?144 +** ld1rqb z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1rq_mf8_m144, svmfloat8_t, mfloat8_t, + z0 = svld1rq_mf8 (p0, x0 - 144), + z0 = svld1rq (p0, x0 - 144)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld2_mf8.c new file mode 100644 index 00000000000..b533bf8169b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld2_mf8.c @@ -0,0 +1,204 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ld2_mf8_base: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_mf8_base, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0), + z0 = svld2 (p0, x0)) + +/* +** ld2_mf8_index: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld2_mf8_index, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 + x1), + z0 = svld2 (p0, x0 + x1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld2_mf8_1: +** incb x0 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_mf8_1, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 + svcntb ()), + z0 = svld2 (p0, x0 + svcntb ())) + +/* +** ld2_mf8_2: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #2, mul vl\] +** ret +*/ +TEST_LOAD (ld2_mf8_2, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 + svcntb () * 2), + z0 = svld2 (p0, x0 + svcntb () * 2)) + +/* +** ld2_mf8_14: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #14, mul vl\] +** ret +*/ +TEST_LOAD (ld2_mf8_14, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 + svcntb () * 14), + z0 = svld2 (p0, x0 + svcntb () * 14)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld2_mf8_16: +** incb x0, all, mul #16 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_mf8_16, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 + svcntb () * 16), + z0 = svld2 (p0, x0 + svcntb () * 16)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld2_mf8_m1: +** decb x0 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_mf8_m1, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 - svcntb ()), + z0 = svld2 (p0, x0 - svcntb ())) + +/* +** ld2_mf8_m2: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #-2, mul vl\] +** ret +*/ +TEST_LOAD (ld2_mf8_m2, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 - svcntb () * 2), + z0 = svld2 (p0, x0 - svcntb () * 2)) + +/* +** ld2_mf8_m16: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #-16, mul vl\] +** ret +*/ +TEST_LOAD (ld2_mf8_m16, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 - svcntb () * 16), + z0 = svld2 (p0, x0 - svcntb () * 16)) + +/* +** ld2_mf8_m18: +** addvl (x[0-9]+), x0, #-18 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld2_mf8_m18, svmfloat8x2_t, mfloat8_t, + z0 = svld2_mf8 (p0, x0 - svcntb () * 18), + z0 = svld2 (p0, x0 - svcntb () * 18)) + +/* +** ld2_vnum_mf8_0: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_0, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, 0), + z0 = svld2_vnum (p0, x0, 0)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld2_vnum_mf8_1: +** incb x0 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_1, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, 1), + z0 = svld2_vnum (p0, x0, 1)) + +/* +** ld2_vnum_mf8_2: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #2, mul vl\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_2, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, 2), + z0 = svld2_vnum (p0, x0, 2)) + +/* +** ld2_vnum_mf8_14: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #14, mul vl\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_14, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, 14), + z0 = svld2_vnum (p0, x0, 14)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld2_vnum_mf8_16: +** incb x0, all, mul #16 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_16, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, 16), + z0 = svld2_vnum (p0, x0, 16)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld2_vnum_mf8_m1: +** decb x0 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_m1, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, -1), + z0 = svld2_vnum (p0, x0, -1)) + +/* +** ld2_vnum_mf8_m2: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #-2, mul vl\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_m2, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, -2), + z0 = svld2_vnum (p0, x0, -2)) + +/* +** ld2_vnum_mf8_m16: +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, #-16, mul vl\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_m16, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, -16), + z0 = svld2_vnum (p0, x0, -16)) + +/* +** ld2_vnum_mf8_m18: +** addvl (x[0-9]+), x0, #-18 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_m18, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, -18), + z0 = svld2_vnum (p0, x0, -18)) + +/* +** ld2_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** ld2b {z0\.b(?: - |, )z1\.b}, p0/z, \[x0, \3\] +** ) +** ret +*/ +TEST_LOAD (ld2_vnum_mf8_x1, svmfloat8x2_t, mfloat8_t, + z0 = svld2_vnum_mf8 (p0, x0, x1), + z0 = svld2_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld3_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld3_mf8.c new file mode 100644 index 00000000000..f43d8050e7d --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld3_mf8.c @@ -0,0 +1,246 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ld3_mf8_base: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_mf8_base, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0), + z0 = svld3 (p0, x0)) + +/* +** ld3_mf8_index: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld3_mf8_index, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 + x1), + z0 = svld3 (p0, x0 + x1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_mf8_1: +** incb x0 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_mf8_1, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 + svcntb ()), + z0 = svld3 (p0, x0 + svcntb ())) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_mf8_2: +** incb x0, all, mul #2 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_mf8_2, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 + svcntb () * 2), + z0 = svld3 (p0, x0 + svcntb () * 2)) + +/* +** ld3_mf8_3: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #3, mul vl\] +** ret +*/ +TEST_LOAD (ld3_mf8_3, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 + svcntb () * 3), + z0 = svld3 (p0, x0 + svcntb () * 3)) + +/* +** ld3_mf8_21: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #21, mul vl\] +** ret +*/ +TEST_LOAD (ld3_mf8_21, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 + svcntb () * 21), + z0 = svld3 (p0, x0 + svcntb () * 21)) + +/* +** ld3_mf8_24: +** addvl (x[0-9]+), x0, #24 +** ld3b {z0\.b - z2\.b}, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld3_mf8_24, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 + svcntb () * 24), + z0 = svld3 (p0, x0 + svcntb () * 24)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_mf8_m1: +** decb x0 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_mf8_m1, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 - svcntb ()), + z0 = svld3 (p0, x0 - svcntb ())) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_mf8_m2: +** decb x0, all, mul #2 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_mf8_m2, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 - svcntb () * 2), + z0 = svld3 (p0, x0 - svcntb () * 2)) + +/* +** ld3_mf8_m3: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #-3, mul vl\] +** ret +*/ +TEST_LOAD (ld3_mf8_m3, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 - svcntb () * 3), + z0 = svld3 (p0, x0 - svcntb () * 3)) + +/* +** ld3_mf8_m24: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #-24, mul vl\] +** ret +*/ +TEST_LOAD (ld3_mf8_m24, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 - svcntb () * 24), + z0 = svld3 (p0, x0 - svcntb () * 24)) + +/* +** ld3_mf8_m27: +** addvl (x[0-9]+), x0, #-27 +** ld3b {z0\.b - z2\.b}, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld3_mf8_m27, svmfloat8x3_t, mfloat8_t, + z0 = svld3_mf8 (p0, x0 - svcntb () * 27), + z0 = svld3 (p0, x0 - svcntb () * 27)) + +/* +** ld3_vnum_mf8_0: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_0, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, 0), + z0 = svld3_vnum (p0, x0, 0)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_vnum_mf8_1: +** incb x0 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_1, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, 1), + z0 = svld3_vnum (p0, x0, 1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_vnum_mf8_2: +** incb x0, all, mul #2 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_2, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, 2), + z0 = svld3_vnum (p0, x0, 2)) + +/* +** ld3_vnum_mf8_3: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #3, mul vl\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_3, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, 3), + z0 = svld3_vnum (p0, x0, 3)) + +/* +** ld3_vnum_mf8_21: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #21, mul vl\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_21, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, 21), + z0 = svld3_vnum (p0, x0, 21)) + +/* +** ld3_vnum_mf8_24: +** addvl (x[0-9]+), x0, #24 +** ld3b {z0\.b - z2\.b}, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_24, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, 24), + z0 = svld3_vnum (p0, x0, 24)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_vnum_mf8_m1: +** decb x0 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_m1, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, -1), + z0 = svld3_vnum (p0, x0, -1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld3_vnum_mf8_m2: +** decb x0, all, mul #2 +** ld3b {z0\.b - z2\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_m2, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, -2), + z0 = svld3_vnum (p0, x0, -2)) + +/* +** ld3_vnum_mf8_m3: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #-3, mul vl\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_m3, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, -3), + z0 = svld3_vnum (p0, x0, -3)) + +/* +** ld3_vnum_mf8_m24: +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, #-24, mul vl\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_m24, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, -24), + z0 = svld3_vnum (p0, x0, -24)) + +/* +** ld3_vnum_mf8_m27: +** addvl (x[0-9]+), x0, #-27 +** ld3b {z0\.b - z2\.b}, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_m27, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, -27), + z0 = svld3_vnum (p0, x0, -27)) + +/* +** ld3_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ld3b {z0\.b - z2\.b}, p0/z, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** ld3b {z0\.b - z2\.b}, p0/z, \[x0, \3\] +** ) +** ret +*/ +TEST_LOAD (ld3_vnum_mf8_x1, svmfloat8x3_t, mfloat8_t, + z0 = svld3_vnum_mf8 (p0, x0, x1), + z0 = svld3_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld4_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld4_mf8.c new file mode 100644 index 00000000000..e4e9dc016c6 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld4_mf8.c @@ -0,0 +1,290 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ld4_mf8_base: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_base, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0), + z0 = svld4 (p0, x0)) + +/* +** ld4_mf8_index: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld4_mf8_index, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + x1), + z0 = svld4 (p0, x0 + x1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_mf8_1: +** incb x0 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_1, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + svcntb ()), + z0 = svld4 (p0, x0 + svcntb ())) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_mf8_2: +** incb x0, all, mul #2 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_2, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + svcntb () * 2), + z0 = svld4 (p0, x0 + svcntb () * 2)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_mf8_3: +** incb x0, all, mul #3 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_3, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + svcntb () * 3), + z0 = svld4 (p0, x0 + svcntb () * 3)) + +/* +** ld4_mf8_4: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #4, mul vl\] +** ret +*/ +TEST_LOAD (ld4_mf8_4, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + svcntb () * 4), + z0 = svld4 (p0, x0 + svcntb () * 4)) + +/* +** ld4_mf8_28: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #28, mul vl\] +** ret +*/ +TEST_LOAD (ld4_mf8_28, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + svcntb () * 28), + z0 = svld4 (p0, x0 + svcntb () * 28)) + +/* +** ld4_mf8_32: +** [^{]* +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, x[0-9]+\] +** ret +*/ +TEST_LOAD (ld4_mf8_32, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 + svcntb () * 32), + z0 = svld4 (p0, x0 + svcntb () * 32)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_mf8_m1: +** decb x0 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_m1, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 - svcntb ()), + z0 = svld4 (p0, x0 - svcntb ())) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_mf8_m2: +** decb x0, all, mul #2 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_m2, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 - svcntb () * 2), + z0 = svld4 (p0, x0 - svcntb () * 2)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_mf8_m3: +** decb x0, all, mul #3 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_mf8_m3, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 - svcntb () * 3), + z0 = svld4 (p0, x0 - svcntb () * 3)) + +/* +** ld4_mf8_m4: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #-4, mul vl\] +** ret +*/ +TEST_LOAD (ld4_mf8_m4, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 - svcntb () * 4), + z0 = svld4 (p0, x0 - svcntb () * 4)) + +/* +** ld4_mf8_m32: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #-32, mul vl\] +** ret +*/ +TEST_LOAD (ld4_mf8_m32, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 - svcntb () * 32), + z0 = svld4 (p0, x0 - svcntb () * 32)) + +/* +** ld4_mf8_m36: +** [^{]* +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, x[0-9]+\] +** ret +*/ +TEST_LOAD (ld4_mf8_m36, svmfloat8x4_t, mfloat8_t, + z0 = svld4_mf8 (p0, x0 - svcntb () * 36), + z0 = svld4 (p0, x0 - svcntb () * 36)) + +/* +** ld4_vnum_mf8_0: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_0, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 0), + z0 = svld4_vnum (p0, x0, 0)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_vnum_mf8_1: +** incb x0 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_1, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 1), + z0 = svld4_vnum (p0, x0, 1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_vnum_mf8_2: +** incb x0, all, mul #2 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_2, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 2), + z0 = svld4_vnum (p0, x0, 2)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_vnum_mf8_3: +** incb x0, all, mul #3 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_3, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 3), + z0 = svld4_vnum (p0, x0, 3)) + +/* +** ld4_vnum_mf8_4: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #4, mul vl\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_4, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 4), + z0 = svld4_vnum (p0, x0, 4)) + +/* +** ld4_vnum_mf8_28: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #28, mul vl\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_28, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 28), + z0 = svld4_vnum (p0, x0, 28)) + +/* +** ld4_vnum_mf8_32: +** [^{]* +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, x[0-9]+\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_32, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, 32), + z0 = svld4_vnum (p0, x0, 32)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_vnum_mf8_m1: +** decb x0 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_m1, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, -1), + z0 = svld4_vnum (p0, x0, -1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_vnum_mf8_m2: +** decb x0, all, mul #2 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_m2, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, -2), + z0 = svld4_vnum (p0, x0, -2)) + +/* Moving the constant into a register would also be OK. */ +/* +** ld4_vnum_mf8_m3: +** decb x0, all, mul #3 +** ld4b {z0\.b - z3\.b}, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_m3, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, -3), + z0 = svld4_vnum (p0, x0, -3)) + +/* +** ld4_vnum_mf8_m4: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #-4, mul vl\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_m4, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, -4), + z0 = svld4_vnum (p0, x0, -4)) + +/* +** ld4_vnum_mf8_m32: +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, #-32, mul vl\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_m32, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, -32), + z0 = svld4_vnum (p0, x0, -32)) + +/* +** ld4_vnum_mf8_m36: +** [^{]* +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, x[0-9]+\] +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_m36, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, -36), + z0 = svld4_vnum (p0, x0, -36)) + +/* +** ld4_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ld4b {z0\.b - z3\.b}, p0/z, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** ld4b {z0\.b - z3\.b}, p0/z, \[x0, \3\] +** ) +** ret +*/ +TEST_LOAD (ld4_vnum_mf8_x1, svmfloat8x4_t, mfloat8_t, + z0 = svld4_vnum_mf8 (p0, x0, x1), + z0 = svld4_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldff1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldff1_mf8.c new file mode 100644 index 00000000000..45cdf4168fb --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldff1_mf8.c @@ -0,0 +1,91 @@ +/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ldff1_mf8_base: +** ldff1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldff1_mf8_base, svmfloat8_t, mfloat8_t, + z0 = svldff1_mf8 (p0, x0), + z0 = svldff1 (p0, x0)) + +/* +** ldff1_mf8_index: +** ldff1b z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ldff1_mf8_index, svmfloat8_t, mfloat8_t, + z0 = svldff1_mf8 (p0, x0 + x1), + z0 = svldff1 (p0, x0 + x1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldff1_mf8_1: +** incb x0 +** ldff1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldff1_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svldff1_mf8 (p0, x0 + svcntb ()), + z0 = svldff1 (p0, x0 + svcntb ())) + +/* Moving the constant into a register would also be OK. */ +/* +** ldff1_mf8_m1: +** decb x0 +** ldff1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldff1_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svldff1_mf8 (p0, x0 - svcntb ()), + z0 = svldff1 (p0, x0 - svcntb ())) + +/* +** ldff1_vnum_mf8_0: +** ldff1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldff1_vnum_mf8_0, svmfloat8_t, mfloat8_t, + z0 = svldff1_vnum_mf8 (p0, x0, 0), + z0 = svldff1_vnum (p0, x0, 0)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldff1_vnum_mf8_1: +** incb x0 +** ldff1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldff1_vnum_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svldff1_vnum_mf8 (p0, x0, 1), + z0 = svldff1_vnum (p0, x0, 1)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldff1_vnum_mf8_m1: +** decb x0 +** ldff1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldff1_vnum_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svldff1_vnum_mf8 (p0, x0, -1), + z0 = svldff1_vnum (p0, x0, -1)) + +/* +** ldff1_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ldff1b z0\.b, p0/z, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** ldff1b z0\.b, p0/z, \[x0, \3\] +** ) +** ret +*/ +TEST_LOAD (ldff1_vnum_mf8_x1, svmfloat8_t, mfloat8_t, + z0 = svldff1_vnum_mf8 (p0, x0, x1), + z0 = svldff1_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnf1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnf1_mf8.c new file mode 100644 index 00000000000..a5054e9047e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnf1_mf8.c @@ -0,0 +1,155 @@ +/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ldnf1_mf8_base: +** ldnf1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_base, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0), + z0 = svldnf1 (p0, x0)) + +/* +** ldnf1_mf8_index: +** add (x[0-9]+), x0, x1 +** ldnf1b z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_index, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 + x1), + z0 = svldnf1 (p0, x0 + x1)) + +/* +** ldnf1_mf8_1: +** ldnf1b z0\.b, p0/z, \[x0, #1, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 + svcntb ()), + z0 = svldnf1 (p0, x0 + svcntb ())) + +/* +** ldnf1_mf8_7: +** ldnf1b z0\.b, p0/z, \[x0, #7, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_7, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 + svcntb () * 7), + z0 = svldnf1 (p0, x0 + svcntb () * 7)) + +/* +** ldnf1_mf8_8: +** incb x0, all, mul #8 +** ldnf1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 + svcntb () * 8), + z0 = svldnf1 (p0, x0 + svcntb () * 8)) + +/* +** ldnf1_mf8_m1: +** ldnf1b z0\.b, p0/z, \[x0, #-1, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 - svcntb ()), + z0 = svldnf1 (p0, x0 - svcntb ())) + +/* +** ldnf1_mf8_m8: +** ldnf1b z0\.b, p0/z, \[x0, #-8, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 - svcntb () * 8), + z0 = svldnf1 (p0, x0 - svcntb () * 8)) + +/* +** ldnf1_mf8_m9: +** decb x0, all, mul #9 +** ldnf1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnf1_mf8_m9, svmfloat8_t, mfloat8_t, + z0 = svldnf1_mf8 (p0, x0 - svcntb () * 9), + z0 = svldnf1 (p0, x0 - svcntb () * 9)) + +/* +** ldnf1_vnum_mf8_0: +** ldnf1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_0, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, 0), + z0 = svldnf1_vnum (p0, x0, 0)) + +/* +** ldnf1_vnum_mf8_1: +** ldnf1b z0\.b, p0/z, \[x0, #1, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, 1), + z0 = svldnf1_vnum (p0, x0, 1)) + +/* +** ldnf1_vnum_mf8_7: +** ldnf1b z0\.b, p0/z, \[x0, #7, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_7, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, 7), + z0 = svldnf1_vnum (p0, x0, 7)) + +/* +** ldnf1_vnum_mf8_8: +** incb x0, all, mul #8 +** ldnf1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, 8), + z0 = svldnf1_vnum (p0, x0, 8)) + +/* +** ldnf1_vnum_mf8_m1: +** ldnf1b z0\.b, p0/z, \[x0, #-1, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, -1), + z0 = svldnf1_vnum (p0, x0, -1)) + +/* +** ldnf1_vnum_mf8_m8: +** ldnf1b z0\.b, p0/z, \[x0, #-8, mul vl\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, -8), + z0 = svldnf1_vnum (p0, x0, -8)) + +/* +** ldnf1_vnum_mf8_m9: +** decb x0, all, mul #9 +** ldnf1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_m9, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, -9), + z0 = svldnf1_vnum (p0, x0, -9)) + +/* +** ldnf1_vnum_mf8_x1: +** cntb (x[0-9]+) +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ldnf1b z0\.b, p0/z, \[\2\] +** ret +*/ +TEST_LOAD (ldnf1_vnum_mf8_x1, svmfloat8_t, mfloat8_t, + z0 = svldnf1_vnum_mf8 (p0, x0, x1), + z0 = svldnf1_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnt1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnt1_mf8.c new file mode 100644 index 00000000000..dbfd9ae83d4 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ldnt1_mf8.c @@ -0,0 +1,162 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** ldnt1_mf8_base: +** ldnt1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_base, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0), + z0 = svldnt1 (p0, x0)) + +/* +** ldnt1_mf8_index: +** ldnt1b z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_index, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 + x1), + z0 = svldnt1 (p0, x0 + x1)) + +/* +** ldnt1_mf8_1: +** ldnt1b z0\.b, p0/z, \[x0, #1, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 + svcntb ()), + z0 = svldnt1 (p0, x0 + svcntb ())) + +/* +** ldnt1_mf8_7: +** ldnt1b z0\.b, p0/z, \[x0, #7, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_7, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 + svcntb () * 7), + z0 = svldnt1 (p0, x0 + svcntb () * 7)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldnt1_mf8_8: +** incb x0, all, mul #8 +** ldnt1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 + svcntb () * 8), + z0 = svldnt1 (p0, x0 + svcntb () * 8)) + +/* +** ldnt1_mf8_m1: +** ldnt1b z0\.b, p0/z, \[x0, #-1, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 - svcntb ()), + z0 = svldnt1 (p0, x0 - svcntb ())) + +/* +** ldnt1_mf8_m8: +** ldnt1b z0\.b, p0/z, \[x0, #-8, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 - svcntb () * 8), + z0 = svldnt1 (p0, x0 - svcntb () * 8)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldnt1_mf8_m9: +** decb x0, all, mul #9 +** ldnt1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnt1_mf8_m9, svmfloat8_t, mfloat8_t, + z0 = svldnt1_mf8 (p0, x0 - svcntb () * 9), + z0 = svldnt1 (p0, x0 - svcntb () * 9)) + +/* +** ldnt1_vnum_mf8_0: +** ldnt1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_0, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, 0), + z0 = svldnt1_vnum (p0, x0, 0)) + +/* +** ldnt1_vnum_mf8_1: +** ldnt1b z0\.b, p0/z, \[x0, #1, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_1, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, 1), + z0 = svldnt1_vnum (p0, x0, 1)) + +/* +** ldnt1_vnum_mf8_7: +** ldnt1b z0\.b, p0/z, \[x0, #7, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_7, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, 7), + z0 = svldnt1_vnum (p0, x0, 7)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldnt1_vnum_mf8_8: +** incb x0, all, mul #8 +** ldnt1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_8, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, 8), + z0 = svldnt1_vnum (p0, x0, 8)) + +/* +** ldnt1_vnum_mf8_m1: +** ldnt1b z0\.b, p0/z, \[x0, #-1, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_m1, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, -1), + z0 = svldnt1_vnum (p0, x0, -1)) + +/* +** ldnt1_vnum_mf8_m8: +** ldnt1b z0\.b, p0/z, \[x0, #-8, mul vl\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_m8, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, -8), + z0 = svldnt1_vnum (p0, x0, -8)) + +/* Moving the constant into a register would also be OK. */ +/* +** ldnt1_vnum_mf8_m9: +** decb x0, all, mul #9 +** ldnt1b z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_m9, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, -9), + z0 = svldnt1_vnum (p0, x0, -9)) + +/* +** ldnt1_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** ldnt1b z0\.b, p0/z, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** ldnt1b z0\.b, p0/z, \[x0, \3\] +** ) +** ret +*/ +TEST_LOAD (ldnt1_vnum_mf8_x1, svmfloat8_t, mfloat8_t, + z0 = svldnt1_vnum_mf8 (p0, x0, x1), + z0 = svldnt1_vnum (p0, x0, x1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/len_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/len_mf8.c new file mode 100644 index 00000000000..c8730c6886a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/len_mf8.c @@ -0,0 +1,12 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** len_x0_mf8: +** cntb x0 +** ret +*/ +TEST_REDUCTION_X (len_x0_mf8, uint64_t, svmfloat8_t, + x0 = svlen_mf8 (z0), + x0 = svlen (z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_bf16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_bf16.c index dd0daf2eff0..e745b2500dc 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_bf16.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_bf16.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_bf16_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_bf16_mf8_tied1, svbfloat16_t, svmfloat8_t, + z0_res = svreinterpret_bf16_mf8 (z0), + z0_res = svreinterpret_bf16 (z0)) + +/* +** reinterpret_bf16_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_bf16_mf8_untied, svbfloat16_t, svmfloat8_t, + z0 = svreinterpret_bf16_mf8 (z4), + z0 = svreinterpret_bf16 (z4)) + /* ** reinterpret_bf16_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f16.c index 9b6f8227d2a..75dcf300b75 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f16.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f16.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_f16_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_f16_mf8_tied1, svfloat16_t, svmfloat8_t, + z0_res = svreinterpret_f16_mf8 (z0), + z0_res = svreinterpret_f16 (z0)) + +/* +** reinterpret_f16_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_f16_mf8_untied, svfloat16_t, svmfloat8_t, + z0 = svreinterpret_f16_mf8 (z4), + z0 = svreinterpret_f16 (z4)) + /* ** reinterpret_f16_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f32.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f32.c index ce981fce9d8..4bf7860b9dc 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f32.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f32.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_f32_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_f32_mf8_tied1, svfloat32_t, svmfloat8_t, + z0_res = svreinterpret_f32_mf8 (z0), + z0_res = svreinterpret_f32 (z0)) + +/* +** reinterpret_f32_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_f32_mf8_untied, svfloat32_t, svmfloat8_t, + z0 = svreinterpret_f32_mf8 (z4), + z0 = svreinterpret_f32 (z4)) + /* ** reinterpret_f32_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f64.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f64.c index 4f51824ab7e..f4012fa54aa 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f64.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_f64.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_f64_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_f64_mf8_tied1, svfloat64_t, svmfloat8_t, + z0_res = svreinterpret_f64_mf8 (z0), + z0_res = svreinterpret_f64 (z0)) + +/* +** reinterpret_f64_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_f64_mf8_untied, svfloat64_t, svmfloat8_t, + z0 = svreinterpret_f64_mf8 (z4), + z0 = svreinterpret_f64 (z4)) + /* ** reinterpret_f64_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_mf8.c new file mode 100644 index 00000000000..dcd4978dc92 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_mf8.c @@ -0,0 +1,297 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** reinterpret_mf8_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_mf8_tied1, svmfloat8_t, svmfloat8_t, + z0_res = svreinterpret_mf8_mf8 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_mf8_untied, svmfloat8_t, svmfloat8_t, + z0 = svreinterpret_mf8_mf8 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_bf16_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_bf16_tied1, svmfloat8_t, svbfloat16_t, + z0_res = svreinterpret_mf8_bf16 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_bf16_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_bf16_untied, svmfloat8_t, svbfloat16_t, + z0 = svreinterpret_mf8_bf16 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_f16_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_f16_tied1, svmfloat8_t, svfloat16_t, + z0_res = svreinterpret_mf8_f16 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_f16_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_f16_untied, svmfloat8_t, svfloat16_t, + z0 = svreinterpret_mf8_f16 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_f32_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_f32_tied1, svmfloat8_t, svfloat32_t, + z0_res = svreinterpret_mf8_f32 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_f32_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_f32_untied, svmfloat8_t, svfloat32_t, + z0 = svreinterpret_mf8_f32 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_f64_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_f64_tied1, svmfloat8_t, svfloat64_t, + z0_res = svreinterpret_mf8_f64 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_f64_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_f64_untied, svmfloat8_t, svfloat64_t, + z0 = svreinterpret_mf8_f64 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_s8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_s8_tied1, svmfloat8_t, svint8_t, + z0_res = svreinterpret_mf8_s8 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_s8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_s8_untied, svmfloat8_t, svint8_t, + z0 = svreinterpret_mf8_s8 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_s16_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_s16_tied1, svmfloat8_t, svint16_t, + z0_res = svreinterpret_mf8_s16 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_s16_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_s16_untied, svmfloat8_t, svint16_t, + z0 = svreinterpret_mf8_s16 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_s32_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_s32_tied1, svmfloat8_t, svint32_t, + z0_res = svreinterpret_mf8_s32 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_s32_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_s32_untied, svmfloat8_t, svint32_t, + z0 = svreinterpret_mf8_s32 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_s64_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_s64_tied1, svmfloat8_t, svint64_t, + z0_res = svreinterpret_mf8_s64 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_s64_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_s64_untied, svmfloat8_t, svint64_t, + z0 = svreinterpret_mf8_s64 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_u8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_u8_tied1, svmfloat8_t, svuint8_t, + z0_res = svreinterpret_mf8_u8 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_u8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_u8_untied, svmfloat8_t, svuint8_t, + z0 = svreinterpret_mf8_u8 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_u16_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_u16_tied1, svmfloat8_t, svuint16_t, + z0_res = svreinterpret_mf8_u16 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_u16_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_u16_untied, svmfloat8_t, svuint16_t, + z0 = svreinterpret_mf8_u16 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_u32_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_u32_tied1, svmfloat8_t, svuint32_t, + z0_res = svreinterpret_mf8_u32 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_u32_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_u32_untied, svmfloat8_t, svuint32_t, + z0 = svreinterpret_mf8_u32 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_u64_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_u64_tied1, svmfloat8_t, svuint64_t, + z0_res = svreinterpret_mf8_u64 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_u64_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_mf8_u64_untied, svmfloat8_t, svuint64_t, + z0 = svreinterpret_mf8_u64 (z4), + z0 = svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_bf16_x2_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_bf16_x2_tied1, svmfloat8x2_t, svbfloat16x2_t, + z0_res = svreinterpret_mf8_bf16_x2 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_f32_x2_untied: +** ( +** mov z0\.d, z4\.d +** mov z1\.d, z5\.d +** | +** mov z0\.d, z4\.d +** mov z1\.d, z5\.d +** ) +** ret +*/ +TEST_DUAL_XN (reinterpret_mf8_f32_x2_untied, svmfloat8x2_t, svfloat32x2_t, z0, + svreinterpret_mf8_f32_x2 (z4), + svreinterpret_mf8 (z4)) + +/* +** reinterpret_mf8_mf8_x3_untied: +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_mf8_mf8_x3_untied, svmfloat8x3_t, svmfloat8x3_t, z18, + svreinterpret_mf8_mf8_x3 (z23), + svreinterpret_mf8 (z23)) + +/* +** reinterpret_mf8_s64_x3_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_s64_x3_tied1, svmfloat8x3_t, svint64x3_t, + z0_res = svreinterpret_mf8_s64_x3 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_u8_x3_untied: +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_mf8_u8_x3_untied, svmfloat8x3_t, svuint8x3_t, z18, + svreinterpret_mf8_u8_x3 (z23), + svreinterpret_mf8 (z23)) + +/* +** reinterpret_mf8_u32_x4_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_mf8_u32_x4_tied1, svmfloat8x4_t, svuint32x4_t, + z0_res = svreinterpret_mf8_u32_x4 (z0), + z0_res = svreinterpret_mf8 (z0)) + +/* +** reinterpret_mf8_f64_x4_untied: +** mov (z28|z29|z30|z31)\.d, z[4-7]\.d +** mov (z28|z29|z30|z31)\.d, z[4-7]\.d +** mov (z28|z29|z30|z31)\.d, z[4-7]\.d +** mov (z28|z29|z30|z31)\.d, z[4-7]\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_mf8_f64_x4_untied, svmfloat8x4_t, svfloat64x4_t, z28, + svreinterpret_mf8_f64_x4 (z4), + svreinterpret_mf8 (z4)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s16.c index 7e15f3e9bd3..17558aa718b 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s16.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s16.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_s16_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_s16_mf8_tied1, svint16_t, svmfloat8_t, + z0_res = svreinterpret_s16_mf8 (z0), + z0_res = svreinterpret_s16 (z0)) + +/* +** reinterpret_s16_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_s16_mf8_untied, svint16_t, svmfloat8_t, + z0 = svreinterpret_s16_mf8 (z4), + z0 = svreinterpret_s16 (z4)) + /* ** reinterpret_s16_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s32.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s32.c index 60da8aef333..c78e90e2776 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s32.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s32.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_s32_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_s32_mf8_tied1, svint32_t, svmfloat8_t, + z0_res = svreinterpret_s32_mf8 (z0), + z0_res = svreinterpret_s32 (z0)) + +/* +** reinterpret_s32_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_s32_mf8_untied, svint32_t, svmfloat8_t, + z0 = svreinterpret_s32_mf8 (z4), + z0 = svreinterpret_s32 (z4)) + /* ** reinterpret_s32_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s64.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s64.c index d705c60dfd7..9370c4b5789 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s64.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s64.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_s64_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_s64_mf8_tied1, svint64_t, svmfloat8_t, + z0_res = svreinterpret_s64_mf8 (z0), + z0_res = svreinterpret_s64 (z0)) + +/* +** reinterpret_s64_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_s64_mf8_untied, svint64_t, svmfloat8_t, + z0 = svreinterpret_s64_mf8 (z4), + z0 = svreinterpret_s64 (z4)) + /* ** reinterpret_s64_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s8.c index ab90a54d746..46a5cd17f80 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s8.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_s8.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_s8_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_s8_mf8_tied1, svint8_t, svmfloat8_t, + z0_res = svreinterpret_s8_mf8 (z0), + z0_res = svreinterpret_s8 (z0)) + +/* +** reinterpret_s8_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_s8_mf8_untied, svint8_t, svmfloat8_t, + z0 = svreinterpret_s8_mf8 (z4), + z0 = svreinterpret_s8 (z4)) + /* ** reinterpret_s8_bf16_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u16.c index fcfc0eb9da5..d91b305fab7 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u16.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u16.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_u16_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_u16_mf8_tied1, svuint16_t, svmfloat8_t, + z0_res = svreinterpret_u16_mf8 (z0), + z0_res = svreinterpret_u16 (z0)) + +/* +** reinterpret_u16_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_u16_mf8_untied, svuint16_t, svmfloat8_t, + z0 = svreinterpret_u16_mf8 (z4), + z0 = svreinterpret_u16 (z4)) + /* ** reinterpret_u16_bf16_tied1: ** ret @@ -229,6 +246,17 @@ TEST_DUAL_XN (reinterpret_u16_f32_x2_untied, svuint16x2_t, svfloat32x2_t, z0, svreinterpret_u16_f32_x2 (z4), svreinterpret_u16 (z4)) +/* +** reinterpret_u16_mf8_x3_untied: +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_u16_mf8_x3_untied, svuint16x3_t, svmfloat8x3_t, z18, + svreinterpret_u16_mf8_x3 (z23), + svreinterpret_u16 (z23)) + /* ** reinterpret_u16_s64_x3_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u32.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u32.c index 6d7e05857fe..77f5abc3465 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u32.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u32.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_u32_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_u32_mf8_tied1, svuint32_t, svmfloat8_t, + z0_res = svreinterpret_u32_mf8 (z0), + z0_res = svreinterpret_u32 (z0)) + +/* +** reinterpret_u32_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_u32_mf8_untied, svuint32_t, svmfloat8_t, + z0 = svreinterpret_u32_mf8 (z4), + z0 = svreinterpret_u32 (z4)) + /* ** reinterpret_u32_bf16_tied1: ** ret @@ -229,6 +246,17 @@ TEST_DUAL_XN (reinterpret_u32_f32_x2_untied, svuint32x2_t, svfloat32x2_t, z0, svreinterpret_u32_f32_x2 (z4), svreinterpret_u32 (z4)) +/* +** reinterpret_u32_mf8_x3_untied: +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_u32_mf8_x3_untied, svuint32x3_t, svmfloat8x3_t, z18, + svreinterpret_u32_mf8_x3 (z23), + svreinterpret_u32 (z23)) + /* ** reinterpret_u32_s64_x3_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u64.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u64.c index 55c0baefb6f..90fb1ff8478 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u64.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u64.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_u64_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_u64_mf8_tied1, svuint64_t, svmfloat8_t, + z0_res = svreinterpret_u64_mf8 (z0), + z0_res = svreinterpret_u64 (z0)) + +/* +** reinterpret_u64_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_u64_mf8_untied, svuint64_t, svmfloat8_t, + z0 = svreinterpret_u64_mf8 (z4), + z0 = svreinterpret_u64 (z4)) + /* ** reinterpret_u64_bf16_tied1: ** ret @@ -229,6 +246,17 @@ TEST_DUAL_XN (reinterpret_u64_f32_x2_untied, svuint64x2_t, svfloat32x2_t, z0, svreinterpret_u64_f32_x2 (z4), svreinterpret_u64 (z4)) +/* +** reinterpret_u64_mf8_x3_untied: +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_u64_mf8_x3_untied, svuint64x3_t, svmfloat8x3_t, z18, + svreinterpret_u64_mf8_x3 (z23), + svreinterpret_u64 (z23)) + /* ** reinterpret_u64_s64_x3_tied1: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u8.c index f7302196162..87500e334a1 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u8.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/reinterpret_u8.c @@ -2,6 +2,23 @@ #include "test_sve_acle.h" +/* +** reinterpret_u8_mf8_tied1: +** ret +*/ +TEST_DUAL_Z_REV (reinterpret_u8_mf8_tied1, svuint8_t, svmfloat8_t, + z0_res = svreinterpret_u8_mf8 (z0), + z0_res = svreinterpret_u8 (z0)) + +/* +** reinterpret_u8_mf8_untied: +** mov z0\.d, z4\.d +** ret +*/ +TEST_DUAL_Z (reinterpret_u8_mf8_untied, svuint8_t, svmfloat8_t, + z0 = svreinterpret_u8_mf8 (z4), + z0 = svreinterpret_u8 (z4)) + /* ** reinterpret_u8_bf16_tied1: ** ret @@ -214,6 +231,17 @@ TEST_DUAL_Z_REV (reinterpret_u8_bf16_x2_tied1, svuint8x2_t, svbfloat16x2_t, z0_res = svreinterpret_u8_bf16_x2 (z0), z0_res = svreinterpret_u8 (z0)) +/* +** reinterpret_u8_mf8_x3_untied: +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** mov (z18|z19|z20)\.d, (z23|z24|z25)\.d +** ret +*/ +TEST_DUAL_XN (reinterpret_u8_mf8_x3_untied, svuint8x3_t, svmfloat8x3_t, z18, + svreinterpret_u8_mf8_x3 (z23), + svreinterpret_u8 (z23)) + /* ** reinterpret_u8_f32_x2_untied: ** ( diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rev_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rev_mf8.c new file mode 100644 index 00000000000..f0c6532f153 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rev_mf8.c @@ -0,0 +1,21 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** rev_mf8_tied1: +** rev z0\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (rev_mf8_tied1, svmfloat8_t, + z0 = svrev_mf8 (z0), + z0 = svrev (z0)) + +/* +** rev_mf8_untied: +** rev z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (rev_mf8_untied, svmfloat8_t, + z0 = svrev_mf8 (z1), + z0 = svrev (z1)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/sel_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/sel_mf8.c new file mode 100644 index 00000000000..8a76ce864b7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/sel_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** sel_mf8_tied1: +** sel z0\.b, p0, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (sel_mf8_tied1, svmfloat8_t, + z0 = svsel_mf8 (p0, z0, z1), + z0 = svsel (p0, z0, z1)) + +/* +** sel_mf8_tied2: +** sel z0\.b, p0, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (sel_mf8_tied2, svmfloat8_t, + z0 = svsel_mf8 (p0, z1, z0), + z0 = svsel (p0, z1, z0)) + +/* +** sel_mf8_untied: +** sel z0\.b, p0, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (sel_mf8_untied, svmfloat8_t, + z0 = svsel_mf8 (p0, z1, z2), + z0 = svsel (p0, z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set2_mf8.c new file mode 100644 index 00000000000..7f190d0b4cd --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set2_mf8.c @@ -0,0 +1,41 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** set2_mf8_z24_0: +** mov z25\.d, z5\.d +** mov z24\.d, z0\.d +** ret +*/ +TEST_SET (set2_mf8_z24_0, svmfloat8x2_t, svmfloat8_t, + z24 = svset2_mf8 (z4, 0, z0), + z24 = svset2 (z4, 0, z0)) + +/* +** set2_mf8_z24_1: +** mov z24\.d, z4\.d +** mov z25\.d, z0\.d +** ret +*/ +TEST_SET (set2_mf8_z24_1, svmfloat8x2_t, svmfloat8_t, + z24 = svset2_mf8 (z4, 1, z0), + z24 = svset2 (z4, 1, z0)) + +/* +** set2_mf8_z4_0: +** mov z4\.d, z0\.d +** ret +*/ +TEST_SET (set2_mf8_z4_0, svmfloat8x2_t, svmfloat8_t, + z4 = svset2_mf8 (z4, 0, z0), + z4 = svset2 (z4, 0, z0)) + +/* +** set2_mf8_z4_1: +** mov z5\.d, z0\.d +** ret +*/ +TEST_SET (set2_mf8_z4_1, svmfloat8x2_t, svmfloat8_t, + z4 = svset2_mf8 (z4, 1, z0), + z4 = svset2 (z4, 1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set3_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set3_mf8.c new file mode 100644 index 00000000000..19247616349 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set3_mf8.c @@ -0,0 +1,63 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** set3_mf8_z24_0: +** mov z25\.d, z5\.d +** mov z26\.d, z6\.d +** mov z24\.d, z0\.d +** ret +*/ +TEST_SET (set3_mf8_z24_0, svmfloat8x3_t, svmfloat8_t, + z24 = svset3_mf8 (z4, 0, z0), + z24 = svset3 (z4, 0, z0)) + +/* +** set3_mf8_z24_1: +** mov z24\.d, z4\.d +** mov z26\.d, z6\.d +** mov z25\.d, z0\.d +** ret +*/ +TEST_SET (set3_mf8_z24_1, svmfloat8x3_t, svmfloat8_t, + z24 = svset3_mf8 (z4, 1, z0), + z24 = svset3 (z4, 1, z0)) + +/* +** set3_mf8_z24_2: +** mov z24\.d, z4\.d +** mov z25\.d, z5\.d +** mov z26\.d, z0\.d +** ret +*/ +TEST_SET (set3_mf8_z24_2, svmfloat8x3_t, svmfloat8_t, + z24 = svset3_mf8 (z4, 2, z0), + z24 = svset3 (z4, 2, z0)) + +/* +** set3_mf8_z4_0: +** mov z4\.d, z0\.d +** ret +*/ +TEST_SET (set3_mf8_z4_0, svmfloat8x3_t, svmfloat8_t, + z4 = svset3_mf8 (z4, 0, z0), + z4 = svset3 (z4, 0, z0)) + +/* +** set3_mf8_z4_1: +** mov z5\.d, z0\.d +** ret +*/ +TEST_SET (set3_mf8_z4_1, svmfloat8x3_t, svmfloat8_t, + z4 = svset3_mf8 (z4, 1, z0), + z4 = svset3 (z4, 1, z0)) + +/* +** set3_mf8_z4_2: +** mov z6\.d, z0\.d +** ret +*/ +TEST_SET (set3_mf8_z4_2, svmfloat8x3_t, svmfloat8_t, + z4 = svset3_mf8 (z4, 2, z0), + z4 = svset3 (z4, 2, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set4_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set4_mf8.c new file mode 100644 index 00000000000..faf0ceb3dd7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/set4_mf8.c @@ -0,0 +1,87 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** set4_mf8_z24_0: +** mov z25\.d, z5\.d +** mov z26\.d, z6\.d +** mov z27\.d, z7\.d +** mov z24\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z24_0, svmfloat8x4_t, svmfloat8_t, + z24 = svset4_mf8 (z4, 0, z0), + z24 = svset4 (z4, 0, z0)) + +/* +** set4_mf8_z24_1: +** mov z24\.d, z4\.d +** mov z26\.d, z6\.d +** mov z27\.d, z7\.d +** mov z25\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z24_1, svmfloat8x4_t, svmfloat8_t, + z24 = svset4_mf8 (z4, 1, z0), + z24 = svset4 (z4, 1, z0)) + +/* +** set4_mf8_z24_2: +** mov z24\.d, z4\.d +** mov z25\.d, z5\.d +** mov z27\.d, z7\.d +** mov z26\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z24_2, svmfloat8x4_t, svmfloat8_t, + z24 = svset4_mf8 (z4, 2, z0), + z24 = svset4 (z4, 2, z0)) + +/* +** set4_mf8_z24_3: +** mov z24\.d, z4\.d +** mov z25\.d, z5\.d +** mov z26\.d, z6\.d +** mov z27\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z24_3, svmfloat8x4_t, svmfloat8_t, + z24 = svset4_mf8 (z4, 3, z0), + z24 = svset4 (z4, 3, z0)) + +/* +** set4_mf8_z4_0: +** mov z4\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z4_0, svmfloat8x4_t, svmfloat8_t, + z4 = svset4_mf8 (z4, 0, z0), + z4 = svset4 (z4, 0, z0)) + +/* +** set4_mf8_z4_1: +** mov z5\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z4_1, svmfloat8x4_t, svmfloat8_t, + z4 = svset4_mf8 (z4, 1, z0), + z4 = svset4 (z4, 1, z0)) + +/* +** set4_mf8_z4_2: +** mov z6\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z4_2, svmfloat8x4_t, svmfloat8_t, + z4 = svset4_mf8 (z4, 2, z0), + z4 = svset4 (z4, 2, z0)) + +/* +** set4_mf8_z4_3: +** mov z7\.d, z0\.d +** ret +*/ +TEST_SET (set4_mf8_z4_3, svmfloat8x4_t, svmfloat8_t, + z4 = svset4_mf8 (z4, 3, z0), + z4 = svset4 (z4, 3, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/splice_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/splice_mf8.c new file mode 100644 index 00000000000..5ddeff1d3dd --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/splice_mf8.c @@ -0,0 +1,33 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** splice_mf8_tied1: +** splice z0\.b, p0, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (splice_mf8_tied1, svmfloat8_t, + z0 = svsplice_mf8 (p0, z0, z1), + z0 = svsplice (p0, z0, z1)) + +/* +** splice_mf8_tied2: +** mov (z[0-9]+)\.d, z0\.d +** movprfx z0, z1 +** splice z0\.b, p0, z0\.b, \1\.b +** ret +*/ +TEST_UNIFORM_Z (splice_mf8_tied2, svmfloat8_t, + z0 = svsplice_mf8 (p0, z1, z0), + z0 = svsplice (p0, z1, z0)) + +/* +** splice_mf8_untied: +** movprfx z0, z1 +** splice z0\.b, p0, z0\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (splice_mf8_untied, svmfloat8_t, + z0 = svsplice_mf8 (p0, z1, z2), + z0 = svsplice (p0, z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st1_mf8.c new file mode 100644 index 00000000000..d4ca82bd08c --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st1_mf8.c @@ -0,0 +1,162 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** st1_mf8_base: +** st1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (st1_mf8_base, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0, z0), + svst1 (p0, x0, z0)) + +/* +** st1_mf8_index: +** st1b z0\.b, p0, \[x0, x1\] +** ret +*/ +TEST_STORE (st1_mf8_index, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 + x1, z0), + svst1 (p0, x0 + x1, z0)) + +/* +** st1_mf8_1: +** st1b z0\.b, p0, \[x0, #1, mul vl\] +** ret +*/ +TEST_STORE (st1_mf8_1, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 + svcntb (), z0), + svst1 (p0, x0 + svcntb (), z0)) + +/* +** st1_mf8_7: +** st1b z0\.b, p0, \[x0, #7, mul vl\] +** ret +*/ +TEST_STORE (st1_mf8_7, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 + svcntb () * 7, z0), + svst1 (p0, x0 + svcntb () * 7, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st1_mf8_8: +** incb x0, all, mul #8 +** st1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (st1_mf8_8, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 + svcntb () * 8, z0), + svst1 (p0, x0 + svcntb () * 8, z0)) + +/* +** st1_mf8_m1: +** st1b z0\.b, p0, \[x0, #-1, mul vl\] +** ret +*/ +TEST_STORE (st1_mf8_m1, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 - svcntb (), z0), + svst1 (p0, x0 - svcntb (), z0)) + +/* +** st1_mf8_m8: +** st1b z0\.b, p0, \[x0, #-8, mul vl\] +** ret +*/ +TEST_STORE (st1_mf8_m8, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 - svcntb () * 8, z0), + svst1 (p0, x0 - svcntb () * 8, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st1_mf8_m9: +** decb x0, all, mul #9 +** st1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (st1_mf8_m9, svmfloat8_t, mfloat8_t, + svst1_mf8 (p0, x0 - svcntb () * 9, z0), + svst1 (p0, x0 - svcntb () * 9, z0)) + +/* +** st1_vnum_mf8_0: +** st1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_0, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, 0, z0), + svst1_vnum (p0, x0, 0, z0)) + +/* +** st1_vnum_mf8_1: +** st1b z0\.b, p0, \[x0, #1, mul vl\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_1, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, 1, z0), + svst1_vnum (p0, x0, 1, z0)) + +/* +** st1_vnum_mf8_7: +** st1b z0\.b, p0, \[x0, #7, mul vl\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_7, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, 7, z0), + svst1_vnum (p0, x0, 7, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st1_vnum_mf8_8: +** incb x0, all, mul #8 +** st1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_8, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, 8, z0), + svst1_vnum (p0, x0, 8, z0)) + +/* +** st1_vnum_mf8_m1: +** st1b z0\.b, p0, \[x0, #-1, mul vl\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_m1, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, -1, z0), + svst1_vnum (p0, x0, -1, z0)) + +/* +** st1_vnum_mf8_m8: +** st1b z0\.b, p0, \[x0, #-8, mul vl\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_m8, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, -8, z0), + svst1_vnum (p0, x0, -8, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st1_vnum_mf8_m9: +** decb x0, all, mul #9 +** st1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (st1_vnum_mf8_m9, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, -9, z0), + svst1_vnum (p0, x0, -9, z0)) + +/* +** st1_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** st1b z0\.b, p0, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** st1b z0\.b, p0, \[x0, \3\] +** ) +** ret +*/ +TEST_STORE (st1_vnum_mf8_x1, svmfloat8_t, mfloat8_t, + svst1_vnum_mf8 (p0, x0, x1, z0), + svst1_vnum (p0, x0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st2_mf8.c new file mode 100644 index 00000000000..7473f110172 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st2_mf8.c @@ -0,0 +1,204 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** st2_mf8_base: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_mf8_base, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0, z0), + svst2 (p0, x0, z0)) + +/* +** st2_mf8_index: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, x1\] +** ret +*/ +TEST_STORE (st2_mf8_index, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 + x1, z0), + svst2 (p0, x0 + x1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st2_mf8_1: +** incb x0 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_mf8_1, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 + svcntb (), z0), + svst2 (p0, x0 + svcntb (), z0)) + +/* +** st2_mf8_2: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #2, mul vl\] +** ret +*/ +TEST_STORE (st2_mf8_2, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 + svcntb () * 2, z0), + svst2 (p0, x0 + svcntb () * 2, z0)) + +/* +** st2_mf8_14: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #14, mul vl\] +** ret +*/ +TEST_STORE (st2_mf8_14, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 + svcntb () * 14, z0), + svst2 (p0, x0 + svcntb () * 14, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st2_mf8_16: +** incb x0, all, mul #16 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_mf8_16, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 + svcntb () * 16, z0), + svst2 (p0, x0 + svcntb () * 16, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st2_mf8_m1: +** decb x0 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_mf8_m1, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 - svcntb (), z0), + svst2 (p0, x0 - svcntb (), z0)) + +/* +** st2_mf8_m2: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #-2, mul vl\] +** ret +*/ +TEST_STORE (st2_mf8_m2, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 - svcntb () * 2, z0), + svst2 (p0, x0 - svcntb () * 2, z0)) + +/* +** st2_mf8_m16: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #-16, mul vl\] +** ret +*/ +TEST_STORE (st2_mf8_m16, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 - svcntb () * 16, z0), + svst2 (p0, x0 - svcntb () * 16, z0)) + +/* +** st2_mf8_m18: +** addvl (x[0-9]+), x0, #-18 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[\1\] +** ret +*/ +TEST_STORE (st2_mf8_m18, svmfloat8x2_t, mfloat8_t, + svst2_mf8 (p0, x0 - svcntb () * 18, z0), + svst2 (p0, x0 - svcntb () * 18, z0)) + +/* +** st2_vnum_mf8_0: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_0, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, 0, z0), + svst2_vnum (p0, x0, 0, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st2_vnum_mf8_1: +** incb x0 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_1, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, 1, z0), + svst2_vnum (p0, x0, 1, z0)) + +/* +** st2_vnum_mf8_2: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #2, mul vl\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_2, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, 2, z0), + svst2_vnum (p0, x0, 2, z0)) + +/* +** st2_vnum_mf8_14: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #14, mul vl\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_14, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, 14, z0), + svst2_vnum (p0, x0, 14, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st2_vnum_mf8_16: +** incb x0, all, mul #16 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_16, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, 16, z0), + svst2_vnum (p0, x0, 16, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st2_vnum_mf8_m1: +** decb x0 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_m1, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, -1, z0), + svst2_vnum (p0, x0, -1, z0)) + +/* +** st2_vnum_mf8_m2: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #-2, mul vl\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_m2, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, -2, z0), + svst2_vnum (p0, x0, -2, z0)) + +/* +** st2_vnum_mf8_m16: +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, #-16, mul vl\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_m16, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, -16, z0), + svst2_vnum (p0, x0, -16, z0)) + +/* +** st2_vnum_mf8_m18: +** addvl (x[0-9]+), x0, #-18 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[\1\] +** ret +*/ +TEST_STORE (st2_vnum_mf8_m18, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, -18, z0), + svst2_vnum (p0, x0, -18, z0)) + +/* +** st2_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** st2b {z0\.b(?: - |, )z1\.b}, p0, \[x0, \3\] +** ) +** ret +*/ +TEST_STORE (st2_vnum_mf8_x1, svmfloat8x2_t, mfloat8_t, + svst2_vnum_mf8 (p0, x0, x1, z0), + svst2_vnum (p0, x0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st3_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st3_mf8.c new file mode 100644 index 00000000000..e23e7e979de --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st3_mf8.c @@ -0,0 +1,246 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** st3_mf8_base: +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_mf8_base, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0, z0), + svst3 (p0, x0, z0)) + +/* +** st3_mf8_index: +** st3b {z0\.b - z2\.b}, p0, \[x0, x1\] +** ret +*/ +TEST_STORE (st3_mf8_index, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 + x1, z0), + svst3 (p0, x0 + x1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_mf8_1: +** incb x0 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_mf8_1, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 + svcntb (), z0), + svst3 (p0, x0 + svcntb (), z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_mf8_2: +** incb x0, all, mul #2 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_mf8_2, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 + svcntb () * 2, z0), + svst3 (p0, x0 + svcntb () * 2, z0)) + +/* +** st3_mf8_3: +** st3b {z0\.b - z2\.b}, p0, \[x0, #3, mul vl\] +** ret +*/ +TEST_STORE (st3_mf8_3, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 + svcntb () * 3, z0), + svst3 (p0, x0 + svcntb () * 3, z0)) + +/* +** st3_mf8_21: +** st3b {z0\.b - z2\.b}, p0, \[x0, #21, mul vl\] +** ret +*/ +TEST_STORE (st3_mf8_21, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 + svcntb () * 21, z0), + svst3 (p0, x0 + svcntb () * 21, z0)) + +/* +** st3_mf8_24: +** addvl (x[0-9]+), x0, #24 +** st3b {z0\.b - z2\.b}, p0, \[\1\] +** ret +*/ +TEST_STORE (st3_mf8_24, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 + svcntb () * 24, z0), + svst3 (p0, x0 + svcntb () * 24, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_mf8_m1: +** decb x0 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_mf8_m1, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 - svcntb (), z0), + svst3 (p0, x0 - svcntb (), z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_mf8_m2: +** decb x0, all, mul #2 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_mf8_m2, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 - svcntb () * 2, z0), + svst3 (p0, x0 - svcntb () * 2, z0)) + +/* +** st3_mf8_m3: +** st3b {z0\.b - z2\.b}, p0, \[x0, #-3, mul vl\] +** ret +*/ +TEST_STORE (st3_mf8_m3, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 - svcntb () * 3, z0), + svst3 (p0, x0 - svcntb () * 3, z0)) + +/* +** st3_mf8_m24: +** st3b {z0\.b - z2\.b}, p0, \[x0, #-24, mul vl\] +** ret +*/ +TEST_STORE (st3_mf8_m24, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 - svcntb () * 24, z0), + svst3 (p0, x0 - svcntb () * 24, z0)) + +/* +** st3_mf8_m27: +** addvl (x[0-9]+), x0, #-27 +** st3b {z0\.b - z2\.b}, p0, \[\1\] +** ret +*/ +TEST_STORE (st3_mf8_m27, svmfloat8x3_t, mfloat8_t, + svst3_mf8 (p0, x0 - svcntb () * 27, z0), + svst3 (p0, x0 - svcntb () * 27, z0)) + +/* +** st3_vnum_mf8_0: +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_0, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, 0, z0), + svst3_vnum (p0, x0, 0, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_vnum_mf8_1: +** incb x0 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_1, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, 1, z0), + svst3_vnum (p0, x0, 1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_vnum_mf8_2: +** incb x0, all, mul #2 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_2, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, 2, z0), + svst3_vnum (p0, x0, 2, z0)) + +/* +** st3_vnum_mf8_3: +** st3b {z0\.b - z2\.b}, p0, \[x0, #3, mul vl\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_3, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, 3, z0), + svst3_vnum (p0, x0, 3, z0)) + +/* +** st3_vnum_mf8_21: +** st3b {z0\.b - z2\.b}, p0, \[x0, #21, mul vl\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_21, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, 21, z0), + svst3_vnum (p0, x0, 21, z0)) + +/* +** st3_vnum_mf8_24: +** addvl (x[0-9]+), x0, #24 +** st3b {z0\.b - z2\.b}, p0, \[\1\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_24, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, 24, z0), + svst3_vnum (p0, x0, 24, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_vnum_mf8_m1: +** decb x0 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_m1, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, -1, z0), + svst3_vnum (p0, x0, -1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st3_vnum_mf8_m2: +** decb x0, all, mul #2 +** st3b {z0\.b - z2\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_m2, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, -2, z0), + svst3_vnum (p0, x0, -2, z0)) + +/* +** st3_vnum_mf8_m3: +** st3b {z0\.b - z2\.b}, p0, \[x0, #-3, mul vl\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_m3, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, -3, z0), + svst3_vnum (p0, x0, -3, z0)) + +/* +** st3_vnum_mf8_m24: +** st3b {z0\.b - z2\.b}, p0, \[x0, #-24, mul vl\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_m24, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, -24, z0), + svst3_vnum (p0, x0, -24, z0)) + +/* +** st3_vnum_mf8_m27: +** addvl (x[0-9]+), x0, #-27 +** st3b {z0\.b - z2\.b}, p0, \[\1\] +** ret +*/ +TEST_STORE (st3_vnum_mf8_m27, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, -27, z0), + svst3_vnum (p0, x0, -27, z0)) + +/* +** st3_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** st3b {z0\.b - z2\.b}, p0, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** st3b {z0\.b - z2\.b}, p0, \[x0, \3\] +** ) +** ret +*/ +TEST_STORE (st3_vnum_mf8_x1, svmfloat8x3_t, mfloat8_t, + svst3_vnum_mf8 (p0, x0, x1, z0), + svst3_vnum (p0, x0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st4_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st4_mf8.c new file mode 100644 index 00000000000..5c9526a816d --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/st4_mf8.c @@ -0,0 +1,290 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** st4_mf8_base: +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_base, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0, z0), + svst4 (p0, x0, z0)) + +/* +** st4_mf8_index: +** st4b {z0\.b - z3\.b}, p0, \[x0, x1\] +** ret +*/ +TEST_STORE (st4_mf8_index, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + x1, z0), + svst4 (p0, x0 + x1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_mf8_1: +** incb x0 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_1, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + svcntb (), z0), + svst4 (p0, x0 + svcntb (), z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_mf8_2: +** incb x0, all, mul #2 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_2, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + svcntb () * 2, z0), + svst4 (p0, x0 + svcntb () * 2, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_mf8_3: +** incb x0, all, mul #3 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_3, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + svcntb () * 3, z0), + svst4 (p0, x0 + svcntb () * 3, z0)) + +/* +** st4_mf8_4: +** st4b {z0\.b - z3\.b}, p0, \[x0, #4, mul vl\] +** ret +*/ +TEST_STORE (st4_mf8_4, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + svcntb () * 4, z0), + svst4 (p0, x0 + svcntb () * 4, z0)) + +/* +** st4_mf8_28: +** st4b {z0\.b - z3\.b}, p0, \[x0, #28, mul vl\] +** ret +*/ +TEST_STORE (st4_mf8_28, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + svcntb () * 28, z0), + svst4 (p0, x0 + svcntb () * 28, z0)) + +/* +** st4_mf8_32: +** [^{]* +** st4b {z0\.b - z3\.b}, p0, \[x[0-9]+, x[0-9]+\] +** ret +*/ +TEST_STORE (st4_mf8_32, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 + svcntb () * 32, z0), + svst4 (p0, x0 + svcntb () * 32, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_mf8_m1: +** decb x0 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_m1, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 - svcntb (), z0), + svst4 (p0, x0 - svcntb (), z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_mf8_m2: +** decb x0, all, mul #2 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_m2, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 - svcntb () * 2, z0), + svst4 (p0, x0 - svcntb () * 2, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_mf8_m3: +** decb x0, all, mul #3 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_mf8_m3, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 - svcntb () * 3, z0), + svst4 (p0, x0 - svcntb () * 3, z0)) + +/* +** st4_mf8_m4: +** st4b {z0\.b - z3\.b}, p0, \[x0, #-4, mul vl\] +** ret +*/ +TEST_STORE (st4_mf8_m4, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 - svcntb () * 4, z0), + svst4 (p0, x0 - svcntb () * 4, z0)) + +/* +** st4_mf8_m32: +** st4b {z0\.b - z3\.b}, p0, \[x0, #-32, mul vl\] +** ret +*/ +TEST_STORE (st4_mf8_m32, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 - svcntb () * 32, z0), + svst4 (p0, x0 - svcntb () * 32, z0)) + +/* +** st4_mf8_m36: +** [^{]* +** st4b {z0\.b - z3\.b}, p0, \[x[0-9]+, x[0-9]+\] +** ret +*/ +TEST_STORE (st4_mf8_m36, svmfloat8x4_t, mfloat8_t, + svst4_mf8 (p0, x0 - svcntb () * 36, z0), + svst4 (p0, x0 - svcntb () * 36, z0)) + +/* +** st4_vnum_mf8_0: +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_0, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 0, z0), + svst4_vnum (p0, x0, 0, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_vnum_mf8_1: +** incb x0 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_1, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 1, z0), + svst4_vnum (p0, x0, 1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_vnum_mf8_2: +** incb x0, all, mul #2 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_2, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 2, z0), + svst4_vnum (p0, x0, 2, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_vnum_mf8_3: +** incb x0, all, mul #3 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_3, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 3, z0), + svst4_vnum (p0, x0, 3, z0)) + +/* +** st4_vnum_mf8_4: +** st4b {z0\.b - z3\.b}, p0, \[x0, #4, mul vl\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_4, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 4, z0), + svst4_vnum (p0, x0, 4, z0)) + +/* +** st4_vnum_mf8_28: +** st4b {z0\.b - z3\.b}, p0, \[x0, #28, mul vl\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_28, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 28, z0), + svst4_vnum (p0, x0, 28, z0)) + +/* +** st4_vnum_mf8_32: +** [^{]* +** st4b {z0\.b - z3\.b}, p0, \[x[0-9]+, x[0-9]+\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_32, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, 32, z0), + svst4_vnum (p0, x0, 32, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_vnum_mf8_m1: +** decb x0 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_m1, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, -1, z0), + svst4_vnum (p0, x0, -1, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_vnum_mf8_m2: +** decb x0, all, mul #2 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_m2, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, -2, z0), + svst4_vnum (p0, x0, -2, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** st4_vnum_mf8_m3: +** decb x0, all, mul #3 +** st4b {z0\.b - z3\.b}, p0, \[x0\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_m3, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, -3, z0), + svst4_vnum (p0, x0, -3, z0)) + +/* +** st4_vnum_mf8_m4: +** st4b {z0\.b - z3\.b}, p0, \[x0, #-4, mul vl\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_m4, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, -4, z0), + svst4_vnum (p0, x0, -4, z0)) + +/* +** st4_vnum_mf8_m32: +** st4b {z0\.b - z3\.b}, p0, \[x0, #-32, mul vl\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_m32, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, -32, z0), + svst4_vnum (p0, x0, -32, z0)) + +/* +** st4_vnum_mf8_m36: +** [^{]* +** st4b {z0\.b - z3\.b}, p0, \[x[0-9]+, x[0-9]+\] +** ret +*/ +TEST_STORE (st4_vnum_mf8_m36, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, -36, z0), + svst4_vnum (p0, x0, -36, z0)) + +/* +** st4_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** st4b {z0\.b - z3\.b}, p0, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** st4b {z0\.b - z3\.b}, p0, \[x0, \3\] +** ) +** ret +*/ +TEST_STORE (st4_vnum_mf8_x1, svmfloat8x4_t, mfloat8_t, + svst4_vnum_mf8 (p0, x0, x1, z0), + svst4_vnum (p0, x0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/stnt1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/stnt1_mf8.c new file mode 100644 index 00000000000..5bcb8dfa4fa --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/stnt1_mf8.c @@ -0,0 +1,162 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** stnt1_mf8_base: +** stnt1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (stnt1_mf8_base, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0, z0), + svstnt1 (p0, x0, z0)) + +/* +** stnt1_mf8_index: +** stnt1b z0\.b, p0, \[x0, x1\] +** ret +*/ +TEST_STORE (stnt1_mf8_index, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 + x1, z0), + svstnt1 (p0, x0 + x1, z0)) + +/* +** stnt1_mf8_1: +** stnt1b z0\.b, p0, \[x0, #1, mul vl\] +** ret +*/ +TEST_STORE (stnt1_mf8_1, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 + svcntb (), z0), + svstnt1 (p0, x0 + svcntb (), z0)) + +/* +** stnt1_mf8_7: +** stnt1b z0\.b, p0, \[x0, #7, mul vl\] +** ret +*/ +TEST_STORE (stnt1_mf8_7, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 + svcntb () * 7, z0), + svstnt1 (p0, x0 + svcntb () * 7, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** stnt1_mf8_8: +** incb x0, all, mul #8 +** stnt1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (stnt1_mf8_8, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 + svcntb () * 8, z0), + svstnt1 (p0, x0 + svcntb () * 8, z0)) + +/* +** stnt1_mf8_m1: +** stnt1b z0\.b, p0, \[x0, #-1, mul vl\] +** ret +*/ +TEST_STORE (stnt1_mf8_m1, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 - svcntb (), z0), + svstnt1 (p0, x0 - svcntb (), z0)) + +/* +** stnt1_mf8_m8: +** stnt1b z0\.b, p0, \[x0, #-8, mul vl\] +** ret +*/ +TEST_STORE (stnt1_mf8_m8, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 - svcntb () * 8, z0), + svstnt1 (p0, x0 - svcntb () * 8, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** stnt1_mf8_m9: +** decb x0, all, mul #9 +** stnt1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (stnt1_mf8_m9, svmfloat8_t, mfloat8_t, + svstnt1_mf8 (p0, x0 - svcntb () * 9, z0), + svstnt1 (p0, x0 - svcntb () * 9, z0)) + +/* +** stnt1_vnum_mf8_0: +** stnt1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_0, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, 0, z0), + svstnt1_vnum (p0, x0, 0, z0)) + +/* +** stnt1_vnum_mf8_1: +** stnt1b z0\.b, p0, \[x0, #1, mul vl\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_1, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, 1, z0), + svstnt1_vnum (p0, x0, 1, z0)) + +/* +** stnt1_vnum_mf8_7: +** stnt1b z0\.b, p0, \[x0, #7, mul vl\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_7, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, 7, z0), + svstnt1_vnum (p0, x0, 7, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** stnt1_vnum_mf8_8: +** incb x0, all, mul #8 +** stnt1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_8, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, 8, z0), + svstnt1_vnum (p0, x0, 8, z0)) + +/* +** stnt1_vnum_mf8_m1: +** stnt1b z0\.b, p0, \[x0, #-1, mul vl\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_m1, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, -1, z0), + svstnt1_vnum (p0, x0, -1, z0)) + +/* +** stnt1_vnum_mf8_m8: +** stnt1b z0\.b, p0, \[x0, #-8, mul vl\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_m8, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, -8, z0), + svstnt1_vnum (p0, x0, -8, z0)) + +/* Moving the constant into a register would also be OK. */ +/* +** stnt1_vnum_mf8_m9: +** decb x0, all, mul #9 +** stnt1b z0\.b, p0, \[x0\] +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_m9, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, -9, z0), + svstnt1_vnum (p0, x0, -9, z0)) + +/* +** stnt1_vnum_mf8_x1: +** cntb (x[0-9]+) +** ( +** madd (x[0-9]+), (?:x1, \1|\1, x1), x0 +** stnt1b z0\.b, p0, \[\2\] +** | +** mul (x[0-9]+), (?:x1, \1|\1, x1) +** stnt1b z0\.b, p0, \[x0, \3\] +** ) +** ret +*/ +TEST_STORE (stnt1_vnum_mf8_x1, svmfloat8_t, mfloat8_t, + svstnt1_vnum_mf8 (p0, x0, x1, z0), + svstnt1_vnum (p0, x0, x1, z0)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/tbl_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/tbl_mf8.c new file mode 100644 index 00000000000..f729cac2bb0 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/tbl_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** tbl_mf8_tied1: +** tbl z0\.b, z0\.b, z4\.b +** ret +*/ +TEST_DUAL_Z (tbl_mf8_tied1, svmfloat8_t, svuint8_t, + z0 = svtbl_mf8 (z0, z4), + z0 = svtbl (z0, z4)) + +/* +** tbl_mf8_tied2: +** tbl z0\.b, z4\.b, z0\.b +** ret +*/ +TEST_DUAL_Z_REV (tbl_mf8_tied2, svmfloat8_t, svuint8_t, + z0_res = svtbl_mf8 (z4, z0), + z0_res = svtbl (z4, z0)) + +/* +** tbl_mf8_untied: +** tbl z0\.b, z1\.b, z4\.b +** ret +*/ +TEST_DUAL_Z (tbl_mf8_untied, svmfloat8_t, svuint8_t, + z0 = svtbl_mf8 (z1, z4), + z0 = svtbl (z1, z4)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1_mf8.c new file mode 100644 index 00000000000..2676c79bb74 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** trn1_mf8_tied1: +** trn1 z0\.b, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (trn1_mf8_tied1, svmfloat8_t, + z0 = svtrn1_mf8 (z0, z1), + z0 = svtrn1 (z0, z1)) + +/* +** trn1_mf8_tied2: +** trn1 z0\.b, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (trn1_mf8_tied2, svmfloat8_t, + z0 = svtrn1_mf8 (z1, z0), + z0 = svtrn1 (z1, z0)) + +/* +** trn1_mf8_untied: +** trn1 z0\.b, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (trn1_mf8_untied, svmfloat8_t, + z0 = svtrn1_mf8 (z1, z2), + z0 = svtrn1 (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1q_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1q_mf8.c new file mode 100644 index 00000000000..53764cb90aa --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn1q_mf8.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ +/* { dg-additional-options "-march=armv8.2-a+f64mm" } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** trn1q_mf8_tied1: +** trn1 z0\.q, z0\.q, z1\.q +** ret +*/ +TEST_UNIFORM_Z (trn1q_mf8_tied1, svmfloat8_t, + z0 = svtrn1q_mf8 (z0, z1), + z0 = svtrn1q (z0, z1)) + +/* +** trn1q_mf8_tied2: +** trn1 z0\.q, z1\.q, z0\.q +** ret +*/ +TEST_UNIFORM_Z (trn1q_mf8_tied2, svmfloat8_t, + z0 = svtrn1q_mf8 (z1, z0), + z0 = svtrn1q (z1, z0)) + +/* +** trn1q_mf8_untied: +** trn1 z0\.q, z1\.q, z2\.q +** ret +*/ +TEST_UNIFORM_Z (trn1q_mf8_untied, svmfloat8_t, + z0 = svtrn1q_mf8 (z1, z2), + z0 = svtrn1q (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2_mf8.c new file mode 100644 index 00000000000..8bdb8eda63e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** trn2_mf8_tied1: +** trn2 z0\.b, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (trn2_mf8_tied1, svmfloat8_t, + z0 = svtrn2_mf8 (z0, z1), + z0 = svtrn2 (z0, z1)) + +/* +** trn2_mf8_tied2: +** trn2 z0\.b, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (trn2_mf8_tied2, svmfloat8_t, + z0 = svtrn2_mf8 (z1, z0), + z0 = svtrn2 (z1, z0)) + +/* +** trn2_mf8_untied: +** trn2 z0\.b, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (trn2_mf8_untied, svmfloat8_t, + z0 = svtrn2_mf8 (z1, z2), + z0 = svtrn2 (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2q_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2q_mf8.c new file mode 100644 index 00000000000..33bf8b8f150 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/trn2q_mf8.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ +/* { dg-additional-options "-march=armv8.2-a+f64mm" } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** trn2q_mf8_tied1: +** trn2 z0\.q, z0\.q, z1\.q +** ret +*/ +TEST_UNIFORM_Z (trn2q_mf8_tied1, svmfloat8_t, + z0 = svtrn2q_mf8 (z0, z1), + z0 = svtrn2q (z0, z1)) + +/* +** trn2q_mf8_tied2: +** trn2 z0\.q, z1\.q, z0\.q +** ret +*/ +TEST_UNIFORM_Z (trn2q_mf8_tied2, svmfloat8_t, + z0 = svtrn2q_mf8 (z1, z0), + z0 = svtrn2q (z1, z0)) + +/* +** trn2q_mf8_untied: +** trn2 z0\.q, z1\.q, z2\.q +** ret +*/ +TEST_UNIFORM_Z (trn2q_mf8_untied, svmfloat8_t, + z0 = svtrn2q_mf8 (z1, z2), + z0 = svtrn2q (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef2_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef2_1.c index fe6c4c7c7d5..aeeddd8d15c 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef2_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef2_1.c @@ -37,6 +37,13 @@ TEST_UNDEF (uint16, svuint16x2_t, TEST_UNDEF (float16, svfloat16x2_t, z0 = svundef2_f16 ()) +/* +** mfloat8: +** ret +*/ +TEST_UNDEF (mfloat8, svmfloat8x2_t, + z0 = svundef2_mf8 ()) + /* ** bfloat16: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef3_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef3_1.c index 5c18c6317d1..f9a40895fb1 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef3_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef3_1.c @@ -37,6 +37,13 @@ TEST_UNDEF (uint16, svuint16x3_t, TEST_UNDEF (float16, svfloat16x3_t, z0 = svundef3_f16 ()) +/* +** mfloat8: +** ret +*/ +TEST_UNDEF (mfloat8, svmfloat8x3_t, + z0 = svundef3_mf8 ()) + /* ** bfloat16: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef4_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef4_1.c index 4d6b86b04b5..d8d8662ddd3 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef4_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef4_1.c @@ -37,6 +37,13 @@ TEST_UNDEF (uint16, svuint16x4_t, TEST_UNDEF (float16, svfloat16x4_t, z0 = svundef4_f16 ()) +/* +** mfloat8: +** ret +*/ +TEST_UNDEF (mfloat8, svmfloat8x4_t, + z0 = svundef4_mf8 ()) + /* ** bfloat16: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef_1.c index 62873b6e1b3..bfa51b82f14 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/undef_1.c @@ -37,6 +37,13 @@ TEST_UNDEF (uint16, svuint16_t, TEST_UNDEF (float16, svfloat16_t, z0 = svundef_f16 ()) +/* +** mfloat8: +** ret +*/ +TEST_UNDEF (mfloat8, svmfloat8_t, + z0 = svundef_mf8 ()) + /* ** bfloat16: ** ret diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1_mf8.c new file mode 100644 index 00000000000..c0bab36fff3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** uzp1_mf8_tied1: +** uzp1 z0\.b, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (uzp1_mf8_tied1, svmfloat8_t, + z0 = svuzp1_mf8 (z0, z1), + z0 = svuzp1 (z0, z1)) + +/* +** uzp1_mf8_tied2: +** uzp1 z0\.b, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (uzp1_mf8_tied2, svmfloat8_t, + z0 = svuzp1_mf8 (z1, z0), + z0 = svuzp1 (z1, z0)) + +/* +** uzp1_mf8_untied: +** uzp1 z0\.b, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (uzp1_mf8_untied, svmfloat8_t, + z0 = svuzp1_mf8 (z1, z2), + z0 = svuzp1 (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1q_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1q_mf8.c new file mode 100644 index 00000000000..3fab4c02914 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp1q_mf8.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ +/* { dg-additional-options "-march=armv8.2-a+f64mm" } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** uzp1q_mf8_tied1: +** uzp1 z0\.q, z0\.q, z1\.q +** ret +*/ +TEST_UNIFORM_Z (uzp1q_mf8_tied1, svmfloat8_t, + z0 = svuzp1q_mf8 (z0, z1), + z0 = svuzp1q (z0, z1)) + +/* +** uzp1q_mf8_tied2: +** uzp1 z0\.q, z1\.q, z0\.q +** ret +*/ +TEST_UNIFORM_Z (uzp1q_mf8_tied2, svmfloat8_t, + z0 = svuzp1q_mf8 (z1, z0), + z0 = svuzp1q (z1, z0)) + +/* +** uzp1q_mf8_untied: +** uzp1 z0\.q, z1\.q, z2\.q +** ret +*/ +TEST_UNIFORM_Z (uzp1q_mf8_untied, svmfloat8_t, + z0 = svuzp1q_mf8 (z1, z2), + z0 = svuzp1q (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2_mf8.c new file mode 100644 index 00000000000..91518b09e47 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** uzp2_mf8_tied1: +** uzp2 z0\.b, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (uzp2_mf8_tied1, svmfloat8_t, + z0 = svuzp2_mf8 (z0, z1), + z0 = svuzp2 (z0, z1)) + +/* +** uzp2_mf8_tied2: +** uzp2 z0\.b, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (uzp2_mf8_tied2, svmfloat8_t, + z0 = svuzp2_mf8 (z1, z0), + z0 = svuzp2 (z1, z0)) + +/* +** uzp2_mf8_untied: +** uzp2 z0\.b, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (uzp2_mf8_untied, svmfloat8_t, + z0 = svuzp2_mf8 (z1, z2), + z0 = svuzp2 (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2q_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2q_mf8.c new file mode 100644 index 00000000000..90c1c5d8d62 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/uzp2q_mf8.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ +/* { dg-additional-options "-march=armv8.2-a+f64mm" } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** uzp2q_mf8_tied1: +** uzp2 z0\.q, z0\.q, z1\.q +** ret +*/ +TEST_UNIFORM_Z (uzp2q_mf8_tied1, svmfloat8_t, + z0 = svuzp2q_mf8 (z0, z1), + z0 = svuzp2q (z0, z1)) + +/* +** uzp2q_mf8_tied2: +** uzp2 z0\.q, z1\.q, z0\.q +** ret +*/ +TEST_UNIFORM_Z (uzp2q_mf8_tied2, svmfloat8_t, + z0 = svuzp2q_mf8 (z1, z0), + z0 = svuzp2q (z1, z0)) + +/* +** uzp2q_mf8_untied: +** uzp2 z0\.q, z1\.q, z2\.q +** ret +*/ +TEST_UNIFORM_Z (uzp2q_mf8_untied, svmfloat8_t, + z0 = svuzp2q_mf8 (z1, z2), + z0 = svuzp2q (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1_mf8.c new file mode 100644 index 00000000000..97b5e0f3cf3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** zip1_mf8_tied1: +** zip1 z0\.b, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (zip1_mf8_tied1, svmfloat8_t, + z0 = svzip1_mf8 (z0, z1), + z0 = svzip1 (z0, z1)) + +/* +** zip1_mf8_tied2: +** zip1 z0\.b, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (zip1_mf8_tied2, svmfloat8_t, + z0 = svzip1_mf8 (z1, z0), + z0 = svzip1 (z1, z0)) + +/* +** zip1_mf8_untied: +** zip1 z0\.b, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (zip1_mf8_untied, svmfloat8_t, + z0 = svzip1_mf8 (z1, z2), + z0 = svzip1 (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1q_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1q_mf8.c new file mode 100644 index 00000000000..2b8fe08b93d --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip1q_mf8.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ +/* { dg-additional-options "-march=armv8.2-a+f64mm" } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** zip1q_mf8_tied1: +** zip1 z0\.q, z0\.q, z1\.q +** ret +*/ +TEST_UNIFORM_Z (zip1q_mf8_tied1, svmfloat8_t, + z0 = svzip1q_mf8 (z0, z1), + z0 = svzip1q (z0, z1)) + +/* +** zip1q_mf8_tied2: +** zip1 z0\.q, z1\.q, z0\.q +** ret +*/ +TEST_UNIFORM_Z (zip1q_mf8_tied2, svmfloat8_t, + z0 = svzip1q_mf8 (z1, z0), + z0 = svzip1q (z1, z0)) + +/* +** zip1q_mf8_untied: +** zip1 z0\.q, z1\.q, z2\.q +** ret +*/ +TEST_UNIFORM_Z (zip1q_mf8_untied, svmfloat8_t, + z0 = svzip1q_mf8 (z1, z2), + z0 = svzip1q (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2_mf8.c new file mode 100644 index 00000000000..96244fb3627 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2_mf8.c @@ -0,0 +1,30 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** zip2_mf8_tied1: +** zip2 z0\.b, z0\.b, z1\.b +** ret +*/ +TEST_UNIFORM_Z (zip2_mf8_tied1, svmfloat8_t, + z0 = svzip2_mf8 (z0, z1), + z0 = svzip2 (z0, z1)) + +/* +** zip2_mf8_tied2: +** zip2 z0\.b, z1\.b, z0\.b +** ret +*/ +TEST_UNIFORM_Z (zip2_mf8_tied2, svmfloat8_t, + z0 = svzip2_mf8 (z1, z0), + z0 = svzip2 (z1, z0)) + +/* +** zip2_mf8_untied: +** zip2 z0\.b, z1\.b, z2\.b +** ret +*/ +TEST_UNIFORM_Z (zip2_mf8_untied, svmfloat8_t, + z0 = svzip2_mf8 (z1, z2), + z0 = svzip2 (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2q_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2q_mf8.c new file mode 100644 index 00000000000..60db7307c2f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2q_mf8.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target aarch64_asm_f64mm_ok } */ +/* { dg-additional-options "-march=armv8.2-a+f64mm" } */ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** zip2q_mf8_tied1: +** zip2 z0\.q, z0\.q, z1\.q +** ret +*/ +TEST_UNIFORM_Z (zip2q_mf8_tied1, svmfloat8_t, + z0 = svzip2q_mf8 (z0, z1), + z0 = svzip2q (z0, z1)) + +/* +** zip2q_mf8_tied2: +** zip2 z0\.q, z1\.q, z0\.q +** ret +*/ +TEST_UNIFORM_Z (zip2q_mf8_tied2, svmfloat8_t, + z0 = svzip2q_mf8 (z1, z0), + z0 = svzip2q (z1, z0)) + +/* +** zip2q_mf8_untied: +** zip2 z0\.q, z1\.q, z2\.q +** ret +*/ +TEST_UNIFORM_Z (zip2q_mf8_untied, svmfloat8_t, + z0 = svzip2q_mf8 (z1, z2), + z0 = svzip2q (z1, z2)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_1.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_1.c index c3ac692d7ff..a85d068607a 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_1.c @@ -14,6 +14,7 @@ svuint8_t ret_u8 (void) { return svdup_u8 (0); } svuint16_t ret_u16 (void) { return svdup_u16 (0); } svuint32_t ret_u32 (void) { return svdup_u32 (0); } svuint64_t ret_u64 (void) { return svdup_u64 (0); } +svmfloat8_t ret_mf8 (void) { return svundef_mf8 (); } svbfloat16_t ret_bf16 (void) { return svundef_bf16 (); } svfloat16_t ret_f16 (void) { return svdup_f16 (0); } svfloat32_t ret_f32 (void) { return svdup_f32 (0); } @@ -27,6 +28,7 @@ svuint8x2_t ret_u8x2 (void) { return svundef2_u8 (); } svuint16x2_t ret_u16x2 (void) { return svundef2_u16 (); } svuint32x2_t ret_u32x2 (void) { return svundef2_u32 (); } svuint64x2_t ret_u64x2 (void) { return svundef2_u64 (); } +svmfloat8x2_t ret_mf8x2 (void) { return svundef2_mf8 (); } svbfloat16x2_t ret_bf16x2 (void) { return svundef2_bf16 (); } svfloat16x2_t ret_f16x2 (void) { return svundef2_f16 (); } svfloat32x2_t ret_f32x2 (void) { return svundef2_f32 (); } @@ -40,6 +42,7 @@ svuint8x3_t ret_u8x3 (void) { return svundef3_u8 (); } svuint16x3_t ret_u16x3 (void) { return svundef3_u16 (); } svuint32x3_t ret_u32x3 (void) { return svundef3_u32 (); } svuint64x3_t ret_u64x3 (void) { return svundef3_u64 (); } +svmfloat8x3_t ret_mf8x3 (void) { return svundef3_mf8 (); } svbfloat16x3_t ret_bf16x3 (void) { return svundef3_bf16 (); } svfloat16x3_t ret_f16x3 (void) { return svundef3_f16 (); } svfloat32x3_t ret_f32x3 (void) { return svundef3_f32 (); } @@ -53,6 +56,7 @@ svuint8x4_t ret_u8x4 (void) { return svundef4_u8 (); } svuint16x4_t ret_u16x4 (void) { return svundef4_u16 (); } svuint32x4_t ret_u32x4 (void) { return svundef4_u32 (); } svuint64x4_t ret_u64x4 (void) { return svundef4_u64 (); } +svmfloat8x4_t ret_mf8x4 (void) { return svundef4_mf8 (); } svbfloat16x4_t ret_bf16x4 (void) { return svundef4_bf16 (); } svfloat16x4_t ret_f16x4 (void) { return svundef4_f16 (); } svfloat32x4_t ret_f32x4 (void) { return svundef4_f32 (); } @@ -70,6 +74,7 @@ svfloat64x4_t ret_f64x4 (void) { return svundef4_f64 (); } /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u32\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u64\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tret_mf8\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_bf16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f32\n} } } */ @@ -83,6 +88,7 @@ svfloat64x4_t ret_f64x4 (void) { return svundef4_f64 (); } /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u32x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u64x2\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tret_mf8x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_bf16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f32x2\n} } } */ @@ -97,6 +103,7 @@ svfloat64x4_t ret_f64x4 (void) { return svundef4_f64 (); } /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u32x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u64x3\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tret_mf8x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_bf16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f32x3\n} } } */ @@ -110,6 +117,7 @@ svfloat64x4_t ret_f64x4 (void) { return svundef4_f64 (); } /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u32x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_u64x4\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tret_mf8x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_bf16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tret_f32x4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_2.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_2.c index c3508735fc4..eb9e28044da 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_2.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_2.c @@ -14,6 +14,7 @@ void fn_u8 (svuint8_t x) {} void fn_u16 (svuint16_t x) {} void fn_u32 (svuint32_t x) {} void fn_u64 (svuint64_t x) {} +void fn_mf8 (svmfloat8_t x) {} void fn_bf16 (svbfloat16_t x) {} void fn_f16 (svfloat16_t x) {} void fn_f32 (svfloat32_t x) {} @@ -27,6 +28,7 @@ void fn_u8x2 (svuint8x2_t x) {} void fn_u16x2 (svuint16x2_t x) {} void fn_u32x2 (svuint32x2_t x) {} void fn_u64x2 (svuint64x2_t x) {} +void fn_mf8x2 (svmfloat8x2_t x) {} void fn_bf16x2 (svbfloat16x2_t x) {} void fn_f16x2 (svfloat16x2_t x) {} void fn_f32x2 (svfloat32x2_t x) {} @@ -40,6 +42,7 @@ void fn_u8x3 (svuint8x3_t x) {} void fn_u16x3 (svuint16x3_t x) {} void fn_u32x3 (svuint32x3_t x) {} void fn_u64x3 (svuint64x3_t x) {} +void fn_mf8x3 (svmfloat8x3_t x) {} void fn_bf16x3 (svbfloat16x3_t x) {} void fn_f16x3 (svfloat16x3_t x) {} void fn_f32x3 (svfloat32x3_t x) {} @@ -53,6 +56,7 @@ void fn_u8x4 (svuint8x4_t x) {} void fn_u16x4 (svuint16x4_t x) {} void fn_u32x4 (svuint32x4_t x) {} void fn_u64x4 (svuint64x4_t x) {} +void fn_mf8x4 (svmfloat8x4_t x) {} void fn_bf16x4 (svbfloat16x4_t x) {} void fn_f16x4 (svfloat16x4_t x) {} void fn_f32x4 (svfloat32x4_t x) {} @@ -70,6 +74,7 @@ void fn_f64x4 (svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32\n} } } */ @@ -83,6 +88,7 @@ void fn_f64x4 (svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x2\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x2\n} } } */ @@ -96,6 +102,7 @@ void fn_f64x4 (svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x3\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x3\n} } } */ @@ -109,6 +116,7 @@ void fn_f64x4 (svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x4\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_3.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_3.c index 42e7860ff7e..a6e9fc64960 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_3.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_3.c @@ -10,6 +10,7 @@ void fn_u8 (float d0, float d1, float d2, float d3, svuint8_t x) {} void fn_u16 (float d0, float d1, float d2, float d3, svuint16_t x) {} void fn_u32 (float d0, float d1, float d2, float d3, svuint32_t x) {} void fn_u64 (float d0, float d1, float d2, float d3, svuint64_t x) {} +void fn_mf8 (float d0, float d1, float d2, float d3, svmfloat8_t x) {} void fn_bf16 (float d0, float d1, float d2, float d3, svbfloat16_t x) {} void fn_f16 (float d0, float d1, float d2, float d3, svfloat16_t x) {} void fn_f32 (float d0, float d1, float d2, float d3, svfloat32_t x) {} @@ -23,6 +24,7 @@ void fn_u8x2 (float d0, float d1, float d2, float d3, svuint8x2_t x) {} void fn_u16x2 (float d0, float d1, float d2, float d3, svuint16x2_t x) {} void fn_u32x2 (float d0, float d1, float d2, float d3, svuint32x2_t x) {} void fn_u64x2 (float d0, float d1, float d2, float d3, svuint64x2_t x) {} +void fn_mf8x2 (float d0, float d1, float d2, float d3, svmfloat8x2_t x) {} void fn_bf16x2 (float d0, float d1, float d2, float d3, svbfloat16x2_t x) {} void fn_f16x2 (float d0, float d1, float d2, float d3, svfloat16x2_t x) {} void fn_f32x2 (float d0, float d1, float d2, float d3, svfloat32x2_t x) {} @@ -36,6 +38,7 @@ void fn_u8x3 (float d0, float d1, float d2, float d3, svuint8x3_t x) {} void fn_u16x3 (float d0, float d1, float d2, float d3, svuint16x3_t x) {} void fn_u32x3 (float d0, float d1, float d2, float d3, svuint32x3_t x) {} void fn_u64x3 (float d0, float d1, float d2, float d3, svuint64x3_t x) {} +void fn_mf8x3 (float d0, float d1, float d2, float d3, svmfloat8x3_t x) {} void fn_bf16x3 (float d0, float d1, float d2, float d3, svbfloat16x3_t x) {} void fn_f16x3 (float d0, float d1, float d2, float d3, svfloat16x3_t x) {} void fn_f32x3 (float d0, float d1, float d2, float d3, svfloat32x3_t x) {} @@ -49,6 +52,7 @@ void fn_u8x4 (float d0, float d1, float d2, float d3, svuint8x4_t x) {} void fn_u16x4 (float d0, float d1, float d2, float d3, svuint16x4_t x) {} void fn_u32x4 (float d0, float d1, float d2, float d3, svuint32x4_t x) {} void fn_u64x4 (float d0, float d1, float d2, float d3, svuint64x4_t x) {} +void fn_mf8x4 (float d0, float d1, float d2, float d3, svmfloat8x4_t x) {} void fn_bf16x4 (float d0, float d1, float d2, float d3, svbfloat16x4_t x) {} void fn_f16x4 (float d0, float d1, float d2, float d3, svfloat16x4_t x) {} void fn_f32x4 (float d0, float d1, float d2, float d3, svfloat32x4_t x) {} @@ -62,6 +66,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32\n} } } */ @@ -75,6 +80,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x2\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x2\n} } } */ @@ -88,6 +94,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x3\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x3\n} } } */ @@ -101,6 +108,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, svfloat64x4_t x) {} /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x4\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x4\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_4.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_4.c index 7e4438ed49a..240c1c9faae 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_4.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_4.c @@ -18,6 +18,8 @@ void fn_u32 (float d0, float d1, float d2, float d3, float d4, svuint32_t x) {} void fn_u64 (float d0, float d1, float d2, float d3, float d4, svuint64_t x) {} +void fn_mf8 (float d0, float d1, float d2, float d3, + float d4, svmfloat8_t x) {} void fn_bf16 (float d0, float d1, float d2, float d3, float d4, svbfloat16_t x) {} void fn_f16 (float d0, float d1, float d2, float d3, @@ -43,6 +45,8 @@ void fn_u32x2 (float d0, float d1, float d2, float d3, float d4, svuint32x2_t x) {} void fn_u64x2 (float d0, float d1, float d2, float d3, float d4, svuint64x2_t x) {} +void fn_mf8x2 (float d0, float d1, float d2, float d3, + float d4, svmfloat8x2_t x) {} void fn_bf16x2 (float d0, float d1, float d2, float d3, float d4, svbfloat16x2_t x) {} void fn_f16x2 (float d0, float d1, float d2, float d3, @@ -68,6 +72,8 @@ void fn_u32x3 (float d0, float d1, float d2, float d3, float d4, svuint32x3_t x) {} void fn_u64x3 (float d0, float d1, float d2, float d3, float d4, svuint64x3_t x) {} +void fn_mf8x3 (float d0, float d1, float d2, float d3, + float d4, svmfloat8x3_t x) {} void fn_bf16x3 (float d0, float d1, float d2, float d3, float d4, svbfloat16x3_t x) {} void fn_f16x3 (float d0, float d1, float d2, float d3, @@ -93,6 +99,8 @@ void fn_u32x4 (float d0, float d1, float d2, float d3, float d4, svuint32x4_t x) {} void fn_u64x4 (float d0, float d1, float d2, float d3, float d4, svuint64x4_t x) {} +void fn_mf8x4 (float d0, float d1, float d2, float d3, + float d4, svmfloat8x4_t x) {} void fn_bf16x4 (float d0, float d1, float d2, float d3, float d4, svbfloat16x4_t x) {} void fn_f16x4 (float d0, float d1, float d2, float d3, @@ -110,6 +118,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32\n} } } */ @@ -123,6 +132,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x2\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x2\n} } } */ @@ -136,6 +146,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x3\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x3\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x3\n} } } */ @@ -149,6 +160,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u32x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u64x4\n} } } */ +/* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_mf8x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_bf16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f32x4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_5.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_5.c index 6dadc0492cd..0ff1df3b31d 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_5.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_5.c @@ -18,6 +18,8 @@ void fn_u32 (float d0, float d1, float d2, float d3, float d4, float d5, svuint32_t x) {} void fn_u64 (float d0, float d1, float d2, float d3, float d4, float d5, svuint64_t x) {} +void fn_mf8 (float d0, float d1, float d2, float d3, + float d4, float d5, svmfloat8_t x) {} void fn_bf16 (float d0, float d1, float d2, float d3, float d4, float d5, svbfloat16_t x) {} void fn_f16 (float d0, float d1, float d2, float d3, @@ -43,6 +45,8 @@ void fn_u32x2 (float d0, float d1, float d2, float d3, float d4, float d5, svuint32x2_t x) {} void fn_u64x2 (float d0, float d1, float d2, float d3, float d4, float d5, svuint64x2_t x) {} +void fn_mf8x2 (float d0, float d1, float d2, float d3, + float d4, float d5, svmfloat8x2_t x) {} void fn_bf16x2 (float d0, float d1, float d2, float d3, float d4, float d5, svbfloat16x2_t x) {} void fn_f16x2 (float d0, float d1, float d2, float d3, @@ -68,6 +72,8 @@ void fn_u32x3 (float d0, float d1, float d2, float d3, float d4, float d5, svuint32x3_t x) {} void fn_u64x3 (float d0, float d1, float d2, float d3, float d4, float d5, svuint64x3_t x) {} +void fn_mf8x3 (float d0, float d1, float d2, float d3, + float d4, float d5, svmfloat8x3_t x) {} void fn_bf16x3 (float d0, float d1, float d2, float d3, float d4, float d5, svbfloat16x3_t x) {} void fn_f16x3 (float d0, float d1, float d2, float d3, @@ -93,6 +99,8 @@ void fn_u32x4 (float d0, float d1, float d2, float d3, float d4, float d5, svuint32x4_t x) {} void fn_u64x4 (float d0, float d1, float d2, float d3, float d4, float d5, svuint64x4_t x) {} +void fn_mf8x4 (float d0, float d1, float d2, float d3, + float d4, float d5, svmfloat8x4_t x) {} void fn_bf16x4 (float d0, float d1, float d2, float d3, float d4, float d5, svbfloat16x4_t x) {} void fn_f16x4 (float d0, float d1, float d2, float d3, @@ -110,6 +118,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32\n} } } */ @@ -123,6 +132,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64x2\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16x2\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32x2\n} } } */ @@ -136,6 +146,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u16x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u32x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u64x3\n} } } */ +/* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_mf8x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_bf16x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f16x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f32x3\n} } } */ @@ -149,6 +160,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u32x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u64x4\n} } } */ +/* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_mf8x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_bf16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f32x4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_6.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_6.c index 0ff73e2598e..019e76476c4 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_6.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_6.c @@ -18,6 +18,8 @@ void fn_u32 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint32_t x) {} void fn_u64 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint64_t x) {} +void fn_mf8 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, svmfloat8_t x) {} void fn_bf16 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svbfloat16_t x) {} void fn_f16 (float d0, float d1, float d2, float d3, @@ -43,6 +45,8 @@ void fn_u32x2 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint32x2_t x) {} void fn_u64x2 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint64x2_t x) {} +void fn_mf8x2 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, svmfloat8x2_t x) {} void fn_bf16x2 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svbfloat16x2_t x) {} void fn_f16x2 (float d0, float d1, float d2, float d3, @@ -68,6 +72,8 @@ void fn_u32x3 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint32x3_t x) {} void fn_u64x3 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint64x3_t x) {} +void fn_mf8x3 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, svmfloat8x3_t x) {} void fn_bf16x3 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svbfloat16x3_t x) {} void fn_f16x3 (float d0, float d1, float d2, float d3, @@ -93,6 +99,8 @@ void fn_u32x4 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint32x4_t x) {} void fn_u64x4 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svuint64x4_t x) {} +void fn_mf8x4 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, svmfloat8x4_t x) {} void fn_bf16x4 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, svbfloat16x4_t x) {} void fn_f16x4 (float d0, float d1, float d2, float d3, @@ -110,6 +118,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u32\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_u64\n} } } */ +/* { dg-final { scan-assembler {\t\.variant_pcs\tfn_mf8\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_bf16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f16\n} } } */ /* { dg-final { scan-assembler {\t\.variant_pcs\tfn_f32\n} } } */ @@ -123,6 +132,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u16x2\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u32x2\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u64x2\n} } } */ +/* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_mf8x2\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_bf16x2\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f16x2\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f32x2\n} } } */ @@ -136,6 +146,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u16x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u32x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u64x3\n} } } */ +/* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_mf8x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_bf16x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f16x3\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f32x3\n} } } */ @@ -149,6 +160,7 @@ void fn_f64x4 (float d0, float d1, float d2, float d3, /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u32x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_u64x4\n} } } */ +/* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_mf8x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_bf16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f16x4\n} } } */ /* { dg-final { scan-assembler-not {\t\.variant_pcs\tfn_f32x4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_7.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_7.c index 4f3ff810778..bb1cee0db56 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_7.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/annotate_7.c @@ -18,6 +18,8 @@ void fn_u32 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint32_t x) {} void fn_u64 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint64_t x) {} +void fn_mf8 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, float d7, svmfloat8_t x) {} void fn_bf16 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svbfloat16_t x) {} void fn_f16 (float d0, float d1, float d2, float d3, @@ -43,6 +45,8 @@ void fn_u32x2 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint32x2_t x) {} void fn_u64x2 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint64x2_t x) {} +void fn_mf8x2 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, float d7, svmfloat8x2_t x) {} void fn_bf16x2 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svbfloat16x2_t x) {} void fn_f16x2 (float d0, float d1, float d2, float d3, @@ -68,6 +72,8 @@ void fn_u32x3 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint32x3_t x) {} void fn_u64x3 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint64x3_t x) {} +void fn_mf8x3 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, float d7, svmfloat8x3_t x) {} void fn_bf16x3 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svbfloat16x3_t x) {} void fn_f16x3 (float d0, float d1, float d2, float d3, @@ -93,6 +99,8 @@ void fn_u32x4 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint32x4_t x) {} void fn_u64x4 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svuint64x4_t x) {} +void fn_mf8x4 (float d0, float d1, float d2, float d3, + float d4, float d5, float d6, float d7, svmfloat8x4_t x) {} void fn_bf16x4 (float d0, float d1, float d2, float d3, float d4, float d5, float d6, float d7, svbfloat16x4_t x) {} void fn_f16x4 (float d0, float d1, float d2, float d3, diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_be_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_be_mf8.c new file mode 100644 index 00000000000..3bd18a92393 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_be_mf8.c @@ -0,0 +1,63 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O -mbig-endian -fno-stack-clash-protection -g" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#pragma GCC aarch64 "arm_sve.h" + +/* +** callee: +** addvl sp, sp, #-1 +** str (p[4-7]), \[sp\] +** ptrue \1\.b, all +** ( +** ld1b (z[0-9]+\.b), \1/z, \[x1, #1, mul vl\] +** ld1b (z[0-9]+\.b), \1/z, \[x1\] +** st2b {\3 - \2}, p0, \[x0\] +** | +** ld1b (z[0-9]+\.b), \1/z, \[x1\] +** ld1b (z[0-9]+\.b), \1/z, \[x1, #1, mul vl\] +** st2b {\4 - \5}, p0, \[x0\] +** ) +** st4b {z0\.b - z3\.b}, p1, \[x0\] +** st3b {z4\.b - z6\.b}, p2, \[x0\] +** st1b z7\.b, p3, \[x0\] +** ldr \1, \[sp\] +** addvl sp, sp, #1 +** ret +*/ +void __attribute__((noipa)) +callee (void *x0, svmfloat8x4_t z0, svmfloat8x3_t z4, svmfloat8x2_t stack, + svmfloat8_t z7, svbool_t p0, svbool_t p1, svbool_t p2, svbool_t p3) +{ + svst2 (p0, x0, stack); + svst4 (p1, x0, z0); + svst3 (p2, x0, z4); + svst1_mf8 (p3, x0, z7); +} + +void __attribute__((noipa)) +caller (void *x0) +{ + svbool_t pg; + pg = svptrue_b8 (); + callee (x0, + svld4_vnum_mf8 (pg, x0, -8), + svld3_vnum_mf8 (pg, x0, -3), + svld2_vnum_mf8 (pg, x0, 0), + svld1_vnum_mf8 (pg, x0, 2), + svptrue_pat_b8 (SV_VL1), + svptrue_pat_b16 (SV_VL2), + svptrue_pat_b32 (SV_VL3), + svptrue_pat_b64 (SV_VL4)); +} + +/* { dg-final { scan-assembler {\tld4b\t{z0\.b - z3\.b}, p[0-7]/z, \[x0, #-8, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld3b\t{z4\.b - z6\.b}, p[0-7]/z, \[x0, #-3, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld1b\tz7\.b, p[0-7]/z, \[x0, #2, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tmov\tx1, sp\n} } } */ +/* { dg-final { scan-assembler {\tld2b\t{(z[0-9]+\.b) - z[0-9]+\.b}.*\tst1b\t\1, p[0-7], \[(?:x1|sp)\]\n} } } */ +/* { dg-final { scan-assembler {\tld2b\t{z[0-9]+\.b - (z[0-9]+\.b)}.*\tst1b\t\1, p[0-7], \[(?:x1|sp), #1, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp0\.b, vl1\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp1\.h, vl2\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp2\.s, vl3\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp3\.d, vl4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_le_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_le_mf8.c new file mode 100644 index 00000000000..6106240e648 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_5_le_mf8.c @@ -0,0 +1,58 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O -mlittle-endian -fno-stack-clash-protection -g" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#pragma GCC aarch64 "arm_sve.h" + +/* +** callee: +** ( +** ldr (z[0-9]+), \[x1, #1, mul vl\] +** ldr (z[0-9]+), \[x1\] +** st2b {\2\.b - \1\.b}, p0, \[x0\] +** | +** ldr (z[0-9]+), \[x1\] +** ldr (z[0-9]+), \[x1, #1, mul vl\] +** st2b {\3\.b - \4\.b}, p0, \[x0\] +** ) +** st4b {z0\.b - z3\.b}, p1, \[x0\] +** st3b {z4\.b - z6\.b}, p2, \[x0\] +** st1b z7\.b, p3, \[x0\] +** ret +*/ +void __attribute__((noipa)) +callee (void *x0, svmfloat8x4_t z0, svmfloat8x3_t z4, svmfloat8x2_t stack, + svmfloat8_t z7, svbool_t p0, svbool_t p1, svbool_t p2, svbool_t p3) +{ + svst2 (p0, x0, stack); + svst4 (p1, x0, z0); + svst3 (p2, x0, z4); + svst1_mf8 (p3, x0, z7); +} + +void __attribute__((noipa)) +caller (void *x0) +{ + svbool_t pg; + pg = svptrue_b8 (); + callee (x0, + svld4_vnum_mf8 (pg, x0, -8), + svld3_vnum_mf8 (pg, x0, -3), + svld2_vnum_mf8 (pg, x0, 0), + svld1_vnum_mf8 (pg, x0, 2), + svptrue_pat_b8 (SV_VL1), + svptrue_pat_b16 (SV_VL2), + svptrue_pat_b32 (SV_VL3), + svptrue_pat_b64 (SV_VL4)); +} + +/* { dg-final { scan-assembler {\tld4b\t{z0\.b - z3\.b}, p[0-7]/z, \[x0, #-8, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld3b\t{z4\.b - z6\.b}, p[0-7]/z, \[x0, #-3, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld1b\tz7\.b, p[0-7]/z, \[x0, #2, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tmov\tx1, sp\n} } } */ +/* { dg-final { scan-assembler {\tld2b\t{(z[0-9]+)\.b - z[0-9]+\.b}.*\tstr\t\1, \[(?:x1|sp)\]\n} } } */ +/* { dg-final { scan-assembler {\tld2b\t{z[0-9]+\.b - (z[0-9]+)\.b}.*\tstr\t\1, \[(?:x1|sp), #1, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp0\.b, vl1\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp1\.h, vl2\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp2\.s, vl3\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp3\.d, vl4\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_be_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_be_mf8.c new file mode 100644 index 00000000000..80af390b944 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_be_mf8.c @@ -0,0 +1,71 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O -mbig-endian -fno-stack-clash-protection -fno-cprop-registers -fdisable-rtl-combine -g" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#pragma GCC aarch64 "arm_sve.h" + +/* +** callee1: +** ptrue p3\.b, all +** ... +** ld1b (z[0-9]+\.b), p3/z, \[x1, #3, mul vl\] +** ... +** st4b {z[0-9]+\.b - \1}, p0, \[x0\] +** st2b {z3\.b - z4\.b}, p1, \[x0\] +** st3b {z5\.b - z7\.b}, p2, \[x0\] +** ret +*/ +void __attribute__((noipa)) +callee1 (void *x0, svmfloat8x3_t z0, svmfloat8x2_t z3, svmfloat8x3_t z5, + svmfloat8x4_t stack1, svmfloat8_t stack2, svbool_t p0, + svbool_t p1, svbool_t p2) +{ + svst4_mf8 (p0, x0, stack1); + svst2_mf8 (p1, x0, z3); + svst3_mf8 (p2, x0, z5); +} + +/* +** callee2: +** ptrue p3\.b, all +** ld1b (z[0-9]+\.b), p3/z, \[x2\] +** st1b \1, p0, \[x0\] +** st2b {z3\.b - z4\.b}, p1, \[x0\] +** st3b {z0\.b - z2\.b}, p2, \[x0\] +** ret +*/ +void __attribute__((noipa)) +callee2 (void *x0, svmfloat8x3_t z0, svmfloat8x2_t z3, svmfloat8x3_t z5, + svmfloat8x4_t stack1, svmfloat8_t stack2, svbool_t p0, + svbool_t p1, svbool_t p2) +{ + svst1_mf8 (p0, x0, stack2); + svst2_mf8 (p1, x0, z3); + svst3_mf8 (p2, x0, z0); +} + +void __attribute__((noipa)) +caller (void *x0) +{ + svbool_t pg; + pg = svptrue_b8 (); + callee1 (x0, + svld3_vnum_mf8 (pg, x0, -9), + svld2_vnum_mf8 (pg, x0, -2), + svld3_vnum_mf8 (pg, x0, 0), + svld4_vnum_mf8 (pg, x0, 8), + svld1_vnum_mf8 (pg, x0, 5), + svptrue_pat_b8 (SV_VL1), + svptrue_pat_b16 (SV_VL2), + svptrue_pat_b32 (SV_VL3)); +} + +/* { dg-final { scan-assembler {\tld3b\t{z0\.b - z2\.b}, p[0-7]/z, \[x0, #-9, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld2b\t{z3\.b - z4\.b}, p[0-7]/z, \[x0, #-2, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld3b\t{z5\.b - z7\.b}, p[0-7]/z, \[x0\]\n} } } */ +/* { dg-final { scan-assembler {\tld4b\t{(z[0-9]+\.b) - z[0-9]+\.b}.*\tst1b\t\1, p[0-7], \[x1\]\n} } } */ +/* { dg-final { scan-assembler {\tld4b\t{z[0-9]+\.b - (z[0-9]+\.b)}.*\tst1b\t\1, p[0-7], \[x1, #3, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld1b\t(z[0-9]+\.b), p[0-7]/z, \[x0, #5, mul vl\]\n.*\tst1b\t\1, p[0-7], \[x2\]\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp0\.b, vl1\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp1\.h, vl2\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp2\.s, vl3\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_le_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_le_mf8.c new file mode 100644 index 00000000000..e32089947c7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/args_6_le_mf8.c @@ -0,0 +1,70 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O -mlittle-endian -fno-stack-clash-protection -fno-cprop-registers -fdisable-rtl-combine -g" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#pragma GCC aarch64 "arm_sve.h" + +/* +** callee1: +** ... +** ldr (z[0-9]+), \[x1, #3, mul vl\] +** ... +** st4b {z[0-9]+\.b - \1\.b}, p0, \[x0\] +** st2b {z3\.b - z4\.b}, p1, \[x0\] +** st3b {z5\.b - z7\.b}, p2, \[x0\] +** ret +*/ +void __attribute__((noipa)) +callee1 (void *x0, svmfloat8x3_t z0, svmfloat8x2_t z3, svmfloat8x3_t z5, + svmfloat8x4_t stack1, svmfloat8_t stack2, svbool_t p0, + svbool_t p1, svbool_t p2) +{ + svst4_mf8 (p0, x0, stack1); + svst2_mf8 (p1, x0, z3); + svst3_mf8 (p2, x0, z5); +} + +/* +** callee2: +** ptrue p3\.b, all +** ld1b (z[0-9]+\.b), p3/z, \[x2\] +** st1b \1, p0, \[x0\] +** st2b {z3\.b - z4\.b}, p1, \[x0\] +** st3b {z0\.b - z2\.b}, p2, \[x0\] +** ret +*/ +void __attribute__((noipa)) +callee2 (void *x0, svmfloat8x3_t z0, svmfloat8x2_t z3, svmfloat8x3_t z5, + svmfloat8x4_t stack1, svmfloat8_t stack2, svbool_t p0, + svbool_t p1, svbool_t p2) +{ + svst1_mf8 (p0, x0, stack2); + svst2_mf8 (p1, x0, z3); + svst3_mf8 (p2, x0, z0); +} + +void __attribute__((noipa)) +caller (void *x0) +{ + svbool_t pg; + pg = svptrue_b8 (); + callee1 (x0, + svld3_vnum_mf8 (pg, x0, -9), + svld2_vnum_mf8 (pg, x0, -2), + svld3_vnum_mf8 (pg, x0, 0), + svld4_vnum_mf8 (pg, x0, 8), + svld1_vnum_mf8 (pg, x0, 5), + svptrue_pat_b8 (SV_VL1), + svptrue_pat_b16 (SV_VL2), + svptrue_pat_b32 (SV_VL3)); +} + +/* { dg-final { scan-assembler {\tld3b\t{z0\.b - z2\.b}, p[0-7]/z, \[x0, #-9, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld2b\t{z3\.b - z4\.b}, p[0-7]/z, \[x0, #-2, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld3b\t{z5\.b - z7\.b}, p[0-7]/z, \[x0\]\n} } } */ +/* { dg-final { scan-assembler {\tld4b\t{(z[0-9]+)\.b - z[0-9]+\.b}.*\tstr\t\1, \[x1\]\n} } } */ +/* { dg-final { scan-assembler {\tld4b\t{z[0-9]+\.b - (z[0-9]+)\.b}.*\tstr\t\1, \[x1, #3, mul vl\]\n} } } */ +/* { dg-final { scan-assembler {\tld1b\t(z[0-9]+\.b), p[0-7]/z, \[x0, #5, mul vl\]\n.*\tst1b\t\1, p[0-7], \[x2\]\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp0\.b, vl1\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp1\.h, vl2\n} } } */ +/* { dg-final { scan-assembler {\tptrue\tp2\.s, vl3\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_1.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_1.c index e5fceb14bbe..009a987fc31 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_1.c @@ -2,6 +2,7 @@ #include +typedef mfloat8_t mfloat8x32_t __attribute__((vector_size (32))); typedef bfloat16_t bfloat16x16_t __attribute__((vector_size (32))); typedef float16_t float16x16_t __attribute__((vector_size (32))); typedef float32_t float32x8_t __attribute__((vector_size (32))); @@ -15,6 +16,7 @@ typedef uint16_t uint16x16_t __attribute__((vector_size (32))); typedef uint32_t uint32x8_t __attribute__((vector_size (32))); typedef uint64_t uint64x4_t __attribute__((vector_size (32))); +void mfloat8_callee (mfloat8x32_t); void bfloat16_callee (bfloat16x16_t); void float16_callee (float16x16_t); void float32_callee (float32x8_t); @@ -28,6 +30,12 @@ void uint16_callee (uint16x16_t); void uint32_callee (uint32x8_t); void uint64_callee (uint64x4_t); +void +mfloat8_caller (mfloat8_t val) +{ + mfloat8_callee (svdup_mf8 (val)); +} + void bfloat16_caller (bfloat16_t val) { @@ -100,8 +108,8 @@ uint64_caller (void) uint64_callee (svindex_u64 (1, 4)); } -/* { dg-final { scan-assembler-times {\tst1b\tz[0-9]+\.b, p[0-7], \[x0\]} 2 } } */ +/* { dg-final { scan-assembler-times {\tst1b\tz[0-9]+\.b, p[0-7], \[x0\]} 3 } } */ /* { dg-final { scan-assembler-times {\tst1h\tz[0-9]+\.h, p[0-7], \[x0\]} 4 } } */ /* { dg-final { scan-assembler-times {\tst1w\tz[0-9]+\.s, p[0-7], \[x0\]} 3 } } */ /* { dg-final { scan-assembler-times {\tst1d\tz[0-9]+\.d, p[0-7], \[x0\]} 3 } } */ -/* { dg-final { scan-assembler-times {\tadd\tx0, sp, #?16\n} 12 } } */ +/* { dg-final { scan-assembler-times {\tadd\tx0, sp, #?16\n} 13 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_2.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_2.c index 875567f0197..375ac16495a 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_2.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_2.c @@ -2,6 +2,7 @@ #include +typedef mfloat8_t mfloat8x32_t __attribute__((vector_size (32))); typedef bfloat16_t bfloat16x16_t __attribute__((vector_size (32))); typedef float16_t float16x16_t __attribute__((vector_size (32))); typedef float32_t float32x8_t __attribute__((vector_size (32))); @@ -15,6 +16,7 @@ typedef uint16_t uint16x16_t __attribute__((vector_size (32))); typedef uint32_t uint32x8_t __attribute__((vector_size (32))); typedef uint64_t uint64x4_t __attribute__((vector_size (32))); +void mfloat8_callee (svmfloat8_t); void bfloat16_callee (svbfloat16_t); void float16_callee (svfloat16_t); void float32_callee (svfloat32_t); @@ -28,6 +30,12 @@ void uint16_callee (svuint16_t); void uint32_callee (svuint32_t); void uint64_callee (svuint64_t); +void +mfloat8_caller (mfloat8x32_t arg) +{ + mfloat8_callee (arg); +} + void bfloat16_caller (bfloat16x16_t arg) { @@ -100,7 +108,7 @@ uint64_caller (uint64x4_t arg) uint64_callee (arg); } -/* { dg-final { scan-assembler-times {\tld1b\tz0\.b, p[0-7]/z, \[x0\]} 2 } } */ +/* { dg-final { scan-assembler-times {\tld1b\tz0\.b, p[0-7]/z, \[x0\]} 3 } } */ /* { dg-final { scan-assembler-times {\tld1h\tz0\.h, p[0-7]/z, \[x0\]} 4 } } */ /* { dg-final { scan-assembler-times {\tld1w\tz0\.s, p[0-7]/z, \[x0\]} 3 } } */ /* { dg-final { scan-assembler-times {\tld1d\tz0\.d, p[0-7]/z, \[x0\]} 3 } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4.c index 91fdd3c202e..2e7d1ecf621 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4.c @@ -25,6 +25,14 @@ CALLEE (s8, __SVInt8_t) */ CALLEE (u8, __SVUint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, all +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, __SVMfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, all @@ -115,7 +123,7 @@ CALLEE (f64, __SVFloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, __SVInt8_t) */ CALLER (u8, __SVUint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, __SVMfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, __SVFloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, __SVBfloat16_t) +CALLER_NON_NUMERIC (bf16, __SVBfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_1024.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_1024.c index 7d824caae1b..cd1b1414e71 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_1024.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_1024.c @@ -25,6 +25,14 @@ CALLEE (s8, __SVInt8_t) */ CALLEE (u8, __SVUint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl128 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, __SVMfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl128 @@ -115,7 +123,7 @@ CALLEE (f64, __SVFloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, __SVInt8_t) */ CALLER (u8, __SVUint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, __SVMfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, __SVFloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, __SVBfloat16_t) +CALLER_NON_NUMERIC (bf16, __SVBfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_128.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_128.c index e0aa3a5fa68..450fa795b6e 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_128.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_128.c @@ -25,6 +25,14 @@ CALLEE (s8, __SVInt8_t) */ CALLEE (u8, __SVUint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl16 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, __SVMfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl16 @@ -115,7 +123,7 @@ CALLEE (f64, __SVFloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, __SVInt8_t) */ CALLER (u8, __SVUint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, __SVMfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, __SVFloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, __SVBfloat16_t) +CALLER_NON_NUMERIC (bf16, __SVBfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_2048.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_2048.c index 3238015d9eb..9ae14e481dc 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_2048.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_2048.c @@ -25,6 +25,14 @@ CALLEE (s8, __SVInt8_t) */ CALLEE (u8, __SVUint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl256 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, __SVMfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl256 @@ -115,7 +123,7 @@ CALLEE (f64, __SVFloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, __SVInt8_t) */ CALLER (u8, __SVUint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, __SVMfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, __SVFloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, __SVBfloat16_t) +CALLER_NON_NUMERIC (bf16, __SVBfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_256.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_256.c index 50861098934..636da74416b 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_256.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_256.c @@ -25,6 +25,14 @@ CALLEE (s8, __SVInt8_t) */ CALLEE (u8, __SVUint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl32 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, __SVMfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl32 @@ -115,7 +123,7 @@ CALLEE (f64, __SVFloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, __SVInt8_t) */ CALLER (u8, __SVUint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, __SVMfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, __SVFloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, __SVBfloat16_t) +CALLER_NON_NUMERIC (bf16, __SVBfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_512.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_512.c index 300dacce955..04f4b5f63ad 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_512.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_4_512.c @@ -25,6 +25,14 @@ CALLEE (s8, __SVInt8_t) */ CALLEE (u8, __SVUint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl64 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, __SVMfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl64 @@ -115,7 +123,7 @@ CALLEE (f64, __SVFloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, __SVInt8_t) */ CALLER (u8, __SVUint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, __SVMfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, __SVFloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, __SVBfloat16_t) +CALLER_NON_NUMERIC (bf16, __SVBfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5.c index 0a840a38384..7f73a5a5935 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5.c @@ -27,6 +27,14 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, all +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, all @@ -115,7 +123,7 @@ CALLEE (f64, svfloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, svmfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, svfloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, svbfloat16_t) +CALLER_NON_NUMERIC (bf16, svbfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_1024.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_1024.c index 18cefbff1e6..dddf2936d10 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_1024.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_1024.c @@ -27,6 +27,14 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl128 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl128 @@ -115,7 +123,7 @@ CALLEE (f64, svfloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, svmfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, svfloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, svbfloat16_t) +CALLER_NON_NUMERIC (bf16, svbfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_128.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_128.c index c622ed55674..2f1878b16a6 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_128.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_128.c @@ -27,6 +27,14 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl16 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl16 @@ -115,7 +123,7 @@ CALLEE (f64, svfloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, svmfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, svfloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, svbfloat16_t) +CALLER_NON_NUMERIC (bf16, svbfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_2048.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_2048.c index 3286280687d..93f45529e37 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_2048.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_2048.c @@ -27,6 +27,14 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl256 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl256 @@ -115,7 +123,7 @@ CALLEE (f64, svfloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, svmfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, svfloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, svbfloat16_t) +CALLER_NON_NUMERIC (bf16, svbfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_256.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_256.c index 3c6afa2fdf1..2d87a0467c6 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_256.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_256.c @@ -27,6 +27,14 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl32 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl32 @@ -115,7 +123,7 @@ CALLEE (f64, svfloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, svmfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, svfloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, svbfloat16_t) +CALLER_NON_NUMERIC (bf16, svbfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_512.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_512.c index bb7d3ebf9d4..8352ddc3491 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_512.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_5_512.c @@ -27,6 +27,14 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl64 +** ld1b z0\.b, \1/z, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl64 @@ -115,7 +123,7 @@ CALLEE (f64, svfloat64_t) return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ } -#define CALLER_BF16(SUFFIX, TYPE) \ +#define CALLER_NON_NUMERIC(SUFFIX, TYPE) \ typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ __attribute__((noipa)) \ caller_##SUFFIX (TYPE *ptr1) \ @@ -147,6 +155,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** umov w0, v0.b\[0\] +** ldp x29, x30, \[sp\], 16 +** ret +*/ +CALLER_NON_NUMERIC (mf8, svmfloat8_t) + /* ** caller_s16: ** ... @@ -189,7 +207,7 @@ CALLER (f16, svfloat16_t) ** ldp x29, x30, \[sp\], 16 ** ret */ -CALLER_BF16 (bf16, svbfloat16_t) +CALLER_NON_NUMERIC (bf16, svbfloat16_t) /* ** caller_s32: diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6.c index 1bc2f43bcf9..73652a95d5d 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6.c @@ -6,6 +6,7 @@ typedef int8_t svint8_t __attribute__ ((vector_size (32))); typedef uint8_t svuint8_t __attribute__ ((vector_size (32))); +typedef __mfp8 svmfloat8_t __attribute__ ((vector_size (32))); typedef int16_t svint16_t __attribute__ ((vector_size (32))); typedef uint16_t svuint16_t __attribute__ ((vector_size (32))); @@ -53,6 +54,19 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_u8: +** ( +** ld1 ({v.*}), \[x0\] +** st1 \1, \[x8\] +** | +** ldp (q[0-9]+, q[0-9]+), \[x0\] +** stp \2, \[x8\] +** ) +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ( @@ -171,6 +185,16 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** ldrb w0, \[sp, 16\] +** ldp x29, x30, \[sp\], 48 +** ret +*/ +CALLER (mf8, svmfloat8_t) + /* ** caller_s16: ** ... diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_1024.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_1024.c index 6c716ef7c34..6b58dd48eab 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_1024.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_1024.c @@ -6,6 +6,7 @@ typedef int8_t svint8_t __attribute__ ((vector_size (128))); typedef uint8_t svuint8_t __attribute__ ((vector_size (128))); +typedef __mfp8 svmfloat8_t __attribute__ ((vector_size (128))); typedef int16_t svint16_t __attribute__ ((vector_size (128))); typedef uint16_t svuint16_t __attribute__ ((vector_size (128))); @@ -45,6 +46,15 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl128 +** ld1b (z[0-9]+)\.b, \1/z, \[x0\] +** st1b \2\.b, \1, \[x8\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl128 @@ -166,6 +176,18 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[[^]]*\] +** st1b \1, \2, \[[^]]*\] +** ... +** ret +*/ +CALLER (mf8, svmfloat8_t) + /* ** caller_s16: ** ... diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_128.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_128.c index 4f190fd1444..18ace1985fe 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_128.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_128.c @@ -6,6 +6,7 @@ typedef int8_t svint8_t __attribute__ ((vector_size (16))); typedef uint8_t svuint8_t __attribute__ ((vector_size (16))); +typedef __mfp8 svmfloat8_t __attribute__ ((vector_size (16))); typedef int16_t svint16_t __attribute__ ((vector_size (16))); typedef uint16_t svuint16_t __attribute__ ((vector_size (16))); @@ -41,6 +42,13 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ldr q0, \[x0\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ldr q0, \[x0\] @@ -140,6 +148,17 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** ... +** str q0, \[[^]]*\] +** ... +** ret +*/ +CALLER (mf8, svmfloat8_t) + /* ** caller_s16: ** ... diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_2048.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_2048.c index 0eb9607d9db..0def3b5f2da 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_2048.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_2048.c @@ -6,6 +6,7 @@ typedef int8_t svint8_t __attribute__ ((vector_size (256))); typedef uint8_t svuint8_t __attribute__ ((vector_size (256))); +typedef __mfp8 svmfloat8_t __attribute__ ((vector_size (256))); typedef int16_t svint16_t __attribute__ ((vector_size (256))); typedef uint16_t svuint16_t __attribute__ ((vector_size (256))); @@ -45,6 +46,15 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl256 +** ld1b (z[0-9]+)\.b, \1/z, \[x0\] +** st1b \2\.b, \1, \[x8\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl256 @@ -166,6 +176,18 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[[^]]*\] +** st1b \1, \2, \[[^]]*\] +** ... +** ret +*/ +CALLER (mf8, svmfloat8_t) + /* ** caller_s16: ** ... diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_256.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_256.c index 749eb332599..17055521f7d 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_256.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_256.c @@ -6,6 +6,7 @@ typedef int8_t svint8_t __attribute__ ((vector_size (32))); typedef uint8_t svuint8_t __attribute__ ((vector_size (32))); +typedef __mfp8 svmfloat8_t __attribute__ ((vector_size (32))); typedef int16_t svint16_t __attribute__ ((vector_size (32))); typedef uint16_t svuint16_t __attribute__ ((vector_size (32))); @@ -45,6 +46,15 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl32 +** ld1b (z[0-9]+)\.b, \1/z, \[x0\] +** st1b \2\.b, \1, \[x8\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl32 @@ -166,6 +176,18 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[[^]]*\] +** st1b \1, \2, \[[^]]*\] +** ... +** ret +*/ +CALLER (mf8, svmfloat8_t) + /* ** caller_s16: ** ... diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_512.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_512.c index f6a64cc4944..324d0973ece 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_512.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_6_512.c @@ -6,6 +6,7 @@ typedef int8_t svint8_t __attribute__ ((vector_size (64))); typedef uint8_t svuint8_t __attribute__ ((vector_size (64))); +typedef __mfp8 svmfloat8_t __attribute__ ((vector_size (64))); typedef int16_t svint16_t __attribute__ ((vector_size (64))); typedef uint16_t svuint16_t __attribute__ ((vector_size (64))); @@ -45,6 +46,15 @@ CALLEE (s8, svint8_t) */ CALLEE (u8, svuint8_t) +/* +** callee_mf8: +** ptrue (p[0-7])\.b, vl64 +** ld1b (z[0-9]+)\.b, \1/z, \[x0\] +** st1b \2\.b, \1, \[x8\] +** ret +*/ +CALLEE (mf8, svmfloat8_t) + /* ** callee_s16: ** ptrue (p[0-7])\.b, vl64 @@ -166,6 +176,18 @@ CALLER (s8, svint8_t) */ CALLER (u8, svuint8_t) +/* +** caller_mf8: +** ... +** bl callee_mf8 +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[[^]]*\] +** st1b \1, \2, \[[^]]*\] +** ... +** ret +*/ +CALLER (mf8, svmfloat8_t) + /* ** caller_s16: ** ... diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_7.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_7.c index 55456a3b4cb..95f944b18e6 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_7.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_7.c @@ -60,6 +60,34 @@ caller_u8 (void) return svtrn2 (svget2 (res, 1), svget2 (res, 0)); } +/* +** callee_mf8: +** mov z0\.b, w2 +** mov z1\.b, w3 +** ret +*/ +svmfloat8x2_t __attribute__((noipa)) +callee_mf8 (mfloat8_t h0, mfloat8_t h1, mfloat8_t h2, mfloat8_t h3) +{ + return svcreate2 (svdup_mf8 (h2), svdup_mf8 (h3)); +} + +/* +** caller_mf8: +** ... +** bl callee_mf8 +** trn2 z0\.b, z1\.b, z0\.b +** ldp x29, x30, \[sp\], 16 +** ret +*/ +svmfloat8_t __attribute__((noipa)) +caller_mf8 (mfloat8_t h0, mfloat8_t h1, mfloat8_t h2, mfloat8_t h3) +{ + svmfloat8x2_t res; + res = callee_mf8 (h0, h1, h2, h3); + return svtrn2 (svget2 (res, 1), svget2 (res, 0)); +} + /* ** callee_s16: ** mov z0\.h, #1 diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_8.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_8.c index 9581811e7f3..ca47d3125f9 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_8.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_8.c @@ -66,6 +66,35 @@ caller_u8 (void) svget3 (res, 0), svget3 (res, 1), svget3 (res, 2)); } +/* +** callee_mf8: +** mov z0\.b, w0 +** mov z1\.b, w1 +** mov z2\.b, w2 +** ret +*/ +svmfloat8x3_t __attribute__((noipa)) +callee_mf8 (mfloat8_t h0, mfloat8_t h1, mfloat8_t h2) +{ + return svcreate3 (svdup_mf8 (h0), svdup_mf8 (h1), svdup_mf8 (h2)); +} + +/* +** caller_mf8: +** ... +** bl callee_mf8 +** trn2 z0\.b, z0\.b, z2\.b +** ldp x29, x30, \[sp\], 16 +** ret +*/ +svmfloat8_t __attribute__((noipa)) +caller_mf8 (mfloat8_t h0, mfloat8_t h1, mfloat8_t h2) +{ + svmfloat8x3_t res; + res = callee_mf8 (h0, h1, h2); + return svtrn2 (svget3 (res, 0), svget3 (res, 2)); +} + /* ** callee_s16: ** mov z0\.h, #1 diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_9.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_9.c index 3b2604e6068..f1909e139f0 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_9.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/return_9.c @@ -74,6 +74,39 @@ caller_u8 (void) svget4 (res, 3))); } +/* +** callee_mf8: +** mov z0\.b, w4 +** mov z1\.b, w5 +** mov z2\.b, w6 +** mov z3\.b, w7 +** ret +*/ +svmfloat8x4_t __attribute__((noipa)) +callee_mf8 (mfloat8_t h0, mfloat8_t h1, mfloat8_t h2, mfloat8_t h3, + mfloat8_t h4, mfloat8_t h5, mfloat8_t h6, mfloat8_t h7) +{ + return svcreate4 (svdup_mf8 (h4), svdup_mf8 (h5), + svdup_mf8 (h6), svdup_mf8 (h7)); +} + +/* +** caller_mf8: +** ... +** bl callee_mf8 +** trn2 z0\.b, z0\.b, z3\.b +** ldp x29, x30, \[sp\], 16 +** ret +*/ +svmfloat8_t __attribute__((noipa)) +caller_mf8 (mfloat8_t h0, mfloat8_t h1, mfloat8_t h2, mfloat8_t h3, + mfloat8_t h4, mfloat8_t h5, mfloat8_t h6, mfloat8_t h7) +{ + svmfloat8x4_t res; + res = callee_mf8 (h0, h1, h2, h3, h4, h5, h6, h7); + return svtrn2 (svget4 (res, 0), svget4 (res, 3)); +} + /* ** callee_s16: ** mov z0\.h, #1 diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/varargs_2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve/pcs/varargs_2_mf8.c new file mode 100644 index 00000000000..e7057c0548e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/varargs_2_mf8.c @@ -0,0 +1,170 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-stack-clash-protection -fno-cprop-registers -fdisable-rtl-combine -g" } */ +/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */ + +#include +#include + +/* +** callee_0: +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[x1\] +** ... +** st1b \1, \2, \[x0\] +** ... +** ret +*/ +void __attribute__((noipa)) +callee_0 (mfloat8_t *ptr, ...) +{ + va_list va; + svmfloat8_t vec; + + va_start (va, ptr); + vec = va_arg (va, svmfloat8_t); + va_end (va); + svst1 (svptrue_b8 (), ptr, vec); +} + +/* +** caller_0: +** ... +** mov (z[0-9]+\.b), w1 +** ... +** st1b \1, p[0-7], \[x1\] +** ... +** ret +*/ +void __attribute__((noipa)) +caller_0 (mfloat8_t *ptr, mfloat8_t in) +{ + callee_0 (ptr, svdup_mf8 (in)); +} + +/* +** callee_1: +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[x2\] +** ... +** st1b \1, p[0-7], \[x0\] +** ... +** ret +*/ +void __attribute__((noipa)) +callee_1 (mfloat8_t *ptr, ...) +{ + va_list va; + svmfloat8_t vec; + + va_start (va, ptr); + va_arg (va, int); + vec = va_arg (va, svmfloat8_t); + va_end (va); + svst1 (svptrue_b8 (), ptr, vec); +} + +/* +** caller_1: +** ... +** mov (z[0-9]+\.b), w1 +** ... +** st1b \1, p[0-7], \[x2\] +** ... +** ret +*/ +void __attribute__((noipa)) +caller_1 (mfloat8_t *ptr, mfloat8_t in) +{ + callee_1 (ptr, 1, svdup_mf8 (in)); +} + +/* +** callee_7: +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[x7\] +** ... +** st1b \1, p[0-7], \[x0\] +** ... +** ret +*/ +void __attribute__((noipa)) +callee_7 (mfloat8_t *ptr, ...) +{ + va_list va; + svmfloat8_t vec; + + va_start (va, ptr); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + vec = va_arg (va, svmfloat8_t); + va_end (va); + svst1 (svptrue_b8 (), ptr, vec); +} + +/* +** caller_7: +** ... +** mov (z[0-9]+\.b), w1 +** ... +** st1b \1, p[0-7], \[x7\] +** ... +** ret +*/ +void __attribute__((noipa)) +caller_7 (mfloat8_t *ptr, mfloat8_t in) +{ + callee_7 (ptr, 1, 2, 3, 4, 5, 6, svdup_mf8 (in)); +} + +/* FIXME: We should be able to get rid of the va_list object. */ +/* +** callee_8: +** sub sp, sp, #([0-9]+) +** ... +** ldr (x[0-9]+), \[sp, \1\] +** ... +** ld1b (z[0-9]+\.b), (p[0-7])/z, \[\2\] +** ... +** st1b \3, \4, \[x0\] +** ... +** ret +*/ +void __attribute__((noipa)) +callee_8 (mfloat8_t *ptr, ...) +{ + va_list va; + svmfloat8_t vec; + + va_start (va, ptr); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + va_arg (va, int); + vec = va_arg (va, svmfloat8_t); + va_end (va); + svst1 (svptrue_b8 (), ptr, vec); +} + +/* +** caller_8: +** ... +** mov (z[0-9]+\.b), w1 +** ... +** st1b \1, p[0-7], \[(x[0-9]+)\] +** ... +** str \2, \[sp\] +** ... +** ret +*/ +void __attribute__((noipa)) +caller_8 (mfloat8_t *ptr, mfloat8_t in) +{ + callee_8 (ptr, 1, 2, 3, 4, 5, 6, 7, svdup_mf8 (in)); +} diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_mf8.c new file mode 100644 index 00000000000..19cc739e7ab --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_mf8.c @@ -0,0 +1,31 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** tbl2_mf8_tied1: +** tbl z0\.b, {z0\.b(?:, | - )z1\.b}, z4\.b +** ret +*/ +TEST_TBL2 (tbl2_mf8_tied1, svmfloat8x2_t, svmfloat8_t, svuint8_t, + z0_res = svtbl2_mf8 (z0, z4), + z0_res = svtbl2 (z0, z4)) + +/* +** tbl2_mf8_tied2: +** tbl z0\.b, {z1\.b(?:, | - )z2\.b}, z0\.b +** ret +*/ +TEST_TBL2_REV (tbl2_mf8_tied2, svmfloat8x2_t, svmfloat8_t, svuint8_t, + z0_res = svtbl2_mf8 (z1, z0), + z0_res = svtbl2 (z1, z0)) + +/* +** tbl2_mf8_untied: +** tbl z0\.b, {z2\.b(?:, | - )z3\.b}, z4\.b +** ret +*/ +TEST_TBL2 (tbl2_mf8_untied, svmfloat8x2_t, svmfloat8_t, svuint8_t, + z0_res = svtbl2_mf8 (z2, z4), + z0_res = svtbl2 (z2, z4)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_mf8.c new file mode 100644 index 00000000000..ba0fef3934b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_mf8.c @@ -0,0 +1,37 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ + +#include "test_sve_acle.h" + +/* +** tbx_mf8_tied1: +** tbx z0\.b, z1\.b, z4\.b +** ret +*/ +TEST_DUAL_Z (tbx_mf8_tied1, svmfloat8_t, svuint8_t, + z0 = svtbx_mf8 (z0, z1, z4), + z0 = svtbx (z0, z1, z4)) + +/* Bad RA choice: no preferred output sequence. */ +TEST_DUAL_Z (tbx_mf8_tied2, svmfloat8_t, svuint8_t, + z0 = svtbx_mf8 (z1, z0, z4), + z0 = svtbx (z1, z0, z4)) + +/* Bad RA choice: no preferred output sequence. */ +TEST_DUAL_Z_REV (tbx_mf8_tied3, svmfloat8_t, svuint8_t, + z0_res = svtbx_mf8 (z4, z5, z0), + z0_res = svtbx (z4, z5, z0)) + +/* +** tbx_mf8_untied: +** ( +** mov z0\.d, z1\.d +** tbx z0\.b, z2\.b, z4\.b +** | +** tbx z1\.b, z2\.b, z4\.b +** mov z0\.d, z1\.d +** ) +** ret +*/ +TEST_DUAL_Z (tbx_mf8_untied, svmfloat8_t, svuint8_t, + z0 = svtbx_mf8 (z1, z2, z4), + z0 = svtbx (z1, z2, z4)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_mf8.c new file mode 100644 index 00000000000..12cf0d2c365 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_mf8.c @@ -0,0 +1,50 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** whilerw_rr_mf8: +** whilerw p0\.b, x0, x1 +** ret +*/ +TEST_COMPARE_S (whilerw_rr_mf8, const mfloat8_t *, + p0 = svwhilerw_mf8 (x0, x1), + p0 = svwhilerw (x0, x1)) + +/* +** whilerw_0r_mf8: +** whilerw p0\.b, xzr, x1 +** ret +*/ +TEST_COMPARE_S (whilerw_0r_mf8, const mfloat8_t *, + p0 = svwhilerw_mf8 ((const mfloat8_t *) 0, x1), + p0 = svwhilerw ((const mfloat8_t *) 0, x1)) + +/* +** whilerw_cr_mf8: +** mov (x[0-9]+), #?1073741824 +** whilerw p0\.b, \1, x1 +** ret +*/ +TEST_COMPARE_S (whilerw_cr_mf8, const mfloat8_t *, + p0 = svwhilerw_mf8 ((const mfloat8_t *) 1073741824, x1), + p0 = svwhilerw ((const mfloat8_t *) 1073741824, x1)) + +/* +** whilerw_r0_mf8: +** whilerw p0\.b, x0, xzr +** ret +*/ +TEST_COMPARE_S (whilerw_r0_mf8, const mfloat8_t *, + p0 = svwhilerw_mf8 (x0, (const mfloat8_t *) 0), + p0 = svwhilerw (x0, (const mfloat8_t *) 0)) + +/* +** whilerw_rc_mf8: +** mov (x[0-9]+), #?1073741824 +** whilerw p0\.b, x0, \1 +** ret +*/ +TEST_COMPARE_S (whilerw_rc_mf8, const mfloat8_t *, + p0 = svwhilerw_mf8 (x0, (const mfloat8_t *) 1073741824), + p0 = svwhilerw (x0, (const mfloat8_t *) 1073741824)) diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_mf8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_mf8.c new file mode 100644 index 00000000000..c4023a2fbff --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_mf8.c @@ -0,0 +1,50 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */ + +#include "test_sve_acle.h" + +/* +** whilewr_rr_mf8: +** whilewr p0\.b, x0, x1 +** ret +*/ +TEST_COMPARE_S (whilewr_rr_mf8, const mfloat8_t *, + p0 = svwhilewr_mf8 (x0, x1), + p0 = svwhilewr (x0, x1)) + +/* +** whilewr_0r_mf8: +** whilewr p0\.b, xzr, x1 +** ret +*/ +TEST_COMPARE_S (whilewr_0r_mf8, const mfloat8_t *, + p0 = svwhilewr_mf8 ((const mfloat8_t *) 0, x1), + p0 = svwhilewr ((const mfloat8_t *) 0, x1)) + +/* +** whilewr_cr_mf8: +** mov (x[0-9]+), #?1073741824 +** whilewr p0\.b, \1, x1 +** ret +*/ +TEST_COMPARE_S (whilewr_cr_mf8, const mfloat8_t *, + p0 = svwhilewr_mf8 ((const mfloat8_t *) 1073741824, x1), + p0 = svwhilewr ((const mfloat8_t *) 1073741824, x1)) + +/* +** whilewr_r0_mf8: +** whilewr p0\.b, x0, xzr +** ret +*/ +TEST_COMPARE_S (whilewr_r0_mf8, const mfloat8_t *, + p0 = svwhilewr_mf8 (x0, (const mfloat8_t *) 0), + p0 = svwhilewr (x0, (const mfloat8_t *) 0)) + +/* +** whilewr_rc_mf8: +** mov (x[0-9]+), #?1073741824 +** whilewr p0\.b, x0, \1 +** ret +*/ +TEST_COMPARE_S (whilewr_rc_mf8, const mfloat8_t *, + p0 = svwhilewr_mf8 (x0, (const mfloat8_t *) 1073741824), + p0 = svwhilewr (x0, (const mfloat8_t *) 1073741824)) From patchwork Wed Oct 30 16:31:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Bantaloukas X-Patchwork-Id: 99831 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 86853385780D for ; Wed, 30 Oct 2024 16:33:08 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2062c.outbound.protection.outlook.com [IPv6:2a01:111:f403:2613::62c]) by sourceware.org (Postfix) with ESMTPS id 7B4A33858D28 for ; Wed, 30 Oct 2024 16:32:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7B4A33858D28 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 7B4A33858D28 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=2a01:111:f403:2613::62c ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1730305948; cv=pass; b=NBknDRzD3wyirjVvboZj1Z+6uWHBYIors5fka6j4/82P21dyFtXNTJtwkqgKjMI7jFYvvZ60hwUClNsIL0hf76/rWu/rGHdjlnUKNo/WNRaDKgza7EuPIOR/8kUavQd23foN22zhj2NlnF8ZqRBQlXkkB5Ckdu/9G362amoCHZY= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1730305948; c=relaxed/simple; bh=ZEFsMbCi/2P/loVir7hhquXkkBBAUJELMu2jIvW12+c=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=cEay94KOaKOdMbOIESPcIH9QpVhHkuPlCWc+eosKGBEwK1RlKiRhZujdiiIiDfjaxpBkjQRukn3q9wotEWdrlrNVVpUUfuOMqlBvesGIlNPPxsea2mJXD6Nwj6yR7AhQPRAbpDgBr/VADaINqX5a+/U1GoOGZ1UVbThoBfY+Rpg= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=yWRdzKvp3/jEE1v12MM3yJhsOEc7jik3Hm1O1hb3cnK989vwcBfVe5FCqaH9UUtBgVQx+AvOSo+P0qyZ5Y6W/vJZ2Zu6Gb8EEQ28UP0oIdQ4tM5RrUdPV7ZcK82706YhzPQtDflX3GKFjHZ0gPDkJbJ2FZRdhwltleUNJ9zZqECjmGNrfLxDWdpQgryR3lLZnEwuhUmZFbDOA6/KHHLqC6qjqWbqFKvQw3abQadk/uS3pI702O8s2YwYLKuA50w5xYqiP+JrFstTw/FcoX7EBaoECERpJHsf+3f7uxNLXJMzyJ0Hw2LMaXqjp74lY6T7uUaUiNpNW/+09QSsZdKGrA== ARC-Message-Signature: i=2; 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=orHzgHvEqS45o1DBmJosigfqQ08Zyz39wPSzZHXI9fU=; b=t1+Thvc2y4m0N93YgAe4t8tLi1DLngBEyTIfAG6L3zjWvKI2FQdfPTVwJWWCv6b12WDQrwQ7z3yz5Y4ayl/nhJovmhh7YlsugPdpPjMVtvGyzUqvHVgbOADs8VYBdWPfJxf+4yD8+QxUrKcKtuYr7fXnhBT+C1ghhoFeAdWkWwMPDJHVAjL2fJHVJUG3X071sm7KpC0zy35VX/FniDzS0fAL8psup/MHtoQ063C9cBY35rR2mYllfIshwTmDk5sn6Ge+QwALCnDfeDsWG9I968aaRdwDXTuK5NKfkzdUCuQTRIhTq6dHVjeHfc4bFjW7ngLn+0KMGZlAbbpc5N2feA== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.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] 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=orHzgHvEqS45o1DBmJosigfqQ08Zyz39wPSzZHXI9fU=; b=QTfmlM5RlVRyag+72ydWVYAn09o7miRowp4ZigaKM4sxYOL9deODR2OoYJK0a+Ga8wkaB9f2fCNKBVF5cNYcFKQBqqUJieQhxxV2bTdMJBsWzyZcoOtMbAlYmUE7dSy1ABnKBgFUAgktBNWjV3ygCbInhi5Q9C9Aju8IEynySAg= Received: from DU7P194CA0011.EURP194.PROD.OUTLOOK.COM (2603:10a6:10:553::17) by DB9PR08MB6394.eurprd08.prod.outlook.com (2603:10a6:10:25b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.20; Wed, 30 Oct 2024 16:32:11 +0000 Received: from DB5PEPF00014B97.eurprd02.prod.outlook.com (2603:10a6:10:553:cafe::e1) by DU7P194CA0011.outlook.office365.com (2603:10a6:10:553::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.20 via Frontend Transport; Wed, 30 Oct 2024 16:32:11 +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 DB5PEPF00014B97.mail.protection.outlook.com (10.167.8.235) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8114.16 via Frontend Transport; Wed, 30 Oct 2024 16:32:11 +0000 Received: ("Tessian outbound 4f9bb016c0c5:v490"); Wed, 30 Oct 2024 16:32:11 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 70a19156333c5a73 X-TessianGatewayMetadata: 2apU73bPhh7VYfFT44JF2pCAIvsLSzljHDb5NU3BuLUqZHet8ko3lTDSdEZqBBlZXI1CrwS+JF2IWTqAIW5B2dF67ocVpNx4M/LAlMy81vqiEnF8swa0nLsasqHxYN9Q0mDKl05f71P/dznIhnpy265a/mggrPo7I+xSt5ZrR44= X-CR-MTA-TID: 64aa7808 Received: from L3adac2044129.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 932AD138-416F-4BA5-AE3E-1560CDEE7874.1; Wed, 30 Oct 2024 16:32:05 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id L3adac2044129.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 30 Oct 2024 16:32:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZOKk5ghFqRjhN2qdZhRnc/fL/Pzi9gSCc4pynezWgNo5bi4X9pZB+tqtOJvhcE3A6YaHdKIVoNpmAfWC5Fz7JvZ+AjJaeMqiq9ddCYmUdJIrGHPaG1METLed4KkuGwnZ2M7W9D/tQJIMVaQb3Pw3Rq7i0W4hME1s+pNx+6j+fFGBgTqfJh6CgdpU2+haI1M+3Jf/VheBCwNGESXVmGxbo0UH5gYKd/FJwdL++OEGav3pqJf0Rfe5ZmIeW8kbg24E4qIsDgg9jWTg8TISuWPhEWIYMVnlCLiFSLKqFaLE0xMezzQ5yLGCg6/kKmTUH+OGpk6Q6P8Pp2ptN/ezmeq8Lw== 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=orHzgHvEqS45o1DBmJosigfqQ08Zyz39wPSzZHXI9fU=; b=R7nH0VlLG2PNK3R1qxbUNtLh5o7qKQBGdwhQSbUMfX16d3GbKi0BP5HnMXYhLWdccG+eBbkvuniD4GwsH3JZNzVqMQ40ANnaRVKaxhrkIzXorY0YNxtAOUh4JSt8xszw7VmUPNMqb92rZaxTONuf/yjbFgiQg0pQKsBadaPV3qCTl2wyl91CzXpf+0u86XAK08aCUxTyCI+wMTYZvbfLkEx4/W1977nHYRC50aRtIzus7dkMogxCUt8BO//zdbYloajh4YjgkqS9l9hlGYBg7JzJcBn9npuGjJYNRTV0f/y0NOXPQmk5E1hvWfJtPs0Lg7RhNumbgS3XWAF54p/VUA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none (0) 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=orHzgHvEqS45o1DBmJosigfqQ08Zyz39wPSzZHXI9fU=; b=QTfmlM5RlVRyag+72ydWVYAn09o7miRowp4ZigaKM4sxYOL9deODR2OoYJK0a+Ga8wkaB9f2fCNKBVF5cNYcFKQBqqUJieQhxxV2bTdMJBsWzyZcoOtMbAlYmUE7dSy1ABnKBgFUAgktBNWjV3ygCbInhi5Q9C9Aju8IEynySAg= Received: from DB3PR08CA0014.eurprd08.prod.outlook.com (2603:10a6:8::27) by AM9PR08MB5921.eurprd08.prod.outlook.com (2603:10a6:20b:2d4::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.20; Wed, 30 Oct 2024 16:32:01 +0000 Received: from DB5PEPF00014B92.eurprd02.prod.outlook.com (2603:10a6:8:0:cafe::10) by DB3PR08CA0014.outlook.office365.com (2603:10a6:8::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.20 via Frontend Transport; Wed, 30 Oct 2024 16:32:01 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; pr=C Received: from nebula.arm.com (40.67.248.234) by DB5PEPF00014B92.mail.protection.outlook.com (10.167.8.230) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8114.16 via Frontend Transport; Wed, 30 Oct 2024 16:32:01 +0000 Received: from AZ-NEU-EX06.Arm.com (10.240.25.134) by AZ-NEU-EX04.Arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Wed, 30 Oct 2024 16:32:00 +0000 Received: from AZ-NEU-EX04.Arm.com (10.251.24.32) by AZ-NEU-EX06.Arm.com (10.240.25.134) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Wed, 30 Oct 2024 16:31:59 +0000 Received: from 221664dbf3aa.euhpc2.arm.com (10.58.86.32) by mail.arm.com (10.251.24.32) with Microsoft SMTP Server id 15.1.2507.39 via Frontend Transport; Wed, 30 Oct 2024 16:31:59 +0000 From: Claudio Bantaloukas To: CC: Claudio Bantaloukas Subject: [PATCH v1 2/2] aarch64: specify fpm mode in function instances and groups Date: Wed, 30 Oct 2024 16:31:56 +0000 Message-ID: <20241030163156.775854-3-claudio.bantaloukas@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241030163156.775854-1-claudio.bantaloukas@arm.com> References: <20241030163156.775854-1-claudio.bantaloukas@arm.com> MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: DB5PEPF00014B92:EE_|AM9PR08MB5921:EE_|DB5PEPF00014B97:EE_|DB9PR08MB6394:EE_ X-MS-Office365-Filtering-Correlation-Id: 12142a9e-e8d7-4354-04ac-08dcf90067bc x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; ARA:13230040|82310400026|376014|36860700013|1800799024; X-Microsoft-Antispam-Message-Info-Original: azmLyIBSJc/xQ6HbDjJpaAgvfFlRbrUdbeSYxlbJppGRlt933vakwgDAvKJlXRW3BGSdZiSa8ik+WB5lpucTz4+5+vCKsfDJXIKaHeRFpLe1A7lUi0Sq3d6jwSO+HQi8n4u6B8dlUgG1nJUSrqci0QUbW4tJS5XP/CXDq9l53aKKHn0F0p8GOoOSPiJ/ytP2j/Lmo+/iVIjoqgQ8hiIPKZN+Kg8wk07gGmi9hqvVfDZQ3u4rwzvf5Y+1f9RhfAoN3IMBgNMjExWiD66wp3r0svRXhvcIc5Ke7fX+yqEHZGplEw9w/oFi+zJm5fNGgxHuUrfPzQ+2TE7xSWigYJ2YZNrAvxwaRbJGORg9C1GHDzAIT+cDdLObkwG2AhXaTI2FZ44gKo8Cs/nfEUFqj8fS2D4F9HQsQtcSOLymOYTg0WJiN7GqH7eTXfO6WWf8IrGGZ1zfQo/efL5XH2nb03bJFjco+nlOggusEimDa6yYyxFcsYTAZeaeQKWrns4nTwLKEExlnilcvzUvhbRwR7gaLnA5gWn3VezEDrqK/Vb0u6aJ8aR7zaA08wkCJag8xNRHQlHR4Z/ggQNHA1jVeV3ZaKqqUHNgBcibyWc4M4TSFw4LNVUjekVHvufJx10JU6nE5AJJ4+Cm4m6QlXjaTe0sAwfBXPoxhZnkJ/5OS/QcBeo6mij/8+52icN78+Fa3XY5Gd/3Hq/Y/KV1Zu1qtvkAhUO4I7ygQbi/qqQxe9xVpTyY2iuE0Msr1Dk2b5b0BqAmdaQd7tRY8iaTQvRgmgGIB3IHrQoz6KyH8vEtdm+Fex0mefL+kK3cmYJDFrayy72rwHH8vdCzwEYOLQRIKVKk8H+/f9FAD4OAP91Nr8ZPAOkhJyL5WYZOQ3TlD0OB0h4Orn+g+ueG0AtLkNtPOOQUHoWgsa/MuLjrQzA1NSALOo1AkBiNu4MBCRB6ViLI8ERf7ZK1yu8O2U1BjEmVlmLt1yZQWnpV3hLjJALJQknrMWEZ/RpiR9H2RJu1tIIc7t0RXtWjaaRZZPIinpkH/HVAQspwWRL4hX7A+Whz6MHwMI280nDO2m/c65blsKI7dY3Stn6Ybf2Jo56h13Ug4YtNUtn81sRhiqkwJS+45bHkYYYganGFTUGFLA1PLBiE4KOqIcLLgEwyF+vQEINuJd2ipnAiZ8T+B2wz6Gd6+ufyRVF0qs8fePM84yKiE63Sp87RK/k6yCgxKqAb5l/xtPwBpM9+X2CO5YFuL+mkXC6wfjbONvzixiBFmfVybbecf2E19hr92Nt/PuoPZXCUHj+RvwxAlJve2LCLlF9u3bcZbyB0TR3JObJd+f3NNe8z8Wmf3LhIrk4DGrts/cXaEwO+b9bIYTZrS7bN3n2Kbe6pROAlt4wpeyn/CaOHqqpQyHeTIee/8oDxNo48Fuz4k4wPuw== X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(82310400026)(376014)(36860700013)(1800799024); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR08MB5921 X-MS-Exchange-SkipListedInternetSender: ip=[2603:10a6:8::27]; domain=DB3PR08CA0014.eurprd08.prod.outlook.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5PEPF00014B97.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 35babbc5-8ecb-4c97-a191-08dcf90061ee X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|376014|35042699022|36860700013|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?q?lHPJu/PSOIU+8KsXeKvoHD/rmerAvQs?= =?utf-8?q?zS8srfUxsO9n5jsUHCUkKhlqaeVdac98vzUgngIoBMREnML6x2nFaxa9QY4yt6kNs?= =?utf-8?q?nbiB1JCQEghVCXrbweX4Z3r0VUizuQ9Iukbtd9Axeq863Y+nCFMMfMNEmSdJUXmgp?= =?utf-8?q?Or6ZRhOb/6DJdi0dQqt83agtaeAalaw2UBUZBXSlV+5ygMGNwbQKKEPuUIeYLaeCj?= =?utf-8?q?wHp8KZr8pWOW7dCmIaGTK2nwgW/KdLgNTCeEi4+PJPJ6QAegTN/2CnagPJFOQB5lb?= =?utf-8?q?ZC+ku1Uk4o0AuEg1Digq8uwWdaSGHJXkJAKQ383i11tRroe+/EbpsXcUHKmKI9Mp2?= =?utf-8?q?hAhn00CdtKc7mU7Ok20lPf8zPdS3xFxxPNr59rFXA4xRXpCot71cYOoZ1OY8qZUES?= =?utf-8?q?noqkL7XaOj9qcZ/t1mdPHQfJlaD/4dOqyE1yPWFWtXxdZQIrBs/7r+y8Hkqog0EeM?= =?utf-8?q?oCDq7GFoHLVxzwBx8J8Q3KTlf0QI1LcJguY1DRae8cXmYTC8CyRhg7LM2rLFQw2Co?= =?utf-8?q?QeDgJ57d7DyrtknEpa9KS+p9qI/EoI+hLe6ZwMCUAGVdsHYoOqzXnAjgRB1srA9TO?= =?utf-8?q?EpKBIqo9xQL8NV4yL9qnoOO69NKHi3vzmpcTLAPxDn9rPA66/3+9WwI9WR4oJ+FAN?= =?utf-8?q?7anGZej0uIrMTOSrObn2cwEjhn8IYsIrse8dv/Tqor0NVuHoBbPqHzn3RlkJFnPrq?= =?utf-8?q?if0iQhnwVCdF3Li85bWmy5cVg9u1+9WQ3cvhEhDkowv4+qmEV7LtRjbCxT/ESShbW?= =?utf-8?q?qANHPeLw0TFZkLjZ5mcLx11NZ6Xc/pTectfiRdUYwZEA2v1TYvol1Jr5I7jYPHaTe?= =?utf-8?q?zzG6P/acrvGKc2Z1+ImmipAqIaPDtPfzDkpgrH8U8PJl6GGMst4ydMI1AjgjtduIS?= =?utf-8?q?T0ThNa7Ty8lw+J5Il6bGJDaEKQtYEX63XF9H9K3wY6Kt+HLykFuqYgsi+SL4sjCkC?= =?utf-8?q?/fw3lPsBpfxGsZwd81GmjA4yhigmiwAwWLQJgjGyQV/Y8iBghQgVMkplEd5NWNk4b?= =?utf-8?q?QTu2aI5NugcotvX29vK+uDaU88jVf7han1ESigRnp3jIexXB0LdmbiIGDTjUEJH+x?= =?utf-8?q?WVwcuLYgZ/AxlGcCBsBtk4W0WTdLBer5w5nopOoRw+/uBI4RY3QSwosCwn1HVCUyU?= =?utf-8?q?sUxtlNsVk0EaLmcXQG3B082ceFoOcIn5isQvZ8nn3xH2pt2+Z/GDzUYfAl+Y3vXQ8?= =?utf-8?q?QUUEtWmaXP3xoOpG3VQax88N8jUzQmmSGwBEMsBA0WlrUIWTgXEQD96EabTYqOzE+?= =?utf-8?q?h1RPoqU5Hx1lis+lO0oZw6ucwHyp0dkl7nMjrScv6uiJxwuT0gTRPApmmAivgzkId?= =?utf-8?q?dXopV+3qAUjU7x6zcY+cGa21rWgK9Kl/sg=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:(13230040)(82310400026)(376014)(35042699022)(36860700013)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2024 16:32:11.5302 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 12142a9e-e8d7-4354-04ac-08dcf90067bc 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: DB5PEPF00014B97.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB6394 X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FORGED_SPF_HELO, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NONE, TXREP, 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 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 Some intrinsics require setting the fpm register before calling the specific asm opcode required. In order to simplify review, this patch: - adds the fpm_mode_index attribute to function_group_info and function_instance objects - updates existing initialisations and call sites. - updates equality and hash operations gcc/ * config/aarch64/aarch64-sve-builtins-base.cc (svdiv_impl): Specify FPM_unused when folding. (svmul_impl): Likewise. * config/aarch64/aarch64-sve-builtins-base.def (svreinterpret): Specify FPM_unused mode * config/aarch64/aarch64-sve-builtins-shapes.cc (build_one): Use the group fpm_mode when creating function instances. * config/aarch64/aarch64-sve-builtins-sme.def (DEF_SME_FUNCTION): specify FPM_unset mode (DEF_SME_ZA_FUNCTION_GS): Allow specifying fpm mode (DEF_SME_ZA_FUNCTION): specify FPM_unset mode (svadd,svadd_write,svdot, svdot_lane, svluti2_lane_zt, svluti4_lane_zt, svmla, svmla_lane, svmls, svmls_lane, svread, svread_hor, svread_ver, svsub, svsub_write, svsudot, svsudot_lane, svsuvdot_lane, svusdot, svusdot_lane, svusvdot_lane, svvdot_lane, svwrite, svwrite_hor, svwrite_ver): Likewise * config/aarch64/aarch64-sve-builtins-sve2.cc (svaba_impl, svqrshl_impl, svqshl_impl,svrshl_impl, svsra_impl): Specify FPM_unused when folding. * config/aarch64/aarch64-sve-builtins-sve2.def (svadd, svclamp, svcvt, svcvtn, svld1, svldnt1, svmax, svmaxnm, svmin, svminnm, svpext_lane, svqcvt, svqcvtn, svqdmulh, svqrshr, svqrshrn, svqrshru, svqrshrun, svrinta, svrintm, svrintn, svrintp, svrshl, svsel, svst1, svstnt1, svunpk, svuzp, svuzpq, svwhilege, svwhilegt, svwhilele, svwhilelt, svzip, svzipq): Likewise * config/aarch64/aarch64-sve-builtins.cc (function_groups): Set fpm_mode on all elements. (neon_sve_function_groups, sme_function_groups): Likewise. (function_instance::hash): Include fpm_mode in hash. (function_builder::add_overloaded_functions): Use the group fpm mode. (function_resolver::lookup_form): Use the function instance fpm_mode when looking up a function. * config/aarch64/aarch64-sve-builtins.def (DEF_SVE_FUNCTION_GS): add argument. (DEF_SVE_FUNCTION): specify FPM_unset mode. * config/aarch64/aarch64-sve-builtins.h (fpm_mode_index): New. (function_group_info): Add fpm_mode. (function_instance): Likewise. (function_instance::operator==): Handle fpm_mode. --- .../aarch64/aarch64-sve-builtins-base.cc | 15 +- .../aarch64/aarch64-sve-builtins-base.def | 2 +- .../aarch64/aarch64-sve-builtins-shapes.cc | 3 +- .../aarch64/aarch64-sve-builtins-sme.def | 130 ++++++++++-------- .../aarch64/aarch64-sve-builtins-sve2.cc | 20 ++- .../aarch64/aarch64-sve-builtins-sve2.def | 96 +++++++------ gcc/config/aarch64/aarch64-sve-builtins.cc | 21 +-- gcc/config/aarch64/aarch64-sve-builtins.def | 4 +- gcc/config/aarch64/aarch64-sve-builtins.h | 25 +++- 9 files changed, 185 insertions(+), 131 deletions(-) diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc b/gcc/config/aarch64/aarch64-sve-builtins-base.cc index fe16d93adcd..47d9a01c3dc 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc @@ -774,7 +774,8 @@ public: { function_instance instance ("svneg", functions::svneg, shapes::unary, MODE_none, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); gcall *call = f.redirect_call (instance); unsigned offset_index = 0; if (f.pred == PRED_m) @@ -802,7 +803,8 @@ public: { function_instance instance ("svlsr", functions::svlsr, shapes::binary_uint_opt_n, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); call = f.redirect_call (instance); tree d = INTEGRAL_TYPE_P (TREE_TYPE (op2)) ? op2 : op2_cst; new_divisor = wide_int_to_tree (TREE_TYPE (d), tree_log2 (d)); @@ -815,7 +817,8 @@ public: function_instance instance ("svasrd", functions::svasrd, shapes::shift_right_imm, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); call = f.redirect_call (instance); new_divisor = wide_int_to_tree (scalar_types[VECTOR_TYPE_svuint64_t], tree_log2 (op2_cst)); @@ -2092,7 +2095,8 @@ public: { function_instance instance ("svneg", functions::svneg, shapes::unary, MODE_none, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); gcall *call = f.redirect_call (instance); unsigned offset_index = 0; if (f.pred == PRED_m) @@ -2133,7 +2137,8 @@ public: tree_log2 (shift_op2)); function_instance instance ("svlsl", functions::svlsl, shapes::binary_uint_opt_n, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); gcall *call = f.redirect_call (instance); gimple_call_set_arg (call, 1, shift_op1); gimple_call_set_arg (call, 2, shift_op2); diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.def b/gcc/config/aarch64/aarch64-sve-builtins-base.def index 95e04e4393d..c353e6ed81a 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.def +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.def @@ -200,7 +200,7 @@ DEF_SVE_FUNCTION (svrbit, unary, all_integer, mxz) DEF_SVE_FUNCTION (svrecpe, unary, all_float, none) DEF_SVE_FUNCTION (svrecps, binary, all_float, none) DEF_SVE_FUNCTION (svrecpx, unary, all_float, mxz) -DEF_SVE_FUNCTION_GS (svreinterpret, reinterpret, reinterpret, x1234, none) +DEF_SVE_FUNCTION_GS (svreinterpret, reinterpret, reinterpret, x1234, none, unused) DEF_SVE_FUNCTION (svreinterpret, reinterpret, reinterpret_b, none) DEF_SVE_FUNCTION (svrev, unary, all_data, none) DEF_SVE_FUNCTION (svrev, unary_pred, all_pred, none) diff --git a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc index f190770250f..51f7cfdf96f 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc @@ -350,7 +350,8 @@ build_one (function_builder &b, const char *signature, auto_vec argument_types; function_instance instance (group.base_name, *group.base, *group.shape, mode_suffix_id, group.types[ti], - group.groups[gi], group.preds[pi]); + group.groups[gi], group.preds[pi], + group.fpm_mode); tree return_type = parse_signature (instance, signature, argument_types); apply_predication (instance, return_type, argument_types); b.add_unique_function (instance, return_type, argument_types, diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sme.def b/gcc/config/aarch64/aarch64-sve-builtins-sme.def index 416df0b3637..7bdf9e3bf82 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-sme.def +++ b/gcc/config/aarch64/aarch64-sve-builtins-sme.def @@ -19,17 +19,17 @@ #ifndef DEF_SME_FUNCTION #define DEF_SME_FUNCTION(NAME, SHAPE, TYPES, PREDS) \ - DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS) + DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS, unused) #endif #ifndef DEF_SME_ZA_FUNCTION_GS -#define DEF_SME_ZA_FUNCTION_GS(NAME, SHAPE, TYPES, GROUP, PREDS) \ - DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, GROUP, PREDS) +#define DEF_SME_ZA_FUNCTION_GS(NAME, SHAPE, TYPES, GROUP, PREDS, FPM_MODE) \ + DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, GROUP, PREDS, FPM_MODE) #endif #ifndef DEF_SME_ZA_FUNCTION #define DEF_SME_ZA_FUNCTION(NAME, SHAPE, TYPES, PREDS) \ - DEF_SME_ZA_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS) + DEF_SME_ZA_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS, unused) #endif #define REQUIRED_EXTENSIONS 0 @@ -101,117 +101,127 @@ DEF_SME_FUNCTION (svzero_zt, inherent_zt, none, none) floating-point function. They are needed because the integer and floating-point functions have different architecture requirements. */ #define REQUIRED_EXTENSIONS AARCH64_FL_SME | AARCH64_FL_SME2 | AARCH64_FL_SM_ON -DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, za_s_data, vg1x24, none) -DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, d_za, vg1x24, none) +DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, za_s_data, vg1x24, none, unused) +DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, d_za, vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svadd_write, binary_za_slice_opt_single, za_s_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION (svbmopa, binary_za_m, za_s_unsigned, za_m) DEF_SME_ZA_FUNCTION (svbmops, binary_za_m, za_s_unsigned, za_m) DEF_SME_ZA_FUNCTION_GS (svdot, binary_za_slice_opt_single, za_s_h_data, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svdot, binary_za_slice_opt_single, za_s_b_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svdot_lane, dot_za_slice_lane, za_s_h_data, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svdot_lane, dot_za_slice_lane, za_s_b_integer, - vg1x24, none) -DEF_SME_FUNCTION_GS (svluti2_lane_zt, luti2_lane_zt, bhs_data, x124, none) -DEF_SME_FUNCTION_GS (svluti4_lane_zt, luti4_lane_zt, bhs_data, x12, none) -DEF_SME_FUNCTION_GS (svluti4_lane_zt, luti4_lane_zt, hs_data, x4, none) + vg1x24, none, unused) +DEF_SME_FUNCTION_GS (svluti2_lane_zt, luti2_lane_zt, bhs_data, x124, none, + unused) +DEF_SME_FUNCTION_GS (svluti4_lane_zt, luti4_lane_zt, bhs_data, x12, none, + unused) +DEF_SME_FUNCTION_GS (svluti4_lane_zt, luti4_lane_zt, hs_data, x4, none, + unused) DEF_SME_ZA_FUNCTION_GS (svmla, binary_za_slice_opt_single, za_s_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla, binary_za_slice_opt_single, za_s_h_data, - vg2, none) + vg2, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla, binary_za_slice_opt_single, za_s_b_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla_lane, binary_za_slice_lane, za_s_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla_lane, binary_za_slice_lane, za_s_h_data, - vg2, none) + vg2, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla_lane, binary_za_slice_lane, za_s_b_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls, binary_za_slice_opt_single, za_s_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls, binary_za_slice_opt_single, za_s_h_data, - vg2, none) + vg2, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls, binary_za_slice_opt_single, za_s_b_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls_lane, binary_za_slice_lane, za_s_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls_lane, binary_za_slice_lane, za_s_h_data, - vg2, none) + vg2, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls_lane, binary_za_slice_lane, za_s_b_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION (svmopa, binary_za_m, za_s_h_integer, za_m) DEF_SME_ZA_FUNCTION (svmops, binary_za_m, za_s_h_integer, za_m) -DEF_SME_ZA_FUNCTION_GS (svread, read_za_slice, za_bhsd_data, vg1x24, none) -DEF_SME_ZA_FUNCTION_GS (svread_hor, read_za, za_bhsd_data, vg24, none) -DEF_SME_ZA_FUNCTION_GS (svread_ver, read_za, za_bhsd_data, vg24, none) -DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, za_s_data, vg1x24, none) -DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, d_za, vg1x24, none) +DEF_SME_ZA_FUNCTION_GS (svread, read_za_slice, za_bhsd_data, vg1x24, none, unused) +DEF_SME_ZA_FUNCTION_GS (svread_hor, read_za, za_bhsd_data, vg24, none, unused) +DEF_SME_ZA_FUNCTION_GS (svread_ver, read_za, za_bhsd_data, vg24, none, unused) +DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, za_s_data, vg1x24, none, unused) +DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, d_za, vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svsub_write, binary_za_slice_opt_single, za_s_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svsudot, binary_za_slice_uint_opt_single, - za_s_b_signed, vg1x24, none) + za_s_b_signed, vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svsudot_lane, dot_za_slice_uint_lane, - za_s_b_signed, vg1x24, none) + za_s_b_signed, vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svsuvdot_lane, dot_za_slice_uint_lane, - za_s_b_signed, vg1x4, none) + za_s_b_signed, vg1x4, none, unused) DEF_SME_ZA_FUNCTION_GS (svusdot, binary_za_slice_int_opt_single, - za_s_b_unsigned, vg1x24, none) + za_s_b_unsigned, vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svusdot_lane, dot_za_slice_int_lane, - za_s_b_unsigned, vg1x24, none) + za_s_b_unsigned, vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svusvdot_lane, dot_za_slice_int_lane, - za_s_b_unsigned, vg1x4, none) + za_s_b_unsigned, vg1x4, none, unused) DEF_SME_ZA_FUNCTION_GS (svvdot_lane, dot_za_slice_lane, za_s_h_data, - vg1x2, none) + vg1x2, none, unused) DEF_SME_ZA_FUNCTION_GS (svvdot_lane, dot_za_slice_lane, za_s_b_integer, - vg1x4, none) -DEF_SME_ZA_FUNCTION_GS (svwrite, write_za_slice, za_bhsd_data, vg1x24, none) -DEF_SME_ZA_FUNCTION_GS (svwrite_hor, write_za, za_bhsd_data, vg24, none) -DEF_SME_ZA_FUNCTION_GS (svwrite_ver, write_za, za_bhsd_data, vg24, none) + vg1x4, none, unused) +DEF_SME_ZA_FUNCTION_GS (svwrite, write_za_slice, za_bhsd_data, vg1x24, none, + unused) +DEF_SME_ZA_FUNCTION_GS (svwrite_hor, write_za, za_bhsd_data, vg24, none, + unused) +DEF_SME_ZA_FUNCTION_GS (svwrite_ver, write_za, za_bhsd_data, vg24, none, + unused) #undef REQUIRED_EXTENSIONS #define REQUIRED_EXTENSIONS (AARCH64_FL_SME \ | AARCH64_FL_SME2 \ | AARCH64_FL_SME_I16I64 \ | AARCH64_FL_SM_ON) -DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, za_d_integer, vg1x24, none) +DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, za_d_integer, vg1x24, none, + unused) DEF_SME_ZA_FUNCTION_GS (svadd_write, binary_za_slice_opt_single, za_d_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svdot, binary_za_slice_opt_single, za_d_h_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svdot_lane, dot_za_slice_lane, za_d_h_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla, binary_za_slice_opt_single, za_d_h_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla_lane, binary_za_slice_lane, za_d_h_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls, binary_za_slice_opt_single, za_d_h_integer, - vg4, none) + vg4, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls_lane, binary_za_slice_lane, za_d_h_integer, - vg4, none) -DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, za_d_integer, vg1x24, none) + vg4, none, unused) +DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, za_d_integer, vg1x24, none, + unused) DEF_SME_ZA_FUNCTION_GS (svsub_write, binary_za_slice_opt_single, za_d_integer, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svvdot_lane, dot_za_slice_lane, za_d_h_integer, - vg1x4, none) + vg1x4, none, unused) #undef REQUIRED_EXTENSIONS #define REQUIRED_EXTENSIONS (AARCH64_FL_SME \ | AARCH64_FL_SME2 \ | AARCH64_FL_SME_F64F64 \ | AARCH64_FL_SM_ON) -DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, za_d_float, vg1x24, none) +DEF_SME_ZA_FUNCTION_GS (svadd, unary_za_slice, za_d_float, vg1x24, none, + unused) DEF_SME_ZA_FUNCTION_GS (svmla, binary_za_slice_opt_single, za_d_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmla_lane, binary_za_slice_lane, za_d_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls, binary_za_slice_opt_single, za_d_float, - vg1x24, none) + vg1x24, none, unused) DEF_SME_ZA_FUNCTION_GS (svmls_lane, binary_za_slice_lane, za_d_float, - vg1x24, none) -DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, za_d_float, vg1x24, none) + vg1x24, none, unused) +DEF_SME_ZA_FUNCTION_GS (svsub, unary_za_slice, za_d_float, vg1x24, none, + unused) #undef REQUIRED_EXTENSIONS #undef DEF_SME_ZA_FUNCTION diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc index d29c2209fdf..41445bc23a0 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc @@ -90,7 +90,8 @@ public: return NULL; function_instance instance ("svabd", functions::svabd, shapes::binary_opt_n, f.mode_suffix_id, - f.type_suffix_ids, GROUP_none, PRED_x); + f.type_suffix_ids, GROUP_none, PRED_x, + FPM_unused); gcall *call = f.redirect_call (instance); /* Add a ptrue as predicate, because unlike svaba, svabd is predicated. */ @@ -322,7 +323,8 @@ public: that we can use for sensible shift amounts. */ function_instance instance ("svqshl", functions::svqshl, shapes::binary_int_opt_n, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); return f.redirect_call (instance); } else @@ -332,7 +334,7 @@ public: function_instance instance ("svrshl", functions::svrshl, shapes::binary_int_opt_single_n, MODE_n, f.type_suffix_ids, GROUP_none, - f.pred); + f.pred, FPM_unused); return f.redirect_call (instance); } } @@ -361,7 +363,8 @@ public: -wi::to_wide (amount)); function_instance instance ("svasr", functions::svasr, shapes::binary_uint_opt_n, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); if (f.type_suffix (0).unsigned_p) { instance.base_name = "svlsr"; @@ -396,7 +399,8 @@ public: that we can use for sensible shift amounts. */ function_instance instance ("svlsl", functions::svlsl, shapes::binary_uint_opt_n, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); gcall *call = f.redirect_call (instance); gimple_call_set_arg (call, 2, amount); return call; @@ -409,7 +413,8 @@ public: -wi::to_wide (amount)); function_instance instance ("svrshr", functions::svrshr, shapes::shift_right_imm, MODE_n, - f.type_suffix_ids, GROUP_none, f.pred); + f.type_suffix_ids, GROUP_none, f.pred, + FPM_unused); gcall *call = f.redirect_call (instance); gimple_call_set_arg (call, 2, amount); return call; @@ -445,7 +450,8 @@ public: return NULL; function_instance instance ("svlsr", functions::svlsr, shapes::binary_uint_opt_n, MODE_n, - f.type_suffix_ids, GROUP_none, PRED_x); + f.type_suffix_ids, GROUP_none, PRED_x, + FPM_unused); if (!f.type_suffix (0).unsigned_p) { instance.base_name = "svasr"; diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def index 318dfff06f0..cdccf9fb680 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def +++ b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def @@ -244,59 +244,71 @@ DEF_SVE_FUNCTION (svrevd, unary, all_data, mxz) | AARCH64_FL_SME \ | AARCH64_FL_SME2 \ | AARCH64_FL_SM_ON) -DEF_SVE_FUNCTION_GS (svadd, binary_single, all_integer, x24, none) +DEF_SVE_FUNCTION_GS (svadd, binary_single, all_integer, x24, none, unused) DEF_SVE_FUNCTION (svbfmlslb, ternary_bfloat_opt_n, s_float, none) DEF_SVE_FUNCTION (svbfmlslb_lane, ternary_bfloat_lane, s_float, none) DEF_SVE_FUNCTION (svbfmlslt, ternary_bfloat_opt_n, s_float, none) DEF_SVE_FUNCTION (svbfmlslt_lane, ternary_bfloat_lane, s_float, none) DEF_SVE_FUNCTION (svclamp, clamp, all_float, none) -DEF_SVE_FUNCTION_GS (svclamp, clamp, all_arith, x24, none) +DEF_SVE_FUNCTION_GS (svclamp, clamp, all_arith, x24, none, unused) DEF_SVE_FUNCTION (svcntp, count_pred_c, all_count, none) -DEF_SVE_FUNCTION_GS (svcvt, unary_convertxn, cvt_h_s_float, x2, none) -DEF_SVE_FUNCTION_GS (svcvt, unary_convertxn, cvt_s_s, x24, none) -DEF_SVE_FUNCTION_GS (svcvtn, unary_convertxn, cvt_h_s_float, x2, none) +DEF_SVE_FUNCTION_GS (svcvt, unary_convertxn, cvt_h_s_float, x2, none, unused) +DEF_SVE_FUNCTION_GS (svcvt, unary_convertxn, cvt_s_s, x24, none, unused) +DEF_SVE_FUNCTION_GS (svcvtn, unary_convertxn, cvt_h_s_float, x2, none, unused) DEF_SVE_FUNCTION (svdot, ternary_qq_opt_n_or_011, s_narrow_fsu, none) DEF_SVE_FUNCTION (svdot_lane, ternary_qq_or_011_lane, s_narrow_fsu, none) -DEF_SVE_FUNCTION_GS (svld1, load, all_data, x24, implicit) -DEF_SVE_FUNCTION_GS (svldnt1, load, all_data, x24, implicit) -DEF_SVE_FUNCTION_GS (svmax, binary_opt_single_n, all_arith, x24, none) -DEF_SVE_FUNCTION_GS (svmaxnm, binary_opt_single_n, all_float, x24, none) -DEF_SVE_FUNCTION_GS (svmin, binary_opt_single_n, all_arith, x24, none) -DEF_SVE_FUNCTION_GS (svminnm, binary_opt_single_n, all_float, x24, none) -DEF_SVE_FUNCTION_GS (svpext_lane, extract_pred, all_count, x12, none) +DEF_SVE_FUNCTION_GS (svld1, load, all_data, x24, implicit, unused) +DEF_SVE_FUNCTION_GS (svldnt1, load, all_data, x24, implicit, unused) +DEF_SVE_FUNCTION_GS (svmax, binary_opt_single_n, all_arith, x24, none, unused) +DEF_SVE_FUNCTION_GS (svmaxnm, binary_opt_single_n, all_float, x24, none, + unused) +DEF_SVE_FUNCTION_GS (svmin, binary_opt_single_n, all_arith, x24, none, unused) +DEF_SVE_FUNCTION_GS (svminnm, binary_opt_single_n, all_float, x24, none, + unused) +DEF_SVE_FUNCTION_GS (svpext_lane, extract_pred, all_count, x12, none, unused) DEF_SVE_FUNCTION (svptrue, inherent, all_count, none) -DEF_SVE_FUNCTION_GS (svqcvt, unary_convertxn, qcvt_x2, x2, none) -DEF_SVE_FUNCTION_GS (svqcvt, unary_convertxn, qcvt_x4, x4, none) -DEF_SVE_FUNCTION_GS (svqcvtn, unary_convertxn, qcvt_x2, x2, none) -DEF_SVE_FUNCTION_GS (svqcvtn, unary_convertxn, qcvt_x4, x4, none) -DEF_SVE_FUNCTION_GS (svqdmulh, binary_opt_single_n, all_signed, x24, none) -DEF_SVE_FUNCTION_GS (svqrshr, shift_right_imm_narrowxn, qrshr_x2, x2, none) -DEF_SVE_FUNCTION_GS (svqrshr, shift_right_imm_narrowxn, qrshr_x4, x4, none) -DEF_SVE_FUNCTION_GS (svqrshrn, shift_right_imm_narrowxn, qrshr_x2, x2, none) -DEF_SVE_FUNCTION_GS (svqrshrn, shift_right_imm_narrowxn, qrshr_x4, x4, none) -DEF_SVE_FUNCTION_GS (svqrshru, shift_right_imm_narrowxn, qrshru_x2, x2, none) -DEF_SVE_FUNCTION_GS (svqrshru, shift_right_imm_narrowxn, qrshru_x4, x4, none) -DEF_SVE_FUNCTION_GS (svqrshrun, shift_right_imm_narrowxn, qrshru_x2, x2, none) -DEF_SVE_FUNCTION_GS (svqrshrun, shift_right_imm_narrowxn, qrshru_x4, x4, none) -DEF_SVE_FUNCTION_GS (svrinta, unaryxn, s_float, x24, none) -DEF_SVE_FUNCTION_GS (svrintm, unaryxn, s_float, x24, none) -DEF_SVE_FUNCTION_GS (svrintn, unaryxn, s_float, x24, none) -DEF_SVE_FUNCTION_GS (svrintp, unaryxn, s_float, x24, none) -DEF_SVE_FUNCTION_GS (svrshl, binary_int_opt_single_n, all_integer, x24, none) -DEF_SVE_FUNCTION_GS (svsel, binaryxn, all_data, x24, implicit) -DEF_SVE_FUNCTION_GS (svst1, storexn, all_data, x24, implicit) -DEF_SVE_FUNCTION_GS (svstnt1, storexn, all_data, x24, implicit) -DEF_SVE_FUNCTION_GS (svunpk, unary_convertxn, bhs_widen, x24, none) -DEF_SVE_FUNCTION_GS (svuzp, unaryxn, all_data, x24, none) -DEF_SVE_FUNCTION_GS (svuzpq, unaryxn, all_data, x24, none) -DEF_SVE_FUNCTION_GS (svwhilege, compare_scalar, while_x, x2, none) +DEF_SVE_FUNCTION_GS (svqcvt, unary_convertxn, qcvt_x2, x2, none, unused) +DEF_SVE_FUNCTION_GS (svqcvt, unary_convertxn, qcvt_x4, x4, none, unused) +DEF_SVE_FUNCTION_GS (svqcvtn, unary_convertxn, qcvt_x2, x2, none, unused) +DEF_SVE_FUNCTION_GS (svqcvtn, unary_convertxn, qcvt_x4, x4, none, unused) +DEF_SVE_FUNCTION_GS (svqdmulh, binary_opt_single_n, all_signed, x24, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshr, shift_right_imm_narrowxn, qrshr_x2, x2, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshr, shift_right_imm_narrowxn, qrshr_x4, x4, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshrn, shift_right_imm_narrowxn, qrshr_x2, x2, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshrn, shift_right_imm_narrowxn, qrshr_x4, x4, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshru, shift_right_imm_narrowxn, qrshru_x2, x2, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshru, shift_right_imm_narrowxn, qrshru_x4, x4, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshrun, shift_right_imm_narrowxn, qrshru_x2, x2, none, + unused) +DEF_SVE_FUNCTION_GS (svqrshrun, shift_right_imm_narrowxn, qrshru_x4, x4, none, + unused) +DEF_SVE_FUNCTION_GS (svrinta, unaryxn, s_float, x24, none, unused) +DEF_SVE_FUNCTION_GS (svrintm, unaryxn, s_float, x24, none, unused) +DEF_SVE_FUNCTION_GS (svrintn, unaryxn, s_float, x24, none, unused) +DEF_SVE_FUNCTION_GS (svrintp, unaryxn, s_float, x24, none, unused) +DEF_SVE_FUNCTION_GS (svrshl, binary_int_opt_single_n, all_integer, x24, none, + unused) +DEF_SVE_FUNCTION_GS (svsel, binaryxn, all_data, x24, implicit, unused) +DEF_SVE_FUNCTION_GS (svst1, storexn, all_data, x24, implicit, unused) +DEF_SVE_FUNCTION_GS (svstnt1, storexn, all_data, x24, implicit, unused) +DEF_SVE_FUNCTION_GS (svunpk, unary_convertxn, bhs_widen, x24, none, unused) +DEF_SVE_FUNCTION_GS (svuzp, unaryxn, all_data, x24, none, unused) +DEF_SVE_FUNCTION_GS (svuzpq, unaryxn, all_data, x24, none, unused) +DEF_SVE_FUNCTION_GS (svwhilege, compare_scalar, while_x, x2, none, unused) DEF_SVE_FUNCTION (svwhilege, compare_scalar_count, while_x_c, none) -DEF_SVE_FUNCTION_GS (svwhilegt, compare_scalar, while_x, x2, none) +DEF_SVE_FUNCTION_GS (svwhilegt, compare_scalar, while_x, x2, none, unused) DEF_SVE_FUNCTION (svwhilegt, compare_scalar_count, while_x_c, none) -DEF_SVE_FUNCTION_GS (svwhilele, compare_scalar, while_x, x2, none) +DEF_SVE_FUNCTION_GS (svwhilele, compare_scalar, while_x, x2, none, unused) DEF_SVE_FUNCTION (svwhilele, compare_scalar_count, while_x_c, none) -DEF_SVE_FUNCTION_GS (svwhilelt, compare_scalar, while_x, x2, none) +DEF_SVE_FUNCTION_GS (svwhilelt, compare_scalar, while_x, x2, none, unused) DEF_SVE_FUNCTION (svwhilelt, compare_scalar_count, while_x_c, none) -DEF_SVE_FUNCTION_GS (svzip, unaryxn, all_data, x24, none) -DEF_SVE_FUNCTION_GS (svzipq, unaryxn, all_data, x24, none) +DEF_SVE_FUNCTION_GS (svzip, unaryxn, all_data, x24, none, unused) +DEF_SVE_FUNCTION_GS (svzipq, unaryxn, all_data, x24, none, unused) #undef REQUIRED_EXTENSIONS diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc index c6dc28eff55..5d86480787f 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc @@ -887,9 +887,9 @@ static const predication_index preds_za_m[] = { PRED_za_m, NUM_PREDS }; /* A list of all arm_sve.h functions. */ static CONSTEXPR const function_group_info function_groups[] = { -#define DEF_SVE_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS) \ +#define DEF_SVE_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS, FPM_MODE) \ { #NAME, &functions::NAME, &shapes::SHAPE, types_##TYPES, groups_##GROUPS, \ - preds_##PREDS, REQUIRED_EXTENSIONS }, + preds_##PREDS, REQUIRED_EXTENSIONS, FPM_##FPM_MODE }, #include "aarch64-sve-builtins.def" }; @@ -897,18 +897,19 @@ static CONSTEXPR const function_group_info function_groups[] = { static CONSTEXPR const function_group_info neon_sve_function_groups[] = { #define DEF_NEON_SVE_FUNCTION(NAME, SHAPE, TYPES, GROUPS, PREDS) \ { #NAME, &neon_sve_bridge_functions::NAME, &shapes::SHAPE, types_##TYPES, \ - groups_##GROUPS, preds_##PREDS, 0 }, + groups_##GROUPS, preds_##PREDS, 0, FPM_unused }, #include "aarch64-neon-sve-bridge-builtins.def" }; /* A list of all arm_sme.h functions. */ static CONSTEXPR const function_group_info sme_function_groups[] = { -#define DEF_SME_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS) \ +#define DEF_SME_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS, FPM_MODE1) \ { #NAME, &functions::NAME, &shapes::SHAPE, types_##TYPES, groups_##GROUPS, \ - preds_##PREDS, REQUIRED_EXTENSIONS }, -#define DEF_SME_ZA_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS) \ + preds_##PREDS, REQUIRED_EXTENSIONS, FPM_##FPM_MODE1 }, +#define DEF_SME_ZA_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS, FPM_MODE2) \ { #NAME, &functions::NAME##_za, &shapes::SHAPE, types_##TYPES, \ - groups_##GROUPS, preds_##PREDS, (REQUIRED_EXTENSIONS | AARCH64_FL_ZA_ON) }, + groups_##GROUPS, preds_##PREDS, (REQUIRED_EXTENSIONS | AARCH64_FL_ZA_ON), \ + FPM_##FPM_MODE2 }, #include "aarch64-sve-builtins-sme.def" }; @@ -1175,6 +1176,7 @@ function_instance::hash () const h.add_int (type_suffix_ids[1]); h.add_int (group_suffix_id); h.add_int (pred); + h.add_int (fpm_mode); return h.end (); } @@ -1595,7 +1597,8 @@ function_builder::add_overloaded_functions (const function_group_info &group, { function_instance instance (group.base_name, *group.base, *group.shape, mode, types, - group_suffix_id, group.preds[pi]); + group_suffix_id, group.preds[pi], + group.fpm_mode); add_overloaded_function (instance, group.required_extensions); }; @@ -1773,7 +1776,7 @@ function_resolver::lookup_form (mode_suffix_index mode, { type_suffix_pair types = { type0, type1 }; function_instance instance (base_name, base, shape, mode, types, - group, pred); + group, pred, fpm_mode); registered_function *rfn = function_table->find_with_hash (instance, instance.hash ()); return rfn ? rfn->decl : NULL_TREE; diff --git a/gcc/config/aarch64/aarch64-sve-builtins.def b/gcc/config/aarch64/aarch64-sve-builtins.def index 47c396b866d..982f9ed2312 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.def +++ b/gcc/config/aarch64/aarch64-sve-builtins.def @@ -38,7 +38,7 @@ #endif #ifndef DEF_SVE_FUNCTION_GS -#define DEF_SVE_FUNCTION_GS(A, B, C, D, E) +#define DEF_SVE_FUNCTION_GS(A, B, C, D, E, F) #endif #ifndef DEF_SVE_NEON_TYPE_SUFFIX @@ -48,7 +48,7 @@ #ifndef DEF_SVE_FUNCTION #define DEF_SVE_FUNCTION(NAME, SHAPE, TYPES, PREDS) \ - DEF_SVE_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS) + DEF_SVE_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS, unused) #endif DEF_SVE_MODE (n, none, none, none) diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h index 93de4254657..d4bc1bb9309 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.h +++ b/gcc/config/aarch64/aarch64-sve-builtins.h @@ -28,6 +28,7 @@ - the "mode" suffix ("_n", "_index", etc.) - the type suffixes ("_s32", "_b8", etc.) - the predication suffix ("_x", "_z", etc.) + - the "_fpm" suffix when the floating point mode register is set Each piece of information is individually useful, so we retain this classification throughout: @@ -42,6 +43,8 @@ - prediction_index extends the predication suffix with an additional alternative: PRED_implicit for implicitly-predicated operations + - fpm_mode represents whether the fpm register is set or not + In addition to its unique full name, a function may have a shorter overloaded alias. This alias removes pieces of the suffixes that can be inferred from the arguments, such as by shortening the mode @@ -164,6 +167,14 @@ enum predication_index NUM_PREDS }; +/* Classifies intrinsics on whether they set the FPM register */ +enum fpm_mode_index +{ + FPM_unused, + FPM_set, + NUM_FPM_MODES +}; + /* Classifies element types, based on type suffixes with the bit count removed. "count" isn't really an element type, but we pretend it is for consistency. */ @@ -367,6 +378,9 @@ struct function_group_info /* The architecture extensions that the functions require, as a set of AARCH64_FL_* flags. */ aarch64_feature_flags required_extensions; + + /* Whether the floating point register is set */ + fpm_mode_index fpm_mode; }; /* Describes a single fully-resolved function (i.e. one that has a @@ -377,7 +391,7 @@ public: function_instance (const char *, const function_base *, const function_shape *, mode_suffix_index, const type_suffix_pair &, group_suffix_index, - predication_index); + predication_index, fpm_mode_index); bool operator== (const function_instance &) const; bool operator!= (const function_instance &) const; @@ -421,6 +435,7 @@ public: type_suffix_pair type_suffix_ids; group_suffix_index group_suffix_id; predication_index pred; + fpm_mode_index fpm_mode; }; class registered_function; @@ -879,10 +894,11 @@ function_instance (const char *base_name_in, mode_suffix_index mode_suffix_id_in, const type_suffix_pair &type_suffix_ids_in, group_suffix_index group_suffix_id_in, - predication_index pred_in) + predication_index pred_in, + fpm_mode_index fpm_mode_in) : base_name (base_name_in), base (base_in), shape (shape_in), mode_suffix_id (mode_suffix_id_in), group_suffix_id (group_suffix_id_in), - pred (pred_in) + pred (pred_in), fpm_mode(fpm_mode_in) { memcpy (type_suffix_ids, type_suffix_ids_in, sizeof (type_suffix_ids)); } @@ -896,7 +912,8 @@ function_instance::operator== (const function_instance &other) const && type_suffix_ids[0] == other.type_suffix_ids[0] && type_suffix_ids[1] == other.type_suffix_ids[1] && group_suffix_id == other.group_suffix_id - && pred == other.pred); + && pred == other.pred + && fpm_mode == other.fpm_mode); } inline bool