Message ID | 20230418134608.244751-1-christophe.lyon@arm.com |
---|---|
Headers |
Return-Path: <gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp2864186vqo; Tue, 18 Apr 2023 06:47:38 -0700 (PDT) X-Google-Smtp-Source: AKy350beJWbVDK/EnVG6Pt6vqInzR58QS/EFb7bzBHyPX/lP7Gxf8J1OhUUsejbQX3J3UmoXZkt6 X-Received: by 2002:a17:906:1ec8:b0:906:3373:cfe9 with SMTP id m8-20020a1709061ec800b009063373cfe9mr10687469ejj.10.1681825657816; Tue, 18 Apr 2023 06:47:37 -0700 (PDT) Received: from sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id ff18-20020a1709069c1200b009531dd675f9si1207085ejc.28.2023.04.18.06.47.37 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Apr 2023 06:47:37 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=V8lWrqzV; arc=fail (signature failed); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7ED89385842A for <ouuuleilei@gmail.com>; Tue, 18 Apr 2023 13:47:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7ED89385842A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1681825649; bh=sVuZaD8WZ2VlrJg0hrA2RhHALyzfLToBD+URfSrbA60=; h=To:CC:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=V8lWrqzVk81SPeSmPDJKfwScIQAswgo8JtqcOeS8S+u2YWnOy22g/D78Tf7gmDV9D oOvlWyOtVRHg7s9uvcr2Sn4q3FS50SY3V/qSnoN0P4+5Qeg2zvkE6TtcDJU2qxjQTb MWDOIJ4M9+E090nTOlIqgt/mIsyBluzOLJTsKkWI= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02on2066.outbound.protection.outlook.com [40.107.247.66]) by sourceware.org (Postfix) with ESMTPS id 437ED3858D1E for <gcc-patches@gcc.gnu.org>; Tue, 18 Apr 2023 13:46:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 437ED3858D1E Received: from DB7PR02CA0028.eurprd02.prod.outlook.com (2603:10a6:10:52::41) by GV2PR08MB8074.eurprd08.prod.outlook.com (2603:10a6:150:76::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Tue, 18 Apr 2023 13:46:33 +0000 Received: from DBAEUR03FT025.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:52:cafe::f1) by DB7PR02CA0028.outlook.office365.com (2603:10a6:10:52::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.47 via Frontend Transport; Tue, 18 Apr 2023 13:46:33 +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=armh.onmicrosoft.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 DBAEUR03FT025.mail.protection.outlook.com (100.127.142.226) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6319.20 via Frontend Transport; Tue, 18 Apr 2023 13:46:33 +0000 Received: ("Tessian outbound e13c2446394c:v136"); Tue, 18 Apr 2023 13:46:33 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 0441429ad2b94b9b X-CR-MTA-TID: 64aa7808 Received: from ee9eb71f5b8f.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 3AF46422-342B-41FA-9C05-FEB211167FA6.1; Tue, 18 Apr 2023 13:46:26 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ee9eb71f5b8f.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 18 Apr 2023 13:46:26 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k1CDKdzqiOQGDBjGWMJvVj8Q9VP8e9JKyfqgzTHWWbbIIUKILAPNDkibb2KF+hZdkacWK9V2H1OUPj9+4kxvUUTv77uT8M/fRPJrH3U3/GOz6f3II6XBtsMeW8XBENkgAzHFxMCLbCfc8xDuKb8sYmNkYr+cwtJirGvU0SnOlk4fuBf5PibDL4YqoYS7p1XhL6Bc5P8DjdR/FKVXImEgFXMUE3D7P8NZN46pw6Zqc8eQZDdWdhNrbAR0C1Fi9RSLx5yrSqmBgP3kTNDAMhQG0/F3sKMRaxEKlHihrO1urHmdeUKj5f4KkqgMZ52Z9oZhLN3q76F5gxVEV16XKKLfhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sVuZaD8WZ2VlrJg0hrA2RhHALyzfLToBD+URfSrbA60=; b=eBFORY9XVkQoazidrwfhJnbw2onOkypEFIjHY8rg32I7sy90bz7VEfgNIHzUjHPR+TuF325qWJRk0LpTL93DJFqn8QJG3cefOxTZDSUSHe9SVgFXzeNirTxnzdmhJV2f8li/+0Ksp5wvQNP7FqCuBoJFytnQVtlq7tWbNM2WdxKdQ83r2mdU0zbnCQ9SNh+PTJ6UJvKM2Pai5+vQG3fBSzjxNBzqRmVq7dWnapb4W+RRiJjPjnZ5fSfZUv00RNcWP9SuEs3t+6Ung9bTvphCu+A3EtSA9iOZ/GjBPqD7Oeo96ULcteGiDSYgWFWAvEwESmEShsFRRsXFAYbtciAlSA== 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 Received: from AS9PR06CA0288.eurprd06.prod.outlook.com (2603:10a6:20b:45a::19) by AS8PR08MB9429.eurprd08.prod.outlook.com (2603:10a6:20b:5ef::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.45; Tue, 18 Apr 2023 13:46:24 +0000 Received: from AM7EUR03FT041.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:45a:cafe::ed) by AS9PR06CA0288.outlook.office365.com (2603:10a6:20b:45a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.47 via Frontend Transport; Tue, 18 Apr 2023 13:46:24 +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 AM7EUR03FT041.mail.protection.outlook.com (100.127.140.233) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6319.20 via Frontend Transport; Tue, 18 Apr 2023 13:46:24 +0000 Received: from AZ-NEU-EX03.Arm.com (10.251.24.31) 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.23; Tue, 18 Apr 2023 13:46:23 +0000 Received: from e129018.arm.com (10.57.54.117) by mail.arm.com (10.251.24.31) with Microsoft SMTP Server id 15.1.2507.23 via Frontend Transport; Tue, 18 Apr 2023 13:46:23 +0000 To: <gcc-patches@gcc.gnu.org>, <kyrylo.tkachov@arm.com>, <richard.earnshaw@arm.com>, <richard.sandiford@arm.com> CC: Christophe Lyon <christophe.lyon@arm.com> Subject: [PATCH 00/22] arm: New framework for MVE intrinsics Date: Tue, 18 Apr 2023 15:45:46 +0200 Message-ID: <20230418134608.244751-1-christophe.lyon@arm.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: AM7EUR03FT041:EE_|AS8PR08MB9429:EE_|DBAEUR03FT025:EE_|GV2PR08MB8074:EE_ X-MS-Office365-Filtering-Correlation-Id: e9090d50-3d1f-40e0-0893-08db40135250 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: VShfV6N6J3cWwClQlH6FFGWjbGIjuztgIRR+u7GDqvzdkhvvNFs/N/2FftWzv0cFRHgOgSsm7fNb52Hj6tvvtiJTASeNX+ha+oWi9TaSVn8YUmA45kKIHFcS1QJANaKgOv62oL2gKWfIwWHkfRyYSV9gtzio0ibLV8QAgn5mo5Zs170YasFcUPKq8KWvcSWCvo4Ct/AJfAoADk2sO6JM9kfIN/c/dmCeKHNdTYWPhj6cBXSCNvLEHqUv1TWMusg1GlsL0t/jksaiH+QqKKBVivGRKbRyX++mz7vWRIKTAG0gQeVEgNTKjpw8SpOHUusd46UILgvGCoUtyei48g6SqLTW4mRyJ0LYBfD4Uz6WuSZOPgnQFqt9IOb/vGqKaWDnHxqYovh1YbRQ2mUJiFLTWE3Z+bqbummWY9CDkmbxNrieHfQ5k7/UibnL3471F4yQmZoq5uIEsI9rfVsIBjI6fE+ZwHrws7uL/qIDe8nC2lY/2wOwul/TnN2/J//U1pnXZVxTFdO192lFqDZJLHf8Sfv0T2mF1X0Z5pZw6wllIh/62t5bgDuuyXXk4rF+G0EX7aaF3a4nXjPiS63vxK3zMPDoQA4/5i85OeNkBkxdmQD63MYkIc9CIgmIwKW6B7C0PdqqqgIOGqmJOXkyq5c11eOlda10L0SCF4jN7YGk+DI+VvvlplaQ9M3Naf0taSXC 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:(13230028)(4636009)(396003)(346002)(39860400002)(136003)(376002)(451199021)(46966006)(36840700001)(336012)(83380400001)(426003)(26005)(1076003)(36756003)(86362001)(47076005)(82310400005)(186003)(356005)(2906002)(44832011)(2616005)(5660300002)(36860700001)(7696005)(6666004)(8676002)(8936002)(478600001)(81166007)(110136005)(41300700001)(82740400003)(316002)(70586007)(40480700001)(70206006)(4326008)(6636002)(36900700001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB9429 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT025.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 59d7fce0-eba8-4a8b-0f43-08db40134cf7 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dOciw5xjaYfV+OxSPO5tGJ0TFbg9wFD3pixZa2Taj3VKFuNYfTu/i513pduo+X0tyrmSrjpBG74Q2L3MND24ydeGTd0nVxlMQqe5WIi4C4jZrHk+H1PvHqo4zYwHYrmRvejN5oX91BaHCJtTL7manWZE1ACHE4K/E0tS8nxH81/6CaQIh0sPfyvlC3aBI8IEm7ELAVRi9uC0EfnqJ/2L0NUwDRDNn+ZZFiRsQeFLjpbSiiG8R8JUcyh9Ep2E10I1B/9LEBc8lZ6DQQEsB6vQYMWZfGZGAKyT/Rvkwv8yfDRcne0QouFIOnPrLaNOiBzwZFw0O3SsDJLdb8Od+/bHeogN/zdF6BCQgaM65HSzNReN/PXRj/ezVHrAXFazXwX1tgMGEwDoii2KtTlbm+OGI5Q/wWEcCtCop6rxpKvGCLTAHGdN89hEPwZs7MqcUhAzNAKGzHjgZZRVoDRLNLodlfxnL7b2YAZ61S1a0wNcCU88bfPaqiW/VAKqS/YBushylaOtpXvAGSxjdtkQbhCWCnoB/22Z0bEshwvL3Ua1ElIJOk5PhkudQG5wZSW5TxXzkVoeNdJS5KP76RZQShA8olmgQtpLKWH9q0b84T6Jl0p4You35v0uogIzhXrf6MH8t8AQhaX7ZdqdY/I2j7wLa/s6Kpho77F956qVBqYr1cLSbEDB8xJ/7QiewJZt7Fs1 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:(13230028)(4636009)(396003)(39860400002)(136003)(376002)(346002)(451199021)(46966006)(36840700001)(40470700004)(478600001)(6666004)(8936002)(8676002)(316002)(41300700001)(82740400003)(4326008)(6636002)(70586007)(70206006)(40480700001)(81166007)(110136005)(40460700003)(186003)(2906002)(1076003)(336012)(426003)(26005)(86362001)(83380400001)(36756003)(47076005)(82310400005)(2616005)(36860700001)(5660300002)(7696005)(44832011); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2023 13:46:33.2433 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e9090d50-3d1f-40e0-0893-08db40135250 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: DBAEUR03FT025.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8074 X-Spam-Status: No, score=-6.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, KAM_DMARC_NONE, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=no 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.29 Precedence: list List-Id: Gcc-patches mailing list <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> From: Christophe Lyon via Gcc-patches <gcc-patches@gcc.gnu.org> Reply-To: Christophe Lyon <christophe.lyon@arm.com> Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org> X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763522020901395910?= X-GMAIL-MSGID: =?utf-8?q?1763522020901395910?= |
Series |
arm: New framework for MVE intrinsics
|
|
Message
Christophe Lyon
April 18, 2023, 1:45 p.m. UTC
Hi, This is the beginning of a long patch series to change the way Arm MVE intrinsics are implemented. The goal is to get rid of arm_mve.h, which takes a long time to parse and compile. Roughly speaking, it's about using a framework very similar to what is implemented for AArch64/SVE intrinsics. I haven't converted all the intrinsics yet, but I think it would be good to start the conversion when stage-1 reopens. * Factorizing names One of the main implementation differences I noticed between SVE and MVE is that mve.md provides only full builtin names at the moment, and makes almost no use of "parameterized names" (https://gcc.gnu.org/onlinedocs/gccint/Parameterized-Names.html#Parameterized-Names). Without this, we'd need the builtin expander to use a large switch/case of the form: switch (code) case VADDQ_S: insn_code = code_for_mve_vaddq_s (...) case VADDQ_U: insn_code = code_for_mve_vaddq_u (...) case VSUBQ_S: insn_code = code_for_mve_vsubq_s (...) case VSUBQ_U: insn_code = code_for_mve_vsubq_u (...) .... so part of the work (which I called "factorize" in the commit messages) is about replacing (define_insn "mve_vaddq_n_<supf><mode>" with (define_insn "@mve_<mve_insn>q_n_<supf><mode>" with the help of a new iterator (mve_insn). Doing so makes it more obvious that some patterns are identical, except for the instruction name. I took this opportunity to merge them, so for instance I have a patch which merges add, sub and mul patterns. Although not strictly necessary for the MVE intrinsics restructuring work, this is a good opportunity to reduce such code duplication (I did notice a few bugs during that process, which led me to post a few small patches in the past months). Note that identical patterns will probably remain after the series, they can be merged later if we want. This factorization also implies the introduction of new iterators, but also means that several existing ones become useless. These patches do not remove them because it's a bit painful to reorder patches which remove lines at some "random" places, leading to merge conflicts. It's much simpler to write a big cleanup patch at the end of the serie to remove all such useless iterators at once. * Intrinsic re-implementation After intrinsic names have been factorized, the actual re-implementation patch is small: - add 1 line in each of arm-mve-builtins-base.{cc,def,h} describing the intrinsic shape/signature, types and predicates involved, RTX/unspec codes - remove the intrinsic definitions from arm_mve.h The full series of ~140 patches is organized like this: - patches 1 and 2 introduce the new framework - new implementation of vreinterpretq - new implementation of vuninitialized - patch groups of varying size, consisting in: - add a new "shape" if needed (e.g. unary, binary, ternary, ....) - add framework support functions if needed - factorize a set of intrinsics (at minimum, just make use of parameterized-names) - actual re-implementation of the intrinsics I kept patches small so the incremental progress is easy to follow and check. I'll submit the patches in small groups, this first one will make sure we agree on the implementation. Tested on arm-eabi with -mthumb/-mfloat-abi=hard/-march=armv8.1-m.main+mve. To help reviewers, I suggest to compare arm-mve-builtins.cc with aarch64-sve-builtins.cc. Christophe Lyon (22): arm: move builtin function codes into general numberspace arm: [MVE intrinsics] Add new framework arm: [MVE intrinsics] Rework vreinterpretq arm: [MVE intrinsics] Rework vuninitialized arm: [MVE intrinsics] add binary_opt_n shape arm: [MVE intrinsics] add unspec_based_mve_function_exact_insn arm: [MVE intrinsics] factorize vadd vsubq vmulq arm: [MVE intrinsics] rework vaddq vmulq vsubq arm: [MVE intrinsics] add binary shape arm: [MVE intrinsics] factorize vandq veorq vorrq vbicq arm: [MVE intrinsics] rework vandq veorq arm: [MVE intrinsics] add binary_orrq shape arm: [MVE intrinsics] rework vorrq arm: [MVE intrinsics] add unspec_mve_function_exact_insn arm: [MVE intrinsics] add create shape arm: [MVE intrinsics] factorize vcreateq arm: [MVE intrinsics] rework vcreateq arm: [MVE intrinsics] factorize several binary_m operations arm: [MVE intrinsics] factorize several binary _n operations arm: [MVE intrinsics] factorize several binary _m_n operations arm: [MVE intrinsics] factorize several binary operations arm: [MVE intrinsics] rework vhaddq vhsubq vmulhq vqaddq vqsubq vqdmulhq vrhaddq vrmulhq gcc/config.gcc | 2 +- gcc/config/arm/arm-builtins.cc | 237 +- gcc/config/arm/arm-builtins.h | 1 + gcc/config/arm/arm-c.cc | 42 +- gcc/config/arm/arm-mve-builtins-base.cc | 163 + gcc/config/arm/arm-mve-builtins-base.def | 50 + gcc/config/arm/arm-mve-builtins-base.h | 47 + gcc/config/arm/arm-mve-builtins-functions.h | 387 + gcc/config/arm/arm-mve-builtins-shapes.cc | 529 ++ gcc/config/arm/arm-mve-builtins-shapes.h | 47 + gcc/config/arm/arm-mve-builtins.cc | 2013 ++++- gcc/config/arm/arm-mve-builtins.def | 40 +- gcc/config/arm/arm-mve-builtins.h | 672 +- gcc/config/arm/arm-protos.h | 24 + gcc/config/arm/arm.cc | 27 + gcc/config/arm/arm_mve.h | 7581 +---------------- gcc/config/arm/arm_mve_builtins.def | 6 - gcc/config/arm/arm_mve_types.h | 1430 ---- gcc/config/arm/iterators.md | 240 +- gcc/config/arm/mve.md | 1747 +--- gcc/config/arm/predicates.md | 4 + gcc/config/arm/t-arm | 32 +- gcc/config/arm/unspecs.md | 1 + gcc/config/arm/vec-common.md | 8 +- gcc/testsuite/g++.target/arm/mve.exp | 8 +- .../arm/mve/general-c++/nomve_fp_1.c | 15 + .../arm/mve/general-c++/vreinterpretq_1.C | 25 + .../gcc.target/arm/mve/general-c/nomve_fp_1.c | 15 + .../arm/mve/general-c/vreinterpretq_1.c | 25 + 29 files changed, 4926 insertions(+), 10492 deletions(-) create mode 100644 gcc/config/arm/arm-mve-builtins-base.cc create mode 100644 gcc/config/arm/arm-mve-builtins-base.def create mode 100644 gcc/config/arm/arm-mve-builtins-base.h create mode 100644 gcc/config/arm/arm-mve-builtins-functions.h create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.cc create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.h create mode 100644 gcc/testsuite/g++.target/arm/mve/general-c++/nomve_fp_1.c create mode 100644 gcc/testsuite/g++.target/arm/mve/general-c++/vreinterpretq_1.C create mode 100644 gcc/testsuite/gcc.target/arm/mve/general-c/nomve_fp_1.c create mode 100644 gcc/testsuite/gcc.target/arm/mve/general-c/vreinterpretq_1.c
Comments
Hi Christophe, > -----Original Message----- > From: Christophe Lyon <christophe.lyon@arm.com> > Sent: Tuesday, April 18, 2023 2:46 PM > To: gcc-patches@gcc.gnu.org; Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>; > Richard Earnshaw <Richard.Earnshaw@arm.com>; Richard Sandiford > <Richard.Sandiford@arm.com> > Cc: Christophe Lyon <Christophe.Lyon@arm.com> > Subject: [PATCH 00/22] arm: New framework for MVE intrinsics > > Hi, > > This is the beginning of a long patch series to change the way Arm MVE > intrinsics are implemented. The goal is to get rid of arm_mve.h, which > takes a long time to parse and compile. > Thanks for doing this. It is a significant improvement to the MVE intrinsics and should address some of the biggest maintainability and scalability issues we have in that area. I'll be going through the patches one-by-one (I've looked at these offline already before), but the approach looks good to me at a high level. My hope is that we'll move all the intrinsics, including the Neon ones to use this framework in the future, but getting the framework in place first is a good major first step in that direction. Thanks, Kyrill > Roughly speaking, it's about using a framework very similar to what is > implemented for AArch64/SVE intrinsics. I haven't converted all the > intrinsics yet, but I think it would be good to start the conversion > when stage-1 reopens. > > * Factorizing names > One of the main implementation differences I noticed between SVE and > MVE is that mve.md provides only full builtin names at the moment, and > makes almost no use of "parameterized names" > (https://gcc.gnu.org/onlinedocs/gccint/Parameterized- > Names.html#Parameterized-Names). > > Without this, we'd need the builtin expander to use a large > switch/case of the form: > > switch (code) > case VADDQ_S: insn_code = code_for_mve_vaddq_s (...) > case VADDQ_U: insn_code = code_for_mve_vaddq_u (...) > case VSUBQ_S: insn_code = code_for_mve_vsubq_s (...) > case VSUBQ_U: insn_code = code_for_mve_vsubq_u (...) > .... > > so part of the work (which I called "factorize" in the commit > messages) is about replacing > > (define_insn "mve_vaddq_n_<supf><mode>" > with > (define_insn "@mve_<mve_insn>q_n_<supf><mode>" > with the help of a new iterator (mve_insn). > > Doing so makes it more obvious that some patterns are identical, > except for the instruction name. I took this opportunity to merge > them, so for instance I have a patch which merges add, sub and mul > patterns. Although not strictly necessary for the MVE intrinsics > restructuring work, this is a good opportunity to reduce such code > duplication (I did notice a few bugs during that process, which led me > to post a few small patches in the past months). Note that identical > patterns will probably remain after the series, they can be merged > later if we want. > > This factorization also implies the introduction of new iterators, but > also means that several existing ones become useless. These patches do > not remove them because it's a bit painful to reorder patches which > remove lines at some "random" places, leading to merge conflicts. It's > much simpler to write a big cleanup patch at the end of the serie to > remove all such useless iterators at once. > > * Intrinsic re-implementation > After intrinsic names have been factorized, the actual > re-implementation patch is small: > - add 1 line in each of arm-mve-builtins-base.{cc,def,h} describing > the intrinsic shape/signature, types and predicates involved, > RTX/unspec codes > - remove the intrinsic definitions from arm_mve.h > > The full series of ~140 patches is organized like this: > - patches 1 and 2 introduce the new framework > - new implementation of vreinterpretq > - new implementation of vuninitialized > - patch groups of varying size, consisting in: > - add a new "shape" if needed (e.g. unary, binary, ternary, ....) > - add framework support functions if needed > - factorize a set of intrinsics (at minimum, just make use of > parameterized-names) > - actual re-implementation of the intrinsics > > I kept patches small so the incremental progress is easy to follow and > check. I'll submit the patches in small groups, this first one will > make sure we agree on the implementation. > > Tested on arm-eabi with -mthumb/-mfloat-abi=hard/-march=armv8.1- > m.main+mve. > > To help reviewers, I suggest to compare arm-mve-builtins.cc with > aarch64-sve-builtins.cc. > > Christophe Lyon (22): > arm: move builtin function codes into general numberspace > arm: [MVE intrinsics] Add new framework > arm: [MVE intrinsics] Rework vreinterpretq > arm: [MVE intrinsics] Rework vuninitialized > arm: [MVE intrinsics] add binary_opt_n shape > arm: [MVE intrinsics] add unspec_based_mve_function_exact_insn > arm: [MVE intrinsics] factorize vadd vsubq vmulq > arm: [MVE intrinsics] rework vaddq vmulq vsubq > arm: [MVE intrinsics] add binary shape > arm: [MVE intrinsics] factorize vandq veorq vorrq vbicq > arm: [MVE intrinsics] rework vandq veorq > arm: [MVE intrinsics] add binary_orrq shape > arm: [MVE intrinsics] rework vorrq > arm: [MVE intrinsics] add unspec_mve_function_exact_insn > arm: [MVE intrinsics] add create shape > arm: [MVE intrinsics] factorize vcreateq > arm: [MVE intrinsics] rework vcreateq > arm: [MVE intrinsics] factorize several binary_m operations > arm: [MVE intrinsics] factorize several binary _n operations > arm: [MVE intrinsics] factorize several binary _m_n operations > arm: [MVE intrinsics] factorize several binary operations > arm: [MVE intrinsics] rework vhaddq vhsubq vmulhq vqaddq vqsubq > vqdmulhq vrhaddq vrmulhq > > gcc/config.gcc | 2 +- > gcc/config/arm/arm-builtins.cc | 237 +- > gcc/config/arm/arm-builtins.h | 1 + > gcc/config/arm/arm-c.cc | 42 +- > gcc/config/arm/arm-mve-builtins-base.cc | 163 + > gcc/config/arm/arm-mve-builtins-base.def | 50 + > gcc/config/arm/arm-mve-builtins-base.h | 47 + > gcc/config/arm/arm-mve-builtins-functions.h | 387 + > gcc/config/arm/arm-mve-builtins-shapes.cc | 529 ++ > gcc/config/arm/arm-mve-builtins-shapes.h | 47 + > gcc/config/arm/arm-mve-builtins.cc | 2013 ++++- > gcc/config/arm/arm-mve-builtins.def | 40 +- > gcc/config/arm/arm-mve-builtins.h | 672 +- > gcc/config/arm/arm-protos.h | 24 + > gcc/config/arm/arm.cc | 27 + > gcc/config/arm/arm_mve.h | 7581 +---------------- > gcc/config/arm/arm_mve_builtins.def | 6 - > gcc/config/arm/arm_mve_types.h | 1430 ---- > gcc/config/arm/iterators.md | 240 +- > gcc/config/arm/mve.md | 1747 +--- > gcc/config/arm/predicates.md | 4 + > gcc/config/arm/t-arm | 32 +- > gcc/config/arm/unspecs.md | 1 + > gcc/config/arm/vec-common.md | 8 +- > gcc/testsuite/g++.target/arm/mve.exp | 8 +- > .../arm/mve/general-c++/nomve_fp_1.c | 15 + > .../arm/mve/general-c++/vreinterpretq_1.C | 25 + > .../gcc.target/arm/mve/general-c/nomve_fp_1.c | 15 + > .../arm/mve/general-c/vreinterpretq_1.c | 25 + > 29 files changed, 4926 insertions(+), 10492 deletions(-) > create mode 100644 gcc/config/arm/arm-mve-builtins-base.cc > create mode 100644 gcc/config/arm/arm-mve-builtins-base.def > create mode 100644 gcc/config/arm/arm-mve-builtins-base.h > create mode 100644 gcc/config/arm/arm-mve-builtins-functions.h > create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.cc > create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.h > create mode 100644 gcc/testsuite/g++.target/arm/mve/general- > c++/nomve_fp_1.c > create mode 100644 gcc/testsuite/g++.target/arm/mve/general- > c++/vreinterpretq_1.C > create mode 100644 gcc/testsuite/gcc.target/arm/mve/general- > c/nomve_fp_1.c > create mode 100644 gcc/testsuite/gcc.target/arm/mve/general- > c/vreinterpretq_1.c > > -- > 2.34.1
On 5/2/23 11:18, Kyrylo Tkachov wrote: > Hi Christophe, > >> -----Original Message----- >> From: Christophe Lyon <christophe.lyon@arm.com> >> Sent: Tuesday, April 18, 2023 2:46 PM >> To: gcc-patches@gcc.gnu.org; Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>; >> Richard Earnshaw <Richard.Earnshaw@arm.com>; Richard Sandiford >> <Richard.Sandiford@arm.com> >> Cc: Christophe Lyon <Christophe.Lyon@arm.com> >> Subject: [PATCH 00/22] arm: New framework for MVE intrinsics >> >> Hi, >> >> This is the beginning of a long patch series to change the way Arm MVE >> intrinsics are implemented. The goal is to get rid of arm_mve.h, which >> takes a long time to parse and compile. >> > > Thanks for doing this. It is a significant improvement to the MVE intrinsics and should address some of the biggest maintainability and scalability issues we have in that area. > I'll be going through the patches one-by-one (I've looked at these offline already before), but the approach looks good to me at a high level. > > My hope is that we'll move all the intrinsics, including the Neon ones to use this framework in the future, but getting the framework in place first is a good major first step in that direction. > Indeed. Ideally we'd probably want to make this framework more generic so that it supports aarch64 SVE, arm MVE and Neon, but that can be done later. I tried to highlight the differences I noticed compared to SVE, so that it helps us think what needs to be specialized for different targets, as opposed to what is already generic enough. Thanks, Christophe > Thanks, > Kyrill > >> Roughly speaking, it's about using a framework very similar to what is >> implemented for AArch64/SVE intrinsics. I haven't converted all the >> intrinsics yet, but I think it would be good to start the conversion >> when stage-1 reopens. >> >> * Factorizing names >> One of the main implementation differences I noticed between SVE and >> MVE is that mve.md provides only full builtin names at the moment, and >> makes almost no use of "parameterized names" >> (https://gcc.gnu.org/onlinedocs/gccint/Parameterized- >> Names.html#Parameterized-Names). >> >> Without this, we'd need the builtin expander to use a large >> switch/case of the form: >> >> switch (code) >> case VADDQ_S: insn_code = code_for_mve_vaddq_s (...) >> case VADDQ_U: insn_code = code_for_mve_vaddq_u (...) >> case VSUBQ_S: insn_code = code_for_mve_vsubq_s (...) >> case VSUBQ_U: insn_code = code_for_mve_vsubq_u (...) >> .... >> >> so part of the work (which I called "factorize" in the commit >> messages) is about replacing >> >> (define_insn "mve_vaddq_n_<supf><mode>" >> with >> (define_insn "@mve_<mve_insn>q_n_<supf><mode>" >> with the help of a new iterator (mve_insn). >> >> Doing so makes it more obvious that some patterns are identical, >> except for the instruction name. I took this opportunity to merge >> them, so for instance I have a patch which merges add, sub and mul >> patterns. Although not strictly necessary for the MVE intrinsics >> restructuring work, this is a good opportunity to reduce such code >> duplication (I did notice a few bugs during that process, which led me >> to post a few small patches in the past months). Note that identical >> patterns will probably remain after the series, they can be merged >> later if we want. >> >> This factorization also implies the introduction of new iterators, but >> also means that several existing ones become useless. These patches do >> not remove them because it's a bit painful to reorder patches which >> remove lines at some "random" places, leading to merge conflicts. It's >> much simpler to write a big cleanup patch at the end of the serie to >> remove all such useless iterators at once. >> >> * Intrinsic re-implementation >> After intrinsic names have been factorized, the actual >> re-implementation patch is small: >> - add 1 line in each of arm-mve-builtins-base.{cc,def,h} describing >> the intrinsic shape/signature, types and predicates involved, >> RTX/unspec codes >> - remove the intrinsic definitions from arm_mve.h >> >> The full series of ~140 patches is organized like this: >> - patches 1 and 2 introduce the new framework >> - new implementation of vreinterpretq >> - new implementation of vuninitialized >> - patch groups of varying size, consisting in: >> - add a new "shape" if needed (e.g. unary, binary, ternary, ....) >> - add framework support functions if needed >> - factorize a set of intrinsics (at minimum, just make use of >> parameterized-names) >> - actual re-implementation of the intrinsics >> >> I kept patches small so the incremental progress is easy to follow and >> check. I'll submit the patches in small groups, this first one will >> make sure we agree on the implementation. >> >> Tested on arm-eabi with -mthumb/-mfloat-abi=hard/-march=armv8.1- >> m.main+mve. >> >> To help reviewers, I suggest to compare arm-mve-builtins.cc with >> aarch64-sve-builtins.cc. >> >> Christophe Lyon (22): >> arm: move builtin function codes into general numberspace >> arm: [MVE intrinsics] Add new framework >> arm: [MVE intrinsics] Rework vreinterpretq >> arm: [MVE intrinsics] Rework vuninitialized >> arm: [MVE intrinsics] add binary_opt_n shape >> arm: [MVE intrinsics] add unspec_based_mve_function_exact_insn >> arm: [MVE intrinsics] factorize vadd vsubq vmulq >> arm: [MVE intrinsics] rework vaddq vmulq vsubq >> arm: [MVE intrinsics] add binary shape >> arm: [MVE intrinsics] factorize vandq veorq vorrq vbicq >> arm: [MVE intrinsics] rework vandq veorq >> arm: [MVE intrinsics] add binary_orrq shape >> arm: [MVE intrinsics] rework vorrq >> arm: [MVE intrinsics] add unspec_mve_function_exact_insn >> arm: [MVE intrinsics] add create shape >> arm: [MVE intrinsics] factorize vcreateq >> arm: [MVE intrinsics] rework vcreateq >> arm: [MVE intrinsics] factorize several binary_m operations >> arm: [MVE intrinsics] factorize several binary _n operations >> arm: [MVE intrinsics] factorize several binary _m_n operations >> arm: [MVE intrinsics] factorize several binary operations >> arm: [MVE intrinsics] rework vhaddq vhsubq vmulhq vqaddq vqsubq >> vqdmulhq vrhaddq vrmulhq >> >> gcc/config.gcc | 2 +- >> gcc/config/arm/arm-builtins.cc | 237 +- >> gcc/config/arm/arm-builtins.h | 1 + >> gcc/config/arm/arm-c.cc | 42 +- >> gcc/config/arm/arm-mve-builtins-base.cc | 163 + >> gcc/config/arm/arm-mve-builtins-base.def | 50 + >> gcc/config/arm/arm-mve-builtins-base.h | 47 + >> gcc/config/arm/arm-mve-builtins-functions.h | 387 + >> gcc/config/arm/arm-mve-builtins-shapes.cc | 529 ++ >> gcc/config/arm/arm-mve-builtins-shapes.h | 47 + >> gcc/config/arm/arm-mve-builtins.cc | 2013 ++++- >> gcc/config/arm/arm-mve-builtins.def | 40 +- >> gcc/config/arm/arm-mve-builtins.h | 672 +- >> gcc/config/arm/arm-protos.h | 24 + >> gcc/config/arm/arm.cc | 27 + >> gcc/config/arm/arm_mve.h | 7581 +---------------- >> gcc/config/arm/arm_mve_builtins.def | 6 - >> gcc/config/arm/arm_mve_types.h | 1430 ---- >> gcc/config/arm/iterators.md | 240 +- >> gcc/config/arm/mve.md | 1747 +--- >> gcc/config/arm/predicates.md | 4 + >> gcc/config/arm/t-arm | 32 +- >> gcc/config/arm/unspecs.md | 1 + >> gcc/config/arm/vec-common.md | 8 +- >> gcc/testsuite/g++.target/arm/mve.exp | 8 +- >> .../arm/mve/general-c++/nomve_fp_1.c | 15 + >> .../arm/mve/general-c++/vreinterpretq_1.C | 25 + >> .../gcc.target/arm/mve/general-c/nomve_fp_1.c | 15 + >> .../arm/mve/general-c/vreinterpretq_1.c | 25 + >> 29 files changed, 4926 insertions(+), 10492 deletions(-) >> create mode 100644 gcc/config/arm/arm-mve-builtins-base.cc >> create mode 100644 gcc/config/arm/arm-mve-builtins-base.def >> create mode 100644 gcc/config/arm/arm-mve-builtins-base.h >> create mode 100644 gcc/config/arm/arm-mve-builtins-functions.h >> create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.cc >> create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.h >> create mode 100644 gcc/testsuite/g++.target/arm/mve/general- >> c++/nomve_fp_1.c >> create mode 100644 gcc/testsuite/g++.target/arm/mve/general- >> c++/vreinterpretq_1.C >> create mode 100644 gcc/testsuite/gcc.target/arm/mve/general- >> c/nomve_fp_1.c >> create mode 100644 gcc/testsuite/gcc.target/arm/mve/general- >> c/vreinterpretq_1.c >> >> -- >> 2.34.1 >
On 5/2/23 17:04, Christophe Lyon via Gcc-patches wrote: > > > On 5/2/23 11:18, Kyrylo Tkachov wrote: >> Hi Christophe, >> >>> -----Original Message----- >>> From: Christophe Lyon <christophe.lyon@arm.com> >>> Sent: Tuesday, April 18, 2023 2:46 PM >>> To: gcc-patches@gcc.gnu.org; Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>; >>> Richard Earnshaw <Richard.Earnshaw@arm.com>; Richard Sandiford >>> <Richard.Sandiford@arm.com> >>> Cc: Christophe Lyon <Christophe.Lyon@arm.com> >>> Subject: [PATCH 00/22] arm: New framework for MVE intrinsics >>> >>> Hi, >>> >>> This is the beginning of a long patch series to change the way Arm MVE >>> intrinsics are implemented. The goal is to get rid of arm_mve.h, which >>> takes a long time to parse and compile. >>> >> >> Thanks for doing this. It is a significant improvement to the MVE >> intrinsics and should address some of the biggest maintainability and >> scalability issues we have in that area. >> I'll be going through the patches one-by-one (I've looked at these >> offline already before), but the approach looks good to me at a high >> level. >> >> My hope is that we'll move all the intrinsics, including the Neon ones >> to use this framework in the future, but getting the framework in >> place first is a good major first step in that direction. >> > > Indeed. Ideally we'd probably want to make this framework more generic > so that it supports aarch64 SVE, arm MVE and Neon, but that can be done > later. I tried to highlight the differences I noticed compared to SVE, > so that it helps us think what needs to be specialized for different > targets, as opposed to what is already generic enough. > > Thanks, > > Christophe > Thank you Kyrill for the quick review. I've pushed the series with the minor changes you requested. I am going to prepare the next batch :-) Thanks, Christophe >> Thanks, >> Kyrill >> >>> Roughly speaking, it's about using a framework very similar to what is >>> implemented for AArch64/SVE intrinsics. I haven't converted all the >>> intrinsics yet, but I think it would be good to start the conversion >>> when stage-1 reopens. >>> >>> * Factorizing names >>> One of the main implementation differences I noticed between SVE and >>> MVE is that mve.md provides only full builtin names at the moment, and >>> makes almost no use of "parameterized names" >>> (https://gcc.gnu.org/onlinedocs/gccint/Parameterized- >>> Names.html#Parameterized-Names). >>> >>> Without this, we'd need the builtin expander to use a large >>> switch/case of the form: >>> >>> switch (code) >>> case VADDQ_S: insn_code = code_for_mve_vaddq_s (...) >>> case VADDQ_U: insn_code = code_for_mve_vaddq_u (...) >>> case VSUBQ_S: insn_code = code_for_mve_vsubq_s (...) >>> case VSUBQ_U: insn_code = code_for_mve_vsubq_u (...) >>> .... >>> >>> so part of the work (which I called "factorize" in the commit >>> messages) is about replacing >>> >>> (define_insn "mve_vaddq_n_<supf><mode>" >>> with >>> (define_insn "@mve_<mve_insn>q_n_<supf><mode>" >>> with the help of a new iterator (mve_insn). >>> >>> Doing so makes it more obvious that some patterns are identical, >>> except for the instruction name. I took this opportunity to merge >>> them, so for instance I have a patch which merges add, sub and mul >>> patterns. Although not strictly necessary for the MVE intrinsics >>> restructuring work, this is a good opportunity to reduce such code >>> duplication (I did notice a few bugs during that process, which led me >>> to post a few small patches in the past months). Note that identical >>> patterns will probably remain after the series, they can be merged >>> later if we want. >>> >>> This factorization also implies the introduction of new iterators, but >>> also means that several existing ones become useless. These patches do >>> not remove them because it's a bit painful to reorder patches which >>> remove lines at some "random" places, leading to merge conflicts. It's >>> much simpler to write a big cleanup patch at the end of the serie to >>> remove all such useless iterators at once. >>> >>> * Intrinsic re-implementation >>> After intrinsic names have been factorized, the actual >>> re-implementation patch is small: >>> - add 1 line in each of arm-mve-builtins-base.{cc,def,h} describing >>> the intrinsic shape/signature, types and predicates involved, >>> RTX/unspec codes >>> - remove the intrinsic definitions from arm_mve.h >>> >>> The full series of ~140 patches is organized like this: >>> - patches 1 and 2 introduce the new framework >>> - new implementation of vreinterpretq >>> - new implementation of vuninitialized >>> - patch groups of varying size, consisting in: >>> - add a new "shape" if needed (e.g. unary, binary, ternary, ....) >>> - add framework support functions if needed >>> - factorize a set of intrinsics (at minimum, just make use of >>> parameterized-names) >>> - actual re-implementation of the intrinsics >>> >>> I kept patches small so the incremental progress is easy to follow and >>> check. I'll submit the patches in small groups, this first one will >>> make sure we agree on the implementation. >>> >>> Tested on arm-eabi with -mthumb/-mfloat-abi=hard/-march=armv8.1- >>> m.main+mve. >>> >>> To help reviewers, I suggest to compare arm-mve-builtins.cc with >>> aarch64-sve-builtins.cc. >>> >>> Christophe Lyon (22): >>> arm: move builtin function codes into general numberspace >>> arm: [MVE intrinsics] Add new framework >>> arm: [MVE intrinsics] Rework vreinterpretq >>> arm: [MVE intrinsics] Rework vuninitialized >>> arm: [MVE intrinsics] add binary_opt_n shape >>> arm: [MVE intrinsics] add unspec_based_mve_function_exact_insn >>> arm: [MVE intrinsics] factorize vadd vsubq vmulq >>> arm: [MVE intrinsics] rework vaddq vmulq vsubq >>> arm: [MVE intrinsics] add binary shape >>> arm: [MVE intrinsics] factorize vandq veorq vorrq vbicq >>> arm: [MVE intrinsics] rework vandq veorq >>> arm: [MVE intrinsics] add binary_orrq shape >>> arm: [MVE intrinsics] rework vorrq >>> arm: [MVE intrinsics] add unspec_mve_function_exact_insn >>> arm: [MVE intrinsics] add create shape >>> arm: [MVE intrinsics] factorize vcreateq >>> arm: [MVE intrinsics] rework vcreateq >>> arm: [MVE intrinsics] factorize several binary_m operations >>> arm: [MVE intrinsics] factorize several binary _n operations >>> arm: [MVE intrinsics] factorize several binary _m_n operations >>> arm: [MVE intrinsics] factorize several binary operations >>> arm: [MVE intrinsics] rework vhaddq vhsubq vmulhq vqaddq vqsubq >>> vqdmulhq vrhaddq vrmulhq >>> >>> gcc/config.gcc | 2 +- >>> gcc/config/arm/arm-builtins.cc | 237 +- >>> gcc/config/arm/arm-builtins.h | 1 + >>> gcc/config/arm/arm-c.cc | 42 +- >>> gcc/config/arm/arm-mve-builtins-base.cc | 163 + >>> gcc/config/arm/arm-mve-builtins-base.def | 50 + >>> gcc/config/arm/arm-mve-builtins-base.h | 47 + >>> gcc/config/arm/arm-mve-builtins-functions.h | 387 + >>> gcc/config/arm/arm-mve-builtins-shapes.cc | 529 ++ >>> gcc/config/arm/arm-mve-builtins-shapes.h | 47 + >>> gcc/config/arm/arm-mve-builtins.cc | 2013 ++++- >>> gcc/config/arm/arm-mve-builtins.def | 40 +- >>> gcc/config/arm/arm-mve-builtins.h | 672 +- >>> gcc/config/arm/arm-protos.h | 24 + >>> gcc/config/arm/arm.cc | 27 + >>> gcc/config/arm/arm_mve.h | 7581 +---------------- >>> gcc/config/arm/arm_mve_builtins.def | 6 - >>> gcc/config/arm/arm_mve_types.h | 1430 ---- >>> gcc/config/arm/iterators.md | 240 +- >>> gcc/config/arm/mve.md | 1747 +--- >>> gcc/config/arm/predicates.md | 4 + >>> gcc/config/arm/t-arm | 32 +- >>> gcc/config/arm/unspecs.md | 1 + >>> gcc/config/arm/vec-common.md | 8 +- >>> gcc/testsuite/g++.target/arm/mve.exp | 8 +- >>> .../arm/mve/general-c++/nomve_fp_1.c | 15 + >>> .../arm/mve/general-c++/vreinterpretq_1.C | 25 + >>> .../gcc.target/arm/mve/general-c/nomve_fp_1.c | 15 + >>> .../arm/mve/general-c/vreinterpretq_1.c | 25 + >>> 29 files changed, 4926 insertions(+), 10492 deletions(-) >>> create mode 100644 gcc/config/arm/arm-mve-builtins-base.cc >>> create mode 100644 gcc/config/arm/arm-mve-builtins-base.def >>> create mode 100644 gcc/config/arm/arm-mve-builtins-base.h >>> create mode 100644 gcc/config/arm/arm-mve-builtins-functions.h >>> create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.cc >>> create mode 100644 gcc/config/arm/arm-mve-builtins-shapes.h >>> create mode 100644 gcc/testsuite/g++.target/arm/mve/general- >>> c++/nomve_fp_1.c >>> create mode 100644 gcc/testsuite/g++.target/arm/mve/general- >>> c++/vreinterpretq_1.C >>> create mode 100644 gcc/testsuite/gcc.target/arm/mve/general- >>> c/nomve_fp_1.c >>> create mode 100644 gcc/testsuite/gcc.target/arm/mve/general- >>> c/vreinterpretq_1.c >>> >>> -- >>> 2.34.1 >>