From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 131273858CDB for ; Wed, 3 Aug 2022 08:40:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 131273858CDB X-IronPort-AV: E=McAfee;i="6400,9594,10427"; a="375918978" X-IronPort-AV: E=Sophos;i="5.93,213,1654585200"; d="scan'208,223";a="375918978" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2022 01:40:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,213,1654585200"; d="scan'208,223";a="744985415" Received: from fmsmsx602.amr.corp.intel.com ([10.18.126.82]) by fmsmga001.fm.intel.com with ESMTP; 03 Aug 2022 01:40:56 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28; Wed, 3 Aug 2022 01:40:56 -0700 Received: from fmsmsx609.amr.corp.intel.com (10.18.126.89) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28; Wed, 3 Aug 2022 01:40:55 -0700 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx609.amr.corp.intel.com (10.18.126.89) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28 via Frontend Transport; Wed, 3 Aug 2022 01:40:55 -0700 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (104.47.55.108) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.28; Wed, 3 Aug 2022 01:40:55 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GWeUd9iH7/9qzQhhTD+t8Nu5BaDLvwcarrKEO5Sw7i6VrRWtQMddbIHyP4TQUYUD5bdpd9DcvSYl+MeuPI1gLEtnIPjZVWnsDPOGM2ucuGFsmSRcKGRzeip/CVKZ8mplABdt8M6lyZU47h/MBxJLW3fIobYJ9iePiX3l+VHN/CLrClNe0ApD2xIMPX3GxiftJl0M0+Gj3hUR009dQt8T5kB9xaBXY1sejESJmQyZMtJqJ5y8MUNKf8F23wMOTO72wA9uycYEEPmDXpjJo5J6YMdUfeJa6ZHRAa/aKlQ9kaw+lMFD5GXfB4UfwrGBfCKAIPOpzfyBDCD5NYX1vnrmOA== 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=3yv+OtJqTjjrWApIYIiuKecqGcJHpaaolowYHePVP9o=; b=HWCvbgCQDVPspBeNoPIHQrNYzBOq8WVcLotKs2CbjrCm8NxwPa5A5HLu8s70wUAcc29tG30V5gDnEbxOO39UravAB46TN8n1UGq1tHqnV5CkViC93oyRM9BZUfsjWE1yVU6n3W2ITHSeqyEo4RGSQ3yYN6JHrJGY7grjgWAV9fKL37Ze5wk8bdQNx5jSdK1UTFzp+3c0WCfV9LTQA2d14qNtxxrIyk1gmwxyyGXDjM/+icAymX6oeLeg3E4jPSYEP3ef10Ygt0SQahjze2ylEYZbHrHMNzVGO2aaLU8QnLWDh6vobbXb4mCgqw2x7J3WMk+JMKoaktuQ4YmWNh2tGw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from DM4PR11MB5487.namprd11.prod.outlook.com (2603:10b6:5:39f::22) by DM8PR11MB5671.namprd11.prod.outlook.com (2603:10b6:8:3c::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.14; Wed, 3 Aug 2022 08:40:53 +0000 Received: from DM4PR11MB5487.namprd11.prod.outlook.com ([fe80::2974:d93b:a589:f189]) by DM4PR11MB5487.namprd11.prod.outlook.com ([fe80::2974:d93b:a589:f189%7]) with mapi id 15.20.5504.014; Wed, 3 Aug 2022 08:40:53 +0000 From: "Kong, Lingling" To: "Liu, Hongtao" , "gcc-patches@gcc.gnu.org" Subject: RE: [PATCH] x86: Enable __bf16 type for TARGET_SSE2 and above Thread-Topic: [PATCH] x86: Enable __bf16 type for TARGET_SSE2 and above Thread-Index: AQHYoI0DcrOQRHlIPkegbMwKUvZ/vK2P2RDggAzvwkA= Date: Wed, 3 Aug 2022 08:40:53 +0000 Message-ID: References: <20220726011357.12001-1-lingling.kong@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.6.500.17 dlp-reaction: no-action x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: f5f88838-dde4-410d-ddf4-08da752be056 x-ms-traffictypediagnostic: DM8PR11MB5671:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: TB+/gBh1ynFb0Kl1S8DakhE7IjiURA91EOJBg997XTEzW1l9STJ++s2QEiHJcvhOQjDKzGzzWhyhnLa10H3fnkR2SUBV6nEvfOk4dmsNDpj5vJgdreZFLhhK82v/RlkNoR5m4vM4Tv/M/7PYkSQWZdm2pG/QsQEbq0esbLm0IMvGBazCSSKL6TE7WJDmXhrlBuKyRJEKJY6jJJ7Juz/2QVN318TFigd3qhlb6NZHw1vw0ByFbmJwbOSU5jFuU4otmFxAtJd4l3QLFuVFnC7rtThvz3k5buuE0XvQg4JV5+vFP1IQro4jZRp0gpKCpV+W3m/3M+f3FbOo/1s0jagnCYQm/wXp2UAu+g1wMgwxme5noscI4BSQ/vtvr17a0juNKdLImzyzRYBxMVImzib1uA+ISXZblwVQHmnsq0MAQBogYU2J8pGpL5T5/W/I1uTYPAsMQB1QEfKHs2KreLC3ymQSeYZl6wXrsvSmQP0KoqW4husiNOevJJSG8CcQjZDFlyVv+R0ueE6QQywDWHd/4aqda+aMraNvL6ESj+EgJg1nMZkkpQFang05m9r6CRunKPmiSA1nXaH7Kw/2Ss6U3CopHXDqKYiBz5+fFfk301Xjvw8NHxvsJgLCm1LHFCZSdLHXnZ+95ZKC3blO4bXJoZEpxlyew4yi18Y2EEC4+uMslnCunu8X1g2Jmi8VHioCp7QPom6esJnSGlyA0VjY6hW/cNXBmdR791kjAlf8Sg1DV1JOXegeMYm5u7Xiq0UksxLvXHZMUbhLfc87D/UTTHwYGFZFgjXBGbzJgrQeGEgMMS/z0klILw3zGWkbdOMm8+rApRmUMnkZDIyji9Gx8w== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM4PR11MB5487.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(366004)(346002)(136003)(396003)(376002)(39860400002)(2906002)(86362001)(53546011)(38070700005)(83380400001)(66556008)(66946007)(76116006)(4326008)(66446008)(84970400001)(7696005)(71200400001)(8676002)(66476007)(6506007)(64756008)(52536014)(186003)(8936002)(30864003)(5660300002)(966005)(33656002)(478600001)(26005)(41300700001)(107886003)(9686003)(316002)(99936003)(82960400001)(55016003)(122000001)(110136005)(38100700002)(579004)(559001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?j1Jl9gzyDpSxk1EAfnl1gMqazuNjxcIup1dUnbgjSWC1AAy4bNDry0tZGtvf?= =?us-ascii?Q?ctdYt4z/e51gr7nyuIaFsFc2rm0IjDuVEzLmbizQjyzPt4CDrj3fimG3ZUvM?= =?us-ascii?Q?a9AF/+KtBZmaZm6XYXeiRwhD78Pi+slup+UA4xBGd0f+0sbTl4BrAqQDYVuY?= =?us-ascii?Q?lWLqxf9yV/yjLp667BnrEfMxg80tDj8WuYi3C2W3ceLKCufwztYiGd9e9Qwc?= =?us-ascii?Q?/SY/mFrqmfmEr7CLMxP4a4jAKuY5jWx1CIYLEzQM6ghe6T9G5QS+QfevlRRA?= =?us-ascii?Q?Bj4o4sBQ9PMHOn5D68OxtNt0nd7i0leUFccc5YQDg6b2nrF/5vyWQKi1AbTq?= =?us-ascii?Q?ala+zcmj5pMFSl5RogOOXU0RnI9z7kr+hGGybVa/edhjRHKOh+QS+BMhlv7H?= =?us-ascii?Q?suVvM6AQvQwFuzGEIchMU3nHdqL8C4AitkvPyrG3+ZUph6JLxKtFR6I/a37e?= =?us-ascii?Q?mX+FG1hIi5KcNNV/645iBELwHExWv7pUy8oibVnLGMnWGMUtl1seHFGb76F1?= =?us-ascii?Q?mq23AbNs0SvrGRDvAuRR1FUcgyQq3BO4w3boE45Jx2saGvSQ/mdGCRtO+5up?= =?us-ascii?Q?H0DwaJeAZl+3gGT/21rzXlF4kVViC5YVbQmm3EwslOJXGjvFt7dZDkKFCjcj?= =?us-ascii?Q?KMIsvANCd6vQfgzh9eqkYkT9aCryR7YyQ8VdtEATnRdvaVw7m/ZDomGQnpYO?= =?us-ascii?Q?tRErA3Ket1mh/6dD/PAxLJK40UCoGBAvbuF9zSDUv1/guHuTeSM/0K+eBz/j?= =?us-ascii?Q?DRJJhqCOVuRh115bYqhasMqfQlJi6D0mJHz/4a6BgWPO84Q+3XLsQPkkOAhT?= =?us-ascii?Q?Nvx5tTqTN2f8qBPAAx89gRe9SADMx+n5zXJSElVBcaZcH18ozYW6FBYvjZqM?= =?us-ascii?Q?BNmxQxiTx/HKhtSk/nYZo4v/Qk/wTi9c/uScpukRncUh1g8HkAur9r1B8T4w?= =?us-ascii?Q?bRCVkfzl0kgvS6gcGl0NTDvgJbgrMW2K6rxZe6Z1iuPLkre4s2mFlosdyd8Z?= =?us-ascii?Q?joJunqf3g4EV/Jdww4ZPi6kXrqdbQhX/didt171L+mSQXqdGTw70p8h1z2OH?= =?us-ascii?Q?lQwcqnlrvtt83s8V/71Jm4gln3EQUb4lQmxvx2yAd9MnWiS5HQOywQcZUOeo?= =?us-ascii?Q?xoZD4DEPSzKV+luZpUSa4e/fO2y/pxII2t7hS5jVXWOSAhjzWYSBQ1KYXBp6?= =?us-ascii?Q?yvzHXqKqIquXpwqLIMj+x0Iw7x5GVfOz87WgtVvCVgypOtKLCHEIDVv7UJj/?= =?us-ascii?Q?koJ2h+ndYmzsXqA2CHUxHRANJLWyHiE+IAVqAyWf/jLVXIjbFYW3nWNtoyTx?= =?us-ascii?Q?Kpxk5M2G5msKV09tVCDscHgfwPNgo7lyB2TMUN0iwcwO4eUVmwa2jI8gZOYc?= =?us-ascii?Q?Q+TILglM4TJdHPiY+i2uLMq8dLkRKeeSrBG9y18Bfl8HOAInl1fXppkoVi8W?= =?us-ascii?Q?8Fi4zxhVDN3S1STljaVI2RYD81cvL7RvYzRxgowYVdG4Uk8Us9oz+4KEnexL?= =?us-ascii?Q?4pgOFteaVVfBlyjeT3uKKeb+yvQTrdG9j37biw+C6X4Xh3GoE1B3FVvBW5Id?= =?us-ascii?Q?CG5pM5qIOJui8tR+n9llNGhSo7YX2R5mKIkn/480?= Content-Type: multipart/mixed; boundary="_002_DM4PR11MB5487E41874F9942CBC57A07BEC9C9DM4PR11MB5487namp_" MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5487.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f5f88838-dde4-410d-ddf4-08da752be056 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Aug 2022 08:40:53.3710 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: hgIm4SuXMiyOpQubXvvXDd0udyL6aVTLK/5QI7LceWTQomCHMGsLco0I8DSq19jDEJb46v0Oqoh094OwtTl2IA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR11MB5671 X-OriginatorOrg: intel.com X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: Wed, 03 Aug 2022 08:41:04 -0000 --_002_DM4PR11MB5487E41874F9942CBC57A07BEC9C9DM4PR11MB5487namp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, Old patch has some mistake in `*movbf_internal` , now disable BFmode consta= nt double move in `*movbf_internal`. Thanks, Lingling > -----Original Message----- > From: Kong, Lingling > Sent: Tuesday, July 26, 2022 9:31 AM > To: Liu, Hongtao ; gcc-patches@gcc.gnu.org > Cc: Kong, Lingling > Subject: [PATCH] x86: Enable __bf16 type for TARGET_SSE2 and above >=20 > Hi, >=20 > The patch is enable __bf16 scalar type for target sse2 and above accordin= g to > psABI(https://gitlab.com/x86-psABIs/x86-64-ABI/-/merge_requests/35/diffs)= . > The __bf16 type is a storage type like arm. >=20 > OK for master? >=20 > gcc/ChangeLog: >=20 > * config/i386/i386-builtin-types.def (BFLOAT16): New primitive type. > * config/i386/i386-builtins.cc : Support __bf16 type for i386 backend. > (ix86_register_bf16_builtin_type): New function. > (ix86_bf16_type_node): New. > (ix86_bf16_ptr_type_node): Ditto. > (ix86_init_builtin_types): Add ix86_register_bf16_builtin_type function > call. > * config/i386/i386-modes.def (FLOAT_MODE): Add BFmode. > (ADJUST_FLOAT_FORMAT): Ditto. > * config/i386/i386.cc (merge_classes): Handle BFmode. > (classify_argument): Ditto. > (examine_argument): Ditto. > (construct_container): Ditto. > (function_value_32): Return __bf16 by %xmm0. > (function_value_64): Return __bf16 by SSE register. > (ix86_print_operand): Handle CONST_DOUBLE BFmode. > (ix86_secondary_reload): Require gpr as intermediate register > to store __bf16 from sse register when sse4 is not available. > (ix86_scalar_mode_supported_p): Enable __bf16 under sse2. > (ix86_mangle_type): Add manlging for __bf16 type. > (ix86_invalid_conversion): New function for target hook. > (ix86_invalid_unary_op): Ditto. > (ix86_invalid_binary_op): Ditto. > (TARGET_INVALID_CONVERSION): New define for target hook. > (TARGET_INVALID_UNARY_OP): Ditto. > (TARGET_INVALID_BINARY_OP): Ditto. > * config/i386/i386.h (host_detect_local_cpu): Add BFmode. > * config/i386/i386.md (*pushhf_rex64): Change for BFmode. > (*push_rex64): Ditto. > (*pushhf): Ditto. > (*push): Ditto. > (*movhf_internal): Ditto. > (*mov_internal): Ditto. >=20 > gcc/testsuite/ChangeLog: >=20 > * g++.target/i386/bfloat_cpp_typecheck.C: New test. > * gcc.target/i386/bfloat16-1.c: Ditto. > * gcc.target/i386/sse2-bfloat16-1.c: Ditto. > * gcc.target/i386/sse2-bfloat16-2.c: Ditto. > * gcc.target/i386/sse2-bfloat16-scalar-typecheck.c: Ditto. > --- > gcc/config/i386/i386-builtin-types.def | 1 + > gcc/config/i386/i386-builtins.cc | 21 ++ > gcc/config/i386/i386-modes.def | 2 + > gcc/config/i386/i386.cc | 75 +++++- > gcc/config/i386/i386.h | 4 +- > gcc/config/i386/i386.md | 32 +-- > .../g++.target/i386/bfloat_cpp_typecheck.C | 10 + > gcc/testsuite/gcc.target/i386/bfloat16-1.c | 12 + > .../gcc.target/i386/sse2-bfloat16-1.c | 8 + > .../gcc.target/i386/sse2-bfloat16-2.c | 17 ++ > .../i386/sse2-bfloat16-scalar-typecheck.c | 215 ++++++++++++++++++ > 11 files changed, 375 insertions(+), 22 deletions(-) create mode 100644 > gcc/testsuite/g++.target/i386/bfloat_cpp_typecheck.C > create mode 100644 gcc/testsuite/gcc.target/i386/bfloat16-1.c > create mode 100644 gcc/testsuite/gcc.target/i386/sse2-bfloat16-1.c > create mode 100644 gcc/testsuite/gcc.target/i386/sse2-bfloat16-2.c > create mode 100644 gcc/testsuite/gcc.target/i386/sse2-bfloat16-scalar- > typecheck.c >=20 > diff --git a/gcc/config/i386/i386-builtin-types.def b/gcc/config/i386/i38= 6- > builtin-types.def > index 7a2da1db0b0..63a360b0f8b 100644 > --- a/gcc/config/i386/i386-builtin-types.def > +++ b/gcc/config/i386/i386-builtin-types.def > @@ -69,6 +69,7 @@ DEF_PRIMITIVE_TYPE (UINT16, > short_unsigned_type_node) DEF_PRIMITIVE_TYPE (INT64, > long_long_integer_type_node) DEF_PRIMITIVE_TYPE (UINT64, > long_long_unsigned_type_node) DEF_PRIMITIVE_TYPE (FLOAT16, > ix86_float16_type_node) > +DEF_PRIMITIVE_TYPE (BFLOAT16, ix86_bf16_type_node) > DEF_PRIMITIVE_TYPE (FLOAT, float_type_node) DEF_PRIMITIVE_TYPE > (DOUBLE, double_type_node) DEF_PRIMITIVE_TYPE (FLOAT80, > float80_type_node) diff --git a/gcc/config/i386/i386-builtins.cc > b/gcc/config/i386/i386-builtins.cc > index fe7243c3837..6a04fb57e65 100644 > --- a/gcc/config/i386/i386-builtins.cc > +++ b/gcc/config/i386/i386-builtins.cc > @@ -126,6 +126,9 @@ BDESC_VERIFYS (IX86_BUILTIN_MAX, static GTY(()) tree > ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1]; >=20 > tree ix86_float16_type_node =3D NULL_TREE; > +tree ix86_bf16_type_node =3D NULL_TREE; > +tree ix86_bf16_ptr_type_node =3D NULL_TREE; > + > /* Retrieve an element from the above table, building some of > the types lazily. */ >=20 > @@ -1366,6 +1369,22 @@ ix86_register_float16_builtin_type (void) > "_Float16"); > } >=20 > +static void > +ix86_register_bf16_builtin_type (void) > +{ > + ix86_bf16_type_node =3D make_node (REAL_TYPE); > + TYPE_PRECISION (ix86_bf16_type_node) =3D 16; > + SET_TYPE_MODE (ix86_bf16_type_node, BFmode); > + layout_type (ix86_bf16_type_node); > + > + if (!maybe_get_identifier ("__bf16") && TARGET_SSE2) > + { > + lang_hooks.types.register_builtin_type (ix86_bf16_type_node, > + "__bf16"); > + ix86_bf16_ptr_type_node =3D build_pointer_type (ix86_bf16_type_nod= e); > + } > +} > + > static void > ix86_init_builtin_types (void) > { > @@ -1396,6 +1415,8 @@ ix86_init_builtin_types (void) >=20 > ix86_register_float16_builtin_type (); >=20 > + ix86_register_bf16_builtin_type (); > + > const_string_type_node > =3D build_pointer_type (build_qualified_type > (char_type_node, TYPE_QUAL_CONST)); diff --git > a/gcc/config/i386/i386-modes.def b/gcc/config/i386/i386-modes.def index > e2e1e18d24d..b49daaef253 100644 > --- a/gcc/config/i386/i386-modes.def > +++ b/gcc/config/i386/i386-modes.def > @@ -24,6 +24,8 @@ along with GCC; see the file COPYING3. If not see > FRACTIONAL_FLOAT_MODE (XF, 80, 12, ieee_extended_intel_96_format); > FLOAT_MODE (TF, 16, ieee_quad_format); FLOAT_MODE (HF, 2, > ieee_half_format); > +FLOAT_MODE (BF, 2, 0); > +ADJUST_FLOAT_FORMAT (BF, &arm_bfloat_half_format); >=20 > /* In ILP32 mode, XFmode has size 12 and alignment 4. > In LP64 mode, XFmode has size and alignment 16. */ diff --git > a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index > e03f86d4a23..5d589f6a05c 100644 > --- a/gcc/config/i386/i386.cc > +++ b/gcc/config/i386/i386.cc > @@ -2399,6 +2399,7 @@ classify_argument (machine_mode mode, const_tree > type, > case E_CTImode: > return 0; > case E_HFmode: > + case E_BFmode: > if (!(bit_offset % 64)) > classes[0] =3D X86_64_SSEHF_CLASS; > else > @@ -2792,9 +2793,10 @@ construct_container (machine_mode mode, > machine_mode orig_mode, > intreg++; > break; > case X86_64_SSEHF_CLASS: > + tmpmode =3D (mode =3D=3D BFmode ? BFmode : HFmode); > exp [nexps++] > =3D gen_rtx_EXPR_LIST (VOIDmode, > - gen_rtx_REG (HFmode, > + gen_rtx_REG (tmpmode, > GET_SSE_REGNO (sse_regno)), > GEN_INT (i*8)); > sse_regno++; > @@ -4001,8 +4003,8 @@ function_value_32 (machine_mode orig_mode, > machine_mode mode, > /* Most things go in %eax. */ > regno =3D AX_REG; >=20 > - /* Return _Float16/_Complex _Foat16 by sse register. */ > - if (mode =3D=3D HFmode) > + /* Return __bf16/ _Float16/_Complex _Foat16 by sse register. */ if > + (mode =3D=3D HFmode || mode =3D=3D BFmode) > regno =3D FIRST_SSE_REG; > if (mode =3D=3D HCmode) > { > @@ -4050,6 +4052,7 @@ function_value_64 (machine_mode orig_mode, > machine_mode mode, >=20 > switch (mode) > { > + case E_BFmode: > case E_HFmode: > case E_HCmode: > case E_SFmode: > @@ -5631,6 +5634,7 @@ ix86_output_ssemov (rtx_insn *insn, rtx *operands) > return "%vmovss\t{%1, %0|%0, %1}"; >=20 > case MODE_HF: > + case MODE_BF: > if (REG_P (operands[0]) && REG_P (operands[1])) > return "vmovsh\t{%d1, %0|%0, %d1}"; > else > @@ -19402,7 +19406,8 @@ ix86_secondary_reload (bool in_p, rtx x, > reg_class_t rclass, > } >=20 > /* Require movement to gpr, and then store to memory. */ > - if ((mode =3D=3D HFmode || mode =3D=3D HImode || mode =3D=3D V2QImode) > + if ((mode =3D=3D HFmode || mode =3D=3D HImode || mode =3D=3D V2QImode > + || mode =3D=3D BFmode) > && !TARGET_SSE4_1 > && SSE_CLASS_P (rclass) > && !in_p && MEM_P (x)) > @@ -22331,7 +22336,7 @@ ix86_scalar_mode_supported_p (scalar_mode > mode) > return default_decimal_float_supported_p (); > else if (mode =3D=3D TFmode) > return true; > - else if (mode =3D=3D HFmode && TARGET_SSE2) > + else if ((mode =3D=3D HFmode || mode =3D=3D BFmode) && TARGET_SSE2) > return true; > else > return default_scalar_mode_supported_p (mode); @@ -22646,6 +22651,8 > @@ ix86_mangle_type (const_tree type) >=20 > switch (TYPE_MODE (type)) > { > + case E_BFmode: > + return "u6__bf16"; > case E_HFmode: > /* _Float16 is "DF16_". > Align with clang's decision in https://reviews.llvm.org/D33719. */ @@ = - > 22661,6 +22668,55 @@ ix86_mangle_type (const_tree type) > } > } >=20 > +/* Return the diagnostic message string if conversion from FROMTYPE to > + TOTYPE is not allowed, NULL otherwise. */ > + > +static const char * > +ix86_invalid_conversion (const_tree fromtype, const_tree totype) { > + if (element_mode (fromtype) !=3D element_mode (totype)) > + { > + /* Do no allow conversions to/from BFmode scalar types. */ > + if (TYPE_MODE (fromtype) =3D=3D BFmode) > + return N_("invalid conversion from type %<__bf16%>"); > + if (TYPE_MODE (totype) =3D=3D BFmode) > + return N_("invalid conversion to type %<__bf16%>"); > + } > + > + /* Conversion allowed. */ > + return NULL; > +} > + > +/* Return the diagnostic message string if the unary operation OP is > + not permitted on TYPE, NULL otherwise. */ > + > +static const char * > +ix86_invalid_unary_op (int op, const_tree type) { > + /* Reject all single-operand operations on BFmode except for &. */ > + if (element_mode (type) =3D=3D BFmode && op !=3D ADDR_EXPR) > + return N_("operation not permitted on type %<__bf16%>"); > + > + /* Operation allowed. */ > + return NULL; > +} > + > +/* Return the diagnostic message string if the binary operation OP is > + not permitted on TYPE1 and TYPE2, NULL otherwise. */ > + > +static const char * > +ix86_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1, > + const_tree type2) > +{ > + /* Reject all 2-operand operations on BFmode. */ > + if (element_mode (type1) =3D=3D BFmode > + || element_mode (type2) =3D=3D BFmode) > + return N_("operation not permitted on type %<__bf16%>"); > + > + /* Operation allowed. */ > + return NULL; > +} > + > static GTY(()) tree ix86_tls_stack_chk_guard_decl; >=20 > static tree > @@ -24718,6 +24774,15 @@ ix86_libgcc_floating_mode_supported_p > #undef TARGET_MANGLE_TYPE > #define TARGET_MANGLE_TYPE ix86_mangle_type >=20 > +#undef TARGET_INVALID_CONVERSION > +#define TARGET_INVALID_CONVERSION ix86_invalid_conversion > + > +#undef TARGET_INVALID_UNARY_OP > +#define TARGET_INVALID_UNARY_OP ix86_invalid_unary_op > + > +#undef TARGET_INVALID_BINARY_OP > +#define TARGET_INVALID_BINARY_OP ix86_invalid_binary_op > + > #undef TARGET_STACK_PROTECT_GUARD > #define TARGET_STACK_PROTECT_GUARD ix86_stack_protect_guard >=20 > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index > f16df633e84..0da3dce1d31 100644 > --- a/gcc/config/i386/i386.h > +++ b/gcc/config/i386/i386.h > @@ -1046,7 +1046,7 @@ extern const char *host_detect_local_cpu (int argc, > const char **argv); > || (MODE) =3D=3D V8HFmode || (MODE) =3D=3D V4HFmode || (MODE) =3D=3D = V2HFmode > \ > || (MODE) =3D=3D V4QImode || (MODE) =3D=3D V2HImode || (MODE) =3D=3D = V1SImode > \ > || (MODE) =3D=3D V2DImode || (MODE) =3D=3D V2QImode || (MODE) =3D=3D = DFmode > \ > - || (MODE) =3D=3D HFmode) > + || (MODE) =3D=3D HFmode || (MODE) =3D=3D BFmode) >=20 > #define VALID_SSE_REG_MODE(MODE) \ > ((MODE) =3D=3D V1TImode || (MODE) =3D=3D TImode \ > @@ -1077,7 +1077,7 @@ extern const char *host_detect_local_cpu (int argc, > const char **argv); > || (MODE) =3D=3D CQImode || (MODE) =3D=3D CHImode > \ > || (MODE) =3D=3D CSImode || (MODE) =3D=3D CDImode > \ > || (MODE) =3D=3D SDmode || (MODE) =3D=3D DDmode \ > - || (MODE) =3D=3D HFmode || (MODE) =3D=3D HCmode \ > + || (MODE) =3D=3D HFmode || (MODE) =3D=3D HCmode || (MODE) =3D=3D BFmo= de > \ > || (MODE) =3D=3D V2HImode || (MODE) =3D=3D V2HFmode > \ > || (MODE) =3D=3D V1SImode || (MODE) =3D=3D V4QImode || (MODE) =3D=3D = V2QImode > \ > || (TARGET_64BIT \ > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index > 9aaeb695f0f..1f7b018913a 100644 > --- a/gcc/config/i386/i386.md > +++ b/gcc/config/i386/i386.md > @@ -499,7 +499,7 @@ >=20 > ;; Main data type used by the insn > (define_attr "mode" > - "unknown,none,QI,HI,SI,DI,TI,OI,XI,HF,SF,DF,XF,TF,V32HF,V16HF,V8HF, > + > + "unknown,none,QI,HI,SI,DI,TI,OI,XI,HF,BF,SF,DF,XF,TF,V32HF,V16HF,V8HF, > V16SF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,V8DF,V4HF,V2HF" > (const_string "unknown")) >=20 > @@ -1104,7 +1104,7 @@ > ;; GET_MODE_SIZE (mode). For XFmode which depends on ;; > command line options just use GET_MODE_SIZE macro. > (define_mode_attr MODE_SIZE [(QI "1") (HI "2") (SI "4") (DI "8") > - (TI "16") (HF "2") (SF "4") (DF "8") > + (TI "16") (HF "2") (BF "2") (SF "4") (DF "8") > (XF "GET_MODE_SIZE (XFmode)") > (V16QI "16") (V32QI "32") (V64QI "64") > (V8HI "16") (V16HI "32") (V32HI "64") @@ -1248,7 > +1248,7 @@ (define_mode_iterator X87MODEF [SF DF XF]) >=20 > ;; All x87 floating point modes plus HFmode -(define_mode_iterator > X87MODEFH [HF SF DF XF]) > +(define_mode_iterator X87MODEFH [HF SF DF XF BF]) >=20 > ;; All SSE floating point modes > (define_mode_iterator SSEMODEF [HF SF DF TF]) @@ -3408,9 +3408,11 @@ > operands[0] =3D replace_equiv_address (operands[0], stack_pointer_rtx)= ; > }) >=20 > -(define_insn "*pushhf_rex64" > - [(set (match_operand:HF 0 "push_operand" "=3DX,X") > - (match_operand:HF 1 "nonmemory_no_elim_operand" "r,x"))] > +(define_mode_iterator HFBF [HF BF]) > + > +(define_insn "*push_rex64" > + [(set (match_operand:HFBF 0 "push_operand" "=3DX,X") > + (match_operand:HFBF 1 "nonmemory_no_elim_operand" "r,x"))] > "TARGET_64BIT" > { > /* Anything else should be already split before reg-stack. */ @@ -342= 1,9 > +3423,9 @@ > (set_attr "type" "push,multi") > (set_attr "mode" "DI,TI")]) >=20 > -(define_insn "*pushhf" > - [(set (match_operand:HF 0 "push_operand" "=3DX,X") > - (match_operand:HF 1 "general_no_elim_operand" "rmF,x"))] > +(define_insn "*push" > + [(set (match_operand:HFBF 0 "push_operand" "=3DX,X") > + (match_operand:HFBF 1 "general_no_elim_operand" "rmF,x"))] > "!TARGET_64BIT" > { > /* Anything else should be already split before reg-stack. */ @@ -346= 2,7 > +3464,7 @@ > (set_attr "unit" "i387,*,*") > (set_attr "mode" "SF,SI,SF")]) >=20 > -(define_mode_iterator MODESH [SF HF]) > +(define_mode_iterator MODESH [SF HF BF]) > ;; %%% Kill this when call knows how to work this out. > (define_split > [(set (match_operand:MODESH 0 "push_operand") @@ -3950,18 +3952,18 > @@ > ] > (const_string "*")))]) >=20 > -(define_insn "*movhf_internal" > - [(set (match_operand:HF 0 "nonimmediate_operand" > +(define_insn "*mov_internal" > + [(set (match_operand:HFBF 0 "nonimmediate_operand" > "=3D?r,?r,?r,?m,v,v,?r,m,?v,v") > - (match_operand:HF 1 "general_operand" > + (match_operand:HFBF 1 "general_operand" > "r ,F ,m ,rF,C,v, v,v,r ,m"))] > "!(MEM_P (operands[0]) && MEM_P (operands[1])) > && (lra_in_progress > || reload_completed > || !CONST_DOUBLE_P (operands[1]) > || (TARGET_SSE2 > - && standard_sse_constant_p (operands[1], HFmode) =3D=3D 1) > - || memory_operand (operands[0], HFmode))" > + && standard_sse_constant_p (operands[1], mode) =3D=3D 1) > + || memory_operand (operands[0], mode))" > { > switch (get_attr_type (insn)) > { > diff --git a/gcc/testsuite/g++.target/i386/bfloat_cpp_typecheck.C > b/gcc/testsuite/g++.target/i386/bfloat_cpp_typecheck.C > new file mode 100644 > index 00000000000..962c8504775 > --- /dev/null > +++ b/gcc/testsuite/g++.target/i386/bfloat_cpp_typecheck.C > @@ -0,0 +1,10 @@ > +/* { dg-do assemble { target sse2} } */ > +/* { dg-options "-msse2 -O3 --save-temps" } */ > + > +void foo (void) > +{ > + __bf16 (); /* { dg-bogus {invalid conversion to type '__bf16'} } */ > + __bf16 a =3D __bf16(); /* { dg-bogus {invalid conversion to type > +'__bf16'} } */ > + __bf16 (0x1234); /* { dg-error {invalid conversion to type '__bf16'} > +} */ > + __bf16 (0.1); /* { dg-error {invalid conversion to type '__bf16'} } > +*/ } > diff --git a/gcc/testsuite/gcc.target/i386/bfloat16-1.c > b/gcc/testsuite/gcc.target/i386/bfloat16-1.c > new file mode 100644 > index 00000000000..6aaec28efd2 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/bfloat16-1.c > @@ -0,0 +1,12 @@ > +/* { dg-do compile } */ > +/* { dg-options "-msse2 -O2" } */ > +__bf16 > +foo (int a) > +{ > + union { > + int a; > + __bf16 b; > + }c; > + c.a =3D a; > + return c.b; > +} > diff --git a/gcc/testsuite/gcc.target/i386/sse2-bfloat16-1.c > b/gcc/testsuite/gcc.target/i386/sse2-bfloat16-1.c > new file mode 100644 > index 00000000000..612d55be826 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/sse2-bfloat16-1.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -mno-sse2" } */ > + > +__bf16/* { dg-error "unknown type name '__bf16'" } */ foo (__bf16 x) /* > +{ dg-error "unknown type name '__bf16'" } */ { > + return x; > +} > diff --git a/gcc/testsuite/gcc.target/i386/sse2-bfloat16-2.c > b/gcc/testsuite/gcc.target/i386/sse2-bfloat16-2.c > new file mode 100644 > index 00000000000..a3286e26c48 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/sse2-bfloat16-2.c > @@ -0,0 +1,17 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -msse2 -mno-avx512f" } */ > + > +union flt > +{ > + __bf16 flt; > + short s; > +}; > + > +__bf16 > +foo (union flt x) > +{ > + return x.flt; > +} > + > +/* { dg-final { scan-assembler {(?n)pinsrw[\t ].*%xmm0} { target ia32 } > +} } */ > +/* { dg-final { scan-assembler {(?n)movd[\t ].*%xmm0} { target { ! ia32 > +} } } } */ > diff --git a/gcc/testsuite/gcc.target/i386/sse2-bfloat16-scalar-typecheck= .c > b/gcc/testsuite/gcc.target/i386/sse2-bfloat16-scalar-typecheck.c > new file mode 100644 > index 00000000000..f76d5547758 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/sse2-bfloat16-scalar-typecheck.c > @@ -0,0 +1,215 @@ > +/* { dg-do compile } */ > +/* { dg-options "-msse2 -O2" } */ > + > + > +__bf16 glob_bfloat; > + > +int is_an_int; > +short is_a_short_int; > +float is_a_float; > +float is_a_float16; > +double is_a_double; > + > +float *float_ptr; > + > +__bf16 foo1 (void) { return (__bf16) 0x1234; } /* { dg-error {invalid > +conversion to type '__bf16'} } */ > +__bf16 foo2 (void) { return (__bf16) (short) 0x1234; } /* { dg-error > +{invalid conversion to type '__bf16'} } */ > + > +__bf16 footest (__bf16 scalar0) > +{ > + > + /* Initialisation */ > + > + __bf16 scalar1_1; > + __bf16 scalar1_2 =3D glob_bfloat; > + __bf16 scalar1_3 =3D 0; /* { dg-error {invalid conversion to type '_= _bf16'} } */ > + __bf16 scalar1_4 =3D 0.1; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + __bf16 scalar1_5 =3D is_a_float; /* { dg-error {invalid conversion to > + type '__bf16'} } */ > + __bf16 scalar1_6 =3D is_an_int; /* { dg-error {invalid conversion to > + type '__bf16'} } */ > + __bf16 scalar1_7 =3D is_a_float16; /* { dg-error {invalid conversion t= o > + type '__bf16'} } */ > + __bf16 scalar1_8 =3D is_a_double; /* { dg-error {invalid conversion to > + type '__bf16'} } */ > + __bf16 scalar1_9 =3D is_a_short_int; /* { dg-error {invalid conversion > + to type '__bf16'} } */ > + > + int initi_1_1 =3D glob_bfloat; /* { dg-error {invalid conversion from > + type '__bf16'} } */ float initi_1_2 =3D glob_bfloat; /* { dg-error > + {invalid conversion from type '__bf16'} } */ > + _Float16 initi_1_3 =3D glob_bfloat; /* { dg-error {invalid conversion > + from type '__bf16'} } */ short initi_1_4 =3D glob_bfloat; /* { dg-erro= r > + {invalid conversion from type '__bf16'} } */ double initi_1_5 =3D > + glob_bfloat; /* { dg-error {invalid conversion from type '__bf16'} } > + */ > + > + __bf16 scalar2_1 =3D {}; /* { dg-error {empty scalar initializer} } */ > + __bf16 scalar2_2 =3D { glob_bfloat }; > + __bf16 scalar2_3 =3D { 0 }; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + __bf16 scalar2_4 =3D { 0.1 }; /* { dg-error {invalid conversion to typ= e > + '__bf16'} } */ > + __bf16 scalar2_5 =3D { is_a_float }; /* { dg-error {invalid conversion > + to type '__bf16'} } */ > + __bf16 scalar2_6 =3D { is_an_int }; /* { dg-error {invalid conversion > + to type '__bf16'} } */ > + __bf16 scalar2_7 =3D { is_a_float16 }; /* { dg-error {invalid > + conversion to type '__bf16'} } */ > + __bf16 scalar2_8 =3D { is_a_double }; /* { dg-error {invalid conversio= n > + to type '__bf16'} } */ > + __bf16 scalar2_9 =3D { is_a_short_int }; /* { dg-error {invalid > + conversion to type '__bf16'} } */ > + > + int initi_2_1 =3D { glob_bfloat }; /* { dg-error {invalid conversion > + from type '__bf16'} } */ float initi_2_2 =3D { glob_bfloat }; /* { > + dg-error {invalid conversion from type '__bf16'} } */ > + _Float16 initi_2_3 =3D { glob_bfloat }; /* { dg-error {invalid > + conversion from type '__bf16'} } */ short initi_2_4 =3D { glob_bfloat > + }; /* { dg-error {invalid conversion from type '__bf16'} } */ double > + initi_2_5 =3D { glob_bfloat }; /* { dg-error {invalid conversion from > + type '__bf16'} } */ > + > + /* Assignments. */ > + > + glob_bfloat =3D glob_bfloat; > + glob_bfloat =3D 0; /* { dg-error {invalid conversion to type '__bf16= '} } */ > + glob_bfloat =3D 0.1; /* { dg-error {invalid conversion to type > + '__bf16'} } */ glob_bfloat =3D is_a_float; /* { dg-error {invalid > + conversion to type '__bf16'} } */ glob_bfloat =3D is_an_int; /* { > + dg-error {invalid conversion to type '__bf16'} } */ glob_bfloat =3D > + is_a_float16; /* { dg-error {invalid conversion to type '__bf16'} } */ > + glob_bfloat =3D is_a_double; /* { dg-error {invalid conversion to type > + '__bf16'} } */ glob_bfloat =3D is_a_short_int; /* { dg-error {invalid > + conversion to type '__bf16'} } */ > + > + is_an_int =3D glob_bfloat; /* { dg-error {invalid conversion from type > + '__bf16'} } */ is_a_float =3D glob_bfloat; /* { dg-error {invalid > + conversion from type '__bf16'} } */ > + is_a_float16 =3D glob_bfloat; /* { dg-error {invalid conversion from > + type '__bf16'} } */ is_a_double =3D glob_bfloat; /* { dg-error {invali= d > + conversion from type '__bf16'} } */ is_a_short_int =3D glob_bfloat; /* > + { dg-error {invalid conversion from type '__bf16'} } */ > + > + /* Casting. */ > + > + (void) glob_bfloat; > + (__bf16) glob_bfloat; > + > + (int) glob_bfloat; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (float) glob_bfloat; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (_Float16) glob_bfloat; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (double) glob_bfloat; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (short) glob_bfloat; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + > + (__bf16) is_an_int; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) is_a_float; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) is_a_float16; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) is_a_double; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) is_a_short_int; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + > + /* Compound literals. */ > + > + (__bf16) {}; /* { dg-error {empty scalar initializer} } */ > + (__bf16) { glob_bfloat }; > + (__bf16) { 0 }; /* { dg-error {invalid conversion to type '__bf16'} } > + */ > + (__bf16) { 0.1 }; /* { dg-error {invalid conversion to type '__bf16'} > + } */ > + (__bf16) { is_a_float }; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) { is_an_int }; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) { is_a_float16 }; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) { is_a_double }; /* { dg-error {invalid conversion to type > + '__bf16'} } */ > + (__bf16) { is_a_short_int }; /* { dg-error {invalid conversion to > + type '__bf16'} } */ > + > + (int) { glob_bfloat }; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (float) { glob_bfloat }; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (_Float16) { glob_bfloat }; /* { dg-error {invalid conversion from > + type '__bf16'} } */ > + (double) { glob_bfloat }; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + (short) { glob_bfloat }; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + > + /* Arrays and Structs. */ > + > + typedef __bf16 array_type[2]; > + extern __bf16 extern_array[]; > + > + __bf16 array[2]; > + __bf16 zero_length_array[0]; > + __bf16 empty_init_array[] =3D {}; > + typedef __bf16 some_other_type[is_an_int]; > + > + struct struct1 { > + __bf16 a; > + }; > + > + union union1 { > + __bf16 a; > + }; > + > + /* Addressing and dereferencing. */ > + > + __bf16 *bfloat_ptr =3D &scalar0; > + scalar0 =3D *bfloat_ptr; > + > + /* Pointer assignment. */ > + > + __bf16 *bfloat_ptr2 =3D bfloat_ptr; > + __bf16 *bfloat_ptr3 =3D array; > + > + /* Pointer arithmetic. */ > + > + ++bfloat_ptr; > + --bfloat_ptr; > + bfloat_ptr++; > + bfloat_ptr--; > + bfloat_ptr +=3D 1; > + bfloat_ptr -=3D 1; > + bfloat_ptr - bfloat_ptr2; > + bfloat_ptr =3D &bfloat_ptr3[0]; > + bfloat_ptr =3D &bfloat_ptr3[1]; > + > + /* Simple comparison. */ > + scalar0 > glob_bfloat; /* { dg-error {operation not permitted on type > + '__bf16'} } */ glob_bfloat =3D=3D scalar0; /* { dg-error {operation no= t > + permitted on type '__bf16'} } */ > + scalar0 > is_a_float; /* { dg-error {operation not permitted on type > + '__bf16'} } */ is_a_float =3D=3D scalar0; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + scalar0 > 0; /* { dg-error {operation not permitted on type '__bf16'} > + } */ > + 0 =3D=3D scalar0; /* { dg-error {operation not permitted on type > + '__bf16'} } */ > + scalar0 > 0.1; /* { dg-error {operation not permitted on type > + '__bf16'} } */ > + 0.1 =3D=3D scalar0; /* { dg-error {operation not permitted on type > + '__bf16'} } */ > + scalar0 > is_an_int; /* { dg-error {operation not permitted on type > + '__bf16'} } */ is_an_int =3D=3D scalar0; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + > + /* Pointer comparison. */ > + > + bfloat_ptr =3D=3D &scalar0; > + bfloat_ptr !=3D &scalar0; > + bfloat_ptr < &scalar0; > + bfloat_ptr <=3D &scalar0; > + bfloat_ptr > &scalar0; > + bfloat_ptr >=3D &scalar0; > + bfloat_ptr =3D=3D bfloat_ptr2; > + bfloat_ptr !=3D bfloat_ptr2; > + bfloat_ptr < bfloat_ptr2; > + bfloat_ptr <=3D bfloat_ptr2; > + bfloat_ptr > bfloat_ptr2; > + bfloat_ptr >=3D bfloat_ptr2; > + > + /* Conditional expressions. */ > + > + 0 ? scalar0 : scalar0; > + 0 ? scalar0 : is_a_float; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + 0 ? is_a_float : scalar0; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + 0 ? scalar0 : 0; /* { dg-error {invalid conversion to type '__bf16'} > + } */ > + 0 ? 0 : scalar0; /* { dg-error {invalid conversion to type '__bf16'} > + } */ > + 0 ? 0.1 : scalar0; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + 0 ? scalar0 : 0.1; /* { dg-error {invalid conversion from type > + '__bf16'} } */ > + 0 ? bfloat_ptr : bfloat_ptr2; > + 0 ? bfloat_ptr : float_ptr; /* { dg-warning {pointer type mismatch in > + conditional expression} } */ > + 0 ? float_ptr : bfloat_ptr; /* { dg-warning {pointer type mismatch in > + conditional expression} } */ > + > + scalar0 ? scalar0 : scalar0; /* { dg-error {operation not permitted > + on type '__bf16'} } */ > + scalar0 ? is_a_float : scalar0; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + scalar0 ? scalar0 : is_a_float; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + scalar0 ? is_a_float : is_a_float; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + > + /* Unary operators. */ > + > + +scalar0; /* { dg-error {operation not permitted on type '__bf16'} } > + */ -scalar0; /* { dg-error {operation not permitted on type '__bf16'} > + } */ ~scalar0; /* { dg-error {operation not permitted on type > + '__bf16'} } */ !scalar0; /* { dg-error {operation not permitted on > + type '__bf16'} } */ *scalar0; /* { dg-error {invalid type argument of > + unary '\*'} } */ __real scalar0; /* { dg-error {operation not > + permitted on type '__bf16'} } */ __imag scalar0; /* { dg-error > + {operation not permitted on type '__bf16'} } */ ++scalar0; /* { > + dg-error {operation not permitted on type '__bf16'} } */ --scalar0; > + /* { dg-error {operation not permitted on type '__bf16'} } */ > + scalar0++; /* { dg-error {operation not permitted on type '__bf16'} } > + */ scalar0--; /* { dg-error {operation not permitted on type > + '__bf16'} } */ > + > + /* Binary arithmetic operations. */ > + > + scalar0 =3D glob_bfloat + *bfloat_ptr; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + scalar0 =3D glob_bfloat + 0.1; /* { dg-error {operation not permitted > + on type '__bf16'} } */ > + scalar0 =3D glob_bfloat + 0; /* { dg-error {operation not permitted on > + type '__bf16'} } */ > + scalar0 =3D glob_bfloat + is_a_float; /* { dg-error {operation not > + permitted on type '__bf16'} } */ > + > + return scalar0; > +} > + > -- > 2.18.2 --_002_DM4PR11MB5487E41874F9942CBC57A07BEC9C9DM4PR11MB5487namp_ Content-Type: application/octet-stream; name="0001-Enable-__bf16-type-for-TARGET_SSE2-and-above.patch" Content-Description: 0001-Enable-__bf16-type-for-TARGET_SSE2-and-above.patch Content-Disposition: attachment; filename="0001-Enable-__bf16-type-for-TARGET_SSE2-and-above.patch"; size=28791; creation-date="Wed, 03 Aug 2022 06:48:25 GMT"; modification-date="Wed, 03 Aug 2022 08:40:52 GMT" Content-Transfer-Encoding: base64 RnJvbSA3MmM3N2FkZTQ4Y2I5OWRhYjk5N2I0YzE5MTAxMDFiYWM0ZWIyNDk5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBrb25nbGluZ2xpbmc3IDxsaW5nbGluZy5rb25nQGludGVsLmNv bT4KRGF0ZTogV2VkLCAxNSBKdW4gMjAyMiAxNDoxMjoxMiArMDgwMApTdWJqZWN0OiBbUEFUQ0hd IEVuYWJsZSBfX2JmMTYgdHlwZSBmb3IgVEFSR0VUX1NTRTIgYW5kIGFib3ZlCgpnY2MvQ2hhbmdl TG9nOgoKCSogY29uZmlnL2kzODYvaTM4Ni1idWlsdGluLXR5cGVzLmRlZiAoQkZMT0FUMTYpOiBO ZXcgcHJpbWl0aXZlIHR5cGUuCgkqIGNvbmZpZy9pMzg2L2kzODYtYnVpbHRpbnMuY2MgOiBTdXBw b3J0IF9fYmYxNiB0eXBlIGZvciBpMzg2IGJhY2tlbmQuCgkoaXg4Nl9yZWdpc3Rlcl9iZjE2X2J1 aWx0aW5fdHlwZSk6IE5ldyBmdW5jdGlvbi4KCShpeDg2X2JmMTZfdHlwZV9ub2RlKTogTmV3LgoJ KGl4ODZfYmYxNl9wdHJfdHlwZV9ub2RlKTogRGl0dG8uCgkoaXg4Nl9pbml0X2J1aWx0aW5fdHlw ZXMpOiBBZGQgaXg4Nl9yZWdpc3Rlcl9iZjE2X2J1aWx0aW5fdHlwZSBmdW5jdGlvbiBjYWxsLgoJ KiBjb25maWcvaTM4Ni9pMzg2LW1vZGVzLmRlZiAoRkxPQVRfTU9ERSk6IEFkZCBCRm1vZGUuCgko QURKVVNUX0ZMT0FUX0ZPUk1BVCk6IERpdHRvLgoJKiBjb25maWcvaTM4Ni9pMzg2LmNjIChtZXJn ZV9jbGFzc2VzKTogSGFuZGxlIEJGbW9kZS4KCShjbGFzc2lmeV9hcmd1bWVudCk6IERpdHRvLgoJ KGV4YW1pbmVfYXJndW1lbnQpOiBEaXR0by4KCShjb25zdHJ1Y3RfY29udGFpbmVyKTogRGl0dG8u CgkoZnVuY3Rpb25fdmFsdWVfMzIpOiBSZXR1cm4gX19iZjE2IGJ5ICV4bW0wLgoJKGZ1bmN0aW9u X3ZhbHVlXzY0KTogUmV0dXJuIF9fYmYxNiBieSBTU0UgcmVnaXN0ZXIuCgkoaXg4Nl9wcmludF9v cGVyYW5kKTogSGFuZGxlIENPTlNUX0RPVUJMRSBCRm1vZGUuCgkoaXg4Nl9sZWdpdGltYXRlX2Nv bnN0YW50X3ApOiBEaXNhYmxlIEJGbW9kZSBjb25zdGFudCBkb3VibGUuCgkoaXg4Nl9zZWNvbmRh cnlfcmVsb2FkKTogUmVxdWlyZSBncHIgYXMgaW50ZXJtZWRpYXRlIHJlZ2lzdGVyCgl0byBzdG9y ZSBfX2JmMTYgZnJvbSBzc2UgcmVnaXN0ZXIgd2hlbiBzc2U0IGlzIG5vdCBhdmFpbGFibGUuCgko aXg4Nl9zY2FsYXJfbW9kZV9zdXBwb3J0ZWRfcCk6IEVuYWJsZSBfX2JmMTYgdW5kZXIgc3NlMi4K CShpeDg2X21hbmdsZV90eXBlKTogQWRkIG1hbmxnaW5nIGZvciBfX2JmMTYgdHlwZS4KCShpeDg2 X2ludmFsaWRfY29udmVyc2lvbik6IE5ldyBmdW5jdGlvbiBmb3IgdGFyZ2V0IGhvb2suCgkoaXg4 Nl9pbnZhbGlkX3VuYXJ5X29wKTogRGl0dG8uCgkoaXg4Nl9pbnZhbGlkX2JpbmFyeV9vcCk6IERp dHRvLgoJKFRBUkdFVF9JTlZBTElEX0NPTlZFUlNJT04pOiBOZXcgZGVmaW5lIGZvciB0YXJnZXQg aG9vay4KCShUQVJHRVRfSU5WQUxJRF9VTkFSWV9PUCk6IERpdHRvLgoJKFRBUkdFVF9JTlZBTElE X0JJTkFSWV9PUCk6IERpdHRvLgoJKiBjb25maWcvaTM4Ni9pMzg2LmggKGhvc3RfZGV0ZWN0X2xv Y2FsX2NwdSk6IEFkZCBCRm1vZGUuCgkqIGNvbmZpZy9pMzg2L2kzODYubWQgKCpwdXNoaGZfcmV4 NjQpOiBDaGFuZ2UgZm9yIEJGbW9kZS4KCSgqcHVzaDxtb2RlPl9yZXg2NCk6IERpdHRvLgoJKCpw dXNoaGYpOiBEaXR0by4KCSgqcHVzaDxtb2RlPik6IERpdHRvLgoJKGhmYmZjb25zdGYpOiBBZGQg bmV3IGRlZmluZV9tb2RlX2F0dHIuCgkoKm1vdjxtb2RlPl9pbnRlcm5hbCk6IEFkZCBCRm1vZGUu CgpnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoKCgkqIGcrKy50YXJnZXQvaTM4Ni9iZmxvYXRfY3Bw X3R5cGVjaGVjay5DOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdldC9pMzg2L2JmbG9hdDE2LTEuYzog RGl0dG8uCgkqIGdjYy50YXJnZXQvaTM4Ni9zc2UyLWJmbG9hdDE2LTEuYzogRGl0dG8uCgkqIGdj Yy50YXJnZXQvaTM4Ni9zc2UyLWJmbG9hdDE2LTIuYzogRGl0dG8uCgkqIGdjYy50YXJnZXQvaTM4 Ni9zc2UyLWJmbG9hdDE2LXNjYWxhci10eXBlY2hlY2suYzogRGl0dG8uCi0tLQogZ2NjL2NvbmZp Zy9pMzg2L2kzODYtYnVpbHRpbi10eXBlcy5kZWYgICAgICAgIHwgICAxICsKIGdjYy9jb25maWcv aTM4Ni9pMzg2LWJ1aWx0aW5zLmNjICAgICAgICAgICAgICB8ICAyMSArKwogZ2NjL2NvbmZpZy9p Mzg2L2kzODYtbW9kZXMuZGVmICAgICAgICAgICAgICAgIHwgICAyICsKIGdjYy9jb25maWcvaTM4 Ni9pMzg2LmNjICAgICAgICAgICAgICAgICAgICAgICB8ICA4MCArKysrKystCiBnY2MvY29uZmln L2kzODYvaTM4Ni5oICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQgKy0KIGdjYy9jb25maWcv aTM4Ni9pMzg2Lm1kICAgICAgICAgICAgICAgICAgICAgICB8ICA0NSArKy0tCiAuLi4vZysrLnRh cmdldC9pMzg2L2JmbG9hdF9jcHBfdHlwZWNoZWNrLkMgICAgfCAgMTAgKwogZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvYmZsb2F0MTYtMS5jICAgIHwgIDEyICsKIC4uLi9nY2MudGFyZ2V0 L2kzODYvc3NlMi1iZmxvYXQxNi0xLmMgICAgICAgICB8ICAgOCArCiAuLi4vZ2NjLnRhcmdldC9p Mzg2L3NzZTItYmZsb2F0MTYtMi5jICAgICAgICAgfCAgMTcgKysKIC4uLi9pMzg2L3NzZTItYmZs b2F0MTYtc2NhbGFyLXR5cGVjaGVjay5jICAgICB8IDIxNSArKysrKysrKysrKysrKysrKysKIDEx IGZpbGVzIGNoYW5nZWQsIDM5MSBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2crKy50YXJnZXQvaTM4Ni9iZmxvYXRfY3BwX3R5 cGVjaGVjay5DCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvYmZsb2F0MTYtMS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvc3NlMi1iZmxvYXQxNi0xLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9zc2UyLWJmbG9hdDE2LTIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItYmZsb2F0MTYtc2NhbGFyLXR5cGVj aGVjay5jCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYtYnVpbHRpbi10eXBlcy5k ZWYgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni1idWlsdGluLXR5cGVzLmRlZgppbmRleCA3YTJkYTFk YjBiMC4uNjNhMzYwYjBmOGIgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9pMzg2LWJ1aWx0 aW4tdHlwZXMuZGVmCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LWJ1aWx0aW4tdHlwZXMuZGVm CkBAIC02OSw2ICs2OSw3IEBAIERFRl9QUklNSVRJVkVfVFlQRSAoVUlOVDE2LCBzaG9ydF91bnNp Z25lZF90eXBlX25vZGUpCiBERUZfUFJJTUlUSVZFX1RZUEUgKElOVDY0LCBsb25nX2xvbmdfaW50 ZWdlcl90eXBlX25vZGUpCiBERUZfUFJJTUlUSVZFX1RZUEUgKFVJTlQ2NCwgbG9uZ19sb25nX3Vu c2lnbmVkX3R5cGVfbm9kZSkKIERFRl9QUklNSVRJVkVfVFlQRSAoRkxPQVQxNiwgaXg4Nl9mbG9h dDE2X3R5cGVfbm9kZSkKK0RFRl9QUklNSVRJVkVfVFlQRSAoQkZMT0FUMTYsIGl4ODZfYmYxNl90 eXBlX25vZGUpCiBERUZfUFJJTUlUSVZFX1RZUEUgKEZMT0FULCBmbG9hdF90eXBlX25vZGUpCiBE RUZfUFJJTUlUSVZFX1RZUEUgKERPVUJMRSwgZG91YmxlX3R5cGVfbm9kZSkKIERFRl9QUklNSVRJ VkVfVFlQRSAoRkxPQVQ4MCwgZmxvYXQ4MF90eXBlX25vZGUpCmRpZmYgLS1naXQgYS9nY2MvY29u ZmlnL2kzODYvaTM4Ni1idWlsdGlucy5jYyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LWJ1aWx0aW5z LmNjCmluZGV4IGZlNzI0M2MzODM3Li42YTA0ZmI1N2U2NSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZp Zy9pMzg2L2kzODYtYnVpbHRpbnMuY2MKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYtYnVpbHRp bnMuY2MKQEAgLTEyNiw2ICsxMjYsOSBAQCBCREVTQ19WRVJJRllTIChJWDg2X0JVSUxUSU5fTUFY LAogc3RhdGljIEdUWSgoKSkgdHJlZSBpeDg2X2J1aWx0aW5fdHlwZV90YWJbKGludCkgSVg4Nl9C VF9MQVNUX0NQVFIgKyAxXTsKIAogdHJlZSBpeDg2X2Zsb2F0MTZfdHlwZV9ub2RlID0gTlVMTF9U UkVFOwordHJlZSBpeDg2X2JmMTZfdHlwZV9ub2RlID0gTlVMTF9UUkVFOwordHJlZSBpeDg2X2Jm MTZfcHRyX3R5cGVfbm9kZSA9IE5VTExfVFJFRTsKKwogLyogUmV0cmlldmUgYW4gZWxlbWVudCBm cm9tIHRoZSBhYm92ZSB0YWJsZSwgYnVpbGRpbmcgc29tZSBvZgogICAgdGhlIHR5cGVzIGxhemls eS4gICovCiAKQEAgLTEzNjYsNiArMTM2OSwyMiBAQCBpeDg2X3JlZ2lzdGVyX2Zsb2F0MTZfYnVp bHRpbl90eXBlICh2b2lkKQogCQkJCQkgICAgIl9GbG9hdDE2Iik7CiB9CiAKK3N0YXRpYyB2b2lk CitpeDg2X3JlZ2lzdGVyX2JmMTZfYnVpbHRpbl90eXBlICh2b2lkKQoreworICBpeDg2X2JmMTZf dHlwZV9ub2RlID0gbWFrZV9ub2RlIChSRUFMX1RZUEUpOworICBUWVBFX1BSRUNJU0lPTiAoaXg4 Nl9iZjE2X3R5cGVfbm9kZSkgPSAxNjsKKyAgU0VUX1RZUEVfTU9ERSAoaXg4Nl9iZjE2X3R5cGVf bm9kZSwgQkZtb2RlKTsKKyAgbGF5b3V0X3R5cGUgKGl4ODZfYmYxNl90eXBlX25vZGUpOworCisg IGlmICghbWF5YmVfZ2V0X2lkZW50aWZpZXIgKCJfX2JmMTYiKSAmJiBUQVJHRVRfU1NFMikKKyAg ICB7CisgICAgICBsYW5nX2hvb2tzLnR5cGVzLnJlZ2lzdGVyX2J1aWx0aW5fdHlwZSAoaXg4Nl9i ZjE2X3R5cGVfbm9kZSwKKwkJCQkJICAgICJfX2JmMTYiKTsKKyAgICAgIGl4ODZfYmYxNl9wdHJf dHlwZV9ub2RlID0gYnVpbGRfcG9pbnRlcl90eXBlIChpeDg2X2JmMTZfdHlwZV9ub2RlKTsKKyAg ICB9Cit9CisKIHN0YXRpYyB2b2lkCiBpeDg2X2luaXRfYnVpbHRpbl90eXBlcyAodm9pZCkKIHsK QEAgLTEzOTYsNiArMTQxNSw4IEBAIGl4ODZfaW5pdF9idWlsdGluX3R5cGVzICh2b2lkKQogCiAg IGl4ODZfcmVnaXN0ZXJfZmxvYXQxNl9idWlsdGluX3R5cGUgKCk7CiAKKyAgaXg4Nl9yZWdpc3Rl cl9iZjE2X2J1aWx0aW5fdHlwZSAoKTsKKwogICBjb25zdF9zdHJpbmdfdHlwZV9ub2RlCiAgICAg PSBidWlsZF9wb2ludGVyX3R5cGUgKGJ1aWxkX3F1YWxpZmllZF90eXBlCiAJCQkgIChjaGFyX3R5 cGVfbm9kZSwgVFlQRV9RVUFMX0NPTlNUKSk7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2kzODYv aTM4Ni1tb2Rlcy5kZWYgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni1tb2Rlcy5kZWYKaW5kZXggZTJl MWUxOGQyNGQuLmI0OWRhYWVmMjUzIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni1t b2Rlcy5kZWYKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYtbW9kZXMuZGVmCkBAIC0yNCw2ICsy NCw4IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2Vl CiBGUkFDVElPTkFMX0ZMT0FUX01PREUgKFhGLCA4MCwgMTIsIGllZWVfZXh0ZW5kZWRfaW50ZWxf OTZfZm9ybWF0KTsKIEZMT0FUX01PREUgKFRGLCAxNiwgaWVlZV9xdWFkX2Zvcm1hdCk7CiBGTE9B VF9NT0RFIChIRiwgMiwgaWVlZV9oYWxmX2Zvcm1hdCk7CitGTE9BVF9NT0RFIChCRiwgMiwgMCk7 CitBREpVU1RfRkxPQVRfRk9STUFUIChCRiwgJmFybV9iZmxvYXRfaGFsZl9mb3JtYXQpOwogCiAv KiBJbiBJTFAzMiBtb2RlLCBYRm1vZGUgaGFzIHNpemUgMTIgYW5kIGFsaWdubWVudCA0LgogICAg SW4gTFA2NCBtb2RlLCBYRm1vZGUgaGFzIHNpemUgYW5kIGFsaWdubWVudCAxNi4gICovCmRpZmYg LS1naXQgYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5jYyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmNj CmluZGV4IDVlMzBkYzg4NGJmLi44N2I0OGJhYzdiZSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9p Mzg2L2kzODYuY2MKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuY2MKQEAgLTIzOTksNiArMjM5 OSw3IEBAIGNsYXNzaWZ5X2FyZ3VtZW50IChtYWNoaW5lX21vZGUgbW9kZSwgY29uc3RfdHJlZSB0 eXBlLAogICAgIGNhc2UgRV9DVEltb2RlOgogICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBFX0hG bW9kZToKKyAgICBjYXNlIEVfQkZtb2RlOgogICAgICAgaWYgKCEoYml0X29mZnNldCAlIDY0KSkK IAljbGFzc2VzWzBdID0gWDg2XzY0X1NTRUhGX0NMQVNTOwogICAgICAgZWxzZQpAQCAtMjc5Miw5 ICsyNzkzLDEwIEBAIGNvbnN0cnVjdF9jb250YWluZXIgKG1hY2hpbmVfbW9kZSBtb2RlLCBtYWNo aW5lX21vZGUgb3JpZ19tb2RlLAogCSAgICBpbnRyZWcrKzsKIAkgICAgYnJlYWs7CiAJICBjYXNl IFg4Nl82NF9TU0VIRl9DTEFTUzoKKwkgICAgdG1wbW9kZSA9IChtb2RlID09IEJGbW9kZSA/IEJG bW9kZSA6IEhGbW9kZSk7CiAJICAgIGV4cCBbbmV4cHMrK10KIAkgICAgICA9IGdlbl9ydHhfRVhQ Ul9MSVNUIChWT0lEbW9kZSwKLQkJCQkgICBnZW5fcnR4X1JFRyAoSEZtb2RlLAorCQkJCSAgIGdl bl9ydHhfUkVHICh0bXBtb2RlLAogCQkJCQkJR0VUX1NTRV9SRUdOTyAoc3NlX3JlZ25vKSksCiAJ CQkJICAgR0VOX0lOVCAoaSo4KSk7CiAJICAgIHNzZV9yZWdubysrOwpAQCAtNDAwMSw4ICs0MDAz LDggQEAgZnVuY3Rpb25fdmFsdWVfMzIgKG1hY2hpbmVfbW9kZSBvcmlnX21vZGUsIG1hY2hpbmVf bW9kZSBtb2RlLAogICAgIC8qIE1vc3QgdGhpbmdzIGdvIGluICVlYXguICAqLwogICAgIHJlZ25v ID0gQVhfUkVHOwogCi0gIC8qIFJldHVybiBfRmxvYXQxNi9fQ29tcGxleCBfRm9hdDE2IGJ5IHNz ZSByZWdpc3Rlci4gICovCi0gIGlmIChtb2RlID09IEhGbW9kZSkKKyAgLyogUmV0dXJuIF9fYmYx Ni8gX0Zsb2F0MTYvX0NvbXBsZXggX0ZvYXQxNiBieSBzc2UgcmVnaXN0ZXIuICAqLworICBpZiAo bW9kZSA9PSBIRm1vZGUgfHwgbW9kZSA9PSBCRm1vZGUpCiAgICAgcmVnbm8gPSBGSVJTVF9TU0Vf UkVHOwogICBpZiAobW9kZSA9PSBIQ21vZGUpCiAgICAgewpAQCAtNDA1MCw2ICs0MDUyLDcgQEAg ZnVuY3Rpb25fdmFsdWVfNjQgKG1hY2hpbmVfbW9kZSBvcmlnX21vZGUsIG1hY2hpbmVfbW9kZSBt b2RlLAogCiAgICAgICBzd2l0Y2ggKG1vZGUpCiAJeworCWNhc2UgRV9CRm1vZGU6CiAJY2FzZSBF X0hGbW9kZToKIAljYXNlIEVfSENtb2RlOgogCWNhc2UgRV9TRm1vZGU6CkBAIC01NjMxLDYgKzU2 MzQsNyBAQCBpeDg2X291dHB1dF9zc2Vtb3YgKHJ0eF9pbnNuICppbnNuLCBydHggKm9wZXJhbmRz KQogCXJldHVybiAiJXZtb3Zzc1x0eyUxLCAlMHwlMCwgJTF9IjsKIAogICAgIGNhc2UgTU9ERV9I RjoKKyAgICBjYXNlIE1PREVfQkY6CiAgICAgICBpZiAoUkVHX1AgKG9wZXJhbmRzWzBdKSAmJiBS RUdfUCAob3BlcmFuZHNbMV0pKQogCXJldHVybiAidm1vdnNoXHR7JWQxLCAlMHwlMCwgJWQxfSI7 CiAgICAgICBlbHNlCkBAIC0xMDY0OCw2ICsxMDY1MiwxMSBAQCBpeDg2X2xlZ2l0aW1hdGVfY29u c3RhbnRfcCAobWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB4KQogICAgIGNhc2UgQ09OU1RfVkVDVE9S OgogICAgICAgaWYgKCFzdGFuZGFyZF9zc2VfY29uc3RhbnRfcCAoeCwgbW9kZSkpCiAJcmV0dXJu IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENPTlNUX0RPVUJMRToKKyAgICAgIGlm IChtb2RlID09IEVfQkZtb2RlKQorCXJldHVybiBmYWxzZTsKIAogICAgIGRlZmF1bHQ6CiAgICAg ICBicmVhazsKQEAgLTE5NDE1LDcgKzE5NDI0LDggQEAgaXg4Nl9zZWNvbmRhcnlfcmVsb2FkIChi b29sIGluX3AsIHJ0eCB4LCByZWdfY2xhc3NfdCByY2xhc3MsCiAgICAgfQogCiAgIC8qIFJlcXVp cmUgbW92ZW1lbnQgdG8gZ3ByLCBhbmQgdGhlbiBzdG9yZSB0byBtZW1vcnkuICAqLwotICBpZiAo KG1vZGUgPT0gSEZtb2RlIHx8IG1vZGUgPT0gSEltb2RlIHx8IG1vZGUgPT0gVjJRSW1vZGUpCisg IGlmICgobW9kZSA9PSBIRm1vZGUgfHwgbW9kZSA9PSBISW1vZGUgfHwgbW9kZSA9PSBWMlFJbW9k ZQorICAgICAgIHx8IG1vZGUgPT0gQkZtb2RlKQogICAgICAgJiYgIVRBUkdFVF9TU0U0XzEKICAg ICAgICYmIFNTRV9DTEFTU19QIChyY2xhc3MpCiAgICAgICAmJiAhaW5fcCAmJiBNRU1fUCAoeCkp CkBAIC0yMjM0NCw3ICsyMjM1NCw3IEBAIGl4ODZfc2NhbGFyX21vZGVfc3VwcG9ydGVkX3AgKHNj YWxhcl9tb2RlIG1vZGUpCiAgICAgcmV0dXJuIGRlZmF1bHRfZGVjaW1hbF9mbG9hdF9zdXBwb3J0 ZWRfcCAoKTsKICAgZWxzZSBpZiAobW9kZSA9PSBURm1vZGUpCiAgICAgcmV0dXJuIHRydWU7Ci0g IGVsc2UgaWYgKG1vZGUgPT0gSEZtb2RlICYmIFRBUkdFVF9TU0UyKQorICBlbHNlIGlmICgobW9k ZSA9PSBIRm1vZGUgfHwgbW9kZSA9PSBCRm1vZGUpICYmIFRBUkdFVF9TU0UyKQogICAgIHJldHVy biB0cnVlOwogICBlbHNlCiAgICAgcmV0dXJuIGRlZmF1bHRfc2NhbGFyX21vZGVfc3VwcG9ydGVk X3AgKG1vZGUpOwpAQCAtMjI2NTksNiArMjI2NjksOCBAQCBpeDg2X21hbmdsZV90eXBlIChjb25z dF90cmVlIHR5cGUpCiAKICAgc3dpdGNoIChUWVBFX01PREUgKHR5cGUpKQogICAgIHsKKyAgICBj YXNlIEVfQkZtb2RlOgorICAgICAgcmV0dXJuICJ1Nl9fYmYxNiI7CiAgICAgY2FzZSBFX0hGbW9k ZToKICAgICAgIC8qIF9GbG9hdDE2IGlzICJERjE2XyIuCiAJIEFsaWduIHdpdGggY2xhbmcncyBk ZWNpc2lvbiBpbiBodHRwczovL3Jldmlld3MubGx2bS5vcmcvRDMzNzE5LiAqLwpAQCAtMjI2NzQs NiArMjI2ODYsNTUgQEAgaXg4Nl9tYW5nbGVfdHlwZSAoY29uc3RfdHJlZSB0eXBlKQogICAgIH0K IH0KIAorLyogUmV0dXJuIHRoZSBkaWFnbm9zdGljIG1lc3NhZ2Ugc3RyaW5nIGlmIGNvbnZlcnNp b24gZnJvbSBGUk9NVFlQRSB0bworICAgVE9UWVBFIGlzIG5vdCBhbGxvd2VkLCBOVUxMIG90aGVy d2lzZS4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2l4ODZfaW52YWxpZF9jb252ZXJzaW9u IChjb25zdF90cmVlIGZyb210eXBlLCBjb25zdF90cmVlIHRvdHlwZSkKK3sKKyAgaWYgKGVsZW1l bnRfbW9kZSAoZnJvbXR5cGUpICE9IGVsZW1lbnRfbW9kZSAodG90eXBlKSkKKyAgICB7CisgICAg ICAvKiBEbyBubyBhbGxvdyBjb252ZXJzaW9ucyB0by9mcm9tIEJGbW9kZSBzY2FsYXIgdHlwZXMu ICAqLworICAgICAgaWYgKFRZUEVfTU9ERSAoZnJvbXR5cGUpID09IEJGbW9kZSkKKwlyZXR1cm4g Tl8oImludmFsaWQgY29udmVyc2lvbiBmcm9tIHR5cGUgJTxfX2JmMTYlPiIpOworICAgICAgaWYg KFRZUEVfTU9ERSAodG90eXBlKSA9PSBCRm1vZGUpCisJcmV0dXJuIE5fKCJpbnZhbGlkIGNvbnZl cnNpb24gdG8gdHlwZSAlPF9fYmYxNiU+Iik7CisgICAgfQorCisgIC8qIENvbnZlcnNpb24gYWxs b3dlZC4gICovCisgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gdGhlIGRpYWdub3N0aWMg bWVzc2FnZSBzdHJpbmcgaWYgdGhlIHVuYXJ5IG9wZXJhdGlvbiBPUCBpcworICAgbm90IHBlcm1p dHRlZCBvbiBUWVBFLCBOVUxMIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoK K2l4ODZfaW52YWxpZF91bmFyeV9vcCAoaW50IG9wLCBjb25zdF90cmVlIHR5cGUpCit7CisgIC8q IFJlamVjdCBhbGwgc2luZ2xlLW9wZXJhbmQgb3BlcmF0aW9ucyBvbiBCRm1vZGUgZXhjZXB0IGZv ciAmLiAgKi8KKyAgaWYgKGVsZW1lbnRfbW9kZSAodHlwZSkgPT0gQkZtb2RlICYmIG9wICE9IEFE RFJfRVhQUikKKyAgICByZXR1cm4gTl8oIm9wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIHR5cGUg JTxfX2JmMTYlPiIpOworCisgIC8qIE9wZXJhdGlvbiBhbGxvd2VkLiAgKi8KKyAgcmV0dXJuIE5V TEw7Cit9CisKKy8qIFJldHVybiB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlIHN0cmluZyBpZiB0aGUg YmluYXJ5IG9wZXJhdGlvbiBPUCBpcworICAgbm90IHBlcm1pdHRlZCBvbiBUWVBFMSBhbmQgVFlQ RTIsIE5VTEwgb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraXg4Nl9pbnZh bGlkX2JpbmFyeV9vcCAoaW50IG9wIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0X3RyZWUgdHlwZTEs CisJCQkgICBjb25zdF90cmVlIHR5cGUyKQoreworICAvKiBSZWplY3QgYWxsIDItb3BlcmFuZCBv cGVyYXRpb25zIG9uIEJGbW9kZS4gICovCisgIGlmIChlbGVtZW50X21vZGUgKHR5cGUxKSA9PSBC Rm1vZGUKKyAgICAgIHx8IGVsZW1lbnRfbW9kZSAodHlwZTIpID09IEJGbW9kZSkKKyAgICByZXR1 cm4gTl8oIm9wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIHR5cGUgJTxfX2JmMTYlPiIpOworCisg IC8qIE9wZXJhdGlvbiBhbGxvd2VkLiAgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBH VFkoKCkpIHRyZWUgaXg4Nl90bHNfc3RhY2tfY2hrX2d1YXJkX2RlY2w7CiAKIHN0YXRpYyB0cmVl CkBAIC0yNDczMSw2ICsyNDc5MiwxNSBAQCBpeDg2X2xpYmdjY19mbG9hdGluZ19tb2RlX3N1cHBv cnRlZF9wCiAjdW5kZWYgVEFSR0VUX01BTkdMRV9UWVBFCiAjZGVmaW5lIFRBUkdFVF9NQU5HTEVf VFlQRSBpeDg2X21hbmdsZV90eXBlCiAKKyN1bmRlZiBUQVJHRVRfSU5WQUxJRF9DT05WRVJTSU9O CisjZGVmaW5lIFRBUkdFVF9JTlZBTElEX0NPTlZFUlNJT04gaXg4Nl9pbnZhbGlkX2NvbnZlcnNp b24KKworI3VuZGVmIFRBUkdFVF9JTlZBTElEX1VOQVJZX09QCisjZGVmaW5lIFRBUkdFVF9JTlZB TElEX1VOQVJZX09QIGl4ODZfaW52YWxpZF91bmFyeV9vcAorCisjdW5kZWYgVEFSR0VUX0lOVkFM SURfQklOQVJZX09QCisjZGVmaW5lIFRBUkdFVF9JTlZBTElEX0JJTkFSWV9PUCBpeDg2X2ludmFs aWRfYmluYXJ5X29wCisKICN1bmRlZiBUQVJHRVRfU1RBQ0tfUFJPVEVDVF9HVUFSRAogI2RlZmlu ZSBUQVJHRVRfU1RBQ0tfUFJPVEVDVF9HVUFSRCBpeDg2X3N0YWNrX3Byb3RlY3RfZ3VhcmQKIApk aWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYuaCBiL2djYy9jb25maWcvaTM4Ni9pMzg2 LmgKaW5kZXggZjE2ZGY2MzNlODQuLjBkYTNkY2UxZDMxIDEwMDY0NAotLS0gYS9nY2MvY29uZmln L2kzODYvaTM4Ni5oCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmgKQEAgLTEwNDYsNyArMTA0 Niw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpob3N0X2RldGVjdF9sb2NhbF9jcHUgKGludCBhcmdj LCBjb25zdCBjaGFyICoqYXJndik7CiAgICB8fCAoTU9ERSkgPT0gVjhIRm1vZGUgfHwgKE1PREUp ID09IFY0SEZtb2RlIHx8IChNT0RFKSA9PSBWMkhGbW9kZQlcCiAgICB8fCAoTU9ERSkgPT0gVjRR SW1vZGUgfHwgKE1PREUpID09IFYySEltb2RlIHx8IChNT0RFKSA9PSBWMVNJbW9kZQlcCiAgICB8 fCAoTU9ERSkgPT0gVjJESW1vZGUgfHwgKE1PREUpID09IFYyUUltb2RlIHx8IChNT0RFKSA9PSBE Rm1vZGUJXAotICAgfHwgKE1PREUpID09IEhGbW9kZSkKKyAgIHx8IChNT0RFKSA9PSBIRm1vZGUg fHwgKE1PREUpID09IEJGbW9kZSkKIAogI2RlZmluZSBWQUxJRF9TU0VfUkVHX01PREUoTU9ERSkJ CQkJCVwKICAgKChNT0RFKSA9PSBWMVRJbW9kZSB8fCAoTU9ERSkgPT0gVEltb2RlCQkJCVwKQEAg LTEwNzcsNyArMTA3Nyw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpob3N0X2RldGVjdF9sb2NhbF9j cHUgKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CiAgICB8fCAoTU9ERSkgPT0gQ1FJbW9k ZSB8fCAoTU9ERSkgPT0gQ0hJbW9kZQkJCQlcCiAgICB8fCAoTU9ERSkgPT0gQ1NJbW9kZSB8fCAo TU9ERSkgPT0gQ0RJbW9kZQkJCQlcCiAgICB8fCAoTU9ERSkgPT0gU0Rtb2RlIHx8IChNT0RFKSA9 PSBERG1vZGUJCQkJXAotICAgfHwgKE1PREUpID09IEhGbW9kZSB8fCAoTU9ERSkgPT0gSENtb2Rl CQkJCVwKKyAgIHx8IChNT0RFKSA9PSBIRm1vZGUgfHwgKE1PREUpID09IEhDbW9kZSB8fCAoTU9E RSkgPT0gQkZtb2RlCQlcCiAgICB8fCAoTU9ERSkgPT0gVjJISW1vZGUgfHwgKE1PREUpID09IFYy SEZtb2RlCQkJCVwKICAgIHx8IChNT0RFKSA9PSBWMVNJbW9kZSB8fCAoTU9ERSkgPT0gVjRRSW1v ZGUgfHwgKE1PREUpID09IFYyUUltb2RlCVwKICAgIHx8IChUQVJHRVRfNjRCSVQJCQkJCQkJXApk aWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYubWQgYi9nY2MvY29uZmlnL2kzODYvaTM4 Ni5tZAppbmRleCBmMTE1OGUxMzU2Yi4uYjBlYjc2ZDNiY2IgMTAwNjQ0Ci0tLSBhL2djYy9jb25m aWcvaTM4Ni9pMzg2Lm1kCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2Lm1kCkBAIC00OTksNyAr NDk5LDcgQEAKIAogOzsgTWFpbiBkYXRhIHR5cGUgdXNlZCBieSB0aGUgaW5zbgogKGRlZmluZV9h dHRyICJtb2RlIgotICAidW5rbm93bixub25lLFFJLEhJLFNJLERJLFRJLE9JLFhJLEhGLFNGLERG LFhGLFRGLFYzMkhGLFYxNkhGLFY4SEYsCisgICJ1bmtub3duLG5vbmUsUUksSEksU0ksREksVEks T0ksWEksSEYsQkYsU0YsREYsWEYsVEYsVjMySEYsVjE2SEYsVjhIRiwKICAgIFYxNlNGLFY4U0Ys VjRERixWNFNGLFYyREYsVjJTRixWMURGLFY4REYsVjRIRixWMkhGIgogICAoY29uc3Rfc3RyaW5n ICJ1bmtub3duIikpCiAKQEAgLTExMDQsNyArMTEwNCw3IEBACiA7OyBHRVRfTU9ERV9TSVpFICg8 TU9ERT5tb2RlKS4gIEZvciBYRm1vZGUgd2hpY2ggZGVwZW5kcyBvbgogOzsgY29tbWFuZCBsaW5l IG9wdGlvbnMganVzdCB1c2UgR0VUX01PREVfU0laRSBtYWNyby4KIChkZWZpbmVfbW9kZV9hdHRy IE1PREVfU0laRSBbKFFJICIxIikgKEhJICIyIikgKFNJICI0IikgKERJICI4IikKLQkJCSAgICAg KFRJICIxNiIpIChIRiAiMiIpIChTRiAiNCIpIChERiAiOCIpCisJCQkgICAgIChUSSAiMTYiKSAo SEYgIjIiKSAoQkYgIjIiKSAoU0YgIjQiKSAoREYgIjgiKQogCQkJICAgICAoWEYgIkdFVF9NT0RF X1NJWkUgKFhGbW9kZSkiKQogCQkJICAgICAoVjE2UUkgIjE2IikgKFYzMlFJICIzMiIpIChWNjRR SSAiNjQiKQogCQkJICAgICAoVjhISSAiMTYiKSAoVjE2SEkgIjMyIikgKFYzMkhJICI2NCIpCkBA IC0xMjQ4LDcgKzEyNDgsNyBAQAogKGRlZmluZV9tb2RlX2l0ZXJhdG9yIFg4N01PREVGIFtTRiBE RiBYRl0pCiAKIDs7IEFsbCB4ODcgZmxvYXRpbmcgcG9pbnQgbW9kZXMgcGx1cyBIRm1vZGUKLShk ZWZpbmVfbW9kZV9pdGVyYXRvciBYODdNT0RFRkggW0hGIFNGIERGIFhGXSkKKyhkZWZpbmVfbW9k ZV9pdGVyYXRvciBYODdNT0RFRkggW0hGIFNGIERGIFhGIEJGXSkKIAogOzsgQWxsIFNTRSBmbG9h dGluZyBwb2ludCBtb2RlcwogKGRlZmluZV9tb2RlX2l0ZXJhdG9yIFNTRU1PREVGIFtIRiBTRiBE RiBURl0pCkBAIC0zNDA4LDkgKzM0MDgsMTEgQEAKICAgb3BlcmFuZHNbMF0gPSByZXBsYWNlX2Vx dWl2X2FkZHJlc3MgKG9wZXJhbmRzWzBdLCBzdGFja19wb2ludGVyX3J0eCk7CiB9KQogCi0oZGVm aW5lX2luc24gIipwdXNoaGZfcmV4NjQiCi0gIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhGIDAgInB1 c2hfb3BlcmFuZCIgIj1YLFgiKQotCShtYXRjaF9vcGVyYW5kOkhGIDEgIm5vbm1lbW9yeV9ub19l bGltX29wZXJhbmQiICJyLHgiKSldCisoZGVmaW5lX21vZGVfaXRlcmF0b3IgSEZCRiBbSEYgQkZd KQorCisoZGVmaW5lX2luc24gIipwdXNoPG1vZGU+X3JleDY0IgorICBbKHNldCAobWF0Y2hfb3Bl cmFuZDpIRkJGIDAgInB1c2hfb3BlcmFuZCIgIj1YLFgiKQorCShtYXRjaF9vcGVyYW5kOkhGQkYg MSAibm9ubWVtb3J5X25vX2VsaW1fb3BlcmFuZCIgInIseCIpKV0KICAgIlRBUkdFVF82NEJJVCIK IHsKICAgLyogQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYWxyZWFkeSBzcGxpdCBiZWZvcmUgcmVn LXN0YWNrLiAgKi8KQEAgLTM0MjEsOSArMzQyMyw5IEBACiAgICAoc2V0X2F0dHIgInR5cGUiICJw dXNoLG11bHRpIikKICAgIChzZXRfYXR0ciAibW9kZSIgIkRJLFRJIildKQogCi0oZGVmaW5lX2lu c24gIipwdXNoaGYiCi0gIFsoc2V0IChtYXRjaF9vcGVyYW5kOkhGIDAgInB1c2hfb3BlcmFuZCIg Ij1YLFgiKQotCShtYXRjaF9vcGVyYW5kOkhGIDEgImdlbmVyYWxfbm9fZWxpbV9vcGVyYW5kIiAi cm1GLHgiKSldCisoZGVmaW5lX2luc24gIipwdXNoPG1vZGU+IgorICBbKHNldCAobWF0Y2hfb3Bl cmFuZDpIRkJGIDAgInB1c2hfb3BlcmFuZCIgIj1YLFgiKQorCShtYXRjaF9vcGVyYW5kOkhGQkYg MSAiZ2VuZXJhbF9ub19lbGltX29wZXJhbmQiICJybUYseCIpKV0KICAgIiFUQVJHRVRfNjRCSVQi CiB7CiAgIC8qIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGFscmVhZHkgc3BsaXQgYmVmb3JlIHJl Zy1zdGFjay4gICovCkBAIC0zNDYyLDcgKzM0NjQsNyBAQAogICAgKHNldF9hdHRyICJ1bml0IiAi aTM4NywqLCoiKQogICAgKHNldF9hdHRyICJtb2RlIiAiU0YsU0ksU0YiKV0pCiAKLShkZWZpbmVf bW9kZV9pdGVyYXRvciBNT0RFU0ggW1NGIEhGXSkKKyhkZWZpbmVfbW9kZV9pdGVyYXRvciBNT0RF U0ggW1NGIEhGIEJGXSkKIDs7ICUlJSBLaWxsIHRoaXMgd2hlbiBjYWxsIGtub3dzIGhvdyB0byB3 b3JrIHRoaXMgb3V0LgogKGRlZmluZV9zcGxpdAogICBbKHNldCAobWF0Y2hfb3BlcmFuZDpNT0RF U0ggMCAicHVzaF9vcGVyYW5kIikKQEAgLTM5NTAsMTggKzM5NTIsMjEgQEAKIAkgICBdCiAJICAg KGNvbnN0X3N0cmluZyAiKiIpKSldKQogCi0oZGVmaW5lX2luc24gIiptb3ZoZl9pbnRlcm5hbCIK LSBbKHNldCAobWF0Y2hfb3BlcmFuZDpIRiAwICJub25pbW1lZGlhdGVfb3BlcmFuZCIKKyhkZWZp bmVfbW9kZV9hdHRyIGhmYmZjb25zdGYKKyBbKEhGICJGIikgKEJGICIiKV0pCisKKyhkZWZpbmVf aW5zbiAiKm1vdjxtb2RlPl9pbnRlcm5hbCIKKyBbKHNldCAobWF0Y2hfb3BlcmFuZDpIRkJGIDAg Im5vbmltbWVkaWF0ZV9vcGVyYW5kIgogCSAiPT9yLD9yLD9yLD9tLHYsdiw/cixtLD92LHYiKQot ICAgICAgIChtYXRjaF9vcGVyYW5kOkhGIDEgImdlbmVyYWxfb3BlcmFuZCIKLQkgInIgICxGICxt ICxyRixDLHYsIHYsdixyICxtIikpXQorICAgICAgIChtYXRjaF9vcGVyYW5kOkhGQkYgMSAiZ2Vu ZXJhbF9vcGVyYW5kIgorCSAiciAgLEYgLG0gLHI8aGZiZmNvbnN0Zj4sQyx2LCB2LHYsciAsbSIp KV0KICAiIShNRU1fUCAob3BlcmFuZHNbMF0pICYmIE1FTV9QIChvcGVyYW5kc1sxXSkpCiAgICYm IChscmFfaW5fcHJvZ3Jlc3MKICAgICAgIHx8IHJlbG9hZF9jb21wbGV0ZWQKICAgICAgIHx8ICFD T05TVF9ET1VCTEVfUCAob3BlcmFuZHNbMV0pCiAgICAgICB8fCAoVEFSR0VUX1NTRTIKLQkgICYm IHN0YW5kYXJkX3NzZV9jb25zdGFudF9wIChvcGVyYW5kc1sxXSwgSEZtb2RlKSA9PSAxKQotICAg ICAgfHwgbWVtb3J5X29wZXJhbmQgKG9wZXJhbmRzWzBdLCBIRm1vZGUpKSIKKwkgICYmIHN0YW5k YXJkX3NzZV9jb25zdGFudF9wIChvcGVyYW5kc1sxXSwgPE1PREU+bW9kZSkgPT0gMSkKKyAgICAg IHx8IG1lbW9yeV9vcGVyYW5kIChvcGVyYW5kc1swXSwgPE1PREU+bW9kZSkpIgogewogICBzd2l0 Y2ggKGdldF9hdHRyX3R5cGUgKGluc24pKQogICAgIHsKQEAgLTQwNTYsNyArNDA2MSwxMyBAQAog CQkJIChub3QgKG1hdGNoX3Rlc3QgIlRBUkdFVF9ISU1PREVfTUFUSCIpKSkpCiAJCSAoY29uc3Rf c3RyaW5nICJTSSIpCiAJICAgICAgXQotCSAgICAgIChjb25zdF9zdHJpbmcgIkhJIikpKV0pCisJ ICAgICAgKGNvbnN0X3N0cmluZyAiSEkiKSkpCisgICAoc2V0IChhdHRyICJlbmFibGVkIikKKwko Y29uZCBbKGFuZCAobWF0Y2hfdGVzdCAiPE1PREU+bW9kZSA9PSBCRm1vZGUiKQorCQkgICAgKGVx X2F0dHIgImFsdGVybmF0aXZlIiAiMSIpKQorCQkoc3ltYm9sX3JlZiAiZmFsc2UiKQorCSAgICAg IF0KKwkgICAgICAoY29uc3Rfc3RyaW5nICIqIikpKV0pCiAKIChkZWZpbmVfc3BsaXQKICAgWyhz ZXQgKG1hdGNoX29wZXJhbmQgMCAiYW55X2ZwX3JlZ2lzdGVyX29wZXJhbmQiKQpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nKysudGFyZ2V0L2kzODYvYmZsb2F0X2NwcF90eXBlY2hlY2suQyBi L2djYy90ZXN0c3VpdGUvZysrLnRhcmdldC9pMzg2L2JmbG9hdF9jcHBfdHlwZWNoZWNrLkMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjUxNTIzMzZlZmU2Ci0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nKysudGFyZ2V0L2kzODYvYmZsb2F0X2NwcF90eXBl Y2hlY2suQwpAQCAtMCwwICsxLDEwIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBk Zy1vcHRpb25zICItbXNzZTIgLU8zIC0tc2F2ZS10ZW1wcyIgfSAqLworCit2b2lkIGZvbyAodm9p ZCkKK3sKKyAgX19iZjE2ICgpOyAvKiB7IGRnLWJvZ3VzIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8g dHlwZSAnX19iZjE2J30gIiIgeyB4ZmFpbCAqLSotKiB9IH0gKi8KKyAgX19iZjE2IGEgPSBfX2Jm MTYoKTsgLyogeyBkZy1ib2d1cyB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9 ICIiIHsgeGZhaWwgKi0qLSogfSB9ICovCisgIF9fYmYxNiAoMHgxMjM0KTsgLyogeyBkZy1lcnJv ciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgX19iZjE2ICgw LjEpOyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30g fSAqLworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYmZsb2F0 MTYtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYmZsb2F0MTYtMS5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42YWFlYzI4ZWZkMgotLS0gL2Rldi9u dWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2JmbG9hdDE2LTEuYwpAQCAt MCwwICsxLDEyIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICIt bXNzZTIgLU8yIiB9ICovCitfX2JmMTYKK2ZvbyAoaW50IGEpCit7CisgIHVuaW9uIHsKKyAgICBp bnQgYTsKKyAgICBfX2JmMTYgYjsKKyAgfWM7CisgIGMuYSA9IGE7CisgIHJldHVybiBjLmI7Cit9 CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9zc2UyLWJmbG9hdDE2 LTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItYmZsb2F0MTYtMS5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42MTJkNTViZTgyNgotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItYmZsb2F0MTYt MS5jCkBAIC0wLDAgKzEsOCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8yIC1tbm8tc3NlMiIgfSAqLworCitfX2JmMTYvKiB7IGRnLWVycm9yICJ1bmtub3du IHR5cGUgbmFtZSAnX19iZjE2JyIgfSAqLworZm9vIChfX2JmMTYgeCkgLyogeyBkZy1lcnJvciAi dW5rbm93biB0eXBlIG5hbWUgJ19fYmYxNiciIH0gKi8KK3sKKyAgcmV0dXJuIHg7Cit9CmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9zc2UyLWJmbG9hdDE2LTIuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItYmZsb2F0MTYtMi5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5hMzI4NmUyNmM0OAotLS0gL2Rldi9udWxs CisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItYmZsb2F0MTYtMi5jCkBA IC0wLDAgKzEsMTcgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMg Ii1PMiAtbXNzZTIgLW1uby1hdng1MTJmIiB9ICovCisKK3VuaW9uIGZsdAoreworICBfX2JmMTYg Zmx0OworICBzaG9ydCBzOworfTsKKworX19iZjE2Citmb28gKHVuaW9uIGZsdCB4KQoreworICBy ZXR1cm4geC5mbHQ7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciB7KD9uKXBp bnNyd1tcdCBdLioleG1tMH0geyB0YXJnZXQgaWEzMiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyIHsoP24pbW92ZFtcdCBdLioleG1tMH0geyB0YXJnZXQgeyAhIGlhMzIg fSB9IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvc3Nl Mi1iZmxvYXQxNi1zY2FsYXItdHlwZWNoZWNrLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9zc2UyLWJmbG9hdDE2LXNjYWxhci10eXBlY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMC4uZjc2ZDU1NDc3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9zc2UyLWJmbG9hdDE2LXNjYWxhci10eXBlY2hlY2su YwpAQCAtMCwwICsxLDIxNSBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLW1zc2UyIC1PMiIgfSAqLworCisKK19fYmYxNiBnbG9iX2JmbG9hdDsKKworaW50IGlz X2FuX2ludDsKK3Nob3J0IGlzX2Ffc2hvcnRfaW50OworZmxvYXQgaXNfYV9mbG9hdDsKK2Zsb2F0 IGlzX2FfZmxvYXQxNjsKK2RvdWJsZSBpc19hX2RvdWJsZTsKKworZmxvYXQgKmZsb2F0X3B0cjsK KworX19iZjE2IGZvbzEgKHZvaWQpIHsgcmV0dXJuIChfX2JmMTYpIDB4MTIzNDsgfSAvKiB7IGRn LWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLworX19iZjE2 IGZvbzIgKHZvaWQpIHsgcmV0dXJuIChfX2JmMTYpIChzaG9ydCkgMHgxMjM0OyB9IC8qIHsgZGct ZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYnfSB9ICovCisKK19fYmYx NiBmb290ZXN0IChfX2JmMTYgc2NhbGFyMCkKK3sKKworICAvKiBJbml0aWFsaXNhdGlvbiAgKi8K KworICBfX2JmMTYgc2NhbGFyMV8xOworICBfX2JmMTYgc2NhbGFyMV8yID0gZ2xvYl9iZmxvYXQ7 CisgIF9fYmYxNiBzY2FsYXIxXzMgPSAwOyAgIC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVy c2lvbiB0byB0eXBlICdfX2JmMTYnfSB9ICovCisgIF9fYmYxNiBzY2FsYXIxXzQgPSAwLjE7IC8q IHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYnfSB9ICovCisg IF9fYmYxNiBzY2FsYXIxXzUgPSBpc19hX2Zsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNv bnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLworICBfX2JmMTYgc2NhbGFyMV82ID0gaXNf YW5faW50OyAgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYx Nid9IH0gKi8KKyAgX19iZjE2IHNjYWxhcjFfNyA9IGlzX2FfZmxvYXQxNjsgLyogeyBkZy1lcnJv ciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgX19iZjE2IHNj YWxhcjFfOCA9IGlzX2FfZG91YmxlOyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24g dG8gdHlwZSAnX19iZjE2J30gfSAqLworICBfX2JmMTYgc2NhbGFyMV85ID0gaXNfYV9zaG9ydF9p bnQ7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYnfSB9 ICovCisKKyAgaW50IGluaXRpXzFfMSA9IGdsb2JfYmZsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZh bGlkIGNvbnZlcnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICovCisgIGZsb2F0IGluaXRpXzFf MiA9IGdsb2JfYmZsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0 eXBlICdfX2JmMTYnfSB9ICovCisgIF9GbG9hdDE2IGluaXRpXzFfMyA9IGdsb2JfYmZsb2F0OyAv KiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICov CisgIHNob3J0IGluaXRpXzFfNCA9IGdsb2JfYmZsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlk IGNvbnZlcnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICovCisgIGRvdWJsZSBpbml0aV8xXzUg PSBnbG9iX2JmbG9hdDsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlw ZSAnX19iZjE2J30gfSAqLworCisgIF9fYmYxNiBzY2FsYXIyXzEgPSB7fTsgLyogeyBkZy1lcnJv ciB7ZW1wdHkgc2NhbGFyIGluaXRpYWxpemVyfSB9ICovCisgIF9fYmYxNiBzY2FsYXIyXzIgPSB7 IGdsb2JfYmZsb2F0IH07CisgIF9fYmYxNiBzY2FsYXIyXzMgPSB7IDAgfTsgLyogeyBkZy1lcnJv ciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgX19iZjE2IHNj YWxhcjJfNCA9IHsgMC4xIH07IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0 eXBlICdfX2JmMTYnfSB9ICovCisgIF9fYmYxNiBzY2FsYXIyXzUgPSB7IGlzX2FfZmxvYXQgfTsg LyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8K KyAgX19iZjE2IHNjYWxhcjJfNiA9IHsgaXNfYW5faW50IH07IC8qIHsgZGctZXJyb3Ige2ludmFs aWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYnfSB9ICovCisgIF9fYmYxNiBzY2FsYXIyXzcg PSB7IGlzX2FfZmxvYXQxNiB9OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8g dHlwZSAnX19iZjE2J30gfSAqLworICBfX2JmMTYgc2NhbGFyMl84ID0geyBpc19hX2RvdWJsZSB9 OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAq LworICBfX2JmMTYgc2NhbGFyMl85ID0geyBpc19hX3Nob3J0X2ludCB9OyAvKiB7IGRnLWVycm9y IHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLworCisgIGludCBpbml0 aV8yXzEgPSB7IGdsb2JfYmZsb2F0IH07IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lv biBmcm9tIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgZmxvYXQgaW5pdGlfMl8yID0geyBnbG9iX2Jm bG9hdCB9OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0eXBlICdfX2Jm MTYnfSB9ICovCisgIF9GbG9hdDE2IGluaXRpXzJfMyA9IHsgZ2xvYl9iZmxvYXQgfTsgLyogeyBk Zy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlwZSAnX19iZjE2J30gfSAqLworICBz aG9ydCBpbml0aV8yXzQgPSB7IGdsb2JfYmZsb2F0IH07IC8qIHsgZGctZXJyb3Ige2ludmFsaWQg Y29udmVyc2lvbiBmcm9tIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgZG91YmxlIGluaXRpXzJfNSA9 IHsgZ2xvYl9iZmxvYXQgfTsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20g dHlwZSAnX19iZjE2J30gfSAqLworCisgIC8qIEFzc2lnbm1lbnRzLiAgKi8KKworICBnbG9iX2Jm bG9hdCA9IGdsb2JfYmZsb2F0OworICBnbG9iX2JmbG9hdCA9IDA7ICAgLyogeyBkZy1lcnJvciB7 aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgZ2xvYl9iZmxvYXQg PSAwLjE7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYn fSB9ICovCisgIGdsb2JfYmZsb2F0ID0gaXNfYV9mbG9hdDsgLyogeyBkZy1lcnJvciB7aW52YWxp ZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgZ2xvYl9iZmxvYXQgPSBpc19h bl9pbnQ7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYn fSB9ICovCisgIGdsb2JfYmZsb2F0ID0gaXNfYV9mbG9hdDE2OyAvKiB7IGRnLWVycm9yIHtpbnZh bGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLworICBnbG9iX2JmbG9hdCA9IGlz X2FfZG91YmxlOyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19i ZjE2J30gfSAqLworICBnbG9iX2JmbG9hdCA9IGlzX2Ffc2hvcnRfaW50OyAvKiB7IGRnLWVycm9y IHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLworCisgIGlzX2FuX2lu dCA9IGdsb2JfYmZsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0 eXBlICdfX2JmMTYnfSB9ICovCisgIGlzX2FfZmxvYXQgPSBnbG9iX2JmbG9hdDsgLyogeyBkZy1l cnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlwZSAnX19iZjE2J30gfSAqLworICBpc19h X2Zsb2F0MTYgPSBnbG9iX2JmbG9hdDsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9u IGZyb20gdHlwZSAnX19iZjE2J30gfSAqLworICBpc19hX2RvdWJsZSA9IGdsb2JfYmZsb2F0OyAv KiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICov CisgIGlzX2Ffc2hvcnRfaW50ID0gZ2xvYl9iZmxvYXQ7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQg Y29udmVyc2lvbiBmcm9tIHR5cGUgJ19fYmYxNid9IH0gKi8KKworICAvKiBDYXN0aW5nLiAgKi8K KworICAodm9pZCkgZ2xvYl9iZmxvYXQ7CisgIChfX2JmMTYpIGdsb2JfYmZsb2F0OworCisgIChp bnQpIGdsb2JfYmZsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0 eXBlICdfX2JmMTYnfSB9ICovCisgIChmbG9hdCkgZ2xvYl9iZmxvYXQ7IC8qIHsgZGctZXJyb3Ig e2ludmFsaWQgY29udmVyc2lvbiBmcm9tIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgKF9GbG9hdDE2 KSBnbG9iX2JmbG9hdDsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlw ZSAnX19iZjE2J30gfSAqLworICAoZG91YmxlKSBnbG9iX2JmbG9hdDsgLyogeyBkZy1lcnJvciB7 aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlwZSAnX19iZjE2J30gfSAqLworICAoc2hvcnQpIGds b2JfYmZsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0eXBlICdf X2JmMTYnfSB9ICovCisKKyAgKF9fYmYxNikgaXNfYW5faW50OyAvKiB7IGRnLWVycm9yIHtpbnZh bGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLworICAoX19iZjE2KSBpc19hX2Zs b2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30g fSAqLworICAoX19iZjE2KSBpc19hX2Zsb2F0MTY7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29u dmVyc2lvbiB0byB0eXBlICdfX2JmMTYnfSB9ICovCisgIChfX2JmMTYpIGlzX2FfZG91YmxlOyAv KiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLwor ICAoX19iZjE2KSBpc19hX3Nob3J0X2ludDsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJz aW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKworICAvKiBDb21wb3VuZCBsaXRlcmFscy4gICov CisKKyAgKF9fYmYxNikge307IC8qIHsgZGctZXJyb3Ige2VtcHR5IHNjYWxhciBpbml0aWFsaXpl cn0gfSAqLworICAoX19iZjE2KSB7IGdsb2JfYmZsb2F0IH07CisgIChfX2JmMTYpIHsgMCB9OyAv KiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8gdHlwZSAnX19iZjE2J30gfSAqLwor ICAoX19iZjE2KSB7IDAuMSB9OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8g dHlwZSAnX19iZjE2J30gfSAqLworICAoX19iZjE2KSB7IGlzX2FfZmxvYXQgfTsgLyogeyBkZy1l cnJvciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgKF9fYmYx NikgeyBpc19hbl9pbnQgfTsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5 cGUgJ19fYmYxNid9IH0gKi8KKyAgKF9fYmYxNikgeyBpc19hX2Zsb2F0MTYgfTsgLyogeyBkZy1l cnJvciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgKF9fYmYx NikgeyBpc19hX2RvdWJsZSB9OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gdG8g dHlwZSAnX19iZjE2J30gfSAqLworICAoX19iZjE2KSB7IGlzX2Ffc2hvcnRfaW50IH07IC8qIHsg ZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiB0byB0eXBlICdfX2JmMTYnfSB9ICovCisKKyAg KGludCkgeyBnbG9iX2JmbG9hdCB9OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24g ZnJvbSB0eXBlICdfX2JmMTYnfSB9ICovCisgIChmbG9hdCkgeyBnbG9iX2JmbG9hdCB9OyAvKiB7 IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICovCisg IChfRmxvYXQxNikgeyBnbG9iX2JmbG9hdCB9OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZl cnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICovCisgIChkb3VibGUpIHsgZ2xvYl9iZmxvYXQg fTsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlwZSAnX19iZjE2J30g fSAqLworICAoc2hvcnQpIHsgZ2xvYl9iZmxvYXQgfTsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBj b252ZXJzaW9uIGZyb20gdHlwZSAnX19iZjE2J30gfSAqLworCisgIC8qIEFycmF5cyBhbmQgU3Ry dWN0cy4gICovCisKKyAgdHlwZWRlZiBfX2JmMTYgYXJyYXlfdHlwZVsyXTsKKyAgZXh0ZXJuIF9f YmYxNiBleHRlcm5fYXJyYXlbXTsKKworICBfX2JmMTYgYXJyYXlbMl07CisgIF9fYmYxNiB6ZXJv X2xlbmd0aF9hcnJheVswXTsKKyAgX19iZjE2IGVtcHR5X2luaXRfYXJyYXlbXSA9IHt9OworICB0 eXBlZGVmIF9fYmYxNiBzb21lX290aGVyX3R5cGVbaXNfYW5faW50XTsKKworICBzdHJ1Y3Qgc3Ry dWN0MSB7CisgICAgX19iZjE2IGE7CisgIH07CisKKyAgdW5pb24gdW5pb24xIHsKKyAgICBfX2Jm MTYgYTsKKyAgfTsKKworICAvKiBBZGRyZXNzaW5nIGFuZCBkZXJlZmVyZW5jaW5nLiAgKi8KKwor ICBfX2JmMTYgKmJmbG9hdF9wdHIgPSAmc2NhbGFyMDsKKyAgc2NhbGFyMCA9ICpiZmxvYXRfcHRy OworCisgIC8qIFBvaW50ZXIgYXNzaWdubWVudC4gICovCisKKyAgX19iZjE2ICpiZmxvYXRfcHRy MiA9IGJmbG9hdF9wdHI7CisgIF9fYmYxNiAqYmZsb2F0X3B0cjMgPSBhcnJheTsKKworICAvKiBQ b2ludGVyIGFyaXRobWV0aWMuICAqLworCisgICsrYmZsb2F0X3B0cjsKKyAgLS1iZmxvYXRfcHRy OworICBiZmxvYXRfcHRyKys7CisgIGJmbG9hdF9wdHItLTsKKyAgYmZsb2F0X3B0ciArPSAxOwor ICBiZmxvYXRfcHRyIC09IDE7CisgIGJmbG9hdF9wdHIgLSBiZmxvYXRfcHRyMjsKKyAgYmZsb2F0 X3B0ciA9ICZiZmxvYXRfcHRyM1swXTsKKyAgYmZsb2F0X3B0ciA9ICZiZmxvYXRfcHRyM1sxXTsK KworICAvKiBTaW1wbGUgY29tcGFyaXNvbi4gICovCisgIHNjYWxhcjAgPiBnbG9iX2JmbG9hdDsg LyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30g fSAqLworICBnbG9iX2JmbG9hdCA9PSBzY2FsYXIwOyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24g bm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2JmMTYnfSB9ICovCisgIHNjYWxhcjAgPiBpc19hX2Zs b2F0OyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2Jm MTYnfSB9ICovCisgIGlzX2FfZmxvYXQgPT0gc2NhbGFyMDsgLyogeyBkZy1lcnJvciB7b3BlcmF0 aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30gfSAqLworICBzY2FsYXIwID4gMDsg LyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30g fSAqLworICAwID09IHNjYWxhcjA7IC8qIHsgZGctZXJyb3Ige29wZXJhdGlvbiBub3QgcGVybWl0 dGVkIG9uIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgc2NhbGFyMCA+IDAuMTsgLyogeyBkZy1lcnJv ciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30gfSAqLworICAwLjEg PT0gc2NhbGFyMDsgLyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlw ZSAnX19iZjE2J30gfSAqLworICBzY2FsYXIwID4gaXNfYW5faW50OyAvKiB7IGRnLWVycm9yIHtv cGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2JmMTYnfSB9ICovCisgIGlzX2FuX2lu dCA9PSBzY2FsYXIwOyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0 eXBlICdfX2JmMTYnfSB9ICovCisKKyAgLyogUG9pbnRlciBjb21wYXJpc29uLiAgKi8KKworICBi ZmxvYXRfcHRyID09ICZzY2FsYXIwOworICBiZmxvYXRfcHRyICE9ICZzY2FsYXIwOworICBiZmxv YXRfcHRyIDwgJnNjYWxhcjA7CisgIGJmbG9hdF9wdHIgPD0gJnNjYWxhcjA7CisgIGJmbG9hdF9w dHIgPiAmc2NhbGFyMDsKKyAgYmZsb2F0X3B0ciA+PSAmc2NhbGFyMDsKKyAgYmZsb2F0X3B0ciA9 PSBiZmxvYXRfcHRyMjsKKyAgYmZsb2F0X3B0ciAhPSBiZmxvYXRfcHRyMjsKKyAgYmZsb2F0X3B0 ciA8IGJmbG9hdF9wdHIyOworICBiZmxvYXRfcHRyIDw9IGJmbG9hdF9wdHIyOworICBiZmxvYXRf cHRyID4gYmZsb2F0X3B0cjI7CisgIGJmbG9hdF9wdHIgPj0gYmZsb2F0X3B0cjI7CisKKyAgLyog Q29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuICAqLworCisgIDAgPyBzY2FsYXIwIDogc2NhbGFyMDsK KyAgMCA/IHNjYWxhcjAgOiBpc19hX2Zsb2F0OyAvKiB7IGRnLWVycm9yIHtpbnZhbGlkIGNvbnZl cnNpb24gZnJvbSB0eXBlICdfX2JmMTYnfSB9ICovCisgIDAgPyBpc19hX2Zsb2F0IDogc2NhbGFy MDsgLyogeyBkZy1lcnJvciB7aW52YWxpZCBjb252ZXJzaW9uIGZyb20gdHlwZSAnX19iZjE2J30g fSAqLworICAwID8gc2NhbGFyMCA6IDA7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lv biB0byB0eXBlICdfX2JmMTYnfSB9ICovCisgIDAgPyAwIDogc2NhbGFyMDsgLyogeyBkZy1lcnJv ciB7aW52YWxpZCBjb252ZXJzaW9uIHRvIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgMCA/IDAuMSA6 IHNjYWxhcjA7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQgY29udmVyc2lvbiBmcm9tIHR5cGUgJ19f YmYxNid9IH0gKi8KKyAgMCA/IHNjYWxhcjAgOiAwLjE7IC8qIHsgZGctZXJyb3Ige2ludmFsaWQg Y29udmVyc2lvbiBmcm9tIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgMCA/IGJmbG9hdF9wdHIgOiBi ZmxvYXRfcHRyMjsKKyAgMCA/IGJmbG9hdF9wdHIgOiBmbG9hdF9wdHI7IC8qIHsgZGctd2Fybmlu ZyB7cG9pbnRlciB0eXBlIG1pc21hdGNoIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb259IH0gKi8K KyAgMCA/IGZsb2F0X3B0ciA6IGJmbG9hdF9wdHI7IC8qIHsgZGctd2FybmluZyB7cG9pbnRlciB0 eXBlIG1pc21hdGNoIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb259IH0gKi8KKworICBzY2FsYXIw ID8gc2NhbGFyMCA6IHNjYWxhcjA7IC8qIHsgZGctZXJyb3Ige29wZXJhdGlvbiBub3QgcGVybWl0 dGVkIG9uIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgc2NhbGFyMCA/IGlzX2FfZmxvYXQgOiBzY2Fs YXIwOyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2Jm MTYnfSB9ICovCisgIHNjYWxhcjAgPyBzY2FsYXIwIDogaXNfYV9mbG9hdDsgLyogeyBkZy1lcnJv ciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30gfSAqLworICBzY2Fs YXIwID8gaXNfYV9mbG9hdCA6IGlzX2FfZmxvYXQ7IC8qIHsgZGctZXJyb3Ige29wZXJhdGlvbiBu b3QgcGVybWl0dGVkIG9uIHR5cGUgJ19fYmYxNid9IH0gKi8KKworICAvKiBVbmFyeSBvcGVyYXRv cnMuICAqLworCisgICtzY2FsYXIwOyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1p dHRlZCBvbiB0eXBlICdfX2JmMTYnfSB9ICovCisgIC1zY2FsYXIwOyAvKiB7IGRnLWVycm9yIHtv cGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2JmMTYnfSB9ICovCisgIH5zY2FsYXIw OyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2JmMTYn fSB9ICovCisgICFzY2FsYXIwOyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRl ZCBvbiB0eXBlICdfX2JmMTYnfSB9ICovCisgICpzY2FsYXIwOyAvKiB7IGRnLWVycm9yIHtpbnZh bGlkIHR5cGUgYXJndW1lbnQgb2YgdW5hcnkgJ1wqJ30gfSAqLworICBfX3JlYWwgc2NhbGFyMDsg LyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30g fSAqLworICBfX2ltYWcgc2NhbGFyMDsgLyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJt aXR0ZWQgb24gdHlwZSAnX19iZjE2J30gfSAqLworICArK3NjYWxhcjA7IC8qIHsgZGctZXJyb3Ig e29wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIHR5cGUgJ19fYmYxNid9IH0gKi8KKyAgLS1zY2Fs YXIwOyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0eXBlICdfX2Jm MTYnfSB9ICovCisgIHNjYWxhcjArKzsgLyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJt aXR0ZWQgb24gdHlwZSAnX19iZjE2J30gfSAqLworICBzY2FsYXIwLS07IC8qIHsgZGctZXJyb3Ig e29wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIHR5cGUgJ19fYmYxNid9IH0gKi8KKworICAvKiBC aW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zLiAgKi8KKworICBzY2FsYXIwID0gZ2xvYl9iZmxv YXQgKyAqYmZsb2F0X3B0cjsgLyogeyBkZy1lcnJvciB7b3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQg b24gdHlwZSAnX19iZjE2J30gfSAqLworICBzY2FsYXIwID0gZ2xvYl9iZmxvYXQgKyAwLjE7IC8q IHsgZGctZXJyb3Ige29wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIHR5cGUgJ19fYmYxNid9IH0g Ki8KKyAgc2NhbGFyMCA9IGdsb2JfYmZsb2F0ICsgMDsgLyogeyBkZy1lcnJvciB7b3BlcmF0aW9u IG5vdCBwZXJtaXR0ZWQgb24gdHlwZSAnX19iZjE2J30gfSAqLworICBzY2FsYXIwID0gZ2xvYl9i ZmxvYXQgKyBpc19hX2Zsb2F0OyAvKiB7IGRnLWVycm9yIHtvcGVyYXRpb24gbm90IHBlcm1pdHRl ZCBvbiB0eXBlICdfX2JmMTYnfSB9ICovCisKKyAgcmV0dXJuIHNjYWxhcjA7Cit9CisKLS0gCjIu MTguMgoK --_002_DM4PR11MB5487E41874F9942CBC57A07BEC9C9DM4PR11MB5487namp_--