From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2040.outbound.protection.outlook.com [40.107.22.40]) by sourceware.org (Postfix) with ESMTPS id 166D1385483D for ; Mon, 31 Oct 2022 11:38:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 166D1385483D 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-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=GvYsuh29VNKGeTHfvObLyKPeZudx3MXtAd7d2c/xpZ4hk1CtY7S5OQod974943hzvG46ViZKPzQTTP2SQ0FiftUq7bbDikDEn+PM+oNitpom1a2C+JOiSraD88sFGnUiFw8tJ+giU1FpABDKUW/L5LJhPNR1ziukHvRILpP3eeTCrES/ZKKH6bQHwL/OQ2TZgrrloF1P6qL8eXPS40soEKFCnfwsmHuew0LrGgEqztQkJjADZwcoNrMx2M3ngRmCd8GtwplHjsjA9onTvel/J5sPxfQAoLx7dLR52K3YkUu/f9bfJQTP7LKgN4qJWgV9nKr2RzErjWmTCXnq/jGTJQ== 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=eT8yLpjaatWK/U2dbTB1S+fVmSKmysq4K5xg3woFccQ=; b=jObK+UmxZdN/wwvvShGvYt9j+iIIz0EpOLlUN7SZRjLgkkEAO2yEqvuKxYhiGgD0ycxhT8fWfSwuJGyHY3DL2uhiBS3I48VVcIbDnVBl0rHN/ZUBhni9W32ii/NYMsYXPoa1N/YXaA9bgyrLLhs5jn/my2TPJWiCSER9EVbUpkbMDEfAmzWwchaYdKekFxP4+Wh91RhYXTJ5TXcnm/kgjZnWLshXHABE/8ebbD4cuMZZi3+8WsJcnx82nWJZwDq1CIdmc0/VjmSzXi48lLQznjj/y874/7mYIAoKfdzzkgJ3hcDTyu91DTmIRcdjPBezIGVqnG7VCb56CnyJKpPdlQ== 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=eT8yLpjaatWK/U2dbTB1S+fVmSKmysq4K5xg3woFccQ=; b=vKEC31l0Hb8wftk9mii9/RN2aUB0fGzauZd5VM4QCwuUmjNF7yA1CU0t6FtmzjhZJdRJANlAp5DuTYwjcTJv9Z26J4BFWHlOXHimdePfPvkq43T05w75YOPtgO+k1Nx6GdzZ1unQ6NNrURNk3Vla1rlfo4Cbm8nvdY9q7SWG1S0= Received: from DB9PR02CA0018.eurprd02.prod.outlook.com (2603:10a6:10:1d9::23) by GV2PR08MB8749.eurprd08.prod.outlook.com (2603:10a6:150:b9::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.16; Mon, 31 Oct 2022 11:38:28 +0000 Received: from DBAEUR03FT007.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:1d9:cafe::a) by DB9PR02CA0018.outlook.office365.com (2603:10a6:10:1d9::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.15 via Frontend Transport; Mon, 31 Oct 2022 11:38:28 +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 DBAEUR03FT007.mail.protection.outlook.com (100.127.142.161) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.14 via Frontend Transport; Mon, 31 Oct 2022 11:38:28 +0000 Received: ("Tessian outbound 58faf9791229:v130"); Mon, 31 Oct 2022 11:38:28 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 0761a43bf3efb3e5 X-CR-MTA-TID: 64aa7808 Received: from 103183521191.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 34DF5B06-2666-4393-865E-D1E816326151.1; Mon, 31 Oct 2022 11:38:22 +0000 Received: from EUR04-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 103183521191.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 31 Oct 2022 11:38:22 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AQVHVjtFBSm+0k8fKwuw5ugFruPkG+KU3YK/pwq+K3F3t1RdUZERniWfwbFCYcN6bk0NmVN8SXJalCQqtxBaMZ7eRw2ymq+rjguAwTTZ7L28q0kjSisLnet/lbddl6IrHpFeJ8FHUc3+yWgO8jueGc6Nig8RDkyneTofBVM+iwGcl25E4LOFbCXVur6NKFb8Akvx1whtFEp5zQdspuqEUdatUNtU8y3GxO1AcUjYxxr2bXgR44YA4TbUzMUcOjF7XBd/mkitEu8HeKlPDeh0tamcYpUbjyApSj9B/26PgC1PAswvkR09zfLk4z//pRJVEVyTwnAJSU5ad14hnitaoA== 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=eT8yLpjaatWK/U2dbTB1S+fVmSKmysq4K5xg3woFccQ=; b=YMcS5thfzYl7a7FmE4jnRhI2Z+eYz4XrmZi0IESgljt2JAUwXmpF8y0/H4rKkuvlVeM9/pWFdW+xRub+EJ08yPaOZvJmnewMpETiNuBqAg2Qbv39YC5MiNrY4hlQfF6SCWBedr8B7lvgzygqadmWy6xOjmcF27Y4HQ8VNIXsKP/vf81hxQhZRPigmyl2Q6+Kv4yJQzFhtJCXG9DZ/XzM+2aBmW5FA3ao4gNYRC8YTCXBG9GRLUqXmItTGMHXf4qawFuCbnk2oehjbOmIe+l2/ZjnPp9Zfe4kL6Gp31hvKAeot4jPoujsfYn6F3MEG4sYQ5XRz1Fn6IIlyXw6qNR2SA== 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=eT8yLpjaatWK/U2dbTB1S+fVmSKmysq4K5xg3woFccQ=; b=vKEC31l0Hb8wftk9mii9/RN2aUB0fGzauZd5VM4QCwuUmjNF7yA1CU0t6FtmzjhZJdRJANlAp5DuTYwjcTJv9Z26J4BFWHlOXHimdePfPvkq43T05w75YOPtgO+k1Nx6GdzZ1unQ6NNrURNk3Vla1rlfo4Cbm8nvdY9q7SWG1S0= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by GV1PR08MB8177.eurprd08.prod.outlook.com (2603:10a6:150:93::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.15; Mon, 31 Oct 2022 11:38:19 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::c57d:50c2:3502:a52]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::c57d:50c2:3502:a52%4]) with mapi id 15.20.5769.019; Mon, 31 Oct 2022 11:38:19 +0000 From: Tamar Christina To: Richard Biener CC: Richard Sandiford , nd , Tamar Christina via Gcc-patches , "juzhe.zhong@rivai.ai" Subject: RE: [PATCH]middle-end Add optimized float addsub without needing VEC_PERM_EXPR. Thread-Topic: [PATCH]middle-end Add optimized float addsub without needing VEC_PERM_EXPR. Thread-Index: AQHYgXABctzsum1rOEqzkjE/pN3Irq1UEC2AgADu/gCAAwfuwIAAL3eAgAABWoCAABOUDYCVBuAwgABB9ICAAAE88IAAD48QgASJLQCANwjtQA== Date: Mon, 31 Oct 2022 11:38:19 +0000 Message-ID: References: <1C4185AB-6EE6-4B8B-838C-465098DAFD3B@suse.de> <997q6no-qsqp-1oro-52sp-899sr075p4po@fhfr.qr> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ts-tracking-id: F0C6ADE0921C83468C98C7357689D057.0 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: VI1PR08MB5325:EE_|GV1PR08MB8177:EE_|DBAEUR03FT007:EE_|GV2PR08MB8749:EE_ X-MS-Office365-Filtering-Correlation-Id: e49ba024-f35f-414f-5b9b-08dabb346e0d 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: pYg7FMmUJtB0Qh6Jd1n+XizuJ4oB9CThUFKCo8Xk+BNAuIiey3l+BNS0971NIupwn9Buh+Ir5XZeWZthEptdVbwNL0VZqOB8a8NCvbyNK824GdKSeCwdwltZzXvdr+G121DnAutpThtIOwrJaXGIjTvrJIDvjjVwrju+dicE5xGMA7ooCXyjDlo04bkJbmoAM7evRzFt5PQ0K9XaxysYKVsZZxDX5kjWwtihaMnAA0TyxYQAHlOwbndzCkdPUFtg2x/JCnzy+UmuWJYhzFj4VsBCarKhhVdjLv4YaQcbR22bvN7+CRKLi7oFpXhO808JVtMO4iYubxJ/AZRy9qoK7AuReMjN7wLiM0h9RkfAbRP2f5FEhmNw6uxPrPmjqwo71AIc3CEvPsy50ZZQVH0ZZsPMCUdl3omqmQoik7rpXpkWCrw3Bleo4XYbpUC7bvEpvZ6jdtZkNBPih/6v7oEMlsPGMRfDmsYkq9X7aPv26uPeaaF2FWFCaj2SskbBNF0ghJLbaJ/BcvaKayfBXuEHMDq5iBOy0CzWr+54mWfjL1WeQ0TK6dSy3pqYxxBzimdA0myKPh9F2imuECCUt8tM2EAsDExNp4h8/RMAK5/CZ4kJQnDvTKJqDm/II7Yn8CEG62cK4g+TF2HsJhHPI1l0k519EcpA2kQ0u25vz2zSULQmGe9MH+h8EtDnnQFxPcQQnVKBFP1PGEyI1pi1NFhJ9r7MIGfWdPd88ywGJY1Mbf1Vtb4TCA2vzlyFrGyn22BFT0wDcrb9c4I/rgbr6SdRZdUhAHrRW5fC9+dWcFoSbNrSWH6bm6B2jZV2Qr342RWGz5XXxDAaLEXyFO8IePcju2z1zPDjpZa4omPjZ9baaGYmsr81w2yy6R9fcryNcC2P X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR08MB5325.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(346002)(366004)(376002)(136003)(396003)(39860400002)(451199015)(66556008)(66476007)(4326008)(66446008)(64756008)(71200400001)(76116006)(8676002)(316002)(5660300002)(6916009)(2906002)(41300700001)(66946007)(54906003)(55016003)(33656002)(122000001)(8936002)(52536014)(6506007)(99936003)(7696005)(9686003)(186003)(478600001)(26005)(83380400001)(38070700005)(86362001)(38100700002)(84970400001)(473944003);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB53252ECDBD8068F7D2E511A1FF379VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB8177 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: DBAEUR03FT007.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: b0212979-6a75-441c-5509-08dabb3468c9 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 9Ib91Xu9c+/iMTj5mqD9gqxQhMhIEzF4ou18HMbGk6AylFnj8+avkagaBdpUeC9jj0Nzt1T1x9bNdgMH/4Zvayv5wJD7v8oj/4eCdUhSFTYK6Eb77OdC7wNCp/i2N9KS8inVE9Cvyr9PpGDm166vW/6ONgbwiB7BGOuLt+SU+VfUl7Cki63zK0SNX7+2pyev0rYHYw9c73Ui5tAPQ90zdHbfQjjyu0m0XDmU2QrjLXZJI/qBm1h5D0mTjKPbsgVs4t0wRjWYv8Tw55o+fjgE9BVEo8cS1oE7YInmKUg45se/TAZAjD17HSOtoRgwCKR4NJ8OcQ6vx3QHFpDbFxQm851sOqoFj7JM6mxWSiXO0zpKYgXfgwIjLn28Iu1OFt/2p927zOPeQmpfX+V4c6eZvKxHxI+3lJpjCEZYrwEV9yGXEDfky40eVLT2lU23+d1lWRhuQkUAn0rK2Y1a4v0MQ7IpRfE36u8jGertZAAn6iB8mYm6d75P75E79Oy7pGAtOeDPrLKNyTkAG8ZOlngCx169R1X3vOAbTbSxoGWoqhQrKx1098323ejY4k24E7MlFnFy68nTw3+ndTlE7LW6QyWbhCD4FNbBbgOVxLFAjhv/DfS6mrgnzc38p9Zj/i5Z3+Q+KGFkBqD1aOkZRjw/sDqZ1X9Wg7kCrU1mSofN3J4rTkfhwyZfoHW6nGd8EHSwtiJdKK6bMOt51O66gVMA2Q4k35Lm5iwo64t9R10g5NiAYvjEG+9DUzYmcNpi3ATrTwYrEj48KlaBCkDpTHCNbUz3mRDpVMBAETSvymq7N9KnvzNfLkT4rN8SE5D8mc0NZ/NBkZVxWXfoK9Lsn+dpaa95VkORmbv7AcUOss6kNgfSs6bhG/S41VvjGM+TPzHN 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)(136003)(396003)(39860400002)(376002)(451199015)(40470700004)(36840700001)(46966006)(36860700001)(82740400003)(99936003)(6862004)(40480700001)(9686003)(41300700001)(7696005)(70206006)(52536014)(478600001)(107886003)(316002)(26005)(55016003)(70586007)(8676002)(4326008)(33656002)(8936002)(6506007)(54906003)(83380400001)(40460700003)(2906002)(235185007)(186003)(82310400005)(336012)(5660300002)(84970400001)(86362001)(47076005)(81166007)(356005)(473944003);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Oct 2022 11:38:28.5252 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e49ba024-f35f-414f-5b9b-08dabb346e0d 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: DBAEUR03FT007.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8749 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,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 List-Id: --_002_VI1PR08MB53252ECDBD8068F7D2E511A1FF379VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi All, This is a respin with all feedback addressed. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: * match.pd: Add fneg/fadd rule. gcc/testsuite/ChangeLog: * gcc.target/aarch64/simd/addsub_1.c: New test. * gcc.target/aarch64/sve/addsub_1.c: New test. --- inline copy of patch --- diff --git a/gcc/generic-match-head.cc b/gcc/generic-match-head.cc index cb0fbd32fa6fbea7b3c96462bf54abe891396fd6..aed4dcc8c3d718dcd4cb2da05cf= 9709a65cdde70 100644 --- a/gcc/generic-match-head.cc +++ b/gcc/generic-match-head.cc @@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see #include "dbgcnt.h" #include "tm.h" #include "tree-eh.h" +#include "langhooks.h" =20 /* Routine to determine if the types T1 and T2 are effectively the same for GENERIC. If T1 or T2 is not a type, the test diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc index 4c80d77f8ba23b9ce8b67913c2238ff65b291906..9986e3479f903d26446c795113a= 14c9cc3d4359e 100644 --- a/gcc/gimple-match-head.cc +++ b/gcc/gimple-match-head.cc @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see #include "dbgcnt.h" #include "tm.h" #include "gimple-range.h" +#include "langhooks.h" =20 /* Forward declarations of the private auto-generated matchers. They expect valueized operands in canonical order and do not diff --git a/gcc/match.pd b/gcc/match.pd index 1bb936fc4010f98f24bb97671350e8432c55b347..5e747352b413e6595ccbd20d781= 614d55abc372a 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -7916,6 +7916,65 @@ and, (simplify (reduc (op @0 VECTOR_CST@1)) (op (reduc:type @0) (reduc:type @1)))) =20 +/* Simplify vector floating point operations of alternating sub/add pairs + into using an fneg of a wider element type followed by a normal add. + under IEEE 754 the fneg of the wider type will negate every even entry + and when doing an add we get a sub of the even and add of every odd + elements. */ +(simplify + (vec_perm (plus:c @0 @1) (minus @0 @1) VECTOR_CST@2) + (if (!VECTOR_INTEGER_TYPE_P (type) + && !FLOAT_WORDS_BIG_ENDIAN) + (with + { + /* Build a vector of integers from the tree mask. */ + vec_perm_builder builder; + if (!tree_to_vec_perm_builder (&builder, @2)) + return NULL_TREE; + + /* Create a vec_perm_indices for the integer vector. */ + poly_uint64 nelts =3D TYPE_VECTOR_SUBPARTS (type); + vec_perm_indices sel (builder, 2, nelts); + } + (if (sel.series_p (0, 2, 0, 2)) + (with + { + machine_mode vec_mode =3D TYPE_MODE (type); + machine_mode wide_mode; + if (!GET_MODE_WIDER_MODE (vec_mode).exists (&wide_mode) + || !VECTOR_MODE_P (wide_mode) + || (GET_MODE_UNIT_BITSIZE (vec_mode) * 2 + !=3D GET_MODE_UNIT_BITSIZE (wide_mode))) + return NULL_TREE; + + tree stype =3D lang_hooks.types.type_for_mode (GET_MODE_INNER (wide= _mode), + TYPE_UNSIGNED (type)); + if (TYPE_MODE (stype) =3D=3D BLKmode) + return NULL_TREE; + tree ntype =3D build_vector_type_for_mode (stype, wide_mode); + if (!VECTOR_TYPE_P (ntype)) + return NULL_TREE; + + /* The format has to be a non-extended ieee format. */ + const struct real_format *fmt_old =3D FLOAT_MODE_FORMAT (vec_mode); + const struct real_format *fmt_new =3D FLOAT_MODE_FORMAT (wide_mode)= ; + if (fmt_old =3D=3D NULL || fmt_new =3D=3D NULL) + return NULL_TREE; + + /* If the target doesn't support v1xx vectors, try using scalar mod= e xx + instead. */ + if (known_eq (GET_MODE_NUNITS (wide_mode), 1) + && !target_supports_op_p (ntype, NEGATE_EXPR, optab_vector)) + ntype =3D stype; + } + (if (fmt_new->signbit_rw + =3D=3D fmt_old->signbit_rw + GET_MODE_UNIT_BITSIZE (vec_mode) + && fmt_new->signbit_rw =3D=3D fmt_new->signbit_ro + && targetm.can_change_mode_class (TYPE_MODE (ntype), TYPE_MODE (type), = ALL_REGS) + && ((optimize_vectors_before_lowering_p () && VECTOR_TYPE_P (ntype)) + || target_supports_op_p (ntype, NEGATE_EXPR, optab_vector))) + (plus (view_convert:type (negate (view_convert:ntype @1))) @0))))))) + (simplify (vec_perm @0 @1 VECTOR_CST@2) (with diff --git a/gcc/testsuite/gcc.target/aarch64/simd/addsub_1.c b/gcc/testsui= te/gcc.target/aarch64/simd/addsub_1.c new file mode 100644 index 0000000000000000000000000000000000000000..1fb91a34c421bbd2894faa0dbbf= 1b47ad43310c4 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/simd/addsub_1.c @@ -0,0 +1,56 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_v8_2a_fp16_neon_ok } */ +/* { dg-options "-Ofast" } */ +/* { dg-add-options arm_v8_2a_fp16_neon } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +#pragma GCC target "+nosve" + +/*=20 +** f1: +** ... +** fneg v[0-9]+.2d, v[0-9]+.2d +** fadd v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s +** ... +*/ +void f1 (float *restrict a, float *restrict b, float *res, int n) +{ + for (int i =3D 0; i < (n & -4); i+=3D2) + { + res[i+0] =3D a[i+0] + b[i+0]; + res[i+1] =3D a[i+1] - b[i+1]; + } +} + +/*=20 +** d1: +** ... +** fneg v[0-9]+.4s, v[0-9]+.4s +** fadd v[0-9]+.8h, v[0-9]+.8h, v[0-9]+.8h +** ... +*/ +void d1 (_Float16 *restrict a, _Float16 *restrict b, _Float16 *res, int n) +{ + for (int i =3D 0; i < (n & -8); i+=3D2) + { + res[i+0] =3D a[i+0] + b[i+0]; + res[i+1] =3D a[i+1] - b[i+1]; + } +} + +/*=20 +** e1: +** ... +** fadd v[0-9]+.2d, v[0-9]+.2d, v[0-9]+.2d +** fsub v[0-9]+.2d, v[0-9]+.2d, v[0-9]+.2d +** ins v[0-9]+.d\[1\], v[0-9]+.d\[1\] +** ... +*/ +void e1 (double *restrict a, double *restrict b, double *res, int n) +{ + for (int i =3D 0; i < (n & -4); i+=3D2) + { + res[i+0] =3D a[i+0] + b[i+0]; + res[i+1] =3D a[i+1] - b[i+1]; + } +} diff --git a/gcc/testsuite/gcc.target/aarch64/sve/addsub_1.c b/gcc/testsuit= e/gcc.target/aarch64/sve/addsub_1.c new file mode 100644 index 0000000000000000000000000000000000000000..ea7f9d9db2c8c9a3efe5c7951a3= 14a29b7a7a922 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/addsub_1.c @@ -0,0 +1,52 @@ +/* { dg-do compile } */ +/* { dg-options "-Ofast" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +/* +** f1: +** ... +** fneg z[0-9]+.d, p[0-9]+/m, z[0-9]+.d +** fadd z[0-9]+.s, z[0-9]+.s, z[0-9]+.s +** ... +*/ +void f1 (float *restrict a, float *restrict b, float *res, int n) +{ + for (int i =3D 0; i < (n & -4); i+=3D2) + { + res[i+0] =3D a[i+0] + b[i+0]; + res[i+1] =3D a[i+1] - b[i+1]; + } +} + +/*=20 +** d1: +** ... +** fneg z[0-9]+.s, p[0-9]+/m, z[0-9]+.s +** fadd z[0-9]+.h, z[0-9]+.h, z[0-9]+.h +** ... +*/=20 +void d1 (_Float16 *restrict a, _Float16 *restrict b, _Float16 *res, int n) +{ + for (int i =3D 0; i < (n & -8); i+=3D2) + { + res[i+0] =3D a[i+0] + b[i+0]; + res[i+1] =3D a[i+1] - b[i+1]; + } +} + +/* +** e1: +** ... +** fsub z[0-9]+.d, z[0-9]+.d, z[0-9]+.d +** movprfx z[0-9]+.d, p[0-9]+/m, z[0-9]+.d +** fadd z[0-9]+.d, p[0-9]+/m, z[0-9]+.d, z[0-9]+.d +** ... +*/ +void e1 (double *restrict a, double *restrict b, double *res, int n) +{ + for (int i =3D 0; i < (n & -4); i+=3D2) + { + res[i+0] =3D a[i+0] + b[i+0]; + res[i+1] =3D a[i+1] - b[i+1]; + } +} --_002_VI1PR08MB53252ECDBD8068F7D2E511A1FF379VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb15819.patch" Content-Description: rb15819.patch Content-Disposition: attachment; filename="rb15819.patch"; size=6827; creation-date="Mon, 31 Oct 2022 11:37:38 GMT"; modification-date="Mon, 31 Oct 2022 11:38:19 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9nZW5lcmljLW1hdGNoLWhlYWQuY2MgYi9nY2MvZ2VuZXJpYy1tYXRj aC1oZWFkLmNjCmluZGV4IGNiMGZiZDMyZmE2ZmJlYTdiM2M5NjQ2MmJmNTRhYmU4OTEzOTZmZDYu LmFlZDRkY2M4YzNkNzE4ZGNkNGNiMmRhMDVjZjk3MDlhNjVjZGRlNzAgMTAwNjQ0Ci0tLSBhL2dj Yy9nZW5lcmljLW1hdGNoLWhlYWQuY2MKKysrIGIvZ2NjL2dlbmVyaWMtbWF0Y2gtaGVhZC5jYwpA QCAtMzksNiArMzksNyBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAg SWYgbm90IHNlZQogI2luY2x1ZGUgImRiZ2NudC5oIgogI2luY2x1ZGUgInRtLmgiCiAjaW5jbHVk ZSAidHJlZS1laC5oIgorI2luY2x1ZGUgImxhbmdob29rcy5oIgogCiAvKiBSb3V0aW5lIHRvIGRl dGVybWluZSBpZiB0aGUgdHlwZXMgVDEgYW5kIFQyIGFyZSBlZmZlY3RpdmVseQogICAgdGhlIHNh bWUgZm9yIEdFTkVSSUMuICBJZiBUMSBvciBUMiBpcyBub3QgYSB0eXBlLCB0aGUgdGVzdApkaWZm IC0tZ2l0IGEvZ2NjL2dpbXBsZS1tYXRjaC1oZWFkLmNjIGIvZ2NjL2dpbXBsZS1tYXRjaC1oZWFk LmNjCmluZGV4IDRjODBkNzdmOGJhMjNiOWNlOGI2NzkxM2MyMjM4ZmY2NWIyOTE5MDYuLjk5ODZl MzQ3OWY5MDNkMjY0NDZjNzk1MTEzYTE0YzljYzNkNDM1OWUgMTAwNjQ0Ci0tLSBhL2djYy9naW1w bGUtbWF0Y2gtaGVhZC5jYworKysgYi9nY2MvZ2ltcGxlLW1hdGNoLWhlYWQuY2MKQEAgLTQ2LDYg KzQ2LDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBz ZWUKICNpbmNsdWRlICJkYmdjbnQuaCIKICNpbmNsdWRlICJ0bS5oIgogI2luY2x1ZGUgImdpbXBs ZS1yYW5nZS5oIgorI2luY2x1ZGUgImxhbmdob29rcy5oIgogCiAvKiBGb3J3YXJkIGRlY2xhcmF0 aW9ucyBvZiB0aGUgcHJpdmF0ZSBhdXRvLWdlbmVyYXRlZCBtYXRjaGVycy4KICAgIFRoZXkgZXhw ZWN0IHZhbHVlaXplZCBvcGVyYW5kcyBpbiBjYW5vbmljYWwgb3JkZXIgYW5kIGRvIG5vdApkaWZm IC0tZ2l0IGEvZ2NjL21hdGNoLnBkIGIvZ2NjL21hdGNoLnBkCmluZGV4IDFiYjkzNmZjNDAxMGY5 OGYyNGJiOTc2NzEzNTBlODQzMmM1NWIzNDcuLjVlNzQ3MzUyYjQxM2U2NTk1Y2NiZDIwZDc4MTYx NGQ1NWFiYzM3MmEgMTAwNjQ0Ci0tLSBhL2djYy9tYXRjaC5wZAorKysgYi9nY2MvbWF0Y2gucGQK QEAgLTc5MTYsNiArNzkxNiw2NSBAQCBhbmQsCiAgIChzaW1wbGlmeSAocmVkdWMgKG9wIEAwIFZF Q1RPUl9DU1RAMSkpCiAgICAgKG9wIChyZWR1Yzp0eXBlIEAwKSAocmVkdWM6dHlwZSBAMSkpKSkK IAorLyogU2ltcGxpZnkgdmVjdG9yIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgb2YgYWx0ZXJu YXRpbmcgc3ViL2FkZCBwYWlycworICAgaW50byB1c2luZyBhbiBmbmVnIG9mIGEgd2lkZXIgZWxl bWVudCB0eXBlIGZvbGxvd2VkIGJ5IGEgbm9ybWFsIGFkZC4KKyAgIHVuZGVyIElFRUUgNzU0IHRo ZSBmbmVnIG9mIHRoZSB3aWRlciB0eXBlIHdpbGwgbmVnYXRlIGV2ZXJ5IGV2ZW4gZW50cnkKKyAg IGFuZCB3aGVuIGRvaW5nIGFuIGFkZCB3ZSBnZXQgYSBzdWIgb2YgdGhlIGV2ZW4gYW5kIGFkZCBv ZiBldmVyeSBvZGQKKyAgIGVsZW1lbnRzLiAgKi8KKyhzaW1wbGlmeQorICh2ZWNfcGVybSAocGx1 czpjIEAwIEAxKSAobWludXMgQDAgQDEpIFZFQ1RPUl9DU1RAMikKKyAoaWYgKCFWRUNUT1JfSU5U RUdFUl9UWVBFX1AgKHR5cGUpCisgICAgICAmJiAhRkxPQVRfV09SRFNfQklHX0VORElBTikKKyAg KHdpdGgKKyAgIHsKKyAgICAgLyogQnVpbGQgYSB2ZWN0b3Igb2YgaW50ZWdlcnMgZnJvbSB0aGUg dHJlZSBtYXNrLiAgKi8KKyAgICAgdmVjX3Blcm1fYnVpbGRlciBidWlsZGVyOworICAgICBpZiAo IXRyZWVfdG9fdmVjX3Blcm1fYnVpbGRlciAoJmJ1aWxkZXIsIEAyKSkKKyAgICAgICByZXR1cm4g TlVMTF9UUkVFOworCisgICAgIC8qIENyZWF0ZSBhIHZlY19wZXJtX2luZGljZXMgZm9yIHRoZSBp bnRlZ2VyIHZlY3Rvci4gICovCisgICAgIHBvbHlfdWludDY0IG5lbHRzID0gVFlQRV9WRUNUT1Jf U1VCUEFSVFMgKHR5cGUpOworICAgICB2ZWNfcGVybV9pbmRpY2VzIHNlbCAoYnVpbGRlciwgMiwg bmVsdHMpOworICAgfQorICAgKGlmIChzZWwuc2VyaWVzX3AgKDAsIDIsIDAsIDIpKQorICAgICh3 aXRoCisgICAgIHsKKyAgICAgICBtYWNoaW5lX21vZGUgdmVjX21vZGUgPSBUWVBFX01PREUgKHR5 cGUpOworICAgICAgIG1hY2hpbmVfbW9kZSB3aWRlX21vZGU7CisgICAgICAgaWYgKCFHRVRfTU9E RV9XSURFUl9NT0RFICh2ZWNfbW9kZSkuZXhpc3RzICgmd2lkZV9tb2RlKQorCSAgIHx8ICFWRUNU T1JfTU9ERV9QICh3aWRlX21vZGUpCisJICAgfHwgKEdFVF9NT0RFX1VOSVRfQklUU0laRSAodmVj X21vZGUpICogMgorCQkhPSBHRVRfTU9ERV9VTklUX0JJVFNJWkUgKHdpZGVfbW9kZSkpKQorCSBy ZXR1cm4gTlVMTF9UUkVFOworCisgICAgICAgdHJlZSBzdHlwZSA9IGxhbmdfaG9va3MudHlwZXMu dHlwZV9mb3JfbW9kZSAoR0VUX01PREVfSU5ORVIgKHdpZGVfbW9kZSksCisJCQkJCQkgICAgVFlQ RV9VTlNJR05FRCAodHlwZSkpOworICAgICAgIGlmIChUWVBFX01PREUgKHN0eXBlKSA9PSBCTEtt b2RlKQorCSByZXR1cm4gTlVMTF9UUkVFOworICAgICAgIHRyZWUgbnR5cGUgPSBidWlsZF92ZWN0 b3JfdHlwZV9mb3JfbW9kZSAoc3R5cGUsIHdpZGVfbW9kZSk7CisgICAgICAgaWYgKCFWRUNUT1Jf VFlQRV9QIChudHlwZSkpCisJIHJldHVybiBOVUxMX1RSRUU7CisKKyAgICAgICAvKiBUaGUgZm9y bWF0IGhhcyB0byBiZSBhIG5vbi1leHRlbmRlZCBpZWVlIGZvcm1hdC4gICovCisgICAgICAgY29u c3Qgc3RydWN0IHJlYWxfZm9ybWF0ICpmbXRfb2xkID0gRkxPQVRfTU9ERV9GT1JNQVQgKHZlY19t b2RlKTsKKyAgICAgICBjb25zdCBzdHJ1Y3QgcmVhbF9mb3JtYXQgKmZtdF9uZXcgPSBGTE9BVF9N T0RFX0ZPUk1BVCAod2lkZV9tb2RlKTsKKyAgICAgICBpZiAoZm10X29sZCA9PSBOVUxMIHx8IGZt dF9uZXcgPT0gTlVMTCkKKwkgcmV0dXJuIE5VTExfVFJFRTsKKworICAgICAgIC8qIElmIHRoZSB0 YXJnZXQgZG9lc24ndCBzdXBwb3J0IHYxeHggdmVjdG9ycywgdHJ5IHVzaW5nIHNjYWxhciBtb2Rl IHh4CisJICBpbnN0ZWFkLiAgKi8KKyAgICAgICBpZiAoa25vd25fZXEgKEdFVF9NT0RFX05VTklU UyAod2lkZV9tb2RlKSwgMSkKKwkgICAmJiAhdGFyZ2V0X3N1cHBvcnRzX29wX3AgKG50eXBlLCBO RUdBVEVfRVhQUiwgb3B0YWJfdmVjdG9yKSkKKwkgbnR5cGUgPSBzdHlwZTsKKyAgICAgfQorICAg ICAoaWYgKGZtdF9uZXctPnNpZ25iaXRfcncKKwkgICAgID09IGZtdF9vbGQtPnNpZ25iaXRfcncg KyBHRVRfTU9ERV9VTklUX0JJVFNJWkUgKHZlY19tb2RlKQorCSAgJiYgZm10X25ldy0+c2lnbmJp dF9ydyA9PSBmbXRfbmV3LT5zaWduYml0X3JvCisJICAmJiB0YXJnZXRtLmNhbl9jaGFuZ2VfbW9k ZV9jbGFzcyAoVFlQRV9NT0RFIChudHlwZSksIFRZUEVfTU9ERSAodHlwZSksIEFMTF9SRUdTKQor CSAgJiYgKChvcHRpbWl6ZV92ZWN0b3JzX2JlZm9yZV9sb3dlcmluZ19wICgpICYmIFZFQ1RPUl9U WVBFX1AgKG50eXBlKSkKKwkgICAgICB8fCB0YXJnZXRfc3VwcG9ydHNfb3BfcCAobnR5cGUsIE5F R0FURV9FWFBSLCBvcHRhYl92ZWN0b3IpKSkKKyAgICAgIChwbHVzICh2aWV3X2NvbnZlcnQ6dHlw ZSAobmVnYXRlICh2aWV3X2NvbnZlcnQ6bnR5cGUgQDEpKSkgQDApKSkpKSkpCisKIChzaW1wbGlm eQogICh2ZWNfcGVybSBAMCBAMSBWRUNUT1JfQ1NUQDIpCiAgKHdpdGgKZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hYXJjaDY0L3NpbWQvYWRkc3ViXzEuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9hYXJjaDY0L3NpbWQvYWRkc3ViXzEuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xZmI5 MWEzNGM0MjFiYmQyODk0ZmFhMGRiYmYxYjQ3YWQ0MzMxMGM0Ci0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvc2ltZC9hZGRzdWJfMS5jCkBAIC0wLDAg KzEsNTYgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0 aXZlLXRhcmdldCBhcm1fdjhfMmFfZnAxNl9uZW9uX29rIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LU9mYXN0IiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8yYV9mcDE2X25lb24gfSAq LworLyogeyBkZy1maW5hbCB7IGNoZWNrLWZ1bmN0aW9uLWJvZGllcyAiKioiICIiICIiIHsgdGFy Z2V0IHsgbGUgfSB9IH0gfSAqLworCisjcHJhZ21hIEdDQyB0YXJnZXQgIitub3N2ZSIKKworLyog CisqKiBmMToKKyoqIC4uLgorKioJZm5lZwl2WzAtOV0rLjJkLCB2WzAtOV0rLjJkCisqKglmYWRk CXZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMKKyoqIC4uLgorKi8KK3ZvaWQgZjEg KGZsb2F0ICpyZXN0cmljdCBhLCBmbG9hdCAqcmVzdHJpY3QgYiwgZmxvYXQgKnJlcywgaW50IG4p Cit7CisgICBmb3IgKGludCBpID0gMDsgaSA8IChuICYgLTQpOyBpKz0yKQorICAgIHsKKyAgICAg IHJlc1tpKzBdID0gYVtpKzBdICsgYltpKzBdOworICAgICAgcmVzW2krMV0gPSBhW2krMV0gLSBi W2krMV07CisgICAgfQorfQorCisvKiAKKyoqIGQxOgorKiogLi4uCisqKiAJZm5lZwl2WzAtOV0r LjRzLCB2WzAtOV0rLjRzCisqKiAJZmFkZAl2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0r LjhoCisqKiAuLi4KKyovCit2b2lkIGQxIChfRmxvYXQxNiAqcmVzdHJpY3QgYSwgX0Zsb2F0MTYg KnJlc3RyaWN0IGIsIF9GbG9hdDE2ICpyZXMsIGludCBuKQoreworICAgZm9yIChpbnQgaSA9IDA7 IGkgPCAobiAmIC04KTsgaSs9MikKKyAgICB7CisgICAgICByZXNbaSswXSA9IGFbaSswXSArIGJb aSswXTsKKyAgICAgIHJlc1tpKzFdID0gYVtpKzFdIC0gYltpKzFdOworICAgIH0KK30KKworLyog CisqKiBlMToKKyoqIC4uLgorKiogCWZhZGQJdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTld Ky4yZAorKiogCWZzdWIJdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZAorKiogCWlu cwl2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFsxXF0KKyoqIC4uLgorKi8KK3ZvaWQgZTEgKGRv dWJsZSAqcmVzdHJpY3QgYSwgZG91YmxlICpyZXN0cmljdCBiLCBkb3VibGUgKnJlcywgaW50IG4p Cit7CisgICBmb3IgKGludCBpID0gMDsgaSA8IChuICYgLTQpOyBpKz0yKQorICAgIHsKKyAgICAg IHJlc1tpKzBdID0gYVtpKzBdICsgYltpKzBdOworICAgICAgcmVzW2krMV0gPSBhW2krMV0gLSBi W2krMV07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2Fh cmNoNjQvc3ZlL2FkZHN1Yl8xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9z dmUvYWRkc3ViXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lYTdmOWQ5ZGIyYzhjOWEzZWZlNWM3OTUxYTMxNGEy OWI3YTdhOTIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2Fh cmNoNjQvc3ZlL2FkZHN1Yl8xLmMKQEAgLTAsMCArMSw1MiBAQAorLyogeyBkZy1kbyBjb21waWxl IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU9mYXN0IiB9ICovCisvKiB7IGRnLWZpbmFsIHsgY2hl Y2stZnVuY3Rpb24tYm9kaWVzICIqKiIgIiIgIiIgeyB0YXJnZXQgeyBsZSB9IH0gfSB9ICovCisK Ky8qCisqKiBmMToKKyoqIC4uLgorKiogCWZuZWcJelswLTldKy5kLCBwWzAtOV0rL20sIHpbMC05 XSsuZAorKiogCWZhZGQJelswLTldKy5zLCB6WzAtOV0rLnMsIHpbMC05XSsucworKiogLi4uCisq Lwordm9pZCBmMSAoZmxvYXQgKnJlc3RyaWN0IGEsIGZsb2F0ICpyZXN0cmljdCBiLCBmbG9hdCAq cmVzLCBpbnQgbikKK3sKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgKG4gJiAtNCk7IGkrPTIpCisg ICAgeworICAgICAgcmVzW2krMF0gPSBhW2krMF0gKyBiW2krMF07CisgICAgICByZXNbaSsxXSA9 IGFbaSsxXSAtIGJbaSsxXTsKKyAgICB9Cit9CisKKy8qIAorKiogZDE6CisqKiAuLi4KKyoqIAlm bmVnCXpbMC05XSsucywgcFswLTldKy9tLCB6WzAtOV0rLnMKKyoqIAlmYWRkCXpbMC05XSsuaCwg elswLTldKy5oLCB6WzAtOV0rLmgKKyoqIC4uLgorKi8gCit2b2lkIGQxIChfRmxvYXQxNiAqcmVz dHJpY3QgYSwgX0Zsb2F0MTYgKnJlc3RyaWN0IGIsIF9GbG9hdDE2ICpyZXMsIGludCBuKQorewor ICAgZm9yIChpbnQgaSA9IDA7IGkgPCAobiAmIC04KTsgaSs9MikKKyAgICB7CisgICAgICByZXNb aSswXSA9IGFbaSswXSArIGJbaSswXTsKKyAgICAgIHJlc1tpKzFdID0gYVtpKzFdIC0gYltpKzFd OworICAgIH0KK30KKworLyoKKyoqIGUxOgorKiogLi4uCisqKiAJZnN1Ygl6WzAtOV0rLmQsIHpb MC05XSsuZCwgelswLTldKy5kCisqKiAJbW92cHJmeAl6WzAtOV0rLmQsIHBbMC05XSsvbSwgelsw LTldKy5kCisqKiAJZmFkZAl6WzAtOV0rLmQsIHBbMC05XSsvbSwgelswLTldKy5kLCB6WzAtOV0r LmQKKyoqIC4uLgorKi8KK3ZvaWQgZTEgKGRvdWJsZSAqcmVzdHJpY3QgYSwgZG91YmxlICpyZXN0 cmljdCBiLCBkb3VibGUgKnJlcywgaW50IG4pCit7CisgICBmb3IgKGludCBpID0gMDsgaSA8IChu ICYgLTQpOyBpKz0yKQorICAgIHsKKyAgICAgIHJlc1tpKzBdID0gYVtpKzBdICsgYltpKzBdOwor ICAgICAgcmVzW2krMV0gPSBhW2krMV0gLSBiW2krMV07CisgICAgfQorfQo= --_002_VI1PR08MB53252ECDBD8068F7D2E511A1FF379VI1PR08MB5325eurp_--