From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-VI1-obe.outbound.protection.outlook.com (mail-vi1eur02on2044.outbound.protection.outlook.com [40.107.241.44]) by sourceware.org (Postfix) with ESMTPS id 455D2385773C for ; Tue, 9 May 2023 16:00:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 455D2385773C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=g9Rg8H7d0wcV2yGtJulRAd9f5CnqDgBN4k/dlLkz9xk=; b=nOT8kqe+X5h+UErceg6ySn2qeynFByxZcULbj6evh9/WHBO2UXyZ81edG0otS10TqO1t6Cp3hqLD9wDrD/PZTElGSKvT76gBmC3tXSI+aUdYJAA09Bgz3nT/xUZmES5k6Nr5TqdqdZ1LwuLGQBYtW6ROXadIHtzJOolHFqIFYZU= Received: from AS9PR06CA0330.eurprd06.prod.outlook.com (2603:10a6:20b:45b::9) by AM0PR08MB5380.eurprd08.prod.outlook.com (2603:10a6:208:183::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.33; Tue, 9 May 2023 16:00:17 +0000 Received: from AM7EUR03FT030.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:45b:cafe::78) by AS9PR06CA0330.outlook.office365.com (2603:10a6:20b:45b::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.33 via Frontend Transport; Tue, 9 May 2023 16:00:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM7EUR03FT030.mail.protection.outlook.com (100.127.140.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6387.18 via Frontend Transport; Tue, 9 May 2023 16:00:17 +0000 Received: ("Tessian outbound 3a01b65b5aad:v136"); Tue, 09 May 2023 16:00:17 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 7381dafd30d993d5 X-CR-MTA-TID: 64aa7808 Received: from 6918a7bbf4f0.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id FB58AA4F-0633-4626-BE8A-0EC4D1DB795D.1; Tue, 09 May 2023 16:00:10 +0000 Received: from EUR03-AM7-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 6918a7bbf4f0.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 09 May 2023 16:00:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mYOoK0ecZuANDu1Tg3zeFlWo721ZcHgD0VYynOtHgeysGQatgjWcKw0iDo5F9hUT04KFQM/liM3LsdamebxC32/EYFTMlSr3xJcTyczWLxgUQS5acrt3BZdVr7EwDb7nLT+OpnH3lBBCSua0nE0xUn2TMcHBflPlgebqtbvvQn+wXHeELfGKZ2qUcnjgxBZcleyF6eRdqxZ9q759EaIBOYfzJpkapKy7PRSR7Bq7cYzBfN7iVBc4IKyM8NOgLd5McUwSab+KawWVzLgby4pvvoYKWj6N9fP/dwxUr13HZVHn8wcROR08dhZ32/4sQyODRJ77Pi49sPq+x9sDbSslkg== 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=g9Rg8H7d0wcV2yGtJulRAd9f5CnqDgBN4k/dlLkz9xk=; b=KM9Fe9UXuHjN+XFYQZUp2Tk112hNrbBJELrttB5vbU1Orgxc3oqTUmIhwfCj9nP3zPJFu2CU0X9dp+eIIWHPYhAUcYNnd9rlxPWiN7VVTa0UgJpY1jnWfqepDLI0WtXxiAz3vsoQjgsnC5cBm8HROY+8zw/PQpfuKsRIpqUZdJuNe2FB2LGdYCZEf8idD8homXWTTTAPqNl611cw8SM/D0EYygwQTs9UpuZiqy3HPBm/RH/2y5YgLO0VkFfzGz1e2SokhW4oeHsCatSk8BruNrr0IXqrV6aDN03dGSLbPe97IARmRfFBD2gxqiKRi/W+x6gQDy3k7f1twDG2tvDmJg== 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=g9Rg8H7d0wcV2yGtJulRAd9f5CnqDgBN4k/dlLkz9xk=; b=nOT8kqe+X5h+UErceg6ySn2qeynFByxZcULbj6evh9/WHBO2UXyZ81edG0otS10TqO1t6Cp3hqLD9wDrD/PZTElGSKvT76gBmC3tXSI+aUdYJAA09Bgz3nT/xUZmES5k6Nr5TqdqdZ1LwuLGQBYtW6ROXadIHtzJOolHFqIFYZU= Received: from DB7PR08MB3452.eurprd08.prod.outlook.com (2603:10a6:10:48::13) by DB4PR08MB9214.eurprd08.prod.outlook.com (2603:10a6:10:3fa::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.33; Tue, 9 May 2023 16:00:05 +0000 Received: from DB7PR08MB3452.eurprd08.prod.outlook.com ([fe80::8f5a:a899:a879:14dc]) by DB7PR08MB3452.eurprd08.prod.outlook.com ([fe80::8f5a:a899:a879:14dc%6]) with mapi id 15.20.6363.033; Tue, 9 May 2023 16:00:05 +0000 From: Oluwatamilore Adebayo To: "gcc-patches@gcc.gnu.org" CC: "richard.guenther@gmail.com" , Richard Sandiford Subject: [PATCH] vect: Missed opportunity to use [SU]ABD Thread-Topic: [PATCH] vect: Missed opportunity to use [SU]ABD Thread-Index: AQHZgo0JFuyPFyEmRUi4VVpxJLKJHA== Date: Tue, 9 May 2023 16:00:05 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: msip_labels: Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: DB7PR08MB3452:EE_|DB4PR08MB9214:EE_|AM7EUR03FT030:EE_|AM0PR08MB5380:EE_ X-MS-Office365-Filtering-Correlation-Id: 35b30f28-7ada-474b-9f49-08db50a67bc4 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: 9ZZbfMyrAJwX1fpY3BW8AajJafpvNiGoRJIvku/WNBowwIqal400QALcT+sPogwoRiPXSIj+1dGVNtVbhEzLvP7VgDwYy7wRUO5zKZTjzuxSgs542670SGUFbdB0390hYxj5KR/nHzj9mfkj3CBBN/5G+HbPKZCmFD0uJBXZRK+kYKu8n5IvGq+wLN+McNWSa3/jgO0xhxVGlQPg3eoQXbPNiNq6zQ5QLfWGvr8DFkCZAUiE03fKORN10X3fmTLY+ox7Gzc5nbr0crDUJJkUBOUZDbl4MaEiK669MbsIxNaGULdyFRqOJV+WKMpypJpWCQ995L22hakcBXV/oBdvR3PccoO8CIC7oGypUY1VWBa6ip/PKxOjVQWb7m50jtvgNFVwxiadbRe5KoUSn3ASzQCjtGyS57GK6W8Us84qBF6cTJjrdwyWhRfbxVXyihJwugQBsWirJT7Q1oj3ZqtlgQ5S7Pl0GWtiApUs7+cGUCqX8PPZkmOS222Wqxlj1sbPd9uUDwHgiXkRqGrmzRCdb9JHAu1XevRCDBsfUUc3y4ZDhjY+5s2vOKSEAvphNlzC/Lejuj0KDfIR+cTcxB4caamwEseQrJ6sCIssUL+pxkkzTBfm6CwBv18iXL0lpbv1 X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB7PR08MB3452.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(136003)(376002)(366004)(396003)(346002)(39860400002)(451199021)(83380400001)(316002)(4326008)(66946007)(64756008)(76116006)(91956017)(478600001)(6916009)(66556008)(7696005)(45080400002)(71200400001)(186003)(6506007)(26005)(9686003)(54906003)(53546011)(66476007)(66446008)(33656002)(86362001)(2906002)(55016003)(30864003)(41300700001)(99936003)(5660300002)(52536014)(8676002)(122000001)(38070700005)(8936002)(38100700002);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_DB7PR08MB345227948079D4E16CD24CBDF5769DB7PR08MB3452eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR08MB9214 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: AM7EUR03FT030.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 9fe08ee9-61d0-4572-6d5d-08db50a674ba X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: zVteHjy1NykYvM6Yj4lziuv/eX9pb0aS9C7XhXisOKz7RGr5rNOlau2NrbsqmoTtf7y6M/mj1ziEizC/wmdLIpySKWUhttakcS6v90uRqyjSS04iyuPA8B2Y7xnQvarLM0Pg2v0vV0uM+Mj6UfgtweJh2kLdwTKojV9w54aD9M5CIGE6QcKrDOcDeJC0mcSOHpOOCQYToomVDyPY2mO3ca9hj3S753NGm9j0p10ljuQbPp+GJm/wj0wUL3e8QZlMZWBL0umB4Ta+qMYR8NwQypDc67pmJyALaTvneONTlB4VyfbdeHGork0mPX5TpOsV0tPnlW/mpTIS+7VFeiHAf6PzjG+FnKqOmSnJ9S3lDoMRBTpL3vcMhhE+CfvMZu2DmBEkVr1vSQdLr2e7SVMfmTgTERkcOdL/3cO0blJnyil2CdoGF1rFI9O/u98aAD82nN0HRn0o1H8WfxGw8EC2AVFKZvbNZO6re6Krn6+J23wriX67Km7A9NoMCcncABTttehNHgGV1vFBhkCkyr0bGLYYnKBg/b3LQk9z51Q7wjlRRb0B5JUTN+jTpiIxVOjUyd3I3n4UCljWlpZRYc+Z4D/fqmwWSnaOran5SIvmcBTz/fLnAc7yM6hoecFod5CiWLqarAPmqBPIlnL2OV8izbaP44ZlH6ujv9cjgW9vcytf7+1jLTRSsfFde4OVHlIzP1XKOFL7szMK8uoaAumvgQ== X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230028)(4636009)(39860400002)(136003)(396003)(376002)(346002)(451199021)(46966006)(36840700001)(40470700004)(40460700003)(478600001)(4326008)(70586007)(7696005)(70206006)(6916009)(316002)(54906003)(336012)(86362001)(45080400002)(33656002)(47076005)(83380400001)(6506007)(53546011)(26005)(9686003)(36860700001)(2906002)(5660300002)(8676002)(8936002)(41300700001)(30864003)(55016003)(82310400005)(52536014)(235185007)(40480700001)(356005)(99936003)(81166007)(186003)(82740400003);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 May 2023 16:00:17.3396 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 35b30f28-7ada-474b-9f49-08db50a67bc4 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: AM7EUR03FT030.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB5380 X-Spam-Status: No, score=-12.8 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,T_SCC_BODY_TEXT_LINE,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_DB7PR08MB345227948079D4E16CD24CBDF5769DB7PR08MB3452eurp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable >From 0b5f469171c340ef61a48a31877d495bb77bd35f Mon Sep 17 00:00:00 2001=0A= From: oluade01 =0A= Date: Fri, 14 Apr 2023 10:24:43 +0100=0A= Subject: [PATCH 1/4] Missed opportunity to use [SU]ABD=0A= =0A= This adds a recognition pattern for the non-widening=0A= absolute difference (ABD).=0A= =0A= gcc/ChangeLog:=0A= =0A= * doc/md.texi (sabd, uabd): Document them.=0A= * internal-fn.def (ABD): Use new optab.=0A= * optabs.def (sabd_optab, uabd_optab): New optabs,=0A= * tree-vect-patterns.cc (vect_recog_absolute_difference):=0A= Recognize the following idiom abs (a - b).=0A= (vect_recog_sad_pattern): Refactor to use=0A= vect_recog_absolute_difference.=0A= (vect_recog_abd_pattern): Use patterns found by=0A= vect_recog_absolute_difference to build a new ABD=0A= internal call.=0A= ---=0A= gcc/doc/md.texi | 10 ++=0A= gcc/internal-fn.def | 3 +=0A= gcc/optabs.def | 2 +=0A= gcc/tree-vect-patterns.cc | 250 +++++++++++++++++++++++++++++++++-----=0A= 4 files changed, 234 insertions(+), 31 deletions(-)=0A= =0A= diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi=0A= index 07bf8bdebffb2e523f25a41f2b57e43c0276b745..0ad546c63a8deebb4b6db894f43= 7d1e21f0245a8 100644=0A= --- a/gcc/doc/md.texi=0A= +++ b/gcc/doc/md.texi=0A= @@ -5778,6 +5778,16 @@ Other shift and rotate instructions, analogous to th= e=0A= Vector shift and rotate instructions that take vectors as operand 2=0A= instead of a scalar type.=0A= =0A= +@cindex @code{uabd@var{m}} instruction pattern=0A= +@cindex @code{sabd@var{m}} instruction pattern=0A= +@item @samp{uabd@var{m}}, @samp{sabd@var{m}}=0A= +Signed and unsigned absolute difference instructions. These=0A= +instructions find the difference between operands 1 and 2=0A= +then return the absolute value. A C code equivalent would be:=0A= +@smallexample=0A= +op0 =3D abs (op0 - op1)=0A= +@end smallexample=0A= +=0A= @cindex @code{avg@var{m}3_floor} instruction pattern=0A= @cindex @code{uavg@var{m}3_floor} instruction pattern=0A= @item @samp{avg@var{m}3_floor}=0A= diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def=0A= index 7fe742c2ae713e7152ab05cfdfba86e4e0aa3456..0f1724ecf37a31c231572edf90b= 5577e2d82f468 100644=0A= --- a/gcc/internal-fn.def=0A= +++ b/gcc/internal-fn.def=0A= @@ -167,6 +167,9 @@ DEF_INTERNAL_OPTAB_FN (FMS, ECF_CONST, fms, ternary)=0A= DEF_INTERNAL_OPTAB_FN (FNMA, ECF_CONST, fnma, ternary)=0A= DEF_INTERNAL_OPTAB_FN (FNMS, ECF_CONST, fnms, ternary)=0A= =0A= +DEF_INTERNAL_SIGNED_OPTAB_FN (ABD, ECF_CONST | ECF_NOTHROW, first,=0A= + sabd, uabd, binary)=0A= +=0A= DEF_INTERNAL_SIGNED_OPTAB_FN (AVG_FLOOR, ECF_CONST | ECF_NOTHROW, first,= =0A= savg_floor, uavg_floor, binary)=0A= DEF_INTERNAL_SIGNED_OPTAB_FN (AVG_CEIL, ECF_CONST | ECF_NOTHROW, first,=0A= diff --git a/gcc/optabs.def b/gcc/optabs.def=0A= index 695f5911b300c9ca5737de9be809fa01aabe5e01..29bc92281a2175f898634cbe6af= 63c18021e5268 100644=0A= --- a/gcc/optabs.def=0A= +++ b/gcc/optabs.def=0A= @@ -359,6 +359,8 @@ OPTAB_D (mask_fold_left_plus_optab, "mask_fold_left_plu= s_$a")=0A= OPTAB_D (extract_last_optab, "extract_last_$a")=0A= OPTAB_D (fold_extract_last_optab, "fold_extract_last_$a")=0A= =0A= +OPTAB_D (uabd_optab, "uabd$a3")=0A= +OPTAB_D (sabd_optab, "sabd$a3")=0A= OPTAB_D (savg_floor_optab, "avg$a3_floor")=0A= OPTAB_D (uavg_floor_optab, "uavg$a3_floor")=0A= OPTAB_D (savg_ceil_optab, "avg$a3_ceil")=0A= diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc=0A= index a49b09539776c0056e77f99b10365d0a8747fbc5..91e1f9d4b610275dd833ec56dc7= 7f76367ee7886 100644=0A= --- a/gcc/tree-vect-patterns.cc=0A= +++ b/gcc/tree-vect-patterns.cc=0A= @@ -770,6 +770,89 @@ vect_split_statement (vec_info *vinfo, stmt_vec_info s= tmt2_info, tree new_rhs,=0A= }=0A= }=0A= =0A= +/* Look for the following pattern=0A= + X =3D x[i]=0A= + Y =3D y[i]=0A= + DIFF =3D X - Y=0A= + DAD =3D ABS_EXPR=0A= + */=0A= +static bool=0A= +vect_recog_absolute_difference (vec_info *vinfo, gassign *abs_stmt,=0A= + tree *half_type, bool reject_unsigned,=0A= + vect_unpromoted_value unprom[2],=0A= + tree diff_oprnds[2])=0A= +{=0A= + if (!abs_stmt)=0A= + return false;=0A= +=0A= + /* FORNOW. Can continue analyzing the def-use chain when this stmt in a= phi=0A= + inside the loop (in case we are analyzing an outer-loop). */=0A= + enum tree_code code =3D gimple_assign_rhs_code (abs_stmt);=0A= + if (code !=3D ABS_EXPR && code !=3D ABSU_EXPR)=0A= + return false;=0A= +=0A= + tree abs_oprnd =3D gimple_assign_rhs1 (abs_stmt);=0A= + tree abs_type =3D TREE_TYPE (abs_oprnd);=0A= + if (!abs_oprnd)=0A= + return false;=0A= + if (reject_unsigned && TYPE_UNSIGNED (abs_type))=0A= + return false;=0A= + if (!ANY_INTEGRAL_TYPE_P (abs_type) || TYPE_OVERFLOW_WRAPS (abs_type))= =0A= + return false;=0A= +=0A= + /* Peel off conversions from the ABS input. This can involve sign=0A= + changes (e.g. from an unsigned subtraction to a signed ABS input)=0A= + or signed promotion, but it can't include unsigned promotion.=0A= + (Note that ABS of an unsigned promotion should have been folded=0A= + away before now anyway.) */=0A= + vect_unpromoted_value unprom_diff;=0A= + abs_oprnd =3D vect_look_through_possible_promotion (vinfo, abs_oprnd,=0A= + &unprom_diff);=0A= + if (!abs_oprnd)=0A= + return false;=0A= + if (TYPE_PRECISION (unprom_diff.type) !=3D TYPE_PRECISION (abs_type)=0A= + && TYPE_UNSIGNED (unprom_diff.type))=0A= + if (!reject_unsigned)=0A= + return false;=0A= +=0A= + /* We then detect if the operand of abs_expr is defined by a minus_expr.= */=0A= + stmt_vec_info diff_stmt_vinfo =3D vect_get_internal_def (vinfo, abs_oprn= d);=0A= + if (!diff_stmt_vinfo)=0A= + return false;=0A= +=0A= + bool assigned_oprnds =3D false;=0A= + gassign *diff =3D dyn_cast (STMT_VINFO_STMT (diff_stmt_vinfo= ));=0A= + if (diff_oprnds && diff && gimple_assign_rhs_code (diff) =3D=3D MINUS_EX= PR)=0A= + {=0A= + assigned_oprnds =3D true;=0A= + diff_oprnds[0] =3D gimple_assign_rhs1 (diff);=0A= + diff_oprnds[1] =3D gimple_assign_rhs2 (diff);=0A= + }=0A= +=0A= + /* FORNOW. Can continue analyzing the def-use chain when this stmt in a= phi=0A= + inside the loop (in case we are analyzing an outer-loop). */=0A= + if (vect_widened_op_tree (vinfo, diff_stmt_vinfo, MINUS_EXPR,=0A= + WIDEN_MINUS_EXPR,=0A= + false, 2, unprom, half_type))=0A= + {=0A= + if (diff_oprnds && !assigned_oprnds)=0A= + {=0A= + diff_oprnds[0] =3D unprom[0].op;=0A= + diff_oprnds[1] =3D unprom[1].op;=0A= + }=0A= + }=0A= + else if (!assigned_oprnds)=0A= + {=0A= + return false;=0A= + }=0A= + else=0A= + {=0A= + *half_type =3D NULL_TREE;=0A= + }=0A= +=0A= + return true;=0A= +}=0A= +=0A= /* Convert UNPROM to TYPE and return the result, adding new statements=0A= to STMT_INFO's pattern definition statements if no better way is=0A= available. VECTYPE is the vector form of TYPE.=0A= @@ -1308,40 +1391,13 @@ vect_recog_sad_pattern (vec_info *vinfo,=0A= /* FORNOW. Can continue analyzing the def-use chain when this stmt in a= phi=0A= inside the loop (in case we are analyzing an outer-loop). */=0A= gassign *abs_stmt =3D dyn_cast (abs_stmt_vinfo->stmt);=0A= - if (!abs_stmt=0A= - || (gimple_assign_rhs_code (abs_stmt) !=3D ABS_EXPR=0A= - && gimple_assign_rhs_code (abs_stmt) !=3D ABSU_EXPR))=0A= - return NULL;=0A= -=0A= - tree abs_oprnd =3D gimple_assign_rhs1 (abs_stmt);=0A= - tree abs_type =3D TREE_TYPE (abs_oprnd);=0A= - if (TYPE_UNSIGNED (abs_type))=0A= - return NULL;=0A= -=0A= - /* Peel off conversions from the ABS input. This can involve sign=0A= - changes (e.g. from an unsigned subtraction to a signed ABS input)=0A= - or signed promotion, but it can't include unsigned promotion.=0A= - (Note that ABS of an unsigned promotion should have been folded=0A= - away before now anyway.) */=0A= - vect_unpromoted_value unprom_diff;=0A= - abs_oprnd =3D vect_look_through_possible_promotion (vinfo, abs_oprnd,=0A= - &unprom_diff);=0A= - if (!abs_oprnd)=0A= - return NULL;=0A= - if (TYPE_PRECISION (unprom_diff.type) !=3D TYPE_PRECISION (abs_type)=0A= - && TYPE_UNSIGNED (unprom_diff.type))=0A= - return NULL;=0A= =0A= - /* We then detect if the operand of abs_expr is defined by a minus_expr.= */=0A= - stmt_vec_info diff_stmt_vinfo =3D vect_get_internal_def (vinfo, abs_oprn= d);=0A= - if (!diff_stmt_vinfo)=0A= + vect_unpromoted_value unprom[2];=0A= + if (!vect_recog_absolute_difference (vinfo, abs_stmt, &half_type,=0A= + true, unprom, NULL))=0A= return NULL;=0A= =0A= - /* FORNOW. Can continue analyzing the def-use chain when this stmt in a= phi=0A= - inside the loop (in case we are analyzing an outer-loop). */=0A= - vect_unpromoted_value unprom[2];=0A= - if (!vect_widened_op_tree (vinfo, diff_stmt_vinfo, MINUS_EXPR, WIDEN_MIN= US_EXPR,=0A= - false, 2, unprom, &half_type))=0A= + if (!half_type)=0A= return NULL;=0A= =0A= vect_pattern_detected ("vect_recog_sad_pattern", last_stmt);=0A= @@ -1363,6 +1419,137 @@ vect_recog_sad_pattern (vec_info *vinfo,=0A= return pattern_stmt;=0A= }=0A= =0A= +/* Function vect_recog_abd_pattern=0A= +=0A= + Try to find the following ABsolute Difference (ABD) pattern:=0A= +=0A= + VTYPE x, y, out;=0A= + type diff;=0A= + loop i in range:=0A= + S1 diff =3D x[i] - y[i]=0A= + S2 out[i] =3D ABS_EXPR ;=0A= +=0A= + where 'type' is a integer and 'VTYPE' is a vector of integers=0A= + the same size as 'type'=0A= +=0A= + Input:=0A= +=0A= + * STMT_VINFO: The stmt from which the pattern search begins=0A= +=0A= + Output:=0A= +=0A= + * TYPE_out: The type of the output of this pattern=0A= +=0A= + * Return value: A new stmt that will be used to replace the sequence of= =0A= + stmts that constitute the pattern; either SABD or UABD:=0A= + SABD_EXPR=0A= + UABD_EXPR=0A= +=0A= + UABD expressions are used when the input types are=0A= + narrower than the output types or the output type is narrower=0A= + than 32 bits=0A= + */=0A= +=0A= +static gimple *=0A= +vect_recog_abd_pattern (vec_info *vinfo,=0A= + stmt_vec_info stmt_vinfo, tree *type_out)=0A= +{=0A= + /* Look for the following patterns=0A= + X =3D x[i]=0A= + Y =3D y[i]=0A= + DIFF =3D X - Y=0A= + DAD =3D ABS_EXPR=0A= + out[i] =3D DAD=0A= +=0A= + In which=0A= + - X, Y, DIFF, DAD all have the same type=0A= + - x, y, out are all vectors of the same type=0A= + */=0A= + gassign *last_stmt =3D dyn_cast (STMT_VINFO_STMT (stmt_vinfo= ));=0A= + if (!last_stmt)=0A= + return NULL;=0A= +=0A= + tree out_type =3D TREE_TYPE (gimple_assign_lhs (last_stmt));=0A= +=0A= + gassign *abs_stmt =3D last_stmt;=0A= + if (gimple_assign_cast_p (last_stmt))=0A= + {=0A= + tree last_rhs =3D gimple_assign_rhs1 (last_stmt);=0A= + if (!SSA_VAR_P (last_rhs))=0A= + return NULL;=0A= +=0A= + abs_stmt =3D dyn_cast (SSA_NAME_DEF_STMT (last_rhs));=0A= + if (!abs_stmt)=0A= + return NULL;=0A= + }=0A= +=0A= + vect_unpromoted_value unprom[2];=0A= + tree diff_oprnds[2];=0A= + tree half_type;=0A= + if (!vect_recog_absolute_difference (vinfo, abs_stmt, &half_type,=0A= + false, unprom, diff_oprnds))=0A= + return NULL;=0A= +=0A= +#define SAME_TYPE(A, B) (TYPE_PRECISION (A) =3D=3D TYPE_PRECISION (B))=0A= +=0A= + tree abd_oprnds[2];=0A= + if (half_type)=0A= + {=0A= + if (!SAME_TYPE (unprom[0].type, unprom[1].type))=0A= + return NULL;=0A= +=0A= + tree diff_type =3D TREE_TYPE (diff_oprnds[0]);=0A= + if (TYPE_PRECISION (out_type) !=3D TYPE_PRECISION (diff_type))=0A= + {=0A= + vect_convert_inputs (vinfo, stmt_vinfo, 2, abd_oprnds, half_type, un= prom,=0A= + get_vectype_for_scalar_type (vinfo, half_type));=0A= + }=0A= + else=0A= + {=0A= + abd_oprnds[0] =3D diff_oprnds[0];=0A= + abd_oprnds[1] =3D diff_oprnds[1];=0A= + }=0A= + }=0A= + else=0A= + {=0A= + if (unprom[0].op && unprom[1].op=0A= + && (!SAME_TYPE (unprom[0].type, unprom[1].type)=0A= + || !SAME_TYPE (unprom[0].type, out_type)))=0A= + return NULL;=0A= +=0A= + unprom[0].op =3D diff_oprnds[0];=0A= + unprom[1].op =3D diff_oprnds[1];=0A= + tree signed_out =3D signed_type_for (out_type);=0A= + tree signed_out_vectype =3D get_vectype_for_scalar_type (vinfo, signed= _out);=0A= + vect_convert_inputs (vinfo, stmt_vinfo, 2, abd_oprnds,=0A= + signed_out, unprom, signed_out_vectype);=0A= +=0A= + if (!SAME_TYPE (TREE_TYPE (diff_oprnds[0]), TREE_TYPE (abd_oprnds[0]))= )=0A= + return NULL;=0A= + }=0A= +=0A= + if (!SAME_TYPE (TREE_TYPE (abd_oprnds[0]), TREE_TYPE (abd_oprnds[1]))=0A= + || !SAME_TYPE (TREE_TYPE (abd_oprnds[0]), out_type))=0A= + return NULL;=0A= +=0A= + vect_pattern_detected ("vect_recog_abd_pattern", last_stmt);=0A= +=0A= + tree vectype =3D get_vectype_for_scalar_type (vinfo, out_type);=0A= + if (!vectype=0A= + || !direct_internal_fn_supported_p (IFN_ABD, vectype,=0A= + OPTIMIZE_FOR_SPEED))=0A= + return NULL;=0A= +=0A= + *type_out =3D STMT_VINFO_VECTYPE (stmt_vinfo);=0A= +=0A= + tree var =3D vect_recog_temp_ssa_var (out_type, NULL);=0A= + gcall *abd_stmt =3D gimple_build_call_internal (IFN_ABD, 2,=0A= + abd_oprnds[0], abd_oprnds[1]);=0A= + gimple_call_set_lhs (abd_stmt, var);=0A= + gimple_set_location (abd_stmt, gimple_location (last_stmt));=0A= + return abd_stmt;=0A= +}=0A= +=0A= /* Recognize an operation that performs ORIG_CODE on widened inputs,=0A= so that it can be treated as though it had the form:=0A= =0A= @@ -6439,6 +6626,7 @@ struct vect_recog_func=0A= static vect_recog_func vect_vect_recog_func_ptrs[] =3D {=0A= { vect_recog_bitfield_ref_pattern, "bitfield_ref" },=0A= { vect_recog_bit_insert_pattern, "bit_insert" },=0A= + { vect_recog_abd_pattern, "abd" },=0A= { vect_recog_over_widening_pattern, "over_widening" },=0A= /* Must come after over_widening, which narrows the shift as much as=0A= possible beforehand. */=0A= -- =0A= 2.25.1=0A= --_002_DB7PR08MB345227948079D4E16CD24CBDF5769DB7PR08MB3452eurp_ Content-Type: text/x-patch; name="0001-Missed-opportunity-to-use-SU-ABD.patch" Content-Description: 0001-Missed-opportunity-to-use-SU-ABD.patch Content-Disposition: attachment; filename="0001-Missed-opportunity-to-use-SU-ABD.patch"; size=12620; creation-date="Tue, 09 May 2023 15:59:40 GMT"; modification-date="Tue, 09 May 2023 15:59:40 GMT" Content-Transfer-Encoding: base64 RnJvbSAwYjVmNDY5MTcxYzM0MGVmNjFhNDhhMzE4NzdkNDk1YmI3N2JkMzVmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBvbHVhZGUwMSA8b2x1d2F0YW1pbG9yZS5hZGViYXlvQGFybS5j b20+CkRhdGU6IEZyaSwgMTQgQXByIDIwMjMgMTA6MjQ6NDMgKzAxMDAKU3ViamVjdDogW1BBVENI IDEvNF0gTWlzc2VkIG9wcG9ydHVuaXR5IHRvIHVzZSBbU1VdQUJECgpUaGlzIGFkZHMgYSByZWNv Z25pdGlvbiBwYXR0ZXJuIGZvciB0aGUgbm9uLXdpZGVuaW5nCmFic29sdXRlIGRpZmZlcmVuY2Ug KEFCRCkuCgpnY2MvQ2hhbmdlTG9nOgoKCSogZG9jL21kLnRleGkgKHNhYmQsIHVhYmQpOiBEb2N1 bWVudCB0aGVtLgoJKiBpbnRlcm5hbC1mbi5kZWYgKEFCRCk6IFVzZSBuZXcgb3B0YWIuCgkqIG9w dGFicy5kZWYgKHNhYmRfb3B0YWIsIHVhYmRfb3B0YWIpOiBOZXcgb3B0YWJzLAoJKiB0cmVlLXZl Y3QtcGF0dGVybnMuY2MgKHZlY3RfcmVjb2dfYWJzb2x1dGVfZGlmZmVyZW5jZSk6CglSZWNvZ25p emUgdGhlIGZvbGxvd2luZyBpZGlvbSBhYnMgKGEgLSBiKS4KCSh2ZWN0X3JlY29nX3NhZF9wYXR0 ZXJuKTogUmVmYWN0b3IgdG8gdXNlCgl2ZWN0X3JlY29nX2Fic29sdXRlX2RpZmZlcmVuY2UuCgko dmVjdF9yZWNvZ19hYmRfcGF0dGVybik6IFVzZSBwYXR0ZXJucyBmb3VuZCBieQoJdmVjdF9yZWNv Z19hYnNvbHV0ZV9kaWZmZXJlbmNlIHRvIGJ1aWxkIGEgbmV3IEFCRAoJaW50ZXJuYWwgY2FsbC4K LS0tCiBnY2MvZG9jL21kLnRleGkgICAgICAgICAgIHwgIDEwICsrCiBnY2MvaW50ZXJuYWwtZm4u ZGVmICAgICAgIHwgICAzICsKIGdjYy9vcHRhYnMuZGVmICAgICAgICAgICAgfCAgIDIgKwogZ2Nj L3RyZWUtdmVjdC1wYXR0ZXJucy5jYyB8IDI1MCArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKystLS0tLQogNCBmaWxlcyBjaGFuZ2VkLCAyMzQgaW5zZXJ0aW9ucygrKSwgMzEgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9tZC50ZXhpIGIvZ2NjL2RvYy9tZC50ZXhpCmlu ZGV4IDA3YmY4YmRlYmZmYjJlNTIzZjI1YTQxZjJiNTdlNDNjMDI3NmI3NDUuLjBhZDU0NmM2M2E4 ZGVlYmI0YjZkYjg5NGY0MzdkMWUyMWYwMjQ1YTggMTAwNjQ0Ci0tLSBhL2djYy9kb2MvbWQudGV4 aQorKysgYi9nY2MvZG9jL21kLnRleGkKQEAgLTU3NzgsNiArNTc3OCwxNiBAQCBPdGhlciBzaGlm dCBhbmQgcm90YXRlIGluc3RydWN0aW9ucywgYW5hbG9nb3VzIHRvIHRoZQogVmVjdG9yIHNoaWZ0 IGFuZCByb3RhdGUgaW5zdHJ1Y3Rpb25zIHRoYXQgdGFrZSB2ZWN0b3JzIGFzIG9wZXJhbmQgMgog aW5zdGVhZCBvZiBhIHNjYWxhciB0eXBlLgogCitAY2luZGV4IEBjb2Rle3VhYmRAdmFye219fSBp bnN0cnVjdGlvbiBwYXR0ZXJuCitAY2luZGV4IEBjb2Rle3NhYmRAdmFye219fSBpbnN0cnVjdGlv biBwYXR0ZXJuCitAaXRlbSBAc2FtcHt1YWJkQHZhcnttfX0sIEBzYW1we3NhYmRAdmFye219fQor U2lnbmVkIGFuZCB1bnNpZ25lZCBhYnNvbHV0ZSBkaWZmZXJlbmNlIGluc3RydWN0aW9ucy4gIFRo ZXNlCitpbnN0cnVjdGlvbnMgZmluZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9wZXJhbmRzIDEg YW5kIDIKK3RoZW4gcmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gIEEgQyBjb2RlIGVxdWl2YWxl bnQgd291bGQgYmU6CitAc21hbGxleGFtcGxlCitvcDAgPSBhYnMgKG9wMCAtIG9wMSkKK0BlbmQg c21hbGxleGFtcGxlCisKIEBjaW5kZXggQGNvZGV7YXZnQHZhcnttfTNfZmxvb3J9IGluc3RydWN0 aW9uIHBhdHRlcm4KIEBjaW5kZXggQGNvZGV7dWF2Z0B2YXJ7bX0zX2Zsb29yfSBpbnN0cnVjdGlv biBwYXR0ZXJuCiBAaXRlbSBAc2FtcHthdmdAdmFye219M19mbG9vcn0KZGlmZiAtLWdpdCBhL2dj Yy9pbnRlcm5hbC1mbi5kZWYgYi9nY2MvaW50ZXJuYWwtZm4uZGVmCmluZGV4IDdmZTc0MmMyYWU3 MTNlNzE1MmFiMDVjZmRmYmE4NmU0ZTBhYTM0NTYuLjBmMTcyNGVjZjM3YTMxYzIzMTU3MmVkZjkw YjU1NzdlMmQ4MmY0NjggMTAwNjQ0Ci0tLSBhL2djYy9pbnRlcm5hbC1mbi5kZWYKKysrIGIvZ2Nj L2ludGVybmFsLWZuLmRlZgpAQCAtMTY3LDYgKzE2Nyw5IEBAIERFRl9JTlRFUk5BTF9PUFRBQl9G TiAoRk1TLCBFQ0ZfQ09OU1QsIGZtcywgdGVybmFyeSkKIERFRl9JTlRFUk5BTF9PUFRBQl9GTiAo Rk5NQSwgRUNGX0NPTlNULCBmbm1hLCB0ZXJuYXJ5KQogREVGX0lOVEVSTkFMX09QVEFCX0ZOIChG Tk1TLCBFQ0ZfQ09OU1QsIGZubXMsIHRlcm5hcnkpCiAKK0RFRl9JTlRFUk5BTF9TSUdORURfT1BU QUJfRk4gKEFCRCwgRUNGX0NPTlNUIHwgRUNGX05PVEhST1csIGZpcnN0LAorCQkJICAgICAgc2Fi ZCwgdWFiZCwgYmluYXJ5KQorCiBERUZfSU5URVJOQUxfU0lHTkVEX09QVEFCX0ZOIChBVkdfRkxP T1IsIEVDRl9DT05TVCB8IEVDRl9OT1RIUk9XLCBmaXJzdCwKIAkJCSAgICAgIHNhdmdfZmxvb3Is IHVhdmdfZmxvb3IsIGJpbmFyeSkKIERFRl9JTlRFUk5BTF9TSUdORURfT1BUQUJfRk4gKEFWR19D RUlMLCBFQ0ZfQ09OU1QgfCBFQ0ZfTk9USFJPVywgZmlyc3QsCmRpZmYgLS1naXQgYS9nY2Mvb3B0 YWJzLmRlZiBiL2djYy9vcHRhYnMuZGVmCmluZGV4IDY5NWY1OTExYjMwMGM5Y2E1NzM3ZGU5YmU4 MDlmYTAxYWFiZTVlMDEuLjI5YmM5MjI4MWEyMTc1Zjg5ODYzNGNiZTZhZjYzYzE4MDIxZTUyNjgg MTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMuZGVmCisrKyBiL2djYy9vcHRhYnMuZGVmCkBAIC0zNTks NiArMzU5LDggQEAgT1BUQUJfRCAobWFza19mb2xkX2xlZnRfcGx1c19vcHRhYiwgIm1hc2tfZm9s ZF9sZWZ0X3BsdXNfJGEiKQogT1BUQUJfRCAoZXh0cmFjdF9sYXN0X29wdGFiLCAiZXh0cmFjdF9s YXN0XyRhIikKIE9QVEFCX0QgKGZvbGRfZXh0cmFjdF9sYXN0X29wdGFiLCAiZm9sZF9leHRyYWN0 X2xhc3RfJGEiKQogCitPUFRBQl9EICh1YWJkX29wdGFiLCAidWFiZCRhMyIpCitPUFRBQl9EIChz YWJkX29wdGFiLCAic2FiZCRhMyIpCiBPUFRBQl9EIChzYXZnX2Zsb29yX29wdGFiLCAiYXZnJGEz X2Zsb29yIikKIE9QVEFCX0QgKHVhdmdfZmxvb3Jfb3B0YWIsICJ1YXZnJGEzX2Zsb29yIikKIE9Q VEFCX0QgKHNhdmdfY2VpbF9vcHRhYiwgImF2ZyRhM19jZWlsIikKZGlmZiAtLWdpdCBhL2djYy90 cmVlLXZlY3QtcGF0dGVybnMuY2MgYi9nY2MvdHJlZS12ZWN0LXBhdHRlcm5zLmNjCmluZGV4IGE0 OWIwOTUzOTc3NmMwMDU2ZTc3Zjk5YjEwMzY1ZDBhODc0N2ZiYzUuLjkxZTFmOWQ0YjYxMDI3NWRk ODMzZWM1NmRjNzdmNzYzNjdlZTc4ODYgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZlY3QtcGF0dGVy bnMuY2MKKysrIGIvZ2NjL3RyZWUtdmVjdC1wYXR0ZXJucy5jYwpAQCAtNzcwLDYgKzc3MCw4OSBA QCB2ZWN0X3NwbGl0X3N0YXRlbWVudCAodmVjX2luZm8gKnZpbmZvLCBzdG10X3ZlY19pbmZvIHN0 bXQyX2luZm8sIHRyZWUgbmV3X3JocywKICAgICB9CiB9CiAKKy8qIExvb2sgZm9yIHRoZSBmb2xs b3dpbmcgcGF0dGVybgorCVggPSB4W2ldCisJWSA9IHlbaV0KKwlESUZGID0gWCAtIFkKKwlEQUQg PSBBQlNfRVhQUjxESUZGPgorICovCitzdGF0aWMgYm9vbAordmVjdF9yZWNvZ19hYnNvbHV0ZV9k aWZmZXJlbmNlICh2ZWNfaW5mbyAqdmluZm8sIGdhc3NpZ24gKmFic19zdG10LAorCQkJCXRyZWUg KmhhbGZfdHlwZSwgYm9vbCByZWplY3RfdW5zaWduZWQsCisJCQkJdmVjdF91bnByb21vdGVkX3Zh bHVlIHVucHJvbVsyXSwKKwkJCQl0cmVlIGRpZmZfb3BybmRzWzJdKQoreworICBpZiAoIWFic19z dG10KQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBGT1JOT1cuICBDYW4gY29udGludWUgYW5h bHl6aW5nIHRoZSBkZWYtdXNlIGNoYWluIHdoZW4gdGhpcyBzdG10IGluIGEgcGhpCisgICAgIGlu c2lkZSB0aGUgbG9vcCAoaW4gY2FzZSB3ZSBhcmUgYW5hbHl6aW5nIGFuIG91dGVyLWxvb3ApLiAg Ki8KKyAgZW51bSB0cmVlX2NvZGUgY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGFic19z dG10KTsKKyAgaWYgKGNvZGUgIT0gQUJTX0VYUFIgJiYgY29kZSAhPSBBQlNVX0VYUFIpCisgICAg cmV0dXJuIGZhbHNlOworCisgIHRyZWUgYWJzX29wcm5kID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChh YnNfc3RtdCk7CisgIHRyZWUgYWJzX3R5cGUgPSBUUkVFX1RZUEUgKGFic19vcHJuZCk7CisgIGlm ICghYWJzX29wcm5kKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHJlamVjdF91bnNpZ25lZCAm JiBUWVBFX1VOU0lHTkVEIChhYnNfdHlwZSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIUFO WV9JTlRFR1JBTF9UWVBFX1AgKGFic190eXBlKSB8fCBUWVBFX09WRVJGTE9XX1dSQVBTIChhYnNf dHlwZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFBlZWwgb2ZmIGNvbnZlcnNpb25zIGZy b20gdGhlIEFCUyBpbnB1dC4gIFRoaXMgY2FuIGludm9sdmUgc2lnbgorICAgICBjaGFuZ2VzIChl LmcuICBmcm9tIGFuIHVuc2lnbmVkIHN1YnRyYWN0aW9uIHRvIGEgc2lnbmVkIEFCUyBpbnB1dCkK KyAgICAgb3Igc2lnbmVkIHByb21vdGlvbiwgYnV0IGl0IGNhbid0IGluY2x1ZGUgdW5zaWduZWQg cHJvbW90aW9uLgorICAgICAoTm90ZSB0aGF0IEFCUyBvZiBhbiB1bnNpZ25lZCBwcm9tb3Rpb24g c2hvdWxkIGhhdmUgYmVlbiBmb2xkZWQKKyAgICAgYXdheSBiZWZvcmUgbm93IGFueXdheS4pICAq LworICB2ZWN0X3VucHJvbW90ZWRfdmFsdWUgdW5wcm9tX2RpZmY7CisgIGFic19vcHJuZCA9IHZl Y3RfbG9va190aHJvdWdoX3Bvc3NpYmxlX3Byb21vdGlvbiAodmluZm8sIGFic19vcHJuZCwKKwkJ CQkJCSAgICAmdW5wcm9tX2RpZmYpOworICBpZiAoIWFic19vcHJuZCkKKyAgICByZXR1cm4gZmFs c2U7CisgIGlmIChUWVBFX1BSRUNJU0lPTiAodW5wcm9tX2RpZmYudHlwZSkgIT0gVFlQRV9QUkVD SVNJT04gKGFic190eXBlKQorICAgICAgJiYgVFlQRV9VTlNJR05FRCAodW5wcm9tX2RpZmYudHlw ZSkpCisgICAgaWYgKCFyZWplY3RfdW5zaWduZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAg LyogV2UgdGhlbiBkZXRlY3QgaWYgdGhlIG9wZXJhbmQgb2YgYWJzX2V4cHIgaXMgZGVmaW5lZCBi eSBhIG1pbnVzX2V4cHIuICAqLworICBzdG10X3ZlY19pbmZvIGRpZmZfc3RtdF92aW5mbyA9IHZl Y3RfZ2V0X2ludGVybmFsX2RlZiAodmluZm8sIGFic19vcHJuZCk7CisgIGlmICghZGlmZl9zdG10 X3ZpbmZvKQorICAgIHJldHVybiBmYWxzZTsKKworICBib29sIGFzc2lnbmVkX29wcm5kcyA9IGZh bHNlOworICBnYXNzaWduICpkaWZmID0gZHluX2Nhc3QgPGdhc3NpZ24gKj4gKFNUTVRfVklORk9f U1RNVCAoZGlmZl9zdG10X3ZpbmZvKSk7CisgIGlmIChkaWZmX29wcm5kcyAmJiBkaWZmICYmIGdp bXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRpZmYpID09IE1JTlVTX0VYUFIpCisgIHsKKyAgICBhc3Np Z25lZF9vcHJuZHMgPSB0cnVlOworICAgIGRpZmZfb3BybmRzWzBdID0gZ2ltcGxlX2Fzc2lnbl9y aHMxIChkaWZmKTsKKyAgICBkaWZmX29wcm5kc1sxXSA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoZGlm Zik7CisgIH0KKworICAvKiBGT1JOT1cuICBDYW4gY29udGludWUgYW5hbHl6aW5nIHRoZSBkZWYt dXNlIGNoYWluIHdoZW4gdGhpcyBzdG10IGluIGEgcGhpCisgICAgIGluc2lkZSB0aGUgbG9vcCAo aW4gY2FzZSB3ZSBhcmUgYW5hbHl6aW5nIGFuIG91dGVyLWxvb3ApLiAgKi8KKyAgaWYgKHZlY3Rf d2lkZW5lZF9vcF90cmVlICh2aW5mbywgZGlmZl9zdG10X3ZpbmZvLCBNSU5VU19FWFBSLAorCQkJ ICAgICBXSURFTl9NSU5VU19FWFBSLAorCQkJICAgICBmYWxzZSwgMiwgdW5wcm9tLCBoYWxmX3R5 cGUpKQorICB7CisgICAgaWYgKGRpZmZfb3BybmRzICYmICFhc3NpZ25lZF9vcHJuZHMpCisgICAg eworICAgICAgZGlmZl9vcHJuZHNbMF0gPSB1bnByb21bMF0ub3A7CisgICAgICBkaWZmX29wcm5k c1sxXSA9IHVucHJvbVsxXS5vcDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIWFzc2lnbmVkX29w cm5kcykKKyAgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAqaGFs Zl90eXBlID0gTlVMTF9UUkVFOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKIC8qIENvbnZl cnQgVU5QUk9NIHRvIFRZUEUgYW5kIHJldHVybiB0aGUgcmVzdWx0LCBhZGRpbmcgbmV3IHN0YXRl bWVudHMKICAgIHRvIFNUTVRfSU5GTydzIHBhdHRlcm4gZGVmaW5pdGlvbiBzdGF0ZW1lbnRzIGlm IG5vIGJldHRlciB3YXkgaXMKICAgIGF2YWlsYWJsZS4gIFZFQ1RZUEUgaXMgdGhlIHZlY3RvciBm b3JtIG9mIFRZUEUuCkBAIC0xMzA4LDQwICsxMzkxLDEzIEBAIHZlY3RfcmVjb2dfc2FkX3BhdHRl cm4gKHZlY19pbmZvICp2aW5mbywKICAgLyogRk9STk9XLiAgQ2FuIGNvbnRpbnVlIGFuYWx5emlu ZyB0aGUgZGVmLXVzZSBjaGFpbiB3aGVuIHRoaXMgc3RtdCBpbiBhIHBoaQogICAgICBpbnNpZGUg dGhlIGxvb3AgKGluIGNhc2Ugd2UgYXJlIGFuYWx5emluZyBhbiBvdXRlci1sb29wKS4gICovCiAg IGdhc3NpZ24gKmFic19zdG10ID0gZHluX2Nhc3QgPGdhc3NpZ24gKj4gKGFic19zdG10X3ZpbmZv LT5zdG10KTsKLSAgaWYgKCFhYnNfc3RtdAotICAgICAgfHwgKGdpbXBsZV9hc3NpZ25fcmhzX2Nv ZGUgKGFic19zdG10KSAhPSBBQlNfRVhQUgotCSAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo YWJzX3N0bXQpICE9IEFCU1VfRVhQUikpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdHJlZSBhYnNf b3BybmQgPSBnaW1wbGVfYXNzaWduX3JoczEgKGFic19zdG10KTsKLSAgdHJlZSBhYnNfdHlwZSA9 IFRSRUVfVFlQRSAoYWJzX29wcm5kKTsKLSAgaWYgKFRZUEVfVU5TSUdORUQgKGFic190eXBlKSkK LSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBQZWVsIG9mZiBjb252ZXJzaW9ucyBmcm9tIHRoZSBB QlMgaW5wdXQuICBUaGlzIGNhbiBpbnZvbHZlIHNpZ24KLSAgICAgY2hhbmdlcyAoZS5nLiBmcm9t IGFuIHVuc2lnbmVkIHN1YnRyYWN0aW9uIHRvIGEgc2lnbmVkIEFCUyBpbnB1dCkKLSAgICAgb3Ig c2lnbmVkIHByb21vdGlvbiwgYnV0IGl0IGNhbid0IGluY2x1ZGUgdW5zaWduZWQgcHJvbW90aW9u LgotICAgICAoTm90ZSB0aGF0IEFCUyBvZiBhbiB1bnNpZ25lZCBwcm9tb3Rpb24gc2hvdWxkIGhh dmUgYmVlbiBmb2xkZWQKLSAgICAgYXdheSBiZWZvcmUgbm93IGFueXdheS4pICAqLwotICB2ZWN0 X3VucHJvbW90ZWRfdmFsdWUgdW5wcm9tX2RpZmY7Ci0gIGFic19vcHJuZCA9IHZlY3RfbG9va190 aHJvdWdoX3Bvc3NpYmxlX3Byb21vdGlvbiAodmluZm8sIGFic19vcHJuZCwKLQkJCQkJCSAgICAm dW5wcm9tX2RpZmYpOwotICBpZiAoIWFic19vcHJuZCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYg KFRZUEVfUFJFQ0lTSU9OICh1bnByb21fZGlmZi50eXBlKSAhPSBUWVBFX1BSRUNJU0lPTiAoYWJz X3R5cGUpCi0gICAgICAmJiBUWVBFX1VOU0lHTkVEICh1bnByb21fZGlmZi50eXBlKSkKLSAgICBy ZXR1cm4gTlVMTDsKIAotICAvKiBXZSB0aGVuIGRldGVjdCBpZiB0aGUgb3BlcmFuZCBvZiBhYnNf ZXhwciBpcyBkZWZpbmVkIGJ5IGEgbWludXNfZXhwci4gICovCi0gIHN0bXRfdmVjX2luZm8gZGlm Zl9zdG10X3ZpbmZvID0gdmVjdF9nZXRfaW50ZXJuYWxfZGVmICh2aW5mbywgYWJzX29wcm5kKTsK LSAgaWYgKCFkaWZmX3N0bXRfdmluZm8pCisgIHZlY3RfdW5wcm9tb3RlZF92YWx1ZSB1bnByb21b Ml07CisgIGlmICghdmVjdF9yZWNvZ19hYnNvbHV0ZV9kaWZmZXJlbmNlICh2aW5mbywgYWJzX3N0 bXQsICZoYWxmX3R5cGUsCisJCQkJICAgICAgIHRydWUsIHVucHJvbSwgTlVMTCkpCiAgICAgcmV0 dXJuIE5VTEw7CiAKLSAgLyogRk9STk9XLiAgQ2FuIGNvbnRpbnVlIGFuYWx5emluZyB0aGUgZGVm LXVzZSBjaGFpbiB3aGVuIHRoaXMgc3RtdCBpbiBhIHBoaQotICAgICBpbnNpZGUgdGhlIGxvb3Ag KGluIGNhc2Ugd2UgYXJlIGFuYWx5emluZyBhbiBvdXRlci1sb29wKS4gICovCi0gIHZlY3RfdW5w cm9tb3RlZF92YWx1ZSB1bnByb21bMl07Ci0gIGlmICghdmVjdF93aWRlbmVkX29wX3RyZWUgKHZp bmZvLCBkaWZmX3N0bXRfdmluZm8sIE1JTlVTX0VYUFIsIFdJREVOX01JTlVTX0VYUFIsCi0JCQkg ICAgIGZhbHNlLCAyLCB1bnByb20sICZoYWxmX3R5cGUpKQorICBpZiAoIWhhbGZfdHlwZSkKICAg ICByZXR1cm4gTlVMTDsKIAogICB2ZWN0X3BhdHRlcm5fZGV0ZWN0ZWQgKCJ2ZWN0X3JlY29nX3Nh ZF9wYXR0ZXJuIiwgbGFzdF9zdG10KTsKQEAgLTEzNjMsNiArMTQxOSwxMzcgQEAgdmVjdF9yZWNv Z19zYWRfcGF0dGVybiAodmVjX2luZm8gKnZpbmZvLAogICByZXR1cm4gcGF0dGVybl9zdG10Owog fQogCisvKiBGdW5jdGlvbiB2ZWN0X3JlY29nX2FiZF9wYXR0ZXJuCisKKyAgIFRyeSB0byBmaW5k IHRoZSBmb2xsb3dpbmcgQUJzb2x1dGUgRGlmZmVyZW5jZSAoQUJEKSBwYXR0ZXJuOgorCisgICAg IFZUWVBFIHgsIHksIG91dDsKKyAgICAgdHlwZSBkaWZmOworICAgbG9vcCBpIGluIHJhbmdlOgor ICAgICBTMSBkaWZmID0geFtpXSAtIHlbaV0KKyAgICAgUzIgb3V0W2ldID0gQUJTX0VYUFIgPGRp ZmY+OworCisgICB3aGVyZSAndHlwZScgaXMgYSBpbnRlZ2VyIGFuZCAnVlRZUEUnIGlzIGEgdmVj dG9yIG9mIGludGVnZXJzCisgICB0aGUgc2FtZSBzaXplIGFzICd0eXBlJworCisgICBJbnB1dDoK KworICAgKiBTVE1UX1ZJTkZPOiBUaGUgc3RtdCBmcm9tIHdoaWNoIHRoZSBwYXR0ZXJuIHNlYXJj aCBiZWdpbnMKKworICAgT3V0cHV0OgorCisgICAqIFRZUEVfb3V0OiBUaGUgdHlwZSBvZiB0aGUg b3V0cHV0IG9mIHRoaXMgcGF0dGVybgorCisgICAqIFJldHVybiB2YWx1ZTogQSBuZXcgc3RtdCB0 aGF0IHdpbGwgYmUgdXNlZCB0byByZXBsYWNlIHRoZSBzZXF1ZW5jZSBvZgorICAgICBzdG10cyB0 aGF0IGNvbnN0aXR1dGUgdGhlIHBhdHRlcm47IGVpdGhlciBTQUJEIG9yIFVBQkQ6CisJU0FCRF9F WFBSPHgsIHksIG91dD4KKwlVQUJEX0VYUFI8eCwgeSwgb3V0PgorCisgICAgICBVQUJEIGV4cHJl c3Npb25zIGFyZSB1c2VkIHdoZW4gdGhlIGlucHV0IHR5cGVzIGFyZQorICAgICAgbmFycm93ZXIg dGhhbiB0aGUgb3V0cHV0IHR5cGVzIG9yIHRoZSBvdXRwdXQgdHlwZSBpcyBuYXJyb3dlcgorICAg ICAgdGhhbiAzMiBiaXRzCisgKi8KKworc3RhdGljIGdpbXBsZSAqCit2ZWN0X3JlY29nX2FiZF9w YXR0ZXJuICh2ZWNfaW5mbyAqdmluZm8sCisJCXN0bXRfdmVjX2luZm8gc3RtdF92aW5mbywgdHJl ZSAqdHlwZV9vdXQpCit7CisgIC8qIExvb2sgZm9yIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMKKwlY ID0geFtpXQorCVkgPSB5W2ldCisJRElGRiA9IFggLSBZCisJREFEID0gQUJTX0VYUFI8RElGRj4K KwlvdXRbaV0gPSBEQUQKKworICAgICBJbiB3aGljaAorICAgICAgLSBYLCBZLCBESUZGLCBEQUQg YWxsIGhhdmUgdGhlIHNhbWUgdHlwZQorICAgICAgLSB4LCB5LCBvdXQgYXJlIGFsbCB2ZWN0b3Jz IG9mIHRoZSBzYW1lIHR5cGUKKyAgKi8KKyAgZ2Fzc2lnbiAqbGFzdF9zdG10ID0gZHluX2Nhc3Qg PGdhc3NpZ24gKj4gKFNUTVRfVklORk9fU1RNVCAoc3RtdF92aW5mbykpOworICBpZiAoIWxhc3Rf c3RtdCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0cmVlIG91dF90eXBlID0gVFJFRV9UWVBFIChn aW1wbGVfYXNzaWduX2xocyAobGFzdF9zdG10KSk7CisKKyAgZ2Fzc2lnbiAqYWJzX3N0bXQgPSBs YXN0X3N0bXQ7CisgIGlmIChnaW1wbGVfYXNzaWduX2Nhc3RfcCAobGFzdF9zdG10KSkKKyAgewor ICAgIHRyZWUgbGFzdF9yaHMgPSBnaW1wbGVfYXNzaWduX3JoczEgKGxhc3Rfc3RtdCk7CisgICAg aWYgKCFTU0FfVkFSX1AgKGxhc3RfcmhzKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgYWJz X3N0bXQgPSBkeW5fY2FzdCA8Z2Fzc2lnbiAqPiAoU1NBX05BTUVfREVGX1NUTVQgKGxhc3Rfcmhz KSk7CisgICAgaWYgKCFhYnNfc3RtdCkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdmVj dF91bnByb21vdGVkX3ZhbHVlIHVucHJvbVsyXTsKKyAgdHJlZSBkaWZmX29wcm5kc1syXTsKKyAg dHJlZSBoYWxmX3R5cGU7CisgIGlmICghdmVjdF9yZWNvZ19hYnNvbHV0ZV9kaWZmZXJlbmNlICh2 aW5mbywgYWJzX3N0bXQsICZoYWxmX3R5cGUsCisJCQkJICAgICAgIGZhbHNlLCB1bnByb20sIGRp ZmZfb3BybmRzKSkKKyAgICByZXR1cm4gTlVMTDsKKworI2RlZmluZSBTQU1FX1RZUEUoQSwgQikg KFRZUEVfUFJFQ0lTSU9OIChBKSA9PSBUWVBFX1BSRUNJU0lPTiAoQikpCisKKyAgdHJlZSBhYmRf b3BybmRzWzJdOworICBpZiAoaGFsZl90eXBlKQorICB7CisgICAgaWYgKCFTQU1FX1RZUEUgKHVu cHJvbVswXS50eXBlLCB1bnByb21bMV0udHlwZSkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAg IHRyZWUgZGlmZl90eXBlID0gVFJFRV9UWVBFIChkaWZmX29wcm5kc1swXSk7CisgICAgaWYgKFRZ UEVfUFJFQ0lTSU9OIChvdXRfdHlwZSkgIT0gVFlQRV9QUkVDSVNJT04gKGRpZmZfdHlwZSkpCisg ICAgeworICAgICAgdmVjdF9jb252ZXJ0X2lucHV0cyAodmluZm8sIHN0bXRfdmluZm8sIDIsIGFi ZF9vcHJuZHMsIGhhbGZfdHlwZSwgdW5wcm9tLAorCQkJICAgZ2V0X3ZlY3R5cGVfZm9yX3NjYWxh cl90eXBlICh2aW5mbywgaGFsZl90eXBlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAg ICBhYmRfb3BybmRzWzBdID0gZGlmZl9vcHJuZHNbMF07CisgICAgICBhYmRfb3BybmRzWzFdID0g ZGlmZl9vcHJuZHNbMV07CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmICh1bnByb21b MF0ub3AgJiYgdW5wcm9tWzFdLm9wCisJJiYgKCFTQU1FX1RZUEUgKHVucHJvbVswXS50eXBlLCB1 bnByb21bMV0udHlwZSkKKwl8fCAhU0FNRV9UWVBFICh1bnByb21bMF0udHlwZSwgb3V0X3R5cGUp KSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgdW5wcm9tWzBdLm9wID0gZGlmZl9vcHJuZHNb MF07CisgICAgdW5wcm9tWzFdLm9wID0gZGlmZl9vcHJuZHNbMV07CisgICAgdHJlZSBzaWduZWRf b3V0ID0gc2lnbmVkX3R5cGVfZm9yIChvdXRfdHlwZSk7CisgICAgdHJlZSBzaWduZWRfb3V0X3Zl Y3R5cGUgPSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFyX3R5cGUgKHZpbmZvLCBzaWduZWRfb3V0KTsK KyAgICB2ZWN0X2NvbnZlcnRfaW5wdXRzICh2aW5mbywgc3RtdF92aW5mbywgMiwgYWJkX29wcm5k cywKKwkJCSBzaWduZWRfb3V0LCB1bnByb20sIHNpZ25lZF9vdXRfdmVjdHlwZSk7CisKKyAgICBp ZiAoIVNBTUVfVFlQRSAoVFJFRV9UWVBFIChkaWZmX29wcm5kc1swXSksIFRSRUVfVFlQRSAoYWJk X29wcm5kc1swXSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIVNBTUVfVFlQ RSAoVFJFRV9UWVBFIChhYmRfb3BybmRzWzBdKSwgVFJFRV9UWVBFIChhYmRfb3BybmRzWzFdKSkK KyAgICAgIHx8ICFTQU1FX1RZUEUgKFRSRUVfVFlQRSAoYWJkX29wcm5kc1swXSksIG91dF90eXBl KSkKKyAgICByZXR1cm4gTlVMTDsKKworICB2ZWN0X3BhdHRlcm5fZGV0ZWN0ZWQgKCJ2ZWN0X3Jl Y29nX2FiZF9wYXR0ZXJuIiwgbGFzdF9zdG10KTsKKworICB0cmVlIHZlY3R5cGUgPSBnZXRfdmVj dHlwZV9mb3Jfc2NhbGFyX3R5cGUgKHZpbmZvLCBvdXRfdHlwZSk7CisgIGlmICghdmVjdHlwZQor ICAgICAgfHwgIWRpcmVjdF9pbnRlcm5hbF9mbl9zdXBwb3J0ZWRfcCAoSUZOX0FCRCwgdmVjdHlw ZSwKKwkJCQkJICBPUFRJTUlaRV9GT1JfU1BFRUQpKQorICAgIHJldHVybiBOVUxMOworCisgICp0 eXBlX291dCA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF92aW5mbyk7CisKKyAgdHJlZSB2YXIg PSB2ZWN0X3JlY29nX3RlbXBfc3NhX3ZhciAob3V0X3R5cGUsIE5VTEwpOworICBnY2FsbCAqYWJk X3N0bXQgPSBnaW1wbGVfYnVpbGRfY2FsbF9pbnRlcm5hbCAoSUZOX0FCRCwgMiwKKwkJCQkJCWFi ZF9vcHJuZHNbMF0sIGFiZF9vcHJuZHNbMV0pOworICBnaW1wbGVfY2FsbF9zZXRfbGhzIChhYmRf c3RtdCwgdmFyKTsKKyAgZ2ltcGxlX3NldF9sb2NhdGlvbiAoYWJkX3N0bXQsIGdpbXBsZV9sb2Nh dGlvbiAobGFzdF9zdG10KSk7CisgIHJldHVybiBhYmRfc3RtdDsKK30KKwogLyogUmVjb2duaXpl IGFuIG9wZXJhdGlvbiB0aGF0IHBlcmZvcm1zIE9SSUdfQ09ERSBvbiB3aWRlbmVkIGlucHV0cywK ICAgIHNvIHRoYXQgaXQgY2FuIGJlIHRyZWF0ZWQgYXMgdGhvdWdoIGl0IGhhZCB0aGUgZm9ybToK IApAQCAtNjQzOSw2ICs2NjI2LDcgQEAgc3RydWN0IHZlY3RfcmVjb2dfZnVuYwogc3RhdGljIHZl Y3RfcmVjb2dfZnVuYyB2ZWN0X3ZlY3RfcmVjb2dfZnVuY19wdHJzW10gPSB7CiAgIHsgdmVjdF9y ZWNvZ19iaXRmaWVsZF9yZWZfcGF0dGVybiwgImJpdGZpZWxkX3JlZiIgfSwKICAgeyB2ZWN0X3Jl Y29nX2JpdF9pbnNlcnRfcGF0dGVybiwgImJpdF9pbnNlcnQiIH0sCisgIHsgdmVjdF9yZWNvZ19h YmRfcGF0dGVybiwgImFiZCIgfSwKICAgeyB2ZWN0X3JlY29nX292ZXJfd2lkZW5pbmdfcGF0dGVy biwgIm92ZXJfd2lkZW5pbmciIH0sCiAgIC8qIE11c3QgY29tZSBhZnRlciBvdmVyX3dpZGVuaW5n LCB3aGljaCBuYXJyb3dzIHRoZSBzaGlmdCBhcyBtdWNoIGFzCiAgICAgIHBvc3NpYmxlIGJlZm9y ZWhhbmQuICAqLwotLSAKMi4yNS4xCgo= --_002_DB7PR08MB345227948079D4E16CD24CBDF5769DB7PR08MB3452eurp_--