From patchwork Fri Nov 11 17:39:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stamatis Markianos-Wright X-Patchwork-Id: 18932 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp879513wru; Fri, 11 Nov 2022 09:41:55 -0800 (PST) X-Google-Smtp-Source: AA0mqf7XI5H1sD7xALhq0K/b77eTMoiL26Sjemj6ZmKs7hfhl56nRvWaXBD/JPb+9GGs085P2tFU X-Received: by 2002:a17:907:9144:b0:7a8:3597:34a8 with SMTP id l4-20020a170907914400b007a8359734a8mr2666537ejs.628.1668188515500; Fri, 11 Nov 2022 09:41:55 -0800 (PST) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id m6-20020a056402510600b004643d19e32esi2770892edd.618.2022.11.11.09.41.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Nov 2022 09:41:55 -0800 (PST) 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=M6D9RSD7; 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 930C5383F972 for ; Fri, 11 Nov 2022 17:41:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 930C5383F972 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668188509; bh=mBTBnksHISG6iLabDyAmf4Qbitpy5XQVpm7hVX1OfO8=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=M6D9RSD7NlcFq6ziR+LkhV+dBpj6XQGKO2RV7N/Usc2PT1VcZXsWR+8qztZyfMxRB y1XYmltWkxFLGqXklYK36wDa8vpiXK9TKLhvQniMbiVaFmQEVA6mmwDFNTa0x6KF+z emcq4hyYg9XhCD+fFHjFuUlfb9BwTo1gRCX9pxRk= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01hn2216.outbound.protection.outlook.com [52.100.6.216]) by sourceware.org (Postfix) with ESMTPS id 5F0773858C62 for ; Fri, 11 Nov 2022 17:40:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5F0773858C62 ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=dLcTz+74oYz7SLSYWyHo0fQ0ygoTR2llF0rDY1zQOOM3NBvvpi2ycpfyqphnh46r+XqmwOuPgdMuYqLma8xoJP9rhip1mnyYj9ryT0DfWN/Jn+XNH2iTbwFG8phkr17+PoW62b5Vrtae8td7bN4IzQNedYix88Jwz2llCHZTRRglrG+2v5GM30j23gxC9zQV5sKhL4BXA88ZxyWhmaSAL3cUtsEt3RGsHtIxTFegX0hFNQFaB0ukMGFEIUVZABcXUeO6wACC43xFXLTEIyWi4lv16FnXtADBuoTZTcIduDJGIEm0DxCM7B6BLTZSxlkN8Jq2Zgbvv5bZ1JW0f+N5mA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mBTBnksHISG6iLabDyAmf4Qbitpy5XQVpm7hVX1OfO8=; b=ibW3lJlt94/yFKStHG1tuYI0WA+WvczRAsJxkAVQJAmtdI6f0nnpLdspNCNrXi56z7pr8sSSzBId4VeDVx8lm3AuaQIVZuyqo2czsh0tF3Z83IYgK9/dVOAhHHisv1PxA5ctfmYgXq7QUAnGCCi9AblX8toOoP7nYeLcKKTW4xvYNF8SfW+4/VWFDh6Xjro9s1Wbe+T3iFvUAVDdS9dwAbN56JYsAW1KNZci0EChXqSt1bWt2SNMDzCHSpmC6mqo7p7ZWAO0TtIDPEzY4cYYV/Zd5YmCGp2SFUyuSj/tdPcOWaMtwD6FEun1TMFe/20IpYnJKdWSK03xEeqKhc8WNQ== 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=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) Received: from AS9PR0301CA0029.eurprd03.prod.outlook.com (2603:10a6:20b:468::10) by DBBPR08MB5898.eurprd08.prod.outlook.com (2603:10a6:10:20c::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Fri, 11 Nov 2022 17:40:13 +0000 Received: from AM7EUR03FT003.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:468:cafe::81) by AS9PR0301CA0029.outlook.office365.com (2603:10a6:20b:468::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13 via Frontend Transport; Fri, 11 Nov 2022 17:40:13 +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 AM7EUR03FT003.mail.protection.outlook.com (100.127.140.227) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.12 via Frontend Transport; Fri, 11 Nov 2022 17:40:13 +0000 Received: ("Tessian outbound 58faf9791229:v130"); Fri, 11 Nov 2022 17:40:13 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: c4c4cbb28b3ae754 X-CR-MTA-TID: 64aa7808 Received: from a6de4a6fa9a7.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id CE793A8D-9DF8-4E65-8271-60CC0E820E00.1; Fri, 11 Nov 2022 17:40:04 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id a6de4a6fa9a7.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 11 Nov 2022 17:40:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kdSvbL7+8ly+80lfea8Ah68G5Zvo+WkHVuxNf8+zhA94CkgjUumYqd8ML7TYlJ2w2ycnTZgL90ZGLA1I4lfR5SS0yAfacGkZPTZ56ekFShwLSmgtRyZ8adUXDrC+mD1jb7HS9amgdowJVyKlCfr8fR5FEdFLobINkWxi6VGMHqF1pnj+lNwBnfAeVPOdz0t0JD/Ri795ublY2gWS4HwM+TFnDXYoekwihQHiujA58s8T7KB+bVnMwptQnrtf+crlp18O8rEAoduzeLawAzaOjEMtenRAXXFNQKbfM2DiBEOMbUNLT69EuYc/aT4vrr7ugm4q8OaOwoD51h8wlMDZ8w== 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=mBTBnksHISG6iLabDyAmf4Qbitpy5XQVpm7hVX1OfO8=; b=P8Xx3A+/BxuEiU1aflkK7iKJXR3uOMFhO+s1RvCD+s5CFVStNYD8ncrh0RfW4PIYuYR2lwE1LGqHiNZ2w8hP5D04vvmAmxiogwoxM74Vz/BQONjKHvCXH3oDoLFPt5qRs8i3jnII0tsaW12Z08K6h8fitazb/E+3etoEX8ONro87xh0CzubOJ9Qb9/kzBq5PYFbzsPw6ViOrLI/IaaC6gnYGEcLJlPg/+3UX0GywBaHnVkX29mizT9+QGPkk2O8YHo4PEWh0O7qIXNkr67x9vTedqN242LBxwRtAd9ekcvcgwJdRaci874z/AhqEMWoXGjC6iquS+bPVy/fqcUsHNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by GV2PR08MB8196.eurprd08.prod.outlook.com (2603:10a6:150:7c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Fri, 11 Nov 2022 17:40:00 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::1131:99da:d256:ae1f]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::1131:99da:d256:ae1f%4]) with mapi id 15.20.5813.015; Fri, 11 Nov 2022 17:39:58 +0000 Message-ID: Date: Fri, 11 Nov 2022 17:39:55 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: en-US To: gcc-patches@gcc.gnu.org Subject: [PATCH 1/2] arm: Add define_attr to to create a mapping between MVE predicated and unpredicated insns X-ClientProxiedBy: LO2P123CA0058.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1::22) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|GV2PR08MB8196:EE_|AM7EUR03FT003:EE_|DBBPR08MB5898:EE_ X-MS-Office365-Filtering-Correlation-Id: a8183c1a-5f38-492f-c34f-08dac40bc9b7 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: dTQa/KP8clprekFHz7sp74bXSfIXOwQvzjbbUjYYQgQ0UIG8qnwaUH8d3UtdjN4eiIayUquX4wOq1WvvkuHBqei5vl8it1I3tjhPAvHgtblW/kifmhCq+o/v03mPUse5/QJM7ja9Zpt02LS2LFl0pO4pyroA6sqMoGvHmLdhN+fPTWp2c7bEYeqdwluFmW/5zC5etS0webuqHq5vmwnAiNoYnLIrygoBlZqPrVLIGzvBlpaZZE0vkA5vOXxNqFL3wKxxhlnrjb/LDCs6eazlrZd722MIBLTPmua2Um+NLYeBFRD5rLyY8ZdTrZyl3nooLXzmBflyYE/vB9vagVlxvvLGjbbxARGQI2loM4KM5iqYm9j4IFrgjQS9twI9ogUJnDj8uYAs1H0clGXXsKMrQTWL9TT3Vu9jgufL7R/6wspXcAYhOubTs9plH/mO3NbQAnevpKSxa74hZTfiPqnlYeD9MSdRLOkW9SqdvsD6RekGTkrMMptmKZtU7EQD2ocvh0ltBLjCZwM/T+PbDUdDnXVU9TUCuiuLSH6vPkKF+7MaeL+XDlcME+g/w6Eb6TjgA94+nj+dV/RR5nsGuySzY/1MemYlEfovsdq9l9zcdbglXsGYg+hFVvEnFUTDgH1tthjCazvNWlOsZz0fFcZK9RSmaGNA4s/popo1/UEeT51/qje/VdV2PMB08VWYva0Ah3EzPyJjGPrW/4cYeY5ZTqgl9QQcblSyd+am6FH1iN9IY+/oKOd1AbomwUPJCYv0Bg1MR15+p8vvdaY0usFrex2JoYdoJWwitU9HIvBGhMINuXYj+mm5qpH2a4WHwKuXLXXvz3f7DaFNhZjvy7HqhirBACjjayhJBTFvH/3wGMDkS9QPC404Y4LU/5vH1RE55LfWsqEqVEmiX0eYzU2tvjYa7j4X3KjPaGYLw8GTeTmEomxwEqou5Te0saEKhCr7lp+2vxhogMiVUirh8qTbv3B0D5u9FMdZmuP4SGYpyWilwQITaSrf4qjj2rx7cf/JLNbDQdN3WfB4/4iovLLtDpibOu13wMjR1yFG6NvEHUIcliIEKc5m4DxoTSIHyeiKsOhXvX0n9Le9ExSVPnnA+383eFOnMpaPshX3Scx7tpKudz7KdMgC7XoLqZSnoKiEVOwR4pJbfD1YTG+Ebo9ikkDWMVb/rDw3B5DR9ChFJ3FlJ7eJNQrnySqLVJvh2OCysfrBWYSlUml4KiltW81Zy026I8yo/AOlmZPZ2SVC0oeOXwKL7BQ7lEJGE7+tEkmH7L0syIq7OXkiaI2fzYzeXw== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:5; SRV:; IPV:NLI; SFV:SPM; H:DB9PR08MB6507.eurprd08.prod.outlook.com; PTR:; CAT:OSPM; SFS:(13230022)(4636009)(396003)(346002)(39860400002)(366004)(376002)(136003)(451199015)(6486002)(966005)(31686004)(84970400001)(2906002)(36756003)(31696002)(86362001)(8936002)(235185007)(41300700001)(66556008)(8676002)(66476007)(66946007)(316002)(6916009)(5660300002)(33964004)(6666004)(6506007)(478600001)(38100700002)(30864003)(83380400001)(2616005)(6512007)(26005)(186003)(45980500001)(43740500002)(559001)(579004)(11215385002); DIR:OUT; SFP:1501; X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8196 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM7EUR03FT003.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 082579c3-5028-47a7-7ea8-08dac40bc040 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: =?utf-8?q?I38qoqoRGl5T5OlL15u1QmheGj3RMrP?= =?utf-8?q?UqSNsTrhPHHffcUJ42oAFmnUl8ZCfIn7YzyCawiSLIbRSG6/7Lgkjuf2aFyNo88Xz?= =?utf-8?q?lUYTtybxntnbBX+zuR89ViTZguV5WRav2D0kmRMdRzjMumLNA+GyZe6J2j1z9cAp1?= =?utf-8?q?iIsA3JzP1EfygoOMw4ITHhTzxOJT/0DI5+YByI+CadfukTOzrkCSd3e4KfAjXmSEv?= =?utf-8?q?2nyRCl7pCMCkOYEDiAOUowrkt0vfHV0trcephuSciybSiufanquBfFVVyTE02ts7m?= =?utf-8?q?WdLZ+NobMWX9ijSsbxLKUEFi2khtnTmK7Et8omFi40omD2BX3dK2e+5OButQMt9EK?= =?utf-8?q?MghacIQDGCPqdu+5uH092RbgdZQZBFIyRqh8DkuE8wZAMNxdnCOyRwDj3f/qIAB0x?= =?utf-8?q?cisr2jCu0pxqfnwk0docQtOzIPQ2eHmgwCLqxcs5hDd4suKSieS431m1LQmxulFFv?= =?utf-8?q?U1ycKw8bZ4wXWT57juAMT7MhUi9uqZNqedFKo1R1KQaf63BgNrAM86J00lgUBhDI2?= =?utf-8?q?GV/YAzrBegi6xrWOa1LG3sIenG5aquQdM4knuU/Z/Ektn6OnP2Dw72Utb4vi2YgXF?= =?utf-8?q?osNXRbacpINreFoY/N+hwi8c1SRDej/6jtReXavbTUEi5wkVteqBUe52dhNZr5BMI?= =?utf-8?q?EwWrf0+sg4bqGOgvPp7b5r7IhvJeI9DTgZqjRKx9fz30yj69vWI4quHr/ulEMhc4f?= =?utf-8?q?MISrlc2aoy6C5uHCu2vAEKgMWmS40AP9c/58I6tipv4+FaSpUMuqmDAHEIs9ei/fz?= =?utf-8?q?6U10O9Ff3XdjHOOt4BRUnlXVeukbD+YlHYOqvXBDgjpPt7ilHOYxZQZZp+eK/ZoDs?= =?utf-8?q?1zJSJhZ9lH9iFLtoHb0yvd0te1lOR9TUfUo8BIyeUTb2lAiOsk2VR7RLHOlWROJi6?= =?utf-8?q?Nv+4oMV8pPorH4ou2+adGsfAU5AbObIwbOv3xd682BqFA2my8g7AZl1/Kg6M2xkHQ?= =?utf-8?q?I2izgiBNP9t7D19MCojBOAFEALd8mp1DLlE5bhaelQWh+jH63j5eBsLWy1F8AQS9r?= =?utf-8?q?qbq+tMpMzMRJ96NXpH9cTCcWrjwivHvr6ZxhOoOJrYy7F25PlIglnUZG+1efFQ6Ya?= =?utf-8?q?zeZPmKeQ+29VldqStPOWnF2lw5IlcA+Uobz17KwvBRK8dmuk6vsQANDG/MplJEUSt?= =?utf-8?q?N+WXBnHdCBB3S+shbBlkzu7QVrQW01YjLlzN0+dCf5Jcu/tkz4GUlKosNpQHqtZk5?= =?utf-8?q?J9IjWzCOmCjl7u08nQgOBagTEDeWJRTUMuQOWpL9PfB8w2IOk0ySaEBR8=3D?= X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:5; SRV:; IPV:CAL; SFV:SPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:OSPM; SFS:(13230022)(4636009)(136003)(376002)(396003)(39860400002)(346002)(451199015)(46966006)(36840700001)(40470700004)(31686004)(36860700001)(84970400001)(966005)(6506007)(6486002)(5660300002)(235185007)(26005)(2616005)(6512007)(82740400003)(2906002)(186003)(356005)(47076005)(40480700001)(36756003)(82310400005)(81166007)(8936002)(30864003)(31696002)(316002)(83380400001)(6916009)(40460700003)(41300700001)(496002)(478600001)(6666004)(33964004)(336012)(70206006)(70586007)(8676002)(86362001)(43740500002)(559001)(579004)(11215385002); DIR:OUT; SFP:1501; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Nov 2022 17:40:13.3669 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a8183c1a-5f38-492f-c34f-08dac40bc9b7 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: AM7EUR03FT003.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB5898 X-Spam-Status: No, score=-9.5 required=5.0 tests=AXB_X_FF_SEZ_S, BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, KAM_LOTSOFHASH, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Stam Markianos-Wright via Gcc-patches From: Stamatis Markianos-Wright Reply-To: Stam Markianos-Wright Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749222440781330583?= X-GMAIL-MSGID: =?utf-8?q?1749222440781330583?= Hi all, I'd like to submit two patches that add support for Arm's MVE Tail Predicated Low Overhead Loop feature. --- Introduction --- The M-class Arm-ARM: https://developer.arm.com/documentation/ddi0553/bu/?lang=en Section B5.5.1 "Loop tail predication" describes the feature we are adding support for with this patch (although we only add codegen for DLSTP/LETP instruction loops). Previously with commit d2ed233cb94 we'd added support for non-MVE DLS/LE loops through the loop-doloop pass, which, given a standard MVE loop like: ``` void  __attribute__ ((noinline)) test (int16_t *a, int16_t *b, int16_t *c, int n) {   while (n > 0)     {       mve_pred16_t p = vctp16q (n);       int16x8_t va = vldrhq_z_s16 (a, p);       int16x8_t vb = vldrhq_z_s16 (b, p);       int16x8_t vc = vaddq_x_s16 (va, vb, p);       vstrhq_p_s16 (c, vc, p);       c+=8;       a+=8;       b+=8;       n-=8;     } } ``` .. would output: ```                 dls     lr, lr .L3:         vctp.16 r3         vmrs    ip, P0  @ movhi         sxth    ip, ip         vmsr     P0, ip @ movhi         mov     r4, r0         vpst         vldrht.16       q2, [r4]         mov     r4, r1         vmov    q3, q0         vpst         vldrht.16       q1, [r4]         mov     r4, r2         vpst         vaddt.i16       q3, q2, q1         subs    r3, r3, #8         vpst         vstrht.16       q3, [r4]         adds    r0, r0, #16         adds    r1, r1, #16         adds    r2, r2, #16         le      lr, .L3 ``` where the LE instruction will decrement LR by 1, compare and branch if needed. (there are also other inefficiencies with the above code, like the pointless vmrs/sxth/vmsr on the VPR and the adds not being merged into the vldrht/vstrht as a #16 offsets and some random movs! But that's different problems...) The MVE version is similar, except that: * Instead of DLS/LE the instructions are DLSTP/LETP. * Instead of pre-calculating the number of iterations of the   loop, we place the number of elements to be processed by the   loop into LR. * Instead of decrementing the LR by one, LETP will decrement it   by FPSCR.LTPSIZE, which is the number of elements being   processed in each iteration: 16 for 8-bit elements, 5 for 16-bit   elements, etc. * On the final iteration, automatic Loop Tail Predication is   performed, as if the instructions within the loop had been VPT   predicated with a VCTP generating the VPR predicate in every   loop iteration. The dlstp/letp loop now looks like: ```                 dlstp.16        lr, r3 .L14:         mov     r3, r0         vldrh.16        q3, [r3]         mov     r3, r1         vldrh.16        q2, [r3]         mov     r3, r2         vadd.i16  q3, q3, q2         adds    r0, r0, #16         vstrh.16        q3, [r3]         adds    r1, r1, #16         adds    r2, r2, #16         letp    lr, .L14 ``` Since the loop tail predication is automatic, we have eliminated the VCTP that had been specified by the user in the intrinsic and converted the VPT-predicated instructions into their unpredicated equivalents (which also saves us from VPST insns). The LE instruction here decrements LR by 8 in each iteration. --- This 1/2 patch --- This first patch lays some groundwork by adding an attribute to md patterns, and then the second patch contains the functional changes. One major difficulty in implementing MVE Tail-Predicated Low Overhead Loops was the need to transform VPT-predicated insns in the insn chain into their unpredicated equivalents, like: `mve_vldrbq_z_ -> mve_vldrbq_`. This requires us to have a deterministic link between two different patterns in mve.md -- this _could_ be done by re-ordering the entirety of mve.md such that the patterns are at some constant icode proximity (e.g. having the _z immediately after the unpredicated version would mean that to map from the former to the latter you could use icode-1), but that is a very messy solution that would lead to complex unknown dependencies between patterns. This patch proves an alternative way of doing that: using an insn attribute to encode the icode of the unpredicated instruction. This was implemented by doing a find n replace across mve.md using the following patterns: define_insn "(.*)_p_(.*)"((.|\n)*?)\n( )*\[\(set_attr define_insn "$1_p_$2"$3\n$5[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_$1_$2"))\n$5 (set_attr define_insn "(.*)_m_(.*)"((.|\n)*?)\n( )*\[\(set_attr define_insn "$1_m_$2"$3\n$5[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_$1_$2"))\n$5 (set_attr define_insn "(.*)_z_(.*)"((.|\n)*?)\n( )*\[\(set_attr define_insn "$1_z_$2"$3\n$5[(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_$1_$2"))\n$5 (set_attr and then a number of manual fixes were needed for the md patterns that did not conform to the above.  Those changes were: Dropped the type suffix _s/_u_f: CODE_FOR_mve_vcmpcsq_n_ CODE_FOR_mve_vcmpcsq_ CODE_FOR_mve_vcmpeqq_n_ CODE_FOR_mve_vcmpeqq_ CODE_FOR_mve_vcmpgeq_n_ CODE_FOR_mve_vcmpgeq_ CODE_FOR_mve_vcmpgtq_n_ CODE_FOR_mve_vcmpgtq_ CODE_FOR_mve_vcmphiq_n_ CODE_FOR_mve_vcmphiq_ CODE_FOR_mve_vcmpleq_n_ CODE_FOR_mve_vcmpleq_ CODE_FOR_mve_vcmpltq_n_ CODE_FOR_mve_vcmpltq_ CODE_FOR_mve_vcmpneq_n_ CODE_FOR_mve_vcmpneq_ CODE_FOR_mve_vaddq CODE_FOR_mve_vcaddq_rot270 CODE_FOR_mve_vcaddq_rot90 CODE_FOR_mve_vcaddq_rot270 CODE_FOR_mve_vcaddq_rot90 CODE_FOR_mve_vcmlaq CODE_FOR_mve_vcmlaq_rot180 CODE_FOR_mve_vcmlaq_rot270 CODE_FOR_mve_vcmlaq_rot90 CODE_FOR_mve_vcmulq CODE_FOR_mve_vcmulq_rot180 CODE_FOR_mve_vcmulq_rot270 CODE_FOR_mve_vcmulq_rot90 Dropped _wb_: CODE_FOR_mve_vidupq_u_insn CODE_FOR_mve_vddupq_u_insn Dropped one underscore character: CODE_FOR_arm_vcx1qv16qi CODE_FOR_arm_vcx2qv16qi CODE_FOR_arm_vcx3qv16qi No regressions on arm-none-eabi with an MVE target. Thank you, Stam Markianos-Wright gcc/ChangeLog:         * config/arm/arm.md (mve_unpredicated_insn): New attribute.         * config/arm/mve.md (mve_vrndq_m_f): Add attribute.        (mve_vaddlvq_p_v4si): Likewise.        (mve_vaddvq_p_): Likewise.        (mve_vbicq_m_n_): Likewise.        (mve_vcmpeqq_m_f): Likewise.        (mve_vcvtaq_m_): Likewise.        (mve_vcvtq_m_to_f_): Likewise.        (mve_vabsq_m_s): Likewise.        (mve_vaddvaq_p_): Likewise.        (mve_vclsq_m_s): Likewise.        (mve_vclzq_m_): Likewise.        (mve_vcmpcsq_m_n_u): Likewise.        (mve_vcmpcsq_m_u): Likewise.        (mve_vcmpeqq_m_n_): Likewise.        (mve_vcmpeqq_m_): Likewise.        (mve_vcmpgeq_m_n_s): Likewise.        (mve_vcmpgeq_m_s): Likewise.        (mve_vcmpgtq_m_n_s): Likewise.        (mve_vcmpgtq_m_s): Likewise.        (mve_vcmphiq_m_n_u): Likewise.        (mve_vcmphiq_m_u): Likewise.        (mve_vcmpleq_m_n_s): Likewise.        (mve_vcmpleq_m_s): Likewise.        (mve_vcmpltq_m_n_s): Likewise.        (mve_vcmpltq_m_s): Likewise.        (mve_vcmpneq_m_n_): Likewise.        (mve_vcmpneq_m_): Likewise.        (mve_vdupq_m_n_): Likewise.        (mve_vmaxaq_m_s): Likewise.        (mve_vmaxavq_p_s): Likewise.        (mve_vmaxvq_p_): Likewise.        (mve_vminaq_m_s): Likewise.        (mve_vminavq_p_s): Likewise.        (mve_vminvq_p_): Likewise.        (mve_vmladavq_p_): Likewise.        (mve_vmladavxq_p_s): Likewise.        (mve_vmlsdavq_p_s): Likewise.        (mve_vmlsdavxq_p_s): Likewise.        (mve_vmvnq_m_): Likewise.        (mve_vnegq_m_s): Likewise.        (mve_vqabsq_m_s): Likewise.        (mve_vqnegq_m_s): Likewise.        (mve_vqrshlq_m_n_): Likewise.        (mve_vqshlq_m_r_): Likewise.        (mve_vrev64q_m_): Likewise.        (mve_vrshlq_m_n_): Likewise.        (mve_vshlq_m_r_): Likewise.        (mve_vabsq_m_f): Likewise.        (mve_vaddlvaq_p_v4si): Likewise.        (mve_vcmpeqq_m_n_f): Likewise.        (mve_vcmpgeq_m_f): Likewise.        (mve_vcmpgeq_m_n_f): Likewise.        (mve_vcmpgtq_m_f): Likewise.        (mve_vcmpgtq_m_n_f): Likewise.        (mve_vcmpleq_m_f): Likewise.        (mve_vcmpleq_m_n_f): Likewise.        (mve_vcmpltq_m_f): Likewise.        (mve_vcmpltq_m_n_f): Likewise.        (mve_vcmpneq_m_f): Likewise.        (mve_vcmpneq_m_n_f): Likewise.        (mve_vcvtbq_m_f16_f32v8hf): Likewise.        (mve_vcvtbq_m_f32_f16v4sf): Likewise.        (mve_vcvttq_m_f16_f32v8hf): Likewise.        (mve_vcvttq_m_f32_f16v4sf): Likewise.        (mve_vdupq_m_n_f): Likewise.        (mve_vmaxnmaq_m_f): Likewise.        (mve_vmaxnmavq_p_f): Likewise.        (mve_vmaxnmvq_p_f): Likewise.        (mve_vminnmaq_m_f): Likewise.        (mve_vminnmavq_p_f): Likewise.        (mve_vminnmvq_p_f): Likewise.        (mve_vmlaldavq_p_): Likewise.        (mve_vmlaldavxq_p_s): Likewise.        (mve_vmlsldavq_p_s): Likewise.        (mve_vmlsldavxq_p_s): Likewise.        (mve_vmovlbq_m_): Likewise.        (mve_vmovltq_m_): Likewise.        (mve_vmovnbq_m_): Likewise.        (mve_vmovntq_m_): Likewise.        (mve_vmvnq_m_n_): Likewise.        (mve_vnegq_m_f): Likewise.        (mve_vorrq_m_n_): Likewise.        (mve_vqmovnbq_m_): Likewise.        (mve_vqmovntq_m_): Likewise.        (mve_vqmovunbq_m_s): Likewise.        (mve_vqmovuntq_m_s): Likewise.        (mve_vrev32q_m_fv8hf): Likewise.        (mve_vrev32q_m_): Likewise.        (mve_vrev64q_m_f): Likewise.        (mve_vrmlaldavhxq_p_sv4si): Likewise.        (mve_vrmlsldavhq_p_sv4si): Likewise.        (mve_vrmlsldavhxq_p_sv4si): Likewise.        (mve_vrndaq_m_f): Likewise.        (mve_vrndmq_m_f): Likewise.        (mve_vrndnq_m_f): Likewise.        (mve_vrndpq_m_f): Likewise.        (mve_vrndxq_m_f): Likewise.        (mve_vcvtmq_m_): Likewise.        (mve_vcvtpq_m_): Likewise.        (mve_vcvtnq_m_): Likewise.        (mve_vcvtq_m_n_from_f_): Likewise.        (mve_vrev16q_m_v16qi): Likewise.        (mve_vcvtq_m_from_f_): Likewise.        (mve_vrmlaldavhq_p_v4si): Likewise.        (mve_vabavq_p_): Likewise.        (mve_vqshluq_m_n_s): Likewise.        (mve_vshlq_m_): Likewise.        (mve_vsriq_m_n_): Likewise.        (mve_vsubq_m_): Likewise.        (mve_vcvtq_m_n_to_f_): Likewise.        (mve_vabdq_m_): Likewise.        (mve_vaddq_m_n_): Likewise.        (mve_vaddq_m_): Likewise.        (mve_vandq_m_): Likewise.        (mve_vbicq_m_): Likewise.        (mve_vbrsrq_m_n_): Likewise.        (mve_vcaddq_rot270_m_): Likewise.        (mve_vcaddq_rot90_m_): Likewise.        (mve_veorq_m_): Likewise.        (mve_vhaddq_m_n_): Likewise.        (mve_vhaddq_m_): Likewise.        (mve_vhsubq_m_n_): Likewise.        (mve_vhsubq_m_): Likewise.        (mve_vmaxq_m_): Likewise.        (mve_vminq_m_): Likewise.        (mve_vmladavaq_p_): Likewise.        (mve_vmlaq_m_n_): Likewise.        (mve_vmlasq_m_n_): Likewise.        (mve_vmulhq_m_): Likewise.        (mve_vmullbq_int_m_): Likewise.        (mve_vmulltq_int_m_): Likewise.        (mve_vmulq_m_n_): Likewise.        (mve_vmulq_m_): Likewise.        (mve_vornq_m_): Likewise.        (mve_vorrq_m_): Likewise.        (mve_vqaddq_m_n_): Likewise.        (mve_vqaddq_m_): Likewise.        (mve_vqdmlahq_m_n_s): Likewise.        (mve_vqdmlashq_m_n_s): Likewise.        (mve_vqrdmlahq_m_n_s): Likewise.        (mve_vqrdmlashq_m_n_s): Likewise.        (mve_vqrshlq_m_): Likewise.        (mve_vqshlq_m_n_): Likewise.        (mve_vqshlq_m_): Likewise.        (mve_vqsubq_m_n_): Likewise.        (mve_vqsubq_m_): Likewise.        (mve_vrhaddq_m_): Likewise.        (mve_vrmulhq_m_): Likewise.        (mve_vrshlq_m_): Likewise.        (mve_vrshrq_m_n_): Likewise.        (mve_vshlq_m_n_): Likewise.        (mve_vshrq_m_n_): Likewise.        (mve_vsliq_m_n_): Likewise.        (mve_vsubq_m_n_): Likewise.        (mve_vhcaddq_rot270_m_s): Likewise.        (mve_vhcaddq_rot90_m_s): Likewise.        (mve_vmladavaxq_p_s): Likewise.        (mve_vmlsdavaq_p_s): Likewise.        (mve_vmlsdavaxq_p_s): Likewise.        (mve_vqdmladhq_m_s): Likewise.        (mve_vqdmladhxq_m_s): Likewise.        (mve_vqdmlsdhq_m_s): Likewise.        (mve_vqdmlsdhxq_m_s): Likewise.        (mve_vqdmulhq_m_n_s): Likewise.        (mve_vqdmulhq_m_s): Likewise.        (mve_vqrdmladhq_m_s): Likewise.        (mve_vqrdmladhxq_m_s): Likewise.        (mve_vqrdmlsdhq_m_s): Likewise.        (mve_vqrdmlsdhxq_m_s): Likewise.        (mve_vqrdmulhq_m_n_s): Likewise.        (mve_vqrdmulhq_m_s): Likewise.        (mve_vmlaldavaq_p_): Likewise.        (mve_vmlaldavaxq_p_): Likewise.        (mve_vqrshrnbq_m_n_): Likewise.        (mve_vqrshrntq_m_n_): Likewise.        (mve_vqshrnbq_m_n_): Likewise.        (mve_vqshrntq_m_n_): Likewise.        (mve_vrmlaldavhaq_p_sv4si): Likewise.        (mve_vrshrnbq_m_n_): Likewise.        (mve_vrshrntq_m_n_): Likewise.        (mve_vshllbq_m_n_): Likewise.        (mve_vshlltq_m_n_): Likewise.        (mve_vshrnbq_m_n_): Likewise.        (mve_vshrntq_m_n_): Likewise.        (mve_vmlsldavaq_p_s): Likewise.        (mve_vmlsldavaxq_p_s): Likewise.        (mve_vmullbq_poly_m_p): Likewise.        (mve_vmulltq_poly_m_p): Likewise.        (mve_vqdmullbq_m_n_s): Likewise.        (mve_vqdmullbq_m_s): Likewise.        (mve_vqdmulltq_m_n_s): Likewise.        (mve_vqdmulltq_m_s): Likewise.        (mve_vqrshrunbq_m_n_s): Likewise.        (mve_vqrshruntq_m_n_s): Likewise.        (mve_vqshrunbq_m_n_s): Likewise.        (mve_vqshruntq_m_n_s): Likewise.        (mve_vrmlaldavhaq_p_uv4si): Likewise.        (mve_vrmlaldavhaxq_p_sv4si): Likewise.        (mve_vrmlsldavhaq_p_sv4si): Likewise.        (mve_vrmlsldavhaxq_p_sv4si): Likewise.        (mve_vabdq_m_f): Likewise.        (mve_vaddq_m_f): Likewise.        (mve_vaddq_m_n_f): Likewise.        (mve_vandq_m_f): Likewise.        (mve_vbicq_m_f): Likewise.        (mve_vbrsrq_m_n_f): Likewise.        (mve_vcaddq_rot270_m_f): Likewise.        (mve_vcaddq_rot90_m_f): Likewise.        (mve_vcmlaq_m_f): Likewise.        (mve_vcmlaq_rot180_m_f): Likewise.        (mve_vcmlaq_rot270_m_f): Likewise.        (mve_vcmlaq_rot90_m_f): Likewise.        (mve_vcmulq_m_f): Likewise.        (mve_vcmulq_rot180_m_f): Likewise.        (mve_vcmulq_rot270_m_f): Likewise.        (mve_vcmulq_rot90_m_f): Likewise.        (mve_veorq_m_f): Likewise.        (mve_vfmaq_m_f): Likewise.        (mve_vfmaq_m_n_f): Likewise.        (mve_vfmasq_m_n_f): Likewise.        (mve_vfmsq_m_f): Likewise.        (mve_vmaxnmq_m_f): Likewise.        (mve_vminnmq_m_f): Likewise.        (mve_vmulq_m_f): Likewise.        (mve_vmulq_m_n_f): Likewise.        (mve_vornq_m_f): Likewise.        (mve_vorrq_m_f): Likewise.        (mve_vsubq_m_f): Likewise.        (mve_vsubq_m_n_f): Likewise. (mve_vstrbq_scatter_offset_p__insn): Likewise.        (mve_vstrwq_scatter_base_p_v4si): Likewise.        (mve_vstrbq_p_): Likewise.        (mve_vldrbq_gather_offset_z_): Likewise.        (mve_vldrbq_z_): Likewise.        (mve_vldrwq_gather_base_z_v4si): Likewise.        (mve_vldrhq_gather_offset_z_): Likewise. (mve_vldrhq_gather_shifted_offset_z_): Likewise.        (mve_vldrhq_z_fv8hf): Likewise.        (mve_vldrhq_z_): Likewise.        (mve_vldrwq_z_fv4sf): Likewise.        (mve_vldrwq_z_v4si): Likewise.        (mve_vldrdq_gather_base_z_v2di): Likewise.        (mve_vldrdq_gather_offset_z_v2di): Likewise.        (mve_vldrdq_gather_shifted_offset_z_v2di): Likewise.        (mve_vldrhq_gather_offset_z_fv8hf): Likewise.        (mve_vldrhq_gather_shifted_offset_z_fv8hf): Likewise.        (mve_vldrwq_gather_base_z_fv4sf): Likewise.        (mve_vldrwq_gather_offset_z_fv4sf): Likewise.        (mve_vldrwq_gather_offset_z_v4si): Likewise.        (mve_vldrwq_gather_shifted_offset_z_fv4sf): Likewise.        (mve_vldrwq_gather_shifted_offset_z_v4si): Likewise.        (mve_vstrhq_p_fv8hf): Likewise.        (mve_vstrhq_p_): Likewise. (mve_vstrhq_scatter_offset_p__insn): Likewise. (mve_vstrhq_scatter_shifted_offset_p__insn): Likewise.        (mve_vstrwq_p_fv4sf): Likewise.        (mve_vstrwq_p_v4si): Likewise.        (mve_vstrdq_scatter_base_p_v2di): Likewise.        (mve_vstrdq_scatter_offset_p_v2di_insn): Likewise. (mve_vstrdq_scatter_shifted_offset_p_v2di_insn): Likewise.        (mve_vstrhq_scatter_offset_p_fv8hf_insn): Likewise.        (mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn): Likewise.        (mve_vstrwq_scatter_base_p_fv4sf): Likewise.        (mve_vstrwq_scatter_offset_p_fv4sf_insn): Likewise.        (mve_vstrwq_scatter_offset_p_v4si_insn): Likewise.        (mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn): Likewise. (mve_vstrwq_scatter_shifted_offset_p_v4si_insn): Likewise.        (mve_vidupq_m_wb_u_insn): Likewise.        (mve_vddupq_m_wb_u_insn): Likewise.        (mve_vdwdupq_m_wb_u_insn): Likewise.        (mve_viwdupq_m_wb_u_insn): Likewise.        (mve_vstrwq_scatter_base_wb_p_v4si): Likewise.        (mve_vstrwq_scatter_base_wb_p_fv4sf): Likewise.        (mve_vstrdq_scatter_base_wb_p_v2di): Likewise.        (mve_vldrwq_gather_base_wb_z_v4si_insn): Likewise.        (mve_vldrwq_gather_base_wb_z_fv4sf_insn): Likewise.        (mve_vldrdq_gather_base_wb_z_v2di_insn): Likewise.        (mve_vadciq_m_v4si): Likewise.        (mve_vadcq_m_v4si): Likewise.        (mve_vsbciq_m_v4si): Likewise.        (mve_vsbcq_m_v4si): Likewise.        (mve_vshlcq_m_): Likewise.        (arm_vcx1q_p_v16qi): Likewise.        (arm_vcx2q_p_v16qi): Likewise.        (arm_vcx3q_p_v16qi): Likewise. gcc/testsuite/ChangeLog:         * gcc.target/arm/dlstp-compile-asm.c: New test. #### Inline copy of patch ### +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY_N (16, 8, h, NAME, PRED)                \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY_N (32, 4, w, NAME, PRED) + +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vaddq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vmulq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vsubq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vhaddq, _x) + + +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vbrsrq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vshlq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vshrq, _x) + + +/* The final number of DLSTPs currently is calculated by the number of +  `TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY.*` macros * 6.  */ +/* { dg-final { scan-assembler-times {\tdlstp} 54 } } */ +/* { dg-final { scan-assembler-times {\tletp} 54 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "P0" } } */ \ No newline at end of file diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 69bf343fb0ed601014979cfc1803abe84c87f179..e1d2e62593085accfcc111cf6fa5795e4520f213 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -123,6 +123,8 @@ ; and not all ARM insns do. (define_attr "predicated" "yes,no" (const_string "no")) +(define_attr "mve_unpredicated_insn" "" (const_int 0)) + ; LENGTH of an instruction (in bytes) (define_attr "length" "" (const_int 4)) diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index 62186f124da183fe1b1eb57a1aea1e8fff680a22..b1c8c1c569f31a6cb1bfdc16394047f02d6cddf4 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -142,7 +142,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrintzt.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrndq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -818,7 +819,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vaddlvt.32 %Q0, %R0, %q1" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddlvq_v4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -910,7 +912,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vaddvt.%# %0, %q1" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddvq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2560,7 +2563,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vbict.i%# %q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vbicq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vcmpeqq_m_f]) @@ -2575,7 +2579,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# eq, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpeqq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vcvtaq_m_u, vcvtaq_m_s]) @@ -2590,7 +2595,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtat.%#.f%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtaq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vcvtq_m_to_f_s, vcvtq_m_to_f_u]) @@ -2605,7 +2611,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtt.f%#.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_to_f_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vqrshrnbq_n_u, vqrshrnbq_n_s]) @@ -2727,7 +2734,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vabst.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vabsq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2743,7 +2751,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vaddvat.%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddvaq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2759,7 +2768,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vclst.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vclsq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2775,7 +2785,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vclzt.i%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vclzq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2791,7 +2802,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.u%# cs, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpcsq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2807,7 +2819,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.u%# cs, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpcsq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2823,7 +2836,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.i%# eq, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpeqq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2839,7 +2853,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.i%# eq, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpeqq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2855,7 +2870,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# ge, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgeq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2871,7 +2887,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# ge, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgeq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2887,7 +2904,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# gt, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgtq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2903,7 +2921,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# gt, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgtq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2919,7 +2938,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.u%# hi, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmphiq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2935,7 +2955,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.u%# hi, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmphiq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2951,7 +2972,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# le, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpleq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2967,7 +2989,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# le, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpleq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2983,7 +3006,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# lt, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpltq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -2999,7 +3023,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.s%# lt, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpltq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3015,7 +3040,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.i%# ne, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpneq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3031,7 +3057,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcmpt.i%# ne, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpneq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3047,7 +3074,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vdupt.%# %q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vdupq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3063,7 +3091,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmaxat.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxaq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3079,7 +3108,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmaxavt.s%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxavq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3095,7 +3125,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmaxvt.%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxvq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3111,7 +3142,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vminat.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminaq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3127,7 +3159,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vminavt.s%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminavq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3143,7 +3176,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vminvt.%#\t%0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminvq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3175,7 +3209,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmladavt.%#\t%0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmladavq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3191,7 +3226,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmladavxt.s%#\t%0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmladavxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3239,7 +3275,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsdavt.s%# %0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsdavq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3255,7 +3292,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsdavxt.s%# %0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsdavxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3271,7 +3309,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmvnt %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmvnq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3287,7 +3326,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vnegt.s%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vnegq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3319,7 +3359,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqabst.s%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqabsq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3367,7 +3408,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqnegt.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqnegq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3479,7 +3521,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrshlt.%# %q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrshlq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3495,7 +3538,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqshlt.%#\t%q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshlq_r_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3511,7 +3555,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrev64t.%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrev64q_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3527,7 +3572,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrshlt.%#\t%q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrshlq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3543,7 +3589,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshlt.%#\t%q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshlq_r_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3702,7 +3749,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vabst.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vabsq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3718,7 +3766,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vaddlvat.32 %Q0, %R0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddlvaq_v4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vcmlaq, vcmlaq_rot90, vcmlaq_rot180, vcmlaq_rot270]) @@ -3752,7 +3801,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# eq, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpeqq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3768,7 +3818,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# ge, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgeq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3784,7 +3835,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# ge, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgeq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3800,7 +3852,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# gt, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgtq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3816,7 +3869,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# gt, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpgtq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3832,7 +3886,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# le, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpleq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3848,7 +3903,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# le, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpleq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3864,7 +3920,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# lt, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpltq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3880,7 +3937,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# lt, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpltq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3896,7 +3954,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# ne, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpneq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3912,7 +3971,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmpt.f%# ne, %q1, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpneq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3928,7 +3988,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtbt.f16.f32 %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtbq_f16_f32v8hf")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3944,7 +4005,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtbt.f32.f16 %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtbq_f32_f16v4sf")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3960,7 +4022,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvttt.f16.f32 %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvttq_f16_f32v8hf")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3976,7 +4039,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvttt.f32.f16 %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvttq_f32_f16v4sf")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -3992,7 +4056,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vdupt.%# %q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vdupq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4071,7 +4136,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vmaxnmat.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxnmaq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vmaxnmavq_p_f]) @@ -4086,7 +4152,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vmaxnmavt.f%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxnmavq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4102,7 +4169,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vmaxnmvt.f%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxnmvq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vminnmaq_m_f]) @@ -4117,7 +4185,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vminnmat.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminnmaq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4133,7 +4202,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vminnmavt.f%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminnmavq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vminnmvq_p_f]) @@ -4148,7 +4218,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vminnmvt.f%# %0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminnmvq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4196,7 +4267,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlaldavt.%# %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlaldavq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4212,7 +4284,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlaldavxt.s%#\t%Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlaldavxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vmlsldavaq_s]) @@ -4259,7 +4332,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsldavt.s%# %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsldavq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4275,7 +4349,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsldavxt.s%# %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsldavxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vmovlbq_m_u, vmovlbq_m_s]) @@ -4290,7 +4365,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmovlbt.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmovlbq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vmovltq_m_u, vmovltq_m_s]) @@ -4305,7 +4381,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmovltt.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmovltq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vmovnbq_m_u, vmovnbq_m_s]) @@ -4320,7 +4397,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmovnbt.i%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmovnbq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4336,7 +4414,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmovntt.i%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmovntq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4352,7 +4431,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmvnt.i%# %q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmvnq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vnegq_m_f]) @@ -4367,7 +4447,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vnegt.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vnegq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4383,7 +4464,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vorrt.i%# %q0, %2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vorrq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vpselq_f]) @@ -4414,7 +4496,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqmovnbt.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqmovnbq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4430,7 +4513,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqmovntt.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqmovntq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4446,7 +4530,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqmovunbt.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqmovunbq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4462,7 +4547,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqmovuntt.s%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqmovuntq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4574,7 +4660,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrev32t.16 %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrev32q_fv8hf")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4590,7 +4677,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrev32t.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrev32q_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4606,7 +4694,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrev64t.%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrev64q_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4638,7 +4727,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlaldavhxt.s32 %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlaldavhxq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4670,7 +4760,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlsldavht.s32 %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlsldavhq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4686,7 +4777,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlsldavhxt.s32 %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlsldavhxq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4702,7 +4794,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrintat.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrndaq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4718,7 +4811,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrintmt.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrndmq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4734,7 +4828,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrintnt.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrndnq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4750,7 +4845,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrintpt.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrndpq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4766,7 +4862,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vrintxt.f%# %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrndxq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4846,7 +4943,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtmt.%#.f%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtmq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4862,7 +4960,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtpt.%#.f%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtpq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4878,7 +4977,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtnt.%#.f%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtnq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4895,7 +4995,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtt.%#.f%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_n_from_f_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4911,7 +5012,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrev16t.8 %q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrev16q_v16qi")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4927,7 +5029,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtt.%#.f%#\t%q0, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_from_f_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4943,7 +5046,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlaldavht.32 %Q0, %R0, %q1, %q2" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlaldavhq_v4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -4976,7 +5080,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vabavt.%#\t%0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vabavq_")) + (set_attr "type" "mve_move") ]) ;; @@ -4993,7 +5098,8 @@ ] "TARGET_HAVE_MVE" "vpst\n\tvqshlut.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshluq_n_s")) + (set_attr "type" "mve_move")]) ;; ;; [vshlq_m_s, vshlq_m_u]) @@ -5009,7 +5115,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshlt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshlq_")) + (set_attr "type" "mve_move")]) ;; ;; [vsriq_m_n_s, vsriq_m_n_u]) @@ -5025,7 +5132,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vsrit.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsriq_n_")) + (set_attr "type" "mve_move")]) ;; ;; [vsubq_m_u, vsubq_m_s]) @@ -5041,7 +5149,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vsubt.i%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsubq_")) + (set_attr "type" "mve_move")]) ;; ;; [vcvtq_m_n_to_f_u, vcvtq_m_n_to_f_s]) @@ -5057,7 +5166,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcvtt.f%#.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_n_to_f_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vabdq_m_s, vabdq_m_u]) @@ -5073,7 +5183,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vabdt.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vabdq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5090,7 +5201,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vaddt.i%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5107,7 +5219,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vaddt.i%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddq")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5124,7 +5237,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vandt %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vandq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5141,7 +5255,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vbict %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vbicq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5158,7 +5273,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vbrsrt.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vbrsrq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5175,7 +5291,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcaddt.i%# %q0, %q2, %q3, #270" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcaddq_rot270")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5192,7 +5309,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vcaddt.i%# %q0, %q2, %q3, #90" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcaddq_rot90")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5209,7 +5327,8 @@ ] "TARGET_HAVE_MVE" "vpst\;veort %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_veorq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5226,7 +5345,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vhaddt.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vhaddq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5243,7 +5363,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vhaddt.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vhaddq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5260,7 +5381,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vhsubt.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vhsubq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5277,7 +5399,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vhsubt.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vhsubq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5294,7 +5417,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmaxt.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5311,7 +5435,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmint.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5328,7 +5453,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmladavat.%# %0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmladavaq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5345,7 +5471,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlat.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlaq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5362,7 +5489,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlast.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlasq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5379,7 +5507,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmulht.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulhq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5396,7 +5525,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmullbt.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmullbq_int_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5413,7 +5543,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmulltt.%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulltq_int_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5430,7 +5561,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmult.i%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5447,7 +5579,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmult.i%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5464,7 +5597,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vornt %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vornq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5481,7 +5615,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vorrt %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vorrq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5498,7 +5633,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqaddt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqaddq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5515,7 +5651,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqaddt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqaddq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5532,7 +5669,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmlaht.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmlahq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5549,7 +5687,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmlasht.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmlashq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5566,7 +5705,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmlaht.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmlahq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5583,7 +5723,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmlasht.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmlashq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5600,7 +5741,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrshlt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrshlq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5617,7 +5759,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqshlt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshlq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5634,7 +5777,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqshlt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshlq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5651,7 +5795,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqsubt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqsubq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5668,7 +5813,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqsubt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqsubq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5685,7 +5831,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrhaddt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrhaddq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5702,7 +5849,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmulht.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmulhq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5719,7 +5867,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrshlt.%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrshlq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5736,7 +5885,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrshrt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrshrq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5753,7 +5903,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshlt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshlq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5770,7 +5921,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshrt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5787,7 +5939,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vslit.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsliq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5804,7 +5957,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vsubt.i%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsubq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5821,7 +5975,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vhcaddt.s%#\t%q0, %q2, %q3, #270" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vhcaddq_rot270_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5838,7 +5993,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vhcaddt.s%#\t%q0, %q2, %q3, #90" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vhcaddq_rot90_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5855,7 +6011,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmladavaxt.s%#\t%0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmladavaxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5872,7 +6029,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsdavat.s%#\t%0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsdavaq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5889,7 +6047,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsdavaxt.s%#\t%0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsdavaxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5906,7 +6065,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmladht.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmladhq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5923,7 +6083,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmladhxt.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmladhxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5940,7 +6101,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmlsdht.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmlsdhq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5957,7 +6119,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmlsdhxt.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmlsdhxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5974,7 +6137,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmulht.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmulhq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -5991,7 +6155,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmulht.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmulhq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6008,7 +6173,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmladht.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmladhq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6025,7 +6191,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmladhxt.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmladhxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6042,7 +6209,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmlsdht.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmlsdhq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6059,7 +6227,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmlsdhxt.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmlsdhxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6076,7 +6245,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmulht.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmulhq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6093,7 +6263,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrdmulht.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrdmulhq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6110,7 +6281,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlaldavat.%# %Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlaldavaq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6127,7 +6299,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlaldavaxt.%# %Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlaldavaxq_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6144,7 +6317,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrshrnbt.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrshrnbq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6161,7 +6335,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrshrntt.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrshrntq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6178,7 +6353,8 @@ ] "TARGET_HAVE_MVE" "vpst\n\tvqshrnbt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshrnbq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6195,7 +6371,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqshrntt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshrntq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6212,7 +6389,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlaldavhat.s32\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlaldavhaq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6229,7 +6407,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrshrnbt.i%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrshrnbq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6246,7 +6425,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrshrntt.i%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrshrntq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6263,7 +6443,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshllbt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshllbq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6280,7 +6461,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshlltt.%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshlltq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6297,7 +6479,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshrnbt.i%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrnbq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6314,7 +6497,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshrntt.i%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrntq_n_")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6331,7 +6515,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsldavat.s%#\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsldavaq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6348,7 +6533,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmlsldavaxt.s%#\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmlsldavaxq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6365,7 +6551,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmullbt.p%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmullbq_poly_p")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6382,7 +6569,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vmulltt.p%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulltq_poly_p")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6399,7 +6587,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmullbt.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmullbq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6416,7 +6605,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmullbt.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmullbq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6433,7 +6623,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmulltt.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmulltq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6450,7 +6641,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqdmulltt.s%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqdmulltq_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6467,7 +6659,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrshrunbt.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrshrunbq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6484,7 +6677,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqrshruntt.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqrshruntq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6501,7 +6695,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqshrunbt.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshrunbq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6518,7 +6713,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vqshruntt.s%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vqshruntq_n_s")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6535,7 +6731,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlaldavhat.u32\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlaldavhaq_uv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6552,7 +6749,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlaldavhaxt.s32\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlaldavhaxq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6569,7 +6767,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlsldavhat.s32\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlsldavhaq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6586,7 +6785,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vrmlsldavhaxt.s32\t%Q0, %R0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vrmlsldavhaxq_sv4si")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; ;; [vabdq_m_f]) @@ -6602,7 +6802,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vabdt.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vabdq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6619,7 +6820,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vaddt.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6636,7 +6838,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vaddt.f%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vaddq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6653,7 +6856,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vandt %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vandq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6670,7 +6874,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vbict %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vbicq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6687,7 +6892,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vbrsrt.%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vbrsrq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6704,7 +6910,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcaddt.f%# %q0, %q2, %q3, #270" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcaddq_rot270")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6721,7 +6928,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcaddt.f%# %q0, %q2, %q3, #90" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcaddq_rot90")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6738,7 +6946,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmlat.f%# %q0, %q2, %q3, #0" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmlaq")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6755,7 +6964,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmlat.f%# %q0, %q2, %q3, #180" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmlaq_rot180")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6772,7 +6982,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmlat.f%# %q0, %q2, %q3, #270" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmlaq_rot270")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6789,7 +7000,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmlat.f%# %q0, %q2, %q3, #90" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmlaq_rot90")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6806,7 +7018,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmult.f%# %q0, %q2, %q3, #0" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmulq")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6823,7 +7036,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmult.f%# %q0, %q2, %q3, #180" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmulq_rot180")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6840,7 +7054,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmult.f%# %q0, %q2, %q3, #270" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmulq_rot270")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6857,7 +7072,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vcmult.f%# %q0, %q2, %q3, #90" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmulq_rot90")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6874,7 +7090,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;veort %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_veorq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6891,7 +7108,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vfmat.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vfmaq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6908,7 +7126,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vfmat.f%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vfmaq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6925,7 +7144,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vfmast.f%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vfmasq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6942,7 +7162,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vfmst.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vfmsq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6959,7 +7180,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vmaxnmt.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmaxnmq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6976,7 +7198,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vminnmt.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vminnmq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -6993,7 +7216,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vmult.f%# %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -7010,7 +7234,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vmult.f%# %q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmulq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -7027,7 +7252,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vornt %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vornq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -7044,7 +7270,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vorrt %q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vorrq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -7061,7 +7288,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vsubt.f%#\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsubq_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -7078,7 +7306,8 @@ ] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vsubt.f%#\t%q0, %q2, %3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsubq_n_f")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -7245,7 +7474,8 @@ VSTRBSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrbt.\t%q2, [%0, %q1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrbq_scatter_offset__insn")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_base_p_s vstrwq_scatter_base_p_u] @@ -7268,7 +7498,8 @@ output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_base_v4si")) + (set_attr "length" "8")]) ;; ;; [vstrbq_p_s vstrbq_p_u] @@ -7288,7 +7519,8 @@ output_asm_insn ("vpst\;vstrbt.\t%q1, %E0",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrbq_")) + (set_attr "length" "8")]) ;; ;; [vldrbq_gather_offset_z_s vldrbq_gather_offset_z_u] @@ -7313,7 +7545,8 @@ output_asm_insn ("vpst\n\tvldrbt.\t%q0, [%m1, %q2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrbq_gather_offset_")) + (set_attr "length" "8")]) ;; ;; [vldrbq_z_s vldrbq_z_u] @@ -7336,7 +7569,8 @@ output_asm_insn ("vpst\;vldrbt.\t%q0, %E1",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrbq_")) + (set_attr "length" "8")]) ;; ;; [vldrwq_gather_base_z_s vldrwq_gather_base_z_u] @@ -7357,7 +7591,8 @@ output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_base_v4si")) + (set_attr "length" "8")]) ;; ;; [vldrhq_f] @@ -7424,7 +7659,8 @@ output_asm_insn ("vpst\n\tvldrht.\t%q0, [%m1, %q2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrhq_gather_offset_")) + (set_attr "length" "8")]) ;; ;; [vldrhq_gather_shifted_offset_s vldrhq_gather_shifted_offset_u] @@ -7472,7 +7708,8 @@ output_asm_insn ("vpst\n\tvldrht.\t%q0, [%m1, %q2, uxtw #1]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrhq_gather_shifted_offset_")) + (set_attr "length" "8")]) ;; ;; [vldrhq_s, vldrhq_u] @@ -7514,7 +7751,8 @@ output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrhq_fv8hf")) + (set_attr "length" "8")]) ;; ;; [vldrhq_z_s vldrhq_z_u] @@ -7537,7 +7775,8 @@ output_asm_insn ("vpst\;vldrht.\t%q0, %E1",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrhq_")) + (set_attr "length" "8")]) ;; ;; [vldrwq_f] @@ -7595,7 +7834,8 @@ output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vldrwq_z_s vldrwq_z_u] @@ -7615,7 +7855,8 @@ output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_v4si")) + (set_attr "length" "8")]) (define_expand "mve_vld1q_f" [(match_operand:MVE_0 0 "s_register_operand") @@ -7676,7 +7917,8 @@ output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%q1, %2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrdq_gather_base_v2di")) + (set_attr "length" "8")]) ;; ;; [vldrdq_gather_offset_s vldrdq_gather_offset_u] @@ -7717,7 +7959,8 @@ output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrdq_gather_offset_v2di")) + (set_attr "length" "8")]) ;; ;; [vldrdq_gather_shifted_offset_s vldrdq_gather_shifted_offset_u] @@ -7758,7 +8001,8 @@ output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2, uxtw #3]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrdq_gather_shifted_offset_v2di")) + (set_attr "length" "8")]) ;; ;; [vldrhq_gather_offset_f] @@ -7800,7 +8044,8 @@ output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrhq_gather_offset_fv8hf")) + (set_attr "length" "8")]) ;; ;; [vldrhq_gather_shifted_offset_f] @@ -7842,7 +8087,8 @@ output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2, uxtw #1]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrhq_gather_shifted_offset_fv8hf")) + (set_attr "length" "8")]) ;; ;; [vldrwq_gather_base_f] @@ -7883,7 +8129,8 @@ output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_base_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vldrwq_gather_offset_f] @@ -7945,7 +8192,8 @@ output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_offset_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vldrwq_gather_offset_z_s vldrwq_gather_offset_z_u] @@ -7967,7 +8215,8 @@ output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_offset_v4si")) + (set_attr "length" "8")]) ;; ;; [vldrwq_gather_shifted_offset_f] @@ -8029,7 +8278,8 @@ output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_shifted_offset_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vldrwq_gather_shifted_offset_z_s vldrwq_gather_shifted_offset_z_u] @@ -8051,7 +8301,8 @@ output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_shifted_offset_v4si")) + (set_attr "length" "8")]) ;; ;; [vstrhq_f] @@ -8090,7 +8341,8 @@ output_asm_insn ("vpst\;vstrht.16\t%q1, %E0",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrhq_fv8hf")) + (set_attr "length" "8")]) ;; ;; [vstrhq_p_s vstrhq_p_u] @@ -8110,7 +8362,8 @@ output_asm_insn ("vpst\;vstrht.\t%q1, %E0",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrhq_")) + (set_attr "length" "8")]) ;; ;; [vstrhq_scatter_offset_p_s vstrhq_scatter_offset_p_u] @@ -8142,7 +8395,8 @@ VSTRHSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrht.\t%q2, [%0, %q1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrhq_scatter_offset__insn")) + (set_attr "length" "8")]) ;; ;; [vstrhq_scatter_offset_s vstrhq_scatter_offset_u] @@ -8202,7 +8456,8 @@ VSTRHSSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrht.\t%q2, [%0, %q1, uxtw #1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrhq_scatter_shifted_offset__insn")) + (set_attr "length" "8")]) ;; ;; [vstrhq_scatter_shifted_offset_s vstrhq_scatter_shifted_offset_u] @@ -8289,7 +8544,8 @@ output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vstrwq_p_s vstrwq_p_u] @@ -8309,7 +8565,8 @@ output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_v4si")) + (set_attr "length" "8")]) ;; ;; [vstrwq_s vstrwq_u] @@ -8371,7 +8628,8 @@ output_asm_insn ("vpst\;\tvstrdt.u64\t%q2, [%q0, %1]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrdq_scatter_base_v2di")) + (set_attr "length" "8")]) ;; ;; [vstrdq_scatter_base_s vstrdq_scatter_base_u] @@ -8424,7 +8682,8 @@ VSTRDSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrdt.64\t%q2, [%0, %q1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrdq_scatter_offset_v2di_insn")) + (set_attr "length" "8")]) ;; ;; [vstrdq_scatter_offset_s vstrdq_scatter_offset_u] @@ -8484,7 +8743,8 @@ VSTRDSSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrdt.64\t%q2, [%0, %q1, UXTW #3]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrdq_scatter_shifted_offset_v2di_insn")) + (set_attr "length" "8")]) ;; ;; [vstrdq_scatter_shifted_offset_s vstrdq_scatter_shifted_offset_u] @@ -8572,7 +8832,8 @@ VSTRHQSO_F))] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vstrht.16\t%q2, [%0, %q1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrhq_scatter_offset_fv8hf_insn")) + (set_attr "length" "8")]) ;; ;; [vstrhq_scatter_shifted_offset_f] @@ -8632,7 +8893,8 @@ VSTRHQSSO_F))] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vstrht.16\t%q2, [%0, %q1, uxtw #1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrhq_scatter_shifted_offset_fv8hf_insn")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_base_f] @@ -8677,7 +8939,8 @@ output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_base_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_offset_f] @@ -8736,7 +8999,8 @@ VSTRWQSO_F))] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vstrwt.32\t%q2, [%0, %q1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_offset_fv4sf_insn")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u] @@ -8767,7 +9031,8 @@ VSTRWSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrwt.32\t%q2, [%0, %q1]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_offset_v4si_insn")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u] @@ -8855,7 +9120,8 @@ VSTRWQSSO_F))] "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT" "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_shifted_offset_fv4sf_insn")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_shifted_offset_p_s vstrwq_scatter_shifted_offset_p_u] @@ -8887,7 +9153,8 @@ VSTRWSSOQ))] "TARGET_HAVE_MVE" "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]" - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_shifted_offset_v4si_insn")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_shifted_offset_s vstrwq_scatter_shifted_offset_u] @@ -9012,7 +9279,8 @@ (match_operand:SI 6 "immediate_operand" "i")))] "TARGET_HAVE_MVE" "vpst\;\tvidupt.u%#\t%q0, %2, %4" - [(set_attr "length""8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vidupq_u_insn")) + (set_attr "length""8")]) ;; ;; [vddupq_n_u]) @@ -9080,7 +9348,8 @@ (match_operand:SI 6 "immediate_operand" "i")))] "TARGET_HAVE_MVE" "vpst\;\tvddupt.u%#\t%q0, %2, %4" - [(set_attr "length""8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vddupq_u_insn")) + (set_attr "length""8")]) ;; ;; [vdwdupq_n_u]) @@ -9196,7 +9465,8 @@ ] "TARGET_HAVE_MVE" "vpst\;\tvdwdupt.u%#\t%q2, %3, %R4, %5" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vdwdupq_wb_u_insn")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -9313,7 +9583,8 @@ ] "TARGET_HAVE_MVE" "vpst\;\tviwdupt.u%#\t%q2, %3, %R4, %5" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_viwdupq_wb_u_insn")) + (set_attr "type" "mve_move") (set_attr "length""8")]) ;; @@ -9365,7 +9636,8 @@ output_asm_insn ("vpst\;\tvstrwt.u32\t%q2, [%q0, %1]!",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_base_wb_v4si")) + (set_attr "length" "8")]) ;; ;; [vstrwq_scatter_base_wb_f] @@ -9416,7 +9688,8 @@ output_asm_insn ("vpst\;\tvstrwt.u32\t%q2, [%q0, %1]!",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrwq_scatter_base_wb_fv4sf")) + (set_attr "length" "8")]) ;; ;; [vstrdq_scatter_base_wb_s vstrdq_scatter_base_wb_u] @@ -9467,7 +9740,8 @@ output_asm_insn ("vpst;vstrdt.u64\t%q2, [%q0, %1]!",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vstrdq_scatter_base_wb_v2di")) + (set_attr "length" "8")]) (define_expand "mve_vldrwq_gather_base_wb_v4si" [(match_operand:V4SI 0 "s_register_operand") @@ -9575,7 +9849,8 @@ output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_base_wb_v4si_insn")) + (set_attr "length" "8")]) (define_expand "mve_vldrwq_gather_base_wb_fv4sf" [(match_operand:V4SI 0 "s_register_operand") @@ -9684,7 +9959,8 @@ output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrwq_gather_base_wb_fv4sf_insn")) + (set_attr "length" "8")]) (define_expand "mve_vldrdq_gather_base_wb_v2di" [(match_operand:V2DI 0 "s_register_operand") @@ -9809,7 +10085,8 @@ output_asm_insn ("vpst\;vldrdt.u64\t%q0, [%q1, %2]!",ops); return ""; } - [(set_attr "length" "8")]) + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vldrdq_gather_base_wb_v2di_insn")) + (set_attr "length" "8")]) ;; ;; [vadciq_m_s, vadciq_m_u]) ;; @@ -9826,7 +10103,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vadcit.i32\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vadciq_v4si")) + (set_attr "type" "mve_move") (set_attr "length" "8")]) ;; @@ -9862,7 +10140,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vadct.i32\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vadcq_v4si")) + (set_attr "type" "mve_move") (set_attr "length" "8")]) ;; @@ -9899,7 +10178,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vsbcit.i32\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsbciq_v4si")) + (set_attr "type" "mve_move") (set_attr "length" "8")]) ;; @@ -9935,7 +10215,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vsbct.i32\t%q0, %q2, %q3" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vsbcq_v4si")) + (set_attr "type" "mve_move") (set_attr "length" "8")]) ;; @@ -10352,7 +10633,8 @@ ] "TARGET_HAVE_MVE" "vpst\;vshlct\t%q0, %1, %4" - [(set_attr "type" "mve_move") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshlcq_")) + (set_attr "type" "mve_move") (set_attr "length" "8")]) ;; CDE instructions on MVE registers. @@ -10435,7 +10717,8 @@ CDE_VCX))] "TARGET_CDE && TARGET_HAVE_MVE" "vpst\;vcx1t\\tp%c1, %q0, #%c3" - [(set_attr "type" "coproc") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_arm_vcx1qv16qi")) + (set_attr "type" "coproc") (set_attr "length" "8")] ) @@ -10449,7 +10732,8 @@ CDE_VCX))] "TARGET_CDE && TARGET_HAVE_MVE" "vpst\;vcx2t\\tp%c1, %q0, %q3, #%c4" - [(set_attr "type" "coproc") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_arm_vcx2qv16qi")) + (set_attr "type" "coproc") (set_attr "length" "8")] ) @@ -10464,7 +10748,8 @@ CDE_VCX))] "TARGET_CDE && TARGET_HAVE_MVE" "vpst\;vcx3t\\tp%c1, %q0, %q3, %q4, #%c5" - [(set_attr "type" "coproc") + [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_arm_vcx3qv16qi")) + (set_attr "type" "coproc") (set_attr "length" "8")] ) diff --git a/gcc/testsuite/gcc.target/arm/dlstp-compile-asm.c b/gcc/testsuite/gcc.target/arm/dlstp-compile-asm.c new file mode 100644 index 0000000000000000000000000000000000000000..ec6ee774cbda6604c4c24b57cd4d5d3bd08e07cd --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-compile-asm.c @@ -0,0 +1,82 @@ +/* { dg-do compile { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -O3" } */ + +#include + +#define IMM 5 + +#define TEST_COMPILE_IN_DLSTP_TERNARY(BITS, LANES, LDRSTRYTPE, TYPE, SIGN, NAME, PRED) \ +void test_##NAME##PRED##_##SIGN##BITS (TYPE##BITS##_t *a, TYPE##BITS##_t *b, TYPE##BITS##_t *c, int n) \ +{ \ + while (n > 0) \ + { \ + mve_pred16_t p = vctp##BITS##q (n); \ + TYPE##BITS##x##LANES##_t va = vldr##LDRSTRYTPE##q_z_##SIGN##BITS (a, p); \ + TYPE##BITS##x##LANES##_t vb = vldr##LDRSTRYTPE##q_z_##SIGN##BITS (b, p); \ + TYPE##BITS##x##LANES##_t vc = NAME##PRED##_##SIGN##BITS (va, vb, p); \ + vstr##LDRSTRYTPE##q_p_##SIGN##BITS (c, vc, p); \ + c += LANES; \ + a += LANES; \ + b += LANES; \ + n -= LANES; \ + } \ +} + +#define TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY(BITS, LANES, LDRSTRYTPE, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_TERNARY (BITS, LANES, LDRSTRYTPE, int, s, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_TERNARY (BITS, LANES, LDRSTRYTPE, uint, u, NAME, PRED) + +#define TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY(NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY (8, 16, b, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY (16, 8, h, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY (32, 4, w, NAME, PRED) + + +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY (vaddq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY (vorrq, _x) + + +#define TEST_COMPILE_IN_DLSTP_TERNARY_N(BITS, LANES, LDRSTRYTPE, TYPE, SIGN, NAME, PRED) \ +void test_##NAME##PRED##_n_##SIGN##BITS (TYPE##BITS##_t *a, TYPE##BITS##_t *c, int n) \ +{ \ + while (n > 0) \ + { \ + mve_pred16_t p = vctp##BITS##q (n); \ + TYPE##BITS##x##LANES##_t va = vldr##LDRSTRYTPE##q_z_##SIGN##BITS (a, p); \ + TYPE##BITS##x##LANES##_t vc = NAME##PRED##_n_##SIGN##BITS (va, IMM, p); \ + vstr##LDRSTRYTPE##q_p_##SIGN##BITS (c, vc, p); \ + c += LANES; \ + a += LANES; \ + n -= LANES; \ + } \ +} + +#define TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY_N(BITS, LANES, LDRSTRYTPE, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_TERNARY_N (BITS, LANES, LDRSTRYTPE, int, s, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_TERNARY_N (BITS, LANES, LDRSTRYTPE, uint, u, NAME, PRED) + +#define TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N(NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY_N (8, 16, b, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY_N (16, 8, h, NAME, PRED) \ +TEST_COMPILE_IN_DLSTP_SIGNED_UNSIGNED_TERNARY_N (32, 4, w, NAME, PRED) + +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vaddq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vmulq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vsubq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vhaddq, _x) + + +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vbrsrq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vshlq, _x) +TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY_N (vshrq, _x) + + +/* The final number of DLSTPs currently is calculated by the number of + `TEST_COMPILE_IN_DLSTP_INTBITS_SIGNED_UNSIGNED_TERNARY.*` macros * 6. */ +/* { dg-final { scan-assembler-times {\tdlstp} 54 } } */ +/* { dg-final { scan-assembler-times {\tletp} 54 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "P0" } } */ \ No newline at end of file From patchwork Fri Nov 11 17:40:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stamatis Markianos-Wright X-Patchwork-Id: 18933 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp879768wru; Fri, 11 Nov 2022 09:42:32 -0800 (PST) X-Google-Smtp-Source: AA0mqf6ceW9Qb342S7ihKgRMk4Zi34qWn+odTIyjDqgp8YLR9V0zvkdevY5DBRrKQIQDz+o0snkg X-Received: by 2002:aa7:c694:0:b0:461:8efb:3f84 with SMTP id n20-20020aa7c694000000b004618efb3f84mr2421867edq.210.1668188551736; Fri, 11 Nov 2022 09:42:31 -0800 (PST) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id nc7-20020a1709071c0700b0078da856a4ecsi2801968ejc.391.2022.11.11.09.42.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Nov 2022 09:42:31 -0800 (PST) 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="Ggg/2S1H"; 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 DF5A43836025 for ; Fri, 11 Nov 2022 17:42:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DF5A43836025 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668188539; bh=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Ggg/2S1HR0L/kTbdOgmEM2455sHWGfpC64Xjqc/C3CFhUoU64+s9nDjh/VFWG50JL XIWG6dgiEsALDKfxdkghn7A0YvHgd1di6sh/H2q6hH4cDmjWDSRkixcd31SaZ4yC4+ T2RlXJTFBqXGJyU9wEXkbsTyoDbVP8+ZCLe8KoK0= 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-am0eur02on2052.outbound.protection.outlook.com [40.107.247.52]) by sourceware.org (Postfix) with ESMTPS id 8045A385558F for ; Fri, 11 Nov 2022 17:41:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8045A385558F ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=kCUzghratWVBCmeYAiUxNuiOG3lSVavxE30JOeJbMKwmZMLqJvRxICU+gmzr43nn/bzVLrQe2PlTVagpC8L0moC7A83lbumVCgBIbvZmWzhYIvjKBRTS4kzkBtm/nLyJOwkt8w7NCf/LdXidfJK5rW508w6Q23zPIX6Qbvgys6ewURLo9ARNdy7K8sOf5MBDS5aQCuEl2osnwdSFC2orbVWGGg4OY0yh0AOUZ7hhfD12np/ZnHcMwV154MsFBFWeIH2lae7IItr0coMu78R1X7qgotNgCjDeBx1QRV/KXEBqaz5OIkhm7Mv4U1eYcDXhceiB7IzWGGLGSgqRUtWcdw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; b=j22SsQqwSXaCD6tFgcQGJwd+jMGbrHZqplOgI4ry1zIjWeSZahOSWskA/waMQ96b6PK2tsPUG4aAg3ojVs6RaOjQNnxVerA6MhvIUppSWJwAg1XT0vwgR/GI0jQIQFldze3dgQnCNK/xhDdgHuZUUOp1CCUxms0U4ld+DZPZCNRytKIazt7A80GFdUZg0NobPafZ5Q81iBGKiQcytsMhhW++M03MGlypGWBKqkmZimBHKAcrEjVaibo01k1bgsmvtYPD0Uw7wYn36cYOkJfkkfAnabakaOsXMqb7Oe9L6DgM34CNSKlFmaxKxIww7qy+G7iA0TlBBn9qZTcOXY3TGA== 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=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) Received: from FR3P281CA0151.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a2::12) by DU0PR08MB7637.eurprd08.prod.outlook.com (2603:10a6:10:31c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Fri, 11 Nov 2022 17:41:08 +0000 Received: from VI1EUR03FT013.eop-EUR03.prod.protection.outlook.com (2603:10a6:d10:a2:cafe::3d) by FR3P281CA0151.outlook.office365.com (2603:10a6:d10:a2::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13 via Frontend Transport; Fri, 11 Nov 2022 17:41:08 +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 VI1EUR03FT013.mail.protection.outlook.com (100.127.145.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.12 via Frontend Transport; Fri, 11 Nov 2022 17:41:08 +0000 Received: ("Tessian outbound aeae1c7b66fd:v130"); Fri, 11 Nov 2022 17:41:07 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 994731cac393c86a X-CR-MTA-TID: 64aa7808 Received: from 6896e4dcaa77.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 551DE174-5B68-4B25-BE62-9B0C9A06CC94.1; Fri, 11 Nov 2022 17:41:00 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 6896e4dcaa77.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 11 Nov 2022 17:41:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IPSN3L2ClLDYLbl6DnG9RxgvH9TPXU7zssvlMvqojRZ+/8ZwmqBGTfiTADzZ15OXNQ2ew9k/IW7I9U0tanqWE8Cs3n1HqQQTgdDcft0cpkn56+BgQZ+8ncXIBroco+mRL/PG4m/G43CmSyoOjBru/Ud16HHIGCvntICe9LZleXESCOP6ZYOf9ITqwy2WP7bz25pnsVNUUwo8L/qtT3N9YHMheNo5I90XPX/NVb1XUGvFY9gfdEsMKpu6GAhl/A/5OPQysoRPPhfp6y3B0323XKiLu6v+mqHPeo7Mtps2zXuXKH7RQxfm7AX+WXUfnlHuy2ZRRGG+WkskrsLIBbBuFA== 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=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; b=n/NzRE5rITfs2GkJkmP2q2kL3jGOsw+LofztZDY+HRL9o1nOZgHk+DKS8qVDgVRDXZmSxxg+arYKAO5m+KSaciEg52ACDZvnmH7WyX7bNG1ZW8BqPkWj2NpfP/FrnJ5One6FkDAAnULmBcPkqwqByDiOHa5iVQ76AAWCAREKZI63WUnkW47LPiRNMt0SRHhDKBIwjnEVvkyG3nWJnZNHiLP4xDXl8s/2wdCJVWTwM66S6It96RGLoEPhteOhQKQ4FJn8M0SwrT+mapjxQBzMsgvs/RL+2Sev0NpBK1rmfBnFQuKVTyE9BZvV1jD2xmbAGd+PyiNHXaBgoKo5BlrO9g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by GV2PR08MB8196.eurprd08.prod.outlook.com (2603:10a6:150:7c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Fri, 11 Nov 2022 17:40:57 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::1131:99da:d256:ae1f]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::1131:99da:d256:ae1f%4]) with mapi id 15.20.5813.015; Fri, 11 Nov 2022 17:40:57 +0000 Message-ID: <212ceca7-21f7-7d99-9543-9e39d9056aba@arm.com> Date: Fri, 11 Nov 2022 17:40:55 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: en-US To: gcc-patches@gcc.gnu.org Subject: [PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops X-ClientProxiedBy: LO2P123CA0071.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1::35) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|GV2PR08MB8196:EE_|VI1EUR03FT013:EE_|DU0PR08MB7637:EE_ X-MS-Office365-Filtering-Correlation-Id: ec12a326-9eb7-4a3a-62cf-08dac40bea79 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: 1BsVmDxC0Lm0NqSgxYgIuR3CBC265I03pwVqFoGVZIjuxOh6QG2q483F0LI9fOZ9EXCATkxKC7hMIVihdoRqzIkaQFKMqOgn/2IOf3Gv6D9NbqFd1jVsgM09EFwa0w8x9t3/sGaqqnlUk7XiftOqd8LABVs4HIvupsd/XeGOSx/HxJKR2Y60Gc8igrdfUr78vIdXhZOJm2rtzYvviLHwRJ5q/AhlKVl9SbD2+18MnN18+kqVA1prpgHAaiCUnfqsYf59iG9PvBdHGkeTLmbJVgyWxsHCYRohwshkZLZco+rYYHPu2+b0u+Csd9lVj+RnEpXXPdnt6kVXFTnkrnd5KlNNjMp3nppaF05h0LeWSsZ+8uvFAj7nWEJjnokZOJ0lTZWoA61wnaik46Bp4qREYk0xvSh0lT8ebR5AirxhNoQu9dXzOrzIiCT4p1ZdSmO0fV4cMZQUAeauvZ6J0JWDixk9G3dMzaRUO0j32BBLbG7LsFjjoot68EU3iuCsdg7WkkChJP5gZnRiLlhjhnvT/QRRlrsGhgrGElqKmhWuUGqFLHOzYGVlXfc8/zneDPt/S3uk3/Z0w0pwEvmrVYRNKh0Bdx1SIZVqoydol8emCeT1hWQqBhVBao+zLuVcng5re4pskqyjMeb2M0VJhwv477FVNLopXTqWyCEGIFuxtASjmxBLHnw0IuL7cO0kN2orzSvWT4LblHF5uXEM/rtTZ7dH3MLMn+iw1DX+iT14NxGRCWkdmsKMBZ9KjeEGQ3Js7ez5yc9/x/Fbqp5qUvGghM4Nq/aiZpTHGpg0a58PawBY1x53u6uBzQMB1jOlO57tfJozDSOE9kyPUNW5bX8mssc8P7eh2dZPhEV1vxhj+DQ= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB9PR08MB6507.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230022)(4636009)(396003)(346002)(39860400002)(366004)(376002)(136003)(451199015)(6486002)(31686004)(84970400001)(2906002)(36756003)(31696002)(86362001)(8936002)(235185007)(41300700001)(66556008)(8676002)(66476007)(66946007)(316002)(6916009)(5660300002)(33964004)(6506007)(478600001)(38100700002)(30864003)(83380400001)(2616005)(6512007)(26005)(186003)(45980500001)(43740500002)(559001)(579004); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8196 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: VI1EUR03FT013.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 62ae7700-78bf-4baa-9161-08dac40be384 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ptLJQEaicKdMlX7r4glBi4WipTvagN/QNpGrTYJG1GNqOg15Cp+s9/xvvTkHjMAewDCdNPX1zAtJ6spmXcbNY0B4aowXKS1fSg+M1C9hMh1y+r2labUPSolYv0fCXyHD+Xjnliu2Morvyk1GO/RQL2ZqEvLTObcay4YDUNtZCfP9JMMBJGVWJN9LQuiqGhe5rw9Ww1S/UuCUAoaZyIyQo/wcW1Lo4PnbSoGaoQjtj4pPaKafK7ohZhcX+LSd70zg/GQV2iabmvj0dASVaa7p7cTKDOevgvVqzghY1Tau6pkyiW1SuNKdk00mVSTCdHtuac/cYkMzn4aA5GLdoWGm0sYBvR/xpOrPq4eNtfvGPWyANjD89h6ZuD73Ui0fN/25qhAwKwSq6tEbEmZK8ArB3deVd3wEhmd1zZYk8nUqdb/3D931CjRu3HrQ9scJHt0YrVAam+xxdzvhhhOkPcBmqSEyspfeVIE9LOmDbfZb+9vgpcue7l3L1SNtOJ3pnN3+L0N6pohXHsxGLJ4sLOXT5+7Hd0WzQVVLelvpQPKZ/hHcDkcKWD0fAzTBYRiJEI0IVt1veutgJ/V1A8nmg5CWSd4VWdYXUnD4VbSxIet77WWOQQfFRtehjlT1Bo1JB9VqbrGqnRIg/rl/fuTxguI0rGMXqeUZZjYAzjgQdAQZo7w3vHBQ5P0QKLrGKtEhUQkA1qTamY0lLUW89TW0ZYTOpH3xsbg5hS34ac95qTOEcpG0FmN/zDgebDZDyhx8fHJeS3NWPEthuhuWfNV2o/i48PcDCs54T5TUAMaaK03dBP4lO9fIHEv3YTN0fvLCUCCbReLolUVbu7LGaV+kPUfLEHD3BR4+U7c8EPLD0N6TW/n9Jy6nJZtd47/mjjA2Ve+9 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:(13230022)(4636009)(346002)(39860400002)(396003)(136003)(376002)(451199015)(46966006)(36840700001)(40470700004)(31686004)(84970400001)(86362001)(5660300002)(41300700001)(235185007)(31696002)(8936002)(70586007)(6916009)(8676002)(70206006)(316002)(356005)(36756003)(40480700001)(36860700001)(82740400003)(40460700003)(81166007)(6506007)(33964004)(6486002)(6512007)(82310400005)(83380400001)(26005)(478600001)(2616005)(336012)(2906002)(186003)(30864003)(47076005)(43740500002)(579004)(559001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Nov 2022 17:41:08.2448 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ec12a326-9eb7-4a3a-62cf-08dac40bea79 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: VI1EUR03FT013.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB7637 X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, KAM_LOTSOFHASH, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Stam Markianos-Wright via Gcc-patches From: Stamatis Markianos-Wright Reply-To: Stam Markianos-Wright Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749222479156859003?= X-GMAIL-MSGID: =?utf-8?q?1749222479156859003?= Hi all, This is the 2/2 patch that contains the functional changes needed for MVE Tail Predicated Low Overhead Loops.  See my previous email for a general introduction of MVE LOLs. This support is added through the already existing loop-doloop mechanisms that are used for non-MVE dls/le looping. Changes are: 1) Relax the loop-doloop mechanism in the mid-end to allow for    decrement numbers other that -1 and for `count` to be an    rtx containing the number of elements to be processed, rather    than an expression for calculating the number of iterations. 2) Add a `allow_elementwise_doloop` target hook. This allows the    target backend to manipulate the iteration count as it needs:    in our case to change it from a pre-calculation of the number    of iterations to the number of elements to be processed. 3) The doloop_end target-insn now had an additional parameter:    the `count` (note: this is before it gets modified to just be    the number of elements), so that the decrement value is    extracted from that parameter. And many things in the backend to implement the above optimisation: 4)  Appropriate changes to the define_expand of doloop_end and new     patterns for dlstp and letp. 5) `arm_attempt_dlstp_transform`: (called from the define_expand of     doloop_end) this function checks for the loop's suitability for     dlstp/letp transformation and then implements it, if possible. 6) `arm_mve_get_loop_unique_vctp`: A function that loops through     the loop contents and returns the vctp VPR-genereting operation     within the loop, if it is unique and there is exclusively one     vctp within the loop. 7) A couple of utility functions: `arm_mve_get_vctp_lanes` to map    from vctp unspecs to number of lanes, and `arm_get_required_vpr_reg`    to check an insn to see if it requires the VPR or not. No regressions on arm-none-eabi with various targets and on aarch64-none-elf. Thoughts on getting this into trunk? Thank you, Stam Markianos-Wright gcc/ChangeLog:         * config/aarch64/aarch64.md: Add extra doloop_end arg.         * config/arm/arm-protos.h (arm_attempt_dlstp_transform): New.         * config/arm/arm.cc (TARGET_ALLOW_ELEMENTWISE_DOLOOP): New.         (arm_mve_get_vctp_lanes): New.         (arm_get_required_vpr_reg): New.         (arm_mve_get_loop_unique_vctp): New.         (arm_attempt_dlstp_transform): New.         (arm_allow_elementwise_doloop): New.         * config/arm/iterators.md:         * config/arm/mve.md (*predicated_doloop_end_internal): New.         (dlstp_insn): New.         * config/arm/thumb2.md (doloop_end): Update for MVE LOLs.         * config/arm/unspecs.md: New unspecs.         * config/ia64/ia64.md: Add extra doloop_end arg.         * config/pru/pru.md: Add extra doloop_end arg.         * config/rs6000/rs6000.md: Add extra doloop_end arg.         * config/s390/s390.md: Add extra doloop_end arg.         * config/v850/v850.md: Add extra doloop_end arg.         * doc/tm.texi: Document new hook.         * doc/tm.texi.in: Likewise.         * loop-doloop.cc (doloop_condition_get): Relax conditions.         (doloop_optimize): Add support for elementwise LoLs.         * target-insns.def (doloop_end): Add extra arg.         * target.def (allow_elementwise_doloop): New hook.         * targhooks.cc (default_allow_elementwise_doloop): New.         * targhooks.h (default_allow_elementwise_doloop): New. gcc/testsuite/ChangeLog:         * gcc.target/arm/lob.h: Update framework.         * gcc.target/arm/lob1.c: Likewise.         * gcc.target/arm/lob6.c: Likewise.         * gcc.target/arm/dlstp-int16x8.c: New test.         * gcc.target/arm/dlstp-int32x4.c: New test.         * gcc.target/arm/dlstp-int64x2.c: New test.         * gcc.target/arm/dlstp-int8x16.c: New test. ### Inline copy of patch ### diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index f2e3d905dbbeb2949f2947f5cfd68208c94c9272..7a6d24a80060b4a704a481ccd1a32d96e7b0f369 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -7366,7 +7366,8 @@ ;; knows what to generate. (define_expand "doloop_end" [(use (match_operand 0 "" "")) ; loop pseudo - (use (match_operand 1 "" ""))] ; label + (use (match_operand 1 "" "")) ; label + (use (match_operand 2 "" ""))] ; decrement constant "optimize > 0 && flag_modulo_sched" { rtx s0; diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index 550272facd12e60a49bf8a3b20f811cc13765b3a..7684620f0f4d161dd9e9ad2d70308021ec3d3d34 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -63,7 +63,7 @@ extern void arm_decompose_di_binop (rtx, rtx, rtx *, rtx *, rtx *, rtx *); extern bool arm_q_bit_access (void); extern bool arm_ge_bits_access (void); extern bool arm_target_insn_ok_for_lob (rtx); - +extern rtx arm_attempt_dlstp_transform (rtx, rtx); #ifdef RTX_CODE enum reg_class arm_mode_base_reg_class (machine_mode); diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc index ee8f1babf8a1319e77e0db0fa55851c038048804..99e144d52c26597c64b982b3d4ae9a62a114cf18 100644 --- a/gcc/config/arm/arm.cc +++ b/gcc/config/arm/arm.cc @@ -470,6 +470,9 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_SCHED_REORDER #define TARGET_SCHED_REORDER arm_sched_reorder +#undef TARGET_ALLOW_ELEMENTWISE_DOLOOP +#define TARGET_ALLOW_ELEMENTWISE_DOLOOP arm_allow_elementwise_doloop + #undef TARGET_REGISTER_MOVE_COST #define TARGET_REGISTER_MOVE_COST arm_register_move_cost @@ -34138,8 +34141,339 @@ arm_target_insn_ok_for_lob (rtx insn) return single_succ_p (bb) && single_pred_p (bb) - && single_succ_edge (bb)->dest == single_pred_edge (bb)->src - && contains_no_active_insn_p (bb); + && single_succ_edge (bb)->dest == single_pred_edge (bb)->src; +} + +static int +arm_mve_get_vctp_lanes (rtx x) +{ + if (GET_CODE (x) == SET && GET_CODE (XEXP (x, 1)) == UNSPEC) + { + switch (XINT (XEXP (x, 1), 1)) + { + case VCTP8Q: + return 16; + case VCTP16Q: + return 8; + case VCTP32Q: + return 4; + case VCTP64Q: + return 2; + default: + break; + } + } + return 0; +} + +/* Check if an insn requires the use of the VPR_REG, if it does, return the + sub-rtx of the matched operand. If there are more than one operand (e.g. an + input operand and an output operand) that use VPR_REG, return the first + occurance, which is usually the output operand. */ + +static rtx +arm_get_required_vpr_reg (rtx_insn *insn) +{ + bool requires_vpr; + + extract_constrain_insn (insn); + int n_operands = recog_data.n_operands; + if (recog_data.n_alternatives == 0) + return NULL_RTX; + + /* Fill in recog_op_alt with information about the constraints of + this insn. */ + preprocess_constraints (insn); + + for (int use = 0; use < n_operands; use++) + { + requires_vpr = true; + /* Iterate through alternatives of operand "use" in recog_op_alt and + * identify if the operand is required to be the VPR. */ + for (int alt1 = 0; alt1 < recog_data.n_alternatives; alt1++) + { + const operand_alternative *op_alt1 + = &recog_op_alt[alt1 * n_operands]; + /* Fetch the reg_class for each entry and check it against the + * VPR_REG reg_class. */ + if (alternative_class (op_alt1, use) != VPR_REG) + requires_vpr = false; + } + /* If all alternatives of the insn require the VPR reg for this operand, + it means that either this is VPR-generating instruction, like a vctp, + vcmp, etc., or it is a VPT-predicated insruction. Return the subrtx + of the VPR reg operand. */ + if (requires_vpr) + return recog_data.operand[use]; + } + return NULL_RTX; +} + +/* Scan the basic block of a loop body for a vctp instruction. If there is + exactly one unique vctp instruction, return its rtx_insn *. */ + +static rtx_insn * +arm_mve_get_loop_unique_vctp (basic_block bb) +{ + rtx_insn *insn = BB_HEAD (bb); + rtx_insn *vctp_op = NULL; + + /* Now scan through all the instruction patterns and + pick out any MVE instructions. */ + FOR_BB_INSNS (bb, insn) + { + if (INSN_P (insn)) + { + /* First check if this is a vctp instruction. There needs to be + exactly one vctp instruction within the loop. */ + if (arm_mve_get_vctp_lanes (PATTERN (insn)) != 0) + { + /* If we already found one vctp instruction, then the + loop is not consistent internally. */ + if (vctp_op) + return NULL; + + vctp_op = insn; + } + } + } + return vctp_op; +} + +rtx +arm_attempt_dlstp_transform (rtx label, rtx count) +{ + int decrementnum; + basic_block body = BLOCK_FOR_INSN (label)->prev_bb; + rtx initial_compare; + /* Doloop can only be done "elementwise" with predicated dlstp/letp + when the iteration counter gets deprecated by the number of MVE + lanes. This can be exxtracted from the `count`, which is the expression + used to calculate the number of iterations that the loop would execute + for a standard dls/le loop. Since we only support cases where this is a + power of 2, we can assume that this expression arrives here as: + (lshiftrt: (A) (const_int y)) + Then we can extract the decrementnum from y. */ + if (GET_CODE (count) == LSHIFTRT && ARITHMETIC_P (XEXP (count, 0)) + && (decrementnum = (1 << (INTVAL (XEXP (count, 1))))) + /* There is one final condition that needs to be met for the loop to be + transformable: dlstp/letp will continue looping until there are + elements still to process. This can only work if the looping ends + when the element counter reaches zero and not some other value + (e.g. n > 0 works, not n > 1), or we can incorrectly end up running + one additional iteration. To by-pass any hoisting that the compiler + may have done with the `A` in `count` above, we can instead look up + to the bb before the loop preheader: this should end with a cmp+jump + pair, where the cmp needs to be with (const_int 0). */ + && loop_preheader_edge (body->loop_father)->src->prev_bb + && BB_END (loop_preheader_edge (body->loop_father)->src->prev_bb) + && PREV_INSN (BB_END (loop_preheader_edge (body->loop_father) + ->src->prev_bb)) + && INSN_P (PREV_INSN (BB_END (loop_preheader_edge (body->loop_father) + ->src->prev_bb))) + && (initial_compare + = PATTERN (PREV_INSN (BB_END (loop_preheader_edge (body->loop_father) + ->src->prev_bb)))) + && GET_CODE (initial_compare) == SET + && cc_register (XEXP (initial_compare, 0), VOIDmode) + && GET_CODE (XEXP (initial_compare, 1)) == COMPARE + && CONST_INT_P (XEXP (XEXP (initial_compare, 1), 1)) + && INTVAL (XEXP (XEXP (initial_compare, 1), 1)) == 0) + { + /* Find the vctp predicate generation inside the loop body BB. */ + rtx_insn *vctp_insn = arm_mve_get_loop_unique_vctp (body); + + /* If we have successfully found one exactly vctp predicate-generating + instruction within the loop and the number by which we deprecate the + loop counter in each iteration matches the number of lanes of the + vctp instruction, we can attempt to turn this into a dlstp/letp loop. + */ + if (vctp_insn + && decrementnum == arm_mve_get_vctp_lanes (PATTERN (vctp_insn))) + { + rtx_insn *insn = 0; + rtx_insn *cur_insn = 0; + rtx_insn *seq; + rtx vctp_vpr_generated = NULL_RTX; + rtx insn_vpr_reg_operand = NULL_RTX; + bool transform_worked = true; + int new_icode; + + /* Scan through the insns in the loop bb and emit the transformed bb + insns to a sequence. */ + start_sequence (); + FOR_BB_INSNS (body, insn) + { + if (INSN_P (insn)) + { + /* When we find the vctp instruction: This may be followed by + a sign-extend insn to SImode. If it is, then save the + sign-extended REG into vctp_vpr_generated. If there is no + sign-extend, then store the raw output of the vctp. + For any VPT-predicated instructions we need to ensure that + the VPR they use is the same as the one given here and + they often consume the output of a subreg of the SImode + sign-extended VPR-reg. As a result, comparing against the + output of the sign-extend is more likely to succeed. + This code also guarantees to us that the vctp comes before + any instructions that use the VPR within the loop, for the + dlstp/letp transform to succeed. */ + if (insn == vctp_insn) + { + if (GET_CODE (XEXP (PATTERN (NEXT_INSN (insn)), 1)) + == SIGN_EXTEND + && GET_CODE (XEXP ( + PATTERN (NEXT_INSN (NEXT_INSN (insn))), 1)) + == SUBREG) + vctp_vpr_generated + = XEXP (PATTERN (NEXT_INSN (NEXT_INSN (insn))), 0); + else + vctp_vpr_generated = XEXP (PATTERN (insn), 0); + /* Also emit a USE of the source register of the vctp. + This holds the number of elements being processed + by the loop. This later gets stored into `count`. + */ + emit_use (XVECEXP (XEXP (PATTERN (insn), 1), 0, 0)); + continue; + } + /* If the insn pattern requires the use of the VPR, then it + a VPT-predicated instruction, so it will need to be + transformed into the non-predicated version of the + instruction. */ + else if ((insn_vpr_reg_operand + = arm_get_required_vpr_reg (insn)) + != NULL_RTX) + { + /* If the VPR value is different to the one generated by + the vctp, then fail the conversion. */ + if (!rtx_equal_p (vctp_vpr_generated, + insn_vpr_reg_operand)) + { + transform_worked = false; + break; + } + /* Also ensure that it's a valid recog-ed instruction with + the mve_unpredicated_insn atrribute. */ + else if (recog_memoized (insn) >= 0 + && (new_icode + = get_attr_mve_unpredicated_insn (insn))) + { + extract_insn (insn); + rtx arr[8]; + int j = 0; + + /* When transforming a VPT-predicated instruction + into its unpredicated equivalent we need to drop + the VPR operand and we may need to also drop a + merge "vuninit" input operand, depending on the + instruction pattern. Here ensure that we have at + most a two-operand difference between the two + instrunctions. */ + int n_operands_diff + = recog_data.n_operands + - insn_data[new_icode].n_operands; + gcc_assert (n_operands_diff > 0 + && n_operands_diff <= 2); + + /* Then, loop through the operands of the predicated + instruction, and retain the ones that map to the + unpredicated instruction. */ + for (int i = 0; i < recog_data.n_operands; i++) + { + /* Ignore the VPR and, if needed, the vuninit + operand. */ + if (insn_vpr_reg_operand == recog_data.operand[i] + || (n_operands_diff == 2 + && !strcmp (recog_data.constraints[i], + "0"))) + continue; + else + { + arr[j] = recog_data.operand[i]; + j++; + } + } + + /* Finally, emit the upredicated instruction. */ + switch (j) + { + case 2: + emit_insn (GEN_FCN (new_icode) (arr[0], + arr[1])); + break; + case 3: + emit_insn (GEN_FCN (new_icode) (arr[0], arr[1], + arr[2])); + break; + default: + gcc_unreachable (); + } + } + /* If we can't identify the INSN as either being either + for deletion or to re-map, then we don't know how to + handle it, so fail the whole conversion. */ + else + { + transform_worked = false; + break; + } + } + /* Instructions that dont's require the VPR can be carried + over as-is. */ + else + emit_insn (PATTERN (insn)); + } + } + seq = get_insns (); + end_sequence (); + + if (transform_worked) + { + /* Re-write the entire BB contents with the transformed + sequence. */ + FOR_BB_INSNS_SAFE (body, insn, cur_insn) + if (INSN_P (insn)) + delete_insn (insn); + for (insn = seq; NEXT_INSN (insn); insn = NEXT_INSN (insn)) + emit_insn_after (PATTERN (insn), BB_END (body)); + emit_jump_insn_after (PATTERN (insn), BB_END (body)); + return GEN_INT (decrementnum); + } + } + } + /* Bail out: we can't use dlstp/letp, so return 1 to allow loop-doloop to try + the standard dls/le pair. */ + return GEN_INT (1); +} + +/* Target hook to the number of elements to be processed by a dlstp/letp loop + into `count` to intialise the counter register. The number of elements was + previously extracted from the vctp insn and placed into a USE rtx. + We only check that the doloop_end pattern successfully decrements by a + number other than -1 for a valid dlstp/letp loop. No other checking is + needed as that was done previously. */ + +rtx +arm_allow_elementwise_doloop (rtx count, rtx label, rtx doloop) +{ + if (doloop + && INTVAL (XEXP (SET_SRC (XVECEXP (PATTERN (doloop), 0, 1)), 1)) != -1 + && ARITHMETIC_P (XEXP (count, 0))) + { + basic_block body = BLOCK_FOR_INSN (label)->prev_bb; + rtx_insn* insn; + FOR_BB_INSNS (body, insn) + { + if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE) + { + rtx num_elem_reg = copy_rtx (XEXP (PATTERN (insn), 0)); + delete_insn (insn); + return num_elem_reg; + } + } + } + else + return count; } #if CHECKING_P diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md index 29062cd6fb3c61c22417ef8fc25abd7819d2c034..aa2fdac22f3c7884c18ebf197b26a2d54da44c93 100644 --- a/gcc/config/arm/iterators.md +++ b/gcc/config/arm/iterators.md @@ -1464,7 +1464,9 @@ (define_int_attr mode1 [(VCTP8Q "8") (VCTP16Q "16") (VCTP32Q "32") (VCTP64Q "64") (VCTP8Q_M "8") (VCTP16Q_M "16") - (VCTP32Q_M "32") (VCTP64Q_M "64")]) + (VCTP32Q_M "32") (VCTP64Q_M "64") + (DLSTP8 "8") (DLSTP16 "16") (DLSTP32 "32") + (DLSTP64 "64")]) ;; Both kinds of return insn. (define_code_iterator RETURNS [return simple_return]) @@ -1773,6 +1775,8 @@ (define_int_iterator UQRSHLLQ [UQRSHLL_64 UQRSHLL_48]) (define_int_iterator SQRSHRLQ [SQRSHRL_64 SQRSHRL_48]) (define_int_iterator VSHLCQ_M [VSHLCQ_M_S VSHLCQ_M_U]) +(define_int_iterator DLSTP [DLSTP8 DLSTP16 DLSTP32 + DLSTP64]) ;; Define iterators for VCMLA operations (define_int_iterator VCMLA_OP [UNSPEC_VCMLA diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index b1c8c1c569f31a6cb1bfdc16394047f02d6cddf4..3baddab5905a8e45bbf55f53e876a671d6d58c5e 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -10837,3 +10837,38 @@ } DONE; }) + +;; Originally expanded by 'predicated_doloop_end'. +(define_insn "*predicated_doloop_end_internal" + [(set (pc) + (if_then_else + (ge (plus:SI (reg:SI LR_REGNUM) + (match_operand:SI 0 "const_int_operand" "")) + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc))) + (set (reg:SI LR_REGNUM) + (plus:SI (reg:SI LR_REGNUM) (match_dup 0))) + (clobber (reg:CC CC_REGNUM))] + "TARGET_32BIT && TARGET_HAVE_LOB && TARGET_HAVE_MVE && TARGET_THUMB2" + { + if (get_attr_length (insn) == 4) + return "letp\t%|lr, %l1"; + else + return "subs\t%|lr, #%0;bgt\t%l1"; + } + [(set (attr "length") + (if_then_else + (ltu (minus (pc) (match_dup 1)) (const_int 1024)) + (const_int 4) + (const_int 6))) + (set_attr "type" "branch")]) + +(define_insn "dlstp_insn" + [ + (set (reg:SI LR_REGNUM) + (unspec:SI [(match_operand:SI 0 "s_register_operand" "r")] + DLSTP)) + ] + "TARGET_32BIT && TARGET_HAVE_LOB && TARGET_HAVE_MVE && TARGET_THUMB2" + "dlstp.\t%|lr, %0") \ No newline at end of file diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md index b2309a5216550104f29a71f33506d421f79f5e2c..a21e2909872a618a8b8b2b69efb9a412fcc96a85 100644 --- a/gcc/config/arm/thumb2.md +++ b/gcc/config/arm/thumb2.md @@ -1610,10 +1610,11 @@ ;; knows what to generate. (define_expand "doloop_end" [(use (match_operand 0 "" "")) ; loop pseudo - (use (match_operand 1 "" ""))] ; label + (use (match_operand 1 "" "")) ; label + (use (match_operand 2 "" ""))] ; decrement constant "TARGET_32BIT" " - { +{ /* Currently SMS relies on the do-loop pattern to recognize loops where (1) the control part consists of all insns defining and/or using a certain 'count' register and (2) the loop count can be @@ -1623,41 +1624,68 @@ Also used to implement the low over head loops feature, which is part of the Armv8.1-M Mainline Low Overhead Branch (LOB) extension. */ - if (optimize > 0 && (flag_modulo_sched || TARGET_HAVE_LOB)) - { - rtx s0; - rtx bcomp; - rtx loc_ref; - rtx cc_reg; - rtx insn; - rtx cmp; - - if (GET_MODE (operands[0]) != SImode) - FAIL; - - s0 = operands [0]; - - /* Low over head loop instructions require the first operand to be LR. */ - if (TARGET_HAVE_LOB && arm_target_insn_ok_for_lob (operands [1])) - s0 = gen_rtx_REG (SImode, LR_REGNUM); - - if (TARGET_THUMB2) - insn = emit_insn (gen_thumb2_addsi3_compare0 (s0, s0, GEN_INT (-1))); - else - insn = emit_insn (gen_addsi3_compare0 (s0, s0, GEN_INT (-1))); - - cmp = XVECEXP (PATTERN (insn), 0, 0); - cc_reg = SET_DEST (cmp); - bcomp = gen_rtx_NE (VOIDmode, cc_reg, const0_rtx); - loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [1]); - emit_jump_insn (gen_rtx_SET (pc_rtx, - gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, - loc_ref, pc_rtx))); - DONE; - } - else - FAIL; - }") + if (optimize > 0 && (flag_modulo_sched || TARGET_HAVE_LOB)) + { + rtx s0; + rtx bcomp; + rtx loc_ref; + rtx cc_reg; + rtx insn; + rtx cmp; + rtx decrement_num; + + if (GET_MODE (operands[0]) != SImode) + FAIL; + + s0 = operands[0]; + + if (TARGET_HAVE_LOB && arm_target_insn_ok_for_lob (operands[1])) + { + s0 = gen_rtx_REG (SImode, LR_REGNUM); + + /* If we have a compatibe MVE target, try and analyse the loop + contents to determine if we can use predicated dlstp/letp + looping. */ + if (TARGET_HAVE_MVE && TARGET_THUMB2 + && (decrement_num = arm_attempt_dlstp_transform (operands[1], + operands[2])) + && (INTVAL (decrement_num) != 1)) + { + insn = emit_insn + (gen_thumb2_addsi3_compare0 + (s0, s0, GEN_INT ((-1) * (INTVAL (decrement_num))))); + cmp = XVECEXP (PATTERN (insn), 0, 0); + cc_reg = SET_DEST (cmp); + bcomp = gen_rtx_GE (VOIDmode, cc_reg, const0_rtx); + loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[1]); + emit_jump_insn (gen_rtx_SET (pc_rtx, + gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, + loc_ref, pc_rtx))); + DONE; + } + + /* Otherwise, try standard decrement-by-one dls/le looping. */ + if (TARGET_THUMB2) + insn = emit_insn (gen_thumb2_addsi3_compare0 (s0, s0, + GEN_INT (-1))); + else + insn = emit_insn (gen_addsi3_compare0 (s0, s0, GEN_INT (-1))); + + cmp = XVECEXP (PATTERN (insn), 0, 0); + cc_reg = SET_DEST (cmp); + bcomp = gen_rtx_NE (VOIDmode, cc_reg, const0_rtx); + loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[1]); + emit_jump_insn (gen_rtx_SET (pc_rtx, + gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, + loc_ref, pc_rtx))); + DONE; + } + else + FAIL; + } + else + FAIL; +}") (define_insn "*clear_apsr" [(unspec_volatile:SI [(const_int 0)] VUNSPEC_CLRM_APSR) @@ -1755,7 +1783,37 @@ { if (REGNO (operands[0]) == LR_REGNUM) { - emit_insn (gen_dls_insn (operands[0])); + /* Pick out the number by which we are decrementing the loop counter + in every iteration. If it's > 1, then use dlstp. */ + int const_int_dec_num + = abs (INTVAL (XEXP (XEXP (XVECEXP (PATTERN (operands[1]), 0, 1), + 1), + 1))); + switch (const_int_dec_num) + { + case 16: + emit_insn (gen_dlstp8_insn (operands[0])); + break; + + case 8: + emit_insn (gen_dlstp16_insn (operands[0])); + break; + + case 4: + emit_insn (gen_dlstp32_insn (operands[0])); + break; + + case 2: + emit_insn (gen_dlstp64_insn (operands[0])); + break; + + case 1: + emit_insn (gen_dls_insn (operands[0])); + break; + + default: + gcc_unreachable (); + } DONE; } else diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md index 7748e78437943ca0cd0d8909330ea8d3b4948ae3..744e7ab5731b5010ce280a046c5a94f6f590c350 100644 --- a/gcc/config/arm/unspecs.md +++ b/gcc/config/arm/unspecs.md @@ -579,6 +579,10 @@ VCTP16Q VCTP32Q VCTP64Q + DLSTP8 + DLSTP16 + DLSTP32 + DLSTP64 VPNOT VCREATEQ_F VCVTQ_N_TO_F_S diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index 5d1d47da55b2f0a2ae001c3277467ae19513fbe1..5b24bd76ace5789ccc7e860c5872413bb661cf88 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -3956,7 +3956,8 @@ (define_expand "doloop_end" [(use (match_operand 0 "" "")) ; loop pseudo - (use (match_operand 1 "" ""))] ; label + (use (match_operand 1 "" "")) ; label + (use (match_operand 2 "" ""))] ; decrement constant "" { if (GET_MODE (operands[0]) != DImode) diff --git a/gcc/config/pru/pru.md b/gcc/config/pru/pru.md index bdc5ad79ba06008e9fbf2aade395b4195e1b2a76..990cdfe0974f1f61082b1fc6508c405cde32a254 100644 --- a/gcc/config/pru/pru.md +++ b/gcc/config/pru/pru.md @@ -1636,7 +1636,8 @@ (define_expand "doloop_end" [(use (match_operand 0 "nonimmediate_operand")) - (use (label_ref (match_operand 1 "")))] + (use (label_ref (match_operand 1 ""))) + (use (match_operand 2 "" ""))] ; decrement constant "TARGET_OPT_LOOP" { if (GET_CODE (operands[0]) == REG && GET_MODE (operands[0]) == QImode) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index ad5a4cf2ef83329fb72963c330e6cc42deb13dcc..fdaeb6a02ca06ffcfe87c41852fefa554707e3f0 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -13422,7 +13422,8 @@ (define_expand "doloop_end" [(use (match_operand 0)) ; loop pseudo - (use (match_operand 1))] ; label + (use (match_operand 1)) ; label + (use (match_operand 2 "" ""))] ; decrement constant "" { if (GET_MODE (operands[0]) != Pmode) diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 962927c31126b3dfade6a9314bb54e24f1df5ead..bad317fdba73c7f8150a4cd779444ced45d6ee5d 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -9780,7 +9780,8 @@ (define_expand "doloop_end" [(use (match_operand 0 "" "")) ; loop pseudo - (use (match_operand 1 "" ""))] ; label + (use (match_operand 1 "" "")) ; label + (use (match_operand 2 "" ""))] ; decrement constant "" { if (GET_MODE (operands[0]) == SImode) diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md index 6ca31e3f43f4e67777e3c1bdb93a474a21e883a7..8d0812abac7e84a29d77ada60e172d89d3bbe387 100644 --- a/gcc/config/v850/v850.md +++ b/gcc/config/v850/v850.md @@ -1434,7 +1434,8 @@ (define_expand "doloop_end" [(use (match_operand 0 "" "")) ; loop pseudo - (use (match_operand 1 "" ""))] ; label + (use (match_operand 1 "" "")) ; label + (use (match_operand 2 "" ""))] ; decrement constant "TARGET_V850E3V5_UP && TARGET_LOOP" { rtx loop_cnt = operands[0]; diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 110f8dfa0a9fc276e584ce4db2dfe2257409615e..7dde0b0096dfd9e996a394a2000d42e3f637c323 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -11774,6 +11774,14 @@ loops, and will help ivopts to make some decisions. The default version of this hook returns false. @end deftypefn +@deftypefn {Target Hook} rtx TARGET_ALLOW_ELEMENTWISE_DOLOOP (rtx @var{count}, rtx @var{label}, rtx @var{doloop}) +This target hook allows the target to support loop-doloop optimisations +where the value that gets put into the loop counter register is not a +pre-calculation of the number of iteration of the loop. For instance, +the value used can be the number of elements that the loop will process. +The default version of this hook returns the same rtx it was given. +@end deftypefn + @deftypevr {Target Hook} bool TARGET_HAVE_COUNT_REG_DECR_P Return true if the target supports hardware count register for decrement and branch. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 501ddf147e40b68b757269f703f58d1091b9e06f..cc1a81f3957d51caebec98992a4119d86878cdb8 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -7730,6 +7730,8 @@ to by @var{ce_info}. @hook TARGET_PREDICT_DOLOOP_P +@hook TARGET_ALLOW_ELEMENTWISE_DOLOOP + @hook TARGET_HAVE_COUNT_REG_DECR_P @hook TARGET_DOLOOP_COST_FOR_GENERIC diff --git a/gcc/loop-doloop.cc b/gcc/loop-doloop.cc index 30b45c8071a709d9f0d03037c3876b532727e6f0..674eb429f1f5e915d67513ad6a4aa170444fc00d 100644 --- a/gcc/loop-doloop.cc +++ b/gcc/loop-doloop.cc @@ -85,29 +85,29 @@ doloop_condition_get (rtx_insn *doloop_pat) forms: 1) (parallel [(set (pc) (if_then_else (condition) - (label_ref (label)) - (pc))) - (set (reg) (plus (reg) (const_int -1))) - (additional clobbers and uses)]) + (label_ref (label)) + (pc))) + (set (reg) (plus (reg) (const_int -n))) + (additional clobbers and uses)]) The branch must be the first entry of the parallel (also required by jump.cc), and the second entry of the parallel must be a set of the loop counter register. Some targets (IA-64) wrap the set of the loop counter in an if_then_else too. - 2) (set (reg) (plus (reg) (const_int -1)) - (set (pc) (if_then_else (reg != 0) - (label_ref (label)) - (pc))). + 2) (set (reg) (plus (reg) (const_int -n)) + (set (pc) (if_then_else (reg != 0) + (label_ref (label)) + (pc))). Some targets (ARM) do the comparison before the branch, as in the following form: - 3) (parallel [(set (cc) (compare ((plus (reg) (const_int -1), 0))) - (set (reg) (plus (reg) (const_int -1)))]) - (set (pc) (if_then_else (cc == NE) - (label_ref (label)) - (pc))) */ + 3) (parallel [(set (cc) (compare ((plus (reg) (const_int -n), 0))) + (set (reg) (plus (reg) (const_int -n)))]) + (set (pc) (if_then_else (cc == NE) + (label_ref (label)) + (pc))) */ pattern = PATTERN (doloop_pat); @@ -143,7 +143,7 @@ doloop_condition_get (rtx_insn *doloop_pat) || GET_CODE (cmp_arg1) != PLUS) return 0; reg_orig = XEXP (cmp_arg1, 0); - if (XEXP (cmp_arg1, 1) != GEN_INT (-1) + if (!CONST_INT_P (XEXP (cmp_arg1, 1)) || !REG_P (reg_orig)) return 0; cc_reg = SET_DEST (cmp_orig); @@ -156,7 +156,8 @@ doloop_condition_get (rtx_insn *doloop_pat) { /* We expect the condition to be of the form (reg != 0) */ cond = XEXP (SET_SRC (cmp), 0); - if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx) + if ((GET_CODE (cond) != NE && GET_CODE (cond) != GE) + || XEXP (cond, 1) != const0_rtx) return 0; } } @@ -173,14 +174,14 @@ doloop_condition_get (rtx_insn *doloop_pat) if (! REG_P (reg)) return 0; - /* Check if something = (plus (reg) (const_int -1)). + /* Check if something = (plus (reg) (const_int -n)). On IA-64, this decrement is wrapped in an if_then_else. */ inc_src = SET_SRC (inc); if (GET_CODE (inc_src) == IF_THEN_ELSE) inc_src = XEXP (inc_src, 1); if (GET_CODE (inc_src) != PLUS || XEXP (inc_src, 0) != reg - || XEXP (inc_src, 1) != constm1_rtx) + || !CONST_INT_P (XEXP (inc_src, 1))) return 0; /* Check for (set (pc) (if_then_else (condition) @@ -211,42 +212,49 @@ doloop_condition_get (rtx_insn *doloop_pat) || (GET_CODE (XEXP (condition, 0)) == PLUS && XEXP (XEXP (condition, 0), 0) == reg)) { - if (GET_CODE (pattern) != PARALLEL) /* For the second form we expect: - (set (reg) (plus (reg) (const_int -1)) - (set (pc) (if_then_else (reg != 0) - (label_ref (label)) - (pc))). + (set (reg) (plus (reg) (const_int -n)) + (set (pc) (if_then_else (reg != 0) + (label_ref (label)) + (pc))). - is equivalent to the following: + If n == 1, that is equivalent to the following: - (parallel [(set (pc) (if_then_else (reg != 1) - (label_ref (label)) - (pc))) - (set (reg) (plus (reg) (const_int -1))) - (additional clobbers and uses)]) + (parallel [(set (pc) (if_then_else (reg != 1) + (label_ref (label)) + (pc))) + (set (reg) (plus (reg) (const_int -1))) + (additional clobbers and uses)]) - For the third form we expect: + For the third form we expect: - (parallel [(set (cc) (compare ((plus (reg) (const_int -1)), 0)) - (set (reg) (plus (reg) (const_int -1)))]) - (set (pc) (if_then_else (cc == NE) - (label_ref (label)) - (pc))) + (parallel [(set (cc) (compare ((plus (reg) (const_int -n)), 0)) + (set (reg) (plus (reg) (const_int -n)))]) + (set (pc) (if_then_else (cc == NE) + (label_ref (label)) + (pc))) - which is equivalent to the following: + Which also for n == 1 is equivalent to the following: - (parallel [(set (cc) (compare (reg, 1)) - (set (reg) (plus (reg) (const_int -1))) - (set (pc) (if_then_else (NE == cc) - (label_ref (label)) - (pc))))]) + (parallel [(set (cc) (compare (reg, 1)) + (set (reg) (plus (reg) (const_int -1))) + (set (pc) (if_then_else (NE == cc) + (label_ref (label)) + (pc))))]) - So we return the second form instead for the two cases. + So we return the second form instead for the two cases. + For the "elementwise" form where the decrement number isn't -1, + the final value may be exceeded, so use GE instead of NE. */ - condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx); + if (GET_CODE (pattern) != PARALLEL) + { + if (INTVAL (XEXP (inc_src, 1)) != -1) + condition = gen_rtx_fmt_ee (GE, VOIDmode, inc_src, const0_rtx); + else + condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx);; + } return condition; } @@ -685,17 +693,6 @@ doloop_optimize (class loop *loop) return false; } - max_cost - = COSTS_N_INSNS (param_max_iterations_computation_cost); - if (set_src_cost (desc->niter_expr, mode, optimize_loop_for_speed_p (loop)) - > max_cost) - { - if (dump_file) - fprintf (dump_file, - "Doloop: number of iterations too costly to compute.\n"); - return false; - } - if (desc->const_iter) iterations = widest_int::from (rtx_mode_t (desc->niter_expr, mode), UNSIGNED); @@ -720,7 +717,25 @@ doloop_optimize (class loop *loop) count = copy_rtx (desc->niter_expr); start_label = block_label (desc->in_edge->dest); doloop_reg = gen_reg_rtx (mode); - rtx_insn *doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label); + rtx_insn *doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label, + count); + + /* Not all targets need to pre-calculate the number of the iterations of + the loop, they instead work by storing the number of elements in the + counter_reg and decrementing that. Call the appropriate target hook to + change the value of count. */ + count = targetm.allow_elementwise_doloop (count, start_label, doloop_seq); + + max_cost + = COSTS_N_INSNS (param_max_iterations_computation_cost); + if (set_src_cost (count, mode, optimize_loop_for_speed_p (loop)) + > max_cost) + { + if (dump_file) + fprintf (dump_file, + "Doloop: number of iterations too costly to compute.\n"); + return false; + } word_mode_size = GET_MODE_PRECISION (word_mode); word_mode_max = (HOST_WIDE_INT_1U << (word_mode_size - 1) << 1) - 1; @@ -737,7 +752,7 @@ doloop_optimize (class loop *loop) else count = lowpart_subreg (word_mode, count, mode); PUT_MODE (doloop_reg, word_mode); - doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label); + doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label, count); } if (! doloop_seq) { diff --git a/gcc/target-insns.def b/gcc/target-insns.def index de8c0092f989efa9e7d1f8a2a12fcf4ffc4a6013..b77b79724262304b070c511de301d898bc3ca444 100644 --- a/gcc/target-insns.def +++ b/gcc/target-insns.def @@ -48,7 +48,7 @@ DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4)) DEF_TARGET_INSN (check_stack, (rtx x0)) DEF_TARGET_INSN (clear_cache, (rtx x0, rtx x1)) DEF_TARGET_INSN (doloop_begin, (rtx x0, rtx x1)) -DEF_TARGET_INSN (doloop_end, (rtx x0, rtx x1)) +DEF_TARGET_INSN (doloop_end, (rtx x0, rtx x1, rtx x2)) DEF_TARGET_INSN (eh_return, (rtx x0)) DEF_TARGET_INSN (epilogue, (void)) DEF_TARGET_INSN (exception_receiver, (void)) diff --git a/gcc/target.def b/gcc/target.def index a3d3b04a1657bfa006b8e9ccdc65ead2bcc7fde7..1f1c07f406fbc75b44f1afe7a1ab313005be82b0 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4392,6 +4392,16 @@ The default version of this hook returns false.", bool, (class loop *loop), default_predict_doloop_p) +DEFHOOK +(allow_elementwise_doloop, + "This target hook allows the target to support loop-doloop optimisations\n\ +where the value that gets put into the loop counter register is not a\n\ +pre-calculation of the number of iteration of the loop. For instance,\n\ +the value used can be the number of elements that the loop will process.\n\ +The default version of this hook returns the same rtx it was given.", + rtx, (rtx count, rtx label, rtx doloop), + default_allow_elementwise_doloop) + DEFHOOKPOD (have_count_reg_decr_p, "Return true if the target supports hardware count register for decrement\n\ diff --git a/gcc/targhooks.h b/gcc/targhooks.h index ecce55ebe797cedc940620e8d89816973a045d49..6f1f0747f300b774493316b2aa6a7863a69a085a 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -88,6 +88,7 @@ extern bool default_fixed_point_supported_p (void); extern bool default_has_ifunc_p (void); extern bool default_predict_doloop_p (class loop *); +extern rtx default_allow_elementwise_doloop (rtx, rtx, rtx); extern machine_mode default_preferred_doloop_mode (machine_mode); extern const char * default_invalid_within_doloop (const rtx_insn *); diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index d17d393baedc16574ddecb86e868799a65736660..8a3b9e7571092df3b9acc90d1bc5b508110fe912 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -661,6 +661,12 @@ default_predict_doloop_p (class loop *loop ATTRIBUTE_UNUSED) return false; } +rtx +default_allow_elementwise_doloop (rtx count, rtx, rtx) +{ + return count; +} + /* By default, just use the input MODE itself. */ machine_mode diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int16x8.c b/gcc/testsuite/gcc.target/arm/dlstp-int16x8.c new file mode 100644 index 0000000000000000000000000000000000000000..a61f02ed3a23e077fc6bd354f89832223df4acdc --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int16x8.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void __attribute__ ((noinline)) test (int16_t *a, int16_t *b, int16_t *c, int n) +{ + while (n > 0) + { + mve_pred16_t p = vctp16q (n); + int16x8_t va = vldrhq_z_s16 (a, p); + int16x8_t vb = vldrhq_z_s16 (b, p); + int16x8_t vc = vaddq_x_s16 (va, vb, p); + vstrhq_p_s16 (c, vc, p); + c+=8; + a+=8; + b+=8; + n-=8; + } +} + +int main () +{ + int i; + int16_t temp1[N]; + int16_t temp2[N]; + int16_t temp3[N]; + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 0); + check_plus16 (temp1, temp2, temp3, 0); + + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 1); + check_plus16 (temp1, temp2, temp3, 1); + + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 7); + check_plus16 (temp1, temp2, temp3, 7); + + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 8); + check_plus16 (temp1, temp2, temp3, 8); + + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 9); + check_plus16 (temp1, temp2, temp3, 9); + + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 16); + check_plus16 (temp1, temp2, temp3, 16); + + reset_data16 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 17); + check_plus16 (temp1, temp2, temp3, 17); + + reset_data16 (temp1, temp2, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.16\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int32x4.c b/gcc/testsuite/gcc.target/arm/dlstp-int32x4.c new file mode 100644 index 0000000000000000000000000000000000000000..31a7264ae265a02d617ff31928cece9e37fbcc3f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int32x4.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void __attribute__ ((noinline)) test (int32_t *a, int32_t *b, int32_t *c, int n) +{ + while (n > 0) + { + mve_pred16_t p = vctp32q (n); + int32x4_t va = vldrwq_z_s32 (a, p); + int32x4_t vb = vldrwq_z_s32 (b, p); + int32x4_t vc = vaddq_x_s32 (va, vb, p); + vstrwq_p_s32 (c, vc, p); + c+=4; + a+=4; + b+=4; + n-=4; + } +} + +int main () +{ + int i; + int32_t temp1[N]; + int32_t temp2[N]; + int32_t temp3[N]; + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 0); + check_plus32 (temp1, temp2, temp3, 0); + + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 1); + check_plus32 (temp1, temp2, temp3, 1); + + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 3); + check_plus32 (temp1, temp2, temp3, 3); + + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 4); + check_plus32 (temp1, temp2, temp3, 4); + + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 5); + check_plus32 (temp1, temp2, temp3, 5); + + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 8); + check_plus32 (temp1, temp2, temp3, 8); + + reset_data32 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 9); + check_plus32 (temp1, temp2, temp3, 9); + + reset_data32 (temp1, temp2, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.32\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int64x2.c b/gcc/testsuite/gcc.target/arm/dlstp-int64x2.c new file mode 100644 index 0000000000000000000000000000000000000000..a09c01884da50e68de8ae5bab994e3c7d07963b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int64x2.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void __attribute__ ((noinline)) test (int64_t *a, int64_t *c, int n) +{ + while (n > 0) + { + mve_pred16_t p = vctp64q (n); + int64x2_t va = vldrdq_gather_offset_z_s64 (a, vcreateq_u64 (8, 0), p); + vstrdq_scatter_offset_p_s64 (c, vcreateq_u64 (8, 0), va, p); + c+=2; + a+=2; + n-=2; + } +} + +int main () +{ + int i; + int64_t temp1[N]; + int64_t temp3[N]; + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 0); + check_memcpy64 (temp1, temp3, 0); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 1); + check_memcpy64 (temp1, temp3, 1); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 2); + check_memcpy64 (temp1, temp3, 2); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 3); + check_memcpy64 (temp1, temp3, 3); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 4); + check_memcpy64 (temp1, temp3, 4); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 5); + check_memcpy64 (temp1, temp3, 5); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 6); + check_memcpy64 (temp1, temp3, 6); + + reset_data64 (temp1, temp3, N); + test (temp1, temp3, 7); + check_memcpy64 (temp1, temp3, 7); + + reset_data64 (temp1, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.64\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int8x16.c b/gcc/testsuite/gcc.target/arm/dlstp-int8x16.c new file mode 100644 index 0000000000000000000000000000000000000000..49fbd4c16a20af929e7cccd62f6a73d033afb7f5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int8x16.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void __attribute__ ((noinline)) test (int8_t *a, int8_t *b, int8_t *c, int n) +{ + while (n > 0) + { + mve_pred16_t p = vctp8q (n); + int8x16_t va = vldrbq_z_s8 (a, p); + int8x16_t vb = vldrbq_z_s8 (b, p); + int8x16_t vc = vaddq_x_s8 (va, vb, p); + vstrbq_p_s8 (c, vc, p); + c+=16; + a+=16; + b+=16; + n-=16; + } +} + +int main () +{ + int i; + int8_t temp1[N]; + int8_t temp2[N]; + int8_t temp3[N]; + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 0); + check_plus8 (temp1, temp2, temp3, 0); + + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 1); + check_plus8 (temp1, temp2, temp3, 1); + + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 15); + check_plus8 (temp1, temp2, temp3, 15); + + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 16); + check_plus8 (temp1, temp2, temp3, 16); + + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 17); + check_plus8 (temp1, temp2, temp3, 17); + + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 32); + check_plus8 (temp1, temp2, temp3, 32); + + reset_data8 (temp1, temp2, temp3, N); + test (temp1, temp2, temp3, 33); + check_plus8 (temp1, temp2, temp3, 33); + + reset_data8 (temp1, temp2, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.8\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/lob.h b/gcc/testsuite/gcc.target/arm/lob.h index feaae7cc89959b3147368980120700bbc3e85ecb..9a34a682160b9c0b0e9393438e7be336ed7d29c7 100644 --- a/gcc/testsuite/gcc.target/arm/lob.h +++ b/gcc/testsuite/gcc.target/arm/lob.h @@ -1,15 +1,106 @@ #include - +#include /* Common code for lob tests. */ #define NO_LOB asm volatile ("@ clobber lr" : : : "lr" ) -#define N 10000 +#define N 100 + +static void +reset_data8 (int8_t *a, int8_t *b, int8_t *c, int x) +{ + memset (a, -1, x * sizeof (*a)); + memset (b, -1, x * sizeof (*b)); + memset (c, 0, x * sizeof (*c)); +} + +static void +reset_data16 (int16_t *a, int16_t *b, int16_t *c, int x) +{ + memset (a, -1, x * sizeof (*a)); + memset (b, -1, x * sizeof (*b)); + memset (c, 0, x * sizeof (*c)); +} + +static void +reset_data32 (int32_t *a, int32_t *b, int32_t *c, int x) +{ + memset (a, -1, x * sizeof (*a)); + memset (b, -1, x * sizeof (*b)); + memset (c, 0, x * sizeof (*c)); +} + +static void +reset_data64 (int64_t *a, int64_t *c, int x) +{ + memset (a, -1, x * sizeof (*a)); + memset (c, 0, x * sizeof (*c)); +} + +static void +check_plus8 (int8_t *a, int8_t *b, int8_t *c, int x) +{ + for (int i = 0; i < N; i++) + { + NO_LOB; + if (i < x) + { + if (c[i] != (a[i] + b[i])) abort (); + } + else + { + if (c[i] != 0) abort (); + } + } +} + +static void +check_plus16 (int16_t *a, int16_t *b, int16_t *c, int x) +{ + for (int i = 0; i < N; i++) + { + NO_LOB; + if (i < x) + { + if (c[i] != (a[i] + b[i])) abort (); + } + else + { + if (c[i] != 0) abort (); + } + } +} + +static void +check_plus32 (int32_t *a, int32_t *b, int32_t *c, int x) +{ + for (int i = 0; i < N; i++) + { + NO_LOB; + if (i < x) + { + if (c[i] != (a[i] + b[i])) abort (); + } + else + { + if (c[i] != 0) abort (); + } + } +} static void -reset_data (int *a, int *b, int *c) +check_memcpy64 (int64_t *a, int64_t *c, int x) { - memset (a, -1, N * sizeof (*a)); - memset (b, -1, N * sizeof (*b)); - memset (c, -1, N * sizeof (*c)); + for (int i = 0; i < N; i++) + { + NO_LOB; + if (i < x) + { + if (c[i] != a[i]) abort (); + } + else + { + if (c[i] != 0) abort (); + } + } } diff --git a/gcc/testsuite/gcc.target/arm/lob1.c b/gcc/testsuite/gcc.target/arm/lob1.c index ba5c82cd55c582c96a18ad417a3041e43d843613..e7fa3f155f926e71b00c9f294e7878e8f13766ff 100644 --- a/gcc/testsuite/gcc.target/arm/lob1.c +++ b/gcc/testsuite/gcc.target/arm/lob1.c @@ -54,29 +54,18 @@ loop3 (int *a, int *b, int *c) } while (i < N); } -void -check (int *a, int *b, int *c) -{ - for (int i = 0; i < N; i++) - { - NO_LOB; - if (c[i] != a[i] + b[i]) - abort (); - } -} - int main (void) { - reset_data (a, b, c); + reset_data32 (a, b, c, N); loop1 (a, b ,c); - check (a, b ,c); - reset_data (a, b, c); + check_plus32 (a, b, c, N); + reset_data32 (a, b, c, N); loop2 (a, b ,c); - check (a, b ,c); - reset_data (a, b, c); + check_plus32 (a, b, c, N); + reset_data32 (a, b, c, N); loop3 (a, b ,c); - check (a, b ,c); + check_plus32 (a, b, c, N); return 0; } diff --git a/gcc/testsuite/gcc.target/arm/lob6.c b/gcc/testsuite/gcc.target/arm/lob6.c index 17b6124295e8ae9e1cb57e41fa43a954b3390eec..b7f49cf70c98d78af0d7cc1c291bf83ef699863b 100644 --- a/gcc/testsuite/gcc.target/arm/lob6.c +++ b/gcc/testsuite/gcc.target/arm/lob6.c @@ -79,14 +79,14 @@ check (void) int main (void) { - reset_data (a1, b1, c1); - reset_data (a2, b2, c2); + reset_data32 (a1, b1, c1, N); + reset_data32 (a2, b2, c2, N); loop1 (a1, b1, c1); ref1 (a2, b2, c2); check (); - reset_data (a1, b1, c1); - reset_data (a2, b2, c2); + reset_data32 (a1, b1, c1, N); + reset_data32 (a2, b2, c2, N); loop2 (a1, b1, c1); ref2 (a2, b2, c2); check ();