From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2056.outbound.protection.outlook.com [40.107.20.56]) by sourceware.org (Postfix) with ESMTPS id CDDDC38327D5 for ; Thu, 16 Jun 2022 11:28:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CDDDC38327D5 ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=VmhhDruwuNmCHpVERU+BbJgLXLE51lEpwEcqiwh0Po8fyGLORh/TmCtl5iZhdlAWHZfYzmjreqSUev0qzx8yOhC/AK5lNRDR56dDsLHQ7YbUY2jcsgfi5gfcAuGYBxb3gWKzfsLVqLURlUr9jqnzZND+Vu8QmfWmM/70Awtl3jIA9g9n+TmnDsF4IOIDyvOE8rPYz4rxKLT7TTFn60cQyfbuZo0GEDtix8+1N7vQ0C48e0ZJUFNHyUcFoCaE+CEJ+VQRt7j1pdDustIlsjFX0zjvJIt0SIll9N6X40CPEL2aGSvIvwCq4u+nwTEcvYAQNyZFzbBdSSFO10rwFNLNqg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bjZTTscz8vcf4ABK0nEYFjlFMA/8cXefuEILwPjdNcM=; b=EGWUQs0noQsfCHX4eTANI+BIY8owJUTmeL4PTSs0zTo3YvNv0rqYnfuCPayCTvXv1cuGw+B5P+WLEIdLPrij83D5fsitxhUaf3HhivWwFo2XccilpaHGM64ECF29tAVc5Fz2Wo0VhDej44qzQjvc9aFCSx1sccGJhNQj4GI4gbe0nH0w0a0xuAi489yVD7HdI56o0pFWUQBff7VMt15ASX0XCyGedg4YHPh4wpz8eR2zHrTZ/XN8zLpBPLxHfZOIYCckBbUzpDUQRJ/udUEhUcDUiRZtoyq/jwm845HnsVhkNodOJT8WpLX0+aSY6lhJazh+jqQJt/whrciwNmHu3Q== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) Received: from AS9PR06CA0212.eurprd06.prod.outlook.com (2603:10a6:20b:45e::33) by DB7PR08MB3241.eurprd08.prod.outlook.com (2603:10a6:5:1f::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5332.14; Thu, 16 Jun 2022 11:28:49 +0000 Received: from AM5EUR03FT035.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:45e:cafe::71) by AS9PR06CA0212.outlook.office365.com (2603:10a6:20b:45e::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.15 via Frontend Transport; Thu, 16 Jun 2022 11:28:49 +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 AM5EUR03FT035.mail.protection.outlook.com (10.152.16.119) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.14 via Frontend Transport; Thu, 16 Jun 2022 11:28:48 +0000 Received: ("Tessian outbound 1766a3bff204:v120"); Thu, 16 Jun 2022 11:28:48 +0000 X-CR-MTA-TID: 64aa7808 Received: from eea2aa03c1d1.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id BEBC4DDE-035F-4547-B1AF-16E6F886A24F.1; Thu, 16 Jun 2022 11:28:38 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id eea2aa03c1d1.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 16 Jun 2022 11:28:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PVKVwv3Gi57FpNz8jskXYjZh+mMW9zWFvNXQa1omeUikcnMOEb6InEqkmNJa7urKk9DGwd7kiNuS1UjFjzSx96BCT0AIW0UmevV45Pa7yyOGQrSb0swUfuffMBYpCRlLyJ0EDinZn49niGO2i5LbVeUBlfN6gNZ2+sGW4UMBsW1yB+n1dQ8sVvJ4+wOC3SiuM+wEp9xsDCjsnhx0FegfpmWdYY8dFASUxmaRN1gL2ZPY9Yo5hWNj+jvUO3bllU2yD2MMBWBAw2vlaYXhhpM4hGdtFbprRnsNo5ASB5OVDvz69zyd7Wft+SypwQeVI9owv5vATtlNwIuDmY2DD8jz8w== 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=bjZTTscz8vcf4ABK0nEYFjlFMA/8cXefuEILwPjdNcM=; b=WnAToGsZM/qMru0ji0g88P7HhmhwV8uLxJ0yX9c8ToLy24b45E9jFUgpxC9esFK9DUG1aal5ytA1wr/McQJc7gEgXq11fBsW6V58J1YlnGjvzMU1FQmiU515TzEpJQLMavcJXrV6NBpkfY8JrT74W4LIRYkXuCr4lSAGW4VVe4EJYYMW2sMeVDVa0jpl7oZVVCY4qaVbizXgQZfpNQ/Sd8A/qG36Ek4W/ls5zt7aucCKhFQNBHhEUeOMR5IfMWoqito6FrbJUXBegJJgxytaUc1+gOWZ6W6NLlI40gLys+FvyOqR2/XihiJ/0lshdAsM2Pn+HtqDibYDTRGEozaGTA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by HE1PR08MB2939.eurprd08.prod.outlook.com (2603:10a6:7:33::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.15; Thu, 16 Jun 2022 11:28:35 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::54e5:594b:e5fd:a9b4]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::54e5:594b:e5fd:a9b4%8]) with mapi id 15.20.5353.014; Thu, 16 Jun 2022 11:28:35 +0000 From: Tamar Christina To: Richard Sandiford CC: "gcc-patches@gcc.gnu.org" , nd , "rguenther@suse.de" , Jeff Law Subject: RE: [PATCH]middle-end Use subregs to expand COMPLEX_EXPR to set the lowpart. Thread-Topic: [PATCH]middle-end Use subregs to expand COMPLEX_EXPR to set the lowpart. Thread-Index: AQHYe9XlxiTlB02wnkC8AdBzUec/ca1NCuW9gATkHbA= Date: Thu, 16 Jun 2022 11:28:35 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ts-tracking-id: 84AEA62F3E608842838EBE1292F0588B.0 x-checkrecipientchecked: true Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-MS-Office365-Filtering-Correlation-Id: 773afb52-22c2-468f-9493-08da4f8b61ee x-ms-traffictypediagnostic: HE1PR08MB2939:EE_|AM5EUR03FT035:EE_|DB7PR08MB3241:EE_ X-Microsoft-Antispam-PRVS: 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: AZuU9FX00Yo0g9f+bcRiyg8EhzkdhRW8irlstnyYqJtc7ZPj+hJTO0fuSJXNUqA7/haCqqnE8JBcjxK05c4R3cmVGO2wAB3ZZJhqI4xwMRygtVnn4JMxH5par2dBRVSEkOq1pHUdoILlqK9ajCNQqju6dBG8vezm5LiUjJip/q3awb8P5enjcD1BcKP1CP3VAWeRVoQLsbR59SUKGy+QX8xcThd7YQMgQx9GxuT2qMABmb3yLwWYrn74SJegmkRE8sJzyNzRVRFsek/BYWSN9IkmG5IS4HCntevehBPU019hHBqAedr43qyKwLTcwlezD7RZ0lmKdrl66To3b9pmEcEnbDIqdTqZdL3uBf3NkMyfqoZImDyRja7jFU/nFzUDtcHrqR3b1l8xJj8+X2k//ME/F8OTG+bzhPHQ3QXqz5CxURmLwmMupQBazuC4UBypWZWbKe3lrFzPUu9Mv0jrXue9BdNmzyaMVeQikU5ZGGcNl6MsXdqTgI0ykDGzBVIXMFe0vkslvw9vuRNz6Q9Iuvyn+9uopQUUWFTHamvSmEAUJ7r+YmerlFRISFoteYJxDZIH/5H5t11b3BdMNnsRrFbk6zdu92zhzEVRUfAO4OO4UpPbdGybi55VEzE/zgdfJRRMq0UPeGq0zlrnw2hS/xDqekDX/8nyIH1BrxNjczatfO2TBB9+lPOqxw4JwCCdJZi2bPvorKRMM71S3SZLpA== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR08MB5325.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(4636009)(366004)(2906002)(5660300002)(6862004)(8936002)(66556008)(30864003)(66946007)(76116006)(316002)(66476007)(6636002)(8676002)(4326008)(66446008)(64756008)(54906003)(6506007)(71200400001)(7696005)(33656002)(53546011)(52536014)(508600001)(55016003)(38100700002)(26005)(9686003)(38070700005)(86362001)(186003)(83380400001)(99936003)(122000001)(579004); DIR:OUT; SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB532580D7E9614353CA5B919CFFAC9VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR08MB2939 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: AM5EUR03FT035.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 818efbfa-b0ef-4812-bcea-08da4f8b59ba X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: A+x+PtgPpONKS/KnbDO17QPHV9/4wdDKFaTW8+ZPrUAbFA8ApopzMPwbJyhoOoiZAtNYUI8Jj8/dIpST/WYE1k9z74nLjGZeBqzIQp9tN+GDArM4lWMh7fpkvh3sN2mOoqtDrxbvgJF/lIBFWiKLGv79PUHkNQa68JUD9YcXS+/S4TpkJ/D6TwpR/WrbLuIs5Jxknc7SSVek59zcT3hlii5i5JX9I8i2Z3hiEt26ulC8gSwQ/iK0qRyaJ9sOWVvy6Qv6uahypEgT20Y/AJBgf/r9msORJwKd/5UrXLVKNTEBxTLSA/3woLOrRxHQZ5KXPfFwIpfP9W61onVcJa+V7tMuc7yjo5W86RfxWj67BpmNxb4/zFoMo4D8q7xJnasI4foArvymcRsgSDBpfF/VeE+YeE7F8QWtiyzQUT8XUHWKOv8z3AhMY037YXIihE8ojpv83mmnZtMiJHnYu1ZK/gR/8mgz+bao2Y4UkfhAaqUvrHsxnCMcL37XirUpO3Ob8CviIH0+VHNoQZZxFk7T5Eps4uNYwUUHBDqBuGy1RE9D2ETxzjT8Wcrz0AGmXzYfqc5YBLiOaYRRbKPFdVe5uiTGdE2lntqvjSvMOT5yZYflpJM9hKi8vNdfc0EhlHXmscWfmO0KvLenN+57X32ZiJgP6zWFDYBoasREmOigOxHMb38gd4Cf8Ui5dzZtPTJr 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:(13230016)(4636009)(46966006)(40470700004)(36840700001)(40460700003)(82310400005)(53546011)(99936003)(356005)(54906003)(81166007)(70206006)(2906002)(36860700001)(316002)(30864003)(7696005)(9686003)(6862004)(6506007)(26005)(186003)(235185007)(86362001)(5660300002)(8936002)(52536014)(8676002)(4326008)(83380400001)(6636002)(508600001)(336012)(55016003)(107886003)(33656002)(70586007)(47076005); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2022 11:28:48.7639 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 773afb52-22c2-468f-9493-08da4f8b61ee 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: AM5EUR03FT035.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3241 X-Spam-Status: No, score=-12.7 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 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: Thu, 16 Jun 2022 11:28:57 -0000 --_002_VI1PR08MB532580D7E9614353CA5B919CFFAC9VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > -----Original Message----- > From: Richard Sandiford > Sent: Monday, June 13, 2022 9:41 AM > To: Tamar Christina > Cc: gcc-patches@gcc.gnu.org; nd ; rguenther@suse.de > Subject: Re: [PATCH]middle-end Use subregs to expand COMPLEX_EXPR to > set the lowpart. >=20 > Tamar Christina writes: > > Hi All, > > > > When lowering COMPLEX_EXPR we currently emit two VEC_EXTRACTs. > One > > for the lowpart and one for the highpart. > > > > The problem with this is that in RTL the lvalue of the RTX is the only > > thing tying the two instructions together. > > > > This means that e.g. combine is unable to try to combine the two > > instructions for setting the lowpart and highpart. > > > > For ISAs that have bit extract instructions we can eliminate one of > > the extracts if, and only if we're setting the entire complex number. > > > > This change changes the expand code when we're setting the entire > > complex number to generate a subreg for the lowpart instead of a > vec_extract. > > > > This allows us to optimize sequences such as: > > > > _Complex int f(int a, int b) { > > _Complex int t =3D a + b * 1i; > > return t; > > } > > > > from: > > > > f: > > bfi x2, x0, 0, 32 > > bfi x2, x1, 32, 32 > > mov x0, x2 > > ret > > > > into: > > > > f: > > bfi x0, x1, 32, 32 > > ret > > > > I have also confirmed the codegen for x86_64 did not change. > > > > Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu > > and no issues. > > > > Ok for master? >=20 > I'm not sure this is endian-safe. For big-endian it's the imaginary part= that can > be written as a subreg. The real part might be the high part of a regist= er. >=20 > Maybe a more general way to handle this would be to add (yet another) > parameter to store_bit_field that indicates that the current value of the > structure is undefined. That would also be useful in at least one other = caller > (from calls.cc). write_complex_part could then have a similar parameter, > true for the first write and false for the second. Ohayou-gozaimasu! I've rewritten it using the approach you requested. I attempted to set the = flag In the correct places as well. Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: * expmed.cc (store_bit_field): Add parameter that indicates if value is still undefined and if so emit a subreg move instead. * expr.h (write_complex_part): Likewise. * expmed.h (store_bit_field): Add new parameter. * builtins.cc (expand_ifn_atomic_compare_exchange_into_call): Use new parameter. (expand_ifn_atomic_compare_exchange): Likewise. * calls.cc (store_unaligned_arguments_into_pseudos): Likewise. * emit-rtl.cc (validate_subreg): Likewise. * expr.cc (emit_group_store): Likewise. (copy_blkmode_from_reg): Likewise. (copy_blkmode_to_reg): Likewise. (clear_storage_hints): Likewise. (write_complex_part): Likewise. (emit_move_complex_parts): Likewise. (expand_assignment): Likewise. (store_expr): Likewise. (store_field): Likewise. (expand_expr_real_2): Likewise. * ifcvt.cc (noce_emit_move_insn): Likewise. * internal-fn.cc (expand_arith_set_overflow): Likewise. (expand_arith_overflow_result_store): Likewise. (expand_addsub_overflow): Likewise. (expand_neg_overflow): Likewise. (expand_mul_overflow): Likewise. (expand_arith_overflow): Likewise. gcc/testsuite/ChangeLog: * g++.target/aarch64/complex-init.C: New test. --- inline copy of patch --- diff --git a/gcc/builtins.cc b/gcc/builtins.cc index 4c6c29390531d8ae9765add598621727213b23ec..8c80e46d9c9c9c2a7e1ce0f8add= 86729fd542b16 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -6014,8 +6014,8 @@ expand_ifn_atomic_compare_exchange_into_call (gcall *= call, machine_mode mode) if (GET_MODE (boolret) !=3D mode) boolret =3D convert_modes (mode, GET_MODE (boolret), boolret, 1); x =3D force_reg (mode, x); - write_complex_part (target, boolret, true); - write_complex_part (target, x, false); + write_complex_part (target, boolret, true, true); + write_complex_part (target, x, false, false); } } =20 @@ -6070,8 +6070,8 @@ expand_ifn_atomic_compare_exchange (gcall *call) rtx target =3D expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); if (GET_MODE (boolret) !=3D mode) boolret =3D convert_modes (mode, GET_MODE (boolret), boolret, 1); - write_complex_part (target, boolret, true); - write_complex_part (target, oldval, false); + write_complex_part (target, boolret, true, true); + write_complex_part (target, oldval, false, false); } } =20 diff --git a/gcc/calls.cc b/gcc/calls.cc index e13469cfd43b5bdd4ca0d2b8458a9e4f996e36e9..586af170879ab0152e9c0634a4b= 8e0ce03ea8d6e 100644 --- a/gcc/calls.cc +++ b/gcc/calls.cc @@ -1214,7 +1214,7 @@ store_unaligned_arguments_into_pseudos (struct arg_da= ta *args, int num_actuals) =20 bytes -=3D bitsize / BITS_PER_UNIT; store_bit_field (reg, bitsize, endian_correction, 0, 0, - word_mode, word, false); + word_mode, word, false, false); } } } diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc index f4404d7abe33b565358b7f609a91114c75ecf4e7..15ffca2ffe986bca56c1fae9381= bd33f5d6b012d 100644 --- a/gcc/emit-rtl.cc +++ b/gcc/emit-rtl.cc @@ -947,9 +947,11 @@ validate_subreg (machine_mode omode, machine_mode imod= e, && GET_MODE_INNER (omode) =3D=3D GET_MODE_INNER (imode)) ; /* Subregs involving floating point modes are not allowed to - change size. Therefore (subreg:DI (reg:DF) 0) is fine, but + change size unless it's an insert into a complex mode. + Therefore (subreg:DI (reg:DF) 0) and (subreg:CS (reg:SF) 0) are fine,= but (subreg:SI (reg:DF) 0) isn't. */ - else if (FLOAT_MODE_P (imode) || FLOAT_MODE_P (omode)) + else if ((FLOAT_MODE_P (imode) || FLOAT_MODE_P (omode)) + && !COMPLEX_MODE_P (omode)) { if (! (known_eq (isize, osize) /* LRA can use subreg to store a floating point value in diff --git a/gcc/expmed.h b/gcc/expmed.h index ee1ddc82b601ce02957c493dad0d70eee2784ed7..0b2538c4c6bd51dfdc772ef70bd= f631c0bed8717 100644 --- a/gcc/expmed.h +++ b/gcc/expmed.h @@ -715,7 +715,7 @@ extern rtx expand_divmod (int, enum tree_code, machine_= mode, rtx, rtx, =20 extern void store_bit_field (rtx, poly_uint64, poly_uint64, poly_uint64, poly_uint64, - machine_mode, rtx, bool); + machine_mode, rtx, bool, bool); extern rtx extract_bit_field (rtx, poly_uint64, poly_uint64, int, rtx, machine_mode, machine_mode, bool, rtx *); extern rtx extract_low_bits (machine_mode, machine_mode, rtx); diff --git a/gcc/expmed.cc b/gcc/expmed.cc index ed39c88bd044279113f46661608c53b8a69d81a1..9c66cc40f60aadf5472b25770cb= 16d6e9f85a7e2 100644 --- a/gcc/expmed.cc +++ b/gcc/expmed.cc @@ -1112,13 +1112,15 @@ store_integral_bit_field (rtx op0, opt_scalar_int_m= ode op0_mode, =20 FIELDMODE is the machine-mode of the FIELD_DECL node for this field. =20 - If REVERSE is true, the store is to be done in reverse order. */ + If REVERSE is true, the store is to be done in reverse order. + + If UNDEFINED_P is true then STR_RTX is currently undefined. */ =20 void store_bit_field (rtx str_rtx, poly_uint64 bitsize, poly_uint64 bitnum, poly_uint64 bitregion_start, poly_uint64 bitregion_end, machine_mode fieldmode, - rtx value, bool reverse) + rtx value, bool reverse, bool undefined_p) { /* Handle -fstrict-volatile-bitfields in the cases where it applies. */ unsigned HOST_WIDE_INT ibitsize =3D 0, ibitnum =3D 0; @@ -1160,6 +1162,18 @@ store_bit_field (rtx str_rtx, poly_uint64 bitsize, p= oly_uint64 bitnum, return; } =20 + if (bitsize.is_constant (&ibitsize) + && bitnum.is_constant (&ibitnum) + && is_a (fieldmode, &int_mode) + && undefined_p + && ibitsize =3D=3D GET_MODE_BITSIZE (int_mode)) + { + gcc_assert (ibitnum % BITS_PER_UNIT =3D=3D 0); + rtx dest =3D lowpart_subreg (GET_MODE (value), str_rtx, GET_MODE (st= r_rtx)); + emit_move_insn (dest, value); + return; + } + /* Under the C++0x memory model, we must not touch bits outside the bit region. Adjust the address to start at the beginning of the bit region. */ diff --git a/gcc/expr.h b/gcc/expr.h index 7e5cf495a2bf12e15e2a00d293dfb54f830f38dd..41447e023c7218db195e8db3725= 714cffb10b3f3 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -253,7 +253,7 @@ extern rtx_insn *emit_move_insn_1 (rtx, rtx); extern rtx_insn *emit_move_complex_push (machine_mode, rtx, rtx); extern rtx_insn *emit_move_complex_parts (rtx, rtx); extern rtx read_complex_part (rtx, bool); -extern void write_complex_part (rtx, rtx, bool); +extern void write_complex_part (rtx, rtx, bool, bool); extern rtx read_complex_part (rtx, bool); extern rtx emit_move_resolve_push (machine_mode, rtx); =20 diff --git a/gcc/expr.cc b/gcc/expr.cc index 5f7142b975ada2cd8b00663d35ba1e0004b8e28d..c7f057a87fbc92d81388c87dd37= 54b4d21af6612 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -2850,7 +2850,7 @@ emit_group_store (rtx orig_dst, rtx src, tree type AT= TRIBUTE_UNUSED, store_bit_field (dest, adj_bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT, bytepos * BITS_PER_UNIT, ssize * BITS_PER_UNIT - 1, - VOIDmode, tmps[i], false); + VOIDmode, tmps[i], false, false); } =20 /* Optimize the access just a bit. */ @@ -2864,7 +2864,7 @@ emit_group_store (rtx orig_dst, rtx src, tree type AT= TRIBUTE_UNUSED, =20 else store_bit_field (dest, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT, - 0, 0, mode, tmps[i], false); + 0, 0, mode, tmps[i], false, false); } =20 /* Copy from the pseudo into the (probable) hard reg. */ @@ -2997,7 +2997,7 @@ copy_blkmode_from_reg (rtx target, rtx srcreg, tree t= ype) xbitpos % BITS_PER_WORD, 1, NULL_RTX, copy_mode, copy_mode, false, NULL), - false); + false, false); } } =20 @@ -3099,7 +3099,7 @@ copy_blkmode_to_reg (machine_mode mode_in, tree src) bitpos % BITS_PER_WORD, 1, NULL_RTX, word_mode, word_mode, false, NULL), - false); + false, false); } =20 if (mode =3D=3D BLKmode) @@ -3267,8 +3267,8 @@ clear_storage_hints (rtx object, rtx size, enum block= _op_methods method, zero =3D CONST0_RTX (GET_MODE_INNER (mode)); if (zero !=3D NULL) { - write_complex_part (object, zero, 0); - write_complex_part (object, zero, 1); + write_complex_part (object, zero, 0, true); + write_complex_part (object, zero, 1, false); return NULL; } } @@ -3429,10 +3429,11 @@ set_storage_via_setmem (rtx object, rtx size, rtx v= al, unsigned int align, =20 =20 /* Write to one of the components of the complex value CPLX. Write VAL to - the real part if IMAG_P is false, and the imaginary part if its true. = */ + the real part if IMAG_P is false, and the imaginary part if its true. + If UNDEFINED_P then the value in CPLX is currently undefined. */ =20 void -write_complex_part (rtx cplx, rtx val, bool imag_p) +write_complex_part (rtx cplx, rtx val, bool imag_p, bool undefined_p) { machine_mode cmode; scalar_mode imode; @@ -3487,7 +3488,7 @@ write_complex_part (rtx cplx, rtx val, bool imag_p) } =20 store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, 0, 0, imode, val= , - false); + false, undefined_p); } =20 /* Extract one of the components of the complex value CPLX. Extract the @@ -3740,8 +3741,8 @@ emit_move_complex_parts (rtx x, rtx y) && REG_P (x) && !reg_overlap_mentioned_p (x, y)) emit_clobber (x); =20 - write_complex_part (x, read_complex_part (y, false), false); - write_complex_part (x, read_complex_part (y, true), true); + write_complex_part (x, read_complex_part (y, false), false, true); + write_complex_part (x, read_complex_part (y, true), true, false); =20 return get_last_insn (); } @@ -5385,7 +5386,7 @@ expand_assignment (tree to, tree from, bool nontempor= al) } else store_bit_field (mem, GET_MODE_BITSIZE (mode), 0, 0, 0, mode, reg, - false); + false, false); return; } =20 @@ -5607,8 +5608,8 @@ expand_assignment (tree to, tree from, bool nontempor= al) concat_store_slow:; rtx temp =3D assign_stack_temp (GET_MODE (to_rtx), GET_MODE_SIZE (GET_MODE (to_rtx))); - write_complex_part (temp, XEXP (to_rtx, 0), false); - write_complex_part (temp, XEXP (to_rtx, 1), true); + write_complex_part (temp, XEXP (to_rtx, 0), false, true); + write_complex_part (temp, XEXP (to_rtx, 1), true, false); result =3D store_field (temp, bitsize, bitpos, bitregion_start, bitregion_end, mode1, from, get_alias_set (to), @@ -6166,7 +6167,8 @@ store_expr (tree exp, rtx target, int call_param_p, store_bit_field (target, rtx_to_poly_int64 (expr_size (exp)) * BITS_PER_UNIT, - 0, 0, 0, GET_MODE (temp), temp, reverse); + 0, 0, 0, GET_MODE (temp), temp, reverse, + false); } else convert_move (target, temp, TYPE_UNSIGNED (TREE_TYPE (exp))); @@ -7556,7 +7558,7 @@ store_field (rtx target, poly_int64 bitsize, poly_int= 64 bitpos, gcc_checking_assert (known_ge (bitpos, 0)); store_bit_field (target, bitsize, bitpos, bitregion_start, bitregion_end, - mode, temp, reverse); + mode, temp, reverse, false); =20 return const0_rtx; } @@ -10012,8 +10014,8 @@ expand_expr_real_2 (sepops ops, rtx target, machine= _mode tmode, complex_expr_swap_order: /* Move the imaginary (op1) and real (op0) parts to their location. */ - write_complex_part (target, op1, true); - write_complex_part (target, op0, false); + write_complex_part (target, op1, true, true); + write_complex_part (target, op0, false, false); =20 return target; } @@ -10042,8 +10044,8 @@ expand_expr_real_2 (sepops ops, rtx target, machine= _mode tmode, } =20 /* Move the real (op0) and imaginary (op1) parts to their location. = */ - write_complex_part (target, op0, false); - write_complex_part (target, op1, true); + write_complex_part (target, op0, false, true); + write_complex_part (target, op1, true, false); =20 return target; =20 @@ -10282,7 +10284,7 @@ expand_expr_real_2 (sepops ops, rtx target, machine= _mode tmode, rtx dst =3D gen_reg_rtx (mode); emit_move_insn (dst, op0); store_bit_field (dst, bitsize, bitpos, 0, 0, - TYPE_MODE (TREE_TYPE (treeop1)), op1, false); + TYPE_MODE (TREE_TYPE (treeop1)), op1, false, false); return dst; } =20 diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc index 22960a67f893316563e46658fab8f06cf9cbeb80..149403586f4e220d27759a3c36c= f5806d03f2040 100644 --- a/gcc/ifcvt.cc +++ b/gcc/ifcvt.cc @@ -999,7 +999,8 @@ noce_emit_move_insn (rtx x, rtx y) } =20 gcc_assert (start < (MEM_P (op) ? BITS_PER_UNIT : BITS_PER_WORD)); - store_bit_field (op, size, start, 0, 0, GET_MODE (x), y, false); + store_bit_field (op, size, start, 0, 0, GET_MODE (x), y, false, + false); return; } =20 @@ -1056,7 +1057,7 @@ noce_emit_move_insn (rtx x, rtx y) outmode =3D GET_MODE (outer); bitpos =3D SUBREG_BYTE (outer) * BITS_PER_UNIT; store_bit_field (inner, GET_MODE_BITSIZE (outmode), bitpos, - 0, 0, outmode, y, false); + 0, 0, outmode, y, false, false); } =20 /* Return the CC reg if it is used in COND. */ diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc index 8b1733e20c4455e4e8c383c92fe859f4256cae69..8baf52f01516a0e8294176af68e= 69ec67e43278f 100644 --- a/gcc/internal-fn.cc +++ b/gcc/internal-fn.cc @@ -735,9 +735,9 @@ expand_arith_set_overflow (tree lhs, rtx target) { if (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (lhs))) =3D=3D 1 && !TYPE_UNSIGNED (TREE_TYPE (TREE_TYPE (lhs)))) - write_complex_part (target, constm1_rtx, true); + write_complex_part (target, constm1_rtx, true, false); else - write_complex_part (target, const1_rtx, true); + write_complex_part (target, const1_rtx, true, false); } =20 /* Helper for expand_*_overflow. Store RES into the __real__ part @@ -792,7 +792,7 @@ expand_arith_overflow_result_store (tree lhs, rtx targe= t, expand_arith_set_overflow (lhs, target); emit_label (done_label); } - write_complex_part (target, lres, false); + write_complex_part (target, lres, false, false); } =20 /* Helper for expand_*_overflow. Store RES into TARGET. */ @@ -837,7 +837,7 @@ expand_addsub_overflow (location_t loc, tree_code code,= tree lhs, { target =3D expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); if (!is_ubsan) - write_complex_part (target, const0_rtx, true); + write_complex_part (target, const0_rtx, true, false); } =20 /* We assume both operands and result have the same precision @@ -1282,7 +1282,7 @@ expand_neg_overflow (location_t loc, tree lhs, tree a= rg1, bool is_ubsan, { target =3D expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); if (!is_ubsan) - write_complex_part (target, const0_rtx, true); + write_complex_part (target, const0_rtx, true, false); } =20 enum insn_code icode =3D optab_handler (negv3_optab, mode); @@ -1407,7 +1407,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree a= rg0, tree arg1, { target =3D expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); if (!is_ubsan) - write_complex_part (target, const0_rtx, true); + write_complex_part (target, const0_rtx, true, false); } =20 if (is_ubsan) @@ -2224,7 +2224,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree a= rg0, tree arg1, do_compare_rtx_and_jump (op1, res, NE, true, mode, NULL_RTX, NULL, all_done_label, profile_probability::very_unlikely ()); emit_label (set_noovf); - write_complex_part (target, const0_rtx, true); + write_complex_part (target, const0_rtx, true, false); emit_label (all_done_label); } =20 @@ -2493,7 +2493,7 @@ expand_arith_overflow (enum tree_code code, gimple *s= tmt) { /* The infinity precision result will always fit into result. */ rtx target =3D expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); - write_complex_part (target, const0_rtx, true); + write_complex_part (target, const0_rtx, true, false); scalar_int_mode mode =3D SCALAR_INT_TYPE_MODE (type); struct separate_ops ops; ops.code =3D code; diff --git a/gcc/testsuite/g++.target/aarch64/complex-init.C b/gcc/testsuit= e/g++.target/aarch64/complex-init.C new file mode 100644 index 0000000000000000000000000000000000000000..d3fd3e88d04a87bacf1c4ee74ce= 25282c6ff81e8 --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/complex-init.C @@ -0,0 +1,40 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */ + +/* +** _Z1fii: +** ... +** bfi x0, x1, 32, 32 +** ret +** ... +*/ +_Complex int f(int a, int b) { + _Complex int t =3D a + b * 1i; + return t; +} + +/* +** _Z2f2ii: +** ... +** bfi x0, x1, 32, 32 +** ret +** ... +*/ +_Complex int f2(int a, int b) { + _Complex int t =3D {a, b}; + return t; +} + +/*=20 +** _Z12f_convolutedii: +** ... +** bfi x0, x1, 32, 32 +** ret +** ... +*/ +_Complex int f_convoluted(int a, int b) { + _Complex int t =3D (_Complex int)a; + __imag__ t =3D b; + return t; +} --_002_VI1PR08MB532580D7E9614353CA5B919CFFAC9VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb15778.patch" Content-Description: rb15778.patch Content-Disposition: attachment; filename="rb15778.patch"; size=15759; creation-date="Thu, 16 Jun 2022 11:27:00 GMT"; modification-date="Thu, 16 Jun 2022 11:28:34 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9idWlsdGlucy5jYyBiL2djYy9idWlsdGlucy5jYwppbmRleCA0YzZj MjkzOTA1MzFkOGFlOTc2NWFkZDU5ODYyMTcyNzIxM2IyM2VjLi44YzgwZTQ2ZDljOWM5YzJhN2Ux Y2UwZjhhZGQ4NjcyOWZkNTQyYjE2IDEwMDY0NAotLS0gYS9nY2MvYnVpbHRpbnMuY2MKKysrIGIv Z2NjL2J1aWx0aW5zLmNjCkBAIC02MDE0LDggKzYwMTQsOCBAQCBleHBhbmRfaWZuX2F0b21pY19j b21wYXJlX2V4Y2hhbmdlX2ludG9fY2FsbCAoZ2NhbGwgKmNhbGwsIG1hY2hpbmVfbW9kZSBtb2Rl KQogICAgICAgaWYgKEdFVF9NT0RFIChib29scmV0KSAhPSBtb2RlKQogCWJvb2xyZXQgPSBjb252 ZXJ0X21vZGVzIChtb2RlLCBHRVRfTU9ERSAoYm9vbHJldCksIGJvb2xyZXQsIDEpOwogICAgICAg eCA9IGZvcmNlX3JlZyAobW9kZSwgeCk7Ci0gICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdl dCwgYm9vbHJldCwgdHJ1ZSk7Ci0gICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgeCwg ZmFsc2UpOworICAgICAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGJvb2xyZXQsIHRydWUs IHRydWUpOworICAgICAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIHgsIGZhbHNlLCBmYWxz ZSk7CiAgICAgfQogfQogCkBAIC02MDcwLDggKzYwNzAsOCBAQCBleHBhbmRfaWZuX2F0b21pY19j b21wYXJlX2V4Y2hhbmdlIChnY2FsbCAqY2FsbCkKICAgICAgIHJ0eCB0YXJnZXQgPSBleHBhbmRf ZXhwciAobGhzLCBOVUxMX1JUWCwgVk9JRG1vZGUsIEVYUEFORF9XUklURSk7CiAgICAgICBpZiAo R0VUX01PREUgKGJvb2xyZXQpICE9IG1vZGUpCiAJYm9vbHJldCA9IGNvbnZlcnRfbW9kZXMgKG1v ZGUsIEdFVF9NT0RFIChib29scmV0KSwgYm9vbHJldCwgMSk7Ci0gICAgICB3cml0ZV9jb21wbGV4 X3BhcnQgKHRhcmdldCwgYm9vbHJldCwgdHJ1ZSk7Ci0gICAgICB3cml0ZV9jb21wbGV4X3BhcnQg KHRhcmdldCwgb2xkdmFsLCBmYWxzZSk7CisgICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdl dCwgYm9vbHJldCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdl dCwgb2xkdmFsLCBmYWxzZSwgZmFsc2UpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZ2NjL2Nh bGxzLmNjIGIvZ2NjL2NhbGxzLmNjCmluZGV4IGUxMzQ2OWNmZDQzYjViZGQ0Y2EwZDJiODQ1OGE5 ZTRmOTk2ZTM2ZTkuLjU4NmFmMTcwODc5YWIwMTUyZTljMDYzNGE0YjhlMGNlMDNlYThkNmUgMTAw NjQ0Ci0tLSBhL2djYy9jYWxscy5jYworKysgYi9nY2MvY2FsbHMuY2MKQEAgLTEyMTQsNyArMTIx NCw3IEBAIHN0b3JlX3VuYWxpZ25lZF9hcmd1bWVudHNfaW50b19wc2V1ZG9zIChzdHJ1Y3QgYXJn X2RhdGEgKmFyZ3MsIGludCBudW1fYWN0dWFscykKIAogCSAgICBieXRlcyAtPSBiaXRzaXplIC8g QklUU19QRVJfVU5JVDsKIAkgICAgc3RvcmVfYml0X2ZpZWxkIChyZWcsIGJpdHNpemUsIGVuZGlh bl9jb3JyZWN0aW9uLCAwLCAwLAotCQkJICAgICB3b3JkX21vZGUsIHdvcmQsIGZhbHNlKTsKKwkJ CSAgICAgd29yZF9tb2RlLCB3b3JkLCBmYWxzZSwgZmFsc2UpOwogCSAgfQogICAgICAgfQogfQpk aWZmIC0tZ2l0IGEvZ2NjL2VtaXQtcnRsLmNjIGIvZ2NjL2VtaXQtcnRsLmNjCmluZGV4IGY0NDA0 ZDdhYmUzM2I1NjUzNThiN2Y2MDlhOTExMTRjNzVlY2Y0ZTcuLjE1ZmZjYTJmZmU5ODZiY2E1NmMx ZmFlOTM4MWJkMzNmNWQ2YjAxMmQgMTAwNjQ0Ci0tLSBhL2djYy9lbWl0LXJ0bC5jYworKysgYi9n Y2MvZW1pdC1ydGwuY2MKQEAgLTk0Nyw5ICs5NDcsMTEgQEAgdmFsaWRhdGVfc3VicmVnIChtYWNo aW5lX21vZGUgb21vZGUsIG1hY2hpbmVfbW9kZSBpbW9kZSwKIAkgICAmJiBHRVRfTU9ERV9JTk5F UiAob21vZGUpID09IEdFVF9NT0RFX0lOTkVSIChpbW9kZSkpCiAgICAgOwogICAvKiBTdWJyZWdz IGludm9sdmluZyBmbG9hdGluZyBwb2ludCBtb2RlcyBhcmUgbm90IGFsbG93ZWQgdG8KLSAgICAg Y2hhbmdlIHNpemUuICBUaGVyZWZvcmUgKHN1YnJlZzpESSAocmVnOkRGKSAwKSBpcyBmaW5lLCBi dXQKKyAgICAgY2hhbmdlIHNpemUgdW5sZXNzIGl0J3MgYW4gaW5zZXJ0IGludG8gYSBjb21wbGV4 IG1vZGUuCisgICAgIFRoZXJlZm9yZSAoc3VicmVnOkRJIChyZWc6REYpIDApIGFuZCAoc3VicmVn OkNTIChyZWc6U0YpIDApIGFyZSBmaW5lLCBidXQKICAgICAgKHN1YnJlZzpTSSAocmVnOkRGKSAw KSBpc24ndC4gICovCi0gIGVsc2UgaWYgKEZMT0FUX01PREVfUCAoaW1vZGUpIHx8IEZMT0FUX01P REVfUCAob21vZGUpKQorICBlbHNlIGlmICgoRkxPQVRfTU9ERV9QIChpbW9kZSkgfHwgRkxPQVRf TU9ERV9QIChvbW9kZSkpCisJICAgJiYgIUNPTVBMRVhfTU9ERV9QIChvbW9kZSkpCiAgICAgewog ICAgICAgaWYgKCEgKGtub3duX2VxIChpc2l6ZSwgb3NpemUpCiAJICAgICAvKiBMUkEgY2FuIHVz ZSBzdWJyZWcgdG8gc3RvcmUgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBpbgpkaWZmIC0tZ2l0IGEv Z2NjL2V4cG1lZC5oIGIvZ2NjL2V4cG1lZC5oCmluZGV4IGVlMWRkYzgyYjYwMWNlMDI5NTdjNDkz ZGFkMGQ3MGVlZTI3ODRlZDcuLjBiMjUzOGM0YzZiZDUxZGZkYzc3MmVmNzBiZGY2MzFjMGJlZDg3 MTcgMTAwNjQ0Ci0tLSBhL2djYy9leHBtZWQuaAorKysgYi9nY2MvZXhwbWVkLmgKQEAgLTcxNSw3 ICs3MTUsNyBAQCBleHRlcm4gcnR4IGV4cGFuZF9kaXZtb2QgKGludCwgZW51bSB0cmVlX2NvZGUs IG1hY2hpbmVfbW9kZSwgcnR4LCBydHgsCiAKIGV4dGVybiB2b2lkIHN0b3JlX2JpdF9maWVsZCAo cnR4LCBwb2x5X3VpbnQ2NCwgcG9seV91aW50NjQsCiAJCQkgICAgIHBvbHlfdWludDY0LCBwb2x5 X3VpbnQ2NCwKLQkJCSAgICAgbWFjaGluZV9tb2RlLCBydHgsIGJvb2wpOworCQkJICAgICBtYWNo aW5lX21vZGUsIHJ0eCwgYm9vbCwgYm9vbCk7CiBleHRlcm4gcnR4IGV4dHJhY3RfYml0X2ZpZWxk IChydHgsIHBvbHlfdWludDY0LCBwb2x5X3VpbnQ2NCwgaW50LCBydHgsCiAJCQkgICAgICBtYWNo aW5lX21vZGUsIG1hY2hpbmVfbW9kZSwgYm9vbCwgcnR4ICopOwogZXh0ZXJuIHJ0eCBleHRyYWN0 X2xvd19iaXRzIChtYWNoaW5lX21vZGUsIG1hY2hpbmVfbW9kZSwgcnR4KTsKZGlmZiAtLWdpdCBh L2djYy9leHBtZWQuY2MgYi9nY2MvZXhwbWVkLmNjCmluZGV4IGVkMzljODhiZDA0NDI3OTExM2Y0 NjY2MTYwOGM1M2I4YTY5ZDgxYTEuLjljNjZjYzQwZjYwYWFkZjU0NzJiMjU3NzBjYjE2ZDZlOWY4 NWE3ZTIgMTAwNjQ0Ci0tLSBhL2djYy9leHBtZWQuY2MKKysrIGIvZ2NjL2V4cG1lZC5jYwpAQCAt MTExMiwxMyArMTExMiwxNSBAQCBzdG9yZV9pbnRlZ3JhbF9iaXRfZmllbGQgKHJ0eCBvcDAsIG9w dF9zY2FsYXJfaW50X21vZGUgb3AwX21vZGUsCiAKICAgIEZJRUxETU9ERSBpcyB0aGUgbWFjaGlu ZS1tb2RlIG9mIHRoZSBGSUVMRF9ERUNMIG5vZGUgZm9yIHRoaXMgZmllbGQuCiAKLSAgIElmIFJF VkVSU0UgaXMgdHJ1ZSwgdGhlIHN0b3JlIGlzIHRvIGJlIGRvbmUgaW4gcmV2ZXJzZSBvcmRlci4g ICovCisgICBJZiBSRVZFUlNFIGlzIHRydWUsIHRoZSBzdG9yZSBpcyB0byBiZSBkb25lIGluIHJl dmVyc2Ugb3JkZXIuCisKKyAgIElmIFVOREVGSU5FRF9QIGlzIHRydWUgdGhlbiBTVFJfUlRYIGlz IGN1cnJlbnRseSB1bmRlZmluZWQuICAqLwogCiB2b2lkCiBzdG9yZV9iaXRfZmllbGQgKHJ0eCBz dHJfcnR4LCBwb2x5X3VpbnQ2NCBiaXRzaXplLCBwb2x5X3VpbnQ2NCBiaXRudW0sCiAJCSBwb2x5 X3VpbnQ2NCBiaXRyZWdpb25fc3RhcnQsIHBvbHlfdWludDY0IGJpdHJlZ2lvbl9lbmQsCiAJCSBt YWNoaW5lX21vZGUgZmllbGRtb2RlLAotCQkgcnR4IHZhbHVlLCBib29sIHJldmVyc2UpCisJCSBy dHggdmFsdWUsIGJvb2wgcmV2ZXJzZSwgYm9vbCB1bmRlZmluZWRfcCkKIHsKICAgLyogSGFuZGxl IC1mc3RyaWN0LXZvbGF0aWxlLWJpdGZpZWxkcyBpbiB0aGUgY2FzZXMgd2hlcmUgaXQgYXBwbGll cy4gICovCiAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgaWJpdHNpemUgPSAwLCBpYml0bnVtID0g MDsKQEAgLTExNjAsNiArMTE2MiwxOCBAQCBzdG9yZV9iaXRfZmllbGQgKHJ0eCBzdHJfcnR4LCBw b2x5X3VpbnQ2NCBiaXRzaXplLCBwb2x5X3VpbnQ2NCBiaXRudW0sCiAgICAgICByZXR1cm47CiAg ICAgfQogCisgIGlmIChiaXRzaXplLmlzX2NvbnN0YW50ICgmaWJpdHNpemUpCisgICAgICAmJiBi aXRudW0uaXNfY29uc3RhbnQgKCZpYml0bnVtKQorICAgICAgJiYgaXNfYSA8c2NhbGFyX2ludF9t b2RlPiAoZmllbGRtb2RlLCAmaW50X21vZGUpCisgICAgICAmJiB1bmRlZmluZWRfcAorICAgICAg JiYgaWJpdHNpemUgPT0gR0VUX01PREVfQklUU0laRSAoaW50X21vZGUpKQorICAgIHsKKyAgICAg IGdjY19hc3NlcnQgKGliaXRudW0gJSBCSVRTX1BFUl9VTklUID09IDApOworICAgICAgcnR4IGRl c3QgPSBsb3dwYXJ0X3N1YnJlZyAoR0VUX01PREUgKHZhbHVlKSwgc3RyX3J0eCwgR0VUX01PREUg KHN0cl9ydHgpKTsKKyAgICAgIGVtaXRfbW92ZV9pbnNuIChkZXN0LCB2YWx1ZSk7CisgICAgICBy ZXR1cm47CisgICAgfQorCiAgIC8qIFVuZGVyIHRoZSBDKysweCBtZW1vcnkgbW9kZWwsIHdlIG11 c3Qgbm90IHRvdWNoIGJpdHMgb3V0c2lkZSB0aGUKICAgICAgYml0IHJlZ2lvbi4gIEFkanVzdCB0 aGUgYWRkcmVzcyB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgICBiaXQgcmVn aW9uLiAgKi8KZGlmZiAtLWdpdCBhL2djYy9leHByLmggYi9nY2MvZXhwci5oCmluZGV4IDdlNWNm NDk1YTJiZjEyZTE1ZTJhMDBkMjkzZGZiNTRmODMwZjM4ZGQuLjQxNDQ3ZTAyM2M3MjE4ZGIxOTVl OGRiMzcyNTcxNGNmZmIxMGIzZjMgMTAwNjQ0Ci0tLSBhL2djYy9leHByLmgKKysrIGIvZ2NjL2V4 cHIuaApAQCAtMjUzLDcgKzI1Myw3IEBAIGV4dGVybiBydHhfaW5zbiAqZW1pdF9tb3ZlX2luc25f MSAocnR4LCBydHgpOwogZXh0ZXJuIHJ0eF9pbnNuICplbWl0X21vdmVfY29tcGxleF9wdXNoICht YWNoaW5lX21vZGUsIHJ0eCwgcnR4KTsKIGV4dGVybiBydHhfaW5zbiAqZW1pdF9tb3ZlX2NvbXBs ZXhfcGFydHMgKHJ0eCwgcnR4KTsKIGV4dGVybiBydHggcmVhZF9jb21wbGV4X3BhcnQgKHJ0eCwg Ym9vbCk7Ci1leHRlcm4gdm9pZCB3cml0ZV9jb21wbGV4X3BhcnQgKHJ0eCwgcnR4LCBib29sKTsK K2V4dGVybiB2b2lkIHdyaXRlX2NvbXBsZXhfcGFydCAocnR4LCBydHgsIGJvb2wsIGJvb2wpOwog ZXh0ZXJuIHJ0eCByZWFkX2NvbXBsZXhfcGFydCAocnR4LCBib29sKTsKIGV4dGVybiBydHggZW1p dF9tb3ZlX3Jlc29sdmVfcHVzaCAobWFjaGluZV9tb2RlLCBydHgpOwogCmRpZmYgLS1naXQgYS9n Y2MvZXhwci5jYyBiL2djYy9leHByLmNjCmluZGV4IDVmNzE0MmI5NzVhZGEyY2Q4YjAwNjYzZDM1 YmExZTAwMDRiOGUyOGQuLmM3ZjA1N2E4N2ZiYzkyZDgxMzg4Yzg3ZGQzNzU0YjRkMjFhZjY2MTIg MTAwNjQ0Ci0tLSBhL2djYy9leHByLmNjCisrKyBiL2djYy9leHByLmNjCkBAIC0yODUwLDcgKzI4 NTAsNyBAQCBlbWl0X2dyb3VwX3N0b3JlIChydHggb3JpZ19kc3QsIHJ0eCBzcmMsIHRyZWUgdHlw ZSBBVFRSSUJVVEVfVU5VU0VELAogCSAgc3RvcmVfYml0X2ZpZWxkIChkZXN0LAogCQkJICAgYWRq X2J5dGVsZW4gKiBCSVRTX1BFUl9VTklULCBieXRlcG9zICogQklUU19QRVJfVU5JVCwKIAkJCSAg IGJ5dGVwb3MgKiBCSVRTX1BFUl9VTklULCBzc2l6ZSAqIEJJVFNfUEVSX1VOSVQgLSAxLAotCQkJ ICAgVk9JRG1vZGUsIHRtcHNbaV0sIGZhbHNlKTsKKwkJCSAgIFZPSURtb2RlLCB0bXBzW2ldLCBm YWxzZSwgZmFsc2UpOwogCX0KIAogICAgICAgLyogT3B0aW1pemUgdGhlIGFjY2VzcyBqdXN0IGEg Yml0LiAgKi8KQEAgLTI4NjQsNyArMjg2NCw3IEBAIGVtaXRfZ3JvdXBfc3RvcmUgKHJ0eCBvcmln X2RzdCwgcnR4IHNyYywgdHJlZSB0eXBlIEFUVFJJQlVURV9VTlVTRUQsCiAKICAgICAgIGVsc2UK IAlzdG9yZV9iaXRfZmllbGQgKGRlc3QsIGJ5dGVsZW4gKiBCSVRTX1BFUl9VTklULCBieXRlcG9z ICogQklUU19QRVJfVU5JVCwKLQkJCSAwLCAwLCBtb2RlLCB0bXBzW2ldLCBmYWxzZSk7CisJCQkg MCwgMCwgbW9kZSwgdG1wc1tpXSwgZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKICAgLyogQ29weSBm cm9tIHRoZSBwc2V1ZG8gaW50byB0aGUgKHByb2JhYmxlKSBoYXJkIHJlZy4gICovCkBAIC0yOTk3 LDcgKzI5OTcsNyBAQCBjb3B5X2Jsa21vZGVfZnJvbV9yZWcgKHJ0eCB0YXJnZXQsIHJ0eCBzcmNy ZWcsIHRyZWUgdHlwZSkKIAkJCQkJICB4Yml0cG9zICUgQklUU19QRVJfV09SRCwgMSwKIAkJCQkJ ICBOVUxMX1JUWCwgY29weV9tb2RlLCBjb3B5X21vZGUsCiAJCQkJCSAgZmFsc2UsIE5VTEwpLAot CQkgICAgICAgZmFsc2UpOworCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKICAgICB9CiB9CiAKQEAg LTMwOTksNyArMzA5OSw3IEBAIGNvcHlfYmxrbW9kZV90b19yZWcgKG1hY2hpbmVfbW9kZSBtb2Rl X2luLCB0cmVlIHNyYykKIAkJCQkJICBiaXRwb3MgJSBCSVRTX1BFUl9XT1JELCAxLAogCQkJCQkg IE5VTExfUlRYLCB3b3JkX21vZGUsIHdvcmRfbW9kZSwKIAkJCQkJICBmYWxzZSwgTlVMTCksCi0J CSAgICAgICBmYWxzZSk7CisJCSAgICAgICBmYWxzZSwgZmFsc2UpOwogICAgIH0KIAogICBpZiAo bW9kZSA9PSBCTEttb2RlKQpAQCAtMzI2Nyw4ICszMjY3LDggQEAgY2xlYXJfc3RvcmFnZV9oaW50 cyAocnR4IG9iamVjdCwgcnR4IHNpemUsIGVudW0gYmxvY2tfb3BfbWV0aG9kcyBtZXRob2QsCiAJ ICB6ZXJvID0gQ09OU1QwX1JUWCAoR0VUX01PREVfSU5ORVIgKG1vZGUpKTsKIAkgIGlmICh6ZXJv ICE9IE5VTEwpCiAJICAgIHsKLQkgICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKG9iamVjdCwgemVy bywgMCk7Ci0JICAgICAgd3JpdGVfY29tcGxleF9wYXJ0IChvYmplY3QsIHplcm8sIDEpOworCSAg ICAgIHdyaXRlX2NvbXBsZXhfcGFydCAob2JqZWN0LCB6ZXJvLCAwLCB0cnVlKTsKKwkgICAgICB3 cml0ZV9jb21wbGV4X3BhcnQgKG9iamVjdCwgemVybywgMSwgZmFsc2UpOwogCSAgICAgIHJldHVy biBOVUxMOwogCSAgICB9CiAJfQpAQCAtMzQyOSwxMCArMzQyOSwxMSBAQCBzZXRfc3RvcmFnZV92 aWFfc2V0bWVtIChydHggb2JqZWN0LCBydHggc2l6ZSwgcnR4IHZhbCwgdW5zaWduZWQgaW50IGFs aWduLAogCiAMCiAvKiBXcml0ZSB0byBvbmUgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhlIGNvbXBs ZXggdmFsdWUgQ1BMWC4gIFdyaXRlIFZBTCB0bwotICAgdGhlIHJlYWwgcGFydCBpZiBJTUFHX1Ag aXMgZmFsc2UsIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaWYgaXRzIHRydWUuICAqLworICAgdGhl IHJlYWwgcGFydCBpZiBJTUFHX1AgaXMgZmFsc2UsIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaWYg aXRzIHRydWUuCisgICBJZiBVTkRFRklORURfUCB0aGVuIHRoZSB2YWx1ZSBpbiBDUExYIGlzIGN1 cnJlbnRseSB1bmRlZmluZWQuICAqLwogCiB2b2lkCi13cml0ZV9jb21wbGV4X3BhcnQgKHJ0eCBj cGx4LCBydHggdmFsLCBib29sIGltYWdfcCkKK3dyaXRlX2NvbXBsZXhfcGFydCAocnR4IGNwbHgs IHJ0eCB2YWwsIGJvb2wgaW1hZ19wLCBib29sIHVuZGVmaW5lZF9wKQogewogICBtYWNoaW5lX21v ZGUgY21vZGU7CiAgIHNjYWxhcl9tb2RlIGltb2RlOwpAQCAtMzQ4Nyw3ICszNDg4LDcgQEAgd3Jp dGVfY29tcGxleF9wYXJ0IChydHggY3BseCwgcnR4IHZhbCwgYm9vbCBpbWFnX3ApCiAgICAgfQog CiAgIHN0b3JlX2JpdF9maWVsZCAoY3BseCwgaWJpdHNpemUsIGltYWdfcCA/IGliaXRzaXplIDog MCwgMCwgMCwgaW1vZGUsIHZhbCwKLQkJICAgZmFsc2UpOworCQkgICBmYWxzZSwgdW5kZWZpbmVk X3ApOwogfQogCiAvKiBFeHRyYWN0IG9uZSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgY29tcGxl eCB2YWx1ZSBDUExYLiAgRXh0cmFjdCB0aGUKQEAgLTM3NDAsOCArMzc0MSw4IEBAIGVtaXRfbW92 ZV9jb21wbGV4X3BhcnRzIChydHggeCwgcnR4IHkpCiAgICAgICAmJiBSRUdfUCAoeCkgJiYgIXJl Z19vdmVybGFwX21lbnRpb25lZF9wICh4LCB5KSkKICAgICBlbWl0X2Nsb2JiZXIgKHgpOwogCi0g IHdyaXRlX2NvbXBsZXhfcGFydCAoeCwgcmVhZF9jb21wbGV4X3BhcnQgKHksIGZhbHNlKSwgZmFs c2UpOwotICB3cml0ZV9jb21wbGV4X3BhcnQgKHgsIHJlYWRfY29tcGxleF9wYXJ0ICh5LCB0cnVl KSwgdHJ1ZSk7CisgIHdyaXRlX2NvbXBsZXhfcGFydCAoeCwgcmVhZF9jb21wbGV4X3BhcnQgKHks IGZhbHNlKSwgZmFsc2UsIHRydWUpOworICB3cml0ZV9jb21wbGV4X3BhcnQgKHgsIHJlYWRfY29t cGxleF9wYXJ0ICh5LCB0cnVlKSwgdHJ1ZSwgZmFsc2UpOwogCiAgIHJldHVybiBnZXRfbGFzdF9p bnNuICgpOwogfQpAQCAtNTM4NSw3ICs1Mzg2LDcgQEAgZXhwYW5kX2Fzc2lnbm1lbnQgKHRyZWUg dG8sIHRyZWUgZnJvbSwgYm9vbCBub250ZW1wb3JhbCkKIAl9CiAgICAgICBlbHNlCiAJc3RvcmVf Yml0X2ZpZWxkIChtZW0sIEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpLCAwLCAwLCAwLCBtb2RlLCBy ZWcsCi0JCQkgZmFsc2UpOworCQkJIGZhbHNlLCBmYWxzZSk7CiAgICAgICByZXR1cm47CiAgICAg fQogCkBAIC01NjA3LDggKzU2MDgsOCBAQCBleHBhbmRfYXNzaWdubWVudCAodHJlZSB0bywgdHJl ZSBmcm9tLCBib29sIG5vbnRlbXBvcmFsKQogCSAgICBjb25jYXRfc3RvcmVfc2xvdzo7CiAJICAg ICAgcnR4IHRlbXAgPSBhc3NpZ25fc3RhY2tfdGVtcCAoR0VUX01PREUgKHRvX3J0eCksCiAJCQkJ CSAgICBHRVRfTU9ERV9TSVpFIChHRVRfTU9ERSAodG9fcnR4KSkpOwotCSAgICAgIHdyaXRlX2Nv bXBsZXhfcGFydCAodGVtcCwgWEVYUCAodG9fcnR4LCAwKSwgZmFsc2UpOwotCSAgICAgIHdyaXRl X2NvbXBsZXhfcGFydCAodGVtcCwgWEVYUCAodG9fcnR4LCAxKSwgdHJ1ZSk7CisJICAgICAgd3Jp dGVfY29tcGxleF9wYXJ0ICh0ZW1wLCBYRVhQICh0b19ydHgsIDApLCBmYWxzZSwgdHJ1ZSk7CisJ ICAgICAgd3JpdGVfY29tcGxleF9wYXJ0ICh0ZW1wLCBYRVhQICh0b19ydHgsIDEpLCB0cnVlLCBm YWxzZSk7CiAJICAgICAgcmVzdWx0ID0gc3RvcmVfZmllbGQgKHRlbXAsIGJpdHNpemUsIGJpdHBv cywKIAkJCQkgICAgYml0cmVnaW9uX3N0YXJ0LCBiaXRyZWdpb25fZW5kLAogCQkJCSAgICBtb2Rl MSwgZnJvbSwgZ2V0X2FsaWFzX3NldCAodG8pLApAQCAtNjE2Niw3ICs2MTY3LDggQEAgc3RvcmVf ZXhwciAodHJlZSBleHAsIHJ0eCB0YXJnZXQsIGludCBjYWxsX3BhcmFtX3AsCiAJCXN0b3JlX2Jp dF9maWVsZCAodGFyZ2V0LAogCQkJCSBydHhfdG9fcG9seV9pbnQ2NCAoZXhwcl9zaXplIChleHAp KQogCQkJCSAqIEJJVFNfUEVSX1VOSVQsCi0JCQkJIDAsIDAsIDAsIEdFVF9NT0RFICh0ZW1wKSwg dGVtcCwgcmV2ZXJzZSk7CisJCQkJIDAsIDAsIDAsIEdFVF9NT0RFICh0ZW1wKSwgdGVtcCwgcmV2 ZXJzZSwKKwkJCQkgZmFsc2UpOwogCSAgICB9CiAJICBlbHNlCiAJICAgIGNvbnZlcnRfbW92ZSAo dGFyZ2V0LCB0ZW1wLCBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGV4cCkpKTsKQEAgLTc1NTYs NyArNzU1OCw3IEBAIHN0b3JlX2ZpZWxkIChydHggdGFyZ2V0LCBwb2x5X2ludDY0IGJpdHNpemUs IHBvbHlfaW50NjQgYml0cG9zLAogICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoa25vd25fZ2Ug KGJpdHBvcywgMCkpOwogICAgICAgc3RvcmVfYml0X2ZpZWxkICh0YXJnZXQsIGJpdHNpemUsIGJp dHBvcywKIAkJICAgICAgIGJpdHJlZ2lvbl9zdGFydCwgYml0cmVnaW9uX2VuZCwKLQkJICAgICAg IG1vZGUsIHRlbXAsIHJldmVyc2UpOworCQkgICAgICAgbW9kZSwgdGVtcCwgcmV2ZXJzZSwgZmFs c2UpOwogCiAgICAgICByZXR1cm4gY29uc3QwX3J0eDsKICAgICB9CkBAIC0xMDAxMiw4ICsxMDAx NCw4IEBAIGV4cGFuZF9leHByX3JlYWxfMiAoc2Vwb3BzIG9wcywgcnR4IHRhcmdldCwgbWFjaGlu ZV9tb2RlIHRtb2RlLAogCSAgICAgIGNvbXBsZXhfZXhwcl9zd2FwX29yZGVyOgogCQkvKiBNb3Zl IHRoZSBpbWFnaW5hcnkgKG9wMSkgYW5kIHJlYWwgKG9wMCkgcGFydHMgdG8gdGhlaXIKIAkJICAg bG9jYXRpb24uICAqLwotCQl3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgb3AxLCB0cnVlKTsK LQkJd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIG9wMCwgZmFsc2UpOworCQl3cml0ZV9jb21w bGV4X3BhcnQgKHRhcmdldCwgb3AxLCB0cnVlLCB0cnVlKTsKKwkJd3JpdGVfY29tcGxleF9wYXJ0 ICh0YXJnZXQsIG9wMCwgZmFsc2UsIGZhbHNlKTsKIAogCQlyZXR1cm4gdGFyZ2V0OwogCSAgICAg IH0KQEAgLTEwMDQyLDggKzEwMDQ0LDggQEAgZXhwYW5kX2V4cHJfcmVhbF8yIChzZXBvcHMgb3Bz LCBydHggdGFyZ2V0LCBtYWNoaW5lX21vZGUgdG1vZGUsCiAJICB9CiAKICAgICAgIC8qIE1vdmUg dGhlIHJlYWwgKG9wMCkgYW5kIGltYWdpbmFyeSAob3AxKSBwYXJ0cyB0byB0aGVpciBsb2NhdGlv bi4gICovCi0gICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgb3AwLCBmYWxzZSk7Ci0g ICAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgb3AxLCB0cnVlKTsKKyAgICAgIHdyaXRl X2NvbXBsZXhfcGFydCAodGFyZ2V0LCBvcDAsIGZhbHNlLCB0cnVlKTsKKyAgICAgIHdyaXRlX2Nv bXBsZXhfcGFydCAodGFyZ2V0LCBvcDEsIHRydWUsIGZhbHNlKTsKIAogICAgICAgcmV0dXJuIHRh cmdldDsKIApAQCAtMTAyODIsNyArMTAyODQsNyBAQCBleHBhbmRfZXhwcl9yZWFsXzIgKHNlcG9w cyBvcHMsIHJ0eCB0YXJnZXQsIG1hY2hpbmVfbW9kZSB0bW9kZSwKIAlydHggZHN0ID0gZ2VuX3Jl Z19ydHggKG1vZGUpOwogCWVtaXRfbW92ZV9pbnNuIChkc3QsIG9wMCk7CiAJc3RvcmVfYml0X2Zp ZWxkIChkc3QsIGJpdHNpemUsIGJpdHBvcywgMCwgMCwKLQkJCSBUWVBFX01PREUgKFRSRUVfVFlQ RSAodHJlZW9wMSkpLCBvcDEsIGZhbHNlKTsKKwkJCSBUWVBFX01PREUgKFRSRUVfVFlQRSAodHJl ZW9wMSkpLCBvcDEsIGZhbHNlLCBmYWxzZSk7CiAJcmV0dXJuIGRzdDsKICAgICAgIH0KIApkaWZm IC0tZ2l0IGEvZ2NjL2lmY3Z0LmNjIGIvZ2NjL2lmY3Z0LmNjCmluZGV4IDIyOTYwYTY3Zjg5MzMx NjU2M2U0NjY1OGZhYjhmMDZjZjljYmViODAuLjE0OTQwMzU4NmY0ZTIyMGQyNzc1OWEzYzM2Y2Y1 ODA2ZDAzZjIwNDAgMTAwNjQ0Ci0tLSBhL2djYy9pZmN2dC5jYworKysgYi9nY2MvaWZjdnQuY2MK QEAgLTk5OSw3ICs5OTksOCBAQCBub2NlX2VtaXRfbW92ZV9pbnNuIChydHggeCwgcnR4IHkpCiAJ CX0KIAogCSAgICAgIGdjY19hc3NlcnQgKHN0YXJ0IDwgKE1FTV9QIChvcCkgPyBCSVRTX1BFUl9V TklUIDogQklUU19QRVJfV09SRCkpOwotCSAgICAgIHN0b3JlX2JpdF9maWVsZCAob3AsIHNpemUs IHN0YXJ0LCAwLCAwLCBHRVRfTU9ERSAoeCksIHksIGZhbHNlKTsKKwkgICAgICBzdG9yZV9iaXRf ZmllbGQgKG9wLCBzaXplLCBzdGFydCwgMCwgMCwgR0VUX01PREUgKHgpLCB5LCBmYWxzZSwKKwkJ CSAgICAgICBmYWxzZSk7CiAJICAgICAgcmV0dXJuOwogCSAgICB9CiAKQEAgLTEwNTYsNyArMTA1 Nyw3IEBAIG5vY2VfZW1pdF9tb3ZlX2luc24gKHJ0eCB4LCBydHggeSkKICAgb3V0bW9kZSA9IEdF VF9NT0RFIChvdXRlcik7CiAgIGJpdHBvcyA9IFNVQlJFR19CWVRFIChvdXRlcikgKiBCSVRTX1BF Ul9VTklUOwogICBzdG9yZV9iaXRfZmllbGQgKGlubmVyLCBHRVRfTU9ERV9CSVRTSVpFIChvdXRt b2RlKSwgYml0cG9zLAotCQkgICAwLCAwLCBvdXRtb2RlLCB5LCBmYWxzZSk7CisJCSAgIDAsIDAs IG91dG1vZGUsIHksIGZhbHNlLCBmYWxzZSk7CiB9CiAKIC8qIFJldHVybiB0aGUgQ0MgcmVnIGlm IGl0IGlzIHVzZWQgaW4gQ09ORC4gICovCmRpZmYgLS1naXQgYS9nY2MvaW50ZXJuYWwtZm4uY2Mg Yi9nY2MvaW50ZXJuYWwtZm4uY2MKaW5kZXggOGIxNzMzZTIwYzQ0NTVlNGU4YzM4M2M5MmZlODU5 ZjQyNTZjYWU2OS4uOGJhZjUyZjAxNTE2YTBlODI5NDE3NmFmNjhlNjllYzY3ZTQzMjc4ZiAxMDA2 NDQKLS0tIGEvZ2NjL2ludGVybmFsLWZuLmNjCisrKyBiL2djYy9pbnRlcm5hbC1mbi5jYwpAQCAt NzM1LDkgKzczNSw5IEBAIGV4cGFuZF9hcml0aF9zZXRfb3ZlcmZsb3cgKHRyZWUgbGhzLCBydHgg dGFyZ2V0KQogewogICBpZiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAoVFJFRV9UWVBFIChs aHMpKSkgPT0gMQogICAgICAgJiYgIVRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAoVFJFRV9UWVBF IChsaHMpKSkpCi0gICAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNvbnN0bTFfcnR4LCB0 cnVlKTsKKyAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgY29uc3RtMV9ydHgsIHRydWUs IGZhbHNlKTsKICAgZWxzZQotICAgIHdyaXRlX2NvbXBsZXhfcGFydCAodGFyZ2V0LCBjb25zdDFf cnR4LCB0cnVlKTsKKyAgICB3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgY29uc3QxX3J0eCwg dHJ1ZSwgZmFsc2UpOwogfQogCiAvKiBIZWxwZXIgZm9yIGV4cGFuZF8qX292ZXJmbG93LiAgU3Rv cmUgUkVTIGludG8gdGhlIF9fcmVhbF9fIHBhcnQKQEAgLTc5Miw3ICs3OTIsNyBAQCBleHBhbmRf YXJpdGhfb3ZlcmZsb3dfcmVzdWx0X3N0b3JlICh0cmVlIGxocywgcnR4IHRhcmdldCwKICAgICAg IGV4cGFuZF9hcml0aF9zZXRfb3ZlcmZsb3cgKGxocywgdGFyZ2V0KTsKICAgICAgIGVtaXRfbGFi ZWwgKGRvbmVfbGFiZWwpOwogICAgIH0KLSAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGxy ZXMsIGZhbHNlKTsKKyAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGxyZXMsIGZhbHNlLCBm YWxzZSk7CiB9CiAKIC8qIEhlbHBlciBmb3IgZXhwYW5kXypfb3ZlcmZsb3cuICBTdG9yZSBSRVMg aW50byBUQVJHRVQuICAqLwpAQCAtODM3LDcgKzgzNyw3IEBAIGV4cGFuZF9hZGRzdWJfb3ZlcmZs b3cgKGxvY2F0aW9uX3QgbG9jLCB0cmVlX2NvZGUgY29kZSwgdHJlZSBsaHMsCiAgICAgewogICAg ICAgdGFyZ2V0ID0gZXhwYW5kX2V4cHIgKGxocywgTlVMTF9SVFgsIFZPSURtb2RlLCBFWFBBTkRf V1JJVEUpOwogICAgICAgaWYgKCFpc191YnNhbikKLQl3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdl dCwgY29uc3QwX3J0eCwgdHJ1ZSk7CisJd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNvbnN0 MF9ydHgsIHRydWUsIGZhbHNlKTsKICAgICB9CiAKICAgLyogV2UgYXNzdW1lIGJvdGggb3BlcmFu ZHMgYW5kIHJlc3VsdCBoYXZlIHRoZSBzYW1lIHByZWNpc2lvbgpAQCAtMTI4Miw3ICsxMjgyLDcg QEAgZXhwYW5kX25lZ19vdmVyZmxvdyAobG9jYXRpb25fdCBsb2MsIHRyZWUgbGhzLCB0cmVlIGFy ZzEsIGJvb2wgaXNfdWJzYW4sCiAgICAgewogICAgICAgdGFyZ2V0ID0gZXhwYW5kX2V4cHIgKGxo cywgTlVMTF9SVFgsIFZPSURtb2RlLCBFWFBBTkRfV1JJVEUpOwogICAgICAgaWYgKCFpc191YnNh bikKLQl3cml0ZV9jb21wbGV4X3BhcnQgKHRhcmdldCwgY29uc3QwX3J0eCwgdHJ1ZSk7CisJd3Jp dGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNvbnN0MF9ydHgsIHRydWUsIGZhbHNlKTsKICAgICB9 CiAKICAgZW51bSBpbnNuX2NvZGUgaWNvZGUgPSBvcHRhYl9oYW5kbGVyIChuZWd2M19vcHRhYiwg bW9kZSk7CkBAIC0xNDA3LDcgKzE0MDcsNyBAQCBleHBhbmRfbXVsX292ZXJmbG93IChsb2NhdGlv bl90IGxvYywgdHJlZSBsaHMsIHRyZWUgYXJnMCwgdHJlZSBhcmcxLAogICAgIHsKICAgICAgIHRh cmdldCA9IGV4cGFuZF9leHByIChsaHMsIE5VTExfUlRYLCBWT0lEbW9kZSwgRVhQQU5EX1dSSVRF KTsKICAgICAgIGlmICghaXNfdWJzYW4pCi0Jd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNv bnN0MF9ydHgsIHRydWUpOworCXdyaXRlX2NvbXBsZXhfcGFydCAodGFyZ2V0LCBjb25zdDBfcnR4 LCB0cnVlLCBmYWxzZSk7CiAgICAgfQogCiAgIGlmIChpc191YnNhbikKQEAgLTIyMjQsNyArMjIy NCw3IEBAIGV4cGFuZF9tdWxfb3ZlcmZsb3cgKGxvY2F0aW9uX3QgbG9jLCB0cmVlIGxocywgdHJl ZSBhcmcwLCB0cmVlIGFyZzEsCiAgICAgICBkb19jb21wYXJlX3J0eF9hbmRfanVtcCAob3AxLCBy ZXMsIE5FLCB0cnVlLCBtb2RlLCBOVUxMX1JUWCwgTlVMTCwKIAkJCSAgICAgICBhbGxfZG9uZV9s YWJlbCwgcHJvZmlsZV9wcm9iYWJpbGl0eTo6dmVyeV91bmxpa2VseSAoKSk7CiAgICAgICBlbWl0 X2xhYmVsIChzZXRfbm9vdmYpOwotICAgICAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNv bnN0MF9ydHgsIHRydWUpOworICAgICAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNvbnN0 MF9ydHgsIHRydWUsIGZhbHNlKTsKICAgICAgIGVtaXRfbGFiZWwgKGFsbF9kb25lX2xhYmVsKTsK ICAgICB9CiAKQEAgLTI0OTMsNyArMjQ5Myw3IEBAIGV4cGFuZF9hcml0aF9vdmVyZmxvdyAoZW51 bSB0cmVlX2NvZGUgY29kZSwgZ2ltcGxlICpzdG10KQogCXsKIAkgIC8qIFRoZSBpbmZpbml0eSBw cmVjaXNpb24gcmVzdWx0IHdpbGwgYWx3YXlzIGZpdCBpbnRvIHJlc3VsdC4gICovCiAJICBydHgg dGFyZ2V0ID0gZXhwYW5kX2V4cHIgKGxocywgTlVMTF9SVFgsIFZPSURtb2RlLCBFWFBBTkRfV1JJ VEUpOwotCSAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNvbnN0MF9ydHgsIHRydWUpOwor CSAgd3JpdGVfY29tcGxleF9wYXJ0ICh0YXJnZXQsIGNvbnN0MF9ydHgsIHRydWUsIGZhbHNlKTsK IAkgIHNjYWxhcl9pbnRfbW9kZSBtb2RlID0gU0NBTEFSX0lOVF9UWVBFX01PREUgKHR5cGUpOwog CSAgc3RydWN0IHNlcGFyYXRlX29wcyBvcHM7CiAJICBvcHMuY29kZSA9IGNvZGU7CmRpZmYgLS1n aXQgYS9nY2MvdGVzdHN1aXRlL2crKy50YXJnZXQvYWFyY2g2NC9jb21wbGV4LWluaXQuQyBiL2dj Yy90ZXN0c3VpdGUvZysrLnRhcmdldC9hYXJjaDY0L2NvbXBsZXgtaW5pdC5DCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu LmQzZmQzZTg4ZDA0YTg3YmFjZjFjNGVlNzRjZTI1MjgyYzZmZjgxZTgKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2crKy50YXJnZXQvYWFyY2g2NC9jb21wbGV4LWluaXQuQwpAQCAt MCwwICsxLDQwIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICIt TzIiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBjaGVjay1mdW5jdGlvbi1ib2RpZXMgIioqIiAiIiAi IiB7IHRhcmdldCB7IGxlIH0gfSB9IH0gKi8KKworLyoKKyoqIF9aMWZpaToKKyoqIC4uLgorKiog CWJmaQl4MCwgeDEsIDMyLCAzMgorKiogCXJldAorKiogLi4uCisqLworX0NvbXBsZXggaW50IGYo aW50IGEsIGludCBiKSB7CisgICAgX0NvbXBsZXggaW50IHQgPSBhICsgYiAqIDFpOworICAgIHJl dHVybiB0OworfQorCisvKgorKiogX1oyZjJpaToKKyoqIC4uLgorKiogCWJmaQl4MCwgeDEsIDMy LCAzMgorKiogCXJldAorKiogLi4uCisqLworX0NvbXBsZXggaW50IGYyKGludCBhLCBpbnQgYikg eworICAgIF9Db21wbGV4IGludCB0ID0ge2EsIGJ9OworICAgIHJldHVybiB0OworfQorCisvKiAK KyoqIF9aMTJmX2NvbnZvbHV0ZWRpaToKKyoqIC4uLgorKiogCWJmaQl4MCwgeDEsIDMyLCAzMgor KiogCXJldAorKiogLi4uCisqLworX0NvbXBsZXggaW50IGZfY29udm9sdXRlZChpbnQgYSwgaW50 IGIpIHsKKyAgICBfQ29tcGxleCBpbnQgdCA9IChfQ29tcGxleCBpbnQpYTsKKyAgICBfX2ltYWdf XyB0ID0gYjsKKyAgICByZXR1cm4gdDsKK30K --_002_VI1PR08MB532580D7E9614353CA5B919CFFAC9VI1PR08MB5325eurp_--