From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2068.outbound.protection.outlook.com [40.107.20.68]) by sourceware.org (Postfix) with ESMTPS id C8EFF3858D1E for ; Mon, 14 Nov 2022 15:57:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C8EFF3858D1E 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=iW6UXDgnbHDNJJ3uaExdMkVylGf6djn3B09wdUy5eArev3dYYI/RrGXCVwrMBL7BdOYYslS+BrVyE67tjm39ErPlMO1AX0h+Ym0oqAqPBXrk35nczVH0s43h1y4EJyv5gqWOft5iZPiwDxAyhGpWkYlnAr8+dxmN+nDX8jAMRJ5EFleZ7kN0hQ+nNQfkDL7+/3WVi3Mxw1p790Wl/bUMT7lfIkPKT7oOHnviQ6/4Zm7GWLxd+qNvyDMGlsj0tHUzhOAP+8ztobYIkl6uIvF3F/bTlEIpsVFyHIfRG2TbpA5gJmuSXrieW6T1Fik7f9d4o1MH8Pg4pg3J/zGA8VDYkA== 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=i/I371C3FsxcF2emYUbRetkbZJD6ziKuVO+m2T9IBU0=; b=le9RH2cmLfGaGesSfRdnAAHn2S49phNzgPGFuzIOsG38CGqNOJdvxi4PSBRcHUYFMgI/IzbGpG8ygDHsnnbR565zY64gIXwmRHjQJkktMn0snDynPdzkORZ2zFFx1sEnqzOLpyHAQTajFmDIE7E8fh2+wWQkSHV1BlovMmYoll2QjKsvDZow41PI0JfP8LmsJXEWg3Xx7qzvHorh74J5QjfbkSPcY8wiSITlg4ZNgjfGlAtZOhPECZkcjXVoVo2zSCu66jkpDI91jkIWKT7ZEOvVzps7AElWaH33cKruWN5qaMev49jBC9JiOdmJs7dy216C4mM10SFXK7YXZhAr/A== 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=i/I371C3FsxcF2emYUbRetkbZJD6ziKuVO+m2T9IBU0=; b=45lHmuxhZG9kVQqWSGOHhGUMU63hHmGkwcrqcef19eXKx6cX/2ZjmCN7gqtO2peXmhKseWMhz6OpQ9P9sEykHrxqBshILFYbyq7l5+PNdmDWv5CLHmN7VVuMkrOdGVAaE2MRRBuVlHI42eXyfBlZNaafBzHWRFlifL556xCPOTY= Received: from FR0P281CA0058.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:49::19) by DB9PR08MB7844.eurprd08.prod.outlook.com (2603:10a6:10:39f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5834.6; Mon, 14 Nov 2022 15:56:52 +0000 Received: from VI1EUR03FT008.eop-EUR03.prod.protection.outlook.com (2603:10a6:d10:49:cafe::ba) by FR0P281CA0058.outlook.office365.com (2603:10a6:d10:49::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.17 via Frontend Transport; Mon, 14 Nov 2022 15:56:52 +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 VI1EUR03FT008.mail.protection.outlook.com (100.127.144.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.12 via Frontend Transport; Mon, 14 Nov 2022 15:56:51 +0000 Received: ("Tessian outbound 2ff13c8f2c05:v130"); Mon, 14 Nov 2022 15:56:51 +0000 X-CR-MTA-TID: 64aa7808 Received: from ad6a09a06b15.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 141AD946-6640-465B-8FC9-3F90288E4FAC.1; Mon, 14 Nov 2022 15:56:44 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ad6a09a06b15.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 14 Nov 2022 15:56:44 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FwNv+p9LY1ylHwTNWhxj8EFjtivJADvLlZXCQaOZuDbi8nBWMqaJgWbZVUINHXq9uyvxajxUaEsVGKx8+FGBGaFDN3G1EI/MHuKS2Pnfi44+jdLeBR/yGQyxbDZBQZMin6EjFl0UmKj4FKAkj+rTreapnRq6XUbGevaGBSd7POku9q47MHjO2lo1l5Qt5rJrDcbnWR/Gof05spBSETe3NZbQ4wx6cJhndtSZkNLOYvBD/3b9YpDWmthThGunoNT0eLHBYv6LZkZK1YYVhWv0RuVC04Z/UTErlYAZyU8zhBgcg57CYiYa/n0pJlylJAA5MsWX3lXFC+gBBOejsrg1tg== 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=i/I371C3FsxcF2emYUbRetkbZJD6ziKuVO+m2T9IBU0=; b=odnF7HlA/6KLV05T4JUi3cxCQnMyOlNsnURvUSOfVrJvZROZPWtRvlSVV40jgGQxtHLJBlJZDrOEeoN1RFt1HuQW8VGcsM8mI3U/SMoh9OuuNkv8qwqTjFGVHW2ptX24opzx8DwKl5k/BYKYocdv2CzWd1wk/VC7IdSH0xa1VaSbrTtIyVqwLHYPKzz1jtKvVWxElMQCeeXdgK+6GknIs56AuTCGofTMuoC3Ggw1B+1Rj/TDmXucaSkQ4B9+G4D+mFsSyXSckfnMJcxArZ/ipj9pNwnYC9tBYjUMb4AZVR0/W6oTViX1AzshEp7PpCyc027qh9xLIcBPLmtPg3fo/A== 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=i/I371C3FsxcF2emYUbRetkbZJD6ziKuVO+m2T9IBU0=; b=45lHmuxhZG9kVQqWSGOHhGUMU63hHmGkwcrqcef19eXKx6cX/2ZjmCN7gqtO2peXmhKseWMhz6OpQ9P9sEykHrxqBshILFYbyq7l5+PNdmDWv5CLHmN7VVuMkrOdGVAaE2MRRBuVlHI42eXyfBlZNaafBzHWRFlifL556xCPOTY= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by DU0PR08MB7664.eurprd08.prod.outlook.com (2603:10a6:10:315::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5834.6; Mon, 14 Nov 2022 15:56:42 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::bd2a:aff9:b1a0:2fc7]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::bd2a:aff9:b1a0:2fc7%4]) with mapi id 15.20.5834.006; Mon, 14 Nov 2022 15:56:42 +0000 From: Tamar Christina To: Richard Biener , Aldy Hernandez CC: Jeff Law , "gcc-patches@gcc.gnu.org" , nd , "MacLeod, Andrew" Subject: RE: [PATCH 1/2]middle-end: Add new tbranch optab to add support for bit-test-and-branch operations Thread-Topic: [PATCH 1/2]middle-end: Add new tbranch optab to add support for bit-test-and-branch operations Thread-Index: AQHY7R9cKvcaBRMFXUuPansZrSRGda4pAcQAgAE3DxCAABO8gIABGlewgAAV2wCABO1MAIAJjAtA Date: Mon, 14 Nov 2022 15:56:42 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ts-tracking-id: 92AC9B6194481B4AA871E7B46F53BEC2.0 x-checkrecipientchecked: true Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: VI1PR08MB5325:EE_|DU0PR08MB7664:EE_|VI1EUR03FT008:EE_|DB9PR08MB7844:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f7eee4e-574a-45c0-548a-08dac658d8ae 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: 4YICIaP50wDeFhQe0dymmm8WKVg/BFHz46dDBc7Mjn+N1Q0UHBZDK47QG9npzKfFi8UxeH6/5ySAxxqUPJIXPBzIHOdzS4OJ8XF0TGGgxLxkJQZn5GrYnIr384j/XZdgIcoPnIrdLQhaweXkXCtJKzY6YYmYQCYChUvGEKWjeGG72mKCllfS/IMN5iks+YCY4eD12PJ2zicvyUW16uoLSWvaZdcI6tbvGq+gyoM2/7XZv9EbdJrofkQa1bHcdujZZqey0btyNoj4wZXJOG8F7N8s5D7lni03nd//cJFpMuQM2PvebXf2jaCTViqytyqffFcQGJIiJAYtQoCTCd+L3lgnDHr89WxLDVIZl7kyiZzLB83O6U5PMeo7++P9YMGCayAYRiAWsx+f734XYP3JfS3JlRDMU3iIQvJmpCIS3blKdpRYhsWoq93YAPjfvCTZdp67GghCNy5RxM0kruvevMYMx1v/6DassmyKfMhbBE9N/W3q2JyHa70MYz21tmjFaEAaG0Z4+7bIyL1VlG8mIG8OR12aOhxARFu8Sqvz0vUu0trP3eEVN5sROYpA9rOlH7asw9f0U5OXQ9eKLCcB3ERs2tevpOQX9mzf57D02WjDrWh8ePZh3A+dNYLu2fc85m2GcKhKtGaT4J4b9Y+m2my+dyLfnV8RhLnUSxFaq5yqD3NLnw8KAZU3ctddU+YID7Yh1Yoq6xZc+i/hKGAikc9tT1i+cp0M2D8+SYnI040szpwtivD5/mWFNgEIEJbB8TKbCoFG8KryG9jIoQNG8Q== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR08MB5325.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(366004)(396003)(376002)(39860400002)(346002)(136003)(451199015)(38070700005)(33656002)(38100700002)(478600001)(55016003)(71200400001)(83380400001)(99936003)(122000001)(86362001)(2906002)(7696005)(30864003)(9686003)(53546011)(26005)(52536014)(8936002)(54906003)(5660300002)(316002)(110136005)(4326008)(8676002)(186003)(41300700001)(66476007)(66446008)(66556008)(64756008)(66946007)(76116006)(6506007);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB5325AC9E66418A30DBE269FFFF059VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB7664 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: VI1EUR03FT008.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 814e9e83-ed40-46fd-e814-08dac658d305 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Y9LtFiUTzwysheIAxWrydsnnvwG2cxZeu02XcvN5Tpqg/3GRZH7uLUy7ey46R1jlm6bQpVAOezdq4/0d6BSDYcL6uJJ3tjATIkqGMXhQyZzwMr5l7tgNwwejzJFKCnTO5UzeEFAjGjVl0q1BXsPi3U3SPmiDO5Y5EjlvC7/lTextqgvKNQbdpP0diEzUVW4fF+Cz868YTTH3Mzt9WWW/bc5JnZG2f+D31PRHpR2FOAQAsSKW/fCRgDumtFa42hIbZRtuZ5qcKFHdsEkkMv0e4SYciicgwX2AMzRK5eXmEVRumuT5tXPnoUk3KpvnDEeZ/C2bVs0qv5yiaJ3mYz3GxvRSWi3fM3ZjOe9YzLo6iph9d73QSwx6qwaJ4McqCDCWuJJwe1u1ciZB/eGB8SqdbcmbDgdXK46pQWgRBQNo958/2pAdXa9GyvHuEkwfk1nvUHOI6e66Edx5dcpAHKhVjgEzA3aaGLnuqnRYFOxCQWF7fSWNvCJpiE+NrpAY3aBRiXP0EeACAI1TW4v7ftCvJg/4nOcNPdOUPdSKTOH/rEG7tUFHdDreEeIzF0tPAtBgPrk8Wh0ahZCgk55ZtIyTgg9lwb/D+4wwSWjJ4Y1mSvcwhr0agfR/sPCvTzt0mpx8IIa2eyj+NYbgWsDPqBEhytFcsA1OkczYrtMJwB405LqwFMm1rkWYOddZwRBSsad72qKuBPtBYHDci7EU3BQe6PnNF/KnCDFSLQrDoud+PGaZCUNv7HPUbJ0uZK39v8GJcjbwDZhT9sQFywfwarHtTA== 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)(396003)(39860400002)(376002)(346002)(136003)(451199015)(36840700001)(46966006)(40470700004)(86362001)(6506007)(9686003)(53546011)(2906002)(7696005)(107886003)(478600001)(26005)(33656002)(55016003)(99936003)(5660300002)(41300700001)(235185007)(52536014)(40480700001)(82310400005)(30864003)(36860700001)(70206006)(4326008)(70586007)(186003)(8676002)(336012)(47076005)(82740400003)(110136005)(40460700003)(356005)(81166007)(83380400001)(8936002)(316002)(54906003);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Nov 2022 15:56:51.9665 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4f7eee4e-574a-45c0-548a-08dac658d8ae 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: VI1EUR03FT008.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB7844 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --_002_VI1PR08MB5325AC9E66418A30DBE269FFFF059VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > -----Original Message----- > From: Richard Biener > Sent: Saturday, November 5, 2022 2:23 PM > To: Aldy Hernandez > Cc: Tamar Christina ; Jeff Law > ; gcc-patches@gcc.gnu.org; nd ; > MacLeod, Andrew > Subject: Re: [PATCH 1/2]middle-end: Add new tbranch optab to add support > for bit-test-and-branch operations >=20 > On Wed, 2 Nov 2022, Aldy Hernandez wrote: >=20 > > On Wed, Nov 2, 2022 at 10:55 AM Tamar Christina > wrote: > > > > > > Hi Aldy, > > > > > > I'm trying to use Ranger to determine if a range of an expression is = a > single bit. > > > > > > If possible in case of a mask then also the position of the bit that'= s being > checked by the mask (or the mask itself). > > > > Just instantiate a ranger, and ask for the range of an SSA name (or an > > arbitrary tree expression) at a particular gimple statement (or an > > edge): > > > > gimple_ranger ranger; > > int_range_max r; > > if (ranger.range_of_expr (r, , )) { > > // do stuff with range "r" > > if (r.singleton_p ()) { > > wide_int num =3D r.lower_bound (); > > // Check the bits in NUM, etc... > > } > > } > > > > You can see the full ranger API in gimple-range.h. > > > > Note that instantiating a new ranger is relatively lightweight, but > > it's not free. So unless you're calling range_of_expr sporadically, > > you probably want to have one instance for your pass. You can pass > > around the gimple_ranger around your pass. Another way of doing this > > is calling enable_rager() at pass start, and then doing: > > > > get_range_query (cfun)->range_of_expr (r, , )); > > > > gimple-loop-versioning.cc has an example of using enable_ranger / > > disable_ranger. > > > > I am assuming you are interested in ranges for integers / pointers. > > Otherwise (floats, etc) you'd have to use "Value_Range" instead of > > int_range_max. I can give you examples on that if necessary. > > > > Let me know if that helps. It Did! I ended up going with Richi's suggestion, but the snippet was very = helpful for a different range based patch I'm trying a prototype for. Many thanks for the example! >=20 > I think you maybe just want get_nonzero_bits? Ah, looks like that uses range info as well. Thanks! Ok for master? Thanks, Tamar gcc/ChangeLog: * dojump.cc (do_jump): Pass along value. (do_jump_by_parts_greater_rtx): Likewise. (do_jump_by_parts_zero_rtx): Likewise. (do_jump_by_parts_equality_rtx): Likewise. (do_compare_rtx_and_jump): Likewise. (do_compare_and_jump): Likewise. * dojump.h (do_compare_rtx_and_jump): New. * optabs.cc (emit_cmp_and_jump_insn_1): Refactor to take optab to check. (validate_test_and_branch): New. (emit_cmp_and_jump_insns): Optiobally take a value, and when value is supplied then check if it's suitable for tbranch. * optabs.def (tbranch$a4): New. * doc/md.texi (tbranch@var{mode}4): Document it. * optabs.h (emit_cmp_and_jump_insns): * tree.h (tree_zero_one_valued_p): New. --- inline copy of patch --- diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 34825549ed4e315b07d36dc3d63bae0cc0a3932d..342e8c4c670de251a35689d1805= acceb72a8f6bf 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -6958,6 +6958,13 @@ case, you can and should make operand 1's predicate = reject some operators in the @samp{cstore@var{mode}4} pattern, or remove the pattern altogether from the machine description. =20 +@cindex @code{tbranch@var{mode}4} instruction pattern +@item @samp{tbranch@var{mode}4} +Conditional branch instruction combined with a bit test-and-compare +instruction. Operand 0 is a comparison operator. Operand 1 is the +operand of the comparison. Operand 2 is the bit position of Operand 1 to t= est. +Operand 3 is the @code{code_label} to jump to. + @cindex @code{cbranch@var{mode}4} instruction pattern @item @samp{cbranch@var{mode}4} Conditional branch instruction combined with a compare instruction. diff --git a/gcc/dojump.h b/gcc/dojump.h index e379cceb34bb1765cb575636e4c05b61501fc2cf..d1d79c490c420a805fe48d58740= a79c1f25fb839 100644 --- a/gcc/dojump.h +++ b/gcc/dojump.h @@ -71,6 +71,10 @@ extern void jumpifnot (tree exp, rtx_code_label *label, extern void jumpifnot_1 (enum tree_code, tree, tree, rtx_code_label *, profile_probability); =20 +extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int, tree, + machine_mode, rtx, rtx_code_label *, + rtx_code_label *, profile_probability); + extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int, machine_mode, rtx, rtx_code_label *, rtx_code_label *, profile_probability); diff --git a/gcc/dojump.cc b/gcc/dojump.cc index 2af0cd1aca3b6af13d5d8799094ee93f18022296..190324f36f1a31990f8c49bc8c0= f45c23da5c31e 100644 --- a/gcc/dojump.cc +++ b/gcc/dojump.cc @@ -619,7 +619,7 @@ do_jump (tree exp, rtx_code_label *if_false_label, } do_compare_rtx_and_jump (temp, CONST0_RTX (GET_MODE (temp)), NE, TYPE_UNSIGNED (TREE_TYPE (exp)), - GET_MODE (temp), NULL_RTX, + exp, GET_MODE (temp), NULL_RTX, if_false_label, if_true_label, prob); } =20 @@ -687,7 +687,7 @@ do_jump_by_parts_greater_rtx (scalar_int_mode mode, int= unsignedp, rtx op0, =20 /* All but high-order word must be compared as unsigned. */ do_compare_rtx_and_jump (op0_word, op1_word, code, (unsignedp || i >= 0), - word_mode, NULL_RTX, NULL, if_true_label, + NULL, word_mode, NULL_RTX, NULL, if_true_label, prob); =20 /* Emit only one comparison for 0. Do not emit the last cond jump. = */ @@ -695,8 +695,8 @@ do_jump_by_parts_greater_rtx (scalar_int_mode mode, int= unsignedp, rtx op0, break; =20 /* Consider lower words only if these are equal. */ - do_compare_rtx_and_jump (op0_word, op1_word, NE, unsignedp, word_mod= e, - NULL_RTX, NULL, if_false_label, + do_compare_rtx_and_jump (op0_word, op1_word, NE, unsignedp, NULL, + word_mode, NULL_RTX, NULL, if_false_label, prob.invert ()); } =20 @@ -755,7 +755,7 @@ do_jump_by_parts_zero_rtx (scalar_int_mode mode, rtx op= 0, =20 if (part !=3D 0) { - do_compare_rtx_and_jump (part, const0_rtx, EQ, 1, word_mode, + do_compare_rtx_and_jump (part, const0_rtx, EQ, 1, NULL, word_mode, NULL_RTX, if_false_label, if_true_label, prob); return; } @@ -766,7 +766,7 @@ do_jump_by_parts_zero_rtx (scalar_int_mode mode, rtx op= 0, =20 for (i =3D 0; i < nwords; i++) do_compare_rtx_and_jump (operand_subword_force (op0, i, mode), - const0_rtx, EQ, 1, word_mode, NULL_RTX, + const0_rtx, EQ, 1, NULL, word_mode, NULL_RTX, if_false_label, NULL, prob); =20 if (if_true_label) @@ -809,8 +809,8 @@ do_jump_by_parts_equality_rtx (scalar_int_mode mode, rt= x op0, rtx op1, =20 for (i =3D 0; i < nwords; i++) do_compare_rtx_and_jump (operand_subword_force (op0, i, mode), - operand_subword_force (op1, i, mode), - EQ, 0, word_mode, NULL_RTX, + operand_subword_force (op1, i, mode), + EQ, 0, NULL, word_mode, NULL_RTX, if_false_label, NULL, prob); =20 if (if_true_label) @@ -962,6 +962,23 @@ do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_co= de code, int unsignedp, rtx_code_label *if_false_label, rtx_code_label *if_true_label, profile_probability prob) +{ + do_compare_rtx_and_jump (op0, op1, code, unsignedp, NULL, mode, size, + if_false_label, if_true_label, prob); +} + +/* Like do_compare_and_jump but expects the values to compare as two rtx's= . + The decision as to signed or unsigned comparison must be made by the ca= ller. + + If MODE is BLKmode, SIZE is an RTX giving the size of the objects being + compared. */ + +void +do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_code code, int unsigne= dp, + tree val, machine_mode mode, rtx size, + rtx_code_label *if_false_label, + rtx_code_label *if_true_label, + profile_probability prob) { rtx tem; rtx_code_label *dummy_label =3D NULL; @@ -1177,8 +1194,10 @@ do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_= code code, int unsignedp, } else dest_label =3D if_false_label; - do_compare_rtx_and_jump (op0, op1, first_code, unsignedp= , mode, - size, dest_label, NULL, first_prob); + + do_compare_rtx_and_jump (op0, op1, first_code, unsignedp, + val, mode, size, dest_label, NULL, + first_prob); } /* For !and_them we want to split: if (x) goto t; // prob; @@ -1192,8 +1211,9 @@ do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_c= ode code, int unsignedp, else { profile_probability first_prob =3D prob.split (cprob); - do_compare_rtx_and_jump (op0, op1, first_code, unsignedp, mode, - size, NULL, if_true_label, first_prob); + do_compare_rtx_and_jump (op0, op1, first_code, unsignedp, + val, mode, size, NULL, + if_true_label, first_prob); if (orig_code =3D=3D NE && can_compare_p (UNEQ, mode, ccp_jump)) { /* x !=3D y can be split into x unord y || x ltgt y @@ -1215,7 +1235,7 @@ do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_c= ode code, int unsignedp, } } =20 - emit_cmp_and_jump_insns (op0, op1, code, size, mode, unsignedp, + emit_cmp_and_jump_insns (op0, op1, code, size, mode, unsignedp, val, if_true_label, prob); } =20 @@ -1289,9 +1309,9 @@ do_compare_and_jump (tree treeop0, tree treeop1, enum= rtx_code signed_code, op1 =3D new_op1; } =20 - do_compare_rtx_and_jump (op0, op1, code, unsignedp, mode, - ((mode =3D=3D BLKmode) - ? expr_size (treeop0) : NULL_RTX), + do_compare_rtx_and_jump (op0, op1, code, unsignedp, treeop0, mode, + ((mode =3D=3D BLKmode) + ? expr_size (treeop0) : NULL_RTX), if_false_label, if_true_label, prob); } =20 diff --git a/gcc/optabs.cc b/gcc/optabs.cc index f338df410265dfe55b6896160090a453cc6a28d9..0f662ebdb818d7538bdd13fb02b= cf8bcf1dbab64 100644 --- a/gcc/optabs.cc +++ b/gcc/optabs.cc @@ -46,6 +46,8 @@ along with GCC; see the file COPYING3. If not see #include "libfuncs.h" #include "internal-fn.h" #include "langhooks.h" +#include "gimple.h" +#include "ssa.h" =20 static void prepare_float_lib_cmp (rtx, rtx, enum rtx_code, rtx *, machine_mode *); @@ -4620,7 +4622,7 @@ prepare_operand (enum insn_code icode, rtx x, int opn= um, machine_mode mode, =20 static void emit_cmp_and_jump_insn_1 (rtx test, machine_mode mode, rtx label, - profile_probability prob) + direct_optab cmp_optab, profile_probability prob) { machine_mode optab_mode; enum mode_class mclass; @@ -4629,7 +4631,7 @@ emit_cmp_and_jump_insn_1 (rtx test, machine_mode mode= , rtx label, =20 mclass =3D GET_MODE_CLASS (mode); optab_mode =3D (mclass =3D=3D MODE_CC) ? CCmode : mode; - icode =3D optab_handler (cbranch_optab, optab_mode); + icode =3D optab_handler (cmp_optab, optab_mode); =20 gcc_assert (icode !=3D CODE_FOR_nothing); gcc_assert (insn_operand_matches (icode, 0, test)); @@ -4644,6 +4646,56 @@ emit_cmp_and_jump_insn_1 (rtx test, machine_mode mod= e, rtx label, add_reg_br_prob_note (insn, prob); } =20 +/* Check to see if the supplied comparison in PTEST can be performed as a + bit-test-and-branch instead. VAL must contain the original tree + expression of the non-zero operand which will be used to rewrite the + comparison in PTEST. + + Returns TRUE if operation succeeds and returns updated PMODE and PTEST, + else FALSE. */ + +enum insn_code +static validate_test_and_branch (tree val, rtx *ptest, machine_mode *pmode= ) +{ + if (!val || TREE_CODE (val) !=3D SSA_NAME) + return CODE_FOR_nothing; + + machine_mode mode =3D TYPE_MODE (TREE_TYPE (val)); + rtx test =3D *ptest; + + if (GET_CODE (test) !=3D EQ && GET_CODE (test) !=3D NE) + return CODE_FOR_nothing; + + /* If the target supports the testbit comparison directly, great. */ + auto icode =3D direct_optab_handler (tbranch_optab, mode); + if (icode =3D=3D CODE_FOR_nothing) + return icode; + + if (tree_zero_one_valued_p (val)) + { + auto pos =3D BYTES_BIG_ENDIAN ? GET_MODE_BITSIZE (mode) - 1 : 0; + XEXP (test, 1) =3D gen_int_mode (pos, mode); + *ptest =3D test; + *pmode =3D mode; + return icode; + } + + wide_int wcst =3D get_nonzero_bits (val); + if (wcst =3D=3D -1) + return CODE_FOR_nothing; + + int bitpos; + + if ((bitpos =3D wi::exact_log2 (wcst)) =3D=3D -1) + return CODE_FOR_nothing; + + auto pos =3D BYTES_BIG_ENDIAN ? GET_MODE_BITSIZE (mode) - 1 - bitpos : b= itpos; + XEXP (test, 1) =3D gen_int_mode (pos, mode); + *ptest =3D test; + *pmode =3D mode; + return icode; +} + /* Generate code to compare X with Y so that the condition codes are set and to jump to LABEL if the condition is true. If X is a constant and Y is not a constant, then the comparison is swapped to @@ -4661,11 +4713,13 @@ emit_cmp_and_jump_insn_1 (rtx test, machine_mode mo= de, rtx label, It will be potentially converted into an unsigned variant based on UNSIGNEDP to select a proper jump instruction. =20 - PROB is the probability of jumping to LABEL. */ + PROB is the probability of jumping to LABEL. If the comparison is agai= nst + zero then VAL contains the expression from which the non-zero RTL is + derived. */ =20 void emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size, - machine_mode mode, int unsignedp, rtx label, + machine_mode mode, int unsignedp, tree val, rtx label, profile_probability prob) { rtx op0 =3D x, op1 =3D y; @@ -4690,10 +4744,32 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_cod= e comparison, rtx size, =20 prepare_cmp_insn (op0, op1, comparison, size, unsignedp, OPTAB_LIB_WIDEN= , &test, &mode); - emit_cmp_and_jump_insn_1 (test, mode, label, prob); + + /* Check if we're comparing a truth type with 0, and if so check if + the target supports tbranch. */ + machine_mode tmode =3D mode; + if (op1 =3D=3D CONST0_RTX (GET_MODE (op1)) + && validate_test_and_branch (val, &test, &tmode) !=3D CODE_FOR_nothi= ng) + { + emit_cmp_and_jump_insn_1 (test, tmode, label, tbranch_optab, prob); + return; + } + + emit_cmp_and_jump_insn_1 (test, mode, label, cbranch_optab, prob); } =20 - +/* Overloaded version of emit_cmp_and_jump_insns in which VAL is unknown. = */ + +void +emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size, + machine_mode mode, int unsignedp, rtx label, + profile_probability prob) +{ + emit_cmp_and_jump_insns (x, y, comparison, size, mode, unsignedp, NULL, + label, prob); +} + + /* Emit a library call comparison between floating point X and Y. COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.). */ =20 diff --git a/gcc/optabs.def b/gcc/optabs.def index a6db2342bed6baf13ecbd84112c8432c6972e6fe..56e37d67231e1ba74ad6c5b81d7= 4a65f315e26e2 100644 --- a/gcc/optabs.def +++ b/gcc/optabs.def @@ -220,6 +220,7 @@ OPTAB_D (reload_in_optab, "reload_in$a") OPTAB_D (reload_out_optab, "reload_out$a") =20 OPTAB_DC(cbranch_optab, "cbranch$a4", COMPARE) +OPTAB_D (tbranch_optab, "tbranch$a4") OPTAB_D (addcc_optab, "add$acc") OPTAB_D (negcc_optab, "neg$acc") OPTAB_D (notcc_optab, "not$acc") diff --git a/gcc/optabs.h b/gcc/optabs.h index cfd7c742d2d21b0539f5227c22a94f32c793d6f7..cd55604bc3d452d7e28c5530bb4= 793d481766f4f 100644 --- a/gcc/optabs.h +++ b/gcc/optabs.h @@ -268,6 +268,10 @@ extern void emit_cmp_and_jump_insns (rtx, rtx, enum rt= x_code, rtx, machine_mode, int, rtx, profile_probability prob =3D profile_probability::uninitialized ()); +extern void emit_cmp_and_jump_insns (rtx, rtx, enum rtx_code, rtx, + machine_mode, int, tree, rtx, + profile_probability prob + =3D profile_probability::uninitialized ()); =20 /* Generate code to indirectly jump to a location given in the rtx LOC. *= / extern void emit_indirect_jump (rtx); diff --git a/gcc/tree.h b/gcc/tree.h index e6564aaccb7b69cd938ff60b6121aec41b7e8a59..f455008ceb8d91e7e073c0ad6d9= 3dcaed65deccf 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -4690,6 +4690,7 @@ extern tree signed_or_unsigned_type_for (int, tree); extern tree signed_type_for (tree); extern tree unsigned_type_for (tree); extern bool is_truth_type_for (tree, tree); +extern bool tree_zero_one_valued_p (tree); extern tree truth_type_for (tree); extern tree build_pointer_type_for_mode (tree, machine_mode, bool); extern tree build_pointer_type (tree); --_002_VI1PR08MB5325AC9E66418A30DBE269FFFF059VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb16485.patch" Content-Description: rb16485.patch Content-Disposition: attachment; filename="rb16485.patch"; size=13509; creation-date="Mon, 14 Nov 2022 15:56:17 GMT"; modification-date="Mon, 14 Nov 2022 15:56:42 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9kb2MvbWQudGV4aSBiL2djYy9kb2MvbWQudGV4aQppbmRleCAzNDgy NTU0OWVkNGUzMTViMDdkMzZkYzNkNjNiYWUwY2MwYTM5MzJkLi4zNDJlOGM0YzY3MGRlMjUxYTM1 Njg5ZDE4MDVhY2NlYjcyYThmNmJmIDEwMDY0NAotLS0gYS9nY2MvZG9jL21kLnRleGkKKysrIGIv Z2NjL2RvYy9tZC50ZXhpCkBAIC02OTU4LDYgKzY5NTgsMTMgQEAgY2FzZSwgeW91IGNhbiBhbmQg c2hvdWxkIG1ha2Ugb3BlcmFuZCAxJ3MgcHJlZGljYXRlIHJlamVjdCBzb21lIG9wZXJhdG9ycwog aW4gdGhlIEBzYW1we2NzdG9yZUB2YXJ7bW9kZX00fSBwYXR0ZXJuLCBvciByZW1vdmUgdGhlIHBh dHRlcm4gYWx0b2dldGhlcgogZnJvbSB0aGUgbWFjaGluZSBkZXNjcmlwdGlvbi4KIAorQGNpbmRl eCBAY29kZXt0YnJhbmNoQHZhcnttb2RlfTR9IGluc3RydWN0aW9uIHBhdHRlcm4KK0BpdGVtIEBz YW1we3RicmFuY2hAdmFye21vZGV9NH0KK0NvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbiBj b21iaW5lZCB3aXRoIGEgYml0IHRlc3QtYW5kLWNvbXBhcmUKK2luc3RydWN0aW9uLiBPcGVyYW5k IDAgaXMgYSBjb21wYXJpc29uIG9wZXJhdG9yLiAgT3BlcmFuZCAxIGlzIHRoZQorb3BlcmFuZCBv ZiB0aGUgY29tcGFyaXNvbi4gT3BlcmFuZCAyIGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgT3BlcmFu ZCAxIHRvIHRlc3QuCitPcGVyYW5kIDMgaXMgdGhlIEBjb2Rle2NvZGVfbGFiZWx9IHRvIGp1bXAg dG8uCisKIEBjaW5kZXggQGNvZGV7Y2JyYW5jaEB2YXJ7bW9kZX00fSBpbnN0cnVjdGlvbiBwYXR0 ZXJuCiBAaXRlbSBAc2FtcHtjYnJhbmNoQHZhcnttb2RlfTR9CiBDb25kaXRpb25hbCBicmFuY2gg aW5zdHJ1Y3Rpb24gY29tYmluZWQgd2l0aCBhIGNvbXBhcmUgaW5zdHJ1Y3Rpb24uCmRpZmYgLS1n aXQgYS9nY2MvZG9qdW1wLmggYi9nY2MvZG9qdW1wLmgKaW5kZXggZTM3OWNjZWIzNGJiMTc2NWNi NTc1NjM2ZTRjMDViNjE1MDFmYzJjZi4uZDFkNzljNDkwYzQyMGE4MDVmZTQ4ZDU4NzQwYTc5YzFm MjVmYjgzOSAxMDA2NDQKLS0tIGEvZ2NjL2RvanVtcC5oCisrKyBiL2djYy9kb2p1bXAuaApAQCAt NzEsNiArNzEsMTAgQEAgZXh0ZXJuIHZvaWQganVtcGlmbm90ICh0cmVlIGV4cCwgcnR4X2NvZGVf bGFiZWwgKmxhYmVsLAogZXh0ZXJuIHZvaWQganVtcGlmbm90XzEgKGVudW0gdHJlZV9jb2RlLCB0 cmVlLCB0cmVlLCBydHhfY29kZV9sYWJlbCAqLAogCQkJIHByb2ZpbGVfcHJvYmFiaWxpdHkpOwog CitleHRlcm4gdm9pZCBkb19jb21wYXJlX3J0eF9hbmRfanVtcCAocnR4LCBydHgsIGVudW0gcnR4 X2NvZGUsIGludCwgdHJlZSwKKwkJCQkgICAgIG1hY2hpbmVfbW9kZSwgcnR4LCBydHhfY29kZV9s YWJlbCAqLAorCQkJCSAgICAgcnR4X2NvZGVfbGFiZWwgKiwgcHJvZmlsZV9wcm9iYWJpbGl0eSk7 CisKIGV4dGVybiB2b2lkIGRvX2NvbXBhcmVfcnR4X2FuZF9qdW1wIChydHgsIHJ0eCwgZW51bSBy dHhfY29kZSwgaW50LAogCQkJCSAgICAgbWFjaGluZV9tb2RlLCBydHgsIHJ0eF9jb2RlX2xhYmVs ICosCiAJCQkJICAgICBydHhfY29kZV9sYWJlbCAqLCBwcm9maWxlX3Byb2JhYmlsaXR5KTsKZGlm ZiAtLWdpdCBhL2djYy9kb2p1bXAuY2MgYi9nY2MvZG9qdW1wLmNjCmluZGV4IDJhZjBjZDFhY2Ez YjZhZjEzZDVkODc5OTA5NGVlOTNmMTgwMjIyOTYuLjE5MDMyNGYzNmYxYTMxOTkwZjhjNDliYzhj MGY0NWMyM2RhNWMzMWUgMTAwNjQ0Ci0tLSBhL2djYy9kb2p1bXAuY2MKKysrIGIvZ2NjL2RvanVt cC5jYwpAQCAtNjE5LDcgKzYxOSw3IEBAIGRvX2p1bXAgKHRyZWUgZXhwLCBydHhfY29kZV9sYWJl bCAqaWZfZmFsc2VfbGFiZWwsCiAJfQogICAgICAgZG9fY29tcGFyZV9ydHhfYW5kX2p1bXAgKHRl bXAsIENPTlNUMF9SVFggKEdFVF9NT0RFICh0ZW1wKSksCiAJCQkgICAgICAgTkUsIFRZUEVfVU5T SUdORUQgKFRSRUVfVFlQRSAoZXhwKSksCi0JCQkgICAgICAgR0VUX01PREUgKHRlbXApLCBOVUxM X1JUWCwKKwkJCSAgICAgICBleHAsIEdFVF9NT0RFICh0ZW1wKSwgTlVMTF9SVFgsCiAJCQkgICAg ICAgaWZfZmFsc2VfbGFiZWwsIGlmX3RydWVfbGFiZWwsIHByb2IpOwogICAgIH0KIApAQCAtNjg3 LDcgKzY4Nyw3IEBAIGRvX2p1bXBfYnlfcGFydHNfZ3JlYXRlcl9ydHggKHNjYWxhcl9pbnRfbW9k ZSBtb2RlLCBpbnQgdW5zaWduZWRwLCBydHggb3AwLAogCiAgICAgICAvKiBBbGwgYnV0IGhpZ2gt b3JkZXIgd29yZCBtdXN0IGJlIGNvbXBhcmVkIGFzIHVuc2lnbmVkLiAgKi8KICAgICAgIGRvX2Nv bXBhcmVfcnR4X2FuZF9qdW1wIChvcDBfd29yZCwgb3AxX3dvcmQsIGNvZGUsICh1bnNpZ25lZHAg fHwgaSA+IDApLAotCQkJICAgICAgIHdvcmRfbW9kZSwgTlVMTF9SVFgsIE5VTEwsIGlmX3RydWVf bGFiZWwsCisJCQkgICAgICAgTlVMTCwgd29yZF9tb2RlLCBOVUxMX1JUWCwgTlVMTCwgaWZfdHJ1 ZV9sYWJlbCwKIAkJCSAgICAgICBwcm9iKTsKIAogICAgICAgLyogRW1pdCBvbmx5IG9uZSBjb21w YXJpc29uIGZvciAwLiAgRG8gbm90IGVtaXQgdGhlIGxhc3QgY29uZCBqdW1wLiAgKi8KQEAgLTY5 NSw4ICs2OTUsOCBAQCBkb19qdW1wX2J5X3BhcnRzX2dyZWF0ZXJfcnR4IChzY2FsYXJfaW50X21v ZGUgbW9kZSwgaW50IHVuc2lnbmVkcCwgcnR4IG9wMCwKIAlicmVhazsKIAogICAgICAgLyogQ29u c2lkZXIgbG93ZXIgd29yZHMgb25seSBpZiB0aGVzZSBhcmUgZXF1YWwuICAqLwotICAgICAgZG9f Y29tcGFyZV9ydHhfYW5kX2p1bXAgKG9wMF93b3JkLCBvcDFfd29yZCwgTkUsIHVuc2lnbmVkcCwg d29yZF9tb2RlLAotCQkJICAgICAgIE5VTExfUlRYLCBOVUxMLCBpZl9mYWxzZV9sYWJlbCwKKyAg ICAgIGRvX2NvbXBhcmVfcnR4X2FuZF9qdW1wIChvcDBfd29yZCwgb3AxX3dvcmQsIE5FLCB1bnNp Z25lZHAsIE5VTEwsCisJCQkgICAgICAgd29yZF9tb2RlLCBOVUxMX1JUWCwgTlVMTCwgaWZfZmFs c2VfbGFiZWwsCiAJCQkgICAgICAgcHJvYi5pbnZlcnQgKCkpOwogICAgIH0KIApAQCAtNzU1LDcg Kzc1NSw3IEBAIGRvX2p1bXBfYnlfcGFydHNfemVyb19ydHggKHNjYWxhcl9pbnRfbW9kZSBtb2Rl LCBydHggb3AwLAogCiAgIGlmIChwYXJ0ICE9IDApCiAgICAgewotICAgICAgZG9fY29tcGFyZV9y dHhfYW5kX2p1bXAgKHBhcnQsIGNvbnN0MF9ydHgsIEVRLCAxLCB3b3JkX21vZGUsCisgICAgICBk b19jb21wYXJlX3J0eF9hbmRfanVtcCAocGFydCwgY29uc3QwX3J0eCwgRVEsIDEsIE5VTEwsIHdv cmRfbW9kZSwKIAkJCSAgICAgICBOVUxMX1JUWCwgaWZfZmFsc2VfbGFiZWwsIGlmX3RydWVfbGFi ZWwsIHByb2IpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc2Niw3ICs3NjYsNyBAQCBkb19q dW1wX2J5X3BhcnRzX3plcm9fcnR4IChzY2FsYXJfaW50X21vZGUgbW9kZSwgcnR4IG9wMCwKIAog ICBmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCiAgICAgZG9fY29tcGFyZV9ydHhfYW5kX2p1 bXAgKG9wZXJhbmRfc3Vid29yZF9mb3JjZSAob3AwLCBpLCBtb2RlKSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QwX3J0eCwgRVEsIDEsIHdvcmRfbW9kZSwgTlVMTF9SVFgsCisJ CQkgICAgIGNvbnN0MF9ydHgsIEVRLCAxLCBOVUxMLCB3b3JkX21vZGUsIE5VTExfUlRYLAogCQkJ ICAgICBpZl9mYWxzZV9sYWJlbCwgTlVMTCwgcHJvYik7CiAKICAgaWYgKGlmX3RydWVfbGFiZWwp CkBAIC04MDksOCArODA5LDggQEAgZG9fanVtcF9ieV9wYXJ0c19lcXVhbGl0eV9ydHggKHNjYWxh cl9pbnRfbW9kZSBtb2RlLCBydHggb3AwLCBydHggb3AxLAogCiAgIGZvciAoaSA9IDA7IGkgPCBu d29yZHM7IGkrKykKICAgICBkb19jb21wYXJlX3J0eF9hbmRfanVtcCAob3BlcmFuZF9zdWJ3b3Jk X2ZvcmNlIChvcDAsIGksIG1vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVy YW5kX3N1YndvcmRfZm9yY2UgKG9wMSwgaSwgbW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEVRLCAwLCB3b3JkX21vZGUsIE5VTExfUlRYLAorCQkJICAgICBvcGVyYW5kX3N1Yndv cmRfZm9yY2UgKG9wMSwgaSwgbW9kZSksCisJCQkgICAgIEVRLCAwLCBOVUxMLCB3b3JkX21vZGUs IE5VTExfUlRYLAogCQkJICAgICBpZl9mYWxzZV9sYWJlbCwgTlVMTCwgcHJvYik7CiAKICAgaWYg KGlmX3RydWVfbGFiZWwpCkBAIC05NjIsNiArOTYyLDIzIEBAIGRvX2NvbXBhcmVfcnR4X2FuZF9q dW1wIChydHggb3AwLCBydHggb3AxLCBlbnVtIHJ0eF9jb2RlIGNvZGUsIGludCB1bnNpZ25lZHAs CiAJCQkgcnR4X2NvZGVfbGFiZWwgKmlmX2ZhbHNlX2xhYmVsLAogCQkJIHJ0eF9jb2RlX2xhYmVs ICppZl90cnVlX2xhYmVsLAogCQkJIHByb2ZpbGVfcHJvYmFiaWxpdHkgcHJvYikKK3sKKyAgZG9f Y29tcGFyZV9ydHhfYW5kX2p1bXAgKG9wMCwgb3AxLCBjb2RlLCB1bnNpZ25lZHAsIE5VTEwsIG1v ZGUsIHNpemUsCisJCQkgIGlmX2ZhbHNlX2xhYmVsLCBpZl90cnVlX2xhYmVsLCBwcm9iKTsKK30K KworLyogTGlrZSBkb19jb21wYXJlX2FuZF9qdW1wIGJ1dCBleHBlY3RzIHRoZSB2YWx1ZXMgdG8g Y29tcGFyZSBhcyB0d28gcnR4J3MuCisgICBUaGUgZGVjaXNpb24gYXMgdG8gc2lnbmVkIG9yIHVu c2lnbmVkIGNvbXBhcmlzb24gbXVzdCBiZSBtYWRlIGJ5IHRoZSBjYWxsZXIuCisKKyAgIElmIE1P REUgaXMgQkxLbW9kZSwgU0laRSBpcyBhbiBSVFggZ2l2aW5nIHRoZSBzaXplIG9mIHRoZSBvYmpl Y3RzIGJlaW5nCisgICBjb21wYXJlZC4gICovCisKK3ZvaWQKK2RvX2NvbXBhcmVfcnR4X2FuZF9q dW1wIChydHggb3AwLCBydHggb3AxLCBlbnVtIHJ0eF9jb2RlIGNvZGUsIGludCB1bnNpZ25lZHAs CisJCQkgdHJlZSB2YWwsIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggc2l6ZSwKKwkJCSBydHhfY29k ZV9sYWJlbCAqaWZfZmFsc2VfbGFiZWwsCisJCQkgcnR4X2NvZGVfbGFiZWwgKmlmX3RydWVfbGFi ZWwsCisJCQkgcHJvZmlsZV9wcm9iYWJpbGl0eSBwcm9iKQogewogICBydHggdGVtOwogICBydHhf Y29kZV9sYWJlbCAqZHVtbXlfbGFiZWwgPSBOVUxMOwpAQCAtMTE3Nyw4ICsxMTk0LDEwIEBAIGRv X2NvbXBhcmVfcnR4X2FuZF9qdW1wIChydHggb3AwLCBydHggb3AxLCBlbnVtIHJ0eF9jb2RlIGNv ZGUsIGludCB1bnNpZ25lZHAsCiAJCSAgICB9CiAJCSAgZWxzZQogCQkgICAgZGVzdF9sYWJlbCA9 IGlmX2ZhbHNlX2xhYmVsOwotICAgICAgICAgICAgICAgICAgZG9fY29tcGFyZV9ydHhfYW5kX2p1 bXAgKG9wMCwgb3AxLCBmaXJzdF9jb2RlLCB1bnNpZ25lZHAsIG1vZGUsCi0JCQkJCSAgIHNpemUs IGRlc3RfbGFiZWwsIE5VTEwsIGZpcnN0X3Byb2IpOworCisJCSAgZG9fY29tcGFyZV9ydHhfYW5k X2p1bXAgKG9wMCwgb3AxLCBmaXJzdF9jb2RlLCB1bnNpZ25lZHAsCisJCQkJCSAgIHZhbCwgbW9k ZSwgc2l6ZSwgZGVzdF9sYWJlbCwgTlVMTCwKKwkJCQkJICAgZmlyc3RfcHJvYik7CiAJCX0KIAkg ICAgICAvKiBGb3IgIWFuZF90aGVtIHdlIHdhbnQgdG8gc3BsaXQ6CiAJCSBpZiAoeCkgZ290byB0 OyAvLyBwcm9iOwpAQCAtMTE5Miw4ICsxMjExLDkgQEAgZG9fY29tcGFyZV9ydHhfYW5kX2p1bXAg KHJ0eCBvcDAsIHJ0eCBvcDEsIGVudW0gcnR4X2NvZGUgY29kZSwgaW50IHVuc2lnbmVkcCwKICAg ICAgICAgICAgICAgZWxzZQogCQl7CiAJCSAgcHJvZmlsZV9wcm9iYWJpbGl0eSBmaXJzdF9wcm9i ID0gcHJvYi5zcGxpdCAoY3Byb2IpOwotCQkgIGRvX2NvbXBhcmVfcnR4X2FuZF9qdW1wIChvcDAs IG9wMSwgZmlyc3RfY29kZSwgdW5zaWduZWRwLCBtb2RlLAotCQkJCQkgICBzaXplLCBOVUxMLCBp Zl90cnVlX2xhYmVsLCBmaXJzdF9wcm9iKTsKKwkJICBkb19jb21wYXJlX3J0eF9hbmRfanVtcCAo b3AwLCBvcDEsIGZpcnN0X2NvZGUsIHVuc2lnbmVkcCwKKwkJCQkJICAgdmFsLCBtb2RlLCBzaXpl LCBOVUxMLAorCQkJCQkgICBpZl90cnVlX2xhYmVsLCBmaXJzdF9wcm9iKTsKIAkJICBpZiAob3Jp Z19jb2RlID09IE5FICYmIGNhbl9jb21wYXJlX3AgKFVORVEsIG1vZGUsIGNjcF9qdW1wKSkKIAkJ ICAgIHsKIAkJICAgICAgLyogeCAhPSB5IGNhbiBiZSBzcGxpdCBpbnRvIHggdW5vcmQgeSB8fCB4 IGx0Z3QgeQpAQCAtMTIxNSw3ICsxMjM1LDcgQEAgZG9fY29tcGFyZV9ydHhfYW5kX2p1bXAgKHJ0 eCBvcDAsIHJ0eCBvcDEsIGVudW0gcnR4X2NvZGUgY29kZSwgaW50IHVuc2lnbmVkcCwKIAkgICAg fQogCX0KIAotICAgICAgZW1pdF9jbXBfYW5kX2p1bXBfaW5zbnMgKG9wMCwgb3AxLCBjb2RlLCBz aXplLCBtb2RlLCB1bnNpZ25lZHAsCisgICAgICBlbWl0X2NtcF9hbmRfanVtcF9pbnNucyAob3Aw LCBvcDEsIGNvZGUsIHNpemUsIG1vZGUsIHVuc2lnbmVkcCwgdmFsLAogCQkJICAgICAgIGlmX3Ry dWVfbGFiZWwsIHByb2IpOwogICAgIH0KIApAQCAtMTI4OSw5ICsxMzA5LDkgQEAgZG9fY29tcGFy ZV9hbmRfanVtcCAodHJlZSB0cmVlb3AwLCB0cmVlIHRyZWVvcDEsIGVudW0gcnR4X2NvZGUgc2ln bmVkX2NvZGUsCiAgICAgICBvcDEgPSBuZXdfb3AxOwogICAgIH0KIAotICBkb19jb21wYXJlX3J0 eF9hbmRfanVtcCAob3AwLCBvcDEsIGNvZGUsIHVuc2lnbmVkcCwgbW9kZSwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICgobW9kZSA9PSBCTEttb2RlKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgID8gZXhwcl9zaXplICh0cmVlb3AwKSA6IE5VTExfUlRYKSwKKyAgZG9fY29tcGFyZV9y dHhfYW5kX2p1bXAgKG9wMCwgb3AxLCBjb2RlLCB1bnNpZ25lZHAsIHRyZWVvcDAsIG1vZGUsCisJ CQkgICAoKG1vZGUgPT0gQkxLbW9kZSkKKwkJCSAgICA/IGV4cHJfc2l6ZSAodHJlZW9wMCkgOiBO VUxMX1JUWCksCiAJCQkgICBpZl9mYWxzZV9sYWJlbCwgaWZfdHJ1ZV9sYWJlbCwgcHJvYik7CiB9 CiAKZGlmZiAtLWdpdCBhL2djYy9vcHRhYnMuY2MgYi9nY2Mvb3B0YWJzLmNjCmluZGV4IGYzMzhk ZjQxMDI2NWRmZTU1YjY4OTYxNjAwOTBhNDUzY2M2YTI4ZDkuLjBmNjYyZWJkYjgxOGQ3NTM4YmRk MTNmYjAyYmNmOGJjZjFkYmFiNjQgMTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMuY2MKKysrIGIvZ2Nj L29wdGFicy5jYwpAQCAtNDYsNiArNDYsOCBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxl IENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgImxpYmZ1bmNzLmgiCiAjaW5jbHVkZSAi aW50ZXJuYWwtZm4uaCIKICNpbmNsdWRlICJsYW5naG9va3MuaCIKKyNpbmNsdWRlICJnaW1wbGUu aCIKKyNpbmNsdWRlICJzc2EuaCIKIAogc3RhdGljIHZvaWQgcHJlcGFyZV9mbG9hdF9saWJfY21w IChydHgsIHJ0eCwgZW51bSBydHhfY29kZSwgcnR4ICosCiAJCQkJICAgbWFjaGluZV9tb2RlICop OwpAQCAtNDYyMCw3ICs0NjIyLDcgQEAgcHJlcGFyZV9vcGVyYW5kIChlbnVtIGluc25fY29kZSBp Y29kZSwgcnR4IHgsIGludCBvcG51bSwgbWFjaGluZV9tb2RlIG1vZGUsCiAKIHN0YXRpYyB2b2lk CiBlbWl0X2NtcF9hbmRfanVtcF9pbnNuXzEgKHJ0eCB0ZXN0LCBtYWNoaW5lX21vZGUgbW9kZSwg cnR4IGxhYmVsLAotCQkJICBwcm9maWxlX3Byb2JhYmlsaXR5IHByb2IpCisJCQkgIGRpcmVjdF9v cHRhYiBjbXBfb3B0YWIsIHByb2ZpbGVfcHJvYmFiaWxpdHkgcHJvYikKIHsKICAgbWFjaGluZV9t b2RlIG9wdGFiX21vZGU7CiAgIGVudW0gbW9kZV9jbGFzcyBtY2xhc3M7CkBAIC00NjI5LDcgKzQ2 MzEsNyBAQCBlbWl0X2NtcF9hbmRfanVtcF9pbnNuXzEgKHJ0eCB0ZXN0LCBtYWNoaW5lX21vZGUg bW9kZSwgcnR4IGxhYmVsLAogCiAgIG1jbGFzcyA9IEdFVF9NT0RFX0NMQVNTIChtb2RlKTsKICAg b3B0YWJfbW9kZSA9IChtY2xhc3MgPT0gTU9ERV9DQykgPyBDQ21vZGUgOiBtb2RlOwotICBpY29k ZSA9IG9wdGFiX2hhbmRsZXIgKGNicmFuY2hfb3B0YWIsIG9wdGFiX21vZGUpOworICBpY29kZSA9 IG9wdGFiX2hhbmRsZXIgKGNtcF9vcHRhYiwgb3B0YWJfbW9kZSk7CiAKICAgZ2NjX2Fzc2VydCAo aWNvZGUgIT0gQ09ERV9GT1Jfbm90aGluZyk7CiAgIGdjY19hc3NlcnQgKGluc25fb3BlcmFuZF9t YXRjaGVzIChpY29kZSwgMCwgdGVzdCkpOwpAQCAtNDY0NCw2ICs0NjQ2LDU2IEBAIGVtaXRfY21w X2FuZF9qdW1wX2luc25fMSAocnR4IHRlc3QsIG1hY2hpbmVfbW9kZSBtb2RlLCBydHggbGFiZWws CiAgICAgYWRkX3JlZ19icl9wcm9iX25vdGUgKGluc24sIHByb2IpOwogfQogCisvKiBDaGVjayB0 byBzZWUgaWYgdGhlIHN1cHBsaWVkIGNvbXBhcmlzb24gaW4gUFRFU1QgY2FuIGJlIHBlcmZvcm1l ZCBhcyBhCisgICBiaXQtdGVzdC1hbmQtYnJhbmNoIGluc3RlYWQuICBWQUwgbXVzdCBjb250YWlu IHRoZSBvcmlnaW5hbCB0cmVlCisgICBleHByZXNzaW9uIG9mIHRoZSBub24temVybyBvcGVyYW5k IHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXdyaXRlIHRoZQorICAgY29tcGFyaXNvbiBpbiBQVEVT VC4KKworICAgUmV0dXJucyBUUlVFIGlmIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQgcmV0dXJucyB1 cGRhdGVkIFBNT0RFIGFuZCBQVEVTVCwKKyAgIGVsc2UgRkFMU0UuICAqLworCitlbnVtIGluc25f Y29kZQorc3RhdGljIHZhbGlkYXRlX3Rlc3RfYW5kX2JyYW5jaCAodHJlZSB2YWwsIHJ0eCAqcHRl c3QsIG1hY2hpbmVfbW9kZSAqcG1vZGUpCit7CisgIGlmICghdmFsIHx8IFRSRUVfQ09ERSAodmFs KSAhPSBTU0FfTkFNRSkKKyAgICByZXR1cm4gQ09ERV9GT1Jfbm90aGluZzsKKworICBtYWNoaW5l X21vZGUgbW9kZSA9IFRZUEVfTU9ERSAoVFJFRV9UWVBFICh2YWwpKTsKKyAgcnR4IHRlc3QgPSAq cHRlc3Q7CisKKyAgaWYgKEdFVF9DT0RFICh0ZXN0KSAhPSBFUSAmJiBHRVRfQ09ERSAodGVzdCkg IT0gTkUpCisgICAgcmV0dXJuIENPREVfRk9SX25vdGhpbmc7CisKKyAgLyogSWYgdGhlIHRhcmdl dCBzdXBwb3J0cyB0aGUgdGVzdGJpdCBjb21wYXJpc29uIGRpcmVjdGx5LCBncmVhdC4gICovCisg IGF1dG8gaWNvZGUgPSBkaXJlY3Rfb3B0YWJfaGFuZGxlciAodGJyYW5jaF9vcHRhYiwgbW9kZSk7 CisgIGlmIChpY29kZSA9PSBDT0RFX0ZPUl9ub3RoaW5nKQorICAgIHJldHVybiBpY29kZTsKKwor ICBpZiAodHJlZV96ZXJvX29uZV92YWx1ZWRfcCAodmFsKSkKKyAgICB7CisgICAgICBhdXRvIHBv cyA9IEJZVEVTX0JJR19FTkRJQU4gPyBHRVRfTU9ERV9CSVRTSVpFIChtb2RlKSAtIDEgOiAwOwor ICAgICAgWEVYUCAodGVzdCwgMSkgPSBnZW5faW50X21vZGUgKHBvcywgbW9kZSk7CisgICAgICAq cHRlc3QgPSB0ZXN0OworICAgICAgKnBtb2RlID0gbW9kZTsKKyAgICAgIHJldHVybiBpY29kZTsK KyAgICB9CisKKyAgd2lkZV9pbnQgd2NzdCA9IGdldF9ub256ZXJvX2JpdHMgKHZhbCk7CisgIGlm ICh3Y3N0ID09IC0xKQorICAgIHJldHVybiBDT0RFX0ZPUl9ub3RoaW5nOworCisgIGludCBiaXRw b3M7CisKKyAgaWYgKChiaXRwb3MgPSB3aTo6ZXhhY3RfbG9nMiAod2NzdCkpID09IC0xKQorICAg IHJldHVybiBDT0RFX0ZPUl9ub3RoaW5nOworCisgIGF1dG8gcG9zID0gQllURVNfQklHX0VORElB TiA/IEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpIC0gMSAtIGJpdHBvcyA6IGJpdHBvczsKKyAgWEVY UCAodGVzdCwgMSkgPSBnZW5faW50X21vZGUgKHBvcywgbW9kZSk7CisgICpwdGVzdCA9IHRlc3Q7 CisgICpwbW9kZSA9IG1vZGU7CisgIHJldHVybiBpY29kZTsKK30KKwogLyogR2VuZXJhdGUgY29k ZSB0byBjb21wYXJlIFggd2l0aCBZIHNvIHRoYXQgdGhlIGNvbmRpdGlvbiBjb2RlcyBhcmUKICAg IHNldCBhbmQgdG8ganVtcCB0byBMQUJFTCBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuICBJZiBY IGlzIGEKICAgIGNvbnN0YW50IGFuZCBZIGlzIG5vdCBhIGNvbnN0YW50LCB0aGVuIHRoZSBjb21w YXJpc29uIGlzIHN3YXBwZWQgdG8KQEAgLTQ2NjEsMTEgKzQ3MTMsMTMgQEAgZW1pdF9jbXBfYW5k X2p1bXBfaW5zbl8xIChydHggdGVzdCwgbWFjaGluZV9tb2RlIG1vZGUsIHJ0eCBsYWJlbCwKICAg IEl0IHdpbGwgYmUgcG90ZW50aWFsbHkgY29udmVydGVkIGludG8gYW4gdW5zaWduZWQgdmFyaWFu dCBiYXNlZCBvbgogICAgVU5TSUdORURQIHRvIHNlbGVjdCBhIHByb3BlciBqdW1wIGluc3RydWN0 aW9uLgogICAgCi0gICBQUk9CIGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBqdW1waW5nIHRvIExBQkVM LiAgKi8KKyAgIFBST0IgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGp1bXBpbmcgdG8gTEFCRUwuICBJ ZiB0aGUgY29tcGFyaXNvbiBpcyBhZ2FpbnN0CisgICB6ZXJvIHRoZW4gVkFMIGNvbnRhaW5zIHRo ZSBleHByZXNzaW9uIGZyb20gd2hpY2ggdGhlIG5vbi16ZXJvIFJUTCBpcworICAgZGVyaXZlZC4g ICovCiAKIHZvaWQKIGVtaXRfY21wX2FuZF9qdW1wX2luc25zIChydHggeCwgcnR4IHksIGVudW0g cnR4X2NvZGUgY29tcGFyaXNvbiwgcnR4IHNpemUsCi0JCQkgbWFjaGluZV9tb2RlIG1vZGUsIGlu dCB1bnNpZ25lZHAsIHJ0eCBsYWJlbCwKKwkJCSBtYWNoaW5lX21vZGUgbW9kZSwgaW50IHVuc2ln bmVkcCwgdHJlZSB2YWwsIHJ0eCBsYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9m aWxlX3Byb2JhYmlsaXR5IHByb2IpCiB7CiAgIHJ0eCBvcDAgPSB4LCBvcDEgPSB5OwpAQCAtNDY5 MCwxMCArNDc0NCwzMiBAQCBlbWl0X2NtcF9hbmRfanVtcF9pbnNucyAocnR4IHgsIHJ0eCB5LCBl bnVtIHJ0eF9jb2RlIGNvbXBhcmlzb24sIHJ0eCBzaXplLAogCiAgIHByZXBhcmVfY21wX2luc24g KG9wMCwgb3AxLCBjb21wYXJpc29uLCBzaXplLCB1bnNpZ25lZHAsIE9QVEFCX0xJQl9XSURFTiwK IAkJICAgICZ0ZXN0LCAmbW9kZSk7Ci0gIGVtaXRfY21wX2FuZF9qdW1wX2luc25fMSAodGVzdCwg bW9kZSwgbGFiZWwsIHByb2IpOworCisgIC8qIENoZWNrIGlmIHdlJ3JlIGNvbXBhcmluZyBhIHRy dXRoIHR5cGUgd2l0aCAwLCBhbmQgaWYgc28gY2hlY2sgaWYKKyAgICAgdGhlIHRhcmdldCBzdXBw b3J0cyB0YnJhbmNoLiAgKi8KKyAgbWFjaGluZV9tb2RlIHRtb2RlID0gbW9kZTsKKyAgaWYgKG9w MSA9PSBDT05TVDBfUlRYIChHRVRfTU9ERSAob3AxKSkKKyAgICAgICYmIHZhbGlkYXRlX3Rlc3Rf YW5kX2JyYW5jaCAodmFsLCAmdGVzdCwgJnRtb2RlKSAhPSBDT0RFX0ZPUl9ub3RoaW5nKQorICAg IHsKKyAgICAgIGVtaXRfY21wX2FuZF9qdW1wX2luc25fMSAodGVzdCwgdG1vZGUsIGxhYmVsLCB0 YnJhbmNoX29wdGFiLCBwcm9iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZW1pdF9jbXBf YW5kX2p1bXBfaW5zbl8xICh0ZXN0LCBtb2RlLCBsYWJlbCwgY2JyYW5jaF9vcHRhYiwgcHJvYik7 CiB9CiAKLQwKKy8qIE92ZXJsb2FkZWQgdmVyc2lvbiBvZiBlbWl0X2NtcF9hbmRfanVtcF9pbnNu cyBpbiB3aGljaCBWQUwgaXMgdW5rbm93bi4gICovCisKK3ZvaWQKK2VtaXRfY21wX2FuZF9qdW1w X2luc25zIChydHggeCwgcnR4IHksIGVudW0gcnR4X2NvZGUgY29tcGFyaXNvbiwgcnR4IHNpemUs CisJCQkgbWFjaGluZV9tb2RlIG1vZGUsIGludCB1bnNpZ25lZHAsIHJ0eCBsYWJlbCwKKwkJCSBw cm9maWxlX3Byb2JhYmlsaXR5IHByb2IpCit7CisgIGVtaXRfY21wX2FuZF9qdW1wX2luc25zICh4 LCB5LCBjb21wYXJpc29uLCBzaXplLCBtb2RlLCB1bnNpZ25lZHAsIE5VTEwsCisJCQkgICBsYWJl bCwgcHJvYik7Cit9CisKKwogLyogRW1pdCBhIGxpYnJhcnkgY2FsbCBjb21wYXJpc29uIGJldHdl ZW4gZmxvYXRpbmcgcG9pbnQgWCBhbmQgWS4KICAgIENPTVBBUklTT04gaXMgdGhlIHJ0bCBvcGVy YXRvciB0byBjb21wYXJlIHdpdGggKEVRLCBORSwgR1QsIGV0Yy4pLiAgKi8KIApkaWZmIC0tZ2l0 IGEvZ2NjL29wdGFicy5kZWYgYi9nY2Mvb3B0YWJzLmRlZgppbmRleCBhNmRiMjM0MmJlZDZiYWYx M2VjYmQ4NDExMmM4NDMyYzY5NzJlNmZlLi41NmUzN2Q2NzIzMWUxYmE3NGFkNmM1YjgxZDc0YTY1 ZjMxNWUyNmUyIDEwMDY0NAotLS0gYS9nY2Mvb3B0YWJzLmRlZgorKysgYi9nY2Mvb3B0YWJzLmRl ZgpAQCAtMjIwLDYgKzIyMCw3IEBAIE9QVEFCX0QgKHJlbG9hZF9pbl9vcHRhYiwgInJlbG9hZF9p biRhIikKIE9QVEFCX0QgKHJlbG9hZF9vdXRfb3B0YWIsICJyZWxvYWRfb3V0JGEiKQogCiBPUFRB Ql9EQyhjYnJhbmNoX29wdGFiLCAiY2JyYW5jaCRhNCIsIENPTVBBUkUpCitPUFRBQl9EICh0YnJh bmNoX29wdGFiLCAidGJyYW5jaCRhNCIpCiBPUFRBQl9EIChhZGRjY19vcHRhYiwgImFkZCRhY2Mi KQogT1BUQUJfRCAobmVnY2Nfb3B0YWIsICJuZWckYWNjIikKIE9QVEFCX0QgKG5vdGNjX29wdGFi LCAibm90JGFjYyIpCmRpZmYgLS1naXQgYS9nY2Mvb3B0YWJzLmggYi9nY2Mvb3B0YWJzLmgKaW5k ZXggY2ZkN2M3NDJkMmQyMWIwNTM5ZjUyMjdjMjJhOTRmMzJjNzkzZDZmNy4uY2Q1NTYwNGJjM2Q0 NTJkN2UyOGM1NTMwYmI0NzkzZDQ4MTc2NmY0ZiAxMDA2NDQKLS0tIGEvZ2NjL29wdGFicy5oCisr KyBiL2djYy9vcHRhYnMuaApAQCAtMjY4LDYgKzI2OCwxMCBAQCBleHRlcm4gdm9pZCBlbWl0X2Nt cF9hbmRfanVtcF9pbnNucyAocnR4LCBydHgsIGVudW0gcnR4X2NvZGUsIHJ0eCwKIAkJCQkgICAg IG1hY2hpbmVfbW9kZSwgaW50LCBydHgsCiAJCQkJICAgICBwcm9maWxlX3Byb2JhYmlsaXR5IHBy b2IKIAkJCQkJPSBwcm9maWxlX3Byb2JhYmlsaXR5Ojp1bmluaXRpYWxpemVkICgpKTsKK2V4dGVy biB2b2lkIGVtaXRfY21wX2FuZF9qdW1wX2luc25zIChydHgsIHJ0eCwgZW51bSBydHhfY29kZSwg cnR4LAorCQkJCSAgICAgbWFjaGluZV9tb2RlLCBpbnQsIHRyZWUsIHJ0eCwKKwkJCQkgICAgIHBy b2ZpbGVfcHJvYmFiaWxpdHkgcHJvYgorCQkJCQk9IHByb2ZpbGVfcHJvYmFiaWxpdHk6OnVuaW5p dGlhbGl6ZWQgKCkpOwogCiAvKiBHZW5lcmF0ZSBjb2RlIHRvIGluZGlyZWN0bHkganVtcCB0byBh IGxvY2F0aW9uIGdpdmVuIGluIHRoZSBydHggTE9DLiAgKi8KIGV4dGVybiB2b2lkIGVtaXRfaW5k aXJlY3RfanVtcCAocnR4KTsKZGlmZiAtLWdpdCBhL2djYy90cmVlLmggYi9nY2MvdHJlZS5oCmlu ZGV4IGU2NTY0YWFjY2I3YjY5Y2Q5MzhmZjYwYjYxMjFhZWM0MWI3ZThhNTkuLmY0NTUwMDhjZWI4 ZDkxZTdlMDczYzBhZDZkOTNkY2FlZDY1ZGVjY2YgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLmgKKysr IGIvZ2NjL3RyZWUuaApAQCAtNDY5MCw2ICs0NjkwLDcgQEAgZXh0ZXJuIHRyZWUgc2lnbmVkX29y X3Vuc2lnbmVkX3R5cGVfZm9yIChpbnQsIHRyZWUpOwogZXh0ZXJuIHRyZWUgc2lnbmVkX3R5cGVf Zm9yICh0cmVlKTsKIGV4dGVybiB0cmVlIHVuc2lnbmVkX3R5cGVfZm9yICh0cmVlKTsKIGV4dGVy biBib29sIGlzX3RydXRoX3R5cGVfZm9yICh0cmVlLCB0cmVlKTsKK2V4dGVybiBib29sIHRyZWVf emVyb19vbmVfdmFsdWVkX3AgKHRyZWUpOwogZXh0ZXJuIHRyZWUgdHJ1dGhfdHlwZV9mb3IgKHRy ZWUpOwogZXh0ZXJuIHRyZWUgYnVpbGRfcG9pbnRlcl90eXBlX2Zvcl9tb2RlICh0cmVlLCBtYWNo aW5lX21vZGUsIGJvb2wpOwogZXh0ZXJuIHRyZWUgYnVpbGRfcG9pbnRlcl90eXBlICh0cmVlKTsK --_002_VI1PR08MB5325AC9E66418A30DBE269FFFF059VI1PR08MB5325eurp_--