From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02on2052.outbound.protection.outlook.com [40.107.247.52]) by sourceware.org (Postfix) with ESMTPS id 8045A385558F for ; Fri, 11 Nov 2022 17:41:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8045A385558F 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=kCUzghratWVBCmeYAiUxNuiOG3lSVavxE30JOeJbMKwmZMLqJvRxICU+gmzr43nn/bzVLrQe2PlTVagpC8L0moC7A83lbumVCgBIbvZmWzhYIvjKBRTS4kzkBtm/nLyJOwkt8w7NCf/LdXidfJK5rW508w6Q23zPIX6Qbvgys6ewURLo9ARNdy7K8sOf5MBDS5aQCuEl2osnwdSFC2orbVWGGg4OY0yh0AOUZ7hhfD12np/ZnHcMwV154MsFBFWeIH2lae7IItr0coMu78R1X7qgotNgCjDeBx1QRV/KXEBqaz5OIkhm7Mv4U1eYcDXhceiB7IzWGGLGSgqRUtWcdw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; b=j22SsQqwSXaCD6tFgcQGJwd+jMGbrHZqplOgI4ry1zIjWeSZahOSWskA/waMQ96b6PK2tsPUG4aAg3ojVs6RaOjQNnxVerA6MhvIUppSWJwAg1XT0vwgR/GI0jQIQFldze3dgQnCNK/xhDdgHuZUUOp1CCUxms0U4ld+DZPZCNRytKIazt7A80GFdUZg0NobPafZ5Q81iBGKiQcytsMhhW++M03MGlypGWBKqkmZimBHKAcrEjVaibo01k1bgsmvtYPD0Uw7wYn36cYOkJfkkfAnabakaOsXMqb7Oe9L6DgM34CNSKlFmaxKxIww7qy+G7iA0TlBBn9qZTcOXY3TGA== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) 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=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; b=hIBlTgabR2JtVK8V5KGlaVCDBWNOaCGZdIfrjhDsVhW5/lqtALZivlVtkOR8tZ/f7uCgippYzVrFPysNHZnruEllMtCdwGj1s5vkVw/Q2C77CNQo6Ufo74OwOj4DNpunK0Ps5sE7BmcMLpUrv2PYKYjd54GANapt7PrzUe31wmQ= Received: from FR3P281CA0151.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a2::12) by DU0PR08MB7637.eurprd08.prod.outlook.com (2603:10a6:10:31c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Fri, 11 Nov 2022 17:41:08 +0000 Received: from VI1EUR03FT013.eop-EUR03.prod.protection.outlook.com (2603:10a6:d10:a2:cafe::3d) by FR3P281CA0151.outlook.office365.com (2603:10a6:d10:a2::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13 via Frontend Transport; Fri, 11 Nov 2022 17:41:08 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by VI1EUR03FT013.mail.protection.outlook.com (100.127.145.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.12 via Frontend Transport; Fri, 11 Nov 2022 17:41:08 +0000 Received: ("Tessian outbound aeae1c7b66fd:v130"); Fri, 11 Nov 2022 17:41:07 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 994731cac393c86a X-CR-MTA-TID: 64aa7808 Received: from 6896e4dcaa77.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 551DE174-5B68-4B25-BE62-9B0C9A06CC94.1; Fri, 11 Nov 2022 17:41:00 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 6896e4dcaa77.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 11 Nov 2022 17:41:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IPSN3L2ClLDYLbl6DnG9RxgvH9TPXU7zssvlMvqojRZ+/8ZwmqBGTfiTADzZ15OXNQ2ew9k/IW7I9U0tanqWE8Cs3n1HqQQTgdDcft0cpkn56+BgQZ+8ncXIBroco+mRL/PG4m/G43CmSyoOjBru/Ud16HHIGCvntICe9LZleXESCOP6ZYOf9ITqwy2WP7bz25pnsVNUUwo8L/qtT3N9YHMheNo5I90XPX/NVb1XUGvFY9gfdEsMKpu6GAhl/A/5OPQysoRPPhfp6y3B0323XKiLu6v+mqHPeo7Mtps2zXuXKH7RQxfm7AX+WXUfnlHuy2ZRRGG+WkskrsLIBbBuFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; b=n/NzRE5rITfs2GkJkmP2q2kL3jGOsw+LofztZDY+HRL9o1nOZgHk+DKS8qVDgVRDXZmSxxg+arYKAO5m+KSaciEg52ACDZvnmH7WyX7bNG1ZW8BqPkWj2NpfP/FrnJ5One6FkDAAnULmBcPkqwqByDiOHa5iVQ76AAWCAREKZI63WUnkW47LPiRNMt0SRHhDKBIwjnEVvkyG3nWJnZNHiLP4xDXl8s/2wdCJVWTwM66S6It96RGLoEPhteOhQKQ4FJn8M0SwrT+mapjxQBzMsgvs/RL+2Sev0NpBK1rmfBnFQuKVTyE9BZvV1jD2xmbAGd+PyiNHXaBgoKo5BlrO9g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none 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=INZrPR4tFRAhk74gKXfC4kOLo5+tugxKhFOuoF1ZZdk=; b=hIBlTgabR2JtVK8V5KGlaVCDBWNOaCGZdIfrjhDsVhW5/lqtALZivlVtkOR8tZ/f7uCgippYzVrFPysNHZnruEllMtCdwGj1s5vkVw/Q2C77CNQo6Ufo74OwOj4DNpunK0Ps5sE7BmcMLpUrv2PYKYjd54GANapt7PrzUe31wmQ= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by GV2PR08MB8196.eurprd08.prod.outlook.com (2603:10a6:150:7c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Fri, 11 Nov 2022 17:40:57 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::1131:99da:d256:ae1f]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::1131:99da:d256:ae1f%4]) with mapi id 15.20.5813.015; Fri, 11 Nov 2022 17:40:57 +0000 Content-Type: multipart/mixed; boundary="------------Htr1Wksa0tBt5NfASod4JlX4" Message-ID: <212ceca7-21f7-7d99-9543-9e39d9056aba@arm.com> Date: Fri, 11 Nov 2022 17:40:55 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: en-US To: gcc-patches@gcc.gnu.org From: Stam Markianos-Wright Subject: [PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops X-ClientProxiedBy: LO2P123CA0071.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1::35) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|GV2PR08MB8196:EE_|VI1EUR03FT013:EE_|DU0PR08MB7637:EE_ X-MS-Office365-Filtering-Correlation-Id: ec12a326-9eb7-4a3a-62cf-08dac40bea79 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 1BsVmDxC0Lm0NqSgxYgIuR3CBC265I03pwVqFoGVZIjuxOh6QG2q483F0LI9fOZ9EXCATkxKC7hMIVihdoRqzIkaQFKMqOgn/2IOf3Gv6D9NbqFd1jVsgM09EFwa0w8x9t3/sGaqqnlUk7XiftOqd8LABVs4HIvupsd/XeGOSx/HxJKR2Y60Gc8igrdfUr78vIdXhZOJm2rtzYvviLHwRJ5q/AhlKVl9SbD2+18MnN18+kqVA1prpgHAaiCUnfqsYf59iG9PvBdHGkeTLmbJVgyWxsHCYRohwshkZLZco+rYYHPu2+b0u+Csd9lVj+RnEpXXPdnt6kVXFTnkrnd5KlNNjMp3nppaF05h0LeWSsZ+8uvFAj7nWEJjnokZOJ0lTZWoA61wnaik46Bp4qREYk0xvSh0lT8ebR5AirxhNoQu9dXzOrzIiCT4p1ZdSmO0fV4cMZQUAeauvZ6J0JWDixk9G3dMzaRUO0j32BBLbG7LsFjjoot68EU3iuCsdg7WkkChJP5gZnRiLlhjhnvT/QRRlrsGhgrGElqKmhWuUGqFLHOzYGVlXfc8/zneDPt/S3uk3/Z0w0pwEvmrVYRNKh0Bdx1SIZVqoydol8emCeT1hWQqBhVBao+zLuVcng5re4pskqyjMeb2M0VJhwv477FVNLopXTqWyCEGIFuxtASjmxBLHnw0IuL7cO0kN2orzSvWT4LblHF5uXEM/rtTZ7dH3MLMn+iw1DX+iT14NxGRCWkdmsKMBZ9KjeEGQ3Js7ez5yc9/x/Fbqp5qUvGghM4Nq/aiZpTHGpg0a58PawBY1x53u6uBzQMB1jOlO57tfJozDSOE9kyPUNW5bX8mssc8P7eh2dZPhEV1vxhj+DQ= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR08MB6507.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(396003)(346002)(39860400002)(366004)(376002)(136003)(451199015)(6486002)(31686004)(84970400001)(2906002)(36756003)(31696002)(86362001)(8936002)(235185007)(41300700001)(66556008)(8676002)(66476007)(66946007)(316002)(6916009)(5660300002)(33964004)(6506007)(478600001)(38100700002)(30864003)(83380400001)(2616005)(6512007)(26005)(186003)(45980500001)(43740500002)(559001)(579004);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8196 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: VI1EUR03FT013.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 62ae7700-78bf-4baa-9161-08dac40be384 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ptLJQEaicKdMlX7r4glBi4WipTvagN/QNpGrTYJG1GNqOg15Cp+s9/xvvTkHjMAewDCdNPX1zAtJ6spmXcbNY0B4aowXKS1fSg+M1C9hMh1y+r2labUPSolYv0fCXyHD+Xjnliu2Morvyk1GO/RQL2ZqEvLTObcay4YDUNtZCfP9JMMBJGVWJN9LQuiqGhe5rw9Ww1S/UuCUAoaZyIyQo/wcW1Lo4PnbSoGaoQjtj4pPaKafK7ohZhcX+LSd70zg/GQV2iabmvj0dASVaa7p7cTKDOevgvVqzghY1Tau6pkyiW1SuNKdk00mVSTCdHtuac/cYkMzn4aA5GLdoWGm0sYBvR/xpOrPq4eNtfvGPWyANjD89h6ZuD73Ui0fN/25qhAwKwSq6tEbEmZK8ArB3deVd3wEhmd1zZYk8nUqdb/3D931CjRu3HrQ9scJHt0YrVAam+xxdzvhhhOkPcBmqSEyspfeVIE9LOmDbfZb+9vgpcue7l3L1SNtOJ3pnN3+L0N6pohXHsxGLJ4sLOXT5+7Hd0WzQVVLelvpQPKZ/hHcDkcKWD0fAzTBYRiJEI0IVt1veutgJ/V1A8nmg5CWSd4VWdYXUnD4VbSxIet77WWOQQfFRtehjlT1Bo1JB9VqbrGqnRIg/rl/fuTxguI0rGMXqeUZZjYAzjgQdAQZo7w3vHBQ5P0QKLrGKtEhUQkA1qTamY0lLUW89TW0ZYTOpH3xsbg5hS34ac95qTOEcpG0FmN/zDgebDZDyhx8fHJeS3NWPEthuhuWfNV2o/i48PcDCs54T5TUAMaaK03dBP4lO9fIHEv3YTN0fvLCUCCbReLolUVbu7LGaV+kPUfLEHD3BR4+U7c8EPLD0N6TW/n9Jy6nJZtd47/mjjA2Ve+9 X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230022)(4636009)(346002)(39860400002)(396003)(136003)(376002)(451199015)(46966006)(36840700001)(40470700004)(31686004)(84970400001)(86362001)(5660300002)(41300700001)(235185007)(31696002)(8936002)(70586007)(6916009)(8676002)(70206006)(316002)(356005)(36756003)(40480700001)(36860700001)(82740400003)(40460700003)(81166007)(6506007)(33964004)(6486002)(6512007)(82310400005)(83380400001)(26005)(478600001)(2616005)(336012)(2906002)(186003)(30864003)(47076005)(43740500002)(579004)(559001);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Nov 2022 17:41:08.2448 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ec12a326-9eb7-4a3a-62cf-08dac40bea79 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: VI1EUR03FT013.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB7637 X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------Htr1Wksa0tBt5NfASod4JlX4 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi all, This is the 2/2 patch that contains the functional changes needed for MVE Tail Predicated Low Overhead Loops.  See my previous email for a general introduction of MVE LOLs. This support is added through the already existing loop-doloop mechanisms that are used for non-MVE dls/le looping. Changes are: 1) Relax the loop-doloop mechanism in the mid-end to allow for    decrement numbers other that -1 and for `count` to be an    rtx containing the number of elements to be processed, rather    than an expression for calculating the number of iterations. 2) Add a `allow_elementwise_doloop` target hook. This allows the    target backend to manipulate the iteration count as it needs:    in our case to change it from a pre-calculation of the number    of iterations to the number of elements to be processed. 3) The doloop_end target-insn now had an additional parameter:    the `count` (note: this is before it gets modified to just be    the number of elements), so that the decrement value is    extracted from that parameter. And many things in the backend to implement the above optimisation: 4)  Appropriate changes to the define_expand of doloop_end and new     patterns for dlstp and letp. 5) `arm_attempt_dlstp_transform`: (called from the define_expand of     doloop_end) this function checks for the loop's suitability for     dlstp/letp transformation and then implements it, if possible. 6) `arm_mve_get_loop_unique_vctp`: A function that loops through     the loop contents and returns the vctp VPR-genereting operation     within the loop, if it is unique and there is exclusively one     vctp within the loop. 7) A couple of utility functions: `arm_mve_get_vctp_lanes` to map    from vctp unspecs to number of lanes, and `arm_get_required_vpr_reg`    to check an insn to see if it requires the VPR or not. No regressions on arm-none-eabi with various targets and on aarch64-none-elf. Thoughts on getting this into trunk? Thank you, Stam Markianos-Wright gcc/ChangeLog:         * config/aarch64/aarch64.md: Add extra doloop_end arg.         * config/arm/arm-protos.h (arm_attempt_dlstp_transform): New.         * config/arm/arm.cc (TARGET_ALLOW_ELEMENTWISE_DOLOOP): New.         (arm_mve_get_vctp_lanes): New.         (arm_get_required_vpr_reg): New.         (arm_mve_get_loop_unique_vctp): New.         (arm_attempt_dlstp_transform): New.         (arm_allow_elementwise_doloop): New.         * config/arm/iterators.md:         * config/arm/mve.md (*predicated_doloop_end_internal): New.         (dlstp_insn): New.         * config/arm/thumb2.md (doloop_end): Update for MVE LOLs.         * config/arm/unspecs.md: New unspecs.         * config/ia64/ia64.md: Add extra doloop_end arg.         * config/pru/pru.md: Add extra doloop_end arg.         * config/rs6000/rs6000.md: Add extra doloop_end arg.         * config/s390/s390.md: Add extra doloop_end arg.         * config/v850/v850.md: Add extra doloop_end arg.         * doc/tm.texi: Document new hook.         * doc/tm.texi.in: Likewise.         * loop-doloop.cc (doloop_condition_get): Relax conditions.         (doloop_optimize): Add support for elementwise LoLs.         * target-insns.def (doloop_end): Add extra arg.         * target.def (allow_elementwise_doloop): New hook.         * targhooks.cc (default_allow_elementwise_doloop): New.         * targhooks.h (default_allow_elementwise_doloop): New. gcc/testsuite/ChangeLog:         * gcc.target/arm/lob.h: Update framework.         * gcc.target/arm/lob1.c: Likewise.         * gcc.target/arm/lob6.c: Likewise.         * gcc.target/arm/dlstp-int16x8.c: New test.         * gcc.target/arm/dlstp-int32x4.c: New test.         * gcc.target/arm/dlstp-int64x2.c: New test.         * gcc.target/arm/dlstp-int8x16.c: New test. ### Inline copy of patch ### diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index f2e3d905dbbeb2949f2947f5cfd68208c94c9272..7a6d24a80060b4a704a481ccd1a32d96e7b0f369 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -7366,7 +7366,8 @@  ;; knows what to generate.  (define_expand "doloop_end"    [(use (match_operand 0 "" ""))      ; loop pseudo -   (use (match_operand 1 "" ""))]     ; label +   (use (match_operand 1 "" ""))      ; label +   (use (match_operand 2 "" ""))]     ; decrement constant    "optimize > 0 && flag_modulo_sched"  {    rtx s0; diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index 550272facd12e60a49bf8a3b20f811cc13765b3a..7684620f0f4d161dd9e9ad2d70308021ec3d3d34 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -63,7 +63,7 @@ extern void arm_decompose_di_binop (rtx, rtx, rtx *, rtx *, rtx *, rtx *);  extern bool arm_q_bit_access (void);  extern bool arm_ge_bits_access (void);  extern bool arm_target_insn_ok_for_lob (rtx); - +extern rtx arm_attempt_dlstp_transform (rtx, rtx);  #ifdef RTX_CODE  enum reg_class  arm_mode_base_reg_class (machine_mode); diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc index ee8f1babf8a1319e77e0db0fa55851c038048804..99e144d52c26597c64b982b3d4ae9a62a114cf18 100644 --- a/gcc/config/arm/arm.cc +++ b/gcc/config/arm/arm.cc @@ -470,6 +470,9 @@ static const struct attribute_spec arm_attribute_table[] =  #undef TARGET_SCHED_REORDER  #define TARGET_SCHED_REORDER arm_sched_reorder +#undef TARGET_ALLOW_ELEMENTWISE_DOLOOP +#define TARGET_ALLOW_ELEMENTWISE_DOLOOP arm_allow_elementwise_doloop +  #undef TARGET_REGISTER_MOVE_COST  #define TARGET_REGISTER_MOVE_COST arm_register_move_cost @@ -34138,8 +34141,339 @@ arm_target_insn_ok_for_lob (rtx insn)    return single_succ_p (bb)      && single_pred_p (bb) -    && single_succ_edge (bb)->dest == single_pred_edge (bb)->src -    && contains_no_active_insn_p (bb); +    && single_succ_edge (bb)->dest == single_pred_edge (bb)->src; +} + +static int +arm_mve_get_vctp_lanes (rtx x) +{ +  if (GET_CODE (x) == SET && GET_CODE (XEXP (x, 1)) == UNSPEC) +    { +      switch (XINT (XEXP (x, 1), 1)) +    { +      case VCTP8Q: +        return 16; +      case VCTP16Q: +        return 8; +      case VCTP32Q: +        return 4; +      case VCTP64Q: +        return 2; +      default: +        break; +    } +    } +  return 0; +} + +/* Check if an insn requires the use of the VPR_REG, if it does, return the +   sub-rtx of the matched operand.  If there are more than one operand (e.g. an +   input operand and an output operand) that use VPR_REG, return the first +   occurance, which is usually the output operand.  */ + +static rtx +arm_get_required_vpr_reg (rtx_insn *insn) +{ +  bool requires_vpr; + +  extract_constrain_insn (insn); +  int n_operands = recog_data.n_operands; +  if (recog_data.n_alternatives == 0) +    return NULL_RTX; + +  /* Fill in recog_op_alt with information about the constraints of +     this insn.  */ +  preprocess_constraints (insn); + +  for (int use = 0; use < n_operands; use++) +    { +      requires_vpr = true; +      /* Iterate through alternatives of operand "use" in recog_op_alt and +       * identify if the operand is required to be the VPR.  */ +      for (int alt1 = 0; alt1 < recog_data.n_alternatives; alt1++) +    { +      const operand_alternative *op_alt1 +          = &recog_op_alt[alt1 * n_operands]; +      /* Fetch the reg_class for each entry and check it against the +       * VPR_REG reg_class.  */ +      if (alternative_class (op_alt1, use) != VPR_REG) +        requires_vpr = false; +    } +      /* If all alternatives of the insn require the VPR reg for this operand, +     it means that either this is VPR-generating instruction, like a vctp, +     vcmp, etc., or it is a VPT-predicated insruction.  Return the subrtx +     of the VPR reg operand.  */ +      if (requires_vpr) +    return recog_data.operand[use]; +    } +  return NULL_RTX; +} + +/* Scan the basic block of a loop body for a vctp instruction. If there is +   exactly one unique vctp instruction, return its rtx_insn *. */ + +static rtx_insn * +arm_mve_get_loop_unique_vctp (basic_block bb) +{ +  rtx_insn *insn = BB_HEAD (bb); +  rtx_insn *vctp_op = NULL; + +  /* Now scan through all the instruction patterns and +     pick out any MVE instructions.  */ +  FOR_BB_INSNS (bb, insn) +    { +      if (INSN_P (insn)) +    { +      /* First check if this is a vctp instruction.  There needs to be +         exactly one vctp instruction within the loop.  */ +      if (arm_mve_get_vctp_lanes (PATTERN (insn)) != 0) +        { +          /* If we already found one vctp instruction, then the +         loop is not consistent internally.  */ +          if (vctp_op) +        return NULL; + +          vctp_op = insn; +        } +    } +    } +  return vctp_op; +} + +rtx +arm_attempt_dlstp_transform (rtx label, rtx count) +{ +  int decrementnum; +  basic_block body = BLOCK_FOR_INSN (label)->prev_bb; +  rtx initial_compare; +  /* Doloop can only be done "elementwise" with predicated dlstp/letp +     when the iteration counter gets deprecated by the number of MVE +     lanes.  This can be exxtracted from the `count`, which is the expression +     used to calculate the number of iterations that the loop would execute +     for a standard dls/le loop.  Since we only support cases where this is a +     power of 2, we can assume that this expression arrives here as: +       (lshiftrt: (A) (const_int y)) +     Then we can extract the decrementnum from y.  */ +  if (GET_CODE (count) == LSHIFTRT && ARITHMETIC_P (XEXP (count, 0)) +      && (decrementnum = (1 << (INTVAL (XEXP (count, 1))))) +      /* There is one final condition that needs to be met for the loop to be +     transformable: dlstp/letp will continue looping until there are +     elements still to process.  This can only work if the looping ends +     when the element counter reaches zero and not some other value +     (e.g. n > 0 works, not n > 1), or we can incorrectly end up running +     one additional iteration.  To by-pass any hoisting that the compiler +     may have done with the `A` in `count` above, we can instead look up +     to the bb before the loop preheader: this should end with a cmp+jump +     pair, where the cmp needs to be with (const_int 0).  */ +      && loop_preheader_edge (body->loop_father)->src->prev_bb +      && BB_END (loop_preheader_edge (body->loop_father)->src->prev_bb) +      && PREV_INSN (BB_END (loop_preheader_edge (body->loop_father) +                ->src->prev_bb)) +      && INSN_P (PREV_INSN (BB_END (loop_preheader_edge (body->loop_father) +                    ->src->prev_bb))) +      && (initial_compare +      = PATTERN (PREV_INSN (BB_END (loop_preheader_edge (body->loop_father) +                        ->src->prev_bb)))) +      && GET_CODE (initial_compare) == SET +      && cc_register (XEXP (initial_compare, 0), VOIDmode) +      && GET_CODE (XEXP (initial_compare, 1)) == COMPARE +      && CONST_INT_P (XEXP (XEXP (initial_compare, 1), 1)) +      && INTVAL (XEXP (XEXP (initial_compare, 1), 1)) == 0) +    { +      /* Find the vctp predicate generation inside the loop body BB.  */ +      rtx_insn *vctp_insn = arm_mve_get_loop_unique_vctp (body); + +      /* If we have successfully found one exactly vctp predicate-generating +     instruction within the loop and the number by which we deprecate the +     loop counter in each iteration matches the number of lanes of the +     vctp instruction, we can attempt to turn this into a dlstp/letp loop. +     */ +      if (vctp_insn +      && decrementnum == arm_mve_get_vctp_lanes (PATTERN (vctp_insn))) +    { +      rtx_insn *insn = 0; +      rtx_insn *cur_insn = 0; +      rtx_insn *seq; +      rtx vctp_vpr_generated = NULL_RTX; +      rtx insn_vpr_reg_operand = NULL_RTX; +      bool transform_worked = true; +      int new_icode; + +      /* Scan through the insns in the loop bb and emit the transformed bb +         insns to a sequence.  */ +      start_sequence (); +      FOR_BB_INSNS (body, insn) +        { +          if (INSN_P (insn)) +        { +          /* When we find the vctp instruction: This may be followed by +             a sign-extend insn to SImode.  If it is, then save the +             sign-extended REG into vctp_vpr_generated.  If there is no +             sign-extend, then store the raw output of the vctp. +             For any VPT-predicated instructions we need to ensure that +             the VPR they use is the same as the one given here and +             they often consume the output of a subreg of the SImode +             sign-extended VPR-reg.  As a result, comparing against the +             output of the sign-extend is more likely to succeed. +             This code also guarantees to us that the vctp comes before +             any instructions that use the VPR within the loop, for the +             dlstp/letp transform to succeed.  */ +          if (insn == vctp_insn) +            { +              if (GET_CODE (XEXP (PATTERN (NEXT_INSN (insn)), 1)) +                  == SIGN_EXTEND +              && GET_CODE (XEXP ( +                 PATTERN (NEXT_INSN (NEXT_INSN (insn))), 1)) +                 == SUBREG) +            vctp_vpr_generated +                = XEXP (PATTERN (NEXT_INSN (NEXT_INSN (insn))), 0); +              else +            vctp_vpr_generated = XEXP (PATTERN (insn), 0); +              /* Also emit a USE of the source register of the vctp. +             This holds the number of elements being processed +             by the loop.  This later gets stored into `count`. +             */ +              emit_use (XVECEXP (XEXP (PATTERN (insn), 1), 0, 0)); +              continue; +            } +          /* If the insn pattern requires the use of the VPR, then it +             a VPT-predicated instruction, so it will need to be +             transformed into the non-predicated version of the +             instruction.  */ +          else if ((insn_vpr_reg_operand +                = arm_get_required_vpr_reg (insn)) +               != NULL_RTX) +            { +              /* If the VPR value is different to the one generated by +             the vctp, then fail the conversion.  */ +              if (!rtx_equal_p (vctp_vpr_generated, +                    insn_vpr_reg_operand)) +            { +              transform_worked = false; +              break; +            } +              /* Also ensure that it's a valid recog-ed instruction with +             the mve_unpredicated_insn atrribute.  */ +              else if (recog_memoized (insn) >= 0 +                   && (new_icode +                   = get_attr_mve_unpredicated_insn (insn))) +            { +              extract_insn (insn); +              rtx arr[8]; +              int j = 0; + +              /* When transforming a VPT-predicated instruction +                 into its unpredicated equivalent we need to drop +                 the VPR operand and we may need to also drop a +                 merge "vuninit" input operand, depending on the +                 instruction pattern.  Here ensure that we have at +                 most a two-operand difference between the two +                 instrunctions.  */ +              int n_operands_diff +                  = recog_data.n_operands +                - insn_data[new_icode].n_operands; +              gcc_assert (n_operands_diff > 0 +                      && n_operands_diff <= 2); + +              /* Then, loop through the operands of the predicated +                 instruction, and retain the ones that map to the +                 unpredicated instruction.  */ +              for (int i = 0; i < recog_data.n_operands; i++) +                { +                  /* Ignore the VPR and, if needed, the vuninit +                 operand.  */ +                  if (insn_vpr_reg_operand == recog_data.operand[i] +                  || (n_operands_diff == 2 +                      && !strcmp (recog_data.constraints[i], +                          "0"))) +                continue; +                  else +                { +                  arr[j] = recog_data.operand[i]; +                  j++; +                } +                } + +              /* Finally, emit the upredicated instruction.  */ +              switch (j) +                { +                  case 2: +                emit_insn (GEN_FCN (new_icode) (arr[0], +                                arr[1])); +                break; +                  case 3: +                emit_insn (GEN_FCN (new_icode) (arr[0], arr[1], +                                arr[2])); +                break; +                  default: +                gcc_unreachable (); +                } +            } +              /* If we can't identify the INSN as either being either +             for deletion or to re-map, then we don't know how to +             handle it, so fail the whole conversion.  */ +              else +            { +              transform_worked = false; +              break; +            } +            } +          /* Instructions that dont's require the VPR can be carried +             over as-is.  */ +          else +            emit_insn (PATTERN (insn)); +        } +        } +      seq = get_insns (); +      end_sequence (); + +      if (transform_worked) +        { +          /* Re-write the entire BB contents with the transformed +         sequence.  */ +          FOR_BB_INSNS_SAFE (body, insn, cur_insn) +        if (INSN_P (insn)) +          delete_insn (insn); +          for (insn = seq; NEXT_INSN (insn); insn = NEXT_INSN (insn)) +        emit_insn_after (PATTERN (insn), BB_END (body)); +          emit_jump_insn_after (PATTERN (insn), BB_END (body)); +          return GEN_INT (decrementnum); +        } +    } +    } +  /* Bail out: we can't use dlstp/letp, so return 1 to allow loop-doloop to try +     the standard dls/le pair.  */ +  return GEN_INT (1); +} + +/* Target hook to the number of elements to be processed by a dlstp/letp loop +   into `count` to intialise the counter register.  The number of elements was +   previously extracted from the vctp insn and placed into a USE rtx. +   We only check that the doloop_end pattern successfully decrements by a +   number other than -1 for a valid dlstp/letp loop.  No other checking is +   needed as that was done previously.  */ + +rtx +arm_allow_elementwise_doloop (rtx count, rtx label, rtx doloop) +{ +  if (doloop +      && INTVAL (XEXP (SET_SRC (XVECEXP (PATTERN (doloop), 0, 1)), 1)) != -1 +      && ARITHMETIC_P (XEXP (count, 0))) +    { +      basic_block body = BLOCK_FOR_INSN (label)->prev_bb; +      rtx_insn* insn; +      FOR_BB_INSNS (body, insn) +    { +      if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE) +        { +          rtx num_elem_reg = copy_rtx (XEXP (PATTERN (insn), 0)); +          delete_insn (insn); +          return num_elem_reg; +        } +    } +    } +  else +    return count;  }  #if CHECKING_P diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md index 29062cd6fb3c61c22417ef8fc25abd7819d2c034..aa2fdac22f3c7884c18ebf197b26a2d54da44c93 100644 --- a/gcc/config/arm/iterators.md +++ b/gcc/config/arm/iterators.md @@ -1464,7 +1464,9 @@  (define_int_attr mode1 [(VCTP8Q "8") (VCTP16Q "16") (VCTP32Q "32")              (VCTP64Q "64") (VCTP8Q_M "8") (VCTP16Q_M "16") -            (VCTP32Q_M "32") (VCTP64Q_M "64")]) +            (VCTP32Q_M "32") (VCTP64Q_M "64") +            (DLSTP8 "8") (DLSTP16 "16") (DLSTP32 "32") +            (DLSTP64 "64")])  ;; Both kinds of return insn.  (define_code_iterator RETURNS [return simple_return]) @@ -1773,6 +1775,8 @@  (define_int_iterator UQRSHLLQ [UQRSHLL_64 UQRSHLL_48])  (define_int_iterator SQRSHRLQ [SQRSHRL_64 SQRSHRL_48])  (define_int_iterator VSHLCQ_M [VSHLCQ_M_S VSHLCQ_M_U]) +(define_int_iterator DLSTP [DLSTP8 DLSTP16 DLSTP32 +                   DLSTP64])  ;; Define iterators for VCMLA operations  (define_int_iterator VCMLA_OP [UNSPEC_VCMLA diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index b1c8c1c569f31a6cb1bfdc16394047f02d6cddf4..3baddab5905a8e45bbf55f53e876a671d6d58c5e 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -10837,3 +10837,38 @@      }    DONE;  }) + +;; Originally expanded by 'predicated_doloop_end'. +(define_insn "*predicated_doloop_end_internal" +  [(set (pc) +    (if_then_else +       (ge (plus:SI (reg:SI LR_REGNUM) +            (match_operand:SI 0 "const_int_operand" "")) +        (const_int 0)) +     (label_ref (match_operand 1 "" "")) +     (pc))) +   (set (reg:SI LR_REGNUM) +    (plus:SI (reg:SI LR_REGNUM) (match_dup 0))) +   (clobber (reg:CC CC_REGNUM))] +  "TARGET_32BIT && TARGET_HAVE_LOB && TARGET_HAVE_MVE && TARGET_THUMB2" +  { +    if (get_attr_length (insn) == 4) +      return "letp\t%|lr, %l1"; +    else +      return "subs\t%|lr, #%0;bgt\t%l1"; +  } +  [(set (attr "length") +    (if_then_else +       (ltu (minus (pc) (match_dup 1)) (const_int 1024)) +        (const_int 4) +        (const_int 6))) +   (set_attr "type" "branch")]) + +(define_insn "dlstp_insn" +  [ +    (set (reg:SI LR_REGNUM) +     (unspec:SI [(match_operand:SI 0 "s_register_operand" "r")] +      DLSTP)) +  ] +  "TARGET_32BIT && TARGET_HAVE_LOB && TARGET_HAVE_MVE && TARGET_THUMB2" +  "dlstp.\t%|lr, %0") \ No newline at end of file diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md index b2309a5216550104f29a71f33506d421f79f5e2c..a21e2909872a618a8b8b2b69efb9a412fcc96a85 100644 --- a/gcc/config/arm/thumb2.md +++ b/gcc/config/arm/thumb2.md @@ -1610,10 +1610,11 @@  ;; knows what to generate.  (define_expand "doloop_end"    [(use (match_operand 0 "" ""))      ; loop pseudo -   (use (match_operand 1 "" ""))]     ; label +   (use (match_operand 1 "" ""))      ; label +   (use (match_operand 2 "" ""))]     ; decrement constant    "TARGET_32BIT"    " - { +{     /* Currently SMS relies on the do-loop pattern to recognize loops        where (1) the control part consists of all insns defining and/or        using a certain 'count' register and (2) the loop count can be @@ -1623,41 +1624,68 @@        Also used to implement the low over head loops feature, which is part of        the Armv8.1-M Mainline Low Overhead Branch (LOB) extension.  */ -   if (optimize > 0 && (flag_modulo_sched || TARGET_HAVE_LOB)) -   { -     rtx s0; -     rtx bcomp; -     rtx loc_ref; -     rtx cc_reg; -     rtx insn; -     rtx cmp; - -     if (GET_MODE (operands[0]) != SImode) -       FAIL; - -     s0 = operands [0]; - -     /* Low over head loop instructions require the first operand to be LR.  */ -     if (TARGET_HAVE_LOB && arm_target_insn_ok_for_lob (operands [1])) -       s0 = gen_rtx_REG (SImode, LR_REGNUM); - -     if (TARGET_THUMB2) -       insn = emit_insn (gen_thumb2_addsi3_compare0 (s0, s0, GEN_INT (-1))); -     else -       insn = emit_insn (gen_addsi3_compare0 (s0, s0, GEN_INT (-1))); - -     cmp = XVECEXP (PATTERN (insn), 0, 0); -     cc_reg = SET_DEST (cmp); -     bcomp = gen_rtx_NE (VOIDmode, cc_reg, const0_rtx); -     loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [1]); -     emit_jump_insn (gen_rtx_SET (pc_rtx, -                                  gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, -                                                        loc_ref, pc_rtx))); -     DONE; -   } - else -   FAIL; - }") +  if (optimize > 0 && (flag_modulo_sched || TARGET_HAVE_LOB)) +    { +      rtx s0; +      rtx bcomp; +      rtx loc_ref; +      rtx cc_reg; +      rtx insn; +      rtx cmp; +      rtx decrement_num; + +      if (GET_MODE (operands[0]) != SImode) +    FAIL; + +      s0 = operands[0]; + +       if (TARGET_HAVE_LOB && arm_target_insn_ok_for_lob (operands[1])) +    { +      s0 = gen_rtx_REG (SImode, LR_REGNUM); + +      /* If we have a compatibe MVE target, try and analyse the loop +         contents to determine if we can use predicated dlstp/letp +         looping.  */ +      if (TARGET_HAVE_MVE && TARGET_THUMB2 +          && (decrement_num = arm_attempt_dlstp_transform (operands[1], +                                   operands[2])) +          && (INTVAL (decrement_num) != 1)) +        { +          insn = emit_insn +              (gen_thumb2_addsi3_compare0 +              (s0, s0, GEN_INT ((-1) * (INTVAL (decrement_num))))); +          cmp = XVECEXP (PATTERN (insn), 0, 0); +          cc_reg = SET_DEST (cmp); +          bcomp = gen_rtx_GE (VOIDmode, cc_reg, const0_rtx); +          loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[1]); +          emit_jump_insn (gen_rtx_SET (pc_rtx, +                       gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, +                                 loc_ref, pc_rtx))); +          DONE; +        } + +      /* Otherwise, try standard decrement-by-one dls/le looping.  */ +      if (TARGET_THUMB2) +        insn = emit_insn (gen_thumb2_addsi3_compare0 (s0, s0, +                              GEN_INT (-1))); +      else +        insn = emit_insn (gen_addsi3_compare0 (s0, s0, GEN_INT (-1))); + +      cmp = XVECEXP (PATTERN (insn), 0, 0); +      cc_reg = SET_DEST (cmp); +      bcomp = gen_rtx_NE (VOIDmode, cc_reg, const0_rtx); +      loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[1]); +      emit_jump_insn (gen_rtx_SET (pc_rtx, +                       gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, +                                 loc_ref, pc_rtx))); +      DONE; +    } +      else +    FAIL; +    } +  else +    FAIL; +}")  (define_insn "*clear_apsr"    [(unspec_volatile:SI [(const_int 0)] VUNSPEC_CLRM_APSR) @@ -1755,7 +1783,37 @@    {      if (REGNO (operands[0]) == LR_REGNUM)        { -    emit_insn (gen_dls_insn (operands[0])); +    /* Pick out the number by which we are decrementing the loop counter +       in every iteration.  If it's > 1, then use dlstp.  */ +    int const_int_dec_num +         = abs (INTVAL (XEXP (XEXP (XVECEXP (PATTERN (operands[1]), 0, 1), +                  1), +                1))); +    switch (const_int_dec_num) +      { +        case 16: +          emit_insn (gen_dlstp8_insn (operands[0])); +          break; + +        case 8: +          emit_insn (gen_dlstp16_insn (operands[0])); +          break; + +        case 4: +          emit_insn (gen_dlstp32_insn (operands[0])); +          break; + +        case 2: +          emit_insn (gen_dlstp64_insn (operands[0])); +          break; + +        case 1: +          emit_insn (gen_dls_insn (operands[0])); +          break; + +        default: +          gcc_unreachable (); +      }      DONE;        }      else diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md index 7748e78437943ca0cd0d8909330ea8d3b4948ae3..744e7ab5731b5010ce280a046c5a94f6f590c350 100644 --- a/gcc/config/arm/unspecs.md +++ b/gcc/config/arm/unspecs.md @@ -579,6 +579,10 @@    VCTP16Q    VCTP32Q    VCTP64Q +  DLSTP8 +  DLSTP16 +  DLSTP32 +  DLSTP64    VPNOT    VCREATEQ_F    VCVTQ_N_TO_F_S diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index 5d1d47da55b2f0a2ae001c3277467ae19513fbe1..5b24bd76ace5789ccc7e860c5872413bb661cf88 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -3956,7 +3956,8 @@  (define_expand "doloop_end"    [(use (match_operand 0 "" ""))    ; loop pseudo -   (use (match_operand 1 "" ""))]    ; label +   (use (match_operand 1 "" ""))    ; label +   (use (match_operand 2 "" ""))]     ; decrement constant    ""  {    if (GET_MODE (operands[0]) != DImode) diff --git a/gcc/config/pru/pru.md b/gcc/config/pru/pru.md index bdc5ad79ba06008e9fbf2aade395b4195e1b2a76..990cdfe0974f1f61082b1fc6508c405cde32a254 100644 --- a/gcc/config/pru/pru.md +++ b/gcc/config/pru/pru.md @@ -1636,7 +1636,8 @@  (define_expand "doloop_end"    [(use (match_operand 0 "nonimmediate_operand")) -   (use (label_ref (match_operand 1 "")))] +   (use (label_ref (match_operand 1 ""))) +   (use (match_operand 2 "" ""))]     ; decrement constant    "TARGET_OPT_LOOP"  {    if (GET_CODE (operands[0]) == REG && GET_MODE (operands[0]) == QImode) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index ad5a4cf2ef83329fb72963c330e6cc42deb13dcc..fdaeb6a02ca06ffcfe87c41852fefa554707e3f0 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -13422,7 +13422,8 @@  (define_expand "doloop_end"    [(use (match_operand 0))    ; loop pseudo -   (use (match_operand 1))]    ; label +   (use (match_operand 1))    ; label +   (use (match_operand 2 "" ""))]     ; decrement constant    ""  {    if (GET_MODE (operands[0]) != Pmode) diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 962927c31126b3dfade6a9314bb54e24f1df5ead..bad317fdba73c7f8150a4cd779444ced45d6ee5d 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -9780,7 +9780,8 @@  (define_expand "doloop_end"    [(use (match_operand 0 "" ""))        ; loop pseudo -   (use (match_operand 1 "" ""))]       ; label +   (use (match_operand 1 "" ""))        ; label +   (use (match_operand 2 "" ""))]       ; decrement constant    ""  {    if (GET_MODE (operands[0]) == SImode) diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md index 6ca31e3f43f4e67777e3c1bdb93a474a21e883a7..8d0812abac7e84a29d77ada60e172d89d3bbe387 100644 --- a/gcc/config/v850/v850.md +++ b/gcc/config/v850/v850.md @@ -1434,7 +1434,8 @@  (define_expand "doloop_end"   [(use (match_operand 0 "" ""))        ; loop pseudo -  (use (match_operand 1 "" ""))]       ; label +  (use (match_operand 1 "" ""))        ; label +  (use (match_operand 2 "" ""))]       ; decrement constant    "TARGET_V850E3V5_UP && TARGET_LOOP"    {      rtx loop_cnt = operands[0]; diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 110f8dfa0a9fc276e584ce4db2dfe2257409615e..7dde0b0096dfd9e996a394a2000d42e3f637c323 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -11774,6 +11774,14 @@ loops, and will help ivopts to make some decisions.  The default version of this hook returns false.  @end deftypefn +@deftypefn {Target Hook} rtx TARGET_ALLOW_ELEMENTWISE_DOLOOP (rtx @var{count}, rtx @var{label}, rtx @var{doloop}) +This target hook allows the target to support loop-doloop optimisations +where the value that gets put into the loop counter register is not a +pre-calculation of the number of iteration of the loop.  For instance, +the value used can be the number of elements that the loop will process. +The default version of this hook returns the same rtx it was given. +@end deftypefn +  @deftypevr {Target Hook} bool TARGET_HAVE_COUNT_REG_DECR_P  Return true if the target supports hardware count register for decrement  and branch. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 501ddf147e40b68b757269f703f58d1091b9e06f..cc1a81f3957d51caebec98992a4119d86878cdb8 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -7730,6 +7730,8 @@ to by @var{ce_info}.  @hook TARGET_PREDICT_DOLOOP_P +@hook TARGET_ALLOW_ELEMENTWISE_DOLOOP +  @hook TARGET_HAVE_COUNT_REG_DECR_P  @hook TARGET_DOLOOP_COST_FOR_GENERIC diff --git a/gcc/loop-doloop.cc b/gcc/loop-doloop.cc index 30b45c8071a709d9f0d03037c3876b532727e6f0..674eb429f1f5e915d67513ad6a4aa170444fc00d 100644 --- a/gcc/loop-doloop.cc +++ b/gcc/loop-doloop.cc @@ -85,29 +85,29 @@ doloop_condition_get (rtx_insn *doloop_pat)       forms:       1)  (parallel [(set (pc) (if_then_else (condition) -                              (label_ref (label)) -                            (pc))) -                 (set (reg) (plus (reg) (const_int -1))) -                 (additional clobbers and uses)]) +                        (label_ref (label)) +                        (pc))) +             (set (reg) (plus (reg) (const_int -n))) +             (additional clobbers and uses)])       The branch must be the first entry of the parallel (also required       by jump.cc), and the second entry of the parallel must be a set of       the loop counter register.  Some targets (IA-64) wrap the set of       the loop counter in an if_then_else too. -     2)  (set (reg) (plus (reg) (const_int -1)) -         (set (pc) (if_then_else (reg != 0) -                             (label_ref (label)) -                     (pc))). +     2)  (set (reg) (plus (reg) (const_int -n)) +     (set (pc) (if_then_else (reg != 0) +                 (label_ref (label)) +                 (pc))).       Some targets (ARM) do the comparison before the branch, as in the       following form: -     3) (parallel [(set (cc) (compare ((plus (reg) (const_int -1), 0))) -                   (set (reg) (plus (reg) (const_int -1)))]) -        (set (pc) (if_then_else (cc == NE) -                                (label_ref (label)) -                                (pc))) */ +     3) (parallel [(set (cc) (compare ((plus (reg) (const_int -n), 0))) +           (set (reg) (plus (reg) (const_int -n)))]) +    (set (pc) (if_then_else (cc == NE) +                (label_ref (label)) +                (pc))) */    pattern = PATTERN (doloop_pat); @@ -143,7 +143,7 @@ doloop_condition_get (rtx_insn *doloop_pat)            || GET_CODE (cmp_arg1) != PLUS)          return 0;        reg_orig = XEXP (cmp_arg1, 0); -      if (XEXP (cmp_arg1, 1) != GEN_INT (-1) +      if (!CONST_INT_P (XEXP (cmp_arg1, 1))            || !REG_P (reg_orig))          return 0;        cc_reg = SET_DEST (cmp_orig); @@ -156,7 +156,8 @@ doloop_condition_get (rtx_insn *doloop_pat)      {        /* We expect the condition to be of the form (reg != 0)  */        cond = XEXP (SET_SRC (cmp), 0); -      if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx) +      if ((GET_CODE (cond) != NE && GET_CODE (cond) != GE) +          || XEXP (cond, 1) != const0_rtx)          return 0;      }      } @@ -173,14 +174,14 @@ doloop_condition_get (rtx_insn *doloop_pat)    if (! REG_P (reg))      return 0; -  /* Check if something = (plus (reg) (const_int -1)). +  /* Check if something = (plus (reg) (const_int -n)).       On IA-64, this decrement is wrapped in an if_then_else.  */    inc_src = SET_SRC (inc);    if (GET_CODE (inc_src) == IF_THEN_ELSE)      inc_src = XEXP (inc_src, 1);    if (GET_CODE (inc_src) != PLUS        || XEXP (inc_src, 0) != reg -      || XEXP (inc_src, 1) != constm1_rtx) +      || !CONST_INT_P (XEXP (inc_src, 1)))      return 0;    /* Check for (set (pc) (if_then_else (condition) @@ -211,42 +212,49 @@ doloop_condition_get (rtx_insn *doloop_pat)        || (GET_CODE (XEXP (condition, 0)) == PLUS        && XEXP (XEXP (condition, 0), 0) == reg))     { -     if (GET_CODE (pattern) != PARALLEL)       /*  For the second form we expect: -         (set (reg) (plus (reg) (const_int -1)) -         (set (pc) (if_then_else (reg != 0) -                                 (label_ref (label)) -                                 (pc))). +     (set (reg) (plus (reg) (const_int -n)) +     (set (pc) (if_then_else (reg != 0) +                 (label_ref (label)) +                 (pc))). -         is equivalent to the following: +     If n == 1, that is equivalent to the following: -         (parallel [(set (pc) (if_then_else (reg != 1) -                                            (label_ref (label)) -                                            (pc))) -                     (set (reg) (plus (reg) (const_int -1))) -                     (additional clobbers and uses)]) +     (parallel [(set (pc) (if_then_else (reg != 1) +                        (label_ref (label)) +                        (pc))) +             (set (reg) (plus (reg) (const_int -1))) +             (additional clobbers and uses)]) -        For the third form we expect: +    For the third form we expect: -        (parallel [(set (cc) (compare ((plus (reg) (const_int -1)), 0)) -                   (set (reg) (plus (reg) (const_int -1)))]) -        (set (pc) (if_then_else (cc == NE) -                                (label_ref (label)) -                                (pc))) +    (parallel [(set (cc) (compare ((plus (reg) (const_int -n)), 0)) +           (set (reg) (plus (reg) (const_int -n)))]) +    (set (pc) (if_then_else (cc == NE) +                (label_ref (label)) +                (pc))) -        which is equivalent to the following: +    Which also for n == 1 is equivalent to the following: -        (parallel [(set (cc) (compare (reg,  1)) -                   (set (reg) (plus (reg) (const_int -1))) -                   (set (pc) (if_then_else (NE == cc) -                                           (label_ref (label)) -                                           (pc))))]) +    (parallel [(set (cc) (compare (reg,  1)) +           (set (reg) (plus (reg) (const_int -1))) +           (set (pc) (if_then_else (NE == cc) +                       (label_ref (label)) +                       (pc))))]) -        So we return the second form instead for the two cases. +    So we return the second form instead for the two cases. +    For the "elementwise" form where the decrement number isn't -1, +    the final value may be exceeded, so use GE instead of NE.       */ -        condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx); +     if (GET_CODE (pattern) != PARALLEL) +       { +    if (INTVAL (XEXP (inc_src, 1)) != -1) +      condition = gen_rtx_fmt_ee (GE, VOIDmode, inc_src, const0_rtx); +    else +      condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx);; +       }      return condition;     } @@ -685,17 +693,6 @@ doloop_optimize (class loop *loop)        return false;      } -  max_cost -    = COSTS_N_INSNS (param_max_iterations_computation_cost); -  if (set_src_cost (desc->niter_expr, mode, optimize_loop_for_speed_p (loop)) -      > max_cost) -    { -      if (dump_file) -    fprintf (dump_file, -         "Doloop: number of iterations too costly to compute.\n"); -      return false; -    } -    if (desc->const_iter)      iterations = widest_int::from (rtx_mode_t (desc->niter_expr, mode),                     UNSIGNED); @@ -720,7 +717,25 @@ doloop_optimize (class loop *loop)    count = copy_rtx (desc->niter_expr);    start_label = block_label (desc->in_edge->dest);    doloop_reg = gen_reg_rtx (mode); -  rtx_insn *doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label); +  rtx_insn *doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label, +                         count); + +  /* Not all targets need to pre-calculate the number of the iterations of +     the loop, they instead work by storing the number of elements in the +     counter_reg and decrementing that.  Call the appropriate target hook to +     change the value of count.  */ +  count = targetm.allow_elementwise_doloop (count, start_label, doloop_seq); + +  max_cost +    = COSTS_N_INSNS (param_max_iterations_computation_cost); +  if (set_src_cost (count, mode, optimize_loop_for_speed_p (loop)) +      > max_cost) +    { +      if (dump_file) +    fprintf (dump_file, +         "Doloop: number of iterations too costly to compute.\n"); +      return false; +    }    word_mode_size = GET_MODE_PRECISION (word_mode);    word_mode_max = (HOST_WIDE_INT_1U << (word_mode_size - 1) << 1) - 1; @@ -737,7 +752,7 @@ doloop_optimize (class loop *loop)        else      count = lowpart_subreg (word_mode, count, mode);        PUT_MODE (doloop_reg, word_mode); -      doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label); +      doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label, count);      }    if (! doloop_seq)      { diff --git a/gcc/target-insns.def b/gcc/target-insns.def index de8c0092f989efa9e7d1f8a2a12fcf4ffc4a6013..b77b79724262304b070c511de301d898bc3ca444 100644 --- a/gcc/target-insns.def +++ b/gcc/target-insns.def @@ -48,7 +48,7 @@ DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4))  DEF_TARGET_INSN (check_stack, (rtx x0))  DEF_TARGET_INSN (clear_cache, (rtx x0, rtx x1))  DEF_TARGET_INSN (doloop_begin, (rtx x0, rtx x1)) -DEF_TARGET_INSN (doloop_end, (rtx x0, rtx x1)) +DEF_TARGET_INSN (doloop_end, (rtx x0, rtx x1, rtx x2))  DEF_TARGET_INSN (eh_return, (rtx x0))  DEF_TARGET_INSN (epilogue, (void))  DEF_TARGET_INSN (exception_receiver, (void)) diff --git a/gcc/target.def b/gcc/target.def index a3d3b04a1657bfa006b8e9ccdc65ead2bcc7fde7..1f1c07f406fbc75b44f1afe7a1ab313005be82b0 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4392,6 +4392,16 @@ The default version of this hook returns false.",   bool, (class loop *loop),   default_predict_doloop_p) +DEFHOOK +(allow_elementwise_doloop, + "This target hook allows the target to support loop-doloop optimisations\n\ +where the value that gets put into the loop counter register is not a\n\ +pre-calculation of the number of iteration of the loop.  For instance,\n\ +the value used can be the number of elements that the loop will process.\n\ +The default version of this hook returns the same rtx it was given.", + rtx, (rtx count, rtx label, rtx doloop), + default_allow_elementwise_doloop) +  DEFHOOKPOD  (have_count_reg_decr_p,   "Return true if the target supports hardware count register for decrement\n\ diff --git a/gcc/targhooks.h b/gcc/targhooks.h index ecce55ebe797cedc940620e8d89816973a045d49..6f1f0747f300b774493316b2aa6a7863a69a085a 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -88,6 +88,7 @@ extern bool default_fixed_point_supported_p (void);  extern bool default_has_ifunc_p (void);  extern bool default_predict_doloop_p (class loop *); +extern rtx default_allow_elementwise_doloop (rtx, rtx, rtx);  extern machine_mode default_preferred_doloop_mode (machine_mode);  extern const char * default_invalid_within_doloop (const rtx_insn *); diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index d17d393baedc16574ddecb86e868799a65736660..8a3b9e7571092df3b9acc90d1bc5b508110fe912 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -661,6 +661,12 @@ default_predict_doloop_p (class loop *loop ATTRIBUTE_UNUSED)    return false;  } +rtx +default_allow_elementwise_doloop (rtx count, rtx, rtx) +{ +  return count; +} +  /* By default, just use the input MODE itself.  */  machine_mode diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int16x8.c b/gcc/testsuite/gcc.target/arm/dlstp-int16x8.c new file mode 100644 index 0000000000000000000000000000000000000000..a61f02ed3a23e077fc6bd354f89832223df4acdc --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int16x8.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void  __attribute__ ((noinline)) test (int16_t *a, int16_t *b, int16_t *c, int n) +{ +  while (n > 0) +    { +      mve_pred16_t p = vctp16q (n); +      int16x8_t va = vldrhq_z_s16 (a, p); +      int16x8_t vb = vldrhq_z_s16 (b, p); +      int16x8_t vc = vaddq_x_s16 (va, vb, p); +      vstrhq_p_s16 (c, vc, p); +      c+=8; +      a+=8; +      b+=8; +      n-=8; +    } +} + +int main () +{ +  int i; +  int16_t temp1[N]; +  int16_t temp2[N]; +  int16_t temp3[N]; +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 0); +  check_plus16 (temp1, temp2, temp3, 0); + +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 1); +  check_plus16 (temp1, temp2, temp3, 1); + +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 7); +  check_plus16 (temp1, temp2, temp3, 7); + +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 8); +  check_plus16 (temp1, temp2, temp3, 8); + +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 9); +  check_plus16 (temp1, temp2, temp3, 9); + +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 16); +  check_plus16 (temp1, temp2, temp3, 16); + +  reset_data16 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 17); +  check_plus16 (temp1, temp2, temp3, 17); + +  reset_data16 (temp1, temp2, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.16\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int32x4.c b/gcc/testsuite/gcc.target/arm/dlstp-int32x4.c new file mode 100644 index 0000000000000000000000000000000000000000..31a7264ae265a02d617ff31928cece9e37fbcc3f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int32x4.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void  __attribute__ ((noinline)) test (int32_t *a, int32_t *b, int32_t *c, int n) +{ +  while (n > 0) +    { +      mve_pred16_t p = vctp32q (n); +      int32x4_t va = vldrwq_z_s32 (a, p); +      int32x4_t vb = vldrwq_z_s32 (b, p); +      int32x4_t vc = vaddq_x_s32 (va, vb, p); +      vstrwq_p_s32 (c, vc, p); +      c+=4; +      a+=4; +      b+=4; +      n-=4; +    } +} + +int main () +{ +  int i; +  int32_t temp1[N]; +  int32_t temp2[N]; +  int32_t temp3[N]; +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 0); +  check_plus32 (temp1, temp2, temp3, 0); + +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 1); +  check_plus32 (temp1, temp2, temp3, 1); + +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 3); +  check_plus32 (temp1, temp2, temp3, 3); + +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 4); +  check_plus32 (temp1, temp2, temp3, 4); + +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 5); +  check_plus32 (temp1, temp2, temp3, 5); + +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 8); +  check_plus32 (temp1, temp2, temp3, 8); + +  reset_data32 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 9); +  check_plus32 (temp1, temp2, temp3, 9); + +  reset_data32 (temp1, temp2, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.32\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int64x2.c b/gcc/testsuite/gcc.target/arm/dlstp-int64x2.c new file mode 100644 index 0000000000000000000000000000000000000000..a09c01884da50e68de8ae5bab994e3c7d07963b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int64x2.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void  __attribute__ ((noinline)) test (int64_t *a, int64_t *c, int n) +{ +  while (n > 0) +    { +      mve_pred16_t p = vctp64q (n); +      int64x2_t va = vldrdq_gather_offset_z_s64 (a, vcreateq_u64 (8, 0), p); +      vstrdq_scatter_offset_p_s64 (c, vcreateq_u64 (8, 0), va, p); +      c+=2; +      a+=2; +      n-=2; +    } +} + +int main () +{ +  int i; +  int64_t temp1[N]; +  int64_t temp3[N]; +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 0); +  check_memcpy64 (temp1, temp3, 0); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 1); +  check_memcpy64 (temp1, temp3, 1); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 2); +  check_memcpy64 (temp1, temp3, 2); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 3); +  check_memcpy64 (temp1, temp3, 3); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 4); +  check_memcpy64 (temp1, temp3, 4); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 5); +  check_memcpy64 (temp1, temp3, 5); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 6); +  check_memcpy64 (temp1, temp3, 6); + +  reset_data64  (temp1, temp3, N); +  test (temp1, temp3, 7); +  check_memcpy64 (temp1, temp3, 7); + +  reset_data64  (temp1, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.64\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/dlstp-int8x16.c b/gcc/testsuite/gcc.target/arm/dlstp-int8x16.c new file mode 100644 index 0000000000000000000000000000000000000000..49fbd4c16a20af929e7cccd62f6a73d033afb7f5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/dlstp-int8x16.c @@ -0,0 +1,68 @@ +/* { dg-do run { target { arm*-*-* } } } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main+fp.dp+mve.fp -mfloat-abi=hard -mfpu=auto -O3 --save-temps" } */ + +#include +#include +#include +#include "lob.h" + +void  __attribute__ ((noinline)) test (int8_t *a, int8_t *b, int8_t *c, int n) +{ +  while (n > 0) +    { +      mve_pred16_t p = vctp8q (n); +      int8x16_t va = vldrbq_z_s8 (a, p); +      int8x16_t vb = vldrbq_z_s8 (b, p); +      int8x16_t vc = vaddq_x_s8 (va, vb, p); +      vstrbq_p_s8 (c, vc, p); +      c+=16; +      a+=16; +      b+=16; +      n-=16; +    } +} + +int main () +{ +  int i; +  int8_t temp1[N]; +  int8_t temp2[N]; +  int8_t temp3[N]; +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 0); +  check_plus8 (temp1, temp2, temp3, 0); + +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 1); +  check_plus8 (temp1, temp2, temp3, 1); + +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 15); +  check_plus8 (temp1, temp2, temp3, 15); + +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 16); +  check_plus8 (temp1, temp2, temp3, 16); + +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 17); +  check_plus8 (temp1, temp2, temp3, 17); + +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 32); +  check_plus8 (temp1, temp2, temp3, 32); + +  reset_data8 (temp1, temp2, temp3, N); +  test (temp1, temp2, temp3, 33); +  check_plus8 (temp1, temp2, temp3, 33); + +  reset_data8 (temp1, temp2, temp3, N); +} + +/* { dg-final { scan-assembler-times {\tdlstp.8\t} 1 } } */ +/* { dg-final { scan-assembler-times {\tletp\t} 1 } } */ +/* { dg-final { scan-assembler-not "\tvctp\t" } } */ +/* { dg-final { scan-assembler-not "\tvpst\t" } } */ +/* { dg-final { scan-assembler-not "p0" } } */ diff --git a/gcc/testsuite/gcc.target/arm/lob.h b/gcc/testsuite/gcc.target/arm/lob.h index feaae7cc89959b3147368980120700bbc3e85ecb..9a34a682160b9c0b0e9393438e7be336ed7d29c7 100644 --- a/gcc/testsuite/gcc.target/arm/lob.h +++ b/gcc/testsuite/gcc.target/arm/lob.h @@ -1,15 +1,106 @@  #include - +#include  /* Common code for lob tests.  */  #define NO_LOB asm volatile ("@ clobber lr" : : : "lr" ) -#define N 10000 +#define N 100 + +static void +reset_data8 (int8_t *a, int8_t *b, int8_t *c, int x) +{ +  memset (a, -1, x * sizeof (*a)); +  memset (b, -1, x * sizeof (*b)); +  memset (c, 0, x * sizeof (*c)); +} + +static void +reset_data16 (int16_t *a, int16_t *b, int16_t *c, int x) +{ +  memset (a, -1, x * sizeof (*a)); +  memset (b, -1, x * sizeof (*b)); +  memset (c, 0, x * sizeof (*c)); +} + +static void +reset_data32 (int32_t *a, int32_t *b, int32_t *c, int x) +{ +  memset (a, -1, x * sizeof (*a)); +  memset (b, -1, x * sizeof (*b)); +  memset (c, 0, x * sizeof (*c)); +} + +static void +reset_data64 (int64_t *a, int64_t *c, int x) +{ +  memset (a, -1, x * sizeof (*a)); +  memset (c, 0, x * sizeof (*c)); +} + +static void +check_plus8 (int8_t *a, int8_t *b, int8_t *c, int x) +{ +  for (int i = 0; i < N; i++) +    { +      NO_LOB; +      if (i < x) +    { +      if (c[i] != (a[i] + b[i])) abort (); +    } +      else +    { +      if (c[i] != 0) abort (); +    } +    } +} + +static void +check_plus16 (int16_t *a, int16_t *b, int16_t *c, int x) +{ +  for (int i = 0; i < N; i++) +    { +      NO_LOB; +      if (i < x) +    { +      if (c[i] != (a[i] + b[i])) abort (); +    } +      else +    { +      if (c[i] != 0) abort (); +    } +    } +} + +static void +check_plus32 (int32_t *a, int32_t *b, int32_t *c, int x) +{ +  for (int i = 0; i < N; i++) +    { +      NO_LOB; +      if (i < x) +    { +      if (c[i] != (a[i] + b[i])) abort (); +    } +      else +    { +      if (c[i] != 0) abort (); +    } +    } +}  static void -reset_data (int *a, int *b, int *c) +check_memcpy64 (int64_t *a, int64_t *c, int x)  { -  memset (a, -1, N * sizeof (*a)); -  memset (b, -1, N * sizeof (*b)); -  memset (c, -1, N * sizeof (*c)); +  for (int i = 0; i < N; i++) +    { +      NO_LOB; +      if (i < x) +    { +      if (c[i] != a[i]) abort (); +    } +      else +    { +      if (c[i] != 0) abort (); +    } +    }  } diff --git a/gcc/testsuite/gcc.target/arm/lob1.c b/gcc/testsuite/gcc.target/arm/lob1.c index ba5c82cd55c582c96a18ad417a3041e43d843613..e7fa3f155f926e71b00c9f294e7878e8f13766ff 100644 --- a/gcc/testsuite/gcc.target/arm/lob1.c +++ b/gcc/testsuite/gcc.target/arm/lob1.c @@ -54,29 +54,18 @@ loop3 (int *a, int *b, int *c)      } while (i < N);  } -void -check (int *a, int *b, int *c) -{ -  for (int i = 0; i < N; i++) -    { -      NO_LOB; -      if (c[i] != a[i] + b[i]) -    abort (); -    } -} -  int  main (void)  { -  reset_data (a, b, c); +  reset_data32 (a, b, c, N);    loop1 (a, b ,c); -  check (a, b ,c); -  reset_data (a, b, c); +  check_plus32 (a, b, c, N); +  reset_data32 (a, b, c, N);    loop2 (a, b ,c); -  check (a, b ,c); -  reset_data (a, b, c); +  check_plus32 (a, b, c, N); +  reset_data32 (a, b, c, N);    loop3 (a, b ,c); -  check (a, b ,c); +  check_plus32 (a, b, c, N);    return 0;  } diff --git a/gcc/testsuite/gcc.target/arm/lob6.c b/gcc/testsuite/gcc.target/arm/lob6.c index 17b6124295e8ae9e1cb57e41fa43a954b3390eec..b7f49cf70c98d78af0d7cc1c291bf83ef699863b 100644 --- a/gcc/testsuite/gcc.target/arm/lob6.c +++ b/gcc/testsuite/gcc.target/arm/lob6.c @@ -79,14 +79,14 @@ check (void)  int  main (void)  { -  reset_data (a1, b1, c1); -  reset_data (a2, b2, c2); +  reset_data32 (a1, b1, c1, N); +  reset_data32 (a2, b2, c2, N);    loop1 (a1, b1, c1);    ref1 (a2, b2, c2);    check (); -  reset_data (a1, b1, c1); -  reset_data (a2, b2, c2); +  reset_data32 (a1, b1, c1, N); +  reset_data32 (a2, b2, c2, N);    loop2 (a1, b1, c1);    ref2 (a2, b2, c2);    check (); --------------Htr1Wksa0tBt5NfASod4JlX4 Content-Type: text/x-patch; charset=UTF-8; name="rb16111.patch" Content-Disposition: attachment; filename="rb16111.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0Lm1kIGIvZ2NjL2NvbmZpZy9h YXJjaDY0L2FhcmNoNjQubWQKaW5kZXggZjJlM2Q5MDVkYmJlYjI5NDlmMjk0N2Y1Y2ZkNjgyMDhj OTRjOTI3Mi4uN2E2ZDI0YTgwMDYwYjRhNzA0YTQ4MWNjZDFhMzJkOTZlN2IwZjM2OSAxMDA2NDQK LS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKKysrIGIvZ2NjL2NvbmZpZy9hYXJj aDY0L2FhcmNoNjQubWQKQEAgLTczNjYsNyArNzM2Niw4IEBACiA7OyBrbm93cyB3aGF0IHRvIGdl bmVyYXRlLgogKGRlZmluZV9leHBhbmQgImRvbG9vcF9lbmQiCiAgIFsodXNlIChtYXRjaF9vcGVy YW5kIDAgIiIgIiIpKSAgICAgIDsgbG9vcCBwc2V1ZG8KLSAgICh1c2UgKG1hdGNoX29wZXJhbmQg MSAiIiAiIikpXSAgICAgOyBsYWJlbAorICAgKHVzZSAobWF0Y2hfb3BlcmFuZCAxICIiICIiKSkg ICAgICA7IGxhYmVsCisgICAodXNlIChtYXRjaF9vcGVyYW5kIDIgIiIgIiIpKV0gICAgIDsgZGVj cmVtZW50IGNvbnN0YW50CiAgICJvcHRpbWl6ZSA+IDAgJiYgZmxhZ19tb2R1bG9fc2NoZWQiCiB7 CiAgIHJ0eCBzMDsKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybS1wcm90b3MuaCBiL2dj Yy9jb25maWcvYXJtL2FybS1wcm90b3MuaAppbmRleCA1NTAyNzJmYWNkMTJlNjBhNDliZjhhM2Iy MGY4MTFjYzEzNzY1YjNhLi43Njg0NjIwZjBmNGQxNjFkZDllOWFkMmQ3MDMwODAyMWVjM2QzZDM0 IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS9hcm0tcHJvdG9zLmgKKysrIGIvZ2NjL2NvbmZp Zy9hcm0vYXJtLXByb3Rvcy5oCkBAIC02Myw3ICs2Myw3IEBAIGV4dGVybiB2b2lkIGFybV9kZWNv bXBvc2VfZGlfYmlub3AgKHJ0eCwgcnR4LCBydHggKiwgcnR4ICosIHJ0eCAqLCBydHggKik7CiBl eHRlcm4gYm9vbCBhcm1fcV9iaXRfYWNjZXNzICh2b2lkKTsKIGV4dGVybiBib29sIGFybV9nZV9i aXRzX2FjY2VzcyAodm9pZCk7CiBleHRlcm4gYm9vbCBhcm1fdGFyZ2V0X2luc25fb2tfZm9yX2xv YiAocnR4KTsKLQorZXh0ZXJuIHJ0eCBhcm1fYXR0ZW1wdF9kbHN0cF90cmFuc2Zvcm0gKHJ0eCwg cnR4KTsKICNpZmRlZiBSVFhfQ09ERQogZW51bSByZWdfY2xhc3MKIGFybV9tb2RlX2Jhc2VfcmVn X2NsYXNzIChtYWNoaW5lX21vZGUpOwpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLmNj IGIvZ2NjL2NvbmZpZy9hcm0vYXJtLmNjCmluZGV4IGVlOGYxYmFiZjhhMTMxOWU3N2UwZGIwZmE1 NTg1MWMwMzgwNDg4MDQuLjk5ZTE0NGQ1MmMyNjU5N2M2NGI5ODJiM2Q0YWU5YTYyYTExNGNmMTgg MTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL2FybS5jYworKysgYi9nY2MvY29uZmlnL2FybS9h cm0uY2MKQEAgLTQ3MCw2ICs0NzAsOSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9z cGVjIGFybV9hdHRyaWJ1dGVfdGFibGVbXSA9CiAjdW5kZWYgVEFSR0VUX1NDSEVEX1JFT1JERVIK ICNkZWZpbmUgVEFSR0VUX1NDSEVEX1JFT1JERVIgYXJtX3NjaGVkX3Jlb3JkZXIKIAorI3VuZGVm IFRBUkdFVF9BTExPV19FTEVNRU5UV0lTRV9ET0xPT1AKKyNkZWZpbmUgVEFSR0VUX0FMTE9XX0VM RU1FTlRXSVNFX0RPTE9PUCBhcm1fYWxsb3dfZWxlbWVudHdpc2VfZG9sb29wCisKICN1bmRlZiBU QVJHRVRfUkVHSVNURVJfTU9WRV9DT1NUCiAjZGVmaW5lIFRBUkdFVF9SRUdJU1RFUl9NT1ZFX0NP U1QgYXJtX3JlZ2lzdGVyX21vdmVfY29zdAogCkBAIC0zNDEzOCw4ICszNDE0MSwzMzkgQEAgYXJt X3RhcmdldF9pbnNuX29rX2Zvcl9sb2IgKHJ0eCBpbnNuKQogCiAgIHJldHVybiBzaW5nbGVfc3Vj Y19wIChiYikKICAgICAmJiBzaW5nbGVfcHJlZF9wIChiYikKLSAgICAmJiBzaW5nbGVfc3VjY19l ZGdlIChiYiktPmRlc3QgPT0gc2luZ2xlX3ByZWRfZWRnZSAoYmIpLT5zcmMKLSAgICAmJiBjb250 YWluc19ub19hY3RpdmVfaW5zbl9wIChiYik7CisgICAgJiYgc2luZ2xlX3N1Y2NfZWRnZSAoYmIp LT5kZXN0ID09IHNpbmdsZV9wcmVkX2VkZ2UgKGJiKS0+c3JjOworfQorCitzdGF0aWMgaW50Cith cm1fbXZlX2dldF92Y3RwX2xhbmVzIChydHggeCkKK3sKKyAgaWYgKEdFVF9DT0RFICh4KSA9PSBT RVQgJiYgR0VUX0NPREUgKFhFWFAgKHgsIDEpKSA9PSBVTlNQRUMpCisgICAgeworICAgICAgc3dp dGNoIChYSU5UIChYRVhQICh4LCAxKSwgMSkpCisJeworCSAgY2FzZSBWQ1RQOFE6CisJICAgIHJl dHVybiAxNjsKKwkgIGNhc2UgVkNUUDE2UToKKwkgICAgcmV0dXJuIDg7CisJICBjYXNlIFZDVFAz MlE6CisJICAgIHJldHVybiA0OworCSAgY2FzZSBWQ1RQNjRROgorCSAgICByZXR1cm4gMjsKKwkg IGRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBD aGVjayBpZiBhbiBpbnNuIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIFZQUl9SRUcsIGlmIGl0IGRv ZXMsIHJldHVybiB0aGUKKyAgIHN1Yi1ydHggb2YgdGhlIG1hdGNoZWQgb3BlcmFuZC4gIElmIHRo ZXJlIGFyZSBtb3JlIHRoYW4gb25lIG9wZXJhbmQgKGUuZy4gYW4KKyAgIGlucHV0IG9wZXJhbmQg YW5kIGFuIG91dHB1dCBvcGVyYW5kKSB0aGF0IHVzZSBWUFJfUkVHLCByZXR1cm4gdGhlIGZpcnN0 CisgICBvY2N1cmFuY2UsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIG91dHB1dCBvcGVyYW5kLiAgKi8K Kworc3RhdGljIHJ0eAorYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnIChydHhfaW5zbiAqaW5zbikK K3sKKyAgYm9vbCByZXF1aXJlc192cHI7CisKKyAgZXh0cmFjdF9jb25zdHJhaW5faW5zbiAoaW5z bik7CisgIGludCBuX29wZXJhbmRzID0gcmVjb2dfZGF0YS5uX29wZXJhbmRzOworICBpZiAocmVj b2dfZGF0YS5uX2FsdGVybmF0aXZlcyA9PSAwKQorICAgIHJldHVybiBOVUxMX1JUWDsKKworICAv KiBGaWxsIGluIHJlY29nX29wX2FsdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25zdHJh aW50cyBvZgorICAgICB0aGlzIGluc24uICAqLworICBwcmVwcm9jZXNzX2NvbnN0cmFpbnRzIChp bnNuKTsKKworICBmb3IgKGludCB1c2UgPSAwOyB1c2UgPCBuX29wZXJhbmRzOyB1c2UrKykKKyAg ICB7CisgICAgICByZXF1aXJlc192cHIgPSB0cnVlOworICAgICAgLyogSXRlcmF0ZSB0aHJvdWdo IGFsdGVybmF0aXZlcyBvZiBvcGVyYW5kICJ1c2UiIGluIHJlY29nX29wX2FsdCBhbmQKKyAgICAg ICAqIGlkZW50aWZ5IGlmIHRoZSBvcGVyYW5kIGlzIHJlcXVpcmVkIHRvIGJlIHRoZSBWUFIuICAq LworICAgICAgZm9yIChpbnQgYWx0MSA9IDA7IGFsdDEgPCByZWNvZ19kYXRhLm5fYWx0ZXJuYXRp dmVzOyBhbHQxKyspCisJeworCSAgY29uc3Qgb3BlcmFuZF9hbHRlcm5hdGl2ZSAqb3BfYWx0MQor CSAgICAgID0gJnJlY29nX29wX2FsdFthbHQxICogbl9vcGVyYW5kc107CisJICAvKiBGZXRjaCB0 aGUgcmVnX2NsYXNzIGZvciBlYWNoIGVudHJ5IGFuZCBjaGVjayBpdCBhZ2FpbnN0IHRoZQorCSAg ICogVlBSX1JFRyByZWdfY2xhc3MuICAqLworCSAgaWYgKGFsdGVybmF0aXZlX2NsYXNzIChvcF9h bHQxLCB1c2UpICE9IFZQUl9SRUcpCisJICAgIHJlcXVpcmVzX3ZwciA9IGZhbHNlOworCX0KKyAg ICAgIC8qIElmIGFsbCBhbHRlcm5hdGl2ZXMgb2YgdGhlIGluc24gcmVxdWlyZSB0aGUgVlBSIHJl ZyBmb3IgdGhpcyBvcGVyYW5kLAorCSBpdCBtZWFucyB0aGF0IGVpdGhlciB0aGlzIGlzIFZQUi1n ZW5lcmF0aW5nIGluc3RydWN0aW9uLCBsaWtlIGEgdmN0cCwKKwkgdmNtcCwgZXRjLiwgb3IgaXQg aXMgYSBWUFQtcHJlZGljYXRlZCBpbnNydWN0aW9uLiAgUmV0dXJuIHRoZSBzdWJydHgKKwkgb2Yg dGhlIFZQUiByZWcgb3BlcmFuZC4gICovCisgICAgICBpZiAocmVxdWlyZXNfdnByKQorCXJldHVy biByZWNvZ19kYXRhLm9wZXJhbmRbdXNlXTsKKyAgICB9CisgIHJldHVybiBOVUxMX1JUWDsKK30K KworLyogU2NhbiB0aGUgYmFzaWMgYmxvY2sgb2YgYSBsb29wIGJvZHkgZm9yIGEgdmN0cCBpbnN0 cnVjdGlvbi4gIElmIHRoZXJlIGlzCisgICBleGFjdGx5IG9uZSB1bmlxdWUgdmN0cCBpbnN0cnVj dGlvbiwgcmV0dXJuIGl0cyBydHhfaW5zbiAqLiAgKi8KKworc3RhdGljIHJ0eF9pbnNuICoKK2Fy bV9tdmVfZ2V0X2xvb3BfdW5pcXVlX3ZjdHAgKGJhc2ljX2Jsb2NrIGJiKQoreworICBydHhfaW5z biAqaW5zbiA9IEJCX0hFQUQgKGJiKTsKKyAgcnR4X2luc24gKnZjdHBfb3AgPSBOVUxMOworCisg IC8qIE5vdyBzY2FuIHRocm91Z2ggYWxsIHRoZSBpbnN0cnVjdGlvbiBwYXR0ZXJucyBhbmQKKyAg ICAgcGljayBvdXQgYW55IE1WRSBpbnN0cnVjdGlvbnMuICAqLworICBGT1JfQkJfSU5TTlMgKGJi LCBpbnNuKQorICAgIHsKKyAgICAgIGlmIChJTlNOX1AgKGluc24pKQorCXsKKwkgIC8qIEZpcnN0 IGNoZWNrIGlmIHRoaXMgaXMgYSB2Y3RwIGluc3RydWN0aW9uLiAgVGhlcmUgbmVlZHMgdG8gYmUK KwkgICAgIGV4YWN0bHkgb25lIHZjdHAgaW5zdHJ1Y3Rpb24gd2l0aGluIHRoZSBsb29wLiAgKi8K KwkgIGlmIChhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOIChpbnNuKSkgIT0gMCkKKwkg ICAgeworCSAgICAgIC8qIElmIHdlIGFscmVhZHkgZm91bmQgb25lIHZjdHAgaW5zdHJ1Y3Rpb24s IHRoZW4gdGhlCisJCSBsb29wIGlzIG5vdCBjb25zaXN0ZW50IGludGVybmFsbHkuICAqLworCSAg ICAgIGlmICh2Y3RwX29wKQorCQlyZXR1cm4gTlVMTDsKKworCSAgICAgIHZjdHBfb3AgPSBpbnNu OworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIHZjdHBfb3A7Cit9CisKK3J0eAorYXJtX2F0 dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChydHggbGFiZWwsIHJ0eCBjb3VudCkKK3sKKyAgaW50IGRl Y3JlbWVudG51bTsKKyAgYmFzaWNfYmxvY2sgYm9keSA9IEJMT0NLX0ZPUl9JTlNOIChsYWJlbCkt PnByZXZfYmI7CisgIHJ0eCBpbml0aWFsX2NvbXBhcmU7CisgIC8qIERvbG9vcCBjYW4gb25seSBi ZSBkb25lICJlbGVtZW50d2lzZSIgd2l0aCBwcmVkaWNhdGVkIGRsc3RwL2xldHAKKyAgICAgd2hl biB0aGUgaXRlcmF0aW9uIGNvdW50ZXIgZ2V0cyBkZXByZWNhdGVkIGJ5IHRoZSBudW1iZXIgb2Yg TVZFCisgICAgIGxhbmVzLiAgVGhpcyBjYW4gYmUgZXh4dHJhY3RlZCBmcm9tIHRoZSBgY291bnRg LCB3aGljaCBpcyB0aGUgZXhwcmVzc2lvbgorICAgICB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbnVt YmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCB0aGUgbG9vcCB3b3VsZCBleGVjdXRlCisgICAgIGZvciBh IHN0YW5kYXJkIGRscy9sZSBsb29wLiAgU2luY2Ugd2Ugb25seSBzdXBwb3J0IGNhc2VzIHdoZXJl IHRoaXMgaXMgYQorICAgICBwb3dlciBvZiAyLCB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhpcyBleHBy ZXNzaW9uIGFycml2ZXMgaGVyZSBhczoKKyAgICAgICAobHNoaWZ0cnQ6IChBKSAoY29uc3RfaW50 IHkpKQorICAgICBUaGVuIHdlIGNhbiBleHRyYWN0IHRoZSBkZWNyZW1lbnRudW0gZnJvbSB5LiAg Ki8KKyAgaWYgKEdFVF9DT0RFIChjb3VudCkgPT0gTFNISUZUUlQgJiYgQVJJVEhNRVRJQ19QIChY RVhQIChjb3VudCwgMCkpCisgICAgICAmJiAoZGVjcmVtZW50bnVtID0gKDEgPDwgKElOVFZBTCAo WEVYUCAoY291bnQsIDEpKSkpKQorICAgICAgLyogVGhlcmUgaXMgb25lIGZpbmFsIGNvbmRpdGlv biB0aGF0IG5lZWRzIHRvIGJlIG1ldCBmb3IgdGhlIGxvb3AgdG8gYmUKKwkgdHJhbnNmb3JtYWJs ZTogZGxzdHAvbGV0cCB3aWxsIGNvbnRpbnVlIGxvb3BpbmcgdW50aWwgdGhlcmUgYXJlCisJIGVs ZW1lbnRzIHN0aWxsIHRvIHByb2Nlc3MuICBUaGlzIGNhbiBvbmx5IHdvcmsgaWYgdGhlIGxvb3Bp bmcgZW5kcworCSB3aGVuIHRoZSBlbGVtZW50IGNvdW50ZXIgcmVhY2hlcyB6ZXJvIGFuZCBub3Qg c29tZSBvdGhlciB2YWx1ZQorCSAoZS5nLiBuID4gMCB3b3Jrcywgbm90IG4gPiAxKSwgb3Igd2Ug Y2FuIGluY29ycmVjdGx5IGVuZCB1cCBydW5uaW5nCisJIG9uZSBhZGRpdGlvbmFsIGl0ZXJhdGlv bi4gIFRvIGJ5LXBhc3MgYW55IGhvaXN0aW5nIHRoYXQgdGhlIGNvbXBpbGVyCisJIG1heSBoYXZl IGRvbmUgd2l0aCB0aGUgYEFgIGluIGBjb3VudGAgYWJvdmUsIHdlIGNhbiBpbnN0ZWFkIGxvb2sg dXAKKwkgdG8gdGhlIGJiIGJlZm9yZSB0aGUgbG9vcCBwcmVoZWFkZXI6IHRoaXMgc2hvdWxkIGVu ZCB3aXRoIGEgY21wK2p1bXAKKwkgcGFpciwgd2hlcmUgdGhlIGNtcCBuZWVkcyB0byBiZSB3aXRo IChjb25zdF9pbnQgMCkuICAqLworICAgICAgJiYgbG9vcF9wcmVoZWFkZXJfZWRnZSAoYm9keS0+ bG9vcF9mYXRoZXIpLT5zcmMtPnByZXZfYmIKKyAgICAgICYmIEJCX0VORCAobG9vcF9wcmVoZWFk ZXJfZWRnZSAoYm9keS0+bG9vcF9mYXRoZXIpLT5zcmMtPnByZXZfYmIpCisgICAgICAmJiBQUkVW X0lOU04gKEJCX0VORCAobG9vcF9wcmVoZWFkZXJfZWRnZSAoYm9keS0+bG9vcF9mYXRoZXIpCisJ CQkJLT5zcmMtPnByZXZfYmIpKQorICAgICAgJiYgSU5TTl9QIChQUkVWX0lOU04gKEJCX0VORCAo bG9vcF9wcmVoZWFkZXJfZWRnZSAoYm9keS0+bG9vcF9mYXRoZXIpCisJCQkJCS0+c3JjLT5wcmV2 X2JiKSkpCisgICAgICAmJiAoaW5pdGlhbF9jb21wYXJlCisJICA9IFBBVFRFUk4gKFBSRVZfSU5T TiAoQkJfRU5EIChsb29wX3ByZWhlYWRlcl9lZGdlIChib2R5LT5sb29wX2ZhdGhlcikKKwkJCQkJ ICAgIC0+c3JjLT5wcmV2X2JiKSkpKQorICAgICAgJiYgR0VUX0NPREUgKGluaXRpYWxfY29tcGFy ZSkgPT0gU0VUCisgICAgICAmJiBjY19yZWdpc3RlciAoWEVYUCAoaW5pdGlhbF9jb21wYXJlLCAw KSwgVk9JRG1vZGUpCisgICAgICAmJiBHRVRfQ09ERSAoWEVYUCAoaW5pdGlhbF9jb21wYXJlLCAx KSkgPT0gQ09NUEFSRQorICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGluaXRpYWxf Y29tcGFyZSwgMSksIDEpKQorICAgICAgJiYgSU5UVkFMIChYRVhQIChYRVhQIChpbml0aWFsX2Nv bXBhcmUsIDEpLCAxKSkgPT0gMCkKKyAgICB7CisgICAgICAvKiBGaW5kIHRoZSB2Y3RwIHByZWRp Y2F0ZSBnZW5lcmF0aW9uIGluc2lkZSB0aGUgbG9vcCBib2R5IEJCLiAgKi8KKyAgICAgIHJ0eF9p bnNuICp2Y3RwX2luc24gPSBhcm1fbXZlX2dldF9sb29wX3VuaXF1ZV92Y3RwIChib2R5KTsKKwor ICAgICAgLyogSWYgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgZm91bmQgb25lIGV4YWN0bHkgdmN0cCBw cmVkaWNhdGUtZ2VuZXJhdGluZworCSBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIGxvb3AgYW5kIHRo ZSBudW1iZXIgYnkgd2hpY2ggd2UgZGVwcmVjYXRlIHRoZQorCSBsb29wIGNvdW50ZXIgaW4gZWFj aCBpdGVyYXRpb24gbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGxhbmVzIG9mIHRoZQorCSB2Y3RwIGlu c3RydWN0aW9uLCB3ZSBjYW4gYXR0ZW1wdCB0byB0dXJuIHRoaXMgaW50byBhIGRsc3RwL2xldHAg bG9vcC4KKwkgKi8KKyAgICAgIGlmICh2Y3RwX2luc24KKwkgICYmIGRlY3JlbWVudG51bSA9PSBh cm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOICh2Y3RwX2luc24pKSkKKwl7CisJICBydHhf aW5zbiAqaW5zbiA9IDA7CisJICBydHhfaW5zbiAqY3VyX2luc24gPSAwOworCSAgcnR4X2luc24g KnNlcTsKKwkgIHJ0eCB2Y3RwX3Zwcl9nZW5lcmF0ZWQgPSBOVUxMX1JUWDsKKwkgIHJ0eCBpbnNu X3Zwcl9yZWdfb3BlcmFuZCA9IE5VTExfUlRYOworCSAgYm9vbCB0cmFuc2Zvcm1fd29ya2VkID0g dHJ1ZTsKKwkgIGludCBuZXdfaWNvZGU7CisKKwkgIC8qIFNjYW4gdGhyb3VnaCB0aGUgaW5zbnMg aW4gdGhlIGxvb3AgYmIgYW5kIGVtaXQgdGhlIHRyYW5zZm9ybWVkIGJiCisJICAgICBpbnNucyB0 byBhIHNlcXVlbmNlLiAgKi8KKwkgIHN0YXJ0X3NlcXVlbmNlICgpOworCSAgRk9SX0JCX0lOU05T IChib2R5LCBpbnNuKQorCSAgICB7CisJICAgICAgaWYgKElOU05fUCAoaW5zbikpCisJCXsKKwkJ ICAvKiBXaGVuIHdlIGZpbmQgdGhlIHZjdHAgaW5zdHJ1Y3Rpb246IFRoaXMgbWF5IGJlIGZvbGxv d2VkIGJ5CisJCSAgICAgYSBzaWduLWV4dGVuZCBpbnNuIHRvIFNJbW9kZS4gIElmIGl0IGlzLCB0 aGVuIHNhdmUgdGhlCisJCSAgICAgc2lnbi1leHRlbmRlZCBSRUcgaW50byB2Y3RwX3Zwcl9nZW5l cmF0ZWQuICBJZiB0aGVyZSBpcyBubworCQkgICAgIHNpZ24tZXh0ZW5kLCB0aGVuIHN0b3JlIHRo ZSByYXcgb3V0cHV0IG9mIHRoZSB2Y3RwLgorCQkgICAgIEZvciBhbnkgVlBULXByZWRpY2F0ZWQg aW5zdHJ1Y3Rpb25zIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQKKwkJICAgICB0aGUgVlBSIHRoZXkg dXNlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZ2l2ZW4gaGVyZSBhbmQKKwkJICAgICB0aGV5IG9m dGVuIGNvbnN1bWUgdGhlIG91dHB1dCBvZiBhIHN1YnJlZyBvZiB0aGUgU0ltb2RlCisJCSAgICAg c2lnbi1leHRlbmRlZCBWUFItcmVnLiAgQXMgYSByZXN1bHQsIGNvbXBhcmluZyBhZ2FpbnN0IHRo ZQorCQkgICAgIG91dHB1dCBvZiB0aGUgc2lnbi1leHRlbmQgaXMgbW9yZSBsaWtlbHkgdG8gc3Vj Y2VlZC4KKwkJICAgICBUaGlzIGNvZGUgYWxzbyBndWFyYW50ZWVzIHRvIHVzIHRoYXQgdGhlIHZj dHAgY29tZXMgYmVmb3JlCisJCSAgICAgYW55IGluc3RydWN0aW9ucyB0aGF0IHVzZSB0aGUgVlBS IHdpdGhpbiB0aGUgbG9vcCwgZm9yIHRoZQorCQkgICAgIGRsc3RwL2xldHAgdHJhbnNmb3JtIHRv IHN1Y2NlZWQuICAqLworCQkgIGlmIChpbnNuID09IHZjdHBfaW5zbikKKwkJICAgIHsKKwkJICAg ICAgaWYgKEdFVF9DT0RFIChYRVhQIChQQVRURVJOIChORVhUX0lOU04gKGluc24pKSwgMSkpCisJ CQkgICAgICA9PSBTSUdOX0VYVEVORAorCQkJICAmJiBHRVRfQ09ERSAoWEVYUCAoCisJCQkJIFBB VFRFUk4gKE5FWFRfSU5TTiAoTkVYVF9JTlNOIChpbnNuKSkpLCAxKSkKKwkJCQkgPT0gU1VCUkVH KQorCQkJdmN0cF92cHJfZ2VuZXJhdGVkCisJCQkgICAgPSBYRVhQIChQQVRURVJOIChORVhUX0lO U04gKE5FWFRfSU5TTiAoaW5zbikpKSwgMCk7CisJCSAgICAgIGVsc2UKKwkJCXZjdHBfdnByX2dl bmVyYXRlZCA9IFhFWFAgKFBBVFRFUk4gKGluc24pLCAwKTsKKwkJICAgICAgLyogQWxzbyBlbWl0 IGEgVVNFIG9mIHRoZSBzb3VyY2UgcmVnaXN0ZXIgb2YgdGhlIHZjdHAuCisJCQkgVGhpcyBob2xk cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGJlaW5nIHByb2Nlc3NlZAorCQkJIGJ5IHRoZSBsb29w LiAgVGhpcyBsYXRlciBnZXRzIHN0b3JlZCBpbnRvIGBjb3VudGAuCisJCQkgKi8KKwkJICAgICAg ZW1pdF91c2UgKFhWRUNFWFAgKFhFWFAgKFBBVFRFUk4gKGluc24pLCAxKSwgMCwgMCkpOworCQkg ICAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICAvKiBJZiB0aGUgaW5zbiBwYXR0ZXJuIHJlcXVp cmVzIHRoZSB1c2Ugb2YgdGhlIFZQUiwgdGhlbiBpdAorCQkgICAgIGEgVlBULXByZWRpY2F0ZWQg aW5zdHJ1Y3Rpb24sIHNvIGl0IHdpbGwgbmVlZCB0byBiZQorCQkgICAgIHRyYW5zZm9ybWVkIGlu dG8gdGhlIG5vbi1wcmVkaWNhdGVkIHZlcnNpb24gb2YgdGhlCisJCSAgICAgaW5zdHJ1Y3Rpb24u ICAqLworCQkgIGVsc2UgaWYgKChpbnNuX3Zwcl9yZWdfb3BlcmFuZAorCQkJICAgID0gYXJtX2dl dF9yZXF1aXJlZF92cHJfcmVnIChpbnNuKSkKKwkJCSAgICE9IE5VTExfUlRYKQorCQkgICAgewor CQkgICAgICAvKiBJZiB0aGUgVlBSIHZhbHVlIGlzIGRpZmZlcmVudCB0byB0aGUgb25lIGdlbmVy YXRlZCBieQorCQkJIHRoZSB2Y3RwLCB0aGVuIGZhaWwgdGhlIGNvbnZlcnNpb24uICAqLworCQkg ICAgICBpZiAoIXJ0eF9lcXVhbF9wICh2Y3RwX3Zwcl9nZW5lcmF0ZWQsCisJCQkJCWluc25fdnBy X3JlZ19vcGVyYW5kKSkKKwkJCXsKKwkJCSAgdHJhbnNmb3JtX3dvcmtlZCA9IGZhbHNlOworCQkJ ICBicmVhazsKKwkJCX0KKwkJICAgICAgLyogQWxzbyBlbnN1cmUgdGhhdCBpdCdzIGEgdmFsaWQg cmVjb2ctZWQgaW5zdHJ1Y3Rpb24gd2l0aAorCQkJIHRoZSBtdmVfdW5wcmVkaWNhdGVkX2luc24g YXRycmlidXRlLiAgKi8KKwkJICAgICAgZWxzZSBpZiAocmVjb2dfbWVtb2l6ZWQgKGluc24pID49 IDAKKwkJCSAgICAgICAmJiAobmV3X2ljb2RlCisJCQkJICAgPSBnZXRfYXR0cl9tdmVfdW5wcmVk aWNhdGVkX2luc24gKGluc24pKSkKKwkJCXsKKwkJCSAgZXh0cmFjdF9pbnNuIChpbnNuKTsKKwkJ CSAgcnR4IGFycls4XTsKKwkJCSAgaW50IGogPSAwOworCisJCQkgIC8qIFdoZW4gdHJhbnNmb3Jt aW5nIGEgVlBULXByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24KKwkJCSAgICAgaW50byBpdHMgdW5wcmVk aWNhdGVkIGVxdWl2YWxlbnQgd2UgbmVlZCB0byBkcm9wCisJCQkgICAgIHRoZSBWUFIgb3BlcmFu ZCBhbmQgd2UgbWF5IG5lZWQgdG8gYWxzbyBkcm9wIGEKKwkJCSAgICAgbWVyZ2UgInZ1bmluaXQi IGlucHV0IG9wZXJhbmQsIGRlcGVuZGluZyBvbiB0aGUKKwkJCSAgICAgaW5zdHJ1Y3Rpb24gcGF0 dGVybi4gIEhlcmUgZW5zdXJlIHRoYXQgd2UgaGF2ZSBhdAorCQkJICAgICBtb3N0IGEgdHdvLW9w ZXJhbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28KKwkJCSAgICAgaW5zdHJ1bmN0aW9ucy4g ICovCisJCQkgIGludCBuX29wZXJhbmRzX2RpZmYKKwkJCSAgICAgID0gcmVjb2dfZGF0YS5uX29w ZXJhbmRzCisJCQkJLSBpbnNuX2RhdGFbbmV3X2ljb2RlXS5uX29wZXJhbmRzOworCQkJICBnY2Nf YXNzZXJ0IChuX29wZXJhbmRzX2RpZmYgPiAwCisJCQkJICAgICAgJiYgbl9vcGVyYW5kc19kaWZm IDw9IDIpOworCisJCQkgIC8qIFRoZW4sIGxvb3AgdGhyb3VnaCB0aGUgb3BlcmFuZHMgb2YgdGhl IHByZWRpY2F0ZWQKKwkJCSAgICAgaW5zdHJ1Y3Rpb24sIGFuZCByZXRhaW4gdGhlIG9uZXMgdGhh dCBtYXAgdG8gdGhlCisJCQkgICAgIHVucHJlZGljYXRlZCBpbnN0cnVjdGlvbi4gICovCisJCQkg IGZvciAoaW50IGkgPSAwOyBpIDwgcmVjb2dfZGF0YS5uX29wZXJhbmRzOyBpKyspCisJCQkgICAg eworCQkJICAgICAgLyogSWdub3JlIHRoZSBWUFIgYW5kLCBpZiBuZWVkZWQsIHRoZSB2dW5pbml0 CisJCQkJIG9wZXJhbmQuICAqLworCQkJICAgICAgaWYgKGluc25fdnByX3JlZ19vcGVyYW5kID09 IHJlY29nX2RhdGEub3BlcmFuZFtpXQorCQkJCSAgfHwgKG5fb3BlcmFuZHNfZGlmZiA9PSAyCisJ CQkJICAgICAgJiYgIXN0cmNtcCAocmVjb2dfZGF0YS5jb25zdHJhaW50c1tpXSwKKwkJCQkJCSAg IjAiKSkpCisJCQkJY29udGludWU7CisJCQkgICAgICBlbHNlCisJCQkJeworCQkJCSAgYXJyW2pd ID0gcmVjb2dfZGF0YS5vcGVyYW5kW2ldOworCQkJCSAgaisrOworCQkJCX0KKwkJCSAgICB9CisK KwkJCSAgLyogRmluYWxseSwgZW1pdCB0aGUgdXByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24uICAqLwor CQkJICBzd2l0Y2ggKGopCisJCQkgICAgeworCQkJICAgICAgY2FzZSAyOgorCQkJCWVtaXRfaW5z biAoR0VOX0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBdLAorCQkJCQkJCQlhcnJbMV0pKTsKKwkJCQli cmVhazsKKwkJCSAgICAgIGNhc2UgMzoKKwkJCQllbWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29k ZSkgKGFyclswXSwgYXJyWzFdLAorCQkJCQkJCQlhcnJbMl0pKTsKKwkJCQlicmVhazsKKwkJCSAg ICAgIGRlZmF1bHQ6CisJCQkJZ2NjX3VucmVhY2hhYmxlICgpOworCQkJICAgIH0KKwkJCX0KKwkJ ICAgICAgLyogSWYgd2UgY2FuJ3QgaWRlbnRpZnkgdGhlIElOU04gYXMgZWl0aGVyIGJlaW5nIGVp dGhlcgorCQkJIGZvciBkZWxldGlvbiBvciB0byByZS1tYXAsIHRoZW4gd2UgZG9uJ3Qga25vdyBo b3cgdG8KKwkJCSBoYW5kbGUgaXQsIHNvIGZhaWwgdGhlIHdob2xlIGNvbnZlcnNpb24uICAqLwor CQkgICAgICBlbHNlCisJCQl7CisJCQkgIHRyYW5zZm9ybV93b3JrZWQgPSBmYWxzZTsKKwkJCSAg YnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgLyogSW5zdHJ1Y3Rpb25zIHRoYXQgZG9udCdzIHJl cXVpcmUgdGhlIFZQUiBjYW4gYmUgY2FycmllZAorCQkgICAgIG92ZXIgYXMtaXMuICAqLworCQkg IGVsc2UKKwkJICAgIGVtaXRfaW5zbiAoUEFUVEVSTiAoaW5zbikpOworCQl9CisJICAgIH0KKwkg IHNlcSA9IGdldF9pbnNucyAoKTsKKwkgIGVuZF9zZXF1ZW5jZSAoKTsKKworCSAgaWYgKHRyYW5z Zm9ybV93b3JrZWQpCisJICAgIHsKKwkgICAgICAvKiBSZS13cml0ZSB0aGUgZW50aXJlIEJCIGNv bnRlbnRzIHdpdGggdGhlIHRyYW5zZm9ybWVkCisJCSBzZXF1ZW5jZS4gICovCisJICAgICAgRk9S X0JCX0lOU05TX1NBRkUgKGJvZHksIGluc24sIGN1cl9pbnNuKQorCQlpZiAoSU5TTl9QIChpbnNu KSkKKwkJICBkZWxldGVfaW5zbiAoaW5zbik7CisJICAgICAgZm9yIChpbnNuID0gc2VxOyBORVhU X0lOU04gKGluc24pOyBpbnNuID0gTkVYVF9JTlNOIChpbnNuKSkKKwkJZW1pdF9pbnNuX2FmdGVy IChQQVRURVJOIChpbnNuKSwgQkJfRU5EIChib2R5KSk7CisJICAgICAgZW1pdF9qdW1wX2luc25f YWZ0ZXIgKFBBVFRFUk4gKGluc24pLCBCQl9FTkQgKGJvZHkpKTsKKwkgICAgICByZXR1cm4gR0VO X0lOVCAoZGVjcmVtZW50bnVtKTsKKwkgICAgfQorCX0KKyAgICB9CisgIC8qIEJhaWwgb3V0OiB3 ZSBjYW4ndCB1c2UgZGxzdHAvbGV0cCwgc28gcmV0dXJuIDEgdG8gYWxsb3cgbG9vcC1kb2xvb3Ag dG8gdHJ5CisgICAgIHRoZSBzdGFuZGFyZCBkbHMvbGUgcGFpci4gICovCisgIHJldHVybiBHRU5f SU5UICgxKTsKK30KKworLyogVGFyZ2V0IGhvb2sgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyB0 byBiZSBwcm9jZXNzZWQgYnkgYSBkbHN0cC9sZXRwIGxvb3AKKyAgIGludG8gYGNvdW50YCB0byBp bnRpYWxpc2UgdGhlIGNvdW50ZXIgcmVnaXN0ZXIuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdh cworICAgcHJldmlvdXNseSBleHRyYWN0ZWQgZnJvbSB0aGUgdmN0cCBpbnNuIGFuZCBwbGFjZWQg aW50byBhIFVTRSBydHguCisgICBXZSBvbmx5IGNoZWNrIHRoYXQgdGhlIGRvbG9vcF9lbmQgcGF0 dGVybiBzdWNjZXNzZnVsbHkgZGVjcmVtZW50cyBieSBhCisgICBudW1iZXIgb3RoZXIgdGhhbiAt MSBmb3IgYSB2YWxpZCBkbHN0cC9sZXRwIGxvb3AuICBObyBvdGhlciBjaGVja2luZyBpcworICAg bmVlZGVkIGFzIHRoYXQgd2FzIGRvbmUgcHJldmlvdXNseS4gICovCisKK3J0eAorYXJtX2FsbG93 X2VsZW1lbnR3aXNlX2RvbG9vcCAocnR4IGNvdW50LCBydHggbGFiZWwsIHJ0eCBkb2xvb3ApCit7 CisgIGlmIChkb2xvb3AKKyAgICAgICYmIElOVFZBTCAoWEVYUCAoU0VUX1NSQyAoWFZFQ0VYUCAo UEFUVEVSTiAoZG9sb29wKSwgMCwgMSkpLCAxKSkgIT0gLTEKKyAgICAgICYmIEFSSVRITUVUSUNf UCAoWEVYUCAoY291bnQsIDApKSkKKyAgICB7CisgICAgICBiYXNpY19ibG9jayBib2R5ID0gQkxP Q0tfRk9SX0lOU04gKGxhYmVsKS0+cHJldl9iYjsKKyAgICAgIHJ0eF9pbnNuKiBpbnNuOworICAg ICAgRk9SX0JCX0lOU05TIChib2R5LCBpbnNuKQorCXsKKwkgIGlmIChJTlNOX1AgKGluc24pICYm IEdFVF9DT0RFIChQQVRURVJOIChpbnNuKSkgPT0gVVNFKQorCSAgICB7CisJICAgICAgcnR4IG51 bV9lbGVtX3JlZyA9IGNvcHlfcnR4IChYRVhQIChQQVRURVJOIChpbnNuKSwgMCkpOworCSAgICAg IGRlbGV0ZV9pbnNuIChpbnNuKTsKKwkgICAgICByZXR1cm4gbnVtX2VsZW1fcmVnOworCSAgICB9 CisJfQorICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBjb3VudDsKIH0KIAogI2lmIENIRUNLSU5H X1AKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZCBiL2djYy9jb25maWcv YXJtL2l0ZXJhdG9ycy5tZAppbmRleCAyOTA2MmNkNmZiM2M2MWMyMjQxN2VmOGZjMjVhYmQ3ODE5 ZDJjMDM0Li5hYTJmZGFjMjJmM2M3ODg0YzE4ZWJmMTk3YjI2YTJkNTRkYTQ0YzkzIDEwMDY0NAot LS0gYS9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0vaXRl cmF0b3JzLm1kCkBAIC0xNDY0LDcgKzE0NjQsOSBAQAogCiAoZGVmaW5lX2ludF9hdHRyIG1vZGUx IFsoVkNUUDhRICI4IikgKFZDVFAxNlEgIjE2IikgKFZDVFAzMlEgIjMyIikKIAkJCShWQ1RQNjRR ICI2NCIpIChWQ1RQOFFfTSAiOCIpIChWQ1RQMTZRX00gIjE2IikKLQkJCShWQ1RQMzJRX00gIjMy IikgKFZDVFA2NFFfTSAiNjQiKV0pCisJCQkoVkNUUDMyUV9NICIzMiIpIChWQ1RQNjRRX00gIjY0 IikKKwkJCShETFNUUDggIjgiKSAoRExTVFAxNiAiMTYiKSAoRExTVFAzMiAiMzIiKQorCQkJKERM U1RQNjQgIjY0IildKQogCiA7OyBCb3RoIGtpbmRzIG9mIHJldHVybiBpbnNuLgogKGRlZmluZV9j b2RlX2l0ZXJhdG9yIFJFVFVSTlMgW3JldHVybiBzaW1wbGVfcmV0dXJuXSkKQEAgLTE3NzMsNiAr MTc3NSw4IEBACiAoZGVmaW5lX2ludF9pdGVyYXRvciBVUVJTSExMUSBbVVFSU0hMTF82NCBVUVJT SExMXzQ4XSkKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFNRUlNIUkxRIFtTUVJTSFJMXzY0IFNRUlNI UkxfNDhdKQogKGRlZmluZV9pbnRfaXRlcmF0b3IgVlNITENRX00gW1ZTSExDUV9NX1MgVlNITENR X01fVV0pCisoZGVmaW5lX2ludF9pdGVyYXRvciBETFNUUCBbRExTVFA4IERMU1RQMTYgRExTVFAz MgorCQkJCSAgIERMU1RQNjRdKQogCiA7OyBEZWZpbmUgaXRlcmF0b3JzIGZvciBWQ01MQSBvcGVy YXRpb25zCiAoZGVmaW5lX2ludF9pdGVyYXRvciBWQ01MQV9PUCBbVU5TUEVDX1ZDTUxBCmRpZmYg LS1naXQgYS9nY2MvY29uZmlnL2FybS9tdmUubWQgYi9nY2MvY29uZmlnL2FybS9tdmUubWQKaW5k ZXggYjFjOGMxYzU2OWYzMWE2Y2IxYmZkYzE2Mzk0MDQ3ZjAyZDZjZGRmNC4uM2JhZGRhYjU5MDVh OGU0NWJiZjU1ZjUzZTg3NmE2NzFkNmQ1OGM1ZSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0v bXZlLm1kCisrKyBiL2djYy9jb25maWcvYXJtL212ZS5tZApAQCAtMTA4MzcsMyArMTA4MzcsMzgg QEAKICAgICB9CiAgIERPTkU7CiB9KQorCis7OyBPcmlnaW5hbGx5IGV4cGFuZGVkIGJ5ICdwcmVk aWNhdGVkX2RvbG9vcF9lbmQnLgorKGRlZmluZV9pbnNuICIqcHJlZGljYXRlZF9kb2xvb3BfZW5k X2ludGVybmFsIgorICBbKHNldCAocGMpCisJKGlmX3RoZW5fZWxzZQorCSAgIChnZSAocGx1czpT SSAocmVnOlNJIExSX1JFR05VTSkKKwkJCShtYXRjaF9vcGVyYW5kOlNJIDAgImNvbnN0X2ludF9v cGVyYW5kIiAiIikpCisJCShjb25zdF9pbnQgMCkpCisJIChsYWJlbF9yZWYgKG1hdGNoX29wZXJh bmQgMSAiIiAiIikpCisJIChwYykpKQorICAgKHNldCAocmVnOlNJIExSX1JFR05VTSkKKwkocGx1 czpTSSAocmVnOlNJIExSX1JFR05VTSkgKG1hdGNoX2R1cCAwKSkpCisgICAoY2xvYmJlciAocmVn OkNDIENDX1JFR05VTSkpXQorICAiVEFSR0VUXzMyQklUICYmIFRBUkdFVF9IQVZFX0xPQiAmJiBU QVJHRVRfSEFWRV9NVkUgJiYgVEFSR0VUX1RIVU1CMiIKKyAgeworICAgIGlmIChnZXRfYXR0cl9s ZW5ndGggKGluc24pID09IDQpCisgICAgICByZXR1cm4gImxldHBcdCV8bHIsICVsMSI7CisgICAg ZWxzZQorICAgICAgcmV0dXJuICJzdWJzXHQlfGxyLCAjJTA7Ymd0XHQlbDEiOworICB9CisgIFso c2V0IChhdHRyICJsZW5ndGgiKQorCShpZl90aGVuX2Vsc2UKKwkgICAobHR1IChtaW51cyAocGMp IChtYXRjaF9kdXAgMSkpIChjb25zdF9pbnQgMTAyNCkpCisJICAgIChjb25zdF9pbnQgNCkKKwkg ICAgKGNvbnN0X2ludCA2KSkpCisgICAoc2V0X2F0dHIgInR5cGUiICJicmFuY2giKV0pCisKKyhk ZWZpbmVfaW5zbiAiZGxzdHA8bW9kZTE+X2luc24iCisgIFsKKyAgICAoc2V0IChyZWc6U0kgTFJf UkVHTlVNKQorCSAodW5zcGVjOlNJIFsobWF0Y2hfb3BlcmFuZDpTSSAwICJzX3JlZ2lzdGVyX29w ZXJhbmQiICJyIildCisJICBETFNUUCkpCisgIF0KKyAgIlRBUkdFVF8zMkJJVCAmJiBUQVJHRVRf SEFWRV9MT0IgJiYgVEFSR0VUX0hBVkVfTVZFICYmIFRBUkdFVF9USFVNQjIiCisgICJkbHN0cC48 bW9kZTE+XHQlfGxyLCAlMCIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0 IGEvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kIGIvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kCmlu ZGV4IGIyMzA5YTUyMTY1NTAxMDRmMjlhNzFmMzM1MDZkNDIxZjc5ZjVlMmMuLmEyMWUyOTA5ODcy YTYxOGE4YjhiMmI2OWVmYjlhNDEyZmNjOTZhODUgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJt L3RodW1iMi5tZAorKysgYi9nY2MvY29uZmlnL2FybS90aHVtYjIubWQKQEAgLTE2MTAsMTAgKzE2 MTAsMTEgQEAKIDs7IGtub3dzIHdoYXQgdG8gZ2VuZXJhdGUuCiAoZGVmaW5lX2V4cGFuZCAiZG9s b29wX2VuZCIKICAgWyh1c2UgKG1hdGNoX29wZXJhbmQgMCAiIiAiIikpICAgICAgOyBsb29wIHBz ZXVkbwotICAgKHVzZSAobWF0Y2hfb3BlcmFuZCAxICIiICIiKSldICAgICA7IGxhYmVsCisgICAo dXNlIChtYXRjaF9vcGVyYW5kIDEgIiIgIiIpKSAgICAgIDsgbGFiZWwKKyAgICh1c2UgKG1hdGNo X29wZXJhbmQgMiAiIiAiIikpXSAgICAgOyBkZWNyZW1lbnQgY29uc3RhbnQKICAgIlRBUkdFVF8z MkJJVCIKICAgIgotIHsKK3sKICAgIC8qIEN1cnJlbnRseSBTTVMgcmVsaWVzIG9uIHRoZSBkby1s b29wIHBhdHRlcm4gdG8gcmVjb2duaXplIGxvb3BzCiAgICAgICB3aGVyZSAoMSkgdGhlIGNvbnRy b2wgcGFydCBjb25zaXN0cyBvZiBhbGwgaW5zbnMgZGVmaW5pbmcgYW5kL29yCiAgICAgICB1c2lu ZyBhIGNlcnRhaW4gJ2NvdW50JyByZWdpc3RlciBhbmQgKDIpIHRoZSBsb29wIGNvdW50IGNhbiBi ZQpAQCAtMTYyMyw0MSArMTYyNCw2OCBAQAogCiAgICAgICBBbHNvIHVzZWQgdG8gaW1wbGVtZW50 IHRoZSBsb3cgb3ZlciBoZWFkIGxvb3BzIGZlYXR1cmUsIHdoaWNoIGlzIHBhcnQgb2YKICAgICAg IHRoZSBBcm12OC4xLU0gTWFpbmxpbmUgTG93IE92ZXJoZWFkIEJyYW5jaCAoTE9CKSBleHRlbnNp b24uICAqLwotICAgaWYgKG9wdGltaXplID4gMCAmJiAoZmxhZ19tb2R1bG9fc2NoZWQgfHwgVEFS R0VUX0hBVkVfTE9CKSkKLSAgIHsKLSAgICAgcnR4IHMwOwotICAgICBydHggYmNvbXA7Ci0gICAg IHJ0eCBsb2NfcmVmOwotICAgICBydHggY2NfcmVnOwotICAgICBydHggaW5zbjsKLSAgICAgcnR4 IGNtcDsKLQotICAgICBpZiAoR0VUX01PREUgKG9wZXJhbmRzWzBdKSAhPSBTSW1vZGUpCi0gICAg ICAgRkFJTDsKLQotICAgICBzMCA9IG9wZXJhbmRzIFswXTsKLQotICAgICAvKiBMb3cgb3ZlciBo ZWFkIGxvb3AgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgdGhlIGZpcnN0IG9wZXJhbmQgdG8gYmUgTFIu ICAqLwotICAgICBpZiAoVEFSR0VUX0hBVkVfTE9CICYmIGFybV90YXJnZXRfaW5zbl9va19mb3Jf bG9iIChvcGVyYW5kcyBbMV0pKQotICAgICAgIHMwID0gZ2VuX3J0eF9SRUcgKFNJbW9kZSwgTFJf UkVHTlVNKTsKLQotICAgICBpZiAoVEFSR0VUX1RIVU1CMikKLSAgICAgICBpbnNuID0gZW1pdF9p bnNuIChnZW5fdGh1bWIyX2FkZHNpM19jb21wYXJlMCAoczAsIHMwLCBHRU5fSU5UICgtMSkpKTsK LSAgICAgZWxzZQotICAgICAgIGluc24gPSBlbWl0X2luc24gKGdlbl9hZGRzaTNfY29tcGFyZTAg KHMwLCBzMCwgR0VOX0lOVCAoLTEpKSk7Ci0KLSAgICAgY21wID0gWFZFQ0VYUCAoUEFUVEVSTiAo aW5zbiksIDAsIDApOwotICAgICBjY19yZWcgPSBTRVRfREVTVCAoY21wKTsKLSAgICAgYmNvbXAg PSBnZW5fcnR4X05FIChWT0lEbW9kZSwgY2NfcmVnLCBjb25zdDBfcnR4KTsKLSAgICAgbG9jX3Jl ZiA9IGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgb3BlcmFuZHMgWzFdKTsKLSAgICAgZW1p dF9qdW1wX2luc24gKGdlbl9ydHhfU0VUIChwY19ydHgsCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZ2VuX3J0eF9JRl9USEVOX0VMU0UgKFZPSURtb2RlLCBiY29tcCwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jX3Jl ZiwgcGNfcnR4KSkpOwotICAgICBET05FOwotICAgfQotIGVsc2UKLSAgIEZBSUw7Ci0gfSIpCisg IGlmIChvcHRpbWl6ZSA+IDAgJiYgKGZsYWdfbW9kdWxvX3NjaGVkIHx8IFRBUkdFVF9IQVZFX0xP QikpCisgICAgeworICAgICAgcnR4IHMwOworICAgICAgcnR4IGJjb21wOworICAgICAgcnR4IGxv Y19yZWY7CisgICAgICBydHggY2NfcmVnOworICAgICAgcnR4IGluc247CisgICAgICBydHggY21w OworICAgICAgcnR4IGRlY3JlbWVudF9udW07CisKKyAgICAgIGlmIChHRVRfTU9ERSAob3BlcmFu ZHNbMF0pICE9IFNJbW9kZSkKKwlGQUlMOworCisgICAgICBzMCA9IG9wZXJhbmRzWzBdOworCisg ICAgICAgaWYgKFRBUkdFVF9IQVZFX0xPQiAmJiBhcm1fdGFyZ2V0X2luc25fb2tfZm9yX2xvYiAo b3BlcmFuZHNbMV0pKQorCXsKKwkgIHMwID0gZ2VuX3J0eF9SRUcgKFNJbW9kZSwgTFJfUkVHTlVN KTsKKworCSAgLyogSWYgd2UgaGF2ZSBhIGNvbXBhdGliZSBNVkUgdGFyZ2V0LCB0cnkgYW5kIGFu YWx5c2UgdGhlIGxvb3AKKwkgICAgIGNvbnRlbnRzIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gdXNl IHByZWRpY2F0ZWQgZGxzdHAvbGV0cAorCSAgICAgbG9vcGluZy4gICovCisJICBpZiAoVEFSR0VU X0hBVkVfTVZFICYmIFRBUkdFVF9USFVNQjIKKwkgICAgICAmJiAoZGVjcmVtZW50X251bSA9IGFy bV9hdHRlbXB0X2Rsc3RwX3RyYW5zZm9ybSAob3BlcmFuZHNbMV0sCisJCQkJCQkJICAgICAgIG9w ZXJhbmRzWzJdKSkKKwkgICAgICAmJiAoSU5UVkFMIChkZWNyZW1lbnRfbnVtKSAhPSAxKSkKKwkg ICAgeworCSAgICAgIGluc24gPSBlbWl0X2luc24KKwkJICAgICAgKGdlbl90aHVtYjJfYWRkc2kz X2NvbXBhcmUwCisJCQkgIChzMCwgczAsIEdFTl9JTlQgKCgtMSkgKiAoSU5UVkFMIChkZWNyZW1l bnRfbnVtKSkpKSk7CisJICAgICAgY21wID0gWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksIDAsIDAp OworCSAgICAgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXApOworCSAgICAgIGJjb21wID0gZ2VuX3J0 eF9HRSAoVk9JRG1vZGUsIGNjX3JlZywgY29uc3QwX3J0eCk7CisJICAgICAgbG9jX3JlZiA9IGdl bl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgb3BlcmFuZHNbMV0pOworCSAgICAgIGVtaXRfanVt cF9pbnNuIChnZW5fcnR4X1NFVCAocGNfcnR4LAorCQkJCSAgICAgICBnZW5fcnR4X0lGX1RIRU5f RUxTRSAoVk9JRG1vZGUsIGJjb21wLAorCQkJCQkJCSAgICAgbG9jX3JlZiwgcGNfcnR4KSkpOwor CSAgICAgIERPTkU7CisJICAgIH0KKworCSAgLyogT3RoZXJ3aXNlLCB0cnkgc3RhbmRhcmQgZGVj cmVtZW50LWJ5LW9uZSBkbHMvbGUgbG9vcGluZy4gICovCisJICBpZiAoVEFSR0VUX1RIVU1CMikK KwkgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3RodW1iMl9hZGRzaTNfY29tcGFyZTAgKHMwLCBz MCwKKwkJCQkJCQkgIEdFTl9JTlQgKC0xKSkpOworCSAgZWxzZQorCSAgICBpbnNuID0gZW1pdF9p bnNuIChnZW5fYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdFTl9JTlQgKC0xKSkpOworCisJICBj bXAgPSBYVkVDRVhQIChQQVRURVJOIChpbnNuKSwgMCwgMCk7CisJICBjY19yZWcgPSBTRVRfREVT VCAoY21wKTsKKwkgIGJjb21wID0gZ2VuX3J0eF9ORSAoVk9JRG1vZGUsIGNjX3JlZywgY29uc3Qw X3J0eCk7CisJICBsb2NfcmVmID0gZ2VuX3J0eF9MQUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5k c1sxXSk7CisJICBlbWl0X2p1bXBfaW5zbiAoZ2VuX3J0eF9TRVQgKHBjX3J0eCwKKwkJCQkgICAg ICAgZ2VuX3J0eF9JRl9USEVOX0VMU0UgKFZPSURtb2RlLCBiY29tcCwKKwkJCQkJCQkgICAgIGxv Y19yZWYsIHBjX3J0eCkpKTsKKwkgIERPTkU7CisJfQorICAgICAgZWxzZQorCUZBSUw7CisgICAg fQorICBlbHNlCisgICAgRkFJTDsKK30iKQogCiAoZGVmaW5lX2luc24gIipjbGVhcl9hcHNyIgog ICBbKHVuc3BlY192b2xhdGlsZTpTSSBbKGNvbnN0X2ludCAwKV0gVlVOU1BFQ19DTFJNX0FQU1Ip CkBAIC0xNzU1LDcgKzE3ODMsMzcgQEAKICAgewogICAgIGlmIChSRUdOTyAob3BlcmFuZHNbMF0p ID09IExSX1JFR05VTSkKICAgICAgIHsKLQllbWl0X2luc24gKGdlbl9kbHNfaW5zbiAob3BlcmFu ZHNbMF0pKTsKKwkvKiBQaWNrIG91dCB0aGUgbnVtYmVyIGJ5IHdoaWNoIHdlIGFyZSBkZWNyZW1l bnRpbmcgdGhlIGxvb3AgY291bnRlcgorCSAgIGluIGV2ZXJ5IGl0ZXJhdGlvbi4gIElmIGl0J3Mg PiAxLCB0aGVuIHVzZSBkbHN0cC4gICovCisJaW50IGNvbnN0X2ludF9kZWNfbnVtCisJICAgICA9 IGFicyAoSU5UVkFMIChYRVhQIChYRVhQIChYVkVDRVhQIChQQVRURVJOIChvcGVyYW5kc1sxXSks IDAsIDEpLAorCQkJCSAgMSksCisJCQkgICAgMSkpKTsKKwlzd2l0Y2ggKGNvbnN0X2ludF9kZWNf bnVtKQorCSAgeworCSAgICBjYXNlIDE2OgorCSAgICAgIGVtaXRfaW5zbiAoZ2VuX2Rsc3RwOF9p bnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgODoKKwkgICAg ICBlbWl0X2luc24gKGdlbl9kbHN0cDE2X2luc24gKG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJl YWs7CisKKwkgICAgY2FzZSA0OgorCSAgICAgIGVtaXRfaW5zbiAoZ2VuX2Rsc3RwMzJfaW5zbiAo b3BlcmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIDI6CisJICAgICAgZW1p dF9pbnNuIChnZW5fZGxzdHA2NF9pbnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJyZWFrOwor CisJICAgIGNhc2UgMToKKwkgICAgICBlbWl0X2luc24gKGdlbl9kbHNfaW5zbiAob3BlcmFuZHNb MF0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGdjY191bnJlYWNo YWJsZSAoKTsKKwkgIH0KIAlET05FOwogICAgICAgfQogICAgIGVsc2UKZGlmZiAtLWdpdCBhL2dj Yy9jb25maWcvYXJtL3Vuc3BlY3MubWQgYi9nY2MvY29uZmlnL2FybS91bnNwZWNzLm1kCmluZGV4 IDc3NDhlNzg0Mzc5NDNjYTBjZDBkODkwOTMzMGVhOGQzYjQ5NDhhZTMuLjc0NGU3YWI1NzMxYjUw MTBjZTI4MGEwNDZjNWE5NGY2ZjU5MGMzNTAgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL3Vu c3BlY3MubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0vdW5zcGVjcy5tZApAQCAtNTc5LDYgKzU3OSwx MCBAQAogICBWQ1RQMTZRCiAgIFZDVFAzMlEKICAgVkNUUDY0UQorICBETFNUUDgKKyAgRExTVFAx NgorICBETFNUUDMyCisgIERMU1RQNjQKICAgVlBOT1QKICAgVkNSRUFURVFfRgogICBWQ1ZUUV9O X1RPX0ZfUwpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pYTY0L2lhNjQubWQgYi9nY2MvY29uZmln L2lhNjQvaWE2NC5tZAppbmRleCA1ZDFkNDdkYTU1YjJmMGEyYWUwMDFjMzI3NzQ2N2FlMTk1MTNm YmUxLi41YjI0YmQ3NmFjZTU3ODljY2M3ZTg2MGM1ODcyNDEzYmI2NjFjZjg4IDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2lhNjQvaWE2NC5tZAorKysgYi9nY2MvY29uZmlnL2lhNjQvaWE2NC5tZApA QCAtMzk1Niw3ICszOTU2LDggQEAKIAogKGRlZmluZV9leHBhbmQgImRvbG9vcF9lbmQiCiAgIFso dXNlIChtYXRjaF9vcGVyYW5kIDAgIiIgIiIpKQk7IGxvb3AgcHNldWRvCi0gICAodXNlIChtYXRj aF9vcGVyYW5kIDEgIiIgIiIpKV0JOyBsYWJlbAorICAgKHVzZSAobWF0Y2hfb3BlcmFuZCAxICIi ICIiKSkJOyBsYWJlbAorICAgKHVzZSAobWF0Y2hfb3BlcmFuZCAyICIiICIiKSldICAgICA7IGRl Y3JlbWVudCBjb25zdGFudAogICAiIgogewogICBpZiAoR0VUX01PREUgKG9wZXJhbmRzWzBdKSAh PSBESW1vZGUpCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL3BydS9wcnUubWQgYi9nY2MvY29uZmln L3BydS9wcnUubWQKaW5kZXggYmRjNWFkNzliYTA2MDA4ZTlmYmYyYWFkZTM5NWI0MTk1ZTFiMmE3 Ni4uOTkwY2RmZTA5NzRmMWY2MTA4MmIxZmM2NTA4YzQwNWNkZTMyYTI1NCAxMDA2NDQKLS0tIGEv Z2NjL2NvbmZpZy9wcnUvcHJ1Lm1kCisrKyBiL2djYy9jb25maWcvcHJ1L3BydS5tZApAQCAtMTYz Niw3ICsxNjM2LDggQEAKIAogKGRlZmluZV9leHBhbmQgImRvbG9vcF9lbmQiCiAgIFsodXNlICht YXRjaF9vcGVyYW5kIDAgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIikpCi0gICAodXNlIChsYWJlbF9y ZWYgKG1hdGNoX29wZXJhbmQgMSAiIikpKV0KKyAgICh1c2UgKGxhYmVsX3JlZiAobWF0Y2hfb3Bl cmFuZCAxICIiKSkpCisgICAodXNlIChtYXRjaF9vcGVyYW5kIDIgIiIgIiIpKV0gICAgIDsgZGVj cmVtZW50IGNvbnN0YW50CiAgICJUQVJHRVRfT1BUX0xPT1AiCiB7CiAgIGlmIChHRVRfQ09ERSAo b3BlcmFuZHNbMF0pID09IFJFRyAmJiBHRVRfTU9ERSAob3BlcmFuZHNbMF0pID09IFFJbW9kZSkK ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvcnM2MDAwL3JzNjAwMC5tZCBiL2djYy9jb25maWcvcnM2 MDAwL3JzNjAwMC5tZAppbmRleCBhZDVhNGNmMmVmODMzMjlmYjcyOTYzYzMzMGU2Y2M0MmRlYjEz ZGNjLi5mZGFlYjZhMDJjYTA2ZmZjZmU4N2M0MTg1MmZlZmE1NTQ3MDdlM2YwIDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL3JzNjAwMC9yczYwMDAubWQKKysrIGIvZ2NjL2NvbmZpZy9yczYwMDAvcnM2 MDAwLm1kCkBAIC0xMzQyMiw3ICsxMzQyMiw4IEBACiAKIChkZWZpbmVfZXhwYW5kICJkb2xvb3Bf ZW5kIgogICBbKHVzZSAobWF0Y2hfb3BlcmFuZCAwKSkJOyBsb29wIHBzZXVkbwotICAgKHVzZSAo bWF0Y2hfb3BlcmFuZCAxKSldCTsgbGFiZWwKKyAgICh1c2UgKG1hdGNoX29wZXJhbmQgMSkpCTsg bGFiZWwKKyAgICh1c2UgKG1hdGNoX29wZXJhbmQgMiAiIiAiIikpXSAgICAgOyBkZWNyZW1lbnQg Y29uc3RhbnQKICAgIiIKIHsKICAgaWYgKEdFVF9NT0RFIChvcGVyYW5kc1swXSkgIT0gUG1vZGUp CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL3MzOTAvczM5MC5tZCBiL2djYy9jb25maWcvczM5MC9z MzkwLm1kCmluZGV4IDk2MjkyN2MzMTEyNmIzZGZhZGU2YTkzMTRiYjU0ZTI0ZjFkZjVlYWQuLmJh ZDMxN2ZkYmE3M2M3ZjgxNTBhNGNkNzc5NDQ0Y2VkNDVkNmVlNWQgMTAwNjQ0Ci0tLSBhL2djYy9j b25maWcvczM5MC9zMzkwLm1kCisrKyBiL2djYy9jb25maWcvczM5MC9zMzkwLm1kCkBAIC05Nzgw LDcgKzk3ODAsOCBAQAogCiAoZGVmaW5lX2V4cGFuZCAiZG9sb29wX2VuZCIKICAgWyh1c2UgKG1h dGNoX29wZXJhbmQgMCAiIiAiIikpICAgICAgICA7IGxvb3AgcHNldWRvCi0gICAodXNlIChtYXRj aF9vcGVyYW5kIDEgIiIgIiIpKV0gICAgICAgOyBsYWJlbAorICAgKHVzZSAobWF0Y2hfb3BlcmFu ZCAxICIiICIiKSkgICAgICAgIDsgbGFiZWwKKyAgICh1c2UgKG1hdGNoX29wZXJhbmQgMiAiIiAi IikpXSAgICAgICA7IGRlY3JlbWVudCBjb25zdGFudAogICAiIgogewogICBpZiAoR0VUX01PREUg KG9wZXJhbmRzWzBdKSA9PSBTSW1vZGUpCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL3Y4NTAvdjg1 MC5tZCBiL2djYy9jb25maWcvdjg1MC92ODUwLm1kCmluZGV4IDZjYTMxZTNmNDNmNGU2Nzc3N2Uz YzFiZGI5M2E0NzRhMjFlODgzYTcuLjhkMDgxMmFiYWM3ZTg0YTI5ZDc3YWRhNjBlMTcyZDg5ZDNi YmUzODcgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvdjg1MC92ODUwLm1kCisrKyBiL2djYy9jb25m aWcvdjg1MC92ODUwLm1kCkBAIC0xNDM0LDcgKzE0MzQsOCBAQAogCiAoZGVmaW5lX2V4cGFuZCAi ZG9sb29wX2VuZCIKICBbKHVzZSAobWF0Y2hfb3BlcmFuZCAwICIiICIiKSkgICAgICAgIDsgbG9v cCBwc2V1ZG8KLSAgKHVzZSAobWF0Y2hfb3BlcmFuZCAxICIiICIiKSldICAgICAgIDsgbGFiZWwK KyAgKHVzZSAobWF0Y2hfb3BlcmFuZCAxICIiICIiKSkgICAgICAgIDsgbGFiZWwKKyAgKHVzZSAo bWF0Y2hfb3BlcmFuZCAyICIiICIiKSldICAgICAgIDsgZGVjcmVtZW50IGNvbnN0YW50CiAgICJU QVJHRVRfVjg1MEUzVjVfVVAgJiYgVEFSR0VUX0xPT1AiCiAgIHsKICAgICBydHggbG9vcF9jbnQg PSBvcGVyYW5kc1swXTsKZGlmZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aSBiL2djYy9kb2MvdG0u dGV4aQppbmRleCAxMTBmOGRmYTBhOWZjMjc2ZTU4NGNlNGRiMmRmZTIyNTc0MDk2MTVlLi43ZGRl MGIwMDk2ZGZkOWU5OTZhMzk0YTIwMDBkNDJlM2Y2MzdjMzIzIDEwMDY0NAotLS0gYS9nY2MvZG9j L3RtLnRleGkKKysrIGIvZ2NjL2RvYy90bS50ZXhpCkBAIC0xMTc3NCw2ICsxMTc3NCwxNCBAQCBs b29wcywgYW5kIHdpbGwgaGVscCBpdm9wdHMgdG8gbWFrZSBzb21lIGRlY2lzaW9ucy4KIFRoZSBk ZWZhdWx0IHZlcnNpb24gb2YgdGhpcyBob29rIHJldHVybnMgZmFsc2UuCiBAZW5kIGRlZnR5cGVm bgogCitAZGVmdHlwZWZuIHtUYXJnZXQgSG9va30gcnR4IFRBUkdFVF9BTExPV19FTEVNRU5UV0lT RV9ET0xPT1AgKHJ0eCBAdmFye2NvdW50fSwgcnR4IEB2YXJ7bGFiZWx9LCBydHggQHZhcntkb2xv b3B9KQorVGhpcyB0YXJnZXQgaG9vayBhbGxvd3MgdGhlIHRhcmdldCB0byBzdXBwb3J0IGxvb3At ZG9sb29wIG9wdGltaXNhdGlvbnMKK3doZXJlIHRoZSB2YWx1ZSB0aGF0IGdldHMgcHV0IGludG8g dGhlIGxvb3AgY291bnRlciByZWdpc3RlciBpcyBub3QgYQorcHJlLWNhbGN1bGF0aW9uIG9mIHRo ZSBudW1iZXIgb2YgaXRlcmF0aW9uIG9mIHRoZSBsb29wLiAgRm9yIGluc3RhbmNlLAordGhlIHZh bHVlIHVzZWQgY2FuIGJlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUgbG9vcCB3aWxs IHByb2Nlc3MuCitUaGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoaXMgaG9vayByZXR1cm5zIHRoZSBz YW1lIHJ0eCBpdCB3YXMgZ2l2ZW4uCitAZW5kIGRlZnR5cGVmbgorCiBAZGVmdHlwZXZyIHtUYXJn ZXQgSG9va30gYm9vbCBUQVJHRVRfSEFWRV9DT1VOVF9SRUdfREVDUl9QCiBSZXR1cm4gdHJ1ZSBp ZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIGhhcmR3YXJlIGNvdW50IHJlZ2lzdGVyIGZvciBkZWNyZW1l bnQKIGFuZCBicmFuY2guCmRpZmYgLS1naXQgYS9nY2MvZG9jL3RtLnRleGkuaW4gYi9nY2MvZG9j L3RtLnRleGkuaW4KaW5kZXggNTAxZGRmMTQ3ZTQwYjY4Yjc1NzI2OWY3MDNmNThkMTA5MWI5ZTA2 Zi4uY2MxYTgxZjM5NTdkNTFjYWViZWM5ODk5MmE0MTE5ZDg2ODc4Y2RiOCAxMDA2NDQKLS0tIGEv Z2NjL2RvYy90bS50ZXhpLmluCisrKyBiL2djYy9kb2MvdG0udGV4aS5pbgpAQCAtNzczMCw2ICs3 NzMwLDggQEAgdG8gYnkgQHZhcntjZV9pbmZvfS4KIAogQGhvb2sgVEFSR0VUX1BSRURJQ1RfRE9M T09QX1AKIAorQGhvb2sgVEFSR0VUX0FMTE9XX0VMRU1FTlRXSVNFX0RPTE9PUAorCiBAaG9vayBU QVJHRVRfSEFWRV9DT1VOVF9SRUdfREVDUl9QCiAKIEBob29rIFRBUkdFVF9ET0xPT1BfQ09TVF9G T1JfR0VORVJJQwpkaWZmIC0tZ2l0IGEvZ2NjL2xvb3AtZG9sb29wLmNjIGIvZ2NjL2xvb3AtZG9s b29wLmNjCmluZGV4IDMwYjQ1YzgwNzFhNzA5ZDlmMGQwMzAzN2MzODc2YjUzMjcyN2U2ZjAuLjY3 NGViNDI5ZjFmNWU5MTVkNjc1MTNhZDZhNGFhMTcwNDQ0ZmMwMGQgMTAwNjQ0Ci0tLSBhL2djYy9s b29wLWRvbG9vcC5jYworKysgYi9nY2MvbG9vcC1kb2xvb3AuY2MKQEAgLTg1LDI5ICs4NSwyOSBA QCBkb2xvb3BfY29uZGl0aW9uX2dldCAocnR4X2luc24gKmRvbG9vcF9wYXQpCiAgICAgIGZvcm1z OgogCiAgICAgIDEpICAocGFyYWxsZWwgWyhzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChjb25kaXRp b24pCi0JICAJCQkgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0JCQkJICAgICAgICAg ICAgKHBjKSkpCi0JICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2lu dCAtMSkpKQotCSAgICAgICAgICAgICAoYWRkaXRpb25hbCBjbG9iYmVycyBhbmQgdXNlcyldKQor CQkJCQkgICAgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCQkgICAgKHBjKSkpCisJCSAgICAgKHNl dCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkpCisJCSAgICAgKGFkZGl0aW9uYWwg Y2xvYmJlcnMgYW5kIHVzZXMpXSkKIAogICAgICBUaGUgYnJhbmNoIG11c3QgYmUgdGhlIGZpcnN0 IGVudHJ5IG9mIHRoZSBwYXJhbGxlbCAoYWxzbyByZXF1aXJlZAogICAgICBieSBqdW1wLmNjKSwg YW5kIHRoZSBzZWNvbmQgZW50cnkgb2YgdGhlIHBhcmFsbGVsIG11c3QgYmUgYSBzZXQgb2YKICAg ICAgdGhlIGxvb3AgY291bnRlciByZWdpc3Rlci4gIFNvbWUgdGFyZ2V0cyAoSUEtNjQpIHdyYXAg dGhlIHNldCBvZgogICAgICB0aGUgbG9vcCBjb3VudGVyIGluIGFuIGlmX3RoZW5fZWxzZSB0b28u CiAKLSAgICAgMikgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAg ICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCi0JICAgICAgICAgICAgICAg ICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLQkJCSAgICAgICAgIChwYykpKS4gIAorICAg ICAyKSAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkKKwkgKHNldCAocGMp IChpZl90aGVuX2Vsc2UgKHJlZyAhPSAwKQorCQkJCSAobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJ IChwYykpKS4KIAogICAgICBTb21lIHRhcmdldHMgKEFSTSkgZG8gdGhlIGNvbXBhcmlzb24gYmVm b3JlIHRoZSBicmFuY2gsIGFzIGluIHRoZQogICAgICBmb2xsb3dpbmcgZm9ybToKIAotICAgICAz KSAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAoKHBsdXMgKHJlZykgKGNvbnN0X2ludCAt MSksIDApKSkKLSAgICAgICAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25z dF9pbnQgLTEpKSldKQotICAgICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY2MgPT0gTkUp Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkpICovCisgICAgIDMpIChwYXJhbGxl bCBbKHNldCAoY2MpIChjb21wYXJlICgocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSwgMCkpKQor CQkgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLW4pKSldKQorCShzZXQgKHBj KSAoaWZfdGhlbl9lbHNlIChjYyA9PSBORSkKKwkJCQkobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJ KHBjKSkpICovCiAKICAgcGF0dGVybiA9IFBBVFRFUk4gKGRvbG9vcF9wYXQpOwogCkBAIC0xNDMs NyArMTQzLDcgQEAgZG9sb29wX2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQog CSAgICAgIHx8IEdFVF9DT0RFIChjbXBfYXJnMSkgIT0gUExVUykKIAkgICAgcmV0dXJuIDA7CiAJ ICByZWdfb3JpZyA9IFhFWFAgKGNtcF9hcmcxLCAwKTsKLQkgIGlmIChYRVhQIChjbXBfYXJnMSwg MSkgIT0gR0VOX0lOVCAoLTEpIAorCSAgaWYgKCFDT05TVF9JTlRfUCAoWEVYUCAoY21wX2FyZzEs IDEpKQogCSAgICAgIHx8ICFSRUdfUCAocmVnX29yaWcpKQogCSAgICByZXR1cm4gMDsKIAkgIGNj X3JlZyA9IFNFVF9ERVNUIChjbXBfb3JpZyk7CkBAIC0xNTYsNyArMTU2LDggQEAgZG9sb29wX2Nv bmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogCXsKIAkgIC8qIFdlIGV4cGVjdCB0 aGUgY29uZGl0aW9uIHRvIGJlIG9mIHRoZSBmb3JtIChyZWcgIT0gMCkgICovCiAJICBjb25kID0g WEVYUCAoU0VUX1NSQyAoY21wKSwgMCk7Ci0JICBpZiAoR0VUX0NPREUgKGNvbmQpICE9IE5FIHx8 IFhFWFAgKGNvbmQsIDEpICE9IGNvbnN0MF9ydHgpCisJICBpZiAoKEdFVF9DT0RFIChjb25kKSAh PSBORSAmJiBHRVRfQ09ERSAoY29uZCkgIT0gR0UpCisJICAgICAgfHwgWEVYUCAoY29uZCwgMSkg IT0gY29uc3QwX3J0eCkKIAkgICAgcmV0dXJuIDA7CiAJfQogICAgIH0KQEAgLTE3MywxNCArMTc0 LDE0IEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAqZG9sb29wX3BhdCkKICAgaWYg KCEgUkVHX1AgKHJlZykpCiAgICAgcmV0dXJuIDA7CiAKLSAgLyogQ2hlY2sgaWYgc29tZXRoaW5n ID0gKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpLgorICAvKiBDaGVjayBpZiBzb21ldGhpbmcg PSAocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkuCiAgICAgIE9uIElBLTY0LCB0aGlzIGRlY3Jl bWVudCBpcyB3cmFwcGVkIGluIGFuIGlmX3RoZW5fZWxzZS4gICovCiAgIGluY19zcmMgPSBTRVRf U1JDIChpbmMpOwogICBpZiAoR0VUX0NPREUgKGluY19zcmMpID09IElGX1RIRU5fRUxTRSkKICAg ICBpbmNfc3JjID0gWEVYUCAoaW5jX3NyYywgMSk7CiAgIGlmIChHRVRfQ09ERSAoaW5jX3NyYykg IT0gUExVUwogICAgICAgfHwgWEVYUCAoaW5jX3NyYywgMCkgIT0gcmVnCi0gICAgICB8fCBYRVhQ IChpbmNfc3JjLCAxKSAhPSBjb25zdG0xX3J0eCkKKyAgICAgIHx8ICFDT05TVF9JTlRfUCAoWEVY UCAoaW5jX3NyYywgMSkpKQogICAgIHJldHVybiAwOwogCiAgIC8qIENoZWNrIGZvciAoc2V0IChw YykgKGlmX3RoZW5fZWxzZSAoY29uZGl0aW9uKQpAQCAtMjExLDQyICsyMTIsNDkgQEAgZG9sb29w X2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogICAgICAgfHwgKEdFVF9DT0RF IChYRVhQIChjb25kaXRpb24sIDApKSA9PSBQTFVTCiAJICAmJiBYRVhQIChYRVhQIChjb25kaXRp b24sIDApLCAwKSA9PSByZWcpKQogICAgewotICAgICBpZiAoR0VUX0NPREUgKHBhdHRlcm4pICE9 IFBBUkFMTEVMKQogICAgICAvKiAgRm9yIHRoZSBzZWNvbmQgZm9ybSB3ZSBleHBlY3Q6CiAKLSAg ICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAgICAgICAo c2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAocGMpKSkuCisJIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikp CisJIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChyZWcgIT0gMCkKKwkJCQkgKGxhYmVsX3JlZiAo bGFiZWwpKQorCQkJCSAocGMpKSkuCiAKLSAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZv bGxvd2luZzoKKwkgSWYgbiA9PSAxLCB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2lu ZzoKIAotICAgICAgICAgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9 IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9y ZWYgKGxhYmVsKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHBjKSkpCi0gICAgICAgICAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25z dF9pbnQgLTEpKSkKLSAgICAgICAgICAgICAgICAgICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFu ZCB1c2VzKV0pCisJIChwYXJhbGxlbCBbKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKHJlZyAhPSAx KQorCQkJCQkgICAgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCQkgICAgKHBjKSkpCisJCSAgICAg KHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpCisJCSAgICAgKGFkZGl0aW9u YWwgY2xvYmJlcnMgYW5kIHVzZXMpXSkKIAotICAgICAgICBGb3IgdGhlIHRoaXJkIGZvcm0gd2Ug ZXhwZWN0OgorCUZvciB0aGUgdGhpcmQgZm9ybSB3ZSBleHBlY3Q6CiAKLSAgICAgICAgKHBhcmFs bGVsIFsoc2V0IChjYykgKGNvbXBhcmUgKChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSwgMCkp Ci0gICAgICAgICAgICAgICAgICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0x KSkpXSkKLSAgICAgICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNjID09IE5FKQotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChwYykpKSAKKwkocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29t cGFyZSAoKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpLCAwKSkKKwkJICAgKHNldCAocmVnKSAo cGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkpXSkKKwkoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAo Y2MgPT0gTkUpCisJCQkJKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCShwYykpKQogCi0gICAgICAg IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKKwlXaGljaCBhbHNvIGZvciBu ID09IDEgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgogCi0gICAgICAgIChwYXJhbGxl bCBbKHNldCAoY2MpIChjb21wYXJlIChyZWcsICAxKSkKLSAgICAgICAgICAgICAgICAgICAoc2V0 IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkKLSAgICAgICAgICAgICAgICAgICAo c2V0IChwYykgKGlmX3RoZW5fZWxzZSAoTkUgPT0gY2MpCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYykpKSldKQorCShwYXJhbGxlbCBbKHNldCAo Y2MpIChjb21wYXJlIChyZWcsICAxKSkKKwkJICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29u c3RfaW50IC0xKSkpCisJCSAgIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChORSA9PSBjYykKKwkJ CQkJICAgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCQkgICAocGMpKSkpXSkKIAotICAgICAgICBT byB3ZSByZXR1cm4gdGhlIHNlY29uZCBmb3JtIGluc3RlYWQgZm9yIHRoZSB0d28gY2FzZXMuCisJ U28gd2UgcmV0dXJuIHRoZSBzZWNvbmQgZm9ybSBpbnN0ZWFkIGZvciB0aGUgdHdvIGNhc2VzLgog CisJRm9yIHRoZSAiZWxlbWVudHdpc2UiIGZvcm0gd2hlcmUgdGhlIGRlY3JlbWVudCBudW1iZXIg aXNuJ3QgLTEsCisJdGhlIGZpbmFsIHZhbHVlIG1heSBiZSBleGNlZWRlZCwgc28gdXNlIEdFIGlu c3RlYWQgb2YgTkUuCiAgICAgICovCi0gICAgICAgIGNvbmRpdGlvbiA9IGdlbl9ydHhfZm10X2Vl IChORSwgVk9JRG1vZGUsIGluY19zcmMsIGNvbnN0MV9ydHgpOworICAgICBpZiAoR0VUX0NPREUg KHBhdHRlcm4pICE9IFBBUkFMTEVMKQorICAgICAgIHsKKwlpZiAoSU5UVkFMIChYRVhQIChpbmNf c3JjLCAxKSkgIT0gLTEpCisJICBjb25kaXRpb24gPSBnZW5fcnR4X2ZtdF9lZSAoR0UsIFZPSURt b2RlLCBpbmNfc3JjLCBjb25zdDBfcnR4KTsKKwllbHNlCisJICBjb25kaXRpb24gPSBnZW5fcnR4 X2ZtdF9lZSAoTkUsIFZPSURtb2RlLCBpbmNfc3JjLCBjb25zdDFfcnR4KTs7CisgICAgICAgfQog CiAgICAgcmV0dXJuIGNvbmRpdGlvbjsKICAgIH0KQEAgLTY4NSwxNyArNjkzLDYgQEAgZG9sb29w X29wdGltaXplIChjbGFzcyBsb29wICpsb29wKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K IAotICBtYXhfY29zdAotICAgID0gQ09TVFNfTl9JTlNOUyAocGFyYW1fbWF4X2l0ZXJhdGlvbnNf Y29tcHV0YXRpb25fY29zdCk7Ci0gIGlmIChzZXRfc3JjX2Nvc3QgKGRlc2MtPm5pdGVyX2V4cHIs IG1vZGUsIG9wdGltaXplX2xvb3BfZm9yX3NwZWVkX3AgKGxvb3ApKQotICAgICAgPiBtYXhfY29z dCkKLSAgICB7Ci0gICAgICBpZiAoZHVtcF9maWxlKQotCWZwcmludGYgKGR1bXBfZmlsZSwKLQkJ ICJEb2xvb3A6IG51bWJlciBvZiBpdGVyYXRpb25zIHRvbyBjb3N0bHkgdG8gY29tcHV0ZS5cbiIp OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICBpZiAoZGVzYy0+Y29uc3RfaXRlcikK ICAgICBpdGVyYXRpb25zID0gd2lkZXN0X2ludDo6ZnJvbSAocnR4X21vZGVfdCAoZGVzYy0+bml0 ZXJfZXhwciwgbW9kZSksCiAJCQkJICAgVU5TSUdORUQpOwpAQCAtNzIwLDcgKzcxNywyNSBAQCBk b2xvb3Bfb3B0aW1pemUgKGNsYXNzIGxvb3AgKmxvb3ApCiAgIGNvdW50ID0gY29weV9ydHggKGRl c2MtPm5pdGVyX2V4cHIpOwogICBzdGFydF9sYWJlbCA9IGJsb2NrX2xhYmVsIChkZXNjLT5pbl9l ZGdlLT5kZXN0KTsKICAgZG9sb29wX3JlZyA9IGdlbl9yZWdfcnR4IChtb2RlKTsKLSAgcnR4X2lu c24gKmRvbG9vcF9zZXEgPSB0YXJnZXRtLmdlbl9kb2xvb3BfZW5kIChkb2xvb3BfcmVnLCBzdGFy dF9sYWJlbCk7CisgIHJ0eF9pbnNuICpkb2xvb3Bfc2VxID0gdGFyZ2V0bS5nZW5fZG9sb29wX2Vu ZCAoZG9sb29wX3JlZywgc3RhcnRfbGFiZWwsCisJCQkJCQkgY291bnQpOworCisgIC8qIE5vdCBh bGwgdGFyZ2V0cyBuZWVkIHRvIHByZS1jYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0aGUgaXRlcmF0 aW9ucyBvZgorICAgICB0aGUgbG9vcCwgdGhleSBpbnN0ZWFkIHdvcmsgYnkgc3RvcmluZyB0aGUg bnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQorICAgICBjb3VudGVyX3JlZyBhbmQgZGVjcmVtZW50 aW5nIHRoYXQuICBDYWxsIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQgaG9vayB0bworICAgICBjaGFu Z2UgdGhlIHZhbHVlIG9mIGNvdW50LiAgKi8KKyAgY291bnQgPSB0YXJnZXRtLmFsbG93X2VsZW1l bnR3aXNlX2RvbG9vcCAoY291bnQsIHN0YXJ0X2xhYmVsLCBkb2xvb3Bfc2VxKTsKKworICBtYXhf Y29zdAorICAgID0gQ09TVFNfTl9JTlNOUyAocGFyYW1fbWF4X2l0ZXJhdGlvbnNfY29tcHV0YXRp b25fY29zdCk7CisgIGlmIChzZXRfc3JjX2Nvc3QgKGNvdW50LCBtb2RlLCBvcHRpbWl6ZV9sb29w X2Zvcl9zcGVlZF9wIChsb29wKSkKKyAgICAgID4gbWF4X2Nvc3QpCisgICAgeworICAgICAgaWYg KGR1bXBfZmlsZSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsCisJCSAiRG9sb29wOiBudW1iZXIgb2Yg aXRlcmF0aW9ucyB0b28gY29zdGx5IHRvIGNvbXB1dGUuXG4iKTsKKyAgICAgIHJldHVybiBmYWxz ZTsKKyAgICB9CiAKICAgd29yZF9tb2RlX3NpemUgPSBHRVRfTU9ERV9QUkVDSVNJT04gKHdvcmRf bW9kZSk7CiAgIHdvcmRfbW9kZV9tYXggPSAoSE9TVF9XSURFX0lOVF8xVSA8PCAod29yZF9tb2Rl X3NpemUgLSAxKSA8PCAxKSAtIDE7CkBAIC03MzcsNyArNzUyLDcgQEAgZG9sb29wX29wdGltaXpl IChjbGFzcyBsb29wICpsb29wKQogICAgICAgZWxzZQogCWNvdW50ID0gbG93cGFydF9zdWJyZWcg KHdvcmRfbW9kZSwgY291bnQsIG1vZGUpOwogICAgICAgUFVUX01PREUgKGRvbG9vcF9yZWcsIHdv cmRfbW9kZSk7Ci0gICAgICBkb2xvb3Bfc2VxID0gdGFyZ2V0bS5nZW5fZG9sb29wX2VuZCAoZG9s b29wX3JlZywgc3RhcnRfbGFiZWwpOworICAgICAgZG9sb29wX3NlcSA9IHRhcmdldG0uZ2VuX2Rv bG9vcF9lbmQgKGRvbG9vcF9yZWcsIHN0YXJ0X2xhYmVsLCBjb3VudCk7CiAgICAgfQogICBpZiAo ISBkb2xvb3Bfc2VxKQogICAgIHsKZGlmZiAtLWdpdCBhL2djYy90YXJnZXQtaW5zbnMuZGVmIGIv Z2NjL3RhcmdldC1pbnNucy5kZWYKaW5kZXggZGU4YzAwOTJmOTg5ZWZhOWU3ZDFmOGEyYTEyZmNm NGZmYzRhNjAxMy4uYjc3Yjc5NzI0MjYyMzA0YjA3MGM1MTFkZTMwMWQ4OThiYzNjYTQ0NCAxMDA2 NDQKLS0tIGEvZ2NjL3RhcmdldC1pbnNucy5kZWYKKysrIGIvZ2NjL3RhcmdldC1pbnNucy5kZWYK QEAgLTQ4LDcgKzQ4LDcgQEAgREVGX1RBUkdFVF9JTlNOIChjYXNlc2ksIChydHggeDAsIHJ0eCB4 MSwgcnR4IHgyLCBydHggeDMsIHJ0eCB4NCkpCiBERUZfVEFSR0VUX0lOU04gKGNoZWNrX3N0YWNr LCAocnR4IHgwKSkKIERFRl9UQVJHRVRfSU5TTiAoY2xlYXJfY2FjaGUsIChydHggeDAsIHJ0eCB4 MSkpCiBERUZfVEFSR0VUX0lOU04gKGRvbG9vcF9iZWdpbiwgKHJ0eCB4MCwgcnR4IHgxKSkKLURF Rl9UQVJHRVRfSU5TTiAoZG9sb29wX2VuZCwgKHJ0eCB4MCwgcnR4IHgxKSkKK0RFRl9UQVJHRVRf SU5TTiAoZG9sb29wX2VuZCwgKHJ0eCB4MCwgcnR4IHgxLCBydHggeDIpKQogREVGX1RBUkdFVF9J TlNOIChlaF9yZXR1cm4sIChydHggeDApKQogREVGX1RBUkdFVF9JTlNOIChlcGlsb2d1ZSwgKHZv aWQpKQogREVGX1RBUkdFVF9JTlNOIChleGNlcHRpb25fcmVjZWl2ZXIsICh2b2lkKSkKZGlmZiAt LWdpdCBhL2djYy90YXJnZXQuZGVmIGIvZ2NjL3RhcmdldC5kZWYKaW5kZXggYTNkM2IwNGExNjU3 YmZhMDA2YjhlOWNjZGM2NWVhZDJiY2M3ZmRlNy4uMWYxYzA3ZjQwNmZiYzc1YjQ0ZjFhZmU3YTFh YjMxMzAwNWJlODJiMCAxMDA2NDQKLS0tIGEvZ2NjL3RhcmdldC5kZWYKKysrIGIvZ2NjL3Rhcmdl dC5kZWYKQEAgLTQzOTIsNiArNDM5MiwxNiBAQCBUaGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoaXMg aG9vayByZXR1cm5zIGZhbHNlLiIsCiAgYm9vbCwgKGNsYXNzIGxvb3AgKmxvb3ApLAogIGRlZmF1 bHRfcHJlZGljdF9kb2xvb3BfcCkKIAorREVGSE9PSworKGFsbG93X2VsZW1lbnR3aXNlX2RvbG9v cCwKKyAiVGhpcyB0YXJnZXQgaG9vayBhbGxvd3MgdGhlIHRhcmdldCB0byBzdXBwb3J0IGxvb3At ZG9sb29wIG9wdGltaXNhdGlvbnNcblwKK3doZXJlIHRoZSB2YWx1ZSB0aGF0IGdldHMgcHV0IGlu dG8gdGhlIGxvb3AgY291bnRlciByZWdpc3RlciBpcyBub3QgYVxuXAorcHJlLWNhbGN1bGF0aW9u IG9mIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uIG9mIHRoZSBsb29wLiAgRm9yIGluc3RhbmNlLFxu XAordGhlIHZhbHVlIHVzZWQgY2FuIGJlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUg bG9vcCB3aWxsIHByb2Nlc3MuXG5cCitUaGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoaXMgaG9vayBy ZXR1cm5zIHRoZSBzYW1lIHJ0eCBpdCB3YXMgZ2l2ZW4uIiwKKyBydHgsIChydHggY291bnQsIHJ0 eCBsYWJlbCwgcnR4IGRvbG9vcCksCisgZGVmYXVsdF9hbGxvd19lbGVtZW50d2lzZV9kb2xvb3Ap CisKIERFRkhPT0tQT0QKIChoYXZlX2NvdW50X3JlZ19kZWNyX3AsCiAgIlJldHVybiB0cnVlIGlm IHRoZSB0YXJnZXQgc3VwcG9ydHMgaGFyZHdhcmUgY291bnQgcmVnaXN0ZXIgZm9yIGRlY3JlbWVu dFxuXApkaWZmIC0tZ2l0IGEvZ2NjL3Rhcmdob29rcy5oIGIvZ2NjL3Rhcmdob29rcy5oCmluZGV4 IGVjY2U1NWViZTc5N2NlZGM5NDA2MjBlOGQ4OTgxNjk3M2EwNDVkNDkuLjZmMWYwNzQ3ZjMwMGI3 NzQ0OTMzMTZiMmFhNmE3ODYzYTY5YTA4NWEgMTAwNjQ0Ci0tLSBhL2djYy90YXJnaG9va3MuaAor KysgYi9nY2MvdGFyZ2hvb2tzLmgKQEAgLTg4LDYgKzg4LDcgQEAgZXh0ZXJuIGJvb2wgZGVmYXVs dF9maXhlZF9wb2ludF9zdXBwb3J0ZWRfcCAodm9pZCk7CiBleHRlcm4gYm9vbCBkZWZhdWx0X2hh c19pZnVuY19wICh2b2lkKTsKIAogZXh0ZXJuIGJvb2wgZGVmYXVsdF9wcmVkaWN0X2RvbG9vcF9w IChjbGFzcyBsb29wICopOworZXh0ZXJuIHJ0eCBkZWZhdWx0X2FsbG93X2VsZW1lbnR3aXNlX2Rv bG9vcCAocnR4LCBydHgsIHJ0eCk7CiBleHRlcm4gbWFjaGluZV9tb2RlIGRlZmF1bHRfcHJlZmVy cmVkX2RvbG9vcF9tb2RlIChtYWNoaW5lX21vZGUpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKiBkZWZh dWx0X2ludmFsaWRfd2l0aGluX2RvbG9vcCAoY29uc3QgcnR4X2luc24gKik7CiAKZGlmZiAtLWdp dCBhL2djYy90YXJnaG9va3MuY2MgYi9nY2MvdGFyZ2hvb2tzLmNjCmluZGV4IGQxN2QzOTNiYWVk YzE2NTc0ZGRlY2I4NmU4Njg3OTlhNjU3MzY2NjAuLjhhM2I5ZTc1NzEwOTJkZjNiOWFjYzkwZDFi YzViNTA4MTEwZmU5MTIgMTAwNjQ0Ci0tLSBhL2djYy90YXJnaG9va3MuY2MKKysrIGIvZ2NjL3Rh cmdob29rcy5jYwpAQCAtNjYxLDYgKzY2MSwxMiBAQCBkZWZhdWx0X3ByZWRpY3RfZG9sb29wX3Ag KGNsYXNzIGxvb3AgKmxvb3AgQVRUUklCVVRFX1VOVVNFRCkKICAgcmV0dXJuIGZhbHNlOwogfQog CitydHgKK2RlZmF1bHRfYWxsb3dfZWxlbWVudHdpc2VfZG9sb29wIChydHggY291bnQsIHJ0eCwg cnR4KQoreworICByZXR1cm4gY291bnQ7Cit9CisKIC8qIEJ5IGRlZmF1bHQsIGp1c3QgdXNlIHRo ZSBpbnB1dCBNT0RFIGl0c2VsZi4gICovCiAKIG1hY2hpbmVfbW9kZQpkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9kbHN0cC1pbnQxNng4LmMgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYXJtL2Rsc3RwLWludDE2eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNjFmMDJlZDNhMjNl MDc3ZmM2YmQzNTRmODk4MzIyMjNkZjRhY2RjCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2FybS9kbHN0cC1pbnQxNng4LmMKQEAgLTAsMCArMSw2OCBAQAorLyog eyBkZy1kbyBydW4geyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJl LWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLXNraXAtaWYg ImF2b2lkIGNvbmZsaWN0aW5nIG11bHRpbGliIG9wdGlvbnMiIHsgKi0qLSogfSB7ICItbWFybSIg Ii1tY3B1PSoiIH0gfSAqLworLyogeyBkZy1vcHRpb25zICItbWFyY2g9YXJtdjguMS1tLm1haW4r ZnAuZHArbXZlLmZwIC1tZmxvYXQtYWJpPWhhcmQgLW1mcHU9YXV0byAtTzMgLS1zYXZlLXRlbXBz IiB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNs dWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJsb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAo KG5vaW5saW5lKSkgdGVzdCAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50 IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZj dHAxNnEgKG4pOworICAgICAgaW50MTZ4OF90IHZhID0gdmxkcmhxX3pfczE2IChhLCBwKTsKKyAg ICAgIGludDE2eDhfdCB2YiA9IHZsZHJocV96X3MxNiAoYiwgcCk7CisgICAgICBpbnQxNng4X3Qg dmMgPSB2YWRkcV94X3MxNiAodmEsIHZiLCBwKTsKKyAgICAgIHZzdHJocV9wX3MxNiAoYywgdmMs IHApOworICAgICAgYys9ODsKKyAgICAgIGErPTg7CisgICAgICBiKz04OworICAgICAgbi09ODsK KyAgICB9Cit9CisKK2ludCBtYWluICgpCit7CisgIGludCBpOworICBpbnQxNl90IHRlbXAxW05d OworICBpbnQxNl90IHRlbXAyW05dOworICBpbnQxNl90IHRlbXAzW05dOworICByZXNldF9kYXRh MTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCAwKTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNl dF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIs IHRlbXAzLCAxKTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKwor ICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwg dGVtcDIsIHRlbXAzLCA3KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3 KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0 ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCA4KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0 ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCA5KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4p OworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNik7CisgIGNoZWNrX3BsdXMxNiAodGVt cDEsIHRlbXAyLCB0ZW1wMywgMTYpOworCisgIHJlc2V0X2RhdGExNiAodGVtcDEsIHRlbXAyLCB0 ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1 czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNyk7CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwg dGVtcDIsIHRlbXAzLCBOKTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRp bWVzIHtcdGRsc3RwLjE2XHR9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItdGltZXMge1x0bGV0cFx0fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLW5vdCAiXHR2Y3RwXHQiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiXHR2cHN0XHQiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5v dCAicDAiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9k bHN0cC1pbnQzMng0LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2Rsc3RwLWludDMy eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwLi4zMWE3MjY0YWUyNjVhMDJkNjE3ZmYzMTkyOGNlY2U5ZTM3ZmJjYzNm Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9kbHN0cC1p bnQzMng0LmMKQEAgLTAsMCArMSw2OCBAQAorLyogeyBkZy1kbyBydW4geyB0YXJnZXQgeyBhcm0q LSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFt X212ZV9vayB9ICovCisvKiB7IGRnLXNraXAtaWYgImF2b2lkIGNvbmZsaWN0aW5nIG11bHRpbGli IG9wdGlvbnMiIHsgKi0qLSogfSB7ICItbWFybSIgIi1tY3B1PSoiIH0gfSAqLworLyogeyBkZy1v cHRpb25zICItbWFyY2g9YXJtdjguMS1tLm1haW4rZnAuZHArbXZlLmZwIC1tZmxvYXQtYWJpPWhh cmQgLW1mcHU9YXV0byAtTzMgLS1zYXZlLXRlbXBzIiB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZl Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJs b2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50MzJfdCAq YSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAg ICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90 IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96 X3MzMiAoYiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBw KTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYys9NDsKKyAgICAgIGEr PTQ7CisgICAgICBiKz00OworICAgICAgbi09NDsKKyAgICB9Cit9CisKK2ludCBtYWluICgpCit7 CisgIGludCBpOworICBpbnQzMl90IHRlbXAxW05dOworICBpbnQzMl90IHRlbXAyW05dOworICBp bnQzMl90IHRlbXAzW05dOworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4p OworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czMyICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKyAgY2hlY2tfcGx1czMy ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAzKTsKKyAgY2hlY2tf cGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAzKTsKKworICByZXNldF9kYXRhMzIgKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA0KTsKKyAg Y2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA0KTsKKworICByZXNldF9kYXRhMzIg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA1 KTsKKyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA1KTsKKworICByZXNldF9k YXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCA4KTsKKyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKworICBy ZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCA5KTsKKyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsK KworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworfQorCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0ZGxzdHAuMzJcdH0gMSB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwXHR9IDEgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHBcdCIgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZwc3RcdCIgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2Rsc3RwLWludDY0eDIuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9hcm0vZGxzdHAtaW50NjR4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmEwOWMwMTg4NGRhNTBl NjhkZThhZTViYWI5OTRlM2M3ZDA3OTYzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvYXJtL2Rsc3RwLWludDY0eDIuYwpAQCAtMCwwICsxLDY4IEBACisvKiB7 IGRnLWRvIHJ1biB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUt ZWZmZWN0aXZlLXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctc2tpcC1pZiAi YXZvaWQgY29uZmxpY3RpbmcgbXVsdGlsaWIgb3B0aW9ucyIgeyAqLSotKiB9IHsgIi1tYXJtIiAi LW1jcHU9KiIgfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1tYXJjaD1hcm12OC4xLW0ubWFpbitm cC5kcCttdmUuZnAgLW1mbG9hdC1hYmk9aGFyZCAtbWZwdT1hdXRvIC1PMyAtLXNhdmUtdGVtcHMi IH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1 ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxvYi5oIgorCit2b2lkICBfX2F0dHJpYnV0ZV9fICgo bm9pbmxpbmUpKSB0ZXN0IChpbnQ2NF90ICphLCBpbnQ2NF90ICpjLCBpbnQgbikKK3sKKyAgd2hp bGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDY0cSAobik7Cisg ICAgICBpbnQ2NHgyX3QgdmEgPSB2bGRyZHFfZ2F0aGVyX29mZnNldF96X3M2NCAoYSwgdmNyZWF0 ZXFfdTY0ICg4LCAwKSwgcCk7CisgICAgICB2c3RyZHFfc2NhdHRlcl9vZmZzZXRfcF9zNjQgKGMs IHZjcmVhdGVxX3U2NCAoOCwgMCksIHZhLCBwKTsKKyAgICAgIGMrPTI7CisgICAgICBhKz0yOwor ICAgICAgbi09MjsKKyAgICB9Cit9CisKK2ludCBtYWluICgpCit7CisgIGludCBpOworICBpbnQ2 NF90IHRlbXAxW05dOworICBpbnQ2NF90IHRlbXAzW05dOworICByZXNldF9kYXRhNjQgICh0ZW1w MSwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDMsIDApOworICBjaGVja19tZW1jcHk2 NCAodGVtcDEsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhNjQgICh0ZW1wMSwgdGVtcDMsIE4p OworICB0ZXN0ICh0ZW1wMSwgdGVtcDMsIDEpOworICBjaGVja19tZW1jcHk2NCAodGVtcDEsIHRl bXAzLCAxKTsKKworICByZXNldF9kYXRhNjQgICh0ZW1wMSwgdGVtcDMsIE4pOworICB0ZXN0ICh0 ZW1wMSwgdGVtcDMsIDIpOworICBjaGVja19tZW1jcHk2NCAodGVtcDEsIHRlbXAzLCAyKTsKKwor ICByZXNldF9kYXRhNjQgICh0ZW1wMSwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDMs IDMpOworICBjaGVja19tZW1jcHk2NCAodGVtcDEsIHRlbXAzLCAzKTsKKworICByZXNldF9kYXRh NjQgICh0ZW1wMSwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDMsIDQpOworICBjaGVj a19tZW1jcHk2NCAodGVtcDEsIHRlbXAzLCA0KTsKKworICByZXNldF9kYXRhNjQgICh0ZW1wMSwg dGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDMsIDUpOworICBjaGVja19tZW1jcHk2NCAo dGVtcDEsIHRlbXAzLCA1KTsKKworICByZXNldF9kYXRhNjQgICh0ZW1wMSwgdGVtcDMsIE4pOwor ICB0ZXN0ICh0ZW1wMSwgdGVtcDMsIDYpOworICBjaGVja19tZW1jcHk2NCAodGVtcDEsIHRlbXAz LCA2KTsKKworICByZXNldF9kYXRhNjQgICh0ZW1wMSwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1w MSwgdGVtcDMsIDcpOworICBjaGVja19tZW1jcHk2NCAodGVtcDEsIHRlbXAzLCA3KTsKKworICBy ZXNldF9kYXRhNjQgICh0ZW1wMSwgdGVtcDMsIE4pOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItdGltZXMge1x0ZGxzdHAuNjRcdH0gMSB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwXHR9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHBcdCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItbm90ICJcdHZwc3RcdCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJwMCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvYXJtL2Rsc3RwLWludDh4MTYuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h cm0vZGxzdHAtaW50OHgxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ5ZmJkNGMxNmEyMGFmOTI5ZTdjY2NkNjJm NmE3M2QwMzNhZmI3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvYXJtL2Rsc3RwLWludDh4MTYuYwpAQCAtMCwwICsxLDY4IEBACisvKiB7IGRnLWRvIHJ1biB7 IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRh cmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctc2tpcC1pZiAiYXZvaWQgY29uZmxp Y3RpbmcgbXVsdGlsaWIgb3B0aW9ucyIgeyAqLSotKiB9IHsgIi1tYXJtIiAiLW1jcHU9KiIgfSB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1tYXJjaD1hcm12OC4xLW0ubWFpbitmcC5kcCttdmUuZnAg LW1mbG9hdC1hYmk9aGFyZCAtbWZwdT1hdXRvIC1PMyAtLXNhdmUtdGVtcHMiIH0gKi8KKworI2lu Y2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5o PgorI2luY2x1ZGUgImxvYi5oIgorCit2b2lkICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB0 ZXN0IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUg KG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAg IGludDh4MTZfdCB2YSA9IHZsZHJicV96X3M4IChhLCBwKTsKKyAgICAgIGludDh4MTZfdCB2YiA9 IHZsZHJicV96X3M4IChiLCBwKTsKKyAgICAgIGludDh4MTZfdCB2YyA9IHZhZGRxX3hfczggKHZh LCB2YiwgcCk7CisgICAgICB2c3RyYnFfcF9zOCAoYywgdmMsIHApOworICAgICAgYys9MTY7Cisg ICAgICBhKz0xNjsKKyAgICAgIGIrPTE2OworICAgICAgbi09MTY7CisgICAgfQorfQorCitpbnQg bWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50OF90IHRlbXAxW05dOworICBpbnQ4X3QgdGVtcDJb Tl07CisgIGludDhfdCB0ZW1wM1tOXTsKKyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czgg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOworCisgIHJlc2V0X2RhdGE4ICh0ZW1wMSwgdGVtcDIs IHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMSk7CisgIGNoZWNrX3Bs dXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRl bXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE1KTsKKyAgY2hl Y2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE1KTsKKworICByZXNldF9kYXRhOCAodGVt cDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2KTsK KyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2KTsKKworICByZXNldF9kYXRh OCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IDE3KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKworICByZXNl dF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIDMyKTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKwor ICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIDMzKTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMz KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRkbHN0cC44XHR9IDEgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0bGV0cFx0fSAxIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2Y3RwXHQiIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0XHQiIH0gfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAicDAiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IuaCBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9hcm0vbG9iLmgKaW5kZXggZmVhYWU3Y2M4OTk1OWIzMTQ3MzY4OTgwMTIwNzAwYmJjM2U4NWVj Yi4uOWEzNGE2ODIxNjBiOWMwYjBlOTM5MzQzOGU3YmUzMzZlZDdkMjljNyAxMDA2NDQKLS0tIGEv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IuaAorKysgYi9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvYXJtL2xvYi5oCkBAIC0xLDE1ICsxLDEwNiBAQAogI2luY2x1ZGUgPHN0cmluZy5o PgotCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAvKiBDb21tb24gY29kZSBmb3IgbG9iIHRlc3RzLiAg Ki8KIAogI2RlZmluZSBOT19MT0IgYXNtIHZvbGF0aWxlICgiQCBjbG9iYmVyIGxyIiA6IDogOiAi bHIiICkKIAotI2RlZmluZSBOIDEwMDAwCisjZGVmaW5lIE4gMTAwCisKK3N0YXRpYyB2b2lkCity ZXNldF9kYXRhOCAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IHgpCit7Cisg IG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBz aXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3Rh dGljIHZvaWQKK3Jlc2V0X2RhdGExNiAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAq YywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNl dCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAo KmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGEzMiAoaW50MzJfdCAqYSwgaW50MzJf dCAqYiwgaW50MzJfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2Yg KCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywg MCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGE2NCAoaW50 NjRfdCAqYSwgaW50NjRfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXpl b2YgKCphKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGlj IHZvaWQKK2NoZWNrX3BsdXM4IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQg eCkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9C OworICAgICAgaWYgKGkgPCB4KQorCXsKKwkgIGlmIChjW2ldICE9IChhW2ldICsgYltpXSkpIGFi b3J0ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsK Kwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGx1czE2IChpbnQxNl90ICphLCBp bnQxNl90ICpiLCBpbnQxNl90ICpjLCBpbnQgeCkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBO OyBpKyspCisgICAgeworICAgICAgTk9fTE9COworICAgICAgaWYgKGkgPCB4KQorCXsKKwkgIGlm IChjW2ldICE9IChhW2ldICsgYltpXSkpIGFib3J0ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJ ICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAor Y2hlY2tfcGx1czMyIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgeCkK K3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9COwor ICAgICAgaWYgKGkgPCB4KQorCXsKKwkgIGlmIChjW2ldICE9IChhW2ldICsgYltpXSkpIGFib3J0 ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9 CisgICAgfQorfQogCiBzdGF0aWMgdm9pZAotcmVzZXRfZGF0YSAoaW50ICphLCBpbnQgKmIsIGlu dCAqYykKK2NoZWNrX21lbWNweTY0IChpbnQ2NF90ICphLCBpbnQ2NF90ICpjLCBpbnQgeCkKIHsK LSAgbWVtc2V0IChhLCAtMSwgTiAqIHNpemVvZiAoKmEpKTsKLSAgbWVtc2V0IChiLCAtMSwgTiAq IHNpemVvZiAoKmIpKTsKLSAgbWVtc2V0IChjLCAtMSwgTiAqIHNpemVvZiAoKmMpKTsKKyAgZm9y IChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9COworICAgICAgaWYg KGkgPCB4KQorCXsKKwkgIGlmIChjW2ldICE9IGFbaV0pIGFib3J0ICgpOworCX0KKyAgICAgIGVs c2UKKwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9CisgICAgfQogfQpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYXJtL2xvYjEuYwppbmRleCBiYTVjODJjZDU1YzU4MmM5NmExOGFkNDE3YTMw NDFlNDNkODQzNjEzLi5lN2ZhM2YxNTVmOTI2ZTcxYjAwYzlmMjk0ZTc4NzhlOGYxMzc2NmZmIDEw MDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjEuYworKysgYi9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjEuYwpAQCAtNTQsMjkgKzU0LDE4IEBAIGxvb3Az IChpbnQgKmEsIGludCAqYiwgaW50ICpjKQogICAgIH0gd2hpbGUgKGkgPCBOKTsKIH0KIAotdm9p ZAotY2hlY2sgKGludCAqYSwgaW50ICpiLCBpbnQgKmMpCi17Ci0gIGZvciAoaW50IGkgPSAwOyBp IDwgTjsgaSsrKQotICAgIHsKLSAgICAgIE5PX0xPQjsKLSAgICAgIGlmIChjW2ldICE9IGFbaV0g KyBiW2ldKQotCWFib3J0ICgpOwotICAgIH0KLX0KLQogaW50CiBtYWluICh2b2lkKQogewotICBy ZXNldF9kYXRhIChhLCBiLCBjKTsKKyAgcmVzZXRfZGF0YTMyIChhLCBiLCBjLCBOKTsKICAgbG9v cDEgKGEsIGIgLGMpOwotICBjaGVjayAoYSwgYiAsYyk7Ci0gIHJlc2V0X2RhdGEgKGEsIGIsIGMp OworICBjaGVja19wbHVzMzIgKGEsIGIsIGMsIE4pOworICByZXNldF9kYXRhMzIgKGEsIGIsIGMs IE4pOwogICBsb29wMiAoYSwgYiAsYyk7Ci0gIGNoZWNrIChhLCBiICxjKTsKLSAgcmVzZXRfZGF0 YSAoYSwgYiwgYyk7CisgIGNoZWNrX3BsdXMzMiAoYSwgYiwgYywgTik7CisgIHJlc2V0X2RhdGEz MiAoYSwgYiwgYywgTik7CiAgIGxvb3AzIChhLCBiICxjKTsKLSAgY2hlY2sgKGEsIGIgLGMpOwor ICBjaGVja19wbHVzMzIgKGEsIGIsIGMsIE4pOwogCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2I2LmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvYXJtL2xvYjYuYwppbmRleCAxN2I2MTI0Mjk1ZThhZTllMWNiNTdlNDFmYTQzYTk1 NGIzMzkwZWVjLi5iN2Y0OWNmNzBjOThkNzhhZjBkN2NjMWMyOTFiZjgzZWY2OTk4NjNiIDEwMDY0 NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjYuYworKysgYi9nY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjYuYwpAQCAtNzksMTQgKzc5LDE0IEBAIGNoZWNrICh2 b2lkKQogaW50CiBtYWluICh2b2lkKQogewotICByZXNldF9kYXRhIChhMSwgYjEsIGMxKTsKLSAg cmVzZXRfZGF0YSAoYTIsIGIyLCBjMik7CisgIHJlc2V0X2RhdGEzMiAoYTEsIGIxLCBjMSwgTik7 CisgIHJlc2V0X2RhdGEzMiAoYTIsIGIyLCBjMiwgTik7CiAgIGxvb3AxIChhMSwgYjEsIGMxKTsK ICAgcmVmMSAoYTIsIGIyLCBjMik7CiAgIGNoZWNrICgpOwogCi0gIHJlc2V0X2RhdGEgKGExLCBi MSwgYzEpOwotICByZXNldF9kYXRhIChhMiwgYjIsIGMyKTsKKyAgcmVzZXRfZGF0YTMyIChhMSwg YjEsIGMxLCBOKTsKKyAgcmVzZXRfZGF0YTMyIChhMiwgYjIsIGMyLCBOKTsKICAgbG9vcDIgKGEx LCBiMSwgYzEpOwogICByZWYyIChhMiwgYjIsIGMyKTsKICAgY2hlY2sgKCk7Cg== --------------Htr1Wksa0tBt5NfASod4JlX4--