From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3506 invoked by alias); 12 Sep 2016 21:28:53 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 3489 invoked by uid 89); 12 Sep 2016 21:28:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 spammy=tuning, aarch64.c, UD:aarch64.c, aarch64c X-HELO: mail-lf0-f48.google.com Received: from mail-lf0-f48.google.com (HELO mail-lf0-f48.google.com) (209.85.215.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 12 Sep 2016 21:28:42 +0000 Received: by mail-lf0-f48.google.com with SMTP id u14so97278203lfd.1 for ; Mon, 12 Sep 2016 14:28:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=6k9GXF24sE/5eTMHPrAYBf6K3QGcFaOYXgzVSRavir4=; b=lir4l2ylZa06pxD819NvyxZMc58EzQDfoemdVnZVABPgY1NfS9NwsDLxzadmYQIYu1 mt0JPPInOsDDMcTVOma5wPrJxl3TPzuDhqw9aS3s+UD7l/ckWjKfs4sPAprQx3IUCiWD 25jxjaWGvIupW55OtAWCWXCiOJgbEzCBhfVktSdy5idwnpFsNcnFmF4FwutJxVWgd9Oo 2wesN71yY7XN32yctPnpgONSE1y2cOm/WUbeb/LoXZl21pS7ArPo5IsCqnod9UO03YGg rCDcCpCaX/4JyQMf6hlnDd+3KNtJViBWFeh0hrCc/0dkBvk0h4YbiXKJgu3mMLm/Vba2 RADA== X-Gm-Message-State: AE9vXwOeRhGL9I1nQi4ADea4snDqAmbKs4f0O0+dj8FNAwLLZKLBOGoVf3LZli3Qiqzp45HRbIoAggVue8qojw== X-Received: by 10.46.5.15 with SMTP id 15mr5754466ljf.65.1473715719839; Mon, 12 Sep 2016 14:28:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.25.166.76 with HTTP; Mon, 12 Sep 2016 14:28:38 -0700 (PDT) In-Reply-To: <6c55b703-5b5f-eba2-7234-4f846738e9a5@arm.com> References: <6c55b703-5b5f-eba2-7234-4f846738e9a5@arm.com> From: Andrew Pinski Date: Mon, 12 Sep 2016 21:29:00 -0000 Message-ID: Subject: Re: [PATCH/AARCH64] Improve ThunderX code generation slightly with load/store pair To: "Richard Earnshaw (lists)" Cc: GCC Patches Content-Type: multipart/mixed; boundary=001a114a7e12fb3e8c053c562dc5 X-IsSubscribed: yes X-SW-Source: 2016-09/txt/msg00674.txt.bz2 --001a114a7e12fb3e8c053c562dc5 Content-Type: text/plain; charset=UTF-8 Content-length: 6760 On Tue, Aug 9, 2016 at 10:43 AM, Richard Earnshaw (lists) wrote: > On 08/08/16 18:48, Andrew Pinski wrote: >> On Fri, Aug 5, 2016 at 12:18 AM, Andrew Pinski wrote: >>> Hi, >>> On ThunderX, load (and store) pair that does a pair of two word >>> (32bits) load/stores is slower in some cases than doing two >>> load/stores. For some internal benchmarks, it provides a 2-5% >>> improvement. >>> >>> This patch disables the forming of the load/store pairs for SImode if >>> we are tuning for ThunderX. I used the tuning flags route so it can >>> be overridden if needed later on or if someone else wants to use the >>> same method for their core. >>> >>> OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions. >> >> >> Here is a new version based on feedback both on the list and off. >> I added a check for alignment to greater than 8 bytes as that is >> alignment < 8 causes the slow down. >> I also added two new testcases testing this to make sure it did the >> load pair optimization when it is profitable. >> >> OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions. >> >> Thanks, >> Andrew Pinski >> >> ChangeLog: >> * config/aarch64/aarch64-tuning-flags.def (slow_ldpw): New tuning option. >> * config/aarch64/aarch64.c (thunderx_tunings): Enable >> AARCH64_EXTRA_TUNE_SLOW_LDPW. >> (aarch64_operands_ok_for_ldpstp): Return false if >> AARCH64_EXTRA_TUNE_SLOW_LDPW and the mode was SImode >> and the alignment is less than 8 byte. >> (aarch64_operands_adjust_ok_for_ldpstp): Likewise. >> >> testsuite/ChangeLog: >> * gcc.target/aarch64/thunderxloadpair.c: New testcase. >> * gcc.target/aarch64/thunderxnoloadpair.c: New testcase. >> >>> >>> Thanks, >>> Andrew Pinski >>> >>> ChangeLog: >>> * config/aarch64/aarch64-tuning-flags.def (slow_ldpw): New tuning option. >>> * config/aarch64/aarch64.c (thunderx_tunings): Enable >>> AARCH64_EXTRA_TUNE_SLOW_LDPW. >>> (aarch64_operands_ok_for_ldpstp): Return false if >>> AARCH64_EXTRA_TUNE_SLOW_LDPW and the mode was SImode. >>> (aarch64_operands_adjust_ok_for_ldpstp): Likewise. >>> > > OK with the changes noted below. This is what I committed after a bootstrap/test. 2016-09-12 Andrew Pinski * config/aarch64/aarch64-tuning-flags.def (SLOW_UNALIGNED_LDPW): New tuning option. * config/aarch64/aarch64.c (thunderx_tunings): Enable AARCH64_EXTRA_TUNE_SLOW_UNALIGNED_LDPW. (aarch64_operands_ok_for_ldpstp): Return false if AARCH64_EXTRA_TUNE_SLOW_UNALIGNED_LDPW and the mode was SImode and the alignment is less than 8 byte. (aarch64_operands_adjust_ok_for_ldpstp): Likewise. 2016-09-12 Andrew Pinski * gcc.target/aarch64/thunderxloadpair.c: New testcase. * gcc.target/aarch64/thunderxnoloadpair.c: New testcase. Thanks, Andrew > > R. > >>> stldpw.diff.txt >>> >>> >>> Index: config/aarch64/aarch64-tuning-flags.def >>> =================================================================== >>> --- config/aarch64/aarch64-tuning-flags.def (revision 239228) >>> +++ config/aarch64/aarch64-tuning-flags.def (working copy) >>> @@ -29,3 +29,4 @@ >>> AARCH64_TUNE_ to give an enum name. */ >>> >>> AARCH64_EXTRA_TUNING_OPTION ("rename_fma_regs", RENAME_FMA_REGS) >>> +AARCH64_EXTRA_TUNING_OPTION ("slow_ldpw", SLOW_LDPW) > > I think this should now be renamed SLOW_UNALIGNED_LDPW. I think it also > should be commented as to what it does at this point. > >>> Index: config/aarch64/aarch64.c >>> =================================================================== >>> --- config/aarch64/aarch64.c (revision 239228) >>> +++ config/aarch64/aarch64.c (working copy) >>> @@ -712,7 +712,7 @@ >>> 0, /* max_case_values. */ >>> 0, /* cache_line_size. */ >>> tune_params::AUTOPREFETCHER_OFF, /* autoprefetcher_model. */ >>> - (AARCH64_EXTRA_TUNE_NONE) /* tune_flags. */ >>> + (AARCH64_EXTRA_TUNE_SLOW_LDPW) /* tune_flags. */ >>> }; >>> >>> static const struct tune_params xgene1_tunings = >>> @@ -13593,6 +13593,15 @@ >>> if (MEM_VOLATILE_P (mem_1) || MEM_VOLATILE_P (mem_2)) >>> return false; >>> >>> + /* If we have SImode and slow ldp, check the alignment to be greater >>> + than 8 byte. */ > > Comment doesn't match code. Should be "at least 8 byte alignment". > >>> + if (mode == SImode >>> + && (aarch64_tune_params.extra_tuning_flags >>> + & AARCH64_EXTRA_TUNE_SLOW_LDPW) >>> + && !optimize_size >>> + && MEM_ALIGN (mem_1) < 8 * BITS_PER_UNIT) >>> + return false; >>> + >>> /* Check if the addresses are in the form of [base+offset]. */ >>> extract_base_offset_in_addr (mem_1, &base_1, &offset_1); >>> if (base_1 == NULL_RTX || offset_1 == NULL_RTX) >>> @@ -13752,6 +13761,15 @@ >>> return false; >>> } >>> >>> + /* If we have SImode and slow ldp, check the alignment to be greater >>> + than 8 byte. */ > > Likewise. > >>> + if (mode == SImode >>> + && (aarch64_tune_params.extra_tuning_flags >>> + & AARCH64_EXTRA_TUNE_SLOW_LDPW) >>> + && !optimize_size >>> + && MEM_ALIGN (mem_1) < 8 * BITS_PER_UNIT) >>> + return false; >>> + >>> if (REG_P (reg_1) && FP_REGNUM_P (REGNO (reg_1))) >>> rclass_1 = FP_REGS; >>> else >>> Index: testsuite/gcc.target/aarch64/thunderxloadpair.c >>> =================================================================== >>> --- testsuite/gcc.target/aarch64/thunderxloadpair.c (nonexistent) >>> +++ testsuite/gcc.target/aarch64/thunderxloadpair.c (working copy) >>> @@ -0,0 +1,20 @@ >>> +/* { dg-do compile } */ >>> +/* { dg-options "-O2 -mcpu=thunderx" } */ >>> + >>> +struct ldp >>> +{ >>> + long long c; >>> + int a, b; >>> +}; >>> + >>> + >>> +int f(struct ldp *a) >>> +{ >>> + return a->a + a->b; >>> +} >>> + >>> + >>> +/* We know the alignement of a->a to be 8 byte aligned so it is profitable >>> + to do ldp. */ >>> +/* { dg-final { scan-assembler-times "ldp\tw\[0-9\]+, w\[0-9\]" 1 } } */ >>> + >>> Index: testsuite/gcc.target/aarch64/thunderxnoloadpair.c >>> =================================================================== >>> --- testsuite/gcc.target/aarch64/thunderxnoloadpair.c (nonexistent) >>> +++ testsuite/gcc.target/aarch64/thunderxnoloadpair.c (working copy) >>> @@ -0,0 +1,17 @@ >>> +/* { dg-do compile } */ >>> +/* { dg-options "-O2 -mcpu=thunderx" } */ >>> + >>> +struct noldp >>> +{ >>> + int a, b; >>> +}; >>> + >>> + >>> +int f(struct noldp *a) >>> +{ >>> + return a->a + a->b; >>> +} >>> + >>> +/* We know the alignement of a->a to be 4 byte aligned so it is not profitable >>> + to do ldp. */ >>> +/* { dg-final { scan-assembler-time "ldp\tw\[0-9\]+, w\[0-9\]" 1 } } */ > --001a114a7e12fb3e8c053c562dc5 Content-Type: text/plain; charset=US-ASCII; name="unalignedldpw.diff.txt" Content-Disposition: attachment; filename="unalignedldpw.diff.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_it0k6z1r0 Content-length: 6292 SW5kZXg6IGdjYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gZ2NjL0NoYW5nZUxvZwkocmV2aXNpb24gMjQwMTAwKQorKysgZ2NjL0No YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDE2 LTA5LTEyICBBbmRyZXcgUGluc2tpICA8YXBpbnNraUBjYXZpdW0uY29tPgor CisJKiBjb25maWcvYWFyY2g2NC9hYXJjaDY0LXR1bmluZy1mbGFncy5kZWYg KFNMT1dfVU5BTElHTkVEX0xEUFcpOgorCU5ldyB0dW5pbmcgb3B0aW9uLgor CSogY29uZmlnL2FhcmNoNjQvYWFyY2g2NC5jICh0aHVuZGVyeF90dW5pbmdz KTogRW5hYmxlCisJQUFSQ0g2NF9FWFRSQV9UVU5FX1NMT1dfVU5BTElHTkVE X0xEUFcuCisJKGFhcmNoNjRfb3BlcmFuZHNfb2tfZm9yX2xkcHN0cCk6IFJl dHVybiBmYWxzZSBpZgorCUFBUkNINjRfRVhUUkFfVFVORV9TTE9XX1VOQUxJ R05FRF9MRFBXIGFuZCB0aGUgbW9kZQorCXdhcyBTSW1vZGUgYW5kIHRoZSBh bGlnbm1lbnQgaXMgbGVzcyB0aGFuIDggYnl0ZS4KKwkoYWFyY2g2NF9vcGVy YW5kc19hZGp1c3Rfb2tfZm9yX2xkcHN0cCk6IExpa2V3aXNlLgorCiAyMDE2 LTA5LTEyICBNYXJlayBQb2xhY2VrICA8cG9sYWNla0ByZWRoYXQuY29tPgog CiAJKiBkb2MvZXh0ZW5kLnRleGk6IFVzZSBsb3dlcmNhc2UgImJvb2xlYW4i LgpJbmRleDogZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtdHVuaW5nLWZs YWdzLmRlZgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvY29uZmln L2FhcmNoNjQvYWFyY2g2NC10dW5pbmctZmxhZ3MuZGVmCShyZXZpc2lvbiAy NDAxMDApCisrKyBnY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC10dW5pbmct ZmxhZ3MuZGVmCSh3b3JraW5nIGNvcHkpCkBAIC0yOSwzICsyOSw4IEBACiAg ICAgIEFBUkNINjRfVFVORV8gdG8gZ2l2ZSBhbiBlbnVtIG5hbWUuICovCiAK IEFBUkNINjRfRVhUUkFfVFVOSU5HX09QVElPTiAoInJlbmFtZV9mbWFfcmVn cyIsIFJFTkFNRV9GTUFfUkVHUykKKworLyogRG9uJ3QgY3JlYXRlIG5vbi04 IGJ5dGUgYWxpZ25lZCBsb2FkL3N0b3JlIHBhaXIuICBUaGF0IGlzIGlmIHRo ZQordHdvIGxvYWQvc3RvcmVzIGFyZSBub3QgYXQgbGVhc3QgOCBieXRlIGFs aWduZWQgZG9uJ3QgY3JlYXRlIGxvYWQvc3RvcmUKK3BhaXJzLiAgICovCitB QVJDSDY0X0VYVFJBX1RVTklOR19PUFRJT04gKCJzbG93X3VuYWxpZ25lZF9s ZHB3IiwgU0xPV19VTkFMSUdORURfTERQVykKSW5kZXg6IGdjYy9jb25maWcv YWFyY2g2NC9hYXJjaDY0LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g Z2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQuYwkocmV2aXNpb24gMjQwMTAw KQorKysgZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQuYwkod29ya2luZyBj b3B5KQpAQCAtNzEyLDcgKzcxMiw3IEBACiAgIDAsCS8qIG1heF9jYXNlX3Zh bHVlcy4gICovCiAgIDAsCS8qIGNhY2hlX2xpbmVfc2l6ZS4gICovCiAgIHR1 bmVfcGFyYW1zOjpBVVRPUFJFRkVUQ0hFUl9PRkYsCS8qIGF1dG9wcmVmZXRj aGVyX21vZGVsLiAgKi8KLSAgKEFBUkNINjRfRVhUUkFfVFVORV9OT05FKQkv KiB0dW5lX2ZsYWdzLiAgKi8KKyAgKEFBUkNINjRfRVhUUkFfVFVORV9TTE9X X1VOQUxJR05FRF9MRFBXKQkvKiB0dW5lX2ZsYWdzLiAgKi8KIH07CiAKIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgdHVuZV9wYXJhbXMgeGdlbmUxX3R1bmluZ3Mg PQpAQCAtMTM2MjksNiArMTM2MjksMTUgQEAKICAgaWYgKE1FTV9WT0xBVElM RV9QIChtZW1fMSkgfHwgTUVNX1ZPTEFUSUxFX1AgKG1lbV8yKSkKICAgICBy ZXR1cm4gZmFsc2U7CiAKKyAgLyogSWYgd2UgaGF2ZSBTSW1vZGUgYW5kIHNs b3cgdW5hbGlnbmVkIGxkcCwKKyAgICAgY2hlY2sgdGhlIGFsaWdubWVudCB0 byBiZSBhdCBsZWFzdCA4IGJ5dGUuICovCisgIGlmIChtb2RlID09IFNJbW9k ZQorICAgICAgJiYgKGFhcmNoNjRfdHVuZV9wYXJhbXMuZXh0cmFfdHVuaW5n X2ZsYWdzCisgICAgICAgICAgJiBBQVJDSDY0X0VYVFJBX1RVTkVfU0xPV19V TkFMSUdORURfTERQVykKKyAgICAgICYmICFvcHRpbWl6ZV9zaXplCisgICAg ICAmJiBNRU1fQUxJR04gKG1lbV8xKSA8IDggKiBCSVRTX1BFUl9VTklUKQor ICAgIHJldHVybiBmYWxzZTsKKwogICAvKiBDaGVjayBpZiB0aGUgYWRkcmVz c2VzIGFyZSBpbiB0aGUgZm9ybSBvZiBbYmFzZStvZmZzZXRdLiAgKi8KICAg ZXh0cmFjdF9iYXNlX29mZnNldF9pbl9hZGRyIChtZW1fMSwgJmJhc2VfMSwg Jm9mZnNldF8xKTsKICAgaWYgKGJhc2VfMSA9PSBOVUxMX1JUWCB8fCBvZmZz ZXRfMSA9PSBOVUxMX1JUWCkKQEAgLTEzNzg4LDYgKzEzNzk3LDE1IEBACiAJ cmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAvKiBJZiB3ZSBoYXZlIFNJbW9k ZSBhbmQgc2xvdyB1bmFsaWduZWQgbGRwLAorICAgICBjaGVjayB0aGUgYWxp Z25tZW50IHRvIGJlIGF0IGxlYXN0IDggYnl0ZS4gKi8KKyAgaWYgKG1vZGUg PT0gU0ltb2RlCisgICAgICAmJiAoYWFyY2g2NF90dW5lX3BhcmFtcy5leHRy YV90dW5pbmdfZmxhZ3MKKyAgICAgICAgICAmIEFBUkNINjRfRVhUUkFfVFVO RV9TTE9XX1VOQUxJR05FRF9MRFBXKQorICAgICAgJiYgIW9wdGltaXplX3Np emUKKyAgICAgICYmIE1FTV9BTElHTiAobWVtXzEpIDwgOCAqIEJJVFNfUEVS X1VOSVQpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIGlmIChSRUdfUCAocmVn XzEpICYmIEZQX1JFR05VTV9QIChSRUdOTyAocmVnXzEpKSkKICAgICByY2xh c3NfMSA9IEZQX1JFR1M7CiAgIGVsc2UKSW5kZXg6IGdjYy90ZXN0c3VpdGUv Q2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy90ZXN0 c3VpdGUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyNDAxMDApCisrKyBnY2MvdGVz dHN1aXRlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgg QEAKKzIwMTYtMDktMTIgIEFuZHJldyBQaW5za2kgIDxhcGluc2tpQGNhdml1 bS5jb20+CisKKwkqIGdjYy50YXJnZXQvYWFyY2g2NC90aHVuZGVyeGxvYWRw YWlyLmM6IE5ldyB0ZXN0Y2FzZS4KKwkqIGdjYy50YXJnZXQvYWFyY2g2NC90 aHVuZGVyeG5vbG9hZHBhaXIuYzogTmV3IHRlc3RjYXNlLgorCiAyMDE2LTA5 LTEyICBVcm9zIEJpemphayAgPHViaXpqYWtAZ21haWwuY29tPgogCiAJKiBn Y2MuZGcvY29tcGF0L3NjYWxhci1ieS12YWx1ZS00X3guYzogQWxzbyB0ZXN0 IHBhc3Npbmcgb2YKSW5kZXg6IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h YXJjaDY0L3RodW5kZXJ4bG9hZHBhaXIuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC90aHVu ZGVyeGxvYWRwYWlyLmMJKG5vbmV4aXN0ZW50KQorKysgZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2FhcmNoNjQvdGh1bmRlcnhsb2FkcGFpci5jCSh3b3Jr aW5nIGNvcHkpCkBAIC0wLDAgKzEsMjAgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbWNwdT10aHVuZGVyeCIg fSAqLworCitzdHJ1Y3QgbGRwCit7CisgIGxvbmcgbG9uZyBjOworICBpbnQg YSwgYjsKK307CisKKworaW50IGYoc3RydWN0IGxkcCAqYSkKK3sKKyAgcmV0 dXJuIGEtPmEgKyBhLT5iOworfQorCisKKy8qIFdlIGtub3cgdGhlIGFsaWdu ZW1lbnQgb2YgYS0+YSB0byBiZSA4IGJ5dGUgYWxpZ25lZCBzbyBpdCBpcyBw cm9maXRhYmxlCisgICB0byBkbyBsZHAuICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItdGltZXMgImxkcFx0d1xbMC05XF0rLCB3XFswLTlc XSIgMSB9IH0gKi8KKwpJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FhcmNoNjQvdGh1bmRlcnhub2xvYWRwYWlyLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQv dGh1bmRlcnhub2xvYWRwYWlyLmMJKG5vbmV4aXN0ZW50KQorKysgZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvdGh1bmRlcnhub2xvYWRwYWly LmMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNyBAQAorLyogeyBkZy1k byBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tY3B1PXRo dW5kZXJ4IiB9ICovCisKK3N0cnVjdCBub2xkcAoreworICBpbnQgYSwgYjsK K307CisKKworaW50IGYoc3RydWN0IG5vbGRwICphKQoreworICByZXR1cm4g YS0+YSArIGEtPmI7Cit9CisKKy8qIFdlIGtub3cgdGhlIGFsaWduZW1lbnQg b2YgYS0+YSB0byBiZSA0IGJ5dGUgYWxpZ25lZCBzbyBpdCBpcyBub3QgcHJv Zml0YWJsZQorICAgdG8gZG8gbGRwLiAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLW5vdCAibGRwXHR3XFswLTlcXSssIHdcWzAtOVxdIiB9 IH0gKi8K --001a114a7e12fb3e8c053c562dc5--