From patchwork Tue Dec 5 10:54:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Coplan X-Patchwork-Id: 173960 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp3344928vqy; Tue, 5 Dec 2023 02:54:56 -0800 (PST) X-Google-Smtp-Source: AGHT+IE9kn+Pkia48vxyXCk0BXwQlJhx1C1a2GydU17uQIOpV/EPEnCccszbdKxXWIobHDR2kZ71 X-Received: by 2002:a05:620a:28c4:b0:77e:fba3:58c3 with SMTP id l4-20020a05620a28c400b0077efba358c3mr1157738qkp.84.1701773695817; Tue, 05 Dec 2023 02:54:55 -0800 (PST) ARC-Seal: i=4; a=rsa-sha256; t=1701773695; cv=pass; d=google.com; s=arc-20160816; b=wxfNYF58sqM93Kt4fJUam4Frp/DO9doED+QxY/4LxjW1q5uTJmM7n9GqwstDPIVqKJ ipCNVWYc2VTivW2uL6N18gelBA7311uhQ9g/Y9nxvfdOWBZQ0hcm5eVOucNPiFUIOyZl Iy30ASAQOccwrON+epyuphl+hCYd87S9cpVGIXGhEuLHpnLRcY8b+Mo/sg6jgvWC5O4q x6qrdyT4tGjUNrGkEWglb1UN2DBcj1toT5HPw4B/pR8SvA63jEFq2yf8OE6/sjzRU4XA sqJ6+gfGifz//JbGVEJt1vTQq9UFrsFhnbyVi6MOJu0Ll0UwRYkyihgb/5k84kYxhPXP F3GQ== ARC-Message-Signature: i=4; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:original-authentication-results :nodisclaimer:mime-version:content-disposition:message-id:subject:cc :to:from:date:authentication-results-original:dkim-signature :dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=nUI7KstyvScFsl6FVYdihe8JI1cpv3qChj6hjKT/6F8=; fh=B1a4w0PRsEPJCXJekrVstAjRZ6EaFV3M/osyyteoUbw=; b=TjTPQrwxHVfV+mlkVOrPlYnMoL2UXdjwsii06k3G0DiOUkF+zoCrbPFafhKtU1/hde GrSMS5xS05bVBiVUyDbyrRod04AAzo8RW61H5jeBkWx6gmFsXzUrGx/FabIQwimiY0uM Ssn315je6G+Ix7/Dkbd/kPoek43/tvnZoudubzbUdWwW99dindMx54Xp6PZv3AEH2do0 QNuzGZs/HZloXnaaGxA1EwLTuT7A4NE+IZtS0IDgYT2euFtRJYhXIRvIg0ko3nH9vFeF f3JXQaxmCkv5N3KSnL4WYHLLs/rwN2Io90uZhqdd9M0bBsPTtNeq05T/q5D2/Hietk8H j7kg== ARC-Authentication-Results: i=4; mx.google.com; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=eWQs11bs; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=eWQs11bs; arc=pass (i=3); 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=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id ay39-20020a05620a17a700b0077892f2b52bsi11818924qkb.264.2023.12.05.02.54.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Dec 2023 02:54: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=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=eWQs11bs; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=eWQs11bs; arc=pass (i=3); 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=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 91C5438618F2 for ; Tue, 5 Dec 2023 10:54:55 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2077.outbound.protection.outlook.com [40.107.22.77]) by sourceware.org (Postfix) with ESMTPS id 6EEEA3857706 for ; Tue, 5 Dec 2023 10:54:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6EEEA3857706 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6EEEA3857706 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.22.77 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1701773669; cv=pass; b=T+wyIVRL/ZQV8akVGQbkciFUyJF/MJukNjGlgv9/m1TLIhqPOKB7OEJLiN06UNL8idAX96jROCusKlcq+lV9axtIyNuzLH3h1BMrWLSYQdAQ3BNm3kGqk6k0V3A2vOLTKhby8wkwcoxF2bkqsQwRQjqEAHpLD6zwVz8ygTplh9Q= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1701773669; c=relaxed/simple; bh=HXU01MkWVZlzo0ScxrgB7/n6khx2YNUVKtED7Rb/oMo=; h=DKIM-Signature:DKIM-Signature:Date:From:To:Subject:Message-ID: MIME-Version; b=UusFWDxE5tjywImofc6KFL5IcoieH7bo90GGhYAGifzSZ/MQJn8k4LQsLTEdkAWh9o0sZqdevXWHuW5Z3nqW+HLdRFQbUSeU+yS5ztlxcrQ6TjsRlZfR2SINckJpX0N0vYqC8qtIVpJszgwXxe6wEWVsRAuqB1NLE6o7inHMhPk= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=QGU/pEVzgPUWnMgu1m7SEDY7QPMjhhAfCnOhvj3xdmW2IsYqVGrIDO0y/ybp17Ow1oOO1GXak2MfY0KGLRfRZuyyJQ5SoxFZo4pkiuIgQ8ebcOA15csxeNV2eYoYlUyh25x4mLgh2MPaGm4TjAuO1ccHelNrjfh/I2GWXWpAK6tLfdj4xnadH/oF0Usgy4dQhQlW0Tvfk4K4szeXgAAWVH3AjFJheKiYmn8JjW4T8QH8iDUmgTRwUGZWwNujZxRnuiFbudVkLCt0p5B8MnocM0660ULdhHXuumtwb6z+5WWsPid8VMJL4UNWGOowBSK3olvZlXUQKxu4VrLF0Z5LlQ== 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=nUI7KstyvScFsl6FVYdihe8JI1cpv3qChj6hjKT/6F8=; b=Hx0J9BxUdv8QizRG5HYWGTi87ZBvQRjuEG/3d38RmQrT8fDFqlnGG53N1Xt1roHB5WkFKa+AAqeTXTREByL28ESMcHM8Kt4g5VtCaI7C+MDrqgtAcV2u+ykGFCp7URVbylQaVsryTf/oG4KTki0MJ7ojAdSlT9kPZDJKqMex2Az+lDHNPozFj8OAMUy+cSJbv6kNTIuFyx2ADEW1wy+VDae64LrLkK6+xzUivtTxVkQk4fP4ccijYhGLNLv8rjGAMIy38r9GOA7ybMQuABU1ethz1u41uooNKiUtlDXiEmx/lBPHXr5Bvbwj2XIrx4qK0QcSmUNOsKBux9lSgqYuLQ== 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]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nUI7KstyvScFsl6FVYdihe8JI1cpv3qChj6hjKT/6F8=; b=eWQs11bs+Ek4MKpxLauZtqLMx4u8Mx4P9T6V/REVZBBEn9bKPFFbFI2BpqhV7Zsq/z8YKzgTqZnXcHrW018nxM5AH+NzRegDYV+6NtirtsaO8Dz+RWH9/hMwKGuhcGswWzbZKvDidNJm/gNMGd7sFM9alAUQuHS57U937be/c9Q= Received: from AM6PR08CA0021.eurprd08.prod.outlook.com (2603:10a6:20b:b2::33) by AS8PR08MB6711.eurprd08.prod.outlook.com (2603:10a6:20b:351::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.34; Tue, 5 Dec 2023 10:54:24 +0000 Received: from AMS0EPF000001A3.eurprd05.prod.outlook.com (2603:10a6:20b:b2:cafe::cb) by AM6PR08CA0021.outlook.office365.com (2603:10a6:20b:b2::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.33 via Frontend Transport; Tue, 5 Dec 2023 10:54:24 +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 AMS0EPF000001A3.mail.protection.outlook.com (10.167.16.228) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.20 via Frontend Transport; Tue, 5 Dec 2023 10:54:23 +0000 Received: ("Tessian outbound 8289ea11ec17:v228"); Tue, 05 Dec 2023 10:54:23 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 5dc5bd85db42a34f X-CR-MTA-TID: 64aa7808 Received: from b01d75c54fc1.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 4C42687F-D400-49A3-8E03-20C6C5FEA661.1; Tue, 05 Dec 2023 10:54:12 +0000 Received: from EUR01-VE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id b01d75c54fc1.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 05 Dec 2023 10:54:12 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LZ0ST41FBHpC/NYuzB9PMeKUtjZssKUH8qmCY6336WqtsUjqmJ6kv2S26pVgvGf4zBJAhjkRS+exyzbk8nXmXHylRXKBSg2RGak6qtc1AfWsn94KqeMszfRto3Jrl2bYCOE4Pqt8MNZZmGUYyS8xI9VCcbjIeTkP20PuFBHHcC4zA3pv95k0vvk1UcL35yGkZ1hD7/66lbLEC0nCj/k0x7fP1BH5IqdS4UY2kyhl/C7Lzmx4muOIDY7YDelGqTbtJjohYhQEKf+lHtpdyFqqNgiwMQqxZV70UzirEB+WoDAfVfPcksqilE3iGIVVMBfe/D93LmBs3XrF4gW4TezAaw== 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=nUI7KstyvScFsl6FVYdihe8JI1cpv3qChj6hjKT/6F8=; b=QvEI9eFQefUg+SUYn1VXTGdGmOcBsCbGnzgCU3n6fjHRks6OERxHVJwGk5vDD814LZDj2iLvnU6eDjw6ffdLjzYT/CC61Vt3M7RGPGQNjJpzfviHUWqkH3Jiiu1wHmCIHEP/gU5n9Hnwl156uimJvSPQebkaFm1mwpaeE2kd89Rg1lh8QESg+bSgHeU14GAbBMVvHXe4glZJ3SnYkuHMCnOM8PNwyc5JylxbE+jfasoAe2WrjEq+2EZbUwTdO+qGpLSdEApMCXLBNJ5pJFna6vqMhnEjNDM4igeYqWJ2XKRFTP2YujH78cvuOHhwdF3x+C421CuEcTZt8QDGzPjHmg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nUI7KstyvScFsl6FVYdihe8JI1cpv3qChj6hjKT/6F8=; b=eWQs11bs+Ek4MKpxLauZtqLMx4u8Mx4P9T6V/REVZBBEn9bKPFFbFI2BpqhV7Zsq/z8YKzgTqZnXcHrW018nxM5AH+NzRegDYV+6NtirtsaO8Dz+RWH9/hMwKGuhcGswWzbZKvDidNJm/gNMGd7sFM9alAUQuHS57U937be/c9Q= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) by PAWPR08MB10018.eurprd08.prod.outlook.com (2603:10a6:102:363::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.34; Tue, 5 Dec 2023 10:54:08 +0000 Received: from PAWPR08MB8958.eurprd08.prod.outlook.com ([fe80::8512:cc10:24d4:1919]) by PAWPR08MB8958.eurprd08.prod.outlook.com ([fe80::8512:cc10:24d4:1919%5]) with mapi id 15.20.7046.033; Tue, 5 Dec 2023 10:54:08 +0000 Date: Tue, 5 Dec 2023 10:54:05 +0000 From: Alex Coplan To: gcc-patches@gcc.gnu.org Cc: Richard Earnshaw , Richard Sandiford , Kyrylo Tkachov Subject: [PATCH v2 06/11] aarch64: Fix up aarch64_print_operand xzr/wzr case Message-ID: Content-Disposition: inline X-ClientProxiedBy: LNXP265CA0029.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:5c::17) To PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: PAWPR08MB8958:EE_|PAWPR08MB10018:EE_|AMS0EPF000001A3:EE_|AS8PR08MB6711:EE_ X-MS-Office365-Filtering-Correlation-Id: 60107d03-5b6a-4ffb-2b65-08dbf5808ae3 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: Er3+Z84LgCnYSBR06efqIWS2GpHRnqCANxvpBdMnYX40yKVpuOA/2Axmx+fsH/fY2JnHA/tN/PAazmsToM/PzpJrmVjcJvrt9RIRr3apmTtF2WsC2iAbXBEJtctgU8R1GtiydnPyllwWqNPD1VMVLPHh89M3nMnmls/rmLxGnv6v7H6JVwAqzeqM9hVx7begCPJRs1fnyat7aMDLuJvTriRTqYHRxbX2VTn8dUmOf6BA5UwDKJZyLMfH6Sn9xjlTs5/aVp0+vNY689UB4Wbx3K/oc0cU9YUrOWOhNp+1der+lDNeQFOqaaWSl4Rptp0zTixEQZ4cp3qxrvmO22UuQyubCIgU9TshJz1892+yL6cm8zrI6sM/tQruFmi8wVhnwxQPvV8Z8wUymC917nCNRFFBz3qDJxzWHrFJ/UuLXdyY4yIG153sFLMdr5nrn/zfxwFi2x6WhDwYjVUz3mE63tIMgN0Iia6ova1wVkmeVUxnROIpJ+pbkXhtk6nERERIH181PwLX9FajXzFxmiLCh9StLrV2D88ItAkYyQ1JmH9a2idI1P7OZUYwEkTrkL6bGNLiswnzjh1VqmXlsDxdFkUbY1hp+7Tb/fAv/xIJlPA= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PAWPR08MB8958.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(346002)(376002)(39860400002)(366004)(136003)(396003)(230922051799003)(451199024)(64100799003)(1800799012)(186009)(6512007)(21480400003)(26005)(38100700002)(6506007)(33964004)(44144004)(2616005)(6666004)(6486002)(966005)(478600001)(66946007)(66556008)(66476007)(6916009)(54906003)(316002)(8936002)(4326008)(8676002)(2906002)(36756003)(41300700001)(44832011)(86362001)(235185007)(5660300002)(2700100001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAWPR08MB10018 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: AMS0EPF000001A3.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: cb9c1fe8-4426-45ee-65a7-08dbf5808144 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CtovTzkHXkAOGpCdE8LP67GXIAHfrNBQk5wl9u6KU8NZou8IbHLcZv5f7WzA4ViXxOmlvcO9yGv5qHBYr+BX1zmedWOX2uGomRumNmYIWjJjhSR17mqqdw6JD3gyt4xZYpcGxs8rPhqEOK6AepIEW9wDXhMxQ90YGK6bvXsQeoMA5PE88mzaH1oTdzyN3PE9CjHXCZxJBhGq5Pio3KO4iyY5HZgg2XTpd0Gal11FmewYD1/1sfACUMljoA/ZrWKBcPPm+ot7wtnReEIqVEyaBsPeBk+IeiXpsVGM24u2ptOLHOGAF07Fz8TTAI7I/7q7CaZl25YHUIjWwh+oePwI1HLN3+WgzjCGreR+hwN5DhzCfB6EdIPqOXi0DVFyuxcLlPWDeBY26GprOI4UT0PaTxjLv64ndUtQ2m6HY8glFm3yxXfrVRFsMGq+LOEGNgVTiYN9Hq1ZbeTVLwfmvVSBxTcdqM+cJZ0x8c7T14EGFsPei5KoQzRG13tQEakmp/Q5lSUmHb9oZ9njD1OJlQTQgiTyBozcOJPfgoqjGxTrCy5AW0nG+ahtA7B4/r00nuKFdVzFR/7GXyI7WGTl9WmLaiyr8jl6EH5wvi/swLg+SFBXQ03a25INJSMu5ZCXSa4hKyaGq5061DWk46ZtQIRusHll5nmzws2hj/T4nhCncrARE0JjNPDMqREai0J7zi/1VCcC/ac9+Oyimn/2O/clbQ1DlxyuoZe1d4C6lS00qgZTCiBBSw/lWFCJZVvNiOIeYo7dgthIBol/Gs9I5oj5fg== 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:(13230031)(4636009)(136003)(396003)(346002)(376002)(39860400002)(230922051799003)(1800799012)(451199024)(186009)(82310400011)(64100799003)(46966006)(40470700004)(36840700001)(40480700001)(40460700003)(6512007)(478600001)(6506007)(33964004)(6486002)(8676002)(966005)(47076005)(44144004)(2616005)(6666004)(26005)(336012)(54906003)(4326008)(70206006)(70586007)(6916009)(8936002)(316002)(21480400003)(235185007)(5660300002)(82740400003)(81166007)(36756003)(356005)(41300700001)(2906002)(36860700001)(44832011)(86362001)(2700100001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Dec 2023 10:54:23.7194 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 60107d03-5b6a-4ffb-2b65-08dbf5808ae3 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: AMS0EPF000001A3.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB6711 X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784439054730964368 X-GMAIL-MSGID: 1784439054730964368 Hi, This is a v2 of: https://gcc.gnu.org/pipermail/gcc-patches/2023-November/637612.html v1 was approved as-is, but this version pulls out the test into a helper function which is used by later patches in the series. Bootstrapped/regtested as a series on aarch64-linux-gnu, OK for trunk? Thanks, Alex -- >8 -- This adjusts aarch64_print_operand to recognize zero rtxes in modes other than VOIDmode. This allows us to use xzr/wzr for zero vectors, for example. We extract the test into a helper function, aarch64_const_zero_rtx_p, since this predicate is needed by later patches. gcc/ChangeLog: * config/aarch64/aarch64-protos.h (aarch64_const_zero_rtx_p): New. * config/aarch64/aarch64.cc (aarch64_const_zero_rtx_p): New. Use it ... (aarch64_print_operand): ... here. Recognize CONST0_RTXes in modes other than VOIDmode. diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index d2718cc87b3..27fc6ccf098 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -773,6 +773,7 @@ bool aarch64_expand_cpymem (rtx *); bool aarch64_expand_setmem (rtx *); bool aarch64_float_const_zero_rtx_p (rtx); bool aarch64_float_const_rtx_p (rtx); +bool aarch64_const_zero_rtx_p (rtx); bool aarch64_function_arg_regno_p (unsigned); bool aarch64_fusion_enabled_p (enum aarch64_fusion_pairs); bool aarch64_gen_cpymemqi (rtx *); diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index fca64daf2a0..a35c6bbe335 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -9095,6 +9095,15 @@ aarch64_float_const_zero_rtx_p (rtx x) return real_equal (CONST_DOUBLE_REAL_VALUE (x), &dconst0); } +/* Return true if X is any kind of constant zero rtx. */ + +bool +aarch64_const_zero_rtx_p (rtx x) +{ + return x == CONST0_RTX (GET_MODE (x)) + || (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x)); +} + /* Return TRUE if rtx X is immediate constant that fits in a single MOVI immediate operation. */ bool @@ -9977,8 +9986,7 @@ aarch64_print_operand (FILE *f, rtx x, int code) case 'w': case 'x': - if (x == const0_rtx - || (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x))) + if (aarch64_const_zero_rtx_p (x)) { asm_fprintf (f, "%czr", code); break; From patchwork Tue Dec 5 10:57:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Coplan X-Patchwork-Id: 173964 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp3346314vqy; Tue, 5 Dec 2023 02:58:54 -0800 (PST) X-Google-Smtp-Source: AGHT+IFkd8CDU/LRy7ajTvL7k+1v9wR70sIdiaDMcSPzZMRbezKm7d2eeZ59mkLxXCqdsaFYTuV2 X-Received: by 2002:ac8:5f90:0:b0:423:6fee:b9a7 with SMTP id j16-20020ac85f90000000b004236feeb9a7mr1187688qta.41.1701773933752; Tue, 05 Dec 2023 02:58:53 -0800 (PST) ARC-Seal: i=4; a=rsa-sha256; t=1701773933; cv=pass; d=google.com; s=arc-20160816; b=zBjQ4+AxRuvVFL+ObbEkdE4U7ID8u4XKZiS9Q1Yo/nQ+yLjk0qdPQdsfsPtXFsUQYd 948yC23P0tKWqcvCR5mIqEPEgCp+obWMQYBLlAGwX1k63bFM4q7tBPMWFu60eY2pIlRk q/Fv5OOY2S4VqNb4fac5yW1cDqLjz8pLWLzQUrebfiDqOpGvup7LUpWcEkoaUCJuESVX eDo1U5NLcGpwmNzon1sbmBIuM5oDs5bcDIZhaDscMNPRYkbmtjbna6wwCQaEyCgK1Wkk OC2r24uYHLuPcH3XVVgWRqNC1/FhSamPl/HGR6sG4+BbuARX5k+rqPVYtzGCb+LquXMa BjeQ== ARC-Message-Signature: i=4; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:original-authentication-results :nodisclaimer:mime-version:content-disposition:message-id:subject:cc :to:from:date:authentication-results-original:dkim-signature :dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=yiz+/XwWgz+zgc5QekE/pevnYzfrhuinG9a0Cvyh9IE=; fh=B1a4w0PRsEPJCXJekrVstAjRZ6EaFV3M/osyyteoUbw=; b=FUdQ0dnI6iBHeHEQEX2LdEYeJPTeP9j60qva4RBcIaSvpNTit6GVJvclXmxwFp15ZV EIdEYZXIfd0LlKtA2qNchfAWCccM5a8X67ajpr04jVLtL+lPO3jJPUQWwrCKnzW5sm13 m6cYDrMX2yF/eDFvowKB03Vyc/uWh4VjIX3MiFwzc+q6u1v73qdnn66tNazZkaJPZo8L Sr8uIs6gRJdJtGcN6asW+/D0+6Tsb4OJIk6nL6FCCdvf1be7OK6YznYc8+ke/Mweb+F4 vuextfBKgxZRe3DU2VJP9DDmhvZH6qHYCl49kzD395UrZFJ2gu7r3YlR7Ambq/81uSLv gL8A== ARC-Authentication-Results: i=4; mx.google.com; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=s1epcfQf; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=s1epcfQf; arc=pass (i=3); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id ca14-20020a05622a1f0e00b0042380ba6e47si12567696qtb.326.2023.12.05.02.58.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Dec 2023 02:58:53 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=s1epcfQf; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=s1epcfQf; arc=pass (i=3); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7EA943861878 for ; Tue, 5 Dec 2023 10:58:53 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on2063.outbound.protection.outlook.com [40.107.105.63]) by sourceware.org (Postfix) with ESMTPS id 22E0B3864856 for ; Tue, 5 Dec 2023 10:58:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 22E0B3864856 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 22E0B3864856 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.105.63 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1701773886; cv=pass; b=FF9Xs/xYO2cfJw6kq75Qbkrs6GfL3Q8p3VRyzrSFjYThQT7wesGjcxnRPbJcHeyilGtoVwzjwR5uDsJF5/sQEWqJg37nMmLHbkrMrhec1kVVIkUNfyZ26WxJFOOVMHB/GGfSXtHaXS2dhurbcyfsQV8N2Q2ZBn6tMkq4htITVSk= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1701773886; c=relaxed/simple; bh=aaale9SkSYcmxxdxUIPcaPul3DCIxSXIYspi+8fIoUk=; h=DKIM-Signature:DKIM-Signature:Date:From:To:Subject:Message-ID: MIME-Version; b=A3X9gR7VrIakzJpyRc54DQveHerjxg/Y3ZNND7/4rNW+zLkOyQWrhXSHOiTDVJFn2mGJHMSg8gNC9vdVUXTpXBrTjkhO8Oa0z3kQTw+oe58KARDJJTTcP9e3ZxOxNJTYux2sLkk97ys0fL/u6909OrXgLAdvlBvIHZfYg24wCwY= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=MJAJlgKHD64HhMOecLs9dc1Teti8yO9sxkoZtb3veTTsbKMz7yDlDweL3iatZ7g9jCK8Gc+18rCWMe7qhTZUfm7B7+LbWBjKRMiyQ959x2TubINU7Cb8+84WaZ8Xt1hfo9LGOdUkxAbWlGCOkuobzpTvejKGdbOqLl4+ANDANC4UIe1NmWDtzjqyVy1AXuksFXfPwTjFyg6r58CLaH/qHOkYxZToRUohdQUPLMWSXtzD5onV3kVQxNbWig90IjQ7N4EKXHf3rdU9pURcrmKLlsHmf1kt635jOgCYLGJjEJX0i+sjCLH8yugLxR2dIYlJW6y+xnJEExLvxKYnhFRucg== 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=yiz+/XwWgz+zgc5QekE/pevnYzfrhuinG9a0Cvyh9IE=; b=BHZuyZxAYIdae2GD5OTG59QLS5xg8NZv+XJU+glhElxYPmil/6eZHIgL/mYGTE8pGBJUHQHIeNdnjtil8IUgBeRlnlSlpaGnZNmKNCSRMKhzlWoegbkZhoZKQbvBoft4gx074MVGUvRWzpSN8jxreKWuCEWvVT9QD+w2fYgMZif9lKSUuVw1sV0HOlX+y6pHImM7djY4nl6ME+7K68YXEMYxxQRRZYtmzRFNNK5aODVgja9bQZYlo0BjelQqdLbZmw5QwvT8CNSWJBMjHtKI7u1pfNl1eO0cIUmYqvLC6f6C5WgrYIMTfpLZJCL3vhZ1bfIwDtU8UTWRpuWTq0+GWw== 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]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yiz+/XwWgz+zgc5QekE/pevnYzfrhuinG9a0Cvyh9IE=; b=s1epcfQfB7j9pl10zb3lNA8pyUOPso4XcNbf50yfTf7HYgqgdzVhBSWqCqEpnK7wD3iRBwhAOgymo8LvOM/sMpVrE0SAgTbm4GXHgnKw+KKhpAVQ/CVMC8MHuyv+WYmiY5tGajge2skT+4L/NQKvYyCkmzhN7JxOtQZZlK9komc= Received: from AM0PR02CA0187.eurprd02.prod.outlook.com (2603:10a6:20b:28e::24) by DBBPR08MB6233.eurprd08.prod.outlook.com (2603:10a6:10:204::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.23; Tue, 5 Dec 2023 10:57:57 +0000 Received: from AMS0EPF000001AC.eurprd05.prod.outlook.com (2603:10a6:20b:28e:cafe::a) by AM0PR02CA0187.outlook.office365.com (2603:10a6:20b:28e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.34 via Frontend Transport; Tue, 5 Dec 2023 10:57:57 +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 AMS0EPF000001AC.mail.protection.outlook.com (10.167.16.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.20 via Frontend Transport; Tue, 5 Dec 2023 10:57:56 +0000 Received: ("Tessian outbound e243565b0037:v228"); Tue, 05 Dec 2023 10:57:56 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: d1d15c5a3d21146c X-CR-MTA-TID: 64aa7808 Received: from 4eae2618b7b3.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id F0DC5152-0440-4F22-AEE8-A9BFD3FCCEE3.1; Tue, 05 Dec 2023 10:57:44 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 4eae2618b7b3.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 05 Dec 2023 10:57:44 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=H1x4YfL9m9g3h1EKMONptgtLxy2uXq42T/AovMbH3lCwi0Q51W+p08bnSXMAGyKv0VedcKnUFlVglexB8laK1QaijniyNbHYDilfFx5afEACzhcE0pCxF3+EkCmL+NQE7BACCRcq1MP8iPozT9T+VnjuvWAnPzBbM8VHmLEAFhO00d7om9EbFEGdUr5g+mSiIHx/Qn0szo83exf/hEVZESagvVx8otPZBjoeEYGhxIOAnIk9nwzf+xK/VYvvhaubajgO4RqZaQsYKW/xG1cJ5mqSSsLDo+QIZhkWKMUSAJmkb1hKyjDfPAQDSh2JYbj+fGRxn52imuIJ990hyLtxQA== 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=yiz+/XwWgz+zgc5QekE/pevnYzfrhuinG9a0Cvyh9IE=; b=DdxnWxM5+eUb1YdxmjqeYpHtnqrWrVcZYlEjncpC/PBU4yvC2TxeWPrSL//BOEOVkeHUVwfJP6n+frIULR1AMnBQ/Onb+kFy1u4pCkXbC7pKMhUrqKoSD38butfvvChXbfzcc6A12C72+JiGAhBC3QoA1eOn/zyhKuwVgheJ+604c7s6zVwQDu26PVp/eyZ+9IVdK+5TtMuSE7ebcSm4j2/sXwxe1cPdmr2CBj+IfkznY5ExTdJqouxsITNOKKDuEubw/fpxsVyJC/8OYvQT8WIRiSg8P5vFihYyrXwNozuzBjSus+2c59bEhVSdJ7KrLukT3wPU2prtacPS+mWc9g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yiz+/XwWgz+zgc5QekE/pevnYzfrhuinG9a0Cvyh9IE=; b=s1epcfQfB7j9pl10zb3lNA8pyUOPso4XcNbf50yfTf7HYgqgdzVhBSWqCqEpnK7wD3iRBwhAOgymo8LvOM/sMpVrE0SAgTbm4GXHgnKw+KKhpAVQ/CVMC8MHuyv+WYmiY5tGajge2skT+4L/NQKvYyCkmzhN7JxOtQZZlK9komc= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) by DU0PR08MB9079.eurprd08.prod.outlook.com (2603:10a6:10:470::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.34; Tue, 5 Dec 2023 10:57:42 +0000 Received: from PAWPR08MB8958.eurprd08.prod.outlook.com ([fe80::8512:cc10:24d4:1919]) by PAWPR08MB8958.eurprd08.prod.outlook.com ([fe80::8512:cc10:24d4:1919%5]) with mapi id 15.20.7046.033; Tue, 5 Dec 2023 10:57:42 +0000 Date: Tue, 5 Dec 2023 10:57:40 +0000 From: Alex Coplan To: gcc-patches@gcc.gnu.org Cc: Richard Earnshaw , Richard Sandiford , Kyrylo Tkachov Subject: [PATCH v2 09/11] aarch64: Rewrite non-writeback ldp/stp patterns Message-ID: Content-Disposition: inline X-ClientProxiedBy: LO4P123CA0684.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:351::17) To PAWPR08MB8958.eurprd08.prod.outlook.com (2603:10a6:102:33e::15) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: PAWPR08MB8958:EE_|DU0PR08MB9079:EE_|AMS0EPF000001AC:EE_|DBBPR08MB6233:EE_ X-MS-Office365-Filtering-Correlation-Id: 5f20821f-a39e-45e8-7a29-08dbf5810a02 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: EmZLyKNCZN0UoOIZD+NdkoKRuGemZ2HIaHzo8Iqde0IfQ0kEmPfnSFI70n/TpA262hNSLe5uPW3b7UE+9i3lRtnfx6IQ7PsCgs81jEDOQb50s0uNy3Rma8+HKkVlw0Bi85gImoAXqMve97Wi8cwVu+OCK8ypWEaxgAR5cfZpt+53aQZ6Ij+h/Ho4OUF6AIWuqWyalFhgd0fr/IVCtRBgYXSkgk3VS++q5lCB/qsu0xbhWM5i9C0WoWEvst5t2kZebA3iHrDlsasHDBgf2w7+YX2Yr5MIiLDkhgMuu7pViHNuLdNevUT2R2MlYDZmfEaHpqzHBoHp1Pj87SedEZbV7Uz93BStkAnZ3/IDWo3BvA1DP5pyKjTDfZ+ytNAQH6xgAc/u6VButIySdtdKTFC+YtuD9925brtiOEPZKGWbNuhi6k9XG7dDdKb8PedldGXkzhBS1x81KepB7yHYfu16mJlZJjevVXjnOnZ6NvrGogw+kO2HPv2PwEb90Pd8LE8dOkpjk38VoVeIvyYF5GEUBK2kxKR1OkXZ9tMIee6+16lgq77iCsrL25LXIu/4O/rh8t/w8uAI13CU3Al7/KKKexezm+jBMVITRFeGY0gXl+A= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PAWPR08MB8958.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(346002)(396003)(136003)(376002)(39860400002)(366004)(230922051799003)(451199024)(64100799003)(186009)(1800799012)(235185007)(38100700002)(5660300002)(44832011)(2906002)(41300700001)(86362001)(36756003)(2616005)(6486002)(966005)(26005)(44144004)(33964004)(6506007)(478600001)(6512007)(8936002)(8676002)(4326008)(66946007)(66556008)(66476007)(6916009)(54906003)(83380400001)(316002)(21480400003)(2700100001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9079 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: AMS0EPF000001AC.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 2284d704-40d9-434c-387f-08dbf581014c X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 88FC+BdhcJqZqgXSCFP38AcNlX7GfXx+sSdJQEDV7nz+cjSdxG4Jb4+KXx5HUwe3zswCaIXIeE44C8UzuHbbn/1UX+txymcumJm1ySeUcMMHFas5AS2Zimo6fDsWczkA65tKZOfi25TUaLa4CT6rSSuGfMPXGLBwmhNdJJBGgtcr5z3n/PgEiJBJyfmqAJUhBG4Bp3ojiaUL+evm9MuzWq/w3aHOmarOrlpGizAsGNDXcCYzy/ZdJXghalEzaXLaXAjqRqAxaZG3/p4dH3OeHnr0HqMd/lX09In5rI+nmzQO3vGfEx3xoekt+8gxyCCRFaM7Z2GBFFu90DNhQuKsHudawZqie7YCQxU3hLdZ3qyYJ21u8ZbPERjlGDUWearIBmO26+kWtfHNxAxaHBSYFmMttr27oQqx5xYe3L6PizGRVisZzpsFz9jtOuxCHomIOn/I0fL8BxAFxvxL0Pg3JssM71gIozGS0fraOYqx9C6ObjMxrSgG7dFyQrkdU4uclk820S8scaitfHABIcTi1Axy2nucrJYZEVgrjhcI8E5ZIPuvNgc57qeneozzKPG9k+1z1pCbtfz3RQ981qNRGwnrsvKXqT3LidxdNzKKMgEogUh0MVvw/yHjAGSO7G4s+MA2lyyPM+z9QjKF7e8/425aSmujqZIcBOlC9IPjOShqK55WZOXEBi2jMEgePvKje4xIqKUrNQSQGPFxkgZqU2B/OwfFCk5tp+rTz7FkN3dEkLUaQD+6Rw3uuMURK5IW9c9Vs7BiWIFrHJByTyWajg== 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:(13230031)(4636009)(39860400002)(376002)(396003)(136003)(346002)(230922051799003)(451199024)(82310400011)(186009)(1800799012)(64100799003)(46966006)(40470700004)(36840700001)(44144004)(5660300002)(235185007)(40460700003)(478600001)(36860700001)(336012)(26005)(6486002)(6512007)(82740400003)(36756003)(33964004)(81166007)(966005)(2616005)(6506007)(41300700001)(356005)(83380400001)(21480400003)(47076005)(86362001)(2906002)(70586007)(70206006)(6916009)(316002)(54906003)(44832011)(40480700001)(4326008)(8936002)(8676002)(2700100001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Dec 2023 10:57:56.9952 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5f20821f-a39e-45e8-7a29-08dbf5810a02 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: AMS0EPF000001AC.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB6233 X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_DMARC_NONE, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784439304644736858 X-GMAIL-MSGID: 1784439304644736858 Hi, This is a v2 version which addresses feedback from Richard's review here: https://gcc.gnu.org/pipermail/gcc-patches/2023-November/637648.html I'll reply inline to address specific comments. Bootstrapped/regtested on aarch64-linux-gnu, OK for trunk? Thanks, Alex -- >8 -- This patch overhauls the load/store pair patterns with two main goals: 1. Fixing a correctness issue (the current patterns are not RA-friendly). 2. Allowing more flexibility in which operand modes are supported, and which combinations of modes are allowed in the two arms of the load/store pair, while reducing the number of patterns required both in the source and in the generated code. The correctness issue (1) is due to the fact that the current patterns have two independent memory operands tied together only by a predicate on the insns. Since LRA only looks at the constraints, one of the memory operands can get reloaded without the other one being changed, leading to the insn becoming unrecognizable after reload. We fix this issue by changing the patterns such that they only ever have one memory operand representing the entire pair. For the store case, we use an unspec to logically concatenate the register operands before storing them. For the load case, we use unspecs to extract the "lanes" from the pair mem, with the second occurrence of the mem matched using a match_dup (such that there is still really only one memory operand as far as the RA is concerned). In terms of the modes used for the pair memory operands, we canonicalize these to V2x4QImode, V2x8QImode, and V2x16QImode. These modes have not only the correct size but also correct alignment requirement for a memory operand representing an entire load/store pair. Unlike the other two, V2x4QImode didn't previously exist, so had to be added with the patch. As with the previous patch generalizing the writeback patterns, this patch aims to be flexible in the combinations of modes supported by the patterns without requiring a large number of generated patterns by using distinct mode iterators. The new scheme means we only need a single (generated) pattern for each load/store operation of a given operand size. For the 4-byte and 8-byte operand cases, we use the GPI iterator to synthesize the two patterns. The 16-byte case is implemented as a separate pattern in the source (due to only having a single possible alternative). Since the UNSPEC patterns can't be interpreted by the dwarf2cfi code, we add REG_CFA_OFFSET notes to the store pair insns emitted by aarch64_save_callee_saves, so that correct CFI information can still be generated. Furthermore, we now unconditionally generate these CFA notes on frame-related insns emitted by aarch64_save_callee_saves. This is done in case that the load/store pair pass forms these into pairs, in which case the CFA notes would be needed. We also adjust the ldp/stp peepholes to generate the new form. This is done by switching the generation to use the aarch64_gen_{load,store}_pair interface, making it easier to change the form in the future if needed. (Likewise, the upcoming aarch64 load/store pair pass also makes use of this interface). This patch also adds an "ldpstp" attribute to the non-writeback load/store pair patterns, which is used by the post-RA load/store pair pass to identify existing patterns and see if they can be promoted to writeback variants. One potential concern with using unspecs for the patterns is that it can block optimization by the generic RTL passes. This patch series tries to mitigate this in two ways: 1. The pre-RA load/store pair pass runs very late in the pre-RA pipeline. 2. A later patch in the series adjusts the aarch64 mem{cpy,set} expansion to emit individual loads/stores instead of ldp/stp. These should then be formed back into load/store pairs much later in the RTL pipeline by the new load/store pair pass. gcc/ChangeLog: * config/aarch64/aarch64-ldpstp.md: Abstract ldp/stp representation from peepholes, allowing use of new form. * config/aarch64/aarch64-modes.def (V2x4QImode): Define. * config/aarch64/aarch64-protos.h (aarch64_finish_ldpstp_peephole): Declare. (aarch64_swap_ldrstr_operands): Delete declaration. (aarch64_gen_load_pair): Adjust parameters. (aarch64_gen_store_pair): Likewise. * config/aarch64/aarch64-simd.md (load_pair): Delete. (vec_store_pair): Delete. (load_pair): Delete. (vec_store_pair): Delete. * config/aarch64/aarch64.cc (aarch64_pair_mode_for_mode): New. (aarch64_gen_store_pair): Adjust to use new unspec form of stp. Drop second mem from parameters. (aarch64_gen_load_pair): Likewise. (aarch64_pair_mem_from_base): New. (aarch64_save_callee_saves): Emit REG_CFA_OFFSET notes for frame-related saves. Adjust call to aarch64_gen_store_pair (aarch64_restore_callee_saves): Adjust calls to aarch64_gen_load_pair to account for change in interface. (aarch64_process_components): Likewise. (aarch64_classify_address): Handle 32-byte pair mems in LDP_STP_N case. (aarch64_print_operand): Likewise. (aarch64_copy_one_block_and_progress_pointers): Adjust calls to account for change in aarch64_gen_{load,store}_pair interface. (aarch64_set_one_block_and_progress_pointer): Likewise. (aarch64_finish_ldpstp_peephole): New. (aarch64_gen_adjusted_ldpstp): Adjust to use generation helper. * config/aarch64/aarch64.md (ldpstp): New attribute. (load_pair_sw_): Delete. (load_pair_dw_): Delete. (load_pair_dw_): Delete. (*load_pair_): New. (*load_pair_16): New. (store_pair_sw_): Delete. (store_pair_dw_): Delete. (store_pair_dw_): Delete. (*store_pair_): New. (*store_pair_16): New. (*load_pair_extendsidi2_aarch64): Adjust to use new form. (*zero_extendsidi2_aarch64): Likewise. * config/aarch64/iterators.md (VPAIR): New. * config/aarch64/predicates.md (aarch64_mem_pair_operand): Change to a special predicate derived from aarch64_mem_pair_operator. diff --git a/gcc/config/aarch64/aarch64-ldpstp.md b/gcc/config/aarch64/aarch64-ldpstp.md index 1ee7c73ff0c..dc39af85254 100644 --- a/gcc/config/aarch64/aarch64-ldpstp.md +++ b/gcc/config/aarch64/aarch64-ldpstp.md @@ -24,10 +24,10 @@ (define_peephole2 (set (match_operand:GPI 2 "register_operand" "") (match_operand:GPI 3 "memory_operand" ""))] "aarch64_operands_ok_for_ldpstp (operands, true, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, true); + aarch64_finish_ldpstp_peephole (operands, true); + DONE; }) (define_peephole2 @@ -36,10 +36,10 @@ (define_peephole2 (set (match_operand:GPI 2 "memory_operand" "") (match_operand:GPI 3 "aarch64_reg_or_zero" ""))] "aarch64_operands_ok_for_ldpstp (operands, false, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, false); + aarch64_finish_ldpstp_peephole (operands, false); + DONE; }) (define_peephole2 @@ -48,10 +48,10 @@ (define_peephole2 (set (match_operand:GPF 2 "register_operand" "") (match_operand:GPF 3 "memory_operand" ""))] "aarch64_operands_ok_for_ldpstp (operands, true, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, true); + aarch64_finish_ldpstp_peephole (operands, true); + DONE; }) (define_peephole2 @@ -60,10 +60,10 @@ (define_peephole2 (set (match_operand:GPF 2 "memory_operand" "") (match_operand:GPF 3 "aarch64_reg_or_fp_zero" ""))] "aarch64_operands_ok_for_ldpstp (operands, false, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, false); + aarch64_finish_ldpstp_peephole (operands, false); + DONE; }) (define_peephole2 @@ -72,10 +72,10 @@ (define_peephole2 (set (match_operand:DREG2 2 "register_operand" "") (match_operand:DREG2 3 "memory_operand" ""))] "aarch64_operands_ok_for_ldpstp (operands, true, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, true); + aarch64_finish_ldpstp_peephole (operands, true); + DONE; }) (define_peephole2 @@ -84,10 +84,10 @@ (define_peephole2 (set (match_operand:DREG2 2 "memory_operand" "") (match_operand:DREG2 3 "register_operand" ""))] "aarch64_operands_ok_for_ldpstp (operands, false, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, false); + aarch64_finish_ldpstp_peephole (operands, false); + DONE; }) (define_peephole2 @@ -99,10 +99,10 @@ (define_peephole2 && aarch64_operands_ok_for_ldpstp (operands, true, mode) && (aarch64_tune_params.extra_tuning_flags & AARCH64_EXTRA_TUNE_NO_LDP_STP_QREGS) == 0" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, true); + aarch64_finish_ldpstp_peephole (operands, true); + DONE; }) (define_peephole2 @@ -114,10 +114,10 @@ (define_peephole2 && aarch64_operands_ok_for_ldpstp (operands, false, mode) && (aarch64_tune_params.extra_tuning_flags & AARCH64_EXTRA_TUNE_NO_LDP_STP_QREGS) == 0" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, false); + aarch64_finish_ldpstp_peephole (operands, false); + DONE; }) @@ -129,10 +129,10 @@ (define_peephole2 (set (match_operand:DI 2 "register_operand" "") (sign_extend:DI (match_operand:SI 3 "memory_operand" "")))] "aarch64_operands_ok_for_ldpstp (operands, true, SImode)" - [(parallel [(set (match_dup 0) (sign_extend:DI (match_dup 1))) - (set (match_dup 2) (sign_extend:DI (match_dup 3)))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, true); + aarch64_finish_ldpstp_peephole (operands, true, SIGN_EXTEND); + DONE; }) (define_peephole2 @@ -141,10 +141,10 @@ (define_peephole2 (set (match_operand:DI 2 "register_operand" "") (zero_extend:DI (match_operand:SI 3 "memory_operand" "")))] "aarch64_operands_ok_for_ldpstp (operands, true, SImode)" - [(parallel [(set (match_dup 0) (zero_extend:DI (match_dup 1))) - (set (match_dup 2) (zero_extend:DI (match_dup 3)))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, true); + aarch64_finish_ldpstp_peephole (operands, true, ZERO_EXTEND); + DONE; }) ;; Handle storing of a floating point zero with integer data. @@ -163,10 +163,10 @@ (define_peephole2 (set (match_operand: 2 "memory_operand" "") (match_operand: 3 "aarch64_reg_zero_or_fp_zero" ""))] "aarch64_operands_ok_for_ldpstp (operands, false, mode)" - [(parallel [(set (match_dup 0) (match_dup 1)) - (set (match_dup 2) (match_dup 3))])] + [(const_int 0)] { - aarch64_swap_ldrstr_operands (operands, false); + aarch64_finish_ldpstp_peephole (operands, false); + DONE; }) ;; Handle consecutive load/store whose offset is out of the range diff --git a/gcc/config/aarch64/aarch64-modes.def b/gcc/config/aarch64/aarch64-modes.def index 6b4f4e17dd5..1e0d770f72f 100644 --- a/gcc/config/aarch64/aarch64-modes.def +++ b/gcc/config/aarch64/aarch64-modes.def @@ -93,9 +93,13 @@ INT_MODE (XI, 64); /* V8DI mode. */ VECTOR_MODE_WITH_PREFIX (V, INT, DI, 8, 5); - ADJUST_ALIGNMENT (V8DI, 8); +/* V2x4QImode. Used in load/store pair patterns. */ +VECTOR_MODE_WITH_PREFIX (V2x, INT, QI, 4, 5); +ADJUST_NUNITS (V2x4QI, 8); +ADJUST_ALIGNMENT (V2x4QI, 4); + /* Define Advanced SIMD modes for structures of 2, 3 and 4 d-registers. */ #define ADV_SIMD_D_REG_STRUCT_MODES(NVECS, VB, VH, VS, VD) \ VECTOR_MODES_WITH_PREFIX (V##NVECS##x, INT, 8, 3); \ diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 376b4984be6..72362bfb4e3 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -967,6 +967,8 @@ void aarch64_split_compare_and_swap (rtx op[]); void aarch64_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx, rtx); bool aarch64_gen_adjusted_ldpstp (rtx *, bool, machine_mode, RTX_CODE); +void aarch64_finish_ldpstp_peephole (rtx *, bool, + enum rtx_code = (enum rtx_code)0); void aarch64_expand_sve_vec_cmp_int (rtx, rtx_code, rtx, rtx); bool aarch64_expand_sve_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool); @@ -1022,8 +1024,9 @@ bool aarch64_mergeable_load_pair_p (machine_mode, rtx, rtx); bool aarch64_operands_ok_for_ldpstp (rtx *, bool, machine_mode); bool aarch64_operands_adjust_ok_for_ldpstp (rtx *, bool, machine_mode); bool aarch64_mem_ok_with_ldpstp_policy_model (rtx, bool, machine_mode); -void aarch64_swap_ldrstr_operands (rtx *, bool); bool aarch64_ldpstp_operand_mode_p (machine_mode); +rtx aarch64_gen_load_pair (rtx, rtx, rtx, enum rtx_code = (enum rtx_code)0); +rtx aarch64_gen_store_pair (rtx, rtx, rtx); extern void aarch64_asm_output_pool_epilogue (FILE *, const char *, tree, HOST_WIDE_INT); diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index ad79a8110a5..9736421433f 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -231,38 +231,6 @@ (define_insn "aarch64_store_lane0" [(set_attr "type" "neon_store1_1reg")] ) -(define_insn "load_pair" - [(set (match_operand:DREG 0 "register_operand") - (match_operand:DREG 1 "aarch64_mem_pair_operand")) - (set (match_operand:DREG2 2 "register_operand") - (match_operand:DREG2 3 "memory_operand"))] - "TARGET_FLOAT - && rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (mode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type ] - [ w , Ump , w , m ; neon_ldp ] ldp\t%d0, %d2, %z1 - [ r , Ump , r , m ; load_16 ] ldp\t%x0, %x2, %z1 - } -) - -(define_insn "vec_store_pair" - [(set (match_operand:DREG 0 "aarch64_mem_pair_operand") - (match_operand:DREG 1 "register_operand")) - (set (match_operand:DREG2 2 "memory_operand") - (match_operand:DREG2 3 "register_operand"))] - "TARGET_FLOAT - && rtx_equal_p (XEXP (operands[2], 0), - plus_constant (Pmode, - XEXP (operands[0], 0), - GET_MODE_SIZE (mode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type ] - [ Ump , w , m , w ; neon_stp ] stp\t%d1, %d3, %z0 - [ Ump , r , m , r ; store_16 ] stp\t%x1, %x3, %z0 - } -) - (define_insn "aarch64_simd_stp" [(set (match_operand:VP_2E 0 "aarch64_mem_pair_lanes_operand") (vec_duplicate:VP_2E (match_operand: 1 "register_operand")))] @@ -273,34 +241,6 @@ (define_insn "aarch64_simd_stp" } ) -(define_insn "load_pair" - [(set (match_operand:VQ 0 "register_operand" "=w") - (match_operand:VQ 1 "aarch64_mem_pair_operand" "Ump")) - (set (match_operand:VQ2 2 "register_operand" "=w") - (match_operand:VQ2 3 "memory_operand" "m"))] - "TARGET_FLOAT - && rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (mode)))" - "ldp\\t%q0, %q2, %z1" - [(set_attr "type" "neon_ldp_q")] -) - -(define_insn "vec_store_pair" - [(set (match_operand:VQ 0 "aarch64_mem_pair_operand" "=Ump") - (match_operand:VQ 1 "register_operand" "w")) - (set (match_operand:VQ2 2 "memory_operand" "=m") - (match_operand:VQ2 3 "register_operand" "w"))] - "TARGET_FLOAT - && rtx_equal_p (XEXP (operands[2], 0), - plus_constant (Pmode, - XEXP (operands[0], 0), - GET_MODE_SIZE (mode)))" - "stp\\t%q1, %q3, %z0" - [(set_attr "type" "neon_stp_q")] -) - (define_expand "@aarch64_split_simd_mov" [(set (match_operand:VQMOV 0) (match_operand:VQMOV 1))] diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 8faaa748a05..c2e4f531254 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -6680,59 +6680,87 @@ aarch64_pop_regs (unsigned regno1, unsigned regno2, HOST_WIDE_INT adjustment, } } -/* Generate and return a store pair instruction of mode MODE to store - register REG1 to MEM1 and register REG2 to MEM2. */ +/* Given an ldp/stp register operand mode MODE, return a suitable mode to use + for a mem rtx representing the entire pair. */ -static rtx -aarch64_gen_store_pair (machine_mode mode, rtx mem1, rtx reg1, rtx mem2, - rtx reg2) -{ - switch (mode) - { - case E_DImode: - return gen_store_pair_dw_didi (mem1, reg1, mem2, reg2); +static machine_mode +aarch64_pair_mode_for_mode (machine_mode mode) +{ + if (known_eq (GET_MODE_SIZE (mode), 4)) + return V2x4QImode; + else if (known_eq (GET_MODE_SIZE (mode), 8)) + return V2x8QImode; + else if (known_eq (GET_MODE_SIZE (mode), 16)) + return V2x16QImode; + else + gcc_unreachable (); +} - case E_DFmode: - return gen_store_pair_dw_dfdf (mem1, reg1, mem2, reg2); +/* Given a base mem MEM with a mode suitable for an ldp/stp register operand, + return an rtx like MEM which instead represents the entire pair. */ - case E_TFmode: - return gen_store_pair_dw_tftf (mem1, reg1, mem2, reg2); +static rtx +aarch64_pair_mem_from_base (rtx mem) +{ + auto pair_mode = aarch64_pair_mode_for_mode (GET_MODE (mem)); + mem = adjust_bitfield_address_nv (mem, pair_mode, 0); + gcc_assert (aarch64_mem_pair_lanes_operand (mem, pair_mode)); + return mem; +} - case E_V4SImode: - return gen_vec_store_pairv4siv4si (mem1, reg1, mem2, reg2); +/* Generate and return a store pair instruction to store REG1 and REG2 + into memory starting at BASE_MEM. All three rtxes should have modes of the + same size. */ - case E_V16QImode: - return gen_vec_store_pairv16qiv16qi (mem1, reg1, mem2, reg2); +rtx +aarch64_gen_store_pair (rtx base_mem, rtx reg1, rtx reg2) +{ + rtx pair_mem = aarch64_pair_mem_from_base (base_mem); - default: - gcc_unreachable (); - } + return gen_rtx_SET (pair_mem, + gen_rtx_UNSPEC (GET_MODE (pair_mem), + gen_rtvec (2, reg1, reg2), + UNSPEC_STP)); } -/* Generate and regurn a load pair isntruction of mode MODE to load register - REG1 from MEM1 and register REG2 from MEM2. */ +/* Generate and return a load pair instruction to load a pair of + registers starting at BASE_MEM into REG1 and REG2. If CODE is + UNKNOWN, all three rtxes should have modes of the same size. + Otherwise, CODE is {SIGN,ZERO}_EXTEND, base_mem should be in SImode, + and REG{1,2} should be in DImode. */ -static rtx -aarch64_gen_load_pair (machine_mode mode, rtx reg1, rtx mem1, rtx reg2, - rtx mem2) +rtx +aarch64_gen_load_pair (rtx reg1, rtx reg2, rtx base_mem, enum rtx_code code) { - switch (mode) - { - case E_DImode: - return gen_load_pair_dw_didi (reg1, mem1, reg2, mem2); - - case E_DFmode: - return gen_load_pair_dw_dfdf (reg1, mem1, reg2, mem2); + rtx pair_mem = aarch64_pair_mem_from_base (base_mem); - case E_TFmode: - return gen_load_pair_dw_tftf (reg1, mem1, reg2, mem2); + const bool any_extend_p = (code == ZERO_EXTEND || code == SIGN_EXTEND); + if (any_extend_p) + { + gcc_checking_assert (GET_MODE (base_mem) == SImode + && GET_MODE (reg1) == DImode + && GET_MODE (reg2) == DImode); + } + else + gcc_assert (code == UNKNOWN); + + rtx unspecs[2] = { + gen_rtx_UNSPEC (any_extend_p ? SImode : GET_MODE (reg1), + gen_rtvec (1, pair_mem), + UNSPEC_LDP_FST), + gen_rtx_UNSPEC (any_extend_p ? SImode : GET_MODE (reg2), + gen_rtvec (1, copy_rtx (pair_mem)), + UNSPEC_LDP_SND) + }; - case E_V4SImode: - return gen_load_pairv4siv4si (reg1, mem1, reg2, mem2); + if (any_extend_p) + for (int i = 0; i < 2; i++) + unspecs[i] = gen_rtx_fmt_e (code, DImode, unspecs[i]); - default: - gcc_unreachable (); - } + return gen_rtx_PARALLEL (VOIDmode, + gen_rtvec (2, + gen_rtx_SET (reg1, unspecs[0]), + gen_rtx_SET (reg2, unspecs[1]))); } /* Return TRUE if return address signing should be enabled for the current @@ -6909,7 +6937,7 @@ aarch64_save_callee_saves (poly_int64 bytes_below_sp, rtx reg = gen_rtx_REG (mode, regno); offset = frame.reg_offset[regno] - bytes_below_sp; rtx base_rtx = stack_pointer_rtx; - poly_int64 sp_offset = offset; + poly_int64 cfa_offset = offset; HOST_WIDE_INT const_offset; if (mode == VNx2DImode && BYTES_BIG_ENDIAN) @@ -6934,8 +6962,17 @@ aarch64_save_callee_saves (poly_int64 bytes_below_sp, offset -= fp_offset; } rtx mem = gen_frame_mem (mode, plus_constant (Pmode, base_rtx, offset)); - bool need_cfa_note_p = (base_rtx != stack_pointer_rtx); + rtx cfa_base = stack_pointer_rtx; + if (hard_fp_valid_p && frame_pointer_needed) + { + cfa_base = hard_frame_pointer_rtx; + cfa_offset += (bytes_below_sp - frame.bytes_below_hard_fp); + } + + rtx cfa_mem = gen_frame_mem (mode, + plus_constant (Pmode, + cfa_base, cfa_offset)); unsigned int regno2; if (!aarch64_sve_mode_p (mode) && i + 1 < regs.size () @@ -6944,42 +6981,35 @@ aarch64_save_callee_saves (poly_int64 bytes_below_sp, frame.reg_offset[regno2] - frame.reg_offset[regno])) { rtx reg2 = gen_rtx_REG (mode, regno2); - rtx mem2; offset += GET_MODE_SIZE (mode); - mem2 = gen_frame_mem (mode, plus_constant (Pmode, base_rtx, offset)); - insn = emit_insn (aarch64_gen_store_pair (mode, mem, reg, mem2, - reg2)); - - /* The first part of a frame-related parallel insn is - always assumed to be relevant to the frame - calculations; subsequent parts, are only - frame-related if explicitly marked. */ + insn = emit_insn (aarch64_gen_store_pair (mem, reg, reg2)); + if (aarch64_emit_cfi_for_reg_p (regno2)) { - if (need_cfa_note_p) - aarch64_add_cfa_expression (insn, reg2, stack_pointer_rtx, - sp_offset + GET_MODE_SIZE (mode)); - else - RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1; + const auto off = cfa_offset + GET_MODE_SIZE (mode); + rtx cfa_mem2 = gen_frame_mem (mode, + plus_constant (Pmode, + cfa_base, + off)); + add_reg_note (insn, REG_CFA_OFFSET, + gen_rtx_SET (cfa_mem2, reg2)); } regno = regno2; ++i; } else if (mode == VNx2DImode && BYTES_BIG_ENDIAN) - { - insn = emit_insn (gen_aarch64_pred_mov (mode, mem, ptrue, reg)); - need_cfa_note_p = true; - } + insn = emit_insn (gen_aarch64_pred_mov (mode, mem, ptrue, reg)); else if (aarch64_sve_mode_p (mode)) insn = emit_insn (gen_rtx_SET (mem, reg)); else insn = emit_move_insn (mem, reg); RTX_FRAME_RELATED_P (insn) = frame_related_p; - if (frame_related_p && need_cfa_note_p) - aarch64_add_cfa_expression (insn, reg, stack_pointer_rtx, sp_offset); + + if (frame_related_p) + add_reg_note (insn, REG_CFA_OFFSET, gen_rtx_SET (cfa_mem, reg)); } } @@ -7038,12 +7068,7 @@ aarch64_restore_callee_saves (poly_int64 bytes_below_sp, frame.reg_offset[regno2] - frame.reg_offset[regno])) { rtx reg2 = gen_rtx_REG (mode, regno2); - rtx mem2; - - offset += GET_MODE_SIZE (mode); - mem2 = gen_frame_mem (mode, plus_constant (Pmode, base_rtx, offset)); - emit_insn (aarch64_gen_load_pair (mode, reg, mem, reg2, mem2)); - + emit_insn (aarch64_gen_load_pair (reg, reg2, mem)); *cfi_ops = alloc_reg_note (REG_CFA_RESTORE, reg2, *cfi_ops); regno = regno2; ++i; @@ -7375,9 +7400,9 @@ aarch64_process_components (sbitmap components, bool prologue_p) : gen_rtx_SET (reg2, mem2); if (prologue_p) - insn = emit_insn (aarch64_gen_store_pair (mode, mem, reg, mem2, reg2)); + insn = emit_insn (aarch64_gen_store_pair (mem, reg, reg2)); else - insn = emit_insn (aarch64_gen_load_pair (mode, reg, mem, reg2, mem2)); + insn = emit_insn (aarch64_gen_load_pair (reg, reg2, mem)); if (frame_related_p || frame_related2_p) { @@ -8573,12 +8598,18 @@ aarch64_classify_address (struct aarch64_address_info *info, mode of the corresponding addressing mode is half of that. */ if (type == ADDR_QUERY_LDP_STP_N) { - if (known_eq (GET_MODE_SIZE (mode), 16)) + if (known_eq (GET_MODE_SIZE (mode), 32)) + mode = V16QImode; + else if (known_eq (GET_MODE_SIZE (mode), 16)) mode = DFmode; else if (known_eq (GET_MODE_SIZE (mode), 8)) mode = SFmode; else return false; + + /* This isn't really an Advanced SIMD struct mode, but a mode + used to represent the complete mem in a load/store pair. */ + advsimd_struct_p = false; } bool allow_reg_index_p = (!load_store_pair_p @@ -10207,7 +10238,8 @@ aarch64_print_operand (FILE *f, rtx x, int code) if (!MEM_P (x) || (code == 'y' && maybe_ne (GET_MODE_SIZE (mode), 8) - && maybe_ne (GET_MODE_SIZE (mode), 16))) + && maybe_ne (GET_MODE_SIZE (mode), 16) + && maybe_ne (GET_MODE_SIZE (mode), 32))) { output_operand_lossage ("invalid operand for '%%%c'", code); return; @@ -23082,10 +23114,8 @@ aarch64_copy_one_block_and_progress_pointers (rtx *src, rtx *dst, *src = adjust_address (*src, mode, 0); *dst = adjust_address (*dst, mode, 0); /* Emit the memcpy. */ - emit_insn (aarch64_gen_load_pair (mode, reg1, *src, reg2, - aarch64_progress_pointer (*src))); - emit_insn (aarch64_gen_store_pair (mode, *dst, reg1, - aarch64_progress_pointer (*dst), reg2)); + emit_insn (aarch64_gen_load_pair (reg1, reg2, *src)); + emit_insn (aarch64_gen_store_pair (*dst, reg1, reg2)); /* Move the pointers forward. */ *src = aarch64_move_pointer (*src, 32); *dst = aarch64_move_pointer (*dst, 32); @@ -23260,8 +23290,7 @@ aarch64_set_one_block_and_progress_pointer (rtx src, rtx *dst, /* "Cast" the *dst to the correct mode. */ *dst = adjust_address (*dst, mode, 0); /* Emit the memset. */ - emit_insn (aarch64_gen_store_pair (mode, *dst, src, - aarch64_progress_pointer (*dst), src)); + emit_insn (aarch64_gen_store_pair (*dst, src, src)); /* Move the pointers forward. */ *dst = aarch64_move_pointer (*dst, 32); @@ -24458,6 +24487,29 @@ aarch64_swap_ldrstr_operands (rtx* operands, bool load) } } +/* Helper function used for generation of load/store pair instructions, called + from peepholes in aarch64-ldpstp.md. OPERANDS is an array of + operands as matched by the peepholes in that file. LOAD_P is true if we're + generating a load pair, otherwise we're generating a store pair. CODE is + either {ZERO,SIGN}_EXTEND for extending loads or UNKNOWN if we're generating a + standard load/store pair. */ + +void +aarch64_finish_ldpstp_peephole (rtx *operands, bool load_p, enum rtx_code code) +{ + aarch64_swap_ldrstr_operands (operands, load_p); + + if (load_p) + emit_insn (aarch64_gen_load_pair (operands[0], operands[2], + operands[1], code)); + else + { + gcc_assert (code == UNKNOWN); + emit_insn (aarch64_gen_store_pair (operands[0], operands[1], + operands[3])); + } +} + /* Taking X and Y to be HOST_WIDE_INT pointers, return the result of a comparison between the two. */ int @@ -24639,10 +24691,10 @@ bool aarch64_gen_adjusted_ldpstp (rtx *operands, bool load, machine_mode mode, RTX_CODE code) { - rtx base, offset_1, offset_3, t1, t2; - rtx mem_1, mem_2, mem_3, mem_4; + rtx base, offset_1, offset_2; + rtx mem_1, mem_2; rtx temp_operands[8]; - HOST_WIDE_INT off_val_1, off_val_3, base_off, new_off_1, new_off_3, + HOST_WIDE_INT off_val_1, off_val_2, base_off, new_off_1, new_off_2, stp_off_upper_limit, stp_off_lower_limit, msize; /* We make changes on a copy as we may still bail out. */ @@ -24665,23 +24717,19 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load, if (load) { mem_1 = copy_rtx (temp_operands[1]); - mem_2 = copy_rtx (temp_operands[3]); - mem_3 = copy_rtx (temp_operands[5]); - mem_4 = copy_rtx (temp_operands[7]); + mem_2 = copy_rtx (temp_operands[5]); } else { mem_1 = copy_rtx (temp_operands[0]); - mem_2 = copy_rtx (temp_operands[2]); - mem_3 = copy_rtx (temp_operands[4]); - mem_4 = copy_rtx (temp_operands[6]); + mem_2 = copy_rtx (temp_operands[4]); gcc_assert (code == UNKNOWN); } extract_base_offset_in_addr (mem_1, &base, &offset_1); - extract_base_offset_in_addr (mem_3, &base, &offset_3); + extract_base_offset_in_addr (mem_2, &base, &offset_2); gcc_assert (base != NULL_RTX && offset_1 != NULL_RTX - && offset_3 != NULL_RTX); + && offset_2 != NULL_RTX); /* Adjust offset so it can fit in LDP/STP instruction. */ msize = GET_MODE_SIZE (mode).to_constant(); @@ -24689,11 +24737,11 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load, stp_off_lower_limit = - msize * 0x40; off_val_1 = INTVAL (offset_1); - off_val_3 = INTVAL (offset_3); + off_val_2 = INTVAL (offset_2); /* The base offset is optimally half way between the two STP/LDP offsets. */ if (msize <= 4) - base_off = (off_val_1 + off_val_3) / 2; + base_off = (off_val_1 + off_val_2) / 2; else /* However, due to issues with negative LDP/STP offset generation for larger modes, for DF, DD, DI and vector modes. we must not use negative @@ -24733,73 +24781,58 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load, new_off_1 = off_val_1 - base_off; /* Offset of the second STP/LDP. */ - new_off_3 = off_val_3 - base_off; + new_off_2 = off_val_2 - base_off; /* The offsets must be within the range of the LDP/STP instructions. */ if (new_off_1 > stp_off_upper_limit || new_off_1 < stp_off_lower_limit - || new_off_3 > stp_off_upper_limit || new_off_3 < stp_off_lower_limit) + || new_off_2 > stp_off_upper_limit || new_off_2 < stp_off_lower_limit) return false; replace_equiv_address_nv (mem_1, plus_constant (Pmode, operands[8], new_off_1), true); replace_equiv_address_nv (mem_2, plus_constant (Pmode, operands[8], - new_off_1 + msize), true); - replace_equiv_address_nv (mem_3, plus_constant (Pmode, operands[8], - new_off_3), true); - replace_equiv_address_nv (mem_4, plus_constant (Pmode, operands[8], - new_off_3 + msize), true); + new_off_2), true); if (!aarch64_mem_pair_operand (mem_1, mode) - || !aarch64_mem_pair_operand (mem_3, mode)) + || !aarch64_mem_pair_operand (mem_2, mode)) return false; - if (code == ZERO_EXTEND) - { - mem_1 = gen_rtx_ZERO_EXTEND (DImode, mem_1); - mem_2 = gen_rtx_ZERO_EXTEND (DImode, mem_2); - mem_3 = gen_rtx_ZERO_EXTEND (DImode, mem_3); - mem_4 = gen_rtx_ZERO_EXTEND (DImode, mem_4); - } - else if (code == SIGN_EXTEND) - { - mem_1 = gen_rtx_SIGN_EXTEND (DImode, mem_1); - mem_2 = gen_rtx_SIGN_EXTEND (DImode, mem_2); - mem_3 = gen_rtx_SIGN_EXTEND (DImode, mem_3); - mem_4 = gen_rtx_SIGN_EXTEND (DImode, mem_4); - } - if (load) { operands[0] = temp_operands[0]; operands[1] = mem_1; operands[2] = temp_operands[2]; - operands[3] = mem_2; operands[4] = temp_operands[4]; - operands[5] = mem_3; + operands[5] = mem_2; operands[6] = temp_operands[6]; - operands[7] = mem_4; } else { operands[0] = mem_1; operands[1] = temp_operands[1]; - operands[2] = mem_2; operands[3] = temp_operands[3]; - operands[4] = mem_3; + operands[4] = mem_2; operands[5] = temp_operands[5]; - operands[6] = mem_4; operands[7] = temp_operands[7]; } /* Emit adjusting instruction. */ emit_insn (gen_rtx_SET (operands[8], plus_constant (DImode, base, base_off))); /* Emit ldp/stp instructions. */ - t1 = gen_rtx_SET (operands[0], operands[1]); - t2 = gen_rtx_SET (operands[2], operands[3]); - emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2))); - t1 = gen_rtx_SET (operands[4], operands[5]); - t2 = gen_rtx_SET (operands[6], operands[7]); - emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2))); + if (load) + { + emit_insn (aarch64_gen_load_pair (operands[0], operands[2], + operands[1], code)); + emit_insn (aarch64_gen_load_pair (operands[4], operands[6], + operands[5], code)); + } + else + { + emit_insn (aarch64_gen_store_pair (operands[0], operands[1], + operands[3])); + emit_insn (aarch64_gen_store_pair (operands[4], operands[5], + operands[7])); + } return true; } diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index bfa2ec80ee7..bed74cfd311 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -175,6 +175,9 @@ (define_c_enum "unspec" [ UNSPEC_GOTSMALLTLS UNSPEC_GOTTINYPIC UNSPEC_GOTTINYTLS + UNSPEC_STP + UNSPEC_LDP_FST + UNSPEC_LDP_SND UNSPEC_LD1 UNSPEC_LD2 UNSPEC_LD2_DREG @@ -453,6 +456,11 @@ (define_attr "predicated" "yes,no" (const_string "no")) ;; may chose to hold the tracking state encoded in SP. (define_attr "speculation_barrier" "true,false" (const_string "false")) +;; Attribute use to identify load pair and store pair instructions. +;; Currently the attribute is only applied to the non-writeback ldp/stp +;; patterns. +(define_attr "ldpstp" "ldp,stp,none" (const_string "none")) + ;; ------------------------------------------------------------------- ;; Pipeline descriptions and scheduling ;; ------------------------------------------------------------------- @@ -1735,100 +1743,62 @@ (define_expand "setmemdi" FAIL; }) -;; Operands 1 and 3 are tied together by the final condition; so we allow -;; fairly lax checking on the second memory operation. -(define_insn "load_pair_sw_" - [(set (match_operand:SX 0 "register_operand") - (match_operand:SX 1 "aarch64_mem_pair_operand")) - (set (match_operand:SX2 2 "register_operand") - (match_operand:SX2 3 "memory_operand"))] - "rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (mode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type , arch ] - [ r , Ump , r , m ; load_8 , * ] ldp\t%w0, %w2, %z1 - [ w , Ump , w , m ; neon_load1_2reg , fp ] ldp\t%s0, %s2, %z1 - } -) - -;; Storing different modes that can still be merged -(define_insn "load_pair_dw_" - [(set (match_operand:DX 0 "register_operand") - (match_operand:DX 1 "aarch64_mem_pair_operand")) - (set (match_operand:DX2 2 "register_operand") - (match_operand:DX2 3 "memory_operand"))] - "rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (mode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type , arch ] - [ r , Ump , r , m ; load_16 , * ] ldp\t%x0, %x2, %z1 - [ w , Ump , w , m ; neon_load1_2reg , fp ] ldp\t%d0, %d2, %z1 - } -) - -(define_insn "load_pair_dw_" - [(set (match_operand:TX 0 "register_operand" "=w") - (match_operand:TX 1 "aarch64_mem_pair_operand" "Ump")) - (set (match_operand:TX2 2 "register_operand" "=w") - (match_operand:TX2 3 "memory_operand" "m"))] - "TARGET_SIMD - && rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (mode)))" - "ldp\\t%q0, %q2, %z1" +(define_insn "*load_pair_" + [(set (match_operand:GPI 0 "aarch64_ldp_reg_operand") + (unspec [ + (match_operand: 1 "aarch64_mem_pair_lanes_operand") + ] UNSPEC_LDP_FST)) + (set (match_operand:GPI 2 "aarch64_ldp_reg_operand") + (unspec [ + (match_dup 1) + ] UNSPEC_LDP_SND))] + "" + {@ [cons: =0, 1, =2; attrs: type, arch] + [ r, Umn, r; load_, * ] ldp\t%0, %2, %y1 + [ w, Umn, w; neon_load1_2reg, fp ] ldp\t%0, %2, %y1 + } + [(set_attr "ldpstp" "ldp")] +) + +(define_insn "*load_pair_16" + [(set (match_operand:TI 0 "aarch64_ldp_reg_operand" "=w") + (unspec [ + (match_operand:V2x16QI 1 "aarch64_mem_pair_lanes_operand" "Umn") + ] UNSPEC_LDP_FST)) + (set (match_operand:TI 2 "aarch64_ldp_reg_operand" "=w") + (unspec [ + (match_dup 1) + ] UNSPEC_LDP_SND))] + "TARGET_FLOAT" + "ldp\\t%q0, %q2, %y1" [(set_attr "type" "neon_ldp_q") - (set_attr "fp" "yes")] -) - -;; Operands 0 and 2 are tied together by the final condition; so we allow -;; fairly lax checking on the second memory operation. -(define_insn "store_pair_sw_" - [(set (match_operand:SX 0 "aarch64_mem_pair_operand") - (match_operand:SX 1 "aarch64_reg_zero_or_fp_zero")) - (set (match_operand:SX2 2 "memory_operand") - (match_operand:SX2 3 "aarch64_reg_zero_or_fp_zero"))] - "rtx_equal_p (XEXP (operands[2], 0), - plus_constant (Pmode, - XEXP (operands[0], 0), - GET_MODE_SIZE (mode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type , arch ] - [ Ump , rYZ , m , rYZ ; store_8 , * ] stp\t%w1, %w3, %z0 - [ Ump , w , m , w ; neon_store1_2reg , fp ] stp\t%s1, %s3, %z0 - } -) - -;; Storing different modes that can still be merged -(define_insn "store_pair_dw_" - [(set (match_operand:DX 0 "aarch64_mem_pair_operand") - (match_operand:DX 1 "aarch64_reg_zero_or_fp_zero")) - (set (match_operand:DX2 2 "memory_operand") - (match_operand:DX2 3 "aarch64_reg_zero_or_fp_zero"))] - "rtx_equal_p (XEXP (operands[2], 0), - plus_constant (Pmode, - XEXP (operands[0], 0), - GET_MODE_SIZE (mode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type , arch ] - [ Ump , rYZ , m , rYZ ; store_16 , * ] stp\t%x1, %x3, %z0 - [ Ump , w , m , w ; neon_store1_2reg , fp ] stp\t%d1, %d3, %z0 - } -) - -(define_insn "store_pair_dw_" - [(set (match_operand:TX 0 "aarch64_mem_pair_operand" "=Ump") - (match_operand:TX 1 "register_operand" "w")) - (set (match_operand:TX2 2 "memory_operand" "=m") - (match_operand:TX2 3 "register_operand" "w"))] - "TARGET_SIMD && - rtx_equal_p (XEXP (operands[2], 0), - plus_constant (Pmode, - XEXP (operands[0], 0), - GET_MODE_SIZE (TFmode)))" - "stp\\t%q1, %q3, %z0" + (set_attr "fp" "yes") + (set_attr "ldpstp" "ldp")] +) + +(define_insn "*store_pair_" + [(set (match_operand: 0 "aarch64_mem_pair_lanes_operand") + (unspec: + [(match_operand:GPI 1 "aarch64_stp_reg_operand") + (match_operand:GPI 2 "aarch64_stp_reg_operand")] UNSPEC_STP))] + "" + {@ [cons: =0, 1, 2; attrs: type , arch] + [ Umn, rYZ, rYZ; store_, * ] stp\t%1, %2, %y0 + [ Umn, w, w; neon_store1_2reg , fp ] stp\t%1, %2, %y0 + } + [(set_attr "ldpstp" "stp")] +) + +(define_insn "*store_pair_16" + [(set (match_operand:V2x16QI 0 "aarch64_mem_pair_lanes_operand" "=Umn") + (unspec:V2x16QI + [(match_operand:TI 1 "aarch64_ldp_reg_operand" "w") + (match_operand:TI 2 "aarch64_ldp_reg_operand" "w")] UNSPEC_STP))] + "TARGET_FLOAT" + "stp\t%q1, %q2, %y0" [(set_attr "type" "neon_stp_q") - (set_attr "fp" "yes")] + (set_attr "fp" "yes") + (set_attr "ldpstp" "stp")] ) ;; Writeback load/store pair patterns. @@ -2058,14 +2028,15 @@ (define_insn "*extendsidi2_aarch64" (define_insn "*load_pair_extendsidi2_aarch64" [(set (match_operand:DI 0 "register_operand" "=r") - (sign_extend:DI (match_operand:SI 1 "aarch64_mem_pair_operand" "Ump"))) + (sign_extend:DI (unspec:SI [ + (match_operand:V2x4QI 1 "aarch64_mem_pair_lanes_operand" "Umn") + ] UNSPEC_LDP_FST))) (set (match_operand:DI 2 "register_operand" "=r") - (sign_extend:DI (match_operand:SI 3 "memory_operand" "m")))] - "rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (SImode)))" - "ldpsw\\t%0, %2, %z1" + (sign_extend:DI (unspec:SI [ + (match_dup 1) + ] UNSPEC_LDP_SND)))] + "" + "ldpsw\\t%0, %2, %y1" [(set_attr "type" "load_8")] ) @@ -2085,16 +2056,17 @@ (define_insn "*zero_extendsidi2_aarch64" (define_insn "*load_pair_zero_extendsidi2_aarch64" [(set (match_operand:DI 0 "register_operand") - (zero_extend:DI (match_operand:SI 1 "aarch64_mem_pair_operand"))) + (zero_extend:DI (unspec:SI [ + (match_operand:V2x4QI 1 "aarch64_mem_pair_lanes_operand") + ] UNSPEC_LDP_FST))) (set (match_operand:DI 2 "register_operand") - (zero_extend:DI (match_operand:SI 3 "memory_operand")))] - "rtx_equal_p (XEXP (operands[3], 0), - plus_constant (Pmode, - XEXP (operands[1], 0), - GET_MODE_SIZE (SImode)))" - {@ [ cons: =0 , 1 , =2 , 3 ; attrs: type , arch ] - [ r , Ump , r , m ; load_8 , * ] ldp\t%w0, %w2, %z1 - [ w , Ump , w , m ; neon_load1_2reg , fp ] ldp\t%s0, %s2, %z1 + (zero_extend:DI (unspec:SI [ + (match_dup 1) + ] UNSPEC_LDP_SND)))] + "" + {@ [ cons: =0 , 1 , =2; attrs: type , arch] + [ r , Umn , r ; load_8 , * ] ldp\t%w0, %w2, %y1 + [ w , Umn , w ; neon_load1_2reg, fp ] ldp\t%s0, %s2, %y1 } ) diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index a920de99ffc..fd8dd6db349 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -1435,6 +1435,9 @@ (define_mode_attr VDBL [(V8QI "V16QI") (V4HI "V8HI") (SI "V2SI") (SF "V2SF") (DI "V2DI") (DF "V2DF")]) +;; Load/store pair mode. +(define_mode_attr VPAIR [(SI "V2x4QI") (DI "V2x8QI")]) + ;; Register suffix for double-length mode. (define_mode_attr Vdtype [(V4HF "8h") (V2SF "4s")]) diff --git a/gcc/config/aarch64/predicates.md b/gcc/config/aarch64/predicates.md index 64bcdc65977..72afcabd5f0 100644 --- a/gcc/config/aarch64/predicates.md +++ b/gcc/config/aarch64/predicates.md @@ -266,10 +266,12 @@ (define_special_predicate "aarch64_mem_pair_operator" (match_test "known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (GET_MODE (op)))")))) -(define_predicate "aarch64_mem_pair_operand" - (and (match_code "mem") - (match_test "aarch64_legitimate_address_p (mode, XEXP (op, 0), false, - ADDR_QUERY_LDP_STP)"))) +;; Like aarch64_mem_pair_operator, but additionally check the +;; address is suitable. +(define_special_predicate "aarch64_mem_pair_operand" + (and (match_operand 0 "aarch64_mem_pair_operator") + (match_test "aarch64_legitimate_address_p (GET_MODE (op), XEXP (op, 0), + false, ADDR_QUERY_LDP_STP)"))) (define_predicate "pmode_plus_operator" (and (match_code "plus")