From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on2048.outbound.protection.outlook.com [40.107.6.48]) by sourceware.org (Postfix) with ESMTPS id B75663858CDB for ; Thu, 18 May 2023 11:14:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B75663858CDB Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=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=6FYbtnnsL9sQ25EV+93iJwiaI6U+tfaSaC0WE1aoHic=; b=Fm1ZmPASJrh79VK/EM6l9HyLbfzlmPprp3Lf7/KJwcMap9MoHHXMZapSYRTUXWW4n64auAL9TfwEUstNgtMLZK/671E3iT4MlWqJHNjOien2JyMN2uFIUoFuK7yJYZT27J0wqTocWQpZOkhsohp1oSv2A9qD6yghULHHL/IOEzs= Received: from AS9PR06CA0323.eurprd06.prod.outlook.com (2603:10a6:20b:45b::19) by AS8PR08MB6598.eurprd08.prod.outlook.com (2603:10a6:20b:336::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6411.18; Thu, 18 May 2023 11:14:17 +0000 Received: from AM7EUR03FT009.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:45b:cafe::23) by AS9PR06CA0323.outlook.office365.com (2603:10a6:20b:45b::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6411.19 via Frontend Transport; Thu, 18 May 2023 11:14:17 +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 AM7EUR03FT009.mail.protection.outlook.com (100.127.140.130) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6411.19 via Frontend Transport; Thu, 18 May 2023 11:14:17 +0000 Received: ("Tessian outbound e13c2446394c:v136"); Thu, 18 May 2023 11:14:16 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: f84b1781b1a410b7 X-CR-MTA-TID: 64aa7808 Received: from 9ba1670d8854.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id F232D72B-DCC8-43D9-AC33-BA956A04B672.1; Thu, 18 May 2023 11:14:10 +0000 Received: from EUR01-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 9ba1670d8854.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 18 May 2023 11:14:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NlccB+d/MDACYF3++pa1qeDKS1wFi5jCA6/KptT8Vbt6gqCGaAYWB2bswMicTRfZv5ejMd5j2QC4ukcIWLERCzqFFdm5mIJ7/3OY2DqaErGQzQkcwSy+W3P9sJmCPMKZXP8GIv1IHVPukoTGVGpNTmjoAu6X6NC87B5gN4n6AD7ZeS87ymUAODCEOMcZJCRME/lYOyKTT/K/XNPS7qwZR5jF2wwPHjk5gD7JQa9HFkGatt3Zu53snLjfYYDB6GSTyaYrBvYhYhsgbGJqIUHTt/Pps5LxPMMSSMPgz51N15Yew7zocA0SK0cCtv59cEIVhwOmLDvzmJ7BY+7MgKa/3A== 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=6FYbtnnsL9sQ25EV+93iJwiaI6U+tfaSaC0WE1aoHic=; b=H0rsZ111BtheZlcyugJ5fAjqPxLp7znCmCSeu30XeJrzrzkcon+RROAN0CiFZ850SCKKY4YCDCcZR/bJhakYZlnfNipUsWZpF7UXc2xtutU3wr/nww8atcInkTo693YioElHtlchgowpqISg1A2LRN//rUYvegZo8s7Cs1N4XJPEsLHoQVQCb8stFIEQDIkRbPjnWBBBmmK8Fc8CLTd5zAvIrgn94eN0v9GkiA5y5PRDZEjxLGqkco0Ij5gesoKu3Y1fcWlN9Ic3Pf2hPflMAtqwTJU5RAo2Ygldg2zidGF3MhyRWDlANTn12bLkF1wpLSR1NUmZtxaVL6R5A56n/g== 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=6FYbtnnsL9sQ25EV+93iJwiaI6U+tfaSaC0WE1aoHic=; b=Fm1ZmPASJrh79VK/EM6l9HyLbfzlmPprp3Lf7/KJwcMap9MoHHXMZapSYRTUXWW4n64auAL9TfwEUstNgtMLZK/671E3iT4MlWqJHNjOien2JyMN2uFIUoFuK7yJYZT27J0wqTocWQpZOkhsohp1oSv2A9qD6yghULHHL/IOEzs= Received: from PAXPR08MB6926.eurprd08.prod.outlook.com (2603:10a6:102:138::24) by AM8PR08MB6594.eurprd08.prod.outlook.com (2603:10a6:20b:36a::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6411.17; Thu, 18 May 2023 11:14:05 +0000 Received: from PAXPR08MB6926.eurprd08.prod.outlook.com ([fe80::db73:66ba:ae70:1ff1]) by PAXPR08MB6926.eurprd08.prod.outlook.com ([fe80::db73:66ba:ae70:1ff1%3]) with mapi id 15.20.6411.019; Thu, 18 May 2023 11:14:05 +0000 From: Kyrylo Tkachov To: "gcc-patches@gcc.gnu.org" CC: Richard Sandiford Subject: [PATCH] aarch64: Implement vector FP absolute compare intrinsics with builtins Thread-Topic: [PATCH] aarch64: Implement vector FP absolute compare intrinsics with builtins Thread-Index: AdmJeZhBpCEmbHDYSNqm1K/pSruhiQ== Date: Thu, 18 May 2023 11:14:05 +0000 Message-ID: Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: PAXPR08MB6926:EE_|AM8PR08MB6594:EE_|AM7EUR03FT009:EE_|AS8PR08MB6598:EE_ X-MS-Office365-Filtering-Correlation-Id: d17e6c16-dcba-4665-45fa-08db57910528 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: 9++SG2ghgzffN3dDwydhkgPzsISSyEaDfGPEMwMuibZdi6j8qO0lDRnDhiDfk1rj2xHrZvxOi4MeG5/4BI1+NBuwhgDqri4pPkQr+jpERlcDT8buZ1o1UtxkoDXWLxCFPUjhKiHOhcunj3905sZ8b/CQXh9feeAlLAaTXhVdH8wxXS4WKukX5pffFM+4qLdzvuUOujdumxshs6DoZUa6/PX7ceQeAj6L4VMlhqsbo1A73lgBMq/VBsHntmTF1XmQU8eKtpuhmIemf6YzwrvgvlIdRk5ZFVAHNpYdyvsAil3/erJQd8XCo0ndtxvoZ0ChbonpItimZlMCJK85LhlJmRhVGZSyAo/TfapsPg4qAMTKvVyr0SYFweYAZn++9jGp5ukaaEgMvC8hbm2EC30wDVomTIb3202q9PNVB/pvDwHd0YtpgMH5HowfhZYW0rGaWgOLk8vAN92WyuU4Y+4ygep9UrP1Fgcn22QR5NKoN3N3KysDrSbzjpxAOhhGbjSL3LwHnQaWHA40+NAGApsJcCBnVdr3QgERTKg4hRR+MlCy0G9PU+sU0nS2DTUUwR4hlNsRYhyZHNQxsRmb+BRAUogamoiSus+HlAieSNj4/IY= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR08MB6926.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(396003)(136003)(39860400002)(366004)(376002)(346002)(451199021)(8936002)(52536014)(5660300002)(99936003)(186003)(9686003)(26005)(6506007)(86362001)(122000001)(38070700005)(38100700002)(7696005)(8676002)(41300700001)(55016003)(71200400001)(33656002)(6916009)(316002)(66446008)(76116006)(66476007)(478600001)(4326008)(66556008)(64756008)(66946007)(2906002)(84970400001);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_PAXPR08MB69263B757BCFF5E1C32AF8B2937F9PAXPR08MB6926eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB6594 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: AM7EUR03FT009.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 42b2b2c5-6aaf-4a15-69ed-08db5790fdf8 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: sbwsEwPHkTj52tKRIDLATzw6pVyn9RWXrlZo9GTE1MKWM/Dfmruv5WtVefbyBpgYj7TSrMreucUS1jB6radjiOaU59SOGw59PZWqejD2OWeqo4TX1dEI/zovYXyUSp/yz0tTyy36EI9fFHwVtJNvwPXyYphe8nobA9ddvRCZHA+11oYxY4Ovj/bCwKrjbpgAJhYV/1EOEm54b0no7ZJdzFqoI6TNBR0jktLNjf53Abgpa/+1w78kFBoIkNoejI/HeWFQQs8Sws69s51KUCJepZJPDyK6ZztaudPSYjIK3TndPIVclwJzK7XRoalhd4p51nbhaHFr72w99bnrvXJaz1LRdXOhQb6kHCUvcMboEzp9wTs8m25F9ln/MUHWiRa61ZoqvID4fGtCMbPWokMfyAovW5wxg1kNpcRTViFtU39NAvab0KNCAOPYeMnEMdXrUrKLzyg3md35SlmV4eVFBqKWD71w5nhbEsHgqA7qkf2KaLcD3L916RwkMREdl3v2R6rcEuEaSMzLlsAF7zZJ7DK9Xnioe6/Qzg15rDsbMehI6g3sEkpFt8n5iVu2b8vJMlw6g1HKc131dSrieP+1fDAevsmIljYZic5SjzlKXsq1lsxoYJwii5CluF0q6QjAjzYWeSqzGRq1FKKwJ+Gmsp6sb+WHz3CbxPA6NKBidNqHKyJUBfhzlyRkMpBqUl3E8SDOKlMF5aDXMXEsqFhXcXKIGucdln+LBUgQuLBLNHg= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230028)(4636009)(396003)(376002)(346002)(136003)(39860400002)(451199021)(40470700004)(36840700001)(46966006)(7696005)(40480700001)(70206006)(6916009)(4326008)(70586007)(316002)(478600001)(40460700003)(47076005)(6506007)(26005)(186003)(9686003)(55016003)(336012)(52536014)(8676002)(8936002)(5660300002)(41300700001)(82310400005)(2906002)(235185007)(99936003)(356005)(81166007)(86362001)(82740400003)(33656002)(84970400001)(36860700001);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 May 2023 11:14:17.0832 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d17e6c16-dcba-4665-45fa-08db57910528 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: AM7EUR03FT009.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB6598 X-Spam-Status: No, score=-5.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,KAM_DMARC_NONE,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --_002_PAXPR08MB69263B757BCFF5E1C32AF8B2937F9PAXPR08MB6926eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi all, While optimising some vector math library code with intrinsics we stumbled = upon the issue in the testcase. The compiler should be generating a FACGT instruction but instead we genera= te: foo(__Float32x4_t, __Float32x4_t, __Float32x4_t): fabs v0.4s, v0.4s adrp x0, .LC0 ldr q31, [x0, #:lo12:.LC0] fcmgt v0.4s, v0.4s, v31.4s ret This is because the vcagtq_f32 intrinsic is open-coded in arm_neon.h as return vabsq_f32 (__a) > vabsq_f32 (__b) thus relying on the optimisers to merge it back together. But since one of = the arms of the comparison is a vector constant the combine pass optimises the abs into it and tries m= atching: (set (reg:V4SI 101) (neg:V4SI (gt:V4SI (reg:V4SF 100) (const_vector:V4SF [ (const_double:SF 1.0e+2 [0x0.c8p+7]) repeated x4 ])))) and (set (reg:V4SI 101) (neg:V4SI (gt:V4SI (abs:V4SF (reg:V4SF 104)) (reg:V4SF 103)))) instead of what we want: (insn 13 9 14 2 (set (reg/i:V4SI 32 v0) (neg:V4SI (gt:V4SI (abs:V4SF (reg:V4SF 98)) (abs:V4SF (reg:V4SF 96))))) I don't really see a good way around that with our current implementation o= f these intrinsics. Therefore this patch reimplements these intrinsics with aarch64 builtins th= at generate the RTL for these instructions directly. Apparently we already had them defined in aarch64-si= md-builtins.def and have been using them for the fp16 case already. I realise that this approach is against the general principle of expressing= intrinsics in the higher-level constructs, so I'm willing to listen to counter-arguments. That said, the FACGT/FACGE instructions are as fast as the non-ABS comparis= on instructions on all microarchitectures that I know of so it should always be a win to have them in the merged form rather than sp= lit the fabs step separately or try to hoist it. And the testcase does come from real library code that we're trying to opti= mise. With this patch for the testcase we generate: foo: adrp x0, .LC0 ldr q31, [x0, #:lo12:.LC0] facgt v0.4s, v0.4s, v31.4s ret Bootstrapped and tested on aarch64-none-linux-gnu. I'll hold off on committing this to give folks a few days to comment, but w= ill push by the end of next week if there are no objections. Thanks, Kyrill gcc/ChangeLog: * config/aarch64/arm_neon.h (vcage_f64): Reimplement with builtins. (vcage_f32): Likewise. (vcages_f32): Likewise. (vcageq_f32): Likewise. (vcaged_f64): Likewise. (vcageq_f64): Likewise. (vcagts_f32): Likewise. (vcagt_f32): Likewise. (vcagt_f64): Likewise. (vcagtq_f32): Likewise. (vcagtd_f64): Likewise. (vcagtq_f64): Likewise. (vcale_f32): Likewise. (vcale_f64): Likewise. (vcaled_f64): Likewise. (vcales_f32): Likewise. (vcaleq_f32): Likewise. (vcaleq_f64): Likewise. (vcalt_f32): Likewise. (vcalt_f64): Likewise. (vcaltd_f64): Likewise. (vcaltq_f32): Likewise. (vcaltq_f64): Likewise. (vcalts_f32): Likewise. gcc/testsuite/ChangeLog: * gcc.target/aarch64/simd/facgt_constpool_1.c: New test. --_002_PAXPR08MB69263B757BCFF5E1C32AF8B2937F9PAXPR08MB6926eurp_ Content-Type: application/octet-stream; name="facgt.patch" Content-Description: facgt.patch Content-Disposition: attachment; filename="facgt.patch"; size=7666; creation-date="Thu, 18 May 2023 11:11:51 GMT"; modification-date="Thu, 18 May 2023 11:14:04 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hcm1fbmVvbi5oIGIvZ2NjL2NvbmZpZy9h YXJjaDY0L2FybV9uZW9uLmgKaW5kZXggZWVlYzlmMTYyZTIyM2RmOGNmNzgwM2IzMjI3YWVmMjJl OTQyMjdhYy4uYWZlMjA1Y2I4M2NkZTg5ZGRlZWRlNGMyYjM3MGE5ZGU4OTExYjE3MiAxMDA2NDQK LS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FybV9uZW9uLmgKKysrIGIvZ2NjL2NvbmZpZy9hYXJj aDY0L2FybV9uZW9uLmgKQEAgLTc1NTAsNDIgKzc1NTAsNDIgQEAgX19leHRlbnNpb25fXyBleHRl cm4gX19pbmxpbmUgdWludDY0eDFfdAogX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9f LCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQogdmNhZ2VfZjY0IChmbG9hdDY0eDFf dCBfX2EsIGZsb2F0NjR4MV90IF9fYikKIHsKLSAgcmV0dXJuIHZhYnNfZjY0IChfX2EpID49IHZh YnNfZjY0IChfX2IpOworICByZXR1cm4gdmNyZWF0ZV91NjQgKF9fYnVpbHRpbl9hYXJjaDY0X2Zh Y2dlZGZfdXNzIChfX2FbMF0sIF9fYlswXSkpOwogfQogCiBfX2V4dGVuc2lvbl9fIGV4dGVybiBf X2lubGluZSB1aW50MzJfdAogX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2du dV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQogdmNhZ2VzX2YzMiAoZmxvYXQzMl90IF9fYSwg ZmxvYXQzMl90IF9fYikKIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9mYWJzZiAoX19hKSA+PSBfX2J1 aWx0aW5fZmFic2YgKF9fYikgPyAtMSA6IDA7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9m YWNnZXNmX3VzcyAgKF9fYSwgX19iKTsKIH0KIAogX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxp bmUgdWludDMyeDJfdAogX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9p bmxpbmVfXywgX19hcnRpZmljaWFsX18pKQogdmNhZ2VfZjMyIChmbG9hdDMyeDJfdCBfX2EsIGZs b2F0MzJ4Ml90IF9fYikKIHsKLSAgcmV0dXJuIHZhYnNfZjMyIChfX2EpID49IHZhYnNfZjMyIChf X2IpOworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfZmFjZ2V2MnNmX3VzcyAoX19hLCBfX2Ip OwogfQogCiBfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1aW50MzJ4NF90CiBfX2F0dHJp YnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxf XykpCiB2Y2FnZXFfZjMyIChmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikKIHsKLSAg cmV0dXJuIHZhYnNxX2YzMiAoX19hKSA+PSB2YWJzcV9mMzIgKF9fYik7CisgIHJldHVybiBfX2J1 aWx0aW5fYWFyY2g2NF9mYWNnZXY0c2ZfdXNzIChfX2EsIF9fYik7CiB9CiAKIF9fZXh0ZW5zaW9u X18gZXh0ZXJuIF9faW5saW5lIHVpbnQ2NF90CiBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5s aW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2FnZWRfZjY0IChmbG9h dDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKQogewotICByZXR1cm4gX19idWlsdGluX2ZhYnMgKF9f YSkgPj0gX19idWlsdGluX2ZhYnMgKF9fYikgPyAtMSA6IDA7CisgIHJldHVybiBfX2J1aWx0aW5f YWFyY2g2NF9mYWNnZWRmX3VzcyAoX19hLCBfX2IpOwogfQogCiBfX2V4dGVuc2lvbl9fIGV4dGVy biBfX2lubGluZSB1aW50NjR4Ml90CiBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18s IF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2FnZXFfZjY0IChmbG9hdDY0eDJf dCBfX2EsIGZsb2F0NjR4Ml90IF9fYikKIHsKLSAgcmV0dXJuIHZhYnNxX2Y2NCAoX19hKSA+PSB2 YWJzcV9mNjQgKF9fYik7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mYWNnZXYyZGZfdXNz IChfX2EsIF9fYik7CiB9CiAKIC8qIHZjYWd0ICAqLwpAQCAtNzU5NCw0MiArNzU5NCw0MiBAQCBf X2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1aW50MzJfdAogX19hdHRyaWJ1dGVfXyAoKF9f YWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQogdmNhZ3Rz X2YzMiAoZmxvYXQzMl90IF9fYSwgZmxvYXQzMl90IF9fYikKIHsKLSAgcmV0dXJuIF9fYnVpbHRp bl9mYWJzZiAoX19hKSA+IF9fYnVpbHRpbl9mYWJzZiAoX19iKSA/IC0xIDogMDsKKyAgcmV0dXJu IF9fYnVpbHRpbl9hYXJjaDY0X2ZhY2d0c2ZfdXNzIChfX2EsIF9fYik7CiB9CiAKIF9fZXh0ZW5z aW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQzMngyX3QKIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5 c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKIHZjYWd0X2YzMiAo ZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpCiB7Ci0gIHJldHVybiB2YWJzX2YzMiAo X19hKSA+IHZhYnNfZjMyIChfX2IpOworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfZmFjZ3R2 MnNmX3VzcyAoX19hLCBfX2IpOwogfQogCiBfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1 aW50NjR4MV90CiBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGlu ZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2FndF9mNjQgKGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2 NHgxX3QgX19iKQogewotICByZXR1cm4gdmFic19mNjQgKF9fYSkgPiB2YWJzX2Y2NCAoX19iKTsK KyAgcmV0dXJuIHZjcmVhdGVfdTY0IChfX2J1aWx0aW5fYWFyY2g2NF9mYWNndGRmX3VzcyAoX19h WzBdLCBfX2JbMF0pKTsKIH0KIAogX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgdWludDMy eDRfdAogX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywg X19hcnRpZmljaWFsX18pKQogdmNhZ3RxX2YzMiAoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRf dCBfX2IpCiB7Ci0gIHJldHVybiB2YWJzcV9mMzIgKF9fYSkgPiB2YWJzcV9mMzIgKF9fYik7Cisg IHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mYWNndHY0c2ZfdXNzIChfX2EsIF9fYik7CiB9CiAK IF9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQ2NF90CiBfX2F0dHJpYnV0ZV9fICgo X19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2Fn dGRfZjY0IChmbG9hdDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKQogewotICByZXR1cm4gX19idWls dGluX2ZhYnMgKF9fYSkgPiBfX2J1aWx0aW5fZmFicyAoX19iKSA/IC0xIDogMDsKKyAgcmV0dXJu IF9fYnVpbHRpbl9hYXJjaDY0X2ZhY2d0ZGZfdXNzIChfX2EsIF9fYik7CiB9CiAKIF9fZXh0ZW5z aW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQ2NHgyX3QKIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5 c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKIHZjYWd0cV9mNjQg KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKQogewotICByZXR1cm4gdmFic3FfZjY0 IChfX2EpID4gdmFic3FfZjY0IChfX2IpOworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfZmFj Z3R2MmRmX3VzcyAoX19hLCBfX2IpOwogfQogCiAvKiB2Y2FsZSAgKi8KQEAgLTc2MzgsNDIgKzc2 MzgsNDIgQEAgX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgdWludDMyeDJfdAogX19hdHRy aWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFs X18pKQogdmNhbGVfZjMyIChmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikKIHsKLSAg cmV0dXJuIHZhYnNfZjMyIChfX2EpIDw9IHZhYnNfZjMyIChfX2IpOworICByZXR1cm4gX19idWls dGluX2FhcmNoNjRfZmFjbGV2MnNmX3VzcyAoX19hLCBfX2IpOwogfQogCiBfX2V4dGVuc2lvbl9f IGV4dGVybiBfX2lubGluZSB1aW50NjR4MV90CiBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5s aW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2FsZV9mNjQgKGZsb2F0 NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKQogewotICByZXR1cm4gdmFic19mNjQgKF9fYSkg PD0gdmFic19mNjQgKF9fYik7CisgIHJldHVybiB2Y3JlYXRlX3U2NCAoX19idWlsdGluX2FhcmNo NjRfZmFjbGVkZl91c3MgKF9fYVswXSwgX19iWzBdKSk7CiB9CiAKIF9fZXh0ZW5zaW9uX18gZXh0 ZXJuIF9faW5saW5lIHVpbnQ2NF90CiBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18s IF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2FsZWRfZjY0IChmbG9hdDY0X3Qg X19hLCBmbG9hdDY0X3QgX19iKQogewotICByZXR1cm4gX19idWlsdGluX2ZhYnMgKF9fYSkgPD0g X19idWlsdGluX2ZhYnMgKF9fYikgPyAtMSA6IDA7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2 NF9mYWNsZWRmX3VzcyAoX19hLCBfX2IpOwogfQogCiBfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lu bGluZSB1aW50MzJfdAogX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9p bmxpbmVfXywgX19hcnRpZmljaWFsX18pKQogdmNhbGVzX2YzMiAoZmxvYXQzMl90IF9fYSwgZmxv YXQzMl90IF9fYikKIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9mYWJzZiAoX19hKSA8PSBfX2J1aWx0 aW5fZmFic2YgKF9fYikgPyAtMSA6IDA7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mYWNs ZXNmX3VzcyAoX19hLCBfX2IpOwogfQogCiBfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1 aW50MzJ4NF90CiBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGlu ZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2Y2FsZXFfZjMyIChmbG9hdDMyeDRfdCBfX2EsIGZsb2F0 MzJ4NF90IF9fYikKIHsKLSAgcmV0dXJuIHZhYnNxX2YzMiAoX19hKSA8PSB2YWJzcV9mMzIgKF9f Yik7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mYWNsZXY0c2ZfdXNzIChfX2EsIF9fYik7 CiB9CiAKIF9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVpbnQ2NHgyX3QKIF9fYXR0cmli dXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9f KSkKIHZjYWxlcV9mNjQgKGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKQogewotICBy ZXR1cm4gdmFic3FfZjY0IChfX2EpIDw9IHZhYnNxX2Y2NCAoX19iKTsKKyAgcmV0dXJuIF9fYnVp bHRpbl9hYXJjaDY0X2ZhY2xldjJkZl91c3MgKF9fYSwgX19iKTsKIH0KIAogLyogdmNhbHQgICov CkBAIC03NjgyLDQyICs3NjgyLDQyIEBAIF9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVp bnQzMngyX3QKIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5l X18sIF9fYXJ0aWZpY2lhbF9fKSkKIHZjYWx0X2YzMiAoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMy eDJfdCBfX2IpCiB7Ci0gIHJldHVybiB2YWJzX2YzMiAoX19hKSA8IHZhYnNfZjMyIChfX2IpOwor ICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfZmFjbHR2MnNmX3VzcyAoX19hLCBfX2IpOwogfQog CiBfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1aW50NjR4MV90CiBfX2F0dHJpYnV0ZV9f ICgoX19hbHdheXNfaW5saW5lX18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCiB2 Y2FsdF9mNjQgKGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKQogewotICByZXR1cm4g dmFic19mNjQgKF9fYSkgPCB2YWJzX2Y2NCAoX19iKTsKKyAgcmV0dXJuIHZjcmVhdGVfdTY0IChf X2J1aWx0aW5fYWFyY2g2NF9mYWNsdGRmX3VzcyAoX19hWzBdLCBfX2JbMF0pKTsKIH0KIAogX19l eHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgdWludDY0X3QKIF9fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKIHZjYWx0ZF9m NjQgKGZsb2F0NjRfdCBfX2EsIGZsb2F0NjRfdCBfX2IpCiB7Ci0gIHJldHVybiBfX2J1aWx0aW5f ZmFicyAoX19hKSA8IF9fYnVpbHRpbl9mYWJzIChfX2IpID8gLTEgOiAwOworICByZXR1cm4gX19i dWlsdGluX2FhcmNoNjRfZmFjbHRkZl91c3MgKF9fYSwgX19iKTsKIH0KIAogX19leHRlbnNpb25f XyBleHRlcm4gX19pbmxpbmUgdWludDMyeDRfdAogX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lu bGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQogdmNhbHRxX2YzMiAoZmxv YXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpCiB7Ci0gIHJldHVybiB2YWJzcV9mMzIgKF9f YSkgPCB2YWJzcV9mMzIgKF9fYik7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mYWNsdHY0 c2ZfdXNzIChfX2EsIF9fYik7CiB9CiAKIF9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVp bnQ2NHgyX3QKIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5l X18sIF9fYXJ0aWZpY2lhbF9fKSkKIHZjYWx0cV9mNjQgKGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2 NHgyX3QgX19iKQogewotICByZXR1cm4gdmFic3FfZjY0IChfX2EpIDwgdmFic3FfZjY0IChfX2Ip OworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfZmFjbHR2MmRmX3VzcyAoX19hLCBfX2IpOwog fQogCiBfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1aW50MzJfdAogX19hdHRyaWJ1dGVf XyAoKF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQog dmNhbHRzX2YzMiAoZmxvYXQzMl90IF9fYSwgZmxvYXQzMl90IF9fYikKIHsKLSAgcmV0dXJuIF9f YnVpbHRpbl9mYWJzZiAoX19hKSA8IF9fYnVpbHRpbl9mYWJzZiAoX19iKSA/IC0xIDogMDsKKyAg cmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X2ZhY2x0c2ZfdXNzIChfX2EsIF9fYik7CiB9CiAKIC8q IHZjZXEgLSB2ZWN0b3IuICAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FhcmNoNjQvc2ltZC9mYWNndF9jb25zdHBvb2xfMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2FhcmNoNjQvc2ltZC9mYWNndF9jb25zdHBvb2xfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRlYmZkMWY0 Yzc1ZDNiYzBlZDZhNmY1ZDdhMjNiZDk0NTg3NGUyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9zaW1kL2ZhY2d0X2NvbnN0cG9vbF8xLmMKQEAg LTAsMCArMSwxNiBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LU8iIH0gKi8KKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3VpbnQzMng0X3QgZyAodWludDMy eDRfdCwgdWludDMyeDRfdCk7CisKK3VpbnQzMng0X3QKK2ZvbyAoZmxvYXQzMng0X3QgeCwgZmxv YXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikKK3sKKyAgcmV0dXJuIHZjYWd0cV9mMzIgKHgsIChm bG9hdDMyeDRfdCl7IDEwMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wfSk7Cit9CisKKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7ZmFjZ3RcdHZbMC05XStcLjRzLCB2WzAtOV0r XC40cywgdlswLTldK1wuNHN9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItbm90IHtcdGZjbWd0XHR9IH0gfSAqLworCg== --_002_PAXPR08MB69263B757BCFF5E1C32AF8B2937F9PAXPR08MB6926eurp_--