From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-eopbgr30063.outbound.protection.outlook.com [40.107.3.63]) by sourceware.org (Postfix) with ESMTPS id 50545384001D for ; Mon, 12 Jul 2021 09:18:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 50545384001D Received: from AM5PR0201CA0016.eurprd02.prod.outlook.com (2603:10a6:203:3d::26) by AM6PR08MB3302.eurprd08.prod.outlook.com (2603:10a6:209:41::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.22; Mon, 12 Jul 2021 09:18:31 +0000 Received: from AM5EUR03FT045.eop-EUR03.prod.protection.outlook.com (2603:10a6:203:3d:cafe::3f) by AM5PR0201CA0016.outlook.office365.com (2603:10a6:203:3d::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.19 via Frontend Transport; Mon, 12 Jul 2021 09:18:31 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; gcc.gnu.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;gcc.gnu.org; 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; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT045.mail.protection.outlook.com (10.152.17.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.20 via Frontend Transport; Mon, 12 Jul 2021 09:18:31 +0000 Received: ("Tessian outbound ecba17995f61:v98"); Mon, 12 Jul 2021 09:18:30 +0000 X-CR-MTA-TID: 64aa7808 Received: from ec204ebe8cd2.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 758DCBBA-C35D-4633-BBD8-F6CC88C55838.1; Mon, 12 Jul 2021 09:18:20 +0000 Received: from EUR02-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ec204ebe8cd2.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 12 Jul 2021 09:18:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iyssiWCGAixeKZm07J6Hcu4DLN/Q9i2NvtLANhXfLRoE/iNRPPcSxa/5sS9UOummXD8bC31kcnJraxSAM2Eho4SZgtBSCKSxxhSnhNwwFPMClyIZ3sg8AimhnChEjzkpil/LvBQKAMHD6LMqz5fzKSBYERIXFFOIPCblArXY26WVGnxlLm2WOMiKRDK2L/qO+syjRQ3Zdy71NlnmTZVlX8bpj97VWMmDwJaxzQRV/hBsM5eIZspLLusIZthYCP6MZqwKw/lzXHhWbmwpVChg70ovbGlYiLkM3KVbV6IsEGzfHL/n9sq3Sc6E1moDzepo6ahWd1WvNoMq63h4W7k/oA== 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-SenderADCheck; bh=Yer5mNRQnOPi+WDEgegXZfT6smrjbnXa7ocWqVMpJyg=; b=BBvZAO+w5WC26BHagoKrBJXvPCyrC17b0zK74PZidf3L4HXVY05SFx7WxFLvxqqRiePsButIDjSpGVHJJlIWODVoz3jLbamvr5bd9cd4d0TKrD9M4xEtHZKb+CghOvI+Oqw33cKq/yeRfEqMQ3ObugcEIqmjUkFv1hFjV+RN2vDV8T9P8Tusl/5DhZ4bwzxe/aRsQs47D8nunLrnLZlOo0NamlmkExzOLfyNrOII7SLpVl03MCP8rja2xzeEmbPzlRfFPixcKusnY/syLVLlttO7sfFlBv1RH0uAfnp0HxOWAgyNdcJLrejgdCyl/I1jskHucGgztPuzndaavSkikg== 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 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by VI1PR08MB2702.eurprd08.prod.outlook.com (2603:10a6:802:1e::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.20; Mon, 12 Jul 2021 09:18:17 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::cdbb:a6b9:e814:19c7]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::cdbb:a6b9:e814:19c7%8]) with mapi id 15.20.4308.026; Mon, 12 Jul 2021 09:18:17 +0000 From: Tamar Christina To: Richard Sandiford CC: Richard Biener , nd , "gcc-patches@gcc.gnu.org" Subject: RE: [PATCH 1/4]middle-end Vect: Add support for dot-product where the sign for the multiplicant changes. Thread-Topic: [PATCH 1/4]middle-end Vect: Add support for dot-product where the sign for the multiplicant changes. Thread-Index: AQHXQdV4g2WFnSd+rEyE6iZSy1EmNqrX6WiAgAABSHCABLQJgIAAAwwAgAAbeYCAF6c1YIABMgmAgAsI3tCAAzBucIAEtzcggAsfWKCADICC1oAABcOWgB9MZOA= Date: Mon, 12 Jul 2021 09:18:17 +0000 Message-ID: References: <7q3oonr2-92r0-8o9q-s27q-9r735s4n3s3@fhfr.qr> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ts-tracking-id: 38241C3693C0314FAD9524701A04C450.0 x-checkrecipientchecked: true Authentication-Results-Original: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=arm.com; x-ms-publictraffictype: Email X-MS-Office365-Filtering-Correlation-Id: 95f3d58f-6da1-486b-1daa-08d945160439 x-ms-traffictypediagnostic: VI1PR08MB2702:|AM6PR08MB3302: x-ms-exchange-transport-forked: True X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true nodisclaimer: true x-ms-oob-tlc-oobclassifiers: OLM:4125;OLM:4125; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 0SU71+ogLq6ygjSwW7Y8Dn6fDJLlI3pZOx4/dPIdA3lAmAQIv9Ueknh/dKZGT0a++jlhkVU7VPgNWpdbUpGxMfWS1hLUT+pYqT5GP7CTbYNTUSGvwH8Fau4sPGZ6XdQgX4N1wpS6qucsh3s7ttjf/n8PLZ7x7zLZQocy4S2fq69ZTlgcbT4TLGoTPfJhVsOm7aWuExA3BPbttXObkFD3w0bWnHCn/cs3qNTwUP897gHMYj4KlJgvejHsOwqnlwK3PpB25b4eW+ijAn6pG0BEY5DTstNVm1x3E7KTnaLcOuH5hNqlsl2rlw5g/PCssuPJMk3cXUFNSyA9gmg33vajxJpsEQSpsztEx6xlMBCTBgX5DgriGYaH+uwOhUjQSr2SYBkWCN+Du3Kfmxf2wp5IML3y6H8wnlEq6aWDex/ASWYOrUYHFvAcrno20s0m4Dyp6W2Cqs/gO1u/p/34hSYU93evPQpg2quplgLFec19MXOz+Jz2rt4202MnurtZTc21Vqv+fJ8EL+U7N5kfTBE+czVFdxEXHiBhguMOsMKLiGB4tEsfBHR+m35WiWelqXWVyHj2Dy64jdHYBtmR3j+ihfl9DlpUL/PP88U9qB6q2leRA9RDAv0nhU0C/yIPppaPnvoCnAhOT7p9QotSyufhPpolt3Z46N1/5ObSU4hs28ndKYfDtN1mnSMSGwmAnzq0yRdw1aB9SShnBS7uDS1vzg== 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:(4636009)(346002)(376002)(366004)(39850400004)(136003)(396003)(9686003)(52536014)(2906002)(8936002)(66556008)(64756008)(66446008)(83380400001)(71200400001)(55016002)(54906003)(26005)(122000001)(66946007)(186003)(76116006)(8676002)(316002)(38100700002)(86362001)(66476007)(66616009)(99936003)(30864003)(6506007)(4326008)(6862004)(478600001)(5660300002)(6636002)(7696005)(33656002)(579004)(357404004); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?KnSsGCgmkVfCNCd16YsjUbr1VLocku68XBJJnPfDGzfemD8bZuMCWLdbDtl/?= =?us-ascii?Q?bkf5FUcPWhW/XhbFpuaU/q87d2YsPv5HZJUkofBQT95169CVPwCbrbxVP5C0?= =?us-ascii?Q?fncLw7FjxBpK6h3j/CuHjzI6121e40O7saW0BgxZFVelxJIOmhQLJuezWcxT?= =?us-ascii?Q?yO97wpYjUvFGu/XHBrf3bHboUW6C8JfKApvPrAChh+BTSsJqoYStK65sJH7n?= =?us-ascii?Q?7D5s7efiDzaXD7FmCDeQDTmLd5iPIkZb6I7jq3SipgQUIjHqbwSSyFwV3tAh?= =?us-ascii?Q?VV7SzrHiqprpwmaxOkU5F0szRTR+7+J/PPa1xYmmOgwxWTu7WoobFtHFsvcO?= =?us-ascii?Q?4FsdVSzSiuJFzw7GMrrb5amNTEmCmqUgxfIrNQSfx8ApYeUu8Jxo/N8X20kf?= =?us-ascii?Q?QxJIfv8aCqU5QY6q4n+JGJeyP9T2AakaYzoG0IFp4Gtn+duSo/mMr06LJmTz?= =?us-ascii?Q?0SnwpFunHLiHY878KlY6cbC2EtOpp9HHLPE08ZsgB8DlgL8rFpsY9wImrG3P?= =?us-ascii?Q?2o268wU6E4X7mFK3jN9iOXIXBFMyOMXmZ+LF1eTXNMUQLEYxklfFpWNYfn7C?= =?us-ascii?Q?Q0MZPi7/246mjk627lmtqCxCRle3hP+mANNfOWnGd6doctFShLbZabfmZCE9?= =?us-ascii?Q?ri/Ydhu9R+shr1wL7SEkcW2UVFvj/XjLh1XpRTAmIXFWHwG3BO+qTKUw8lcB?= =?us-ascii?Q?mpWrxwIhchcU2h8EpeLB8i34Q5PdZRc3yBGwlFCOCnKhbq8kdTuoHXJvfXSS?= =?us-ascii?Q?GUy0sQLi2KSa4by6roPq2V+FuhTJlPEhUTZy+Ah3v6Zz43qQtQrl+L2BalqQ?= =?us-ascii?Q?9as1oINIswTpsRn4wzanGNdN4w9Pa3QdVcDxf+LJFBuAt0szcFPaAlxCM0Sq?= =?us-ascii?Q?eFnjdjXoRU4vOtRBCfyPQxzpUHlR3li+axepFVthdfJBcpYAamZ40FdjxaNu?= =?us-ascii?Q?FIxKIZ/2OUfqNqiddf0sRUrSNBPr5C1nA4XErLXiT8EoQCasP8586Nl5fMHJ?= =?us-ascii?Q?ypTmnZ18K+zaW3P3xkexKcwQcNrZqIHzsZxxbNvtJZoSFaRUX1Jum1Fg3XpE?= =?us-ascii?Q?b5DBYBe1MdLCkBVJ6+89TkY7NrX/h+eCXBJvR7J/pU1GKj/ofHFpAbv7CLuj?= =?us-ascii?Q?jj77a2YGkC+LV5xobwuVea+nYBcfhym5OWydmGBCNAa6hmxy+U2TmaSF7tCg?= =?us-ascii?Q?CxlGqD553d3B7xPOYawGEzh6KAXyElmTEvDUYgd+1CsUiBbkmkh4eiNq05wZ?= =?us-ascii?Q?nIvGfC6twCvoRWoqFj7AF3sQDgVsyQEM4HRGGWQ+XWyVKzp9E27OTLgY85KR?= =?us-ascii?Q?Q0+KOjy13HQKo8H+rPhF0mVT?= Content-Type: multipart/mixed; boundary="_002_VI1PR08MB53255B22281D39CB0244E44FFF159VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB2702 Original-Authentication-Results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT045.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 2c7612dc-8286-4961-3aa1-08d94515fc4b X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CI7hSflsrsMwI0NcEJPtdMxOEzMQJE1Fz/QuL7e9EhEWinL/kMWczyzOZIzfPjgXAiI1Ei/PSWX69Eu7GU19hFv2IeroCMWQemga8XHRzOIoEakcA8Lsqdqxy6eHlEUcBbsvsAjpe/93nh7FuWTyd3G/uEBdXgDjNCe6Oew53KpCwzp87KGIgHnJ/DtUqo6djyuBeroriKXOXP+tCQ4AGp5sW78YVkIsincXrGy4xqDZD7rvazEZCTqaKVGOEU/62OlyLiTOSnneC/+Z0izaP/DzNIrjZiBVKixxIK+E/5pBuVsVwbXc235isIAi1nFXr/kL9QUlWmQujd6w9AlErPeLeL6d/1p/+Uj7GEhIk2OLRBePCPUrGVsqIEkL70KbfhHe36RiCpzx3OOSAk2gchs/nzt9zs9p7Zx0xrhb40Rpc1QdFLz2IuJSyb2PTKRprTPJJ5nbs/yqIkCss81c7UlRDof6SbZTTSpu7QnSIAzMZwSS7LhwyL6uU4j8l1BbCih6I0sLPpx3Y8xeyhqVA1t8hSEQwssEQStGIszF3koljangpiTsBuxq6eWTc4OrVijerqaSJxtvnpA1E0S9nvwc8ieCCZzLJhj/tNp+UzR3FqRyx/lebdp280MRqdeKkB3KMrtggchTkt1kfV8j3Un5fG/1OCaPJ1Joe/MbFP5xQyaL+3bE9GFw7BHgOkhBcKFnL2lIvsm4hJi5r/krKNLuqMk19Pl/lbKMdwY0F+g= 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:(4636009)(39850400004)(346002)(136003)(376002)(396003)(36840700001)(46966006)(82740400003)(52536014)(81166007)(186003)(4326008)(336012)(70586007)(33656002)(26005)(5660300002)(83380400001)(66616009)(70206006)(99936003)(356005)(235185007)(8676002)(6636002)(36860700001)(6506007)(86362001)(47076005)(55016002)(2906002)(7696005)(30864003)(82310400003)(9686003)(478600001)(54906003)(8936002)(6862004)(316002)(357404004); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jul 2021 09:18:31.1376 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 95f3d58f-6da1-486b-1daa-08d945160439 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: AM5EUR03FT045.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB3302 X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, KAM_LOTSOFHASH, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 12 Jul 2021 09:18:39 -0000 --_002_VI1PR08MB53255B22281D39CB0244E44FFF159VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, > Richard Sandiford writes: > >> @@ -992,21 +1029,27 @@ vect_recog_dot_prod_pattern (vec_info > *vinfo, > >> /* FORNOW. Can continue analyzing the def-use chain when this stmt= in > a phi > >> inside the loop (in case we are analyzing an outer-loop). */ > >> vect_unpromoted_value unprom0[2]; > >> + enum optab_subtype subtype =3D optab_vector; > >> if (!vect_widened_op_tree (vinfo, mult_vinfo, MULT_EXPR, > WIDEN_MULT_EXPR, > >> - false, 2, unprom0, &half_type)) > >> + false, 2, unprom0, &half_type, &subtype)) > >> + return NULL; > >> + > >> + if (subtype =3D=3D optab_vector_mixed_sign > >> + && TYPE_UNSIGNED (unprom_mult.type) > >> + && TYPE_PRECISION (half_type) * 4 > TYPE_PRECISION > >> + (unprom_mult.type)) > >> return NULL; > > > > Isn't the final condition here instead that TYPE1 is narrower than TYPE= 2? > > I.e. we need to reject the case in which we multiply a signed and an > > unsigned value to get a (logically) signed result, but then > > zero-extend it (rather than sign-extend it) to the precision of the add= ition. > > > > That would make the test: > > > > if (subtype =3D=3D optab_vector_mixed_sign > > && TYPE_UNSIGNED (unprom_mult.type) > > && TYPE_PRECISION (unprom_mult.type) < TYPE_PRECISION (type)) > > return NULL; > > > > instead. >=20 > And folding that into the existing test gives: >=20 > /* If there are two widening operations, make sure they agree on the si= gn > of the extension. The result of an optab_vector_mixed_sign operatio= n > is signed; otherwise, the result has the same sign as the operands. = */ > if (TYPE_PRECISION (unprom_mult.type) !=3D TYPE_PRECISION (type) > && (subtype =3D=3D optab_vector_mixed_sign > ? TYPE_UNSIGNED (unprom_mult.type) > : TYPE_SIGN (unprom_mult.type) !=3D TYPE_SIGN (half_type))) > return NULL; >=20 I went with the first one which doesn't add the extra constraints for the normal dotproduct as that makes it too restrictive. It's the type of the multiplication that determines the operation so dotproduct can be used a bit more than where we currently do. This was relaxed in an earlier patch. Updated patch attached. Ok for master? Thanks, Tamar gcc/ChangeLog: * optabs.def (usdot_prod_optab): New. * doc/md.texi: Document it and clarify other dot prod optabs. * optabs-tree.h (enum optab_subtype): Add optab_vector_mixed_sign. * optabs-tree.c (optab_for_tree_code): Support usdot_prod_optab. * optabs.c (expand_widen_pattern_expr): Likewise. * tree-cfg.c (verify_gimple_assign_ternary): Likewise. * tree-vect-loop.c (vectorizable_reduction): Query dot-product kind. * tree-vect-patterns.c (vect_supportable_direct_optab_p): Take optional optab subtype. (vect_widened_op_tree): Optionally ignore mismatch types. (vect_recog_dot_prod_pattern): Support usdot_prod_optab. ---- Inline copy of patch ---- diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 1b91814433057b1b377283fd1f40cb970dc3d243..323ba8eab78e2b2e582fa063375= 2930182e83ee5 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -5446,13 +5446,55 @@ Like @samp{fold_left_plus_@var{m}}, but takes an ad= ditional mask operand =20 @cindex @code{sdot_prod@var{m}} instruction pattern @item @samp{sdot_prod@var{m}} + +Compute the sum of the products of two signed elements. +Operand 1 and operand 2 are of the same mode. Their +product, which is of a wider mode, is computed and added to operand 3. +Operand 3 is of a mode equal or wider than the mode of the product. The +result is placed in operand 0, which is of the same mode as operand 3. + +Semantically the expressions perform the multiplication in the following s= igns + +@smallexample +sdot =3D=3D + res =3D sign-ext (a) * sign-ext (b) + c +@dots{} +@end smallexample + @cindex @code{udot_prod@var{m}} instruction pattern -@itemx @samp{udot_prod@var{m}} -Compute the sum of the products of two signed/unsigned elements. -Operand 1 and operand 2 are of the same mode. Their product, which is of a -wider mode, is computed and added to operand 3. Operand 3 is of a mode equ= al or -wider than the mode of the product. The result is placed in operand 0, whi= ch -is of the same mode as operand 3. +@item @samp{udot_prod@var{m}} + +Compute the sum of the products of two unsigned elements. +Operand 1 and operand 2 are of the same mode. Their +product, which is of a wider mode, is computed and added to operand 3. +Operand 3 is of a mode equal or wider than the mode of the product. The +result is placed in operand 0, which is of the same mode as operand 3. + +Semantically the expressions perform the multiplication in the following s= igns + +@smallexample +udot =3D=3D + res =3D zero-ext (a) * zero-ext (b) + c +@dots{} +@end smallexample + + + +@cindex @code{usdot_prod@var{m}} instruction pattern +@item @samp{usdot_prod@var{m}} +Compute the sum of the products of elements of different signs. +Operand 1 must be unsigned and operand 2 signed. Their +product, which is of a wider mode, is computed and added to operand 3. +Operand 3 is of a mode equal or wider than the mode of the product. The +result is placed in operand 0, which is of the same mode as operand 3. + +Semantically the expressions perform the multiplication in the following s= igns + +@smallexample +usdot =3D=3D + res =3D ((unsigned-conv) sign-ext (a)) * zero-ext (b) + c +@dots{} +@end smallexample =20 @cindex @code{ssad@var{m}} instruction pattern @item @samp{ssad@var{m}} diff --git a/gcc/optabs-tree.h b/gcc/optabs-tree.h index c3aaa1a416991e856d3e24da45968a92ebada82c..fbd2b06b8dbfd560dfb66b31483= 0e6b564b37abb 100644 --- a/gcc/optabs-tree.h +++ b/gcc/optabs-tree.h @@ -29,7 +29,8 @@ enum optab_subtype { optab_default, optab_scalar, - optab_vector + optab_vector, + optab_vector_mixed_sign }; =20 /* Return the optab used for computing the given operation on the type giv= en by diff --git a/gcc/optabs-tree.c b/gcc/optabs-tree.c index 95ffe397c23e80c105afea52e9d47216bf52f55a..eeb5aeed3202cc6971b6447994b= c5311e9c010bb 100644 --- a/gcc/optabs-tree.c +++ b/gcc/optabs-tree.c @@ -127,7 +127,12 @@ optab_for_tree_code (enum tree_code code, const_tree t= ype, return TYPE_UNSIGNED (type) ? usum_widen_optab : ssum_widen_optab; =20 case DOT_PROD_EXPR: - return TYPE_UNSIGNED (type) ? udot_prod_optab : sdot_prod_optab; + { + if (subtype =3D=3D optab_vector_mixed_sign) + return usdot_prod_optab; + + return (TYPE_UNSIGNED (type) ? udot_prod_optab : sdot_prod_optab); + } =20 case SAD_EXPR: return TYPE_UNSIGNED (type) ? usad_optab : ssad_optab; diff --git a/gcc/optabs.c b/gcc/optabs.c index 62a6bdb4c59bf8263c499245795576199606d372..14d8ad2f33fd75388435fe91238= 0e177f8f3c54b 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -262,6 +262,11 @@ expand_widen_pattern_expr (sepops ops, rtx op0, rtx op= 1, rtx wide_op, bool sbool =3D false; =20 oprnd0 =3D ops->op0; + if (nops >=3D 2) + oprnd1 =3D ops->op1; + if (nops >=3D 3) + oprnd2 =3D ops->op2; + tmode0 =3D TYPE_MODE (TREE_TYPE (oprnd0)); if (ops->code =3D=3D VEC_UNPACK_FIX_TRUNC_HI_EXPR || ops->code =3D=3D VEC_UNPACK_FIX_TRUNC_LO_EXPR) @@ -285,6 +290,27 @@ expand_widen_pattern_expr (sepops ops, rtx op0, rtx op= 1, rtx wide_op, ? vec_unpacks_sbool_hi_optab : vec_unpacks_sbool_lo_optab); sbool =3D true; } + else if (ops->code =3D=3D DOT_PROD_EXPR) + { + enum optab_subtype subtype =3D optab_default; + signop sign1 =3D TYPE_SIGN (TREE_TYPE (oprnd0)); + signop sign2 =3D TYPE_SIGN (TREE_TYPE (oprnd1)); + if (sign1 =3D=3D sign2) + ; + else if (sign1 =3D=3D SIGNED && sign2 =3D=3D UNSIGNED) + { + subtype =3D optab_vector_mixed_sign; + /* Same as optab_vector_mixed_sign but flip the operands. */ + std::swap (op0, op1); + } + else if (sign1 =3D=3D UNSIGNED && sign2 =3D=3D SIGNED) + subtype =3D optab_vector_mixed_sign; + else + gcc_unreachable (); + + widen_pattern_optab + =3D optab_for_tree_code (ops->code, TREE_TYPE (oprnd0), subtype); + } else widen_pattern_optab =3D optab_for_tree_code (ops->code, TREE_TYPE (oprnd0), optab_defaul= t); @@ -298,10 +324,7 @@ expand_widen_pattern_expr (sepops ops, rtx op0, rtx op= 1, rtx wide_op, gcc_assert (icode !=3D CODE_FOR_nothing); =20 if (nops >=3D 2) - { - oprnd1 =3D ops->op1; - tmode1 =3D TYPE_MODE (TREE_TYPE (oprnd1)); - } + tmode1 =3D TYPE_MODE (TREE_TYPE (oprnd1)); else if (sbool) { nops =3D 2; @@ -316,7 +339,6 @@ expand_widen_pattern_expr (sepops ops, rtx op0, rtx op1= , rtx wide_op, { gcc_assert (tmode1 =3D=3D tmode0); gcc_assert (op1); - oprnd2 =3D ops->op2; wmode =3D TYPE_MODE (TREE_TYPE (oprnd2)); } =20 diff --git a/gcc/optabs.def b/gcc/optabs.def index 41ab2598eb6c32c003cbed490796abf25d2ee315..574d355b6b3092cf893f5ab0e8a= e0f6d9ffcefbd 100644 --- a/gcc/optabs.def +++ b/gcc/optabs.def @@ -352,6 +352,7 @@ OPTAB_D (uavg_ceil_optab, "uavg$a3_ceil") OPTAB_D (sdot_prod_optab, "sdot_prod$I$a") OPTAB_D (ssum_widen_optab, "widen_ssum$I$a3") OPTAB_D (udot_prod_optab, "udot_prod$I$a") +OPTAB_D (usdot_prod_optab, "usdot_prod$I$a") OPTAB_D (usum_widen_optab, "widen_usum$I$a3") OPTAB_D (usad_optab, "usad$I$a") OPTAB_D (ssad_optab, "ssad$I$a") diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index c73e1cbdda6b9380190b03de66caee48c4e173e3..3750d2881cbb7fd1e71c0eb8c0d= 4929925fd4152 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -4434,7 +4434,8 @@ verify_gimple_assign_ternary (gassign *stmt) && !SCALAR_FLOAT_TYPE_P (rhs1_type)) || (!INTEGRAL_TYPE_P (lhs_type) && !SCALAR_FLOAT_TYPE_P (lhs_type)))) - || !types_compatible_p (rhs1_type, rhs2_type) + /* rhs1_type and rhs2_type may differ in sign. */ + || !tree_nop_conversion_p (rhs1_type, rhs2_type) || !useless_type_conversion_p (lhs_type, rhs3_type) || maybe_lt (GET_MODE_SIZE (element_mode (rhs3_type)), 2 * GET_MODE_SIZE (element_mode (rhs1_type)))) diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 51a46a6d852fb342278bb9513d013702cff4b868..4e63e84cc70ca60c706c19367cc= f256ea3f851b5 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6663,6 +6663,12 @@ vectorizable_reduction (loop_vec_info loop_vinfo, bool lane_reduc_code_p =3D (code =3D=3D DOT_PROD_EXPR || code =3D=3D WIDEN_SUM_EXPR || code = =3D=3D SAD_EXPR); int op_type =3D TREE_CODE_LENGTH (code); + enum optab_subtype optab_query_kind =3D optab_vector; + if (code =3D=3D DOT_PROD_EXPR + && TYPE_SIGN (TREE_TYPE (gimple_assign_rhs1 (stmt))) + !=3D TYPE_SIGN (TREE_TYPE (gimple_assign_rhs2 (stmt)))) + optab_query_kind =3D optab_vector_mixed_sign; + =20 scalar_dest =3D gimple_assign_lhs (stmt); scalar_type =3D TREE_TYPE (scalar_dest); @@ -7190,7 +7196,7 @@ vectorizable_reduction (loop_vec_info loop_vinfo, bool ok =3D true; =20 /* 4.1. check support for the operation in the loop */ - optab optab =3D optab_for_tree_code (code, vectype_in, optab_vector)= ; + optab optab =3D optab_for_tree_code (code, vectype_in, optab_query_k= ind); if (!optab) { if (dump_enabled_p ()) diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index d71c8c6180c8711687471060e6c937561dfe5caf..13b435c96ffdd0e7a8adf0c8e63= 523afb69bd2dc 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -191,9 +191,9 @@ vect_get_external_def_edge (vec_info *vinfo, tree var) } =20 /* Return true if the target supports a vector version of CODE, - where CODE is known to map to a direct optab. ITYPE specifies - the type of (some of) the scalar inputs and OTYPE specifies the - type of the scalar result. + where CODE is known to map to a direct optab with the given SUBTYPE. + ITYPE specifies the type of (some of) the scalar inputs and OTYPE + specifies the type of the scalar result. =20 If CODE allows the inputs and outputs to have different type (such as for WIDEN_SUM_EXPR), it is the input mode rather @@ -208,7 +208,8 @@ vect_get_external_def_edge (vec_info *vinfo, tree var) static bool vect_supportable_direct_optab_p (vec_info *vinfo, tree otype, tree_code co= de, tree itype, tree *vecotype_out, - tree *vecitype_out =3D NULL) + tree *vecitype_out =3D NULL, + enum optab_subtype subtype =3D optab_default) { tree vecitype =3D get_vectype_for_scalar_type (vinfo, itype); if (!vecitype) @@ -218,7 +219,7 @@ vect_supportable_direct_optab_p (vec_info *vinfo, tree = otype, tree_code code, if (!vecotype) return false; =20 - optab optab =3D optab_for_tree_code (code, vecitype, optab_default); + optab optab =3D optab_for_tree_code (code, vecitype, subtype); if (!optab) return false; =20 @@ -521,6 +522,7 @@ vect_joust_widened_type (tree type, tree new_type, tree= *common_type) unsigned int precision =3D MAX (TYPE_PRECISION (*common_type), TYPE_PRECISION (new_type)); precision *=3D 2; + if (precision * 2 > TYPE_PRECISION (type)) return false; =20 @@ -539,6 +541,10 @@ vect_joust_widened_type (tree type, tree new_type, tre= e *common_type) to a type that (a) is narrower than the result of STMT_INFO and (b) can hold all leaf operand values. =20 + If SUBTYPE then allow that the signs of the operands + may differ in signs but not in precision. SUBTYPE is updated to reflec= t + this. + Return 0 if STMT_INFO isn't such a tree, or if no such COMMON_TYPE exists. */ =20 @@ -546,7 +552,8 @@ static unsigned int vect_widened_op_tree (vec_info *vinfo, stmt_vec_info stmt_info, tree_code = code, tree_code widened_code, bool shift_p, unsigned int max_nops, - vect_unpromoted_value *unprom, tree *common_type) + vect_unpromoted_value *unprom, tree *common_type, + enum optab_subtype *subtype =3D NULL) { /* Check for an integer operation with the right code. */ gassign *assign =3D dyn_cast (stmt_info->stmt); @@ -607,7 +614,8 @@ vect_widened_op_tree (vec_info *vinfo, stmt_vec_info st= mt_info, tree_code code, =3D vinfo->lookup_def (this_unprom->op); nops =3D vect_widened_op_tree (vinfo, def_stmt_info, code, widened_code, shift_p, max_nops, - this_unprom, common_type); + this_unprom, common_type, + subtype); if (nops =3D=3D 0) return 0; =20 @@ -625,7 +633,18 @@ vect_widened_op_tree (vec_info *vinfo, stmt_vec_info s= tmt_info, tree_code code, *common_type =3D this_unprom->type; else if (!vect_joust_widened_type (type, this_unprom->type, common_type)) - return 0; + { + if (subtype) + { + /* See if we can sign extend the smaller type. */ + if (TYPE_PRECISION (this_unprom->type) + > TYPE_PRECISION (*common_type)) + *common_type =3D this_unprom->type; + *subtype =3D optab_vector_mixed_sign; + } + else + return 0; + } } } next_op +=3D nops; @@ -725,12 +744,22 @@ vect_split_statement (vec_info *vinfo, stmt_vec_info = stmt2_info, tree new_rhs, =20 /* Convert UNPROM to TYPE and return the result, adding new statements to STMT_INFO's pattern definition statements if no better way is - available. VECTYPE is the vector form of TYPE. */ + available. VECTYPE is the vector form of TYPE. + + If SUBTYPE then convert the type based on the subtype. */ =20 static tree vect_convert_input (vec_info *vinfo, stmt_vec_info stmt_info, tree type, - vect_unpromoted_value *unprom, tree vectype) + vect_unpromoted_value *unprom, tree vectype, + enum optab_subtype subtype =3D optab_default) { + + /* Update the type if the signs differ. */ + if (subtype =3D=3D optab_vector_mixed_sign + && TYPE_SIGN (type) !=3D TYPE_SIGN (TREE_TYPE (unprom->op))) + type =3D build_nonstandard_integer_type (TYPE_PRECISION (type), + TYPE_SIGN (unprom->type)); + /* Check for a no-op conversion. */ if (types_compatible_p (type, TREE_TYPE (unprom->op))) return unprom->op; @@ -806,12 +835,14 @@ vect_convert_input (vec_info *vinfo, stmt_vec_info st= mt_info, tree type, } =20 /* Invoke vect_convert_input for N elements of UNPROM and store the - result in the corresponding elements of RESULT. */ + result in the corresponding elements of RESULT. + + If SUBTYPE then convert the type based on the subtype. */ =20 static void vect_convert_inputs (vec_info *vinfo, stmt_vec_info stmt_info, unsigned in= t n, tree *result, tree type, vect_unpromoted_value *unprom, - tree vectype) + tree vectype, enum optab_subtype subtype =3D optab_default) { for (unsigned int i =3D 0; i < n; ++i) { @@ -819,11 +850,12 @@ vect_convert_inputs (vec_info *vinfo, stmt_vec_info s= tmt_info, unsigned int n, for (j =3D 0; j < i; ++j) if (unprom[j].op =3D=3D unprom[i].op) break; + if (j < i) result[i] =3D result[j]; else result[i] =3D vect_convert_input (vinfo, stmt_info, - type, &unprom[i], vectype); + type, &unprom[i], vectype, subtype); } } =20 @@ -895,7 +927,8 @@ vect_reassociating_reduction_p (vec_info *vinfo, =20 Try to find the following pattern: =20 - type x_t, y_t; + type1a x_t + type1b y_t; TYPE1 prod; TYPE2 sum =3D init; loop: @@ -908,9 +941,9 @@ vect_reassociating_reduction_p (vec_info *vinfo, [S6 prod =3D (TYPE2) prod; #optional] S7 sum_1 =3D prod + sum_0; =20 - where 'TYPE1' is exactly double the size of type 'type', and 'TYPE2' is= the - same size of 'TYPE1' or bigger. This is a special case of a reduction - computation. + where 'TYPE1' is exactly double the size of type 'type1a' and 'type1b', + the sign of 'TYPE1' must be one of 'type1a' or 'type1b' but the sign of + 'type1a' and 'type1b' can differ. =20 Input: =20 @@ -954,7 +987,7 @@ vect_recog_dot_prod_pattern (vec_info *vinfo, - DX is double the size of X - DY is double the size of Y - DX, DY, DPROD all have the same type but the sign - between DX, DY and DPROD can differ. + between X, Y and DPROD can differ. - sum is the same size of DPROD or bigger - sum has been recognized as a reduction variable. =20 @@ -992,21 +1025,30 @@ vect_recog_dot_prod_pattern (vec_info *vinfo, /* FORNOW. Can continue analyzing the def-use chain when this stmt in a= phi inside the loop (in case we are analyzing an outer-loop). */ vect_unpromoted_value unprom0[2]; + enum optab_subtype subtype =3D optab_vector; if (!vect_widened_op_tree (vinfo, mult_vinfo, MULT_EXPR, WIDEN_MULT_EXPR= , - false, 2, unprom0, &half_type)) + false, 2, unprom0, &half_type, &subtype)) + return NULL; + + /* If there are two widening operations, make sure they agree on the sig= n + of the extension. The result of an optab_vector_mixed_sign operation + is signed. */ + if (subtype =3D=3D optab_vector_mixed_sign + && TYPE_UNSIGNED (unprom_mult.type) + && TYPE_PRECISION (unprom_mult.type) < TYPE_PRECISION (type)) return NULL; =20 vect_pattern_detected ("vect_recog_dot_prod_pattern", last_stmt); =20 tree half_vectype; if (!vect_supportable_direct_optab_p (vinfo, type, DOT_PROD_EXPR, half_t= ype, - type_out, &half_vectype)) + type_out, &half_vectype, subtype)) return NULL; =20 /* Get the inputs in the appropriate types. */ tree mult_oprnd[2]; vect_convert_inputs (vinfo, stmt_vinfo, 2, mult_oprnd, half_type, - unprom0, half_vectype); + unprom0, half_vectype, subtype); =20 var =3D vect_recog_temp_ssa_var (type, NULL); pattern_stmt =3D gimple_build_assign (var, DOT_PROD_EXPR, --_002_VI1PR08MB53255B22281D39CB0244E44FFF159VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb14433.patch" Content-Description: rb14433.patch Content-Disposition: attachment; filename="rb14433.patch"; size=16551; creation-date="Mon, 12 Jul 2021 09:17:00 GMT"; modification-date="Mon, 12 Jul 2021 09:17:00 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9kb2MvbWQudGV4aSBiL2djYy9kb2MvbWQudGV4aQppbmRleCAxYjkx ODE0NDMzMDU3YjFiMzc3MjgzZmQxZjQwY2I5NzBkYzNkMjQzLi4zMjNiYThlYWI3OGUyYjJlNTgy ZmEwNjMzNzUyOTMwMTgyZTgzZWU1IDEwMDY0NAotLS0gYS9nY2MvZG9jL21kLnRleGkKKysrIGIv Z2NjL2RvYy9tZC50ZXhpCkBAIC01NDQ2LDEzICs1NDQ2LDU1IEBAIExpa2UgQHNhbXB7Zm9sZF9s ZWZ0X3BsdXNfQHZhcnttfX0sIGJ1dCB0YWtlcyBhbiBhZGRpdGlvbmFsIG1hc2sgb3BlcmFuZAog CiBAY2luZGV4IEBjb2Rle3Nkb3RfcHJvZEB2YXJ7bX19IGluc3RydWN0aW9uIHBhdHRlcm4KIEBp dGVtIEBzYW1we3Nkb3RfcHJvZEB2YXJ7bX19CisKK0NvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcHJv ZHVjdHMgb2YgdHdvIHNpZ25lZCBlbGVtZW50cy4KK09wZXJhbmQgMSBhbmQgb3BlcmFuZCAyIGFy ZSBvZiB0aGUgc2FtZSBtb2RlLiBUaGVpcgorcHJvZHVjdCwgd2hpY2ggaXMgb2YgYSB3aWRlciBt b2RlLCBpcyBjb21wdXRlZCBhbmQgYWRkZWQgdG8gb3BlcmFuZCAzLgorT3BlcmFuZCAzIGlzIG9m IGEgbW9kZSBlcXVhbCBvciB3aWRlciB0aGFuIHRoZSBtb2RlIG9mIHRoZSBwcm9kdWN0LiBUaGUK K3Jlc3VsdCBpcyBwbGFjZWQgaW4gb3BlcmFuZCAwLCB3aGljaCBpcyBvZiB0aGUgc2FtZSBtb2Rl IGFzIG9wZXJhbmQgMy4KKworU2VtYW50aWNhbGx5IHRoZSBleHByZXNzaW9ucyBwZXJmb3JtIHRo ZSBtdWx0aXBsaWNhdGlvbiBpbiB0aGUgZm9sbG93aW5nIHNpZ25zCisKK0BzbWFsbGV4YW1wbGUK K3Nkb3Q8c2lnbmVkIGMsIHNpZ25lZCBhLCBzaWduZWQgYj4gPT0KKyAgIHJlcyA9IHNpZ24tZXh0 IChhKSAqIHNpZ24tZXh0IChiKSArIGMKK0Bkb3Rze30KK0BlbmQgc21hbGxleGFtcGxlCisKIEBj aW5kZXggQGNvZGV7dWRvdF9wcm9kQHZhcnttfX0gaW5zdHJ1Y3Rpb24gcGF0dGVybgotQGl0ZW14 IEBzYW1we3Vkb3RfcHJvZEB2YXJ7bX19Ci1Db21wdXRlIHRoZSBzdW0gb2YgdGhlIHByb2R1Y3Rz IG9mIHR3byBzaWduZWQvdW5zaWduZWQgZWxlbWVudHMuCi1PcGVyYW5kIDEgYW5kIG9wZXJhbmQg MiBhcmUgb2YgdGhlIHNhbWUgbW9kZS4gVGhlaXIgcHJvZHVjdCwgd2hpY2ggaXMgb2YgYQotd2lk ZXIgbW9kZSwgaXMgY29tcHV0ZWQgYW5kIGFkZGVkIHRvIG9wZXJhbmQgMy4gT3BlcmFuZCAzIGlz IG9mIGEgbW9kZSBlcXVhbCBvcgotd2lkZXIgdGhhbiB0aGUgbW9kZSBvZiB0aGUgcHJvZHVjdC4g VGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gb3BlcmFuZCAwLCB3aGljaAotaXMgb2YgdGhlIHNhbWUg bW9kZSBhcyBvcGVyYW5kIDMuCitAaXRlbSBAc2FtcHt1ZG90X3Byb2RAdmFye219fQorCitDb21w dXRlIHRoZSBzdW0gb2YgdGhlIHByb2R1Y3RzIG9mIHR3byB1bnNpZ25lZCBlbGVtZW50cy4KK09w ZXJhbmQgMSBhbmQgb3BlcmFuZCAyIGFyZSBvZiB0aGUgc2FtZSBtb2RlLiBUaGVpcgorcHJvZHVj dCwgd2hpY2ggaXMgb2YgYSB3aWRlciBtb2RlLCBpcyBjb21wdXRlZCBhbmQgYWRkZWQgdG8gb3Bl cmFuZCAzLgorT3BlcmFuZCAzIGlzIG9mIGEgbW9kZSBlcXVhbCBvciB3aWRlciB0aGFuIHRoZSBt b2RlIG9mIHRoZSBwcm9kdWN0LiBUaGUKK3Jlc3VsdCBpcyBwbGFjZWQgaW4gb3BlcmFuZCAwLCB3 aGljaCBpcyBvZiB0aGUgc2FtZSBtb2RlIGFzIG9wZXJhbmQgMy4KKworU2VtYW50aWNhbGx5IHRo ZSBleHByZXNzaW9ucyBwZXJmb3JtIHRoZSBtdWx0aXBsaWNhdGlvbiBpbiB0aGUgZm9sbG93aW5n IHNpZ25zCisKK0BzbWFsbGV4YW1wbGUKK3Vkb3Q8dW5zaWduZWQgYywgdW5zaWduZWQgYSwgdW5z aWduZWQgYj4gPT0KKyAgIHJlcyA9IHplcm8tZXh0IChhKSAqIHplcm8tZXh0IChiKSArIGMKK0Bk b3Rze30KK0BlbmQgc21hbGxleGFtcGxlCisKKworCitAY2luZGV4IEBjb2Rle3VzZG90X3Byb2RA dmFye219fSBpbnN0cnVjdGlvbiBwYXR0ZXJuCitAaXRlbSBAc2FtcHt1c2RvdF9wcm9kQHZhcntt fX0KK0NvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcHJvZHVjdHMgb2YgZWxlbWVudHMgb2YgZGlmZmVy ZW50IHNpZ25zLgorT3BlcmFuZCAxIG11c3QgYmUgdW5zaWduZWQgYW5kIG9wZXJhbmQgMiBzaWdu ZWQuIFRoZWlyCitwcm9kdWN0LCB3aGljaCBpcyBvZiBhIHdpZGVyIG1vZGUsIGlzIGNvbXB1dGVk IGFuZCBhZGRlZCB0byBvcGVyYW5kIDMuCitPcGVyYW5kIDMgaXMgb2YgYSBtb2RlIGVxdWFsIG9y IHdpZGVyIHRoYW4gdGhlIG1vZGUgb2YgdGhlIHByb2R1Y3QuIFRoZQorcmVzdWx0IGlzIHBsYWNl ZCBpbiBvcGVyYW5kIDAsIHdoaWNoIGlzIG9mIHRoZSBzYW1lIG1vZGUgYXMgb3BlcmFuZCAzLgor CitTZW1hbnRpY2FsbHkgdGhlIGV4cHJlc3Npb25zIHBlcmZvcm0gdGhlIG11bHRpcGxpY2F0aW9u IGluIHRoZSBmb2xsb3dpbmcgc2lnbnMKKworQHNtYWxsZXhhbXBsZQordXNkb3Q8dW5zaWduZWQg YywgdW5zaWduZWQgYSwgc2lnbmVkIGI+ID09CisgICByZXMgPSAoKHVuc2lnbmVkLWNvbnYpIHNp Z24tZXh0IChhKSkgKiB6ZXJvLWV4dCAoYikgKyBjCitAZG90c3t9CitAZW5kIHNtYWxsZXhhbXBs ZQogCiBAY2luZGV4IEBjb2Rle3NzYWRAdmFye219fSBpbnN0cnVjdGlvbiBwYXR0ZXJuCiBAaXRl bSBAc2FtcHtzc2FkQHZhcnttfX0KZGlmZiAtLWdpdCBhL2djYy9vcHRhYnMtdHJlZS5oIGIvZ2Nj L29wdGFicy10cmVlLmgKaW5kZXggYzNhYWExYTQxNjk5MWU4NTZkM2UyNGRhNDU5NjhhOTJlYmFk YTgyYy4uZmJkMmIwNmI4ZGJmZDU2MGRmYjY2YjMxNDgzMGU2YjU2NGIzN2FiYiAxMDA2NDQKLS0t IGEvZ2NjL29wdGFicy10cmVlLmgKKysrIGIvZ2NjL29wdGFicy10cmVlLmgKQEAgLTI5LDcgKzI5 LDggQEAgZW51bSBvcHRhYl9zdWJ0eXBlCiB7CiAgIG9wdGFiX2RlZmF1bHQsCiAgIG9wdGFiX3Nj YWxhciwKLSAgb3B0YWJfdmVjdG9yCisgIG9wdGFiX3ZlY3RvciwKKyAgb3B0YWJfdmVjdG9yX21p eGVkX3NpZ24KIH07CiAKIC8qIFJldHVybiB0aGUgb3B0YWIgdXNlZCBmb3IgY29tcHV0aW5nIHRo ZSBnaXZlbiBvcGVyYXRpb24gb24gdGhlIHR5cGUgZ2l2ZW4gYnkKZGlmZiAtLWdpdCBhL2djYy9v cHRhYnMtdHJlZS5jIGIvZ2NjL29wdGFicy10cmVlLmMKaW5kZXggOTVmZmUzOTdjMjNlODBjMTA1 YWZlYTUyZTlkNDcyMTZiZjUyZjU1YS4uZWViNWFlZWQzMjAyY2M2OTcxYjY0NDc5OTRiYzUzMTFl OWMwMTBiYiAxMDA2NDQKLS0tIGEvZ2NjL29wdGFicy10cmVlLmMKKysrIGIvZ2NjL29wdGFicy10 cmVlLmMKQEAgLTEyNyw3ICsxMjcsMTIgQEAgb3B0YWJfZm9yX3RyZWVfY29kZSAoZW51bSB0cmVl X2NvZGUgY29kZSwgY29uc3RfdHJlZSB0eXBlLAogICAgICAgcmV0dXJuIFRZUEVfVU5TSUdORUQg KHR5cGUpID8gdXN1bV93aWRlbl9vcHRhYiA6IHNzdW1fd2lkZW5fb3B0YWI7CiAKICAgICBjYXNl IERPVF9QUk9EX0VYUFI6Ci0gICAgICByZXR1cm4gVFlQRV9VTlNJR05FRCAodHlwZSkgPyB1ZG90 X3Byb2Rfb3B0YWIgOiBzZG90X3Byb2Rfb3B0YWI7CisgICAgICB7CisJaWYgKHN1YnR5cGUgPT0g b3B0YWJfdmVjdG9yX21peGVkX3NpZ24pCisJICByZXR1cm4gdXNkb3RfcHJvZF9vcHRhYjsKKwor CXJldHVybiAoVFlQRV9VTlNJR05FRCAodHlwZSkgPyB1ZG90X3Byb2Rfb3B0YWIgOiBzZG90X3By b2Rfb3B0YWIpOworICAgICAgfQogCiAgICAgY2FzZSBTQURfRVhQUjoKICAgICAgIHJldHVybiBU WVBFX1VOU0lHTkVEICh0eXBlKSA/IHVzYWRfb3B0YWIgOiBzc2FkX29wdGFiOwpkaWZmIC0tZ2l0 IGEvZ2NjL29wdGFicy5jIGIvZ2NjL29wdGFicy5jCmluZGV4IDYyYTZiZGI0YzU5YmY4MjYzYzQ5 OTI0NTc5NTU3NjE5OTYwNmQzNzIuLjE0ZDhhZDJmMzNmZDc1Mzg4NDM1ZmU5MTIzODBlMTc3Zjhm M2M1NGIgMTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMuYworKysgYi9nY2Mvb3B0YWJzLmMKQEAgLTI2 Miw2ICsyNjIsMTEgQEAgZXhwYW5kX3dpZGVuX3BhdHRlcm5fZXhwciAoc2Vwb3BzIG9wcywgcnR4 IG9wMCwgcnR4IG9wMSwgcnR4IHdpZGVfb3AsCiAgIGJvb2wgc2Jvb2wgPSBmYWxzZTsKIAogICBv cHJuZDAgPSBvcHMtPm9wMDsKKyAgaWYgKG5vcHMgPj0gMikKKyAgICBvcHJuZDEgPSBvcHMtPm9w MTsKKyAgaWYgKG5vcHMgPj0gMykKKyAgICBvcHJuZDIgPSBvcHMtPm9wMjsKKwogICB0bW9kZTAg PSBUWVBFX01PREUgKFRSRUVfVFlQRSAob3BybmQwKSk7CiAgIGlmIChvcHMtPmNvZGUgPT0gVkVD X1VOUEFDS19GSVhfVFJVTkNfSElfRVhQUgogICAgICAgfHwgb3BzLT5jb2RlID09IFZFQ19VTlBB Q0tfRklYX1RSVU5DX0xPX0VYUFIpCkBAIC0yODUsNiArMjkwLDI3IEBAIGV4cGFuZF93aWRlbl9w YXR0ZXJuX2V4cHIgKHNlcG9wcyBvcHMsIHJ0eCBvcDAsIHJ0eCBvcDEsIHJ0eCB3aWRlX29wLAog CSAgID8gdmVjX3VucGFja3Nfc2Jvb2xfaGlfb3B0YWIgOiB2ZWNfdW5wYWNrc19zYm9vbF9sb19v cHRhYik7CiAgICAgICBzYm9vbCA9IHRydWU7CiAgICAgfQorICBlbHNlIGlmIChvcHMtPmNvZGUg PT0gRE9UX1BST0RfRVhQUikKKyAgICB7CisgICAgICBlbnVtIG9wdGFiX3N1YnR5cGUgc3VidHlw ZSA9IG9wdGFiX2RlZmF1bHQ7CisgICAgICBzaWdub3Agc2lnbjEgPSBUWVBFX1NJR04gKFRSRUVf VFlQRSAob3BybmQwKSk7CisgICAgICBzaWdub3Agc2lnbjIgPSBUWVBFX1NJR04gKFRSRUVfVFlQ RSAob3BybmQxKSk7CisgICAgICBpZiAoc2lnbjEgPT0gc2lnbjIpCisJOworICAgICAgZWxzZSBp ZiAoc2lnbjEgPT0gU0lHTkVEICYmIHNpZ24yID09IFVOU0lHTkVEKQorCXsKKwkgIHN1YnR5cGUg PSBvcHRhYl92ZWN0b3JfbWl4ZWRfc2lnbjsKKwkgIC8qIFNhbWUgYXMgb3B0YWJfdmVjdG9yX21p eGVkX3NpZ24gYnV0IGZsaXAgdGhlIG9wZXJhbmRzLiAgKi8KKwkgIHN0ZDo6c3dhcCAob3AwLCBv cDEpOworCX0KKyAgICAgIGVsc2UgaWYgKHNpZ24xID09IFVOU0lHTkVEICYmIHNpZ24yID09IFNJ R05FRCkKKwlzdWJ0eXBlID0gb3B0YWJfdmVjdG9yX21peGVkX3NpZ247CisgICAgICBlbHNlCisJ Z2NjX3VucmVhY2hhYmxlICgpOworCisgICAgICB3aWRlbl9wYXR0ZXJuX29wdGFiCisJPSBvcHRh Yl9mb3JfdHJlZV9jb2RlIChvcHMtPmNvZGUsIFRSRUVfVFlQRSAob3BybmQwKSwgc3VidHlwZSk7 CisgICAgfQogICBlbHNlCiAgICAgd2lkZW5fcGF0dGVybl9vcHRhYgogICAgICAgPSBvcHRhYl9m b3JfdHJlZV9jb2RlIChvcHMtPmNvZGUsIFRSRUVfVFlQRSAob3BybmQwKSwgb3B0YWJfZGVmYXVs dCk7CkBAIC0yOTgsMTAgKzMyNCw3IEBAIGV4cGFuZF93aWRlbl9wYXR0ZXJuX2V4cHIgKHNlcG9w cyBvcHMsIHJ0eCBvcDAsIHJ0eCBvcDEsIHJ0eCB3aWRlX29wLAogICBnY2NfYXNzZXJ0IChpY29k ZSAhPSBDT0RFX0ZPUl9ub3RoaW5nKTsKIAogICBpZiAobm9wcyA+PSAyKQotICAgIHsKLSAgICAg IG9wcm5kMSA9IG9wcy0+b3AxOwotICAgICAgdG1vZGUxID0gVFlQRV9NT0RFIChUUkVFX1RZUEUg KG9wcm5kMSkpOwotICAgIH0KKyAgICB0bW9kZTEgPSBUWVBFX01PREUgKFRSRUVfVFlQRSAob3By bmQxKSk7CiAgIGVsc2UgaWYgKHNib29sKQogICAgIHsKICAgICAgIG5vcHMgPSAyOwpAQCAtMzE2 LDcgKzMzOSw2IEBAIGV4cGFuZF93aWRlbl9wYXR0ZXJuX2V4cHIgKHNlcG9wcyBvcHMsIHJ0eCBv cDAsIHJ0eCBvcDEsIHJ0eCB3aWRlX29wLAogICAgIHsKICAgICAgIGdjY19hc3NlcnQgKHRtb2Rl MSA9PSB0bW9kZTApOwogICAgICAgZ2NjX2Fzc2VydCAob3AxKTsKLSAgICAgIG9wcm5kMiA9IG9w cy0+b3AyOwogICAgICAgd21vZGUgPSBUWVBFX01PREUgKFRSRUVfVFlQRSAob3BybmQyKSk7CiAg ICAgfQogCmRpZmYgLS1naXQgYS9nY2Mvb3B0YWJzLmRlZiBiL2djYy9vcHRhYnMuZGVmCmluZGV4 IDQxYWIyNTk4ZWI2YzMyYzAwM2NiZWQ0OTA3OTZhYmYyNWQyZWUzMTUuLjU3NGQzNTViNmIzMDky Y2Y4OTNmNWFiMGU4YWUwZjZkOWZmY2VmYmQgMTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMuZGVmCisr KyBiL2djYy9vcHRhYnMuZGVmCkBAIC0zNTIsNiArMzUyLDcgQEAgT1BUQUJfRCAodWF2Z19jZWls X29wdGFiLCAidWF2ZyRhM19jZWlsIikKIE9QVEFCX0QgKHNkb3RfcHJvZF9vcHRhYiwgInNkb3Rf cHJvZCRJJGEiKQogT1BUQUJfRCAoc3N1bV93aWRlbl9vcHRhYiwgIndpZGVuX3NzdW0kSSRhMyIp CiBPUFRBQl9EICh1ZG90X3Byb2Rfb3B0YWIsICJ1ZG90X3Byb2QkSSRhIikKK09QVEFCX0QgKHVz ZG90X3Byb2Rfb3B0YWIsICJ1c2RvdF9wcm9kJEkkYSIpCiBPUFRBQl9EICh1c3VtX3dpZGVuX29w dGFiLCAid2lkZW5fdXN1bSRJJGEzIikKIE9QVEFCX0QgKHVzYWRfb3B0YWIsICJ1c2FkJEkkYSIp CiBPUFRBQl9EIChzc2FkX29wdGFiLCAic3NhZCRJJGEiKQpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUt Y2ZnLmMgYi9nY2MvdHJlZS1jZmcuYwppbmRleCBjNzNlMWNiZGRhNmI5MzgwMTkwYjAzZGU2NmNh ZWU0OGM0ZTE3M2UzLi4zNzUwZDI4ODFjYmI3ZmQxZTcxYzBlYjhjMGQ0OTI5OTI1ZmQ0MTUyIDEw MDY0NAotLS0gYS9nY2MvdHJlZS1jZmcuYworKysgYi9nY2MvdHJlZS1jZmcuYwpAQCAtNDQzNCw3 ICs0NDM0LDggQEAgdmVyaWZ5X2dpbXBsZV9hc3NpZ25fdGVybmFyeSAoZ2Fzc2lnbiAqc3RtdCkK IAkJICAmJiAhU0NBTEFSX0ZMT0FUX1RZUEVfUCAocmhzMV90eXBlKSkKIAkJIHx8ICghSU5URUdS QUxfVFlQRV9QIChsaHNfdHlwZSkKIAkJICAgICAmJiAhU0NBTEFSX0ZMT0FUX1RZUEVfUCAobGhz X3R5cGUpKSkpCi0JICAgIHx8ICF0eXBlc19jb21wYXRpYmxlX3AgKHJoczFfdHlwZSwgcmhzMl90 eXBlKQorCSAgICAvKiByaHMxX3R5cGUgYW5kIHJoczJfdHlwZSBtYXkgZGlmZmVyIGluIHNpZ24u ICAqLworCSAgICB8fCAhdHJlZV9ub3BfY29udmVyc2lvbl9wIChyaHMxX3R5cGUsIHJoczJfdHlw ZSkKIAkgICAgfHwgIXVzZWxlc3NfdHlwZV9jb252ZXJzaW9uX3AgKGxoc190eXBlLCByaHMzX3R5 cGUpCiAJICAgIHx8IG1heWJlX2x0IChHRVRfTU9ERV9TSVpFIChlbGVtZW50X21vZGUgKHJoczNf dHlwZSkpLAogCQkJIDIgKiBHRVRfTU9ERV9TSVpFIChlbGVtZW50X21vZGUgKHJoczFfdHlwZSkp KSkKZGlmZiAtLWdpdCBhL2djYy90cmVlLXZlY3QtbG9vcC5jIGIvZ2NjL3RyZWUtdmVjdC1sb29w LmMKaW5kZXggNTFhNDZhNmQ4NTJmYjM0MjI3OGJiOTUxM2QwMTM3MDJjZmY0Yjg2OC4uNGU2M2U4 NGNjNzBjYTYwYzcwNmMxOTM2N2NjZjI1NmVhM2Y4NTFiNSAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUt dmVjdC1sb29wLmMKKysrIGIvZ2NjL3RyZWUtdmVjdC1sb29wLmMKQEAgLTY2NjMsNiArNjY2Mywx MiBAQCB2ZWN0b3JpemFibGVfcmVkdWN0aW9uIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8sCiAg IGJvb2wgbGFuZV9yZWR1Y19jb2RlX3AKICAgICA9IChjb2RlID09IERPVF9QUk9EX0VYUFIgfHwg Y29kZSA9PSBXSURFTl9TVU1fRVhQUiB8fCBjb2RlID09IFNBRF9FWFBSKTsKICAgaW50IG9wX3R5 cGUgPSBUUkVFX0NPREVfTEVOR1RIIChjb2RlKTsKKyAgZW51bSBvcHRhYl9zdWJ0eXBlIG9wdGFi X3F1ZXJ5X2tpbmQgPSBvcHRhYl92ZWN0b3I7CisgIGlmIChjb2RlID09IERPVF9QUk9EX0VYUFIK KyAgICAgICYmIFRZUEVfU0lHTiAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQp KSkKKwkgICAhPSBUWVBFX1NJR04gKFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9yaHMyIChzdG10 KSkpKQorICAgIG9wdGFiX3F1ZXJ5X2tpbmQgPSBvcHRhYl92ZWN0b3JfbWl4ZWRfc2lnbjsKKwog CiAgIHNjYWxhcl9kZXN0ID0gZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpOwogICBzY2FsYXJfdHlw ZSA9IFRSRUVfVFlQRSAoc2NhbGFyX2Rlc3QpOwpAQCAtNzE5MCw3ICs3MTk2LDcgQEAgdmVjdG9y aXphYmxlX3JlZHVjdGlvbiAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvLAogICAgICAgYm9vbCBv ayA9IHRydWU7CiAKICAgICAgIC8qIDQuMS4gY2hlY2sgc3VwcG9ydCBmb3IgdGhlIG9wZXJhdGlv biBpbiB0aGUgbG9vcCAgKi8KLSAgICAgIG9wdGFiIG9wdGFiID0gb3B0YWJfZm9yX3RyZWVfY29k ZSAoY29kZSwgdmVjdHlwZV9pbiwgb3B0YWJfdmVjdG9yKTsKKyAgICAgIG9wdGFiIG9wdGFiID0g b3B0YWJfZm9yX3RyZWVfY29kZSAoY29kZSwgdmVjdHlwZV9pbiwgb3B0YWJfcXVlcnlfa2luZCk7 CiAgICAgICBpZiAoIW9wdGFiKQogCXsKIAkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKZGlmZiAt LWdpdCBhL2djYy90cmVlLXZlY3QtcGF0dGVybnMuYyBiL2djYy90cmVlLXZlY3QtcGF0dGVybnMu YwppbmRleCBkNzFjOGM2MTgwYzg3MTE2ODc0NzEwNjBlNmM5Mzc1NjFkZmU1Y2FmLi4xM2I0MzVj OTZmZmRkMGU3YThhZGYwYzhlNjM1MjNhZmI2OWJkMmRjIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12 ZWN0LXBhdHRlcm5zLmMKKysrIGIvZ2NjL3RyZWUtdmVjdC1wYXR0ZXJucy5jCkBAIC0xOTEsOSAr MTkxLDkgQEAgdmVjdF9nZXRfZXh0ZXJuYWxfZGVmX2VkZ2UgKHZlY19pbmZvICp2aW5mbywgdHJl ZSB2YXIpCiB9CiAKIC8qIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgYSB2ZWN0 b3IgdmVyc2lvbiBvZiBDT0RFLAotICAgd2hlcmUgQ09ERSBpcyBrbm93biB0byBtYXAgdG8gYSBk aXJlY3Qgb3B0YWIuICBJVFlQRSBzcGVjaWZpZXMKLSAgIHRoZSB0eXBlIG9mIChzb21lIG9mKSB0 aGUgc2NhbGFyIGlucHV0cyBhbmQgT1RZUEUgc3BlY2lmaWVzIHRoZQotICAgdHlwZSBvZiB0aGUg c2NhbGFyIHJlc3VsdC4KKyAgIHdoZXJlIENPREUgaXMga25vd24gdG8gbWFwIHRvIGEgZGlyZWN0 IG9wdGFiIHdpdGggdGhlIGdpdmVuIFNVQlRZUEUuCisgICBJVFlQRSBzcGVjaWZpZXMgdGhlIHR5 cGUgb2YgKHNvbWUgb2YpIHRoZSBzY2FsYXIgaW5wdXRzIGFuZCBPVFlQRQorICAgc3BlY2lmaWVz IHRoZSB0eXBlIG9mIHRoZSBzY2FsYXIgcmVzdWx0LgogCiAgICBJZiBDT0RFIGFsbG93cyB0aGUg aW5wdXRzIGFuZCBvdXRwdXRzIHRvIGhhdmUgZGlmZmVyZW50IHR5cGUKICAgIChzdWNoIGFzIGZv ciBXSURFTl9TVU1fRVhQUiksIGl0IGlzIHRoZSBpbnB1dCBtb2RlIHJhdGhlcgpAQCAtMjA4LDcg KzIwOCw4IEBAIHZlY3RfZ2V0X2V4dGVybmFsX2RlZl9lZGdlICh2ZWNfaW5mbyAqdmluZm8sIHRy ZWUgdmFyKQogc3RhdGljIGJvb2wKIHZlY3Rfc3VwcG9ydGFibGVfZGlyZWN0X29wdGFiX3AgKHZl Y19pbmZvICp2aW5mbywgdHJlZSBvdHlwZSwgdHJlZV9jb2RlIGNvZGUsCiAJCQkJIHRyZWUgaXR5 cGUsIHRyZWUgKnZlY290eXBlX291dCwKLQkJCQkgdHJlZSAqdmVjaXR5cGVfb3V0ID0gTlVMTCkK KwkJCQkgdHJlZSAqdmVjaXR5cGVfb3V0ID0gTlVMTCwKKwkJCQkgZW51bSBvcHRhYl9zdWJ0eXBl IHN1YnR5cGUgPSBvcHRhYl9kZWZhdWx0KQogewogICB0cmVlIHZlY2l0eXBlID0gZ2V0X3ZlY3R5 cGVfZm9yX3NjYWxhcl90eXBlICh2aW5mbywgaXR5cGUpOwogICBpZiAoIXZlY2l0eXBlKQpAQCAt MjE4LDcgKzIxOSw3IEBAIHZlY3Rfc3VwcG9ydGFibGVfZGlyZWN0X29wdGFiX3AgKHZlY19pbmZv ICp2aW5mbywgdHJlZSBvdHlwZSwgdHJlZV9jb2RlIGNvZGUsCiAgIGlmICghdmVjb3R5cGUpCiAg ICAgcmV0dXJuIGZhbHNlOwogCi0gIG9wdGFiIG9wdGFiID0gb3B0YWJfZm9yX3RyZWVfY29kZSAo Y29kZSwgdmVjaXR5cGUsIG9wdGFiX2RlZmF1bHQpOworICBvcHRhYiBvcHRhYiA9IG9wdGFiX2Zv cl90cmVlX2NvZGUgKGNvZGUsIHZlY2l0eXBlLCBzdWJ0eXBlKTsKICAgaWYgKCFvcHRhYikKICAg ICByZXR1cm4gZmFsc2U7CiAKQEAgLTUyMSw2ICs1MjIsNyBAQCB2ZWN0X2pvdXN0X3dpZGVuZWRf dHlwZSAodHJlZSB0eXBlLCB0cmVlIG5ld190eXBlLCB0cmVlICpjb21tb25fdHlwZSkKICAgdW5z aWduZWQgaW50IHByZWNpc2lvbiA9IE1BWCAoVFlQRV9QUkVDSVNJT04gKCpjb21tb25fdHlwZSks CiAJCQkJVFlQRV9QUkVDSVNJT04gKG5ld190eXBlKSk7CiAgIHByZWNpc2lvbiAqPSAyOworCiAg IGlmIChwcmVjaXNpb24gKiAyID4gVFlQRV9QUkVDSVNJT04gKHR5cGUpKQogICAgIHJldHVybiBm YWxzZTsKIApAQCAtNTM5LDYgKzU0MSwxMCBAQCB2ZWN0X2pvdXN0X3dpZGVuZWRfdHlwZSAodHJl ZSB0eXBlLCB0cmVlIG5ld190eXBlLCB0cmVlICpjb21tb25fdHlwZSkKICAgIHRvIGEgdHlwZSB0 aGF0IChhKSBpcyBuYXJyb3dlciB0aGFuIHRoZSByZXN1bHQgb2YgU1RNVF9JTkZPIGFuZAogICAg KGIpIGNhbiBob2xkIGFsbCBsZWFmIG9wZXJhbmQgdmFsdWVzLgogCisgICBJZiBTVUJUWVBFIHRo ZW4gYWxsb3cgdGhhdCB0aGUgc2lnbnMgb2YgdGhlIG9wZXJhbmRzCisgICBtYXkgZGlmZmVyIGlu IHNpZ25zIGJ1dCBub3QgaW4gcHJlY2lzaW9uLiAgU1VCVFlQRSBpcyB1cGRhdGVkIHRvIHJlZmxl Y3QKKyAgIHRoaXMuCisKICAgIFJldHVybiAwIGlmIFNUTVRfSU5GTyBpc24ndCBzdWNoIGEgdHJl ZSwgb3IgaWYgbm8gc3VjaCBDT01NT05fVFlQRQogICAgZXhpc3RzLiAgKi8KIApAQCAtNTQ2LDcg KzU1Miw4IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHZlY3Rfd2lkZW5lZF9vcF90cmVlICh2ZWNf aW5mbyAqdmluZm8sIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvLCB0cmVlX2NvZGUgY29kZSwKIAkJ ICAgICAgdHJlZV9jb2RlIHdpZGVuZWRfY29kZSwgYm9vbCBzaGlmdF9wLAogCQkgICAgICB1bnNp Z25lZCBpbnQgbWF4X25vcHMsCi0JCSAgICAgIHZlY3RfdW5wcm9tb3RlZF92YWx1ZSAqdW5wcm9t LCB0cmVlICpjb21tb25fdHlwZSkKKwkJICAgICAgdmVjdF91bnByb21vdGVkX3ZhbHVlICp1bnBy b20sIHRyZWUgKmNvbW1vbl90eXBlLAorCQkgICAgICBlbnVtIG9wdGFiX3N1YnR5cGUgKnN1YnR5 cGUgPSBOVUxMKQogewogICAvKiBDaGVjayBmb3IgYW4gaW50ZWdlciBvcGVyYXRpb24gd2l0aCB0 aGUgcmlnaHQgY29kZS4gICovCiAgIGdhc3NpZ24gKmFzc2lnbiA9IGR5bl9jYXN0IDxnYXNzaWdu ICo+IChzdG10X2luZm8tPnN0bXQpOwpAQCAtNjA3LDcgKzYxNCw4IEBAIHZlY3Rfd2lkZW5lZF9v cF90cmVlICh2ZWNfaW5mbyAqdmluZm8sIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvLCB0cmVlX2Nv ZGUgY29kZSwKIAkJPSB2aW5mby0+bG9va3VwX2RlZiAodGhpc191bnByb20tPm9wKTsKIAkgICAg ICBub3BzID0gdmVjdF93aWRlbmVkX29wX3RyZWUgKHZpbmZvLCBkZWZfc3RtdF9pbmZvLCBjb2Rl LAogCQkJCQkgICB3aWRlbmVkX2NvZGUsIHNoaWZ0X3AsIG1heF9ub3BzLAotCQkJCQkgICB0aGlz X3VucHJvbSwgY29tbW9uX3R5cGUpOworCQkJCQkgICB0aGlzX3VucHJvbSwgY29tbW9uX3R5cGUs CisJCQkJCSAgIHN1YnR5cGUpOwogCSAgICAgIGlmIChub3BzID09IDApCiAJCXJldHVybiAwOwog CkBAIC02MjUsNyArNjMzLDE4IEBAIHZlY3Rfd2lkZW5lZF9vcF90cmVlICh2ZWNfaW5mbyAqdmlu Zm8sIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvLCB0cmVlX2NvZGUgY29kZSwKIAkJKmNvbW1vbl90 eXBlID0gdGhpc191bnByb20tPnR5cGU7CiAJICAgICAgZWxzZSBpZiAoIXZlY3Rfam91c3Rfd2lk ZW5lZF90eXBlICh0eXBlLCB0aGlzX3VucHJvbS0+dHlwZSwKIAkJCQkJCSBjb21tb25fdHlwZSkp Ci0JCXJldHVybiAwOworCQl7CisJCSAgaWYgKHN1YnR5cGUpCisJCSAgICB7CisJCSAgICAgIC8q IFNlZSBpZiB3ZSBjYW4gc2lnbiBleHRlbmQgdGhlIHNtYWxsZXIgdHlwZS4gICovCisJCSAgICAg IGlmIChUWVBFX1BSRUNJU0lPTiAodGhpc191bnByb20tPnR5cGUpCisJCQkgID4gVFlQRV9QUkVD SVNJT04gKCpjb21tb25fdHlwZSkpCisJCQkqY29tbW9uX3R5cGUgPSB0aGlzX3VucHJvbS0+dHlw ZTsKKwkJICAgICAgKnN1YnR5cGUgPSBvcHRhYl92ZWN0b3JfbWl4ZWRfc2lnbjsKKwkJICAgIH0K KwkJICBlbHNlCisJCSAgICByZXR1cm4gMDsKKwkJfQogCSAgICB9CiAJfQogICAgICAgbmV4dF9v cCArPSBub3BzOwpAQCAtNzI1LDEyICs3NDQsMjIgQEAgdmVjdF9zcGxpdF9zdGF0ZW1lbnQgKHZl Y19pbmZvICp2aW5mbywgc3RtdF92ZWNfaW5mbyBzdG10Ml9pbmZvLCB0cmVlIG5ld19yaHMsCiAK IC8qIENvbnZlcnQgVU5QUk9NIHRvIFRZUEUgYW5kIHJldHVybiB0aGUgcmVzdWx0LCBhZGRpbmcg bmV3IHN0YXRlbWVudHMKICAgIHRvIFNUTVRfSU5GTydzIHBhdHRlcm4gZGVmaW5pdGlvbiBzdGF0 ZW1lbnRzIGlmIG5vIGJldHRlciB3YXkgaXMKLSAgIGF2YWlsYWJsZS4gIFZFQ1RZUEUgaXMgdGhl IHZlY3RvciBmb3JtIG9mIFRZUEUuICAqLworICAgYXZhaWxhYmxlLiAgVkVDVFlQRSBpcyB0aGUg dmVjdG9yIGZvcm0gb2YgVFlQRS4KKworICAgSWYgU1VCVFlQRSB0aGVuIGNvbnZlcnQgdGhlIHR5 cGUgYmFzZWQgb24gdGhlIHN1YnR5cGUuICAqLwogCiBzdGF0aWMgdHJlZQogdmVjdF9jb252ZXJ0 X2lucHV0ICh2ZWNfaW5mbyAqdmluZm8sIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvLCB0cmVlIHR5 cGUsCi0JCSAgICB2ZWN0X3VucHJvbW90ZWRfdmFsdWUgKnVucHJvbSwgdHJlZSB2ZWN0eXBlKQor CQkgICAgdmVjdF91bnByb21vdGVkX3ZhbHVlICp1bnByb20sIHRyZWUgdmVjdHlwZSwKKwkJICAg IGVudW0gb3B0YWJfc3VidHlwZSBzdWJ0eXBlID0gb3B0YWJfZGVmYXVsdCkKIHsKKworICAvKiBV cGRhdGUgdGhlIHR5cGUgaWYgdGhlIHNpZ25zIGRpZmZlci4gICovCisgIGlmIChzdWJ0eXBlID09 IG9wdGFiX3ZlY3Rvcl9taXhlZF9zaWduCisgICAgICAmJiBUWVBFX1NJR04gKHR5cGUpICE9IFRZ UEVfU0lHTiAoVFJFRV9UWVBFICh1bnByb20tPm9wKSkpCisgICAgdHlwZSA9IGJ1aWxkX25vbnN0 YW5kYXJkX2ludGVnZXJfdHlwZSAoVFlQRV9QUkVDSVNJT04gKHR5cGUpLAorCQkJCQkgICBUWVBF X1NJR04gKHVucHJvbS0+dHlwZSkpOworCiAgIC8qIENoZWNrIGZvciBhIG5vLW9wIGNvbnZlcnNp b24uICAqLwogICBpZiAodHlwZXNfY29tcGF0aWJsZV9wICh0eXBlLCBUUkVFX1RZUEUgKHVucHJv bS0+b3ApKSkKICAgICByZXR1cm4gdW5wcm9tLT5vcDsKQEAgLTgwNiwxMiArODM1LDE0IEBAIHZl Y3RfY29udmVydF9pbnB1dCAodmVjX2luZm8gKnZpbmZvLCBzdG10X3ZlY19pbmZvIHN0bXRfaW5m bywgdHJlZSB0eXBlLAogfQogCiAvKiBJbnZva2UgdmVjdF9jb252ZXJ0X2lucHV0IGZvciBOIGVs ZW1lbnRzIG9mIFVOUFJPTSBhbmQgc3RvcmUgdGhlCi0gICByZXN1bHQgaW4gdGhlIGNvcnJlc3Bv bmRpbmcgZWxlbWVudHMgb2YgUkVTVUxULiAgKi8KKyAgIHJlc3VsdCBpbiB0aGUgY29ycmVzcG9u ZGluZyBlbGVtZW50cyBvZiBSRVNVTFQuCisKKyAgIElmIFNVQlRZUEUgdGhlbiBjb252ZXJ0IHRo ZSB0eXBlIGJhc2VkIG9uIHRoZSBzdWJ0eXBlLiAgKi8KIAogc3RhdGljIHZvaWQKIHZlY3RfY29u dmVydF9pbnB1dHMgKHZlY19pbmZvICp2aW5mbywgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sIHVu c2lnbmVkIGludCBuLAogCQkgICAgIHRyZWUgKnJlc3VsdCwgdHJlZSB0eXBlLCB2ZWN0X3VucHJv bW90ZWRfdmFsdWUgKnVucHJvbSwKLQkJICAgICB0cmVlIHZlY3R5cGUpCisJCSAgICAgdHJlZSB2 ZWN0eXBlLCBlbnVtIG9wdGFiX3N1YnR5cGUgc3VidHlwZSA9IG9wdGFiX2RlZmF1bHQpCiB7CiAg IGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbjsgKytpKQogICAgIHsKQEAgLTgxOSwxMSAr ODUwLDEyIEBAIHZlY3RfY29udmVydF9pbnB1dHMgKHZlY19pbmZvICp2aW5mbywgc3RtdF92ZWNf aW5mbyBzdG10X2luZm8sIHVuc2lnbmVkIGludCBuLAogICAgICAgZm9yIChqID0gMDsgaiA8IGk7 ICsraikKIAlpZiAodW5wcm9tW2pdLm9wID09IHVucHJvbVtpXS5vcCkKIAkgIGJyZWFrOworCiAg ICAgICBpZiAoaiA8IGkpCiAJcmVzdWx0W2ldID0gcmVzdWx0W2pdOwogICAgICAgZWxzZQogCXJl c3VsdFtpXSA9IHZlY3RfY29udmVydF9pbnB1dCAodmluZm8sIHN0bXRfaW5mbywKLQkJCQkJdHlw ZSwgJnVucHJvbVtpXSwgdmVjdHlwZSk7CisJCQkJCXR5cGUsICZ1bnByb21baV0sIHZlY3R5cGUs IHN1YnR5cGUpOwogICAgIH0KIH0KIApAQCAtODk1LDcgKzkyNyw4IEBAIHZlY3RfcmVhc3NvY2lh dGluZ19yZWR1Y3Rpb25fcCAodmVjX2luZm8gKnZpbmZvLAogCiAgICBUcnkgdG8gZmluZCB0aGUg Zm9sbG93aW5nIHBhdHRlcm46CiAKLSAgICAgdHlwZSB4X3QsIHlfdDsKKyAgICAgdHlwZTFhIHhf dAorICAgICB0eXBlMWIgeV90OwogICAgICBUWVBFMSBwcm9kOwogICAgICBUWVBFMiBzdW0gPSBp bml0OwogICAgbG9vcDoKQEAgLTkwOCw5ICs5NDEsOSBAQCB2ZWN0X3JlYXNzb2NpYXRpbmdfcmVk dWN0aW9uX3AgKHZlY19pbmZvICp2aW5mbywKICAgICAgW1M2ICBwcm9kID0gKFRZUEUyKSBwcm9k OyAgI29wdGlvbmFsXQogICAgICBTNyAgc3VtXzEgPSBwcm9kICsgc3VtXzA7CiAKLSAgIHdoZXJl ICdUWVBFMScgaXMgZXhhY3RseSBkb3VibGUgdGhlIHNpemUgb2YgdHlwZSAndHlwZScsIGFuZCAn VFlQRTInIGlzIHRoZQotICAgc2FtZSBzaXplIG9mICdUWVBFMScgb3IgYmlnZ2VyLiBUaGlzIGlz IGEgc3BlY2lhbCBjYXNlIG9mIGEgcmVkdWN0aW9uCi0gICBjb21wdXRhdGlvbi4KKyAgIHdoZXJl ICdUWVBFMScgaXMgZXhhY3RseSBkb3VibGUgdGhlIHNpemUgb2YgdHlwZSAndHlwZTFhJyBhbmQg J3R5cGUxYicsCisgICB0aGUgc2lnbiBvZiAnVFlQRTEnIG11c3QgYmUgb25lIG9mICd0eXBlMWEn IG9yICd0eXBlMWInIGJ1dCB0aGUgc2lnbiBvZgorICAgJ3R5cGUxYScgYW5kICd0eXBlMWInIGNh biBkaWZmZXIuCiAKICAgIElucHV0OgogCkBAIC05NTQsNyArOTg3LDcgQEAgdmVjdF9yZWNvZ19k b3RfcHJvZF9wYXR0ZXJuICh2ZWNfaW5mbyAqdmluZm8sCiAgICAgIC0gRFggaXMgZG91YmxlIHRo ZSBzaXplIG9mIFgKICAgICAgLSBEWSBpcyBkb3VibGUgdGhlIHNpemUgb2YgWQogICAgICAtIERY LCBEWSwgRFBST0QgYWxsIGhhdmUgdGhlIHNhbWUgdHlwZSBidXQgdGhlIHNpZ24KLSAgICAgICBi ZXR3ZWVuIERYLCBEWSBhbmQgRFBST0QgY2FuIGRpZmZlci4KKyAgICAgICBiZXR3ZWVuIFgsIFkg YW5kIERQUk9EIGNhbiBkaWZmZXIuCiAgICAgIC0gc3VtIGlzIHRoZSBzYW1lIHNpemUgb2YgRFBS T0Qgb3IgYmlnZ2VyCiAgICAgIC0gc3VtIGhhcyBiZWVuIHJlY29nbml6ZWQgYXMgYSByZWR1Y3Rp b24gdmFyaWFibGUuCiAKQEAgLTk5MiwyMSArMTAyNSwzMCBAQCB2ZWN0X3JlY29nX2RvdF9wcm9k X3BhdHRlcm4gKHZlY19pbmZvICp2aW5mbywKICAgLyogRk9STk9XLiAgQ2FuIGNvbnRpbnVlIGFu YWx5emluZyB0aGUgZGVmLXVzZSBjaGFpbiB3aGVuIHRoaXMgc3RtdCBpbiBhIHBoaQogICAgICBp bnNpZGUgdGhlIGxvb3AgKGluIGNhc2Ugd2UgYXJlIGFuYWx5emluZyBhbiBvdXRlci1sb29wKS4g ICovCiAgIHZlY3RfdW5wcm9tb3RlZF92YWx1ZSB1bnByb20wWzJdOworICBlbnVtIG9wdGFiX3N1 YnR5cGUgc3VidHlwZSA9IG9wdGFiX3ZlY3RvcjsKICAgaWYgKCF2ZWN0X3dpZGVuZWRfb3BfdHJl ZSAodmluZm8sIG11bHRfdmluZm8sIE1VTFRfRVhQUiwgV0lERU5fTVVMVF9FWFBSLAotCQkJICAg ICBmYWxzZSwgMiwgdW5wcm9tMCwgJmhhbGZfdHlwZSkpCisJCQkgICAgIGZhbHNlLCAyLCB1bnBy b20wLCAmaGFsZl90eXBlLCAmc3VidHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogSWYg dGhlcmUgYXJlIHR3byB3aWRlbmluZyBvcGVyYXRpb25zLCBtYWtlIHN1cmUgdGhleSBhZ3JlZSBv biB0aGUgc2lnbgorICAgICBvZiB0aGUgZXh0ZW5zaW9uLiAgVGhlIHJlc3VsdCBvZiBhbiBvcHRh Yl92ZWN0b3JfbWl4ZWRfc2lnbiBvcGVyYXRpb24KKyAgICAgaXMgc2lnbmVkLiAgKi8KKyAgaWYg KHN1YnR5cGUgPT0gb3B0YWJfdmVjdG9yX21peGVkX3NpZ24KKyAgICAgICYmIFRZUEVfVU5TSUdO RUQgKHVucHJvbV9tdWx0LnR5cGUpCisgICAgICAmJiBUWVBFX1BSRUNJU0lPTiAodW5wcm9tX211 bHQudHlwZSkgPCBUWVBFX1BSRUNJU0lPTiAodHlwZSkpCiAgICAgcmV0dXJuIE5VTEw7CiAKICAg dmVjdF9wYXR0ZXJuX2RldGVjdGVkICgidmVjdF9yZWNvZ19kb3RfcHJvZF9wYXR0ZXJuIiwgbGFz dF9zdG10KTsKIAogICB0cmVlIGhhbGZfdmVjdHlwZTsKICAgaWYgKCF2ZWN0X3N1cHBvcnRhYmxl X2RpcmVjdF9vcHRhYl9wICh2aW5mbywgdHlwZSwgRE9UX1BST0RfRVhQUiwgaGFsZl90eXBlLAot CQkJCQl0eXBlX291dCwgJmhhbGZfdmVjdHlwZSkpCisJCQkJCXR5cGVfb3V0LCAmaGFsZl92ZWN0 eXBlLCBzdWJ0eXBlKSkKICAgICByZXR1cm4gTlVMTDsKIAogICAvKiBHZXQgdGhlIGlucHV0cyBp biB0aGUgYXBwcm9wcmlhdGUgdHlwZXMuICAqLwogICB0cmVlIG11bHRfb3BybmRbMl07CiAgIHZl Y3RfY29udmVydF9pbnB1dHMgKHZpbmZvLCBzdG10X3ZpbmZvLCAyLCBtdWx0X29wcm5kLCBoYWxm X3R5cGUsCi0JCSAgICAgICB1bnByb20wLCBoYWxmX3ZlY3R5cGUpOworCQkgICAgICAgdW5wcm9t MCwgaGFsZl92ZWN0eXBlLCBzdWJ0eXBlKTsKIAogICB2YXIgPSB2ZWN0X3JlY29nX3RlbXBfc3Nh X3ZhciAodHlwZSwgTlVMTCk7CiAgIHBhdHRlcm5fc3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24g KHZhciwgRE9UX1BST0RfRVhQUiwK --_002_VI1PR08MB53255B22281D39CB0244E44FFF159VI1PR08MB5325eurp_--