From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 98E003858017 for ; Wed, 17 Nov 2021 13:30:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 98E003858017 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 38B381FB; Wed, 17 Nov 2021 05:30:40 -0800 (PST) Received: from [10.57.23.37] (unknown [10.57.23.37]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 81E653F70D; Wed, 17 Nov 2021 05:30:39 -0800 (PST) Content-Type: multipart/mixed; boundary="------------sRG5l2YWyVfv7TZAp9jZh6RR" Message-ID: <6c730f35-10b1-2843-cffc-4ed0851380be@arm.com> Date: Wed, 17 Nov 2021 13:30:31 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.3.1 Subject: Re: [AArch64] Enable generation of FRINTNZ instructions Content-Language: en-US To: Richard Biener Cc: "gcc-patches@gcc.gnu.org" , Richard Sandiford References: <8225375c-eb9e-f9b3-6bcd-9fbccf2fc87b@arm.com> <70s9nn94-452-5rrr-4458-q6n3qp563652@fhfr.qr> <36e3469a-3922-d49e-4006-0088eac29157@arm.com> <653o8886-3p5n-sr82-9n83-71q33o8824@fhfr.qr> From: "Andre Vieira (lists)" In-Reply-To: <653o8886-3p5n-sr82-9n83-71q33o8824@fhfr.qr> X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LOTSOFHASH, KAM_SHORT, NICE_REPLY_A, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Nov 2021 13:30:43 -0000 This is a multi-part message in MIME format. --------------sRG5l2YWyVfv7TZAp9jZh6RR Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 16/11/2021 12:10, Richard Biener wrote: > On Fri, 12 Nov 2021, Andre Simoes Dias Vieira wrote: > >> On 12/11/2021 10:56, Richard Biener wrote: >>> On Thu, 11 Nov 2021, Andre Vieira (lists) wrote: >>> >>>> Hi, >>>> >>>> This patch introduces two IFN's FTRUNC32 and FTRUNC64, the corresponding >>>> optabs and mappings. It also creates a backend pattern to implement them >>>> for >>>> aarch64 and a match.pd pattern to idiom recognize these. >>>> These IFN's (and optabs) represent a truncation towards zero, as if >>>> performed >>>> by first casting it to a signed integer of 32 or 64 bits and then back to >>>> the >>>> same floating point type/mode. >>>> >>>> The match.pd pattern choses to use these, when supported, regardless of >>>> trapping math, since these new patterns mimic the original behavior of >>>> truncating through an integer. >>>> >>>> I didn't think any of the existing IFN's represented these. I know it's a >>>> bit >>>> late in stage 1, but I thought this might be OK given it's only used by a >>>> single target and should have very little impact on anything else. >>>> >>>> Bootstrapped on aarch64-none-linux. >>>> >>>> OK for trunk? >>> On the RTL side ftrunc32/ftrunc64 would probably be better a conversion >>> optab (with two modes), so not >>> >>> +OPTAB_D (ftrunc32_optab, "ftrunc$asi2") >>> +OPTAB_D (ftrunc64_optab, "ftrunc$adi2") >>> >>> but >>> >>> OPTAB_CD (ftrunc_shrt_optab, "ftrunc$a$I$b2") >>> >>> or so? I know that gets somewhat awkward for the internal function, >>> but IMHO we shouldn't tie our hands because of that? >> I tried doing this originally, but indeed I couldn't find a way to correctly >> tie the internal function to it. >> >> direct_optab_supported_p with multiple types expect those to be of the same >> mode. I see convert_optab_supported_p does but I don't know how that is >> used... >> >> Any ideas? > No "nice" ones. The "usual" way is to provide fake arguments that > specify the type/mode. We could use an integer argument directly > secifying the mode (then the IL would look host dependent - ugh), > or specify a constant zero in the intended mode (less visibly > obvious - but at least with -gimple dumping you'd see the type...). Hi, So I reworked this to have a single optab and IFN. This required a bit of fiddling with custom expander and supported_p functions for the IFN. I decided to pass a MAX_INT for the 'int' type to the IFN to be able to pass on the size of the int we use as an intermediate cast.  I tried 0 first, but gcc was being too smart and just demoted it to an 'int' for the long long test-cases. Bootstrapped on aarch64-none-linux. OK for trunk? gcc/ChangeLog:         * config/aarch64/aarch64.md (ftrunc2): New pattern.         * config/aarch64/iterators.md (FRINTZ): New iterator.         * doc/md.texi: New entry for ftrunc pattern name.         * internal-fn.def (FTRUNC_INT): New IFN.         * match.pd: Add to the existing TRUNC pattern match.         * optabs.def (ftrunc_int): New entry. gcc/testsuite/ChangeLog:         * gcc.target/aarch64/merge_trunc1.c: Adapted to skip if frintNz instruction available.         * lib/target-supports.exp: Added arm_v8_5a_frintnzx_ok target.         * gcc.target/aarch64/frintnz.c: New test. --------------sRG5l2YWyVfv7TZAp9jZh6RR Content-Type: text/plain; charset=UTF-8; name="frintnz2.patch" Content-Disposition: attachment; filename="frintnz2.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0Lm1kIGIvZ2NjL2NvbmZp Zy9hYXJjaDY0L2FhcmNoNjQubWQKaW5kZXggNDAzNWUwNjE3MDY3OTM4NDljNjhhZTA5YmNi MmU0Yjk1ODBhYjdiNi4uNjJhZGJjNGNiNmJiYmUwYzg1NmY5ZmJlNDUxYWVlMDhmMmRlYTNi NSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKKysrIGIvZ2Nj L2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKQEAgLTczNDUsNiArNzM0NSwxNCBAQCAoZGVm aW5lX2luc24gImRlc3BlY3VsYXRlX3NpbXBsZXRpIgogICAgKHNldF9hdHRyICJzcGVjdWxh dGlvbl9iYXJyaWVyIiAidHJ1ZSIpXQogKQogCisoZGVmaW5lX2V4cGFuZCAiZnRydW5jPG1v ZGU+PGZyaW50bnpfbW9kZT4yIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWU0ZERiAwICJy ZWdpc3Rlcl9vcGVyYW5kIiAiPXciKQorICAgICAgICAodW5zcGVjOlZTRkRGIFsobWF0Y2hf b3BlcmFuZDpWU0ZERiAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidyIpXQorCQkgICAgICBGUklO VE5aKSldCisgICJUQVJHRVRfRlJJTlQgJiYgVEFSR0VUX0ZMT0FUCisgICAmJiAhKFZFQ1RP Ul9NT0RFX1AgKDxNT0RFPm1vZGUpICYmICFUQVJHRVRfU0lNRCkiCispCisKIChkZWZpbmVf aW5zbiAiYWFyY2g2NF88ZnJpbnRuenNfb3A+PG1vZGU+IgogICBbKHNldCAobWF0Y2hfb3Bl cmFuZDpWU0ZERiAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXciKQogCSh1bnNwZWM6VlNGREYg WyhtYXRjaF9vcGVyYW5kOlZTRkRGIDEgInJlZ2lzdGVyX29wZXJhbmQiICJ3IildCmRpZmYg LS1naXQgYS9nY2MvY29uZmlnL2FhcmNoNjQvaXRlcmF0b3JzLm1kIGIvZ2NjL2NvbmZpZy9h YXJjaDY0L2l0ZXJhdG9ycy5tZAppbmRleCBiZGM4YmEzNTc2Y2YyYzliNGFlOTZiNDVhMzgy MjM0ZTRlMjViMTNmLi40OTUxMDQ4OGEyYTgwMDY4OWU5NWMzOTlmMmU2Yzk2N2I1NjY1MTZk IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FhcmNoNjQvaXRlcmF0b3JzLm1kCisrKyBiL2dj Yy9jb25maWcvYWFyY2g2NC9pdGVyYXRvcnMubWQKQEAgLTMwNjcsNiArMzA2Nyw4IEBAIChk ZWZpbmVfaW50X2l0ZXJhdG9yIEZDTUxBIFtVTlNQRUNfRkNNTEEKIChkZWZpbmVfaW50X2l0 ZXJhdG9yIEZSSU5UTlpYIFtVTlNQRUNfRlJJTlQzMlogVU5TUEVDX0ZSSU5UMzJYCiAJCQkg ICAgICAgVU5TUEVDX0ZSSU5UNjRaIFVOU1BFQ19GUklOVDY0WF0pCiAKKyhkZWZpbmVfaW50 X2l0ZXJhdG9yIEZSSU5UTlogW1VOU1BFQ19GUklOVDMyWiBVTlNQRUNfRlJJTlQ2NFpdKQor CiAoZGVmaW5lX2ludF9pdGVyYXRvciBTVkVfQlJLX1VOQVJZIFtVTlNQRUNfQlJLQSBVTlNQ RUNfQlJLQl0pCiAKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFNWRV9CUktfQklOQVJZIFtVTlNQ RUNfQlJLTiBVTlNQRUNfQlJLUEEgVU5TUEVDX0JSS1BCXSkKQEAgLTM0ODIsNiArMzQ4NCw4 IEBAIChkZWZpbmVfaW50X2F0dHIgZjE2bWFjMSBbKFVOU1BFQ19GTUxBTCAiYSIpIChVTlNQ RUNfRk1MU0wgInMiKQogKGRlZmluZV9pbnRfYXR0ciBmcmludG56c19vcCBbKFVOU1BFQ19G UklOVDMyWiAiZnJpbnQzMnoiKSAoVU5TUEVDX0ZSSU5UMzJYICJmcmludDMyeCIpCiAJCQkg ICAgICAoVU5TUEVDX0ZSSU5UNjRaICJmcmludDY0eiIpIChVTlNQRUNfRlJJTlQ2NFggImZy aW50NjR4IildKQogCisoZGVmaW5lX2ludF9hdHRyIGZyaW50bnpfbW9kZSBbKFVOU1BFQ19G UklOVDMyWiAic2kiKSAoVU5TUEVDX0ZSSU5UNjRaICJkaSIpXSkKKwogOzsgVGhlIGNvbmRp dGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gVU5TUEVDX0NPTkRfPHh4Pi4KIChkZWZpbmVfaW50 X2F0dHIgY21wX29wIFsoVU5TUEVDX0NPTkRfQ01QRVFfV0lERSAiZXEiKQogCQkJIChVTlNQ RUNfQ09ORF9DTVBHRV9XSURFICJnZSIpCmRpZmYgLS1naXQgYS9nY2MvZG9jL21kLnRleGkg Yi9nY2MvZG9jL21kLnRleGkKaW5kZXggNDFmMTg1MGJmNmU5NTAwNTY0N2NhOTdhNDk1YTk3 ZDdlMTg0ZDEzNy4uN2JkNjY4MTgxNDRlODdlMWRjYTJlZjEzYmVmMWQ2ZjIxZjIzOTU3MCAx MDA2NDQKLS0tIGEvZ2NjL2RvYy9tZC50ZXhpCisrKyBiL2djYy9kb2MvbWQudGV4aQpAQCAt NjE3NSw2ICs2MTc1LDEzIEBAIG9wZXJhbmRzOyBvdGhlcndpc2UsIGl0IG1heSBub3QuCiAK IFRoaXMgcGF0dGVybiBpcyBub3QgYWxsb3dlZCB0byBAY29kZXtGQUlMfS4KIAorQGNpbmRl eCBAY29kZXtmdHJ1bmNAdmFye219QHZhcntufTJ9IGluc3RydWN0aW9uIHBhdHRlcm4KK0Bp dGVtIEBzYW1we2Z0cnVuY0B2YXJ7bX1AdmFye259Mn0KK1RydW5jYXRlIG9wZXJhbmQgMSB0 byBhIEB2YXJ7bn0gbW9kZSBzaWduZWQgaW50ZWdlciwgdG93YXJkcyB6ZXJvLCBhbmQgc3Rv cmUKK3RoZSByZXN1bHQgaW4gb3BlcmFuZCAwLiBCb3RoIG9wZXJhbmRzIGhhdmUgbW9kZSBA dmFye219LCB3aGljaCBpcyBhIHNjYWxhciBvcgordmVjdG9yIGZsb2F0aW5nLXBvaW50IG1v ZGUuCisKKwogQGNpbmRleCBAY29kZXtyb3VuZEB2YXJ7bX0yfSBpbnN0cnVjdGlvbiBwYXR0 ZXJuCiBAaXRlbSBAc2FtcHtyb3VuZEB2YXJ7bX0yfQogUm91bmQgb3BlcmFuZCAxIHRvIHRo ZSBuZWFyZXN0IGludGVnZXIsIHJvdW5kaW5nIGF3YXkgZnJvbSB6ZXJvIGluIHRoZQpkaWZm IC0tZ2l0IGEvZ2NjL2ludGVybmFsLWZuLmMgYi9nY2MvaW50ZXJuYWwtZm4uYwppbmRleCAw Y2JhOTU0MTFhNjM0MjM0ODRkZGE1YjEyNTFmNDdkZTI0ZTkyNmJhLi5kODMwNmI1MDgwNzYw OTU3M2MyZmY2MTJlMmE4M2RjZjFjNTVkMWRlIDEwMDY0NAotLS0gYS9nY2MvaW50ZXJuYWwt Zm4uYworKysgYi9nY2MvaW50ZXJuYWwtZm4uYwpAQCAtMTMwLDYgKzEzMCw3IEBAIGluaXRf aW50ZXJuYWxfZm5zICgpCiAjZGVmaW5lIGZvbGRfbGVmdF9kaXJlY3QgeyAxLCAxLCBmYWxz ZSB9CiAjZGVmaW5lIG1hc2tfZm9sZF9sZWZ0X2RpcmVjdCB7IDEsIDEsIGZhbHNlIH0KICNk ZWZpbmUgY2hlY2tfcHRyc19kaXJlY3QgeyAwLCAwLCBmYWxzZSB9CisjZGVmaW5lIGZ0cnVu Y19pbnRfZGlyZWN0IHsgMCwgMSwgdHJ1ZSB9CiAKIGNvbnN0IGRpcmVjdF9pbnRlcm5hbF9m bl9pbmZvIGRpcmVjdF9pbnRlcm5hbF9mbl9hcnJheVtJRk5fTEFTVCArIDFdID0gewogI2Rl ZmluZSBERUZfSU5URVJOQUxfRk4oQ09ERSwgRkxBR1MsIEZOU1BFQykgbm90X2RpcmVjdCwK QEAgLTE1Niw2ICsxNTcsMjkgQEAgZ2V0X211bHRpX3ZlY3Rvcl9tb3ZlICh0cmVlIGFycmF5 X3R5cGUsIGNvbnZlcnRfb3B0YWIgb3B0YWIpCiAgIHJldHVybiBjb252ZXJ0X29wdGFiX2hh bmRsZXIgKG9wdGFiLCBpbW9kZSwgdm1vZGUpOwogfQogCisvKiBFeHBhbmQgRlRSVU5DX0lO VCBjYWxsIFNUTVQgdXNpbmcgb3B0YWIgT1BUQUIuICAqLworCitzdGF0aWMgdm9pZAorZXhw YW5kX2Z0cnVuY19pbnRfb3B0YWJfZm4gKGludGVybmFsX2ZuLCBnY2FsbCAqc3RtdCwgY29u dmVydF9vcHRhYiBvcHRhYikKK3sKKyAgY2xhc3MgZXhwYW5kX29wZXJhbmQgb3BzWzJdOwor ICB0cmVlIGxocywgZmxvYXRfdHlwZSwgaW50X3R5cGU7CisgIHJ0eCB0YXJnZXQsIG9wOwor CisgIGxocyA9IGdpbXBsZV9jYWxsX2xocyAoc3RtdCk7CisgIHRhcmdldCA9IGV4cGFuZF9u b3JtYWwgKGxocyk7CisgIG9wID0gZXhwYW5kX25vcm1hbCAoZ2ltcGxlX2NhbGxfYXJnIChz dG10LCAwKSk7CisKKyAgZmxvYXRfdHlwZSA9IFRSRUVfVFlQRSAobGhzKTsKKyAgaW50X3R5 cGUgPSBUUkVFX1RZUEUgKGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwgMSkpOworCisgIGNyZWF0 ZV9vdXRwdXRfb3BlcmFuZCAoJm9wc1swXSwgdGFyZ2V0LCBUWVBFX01PREUgKGZsb2F0X3R5 cGUpKTsKKyAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbMV0sIG9wLCBUWVBFX01PREUg KGZsb2F0X3R5cGUpKTsKKworICBleHBhbmRfaW5zbiAoY29udmVydF9vcHRhYl9oYW5kbGVy IChvcHRhYiwgVFlQRV9NT0RFIChmbG9hdF90eXBlKSwKKwkJCQkgICAgICBUWVBFX01PREUg KGludF90eXBlKSksIDIsIG9wcyk7Cit9CisKIC8qIEV4cGFuZCBMT0FEX0xBTkVTIGNhbGwg U1RNVCB1c2luZyBvcHRhYiBPUFRBQi4gICovCiAKIHN0YXRpYyB2b2lkCkBAIC0zNzEyLDYg KzM3MzYsNyBAQCBtdWx0aV92ZWN0b3Jfb3B0YWJfc3VwcG9ydGVkX3AgKGNvbnZlcnRfb3B0 YWIgb3B0YWIsIHRyZWVfcGFpciB0eXBlcywKICNkZWZpbmUgZGlyZWN0X21hc2tfZm9sZF9s ZWZ0X29wdGFiX3N1cHBvcnRlZF9wIGRpcmVjdF9vcHRhYl9zdXBwb3J0ZWRfcAogI2RlZmlu ZSBkaXJlY3RfY2hlY2tfcHRyc19vcHRhYl9zdXBwb3J0ZWRfcCBkaXJlY3Rfb3B0YWJfc3Vw cG9ydGVkX3AKICNkZWZpbmUgZGlyZWN0X3ZlY19zZXRfb3B0YWJfc3VwcG9ydGVkX3AgZGly ZWN0X29wdGFiX3N1cHBvcnRlZF9wCisjZGVmaW5lIGRpcmVjdF9mdHJ1bmNfaW50X29wdGFi X3N1cHBvcnRlZF9wIGNvbnZlcnRfb3B0YWJfc3VwcG9ydGVkX3AKIAogLyogUmV0dXJuIHRo ZSBvcHRhYiB1c2VkIGJ5IGludGVybmFsIGZ1bmN0aW9uIEZOLiAgKi8KIApkaWZmIC0tZ2l0 IGEvZ2NjL2ludGVybmFsLWZuLmRlZiBiL2djYy9pbnRlcm5hbC1mbi5kZWYKaW5kZXggYmIx M2M2Y2NlMWJmNTU2MzM3NjBiYzE0OTgwNDAyZjFmMGFjMTY4OS4uZmI5N2QzN2NlY2FlMTdj ZGI2NDQ0ZTdmMzM5MTM2MWIyMTRmMDcxMiAxMDA2NDQKLS0tIGEvZ2NjL2ludGVybmFsLWZu LmRlZgorKysgYi9nY2MvaW50ZXJuYWwtZm4uZGVmCkBAIC0yNjksNiArMjY5LDcgQEAgREVG X0lOVEVSTkFMX0ZMVF9GTE9BVE5fRk4gKFJJTlQsIEVDRl9DT05TVCwgcmludCwgdW5hcnkp CiBERUZfSU5URVJOQUxfRkxUX0ZMT0FUTl9GTiAoUk9VTkQsIEVDRl9DT05TVCwgcm91bmQs IHVuYXJ5KQogREVGX0lOVEVSTkFMX0ZMVF9GTE9BVE5fRk4gKFJPVU5ERVZFTiwgRUNGX0NP TlNULCByb3VuZGV2ZW4sIHVuYXJ5KQogREVGX0lOVEVSTkFMX0ZMVF9GTE9BVE5fRk4gKFRS VU5DLCBFQ0ZfQ09OU1QsIGJ0cnVuYywgdW5hcnkpCitERUZfSU5URVJOQUxfT1BUQUJfRk4g KEZUUlVOQ19JTlQsIEVDRl9DT05TVCwgZnRydW5jaW50LCBmdHJ1bmNfaW50KQogCiAvKiBC aW5hcnkgbWF0aCBmdW5jdGlvbnMuICAqLwogREVGX0lOVEVSTkFMX0ZMVF9GTiAoQVRBTjIs IEVDRl9DT05TVCwgYXRhbjIsIGJpbmFyeSkKZGlmZiAtLWdpdCBhL2djYy9tYXRjaC5wZCBi L2djYy9tYXRjaC5wZAppbmRleCBhMzE5YWVmYTgwODFhYzE3Nzk4MWFkNDI1YzQ2MWY4YTc3 MTEyOGY0Li5jMzdhYTAyM2I1NzgzOGViYTgwYzdhMjEyZmYxMDM4ZWI2ZWVkODYxIDEwMDY0 NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIvZ2NjL21hdGNoLnBkCkBAIC0zNzEzLDEyICsz NzEzLDIxIEBAIERFRklORV9JTlRfQU5EX0ZMT0FUX1JPVU5EX0ZOIChSSU5UKQogICAgdHJh cHBpbmcgYmVoYXZpb3VyLCBzbyByZXF1aXJlICFmbGFnX3RyYXBwaW5nX21hdGguICovCiAj aWYgR0lNUExFCiAoc2ltcGxpZnkKLSAgIChmbG9hdCAoZml4X3RydW5jIEAwKSkKLSAgIChp ZiAoIWZsYWdfdHJhcHBpbmdfbWF0aAotCSYmIHR5cGVzX21hdGNoICh0eXBlLCBUUkVFX1RZ UEUgKEAwKSkKLQkmJiBkaXJlY3RfaW50ZXJuYWxfZm5fc3VwcG9ydGVkX3AgKElGTl9UUlVO QywgdHlwZSwKLQkJCQkJICBPUFRJTUlaRV9GT1JfQk9USCkpCi0gICAgICAoSUZOX1RSVU5D IEAwKSkpCisgICAoZmxvYXQgKGZpeF90cnVuY0AxIEAwKSkKKyAgIChpZiAodHlwZXNfbWF0 Y2ggKHR5cGUsIFRSRUVfVFlQRSAoQDApKSkKKyAgICAoaWYgKFRZUEVfU0lHTiAoVFJFRV9U WVBFIChAMSkpID09IFNJR05FRAorCSAmJiBkaXJlY3RfaW50ZXJuYWxfZm5fc3VwcG9ydGVk X3AgKElGTl9GVFJVTkNfSU5ULCB0eXBlLAorCQkJCQkgICAgVFJFRV9UWVBFIChAMSksIE9Q VElNSVpFX0ZPUl9CT1RIKSkKKyAgICAgKHdpdGggeworICAgICAgdHJlZSBpbnRfdHlwZSA9 IFRSRUVfVFlQRSAoQDEpOworICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBtYXhfaW50 X2MKKwk9ICgxVUxMIDw8IChlbGVtZW50X3ByZWNpc2lvbiAoaW50X3R5cGUpIC0gMSkpIC0g MTsKKyAgICAgIH0KKyAgICAgIChJRk5fRlRSVU5DX0lOVCBAMCB7IGJ1aWxkX2ludF9jc3Qg KGludF90eXBlLCBtYXhfaW50X2MpOyB9KSkKKyAgICAgKGlmICghZmxhZ190cmFwcGluZ19t YXRoCisJICAmJiBkaXJlY3RfaW50ZXJuYWxfZm5fc3VwcG9ydGVkX3AgKElGTl9UUlVOQywg dHlwZSwKKwkJCQkJICAgICBPUFRJTUlaRV9GT1JfQk9USCkpCisgICAgICAoSUZOX1RSVU5D IEAwKSkpKSkKICNlbmRpZgogCiAvKiBJZiB3ZSBoYXZlIGEgbmFycm93aW5nIGNvbnZlcnNp b24gdG8gYW4gaW50ZWdyYWwgdHlwZSB0aGF0IGlzIGZlZCBieSBhCmRpZmYgLS1naXQgYS9n Y2Mvb3B0YWJzLmRlZiBiL2djYy9vcHRhYnMuZGVmCmluZGV4IGI4ODlhZDJlNWEwODYxM2Ri NTFkMTZkMDcyMDgwYWM2Y2I0ODQwNGYuLjU3ZDI1OWQzMzQwOTI2NWRmM2FmMTY0NmQxMjNl NGFiMjE2YzM0YzggMTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMuZGVmCisrKyBiL2djYy9vcHRh YnMuZGVmCkBAIC02Myw2ICs2Myw3IEBAIE9QVEFCX0NYKGZyYWN0dW5zX29wdGFiLCAiZnJh Y3R1bnMkUSRiJEkkYTIiKQogT1BUQUJfQ0woc2F0ZnJhY3Rfb3B0YWIsICJzYXRmcmFjdCRi JFEkYTIiLCBTQVRfRlJBQ1QsICJzYXRmcmFjdCIsIGdlbl9zYXRmcmFjdF9jb252X2xpYmZ1 bmMpCiBPUFRBQl9DTChzYXRmcmFjdHVuc19vcHRhYiwgInNhdGZyYWN0dW5zJEkkYiRRJGEy IiwgVU5TSUdORURfU0FUX0ZSQUNULCAic2F0ZnJhY3R1bnMiLCBnZW5fc2F0ZnJhY3R1bnNf Y29udl9saWJmdW5jKQogCitPUFRBQl9DRChmdHJ1bmNpbnRfb3B0YWIsICJmdHJ1bmMkYSRi MiIpCiBPUFRBQl9DRChzZml4dHJ1bmNfb3B0YWIsICJmaXhfdHJ1bmMkRiRiJEkkYTIiKQog T1BUQUJfQ0QodWZpeHRydW5jX29wdGFiLCAiZml4dW5zX3RydW5jJEYkYiRJJGEyIikKIApk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvZnJpbnRuei5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvZnJpbnRuei5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAuLjJlMTk3MWY4YWExMWQ4Yjk1ZjQ1NGQwM2EwM2UwNTBhM2JmOTY3NDcKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9mcmludG56 LmMKQEAgLTAsMCArMSw4OCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGct b3B0aW9ucyAiLU8yIC1tYXJjaD1hcm12OC41LWEiIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1l ZmZlY3RpdmUtdGFyZ2V0IGFybV92OF81YV9mcmludG56eF9vayB9ICovCisvKiB7IGRnLWZp bmFsIHsgY2hlY2stZnVuY3Rpb24tYm9kaWVzICIqKiIgIiIgfSB9ICovCisKKy8qCisqKiBm MToKKyoqCS4uLgorKioJZnJpbnQzMnoJczAsIHMwCisqKgkuLi4KKyovCitmbG9hdAorZjEg KGZsb2F0IHgpCit7CisgIGludCB5ID0geDsKKyAgcmV0dXJuIChmbG9hdCkgeTsKK30KKwor LyoKKyoqIGYyOgorKioJLi4uCisqKglmcmludDY0eglzMCwgczAKKyoqCS4uLgorKi8KK2Zs b2F0CitmMiAoZmxvYXQgeCkKK3sKKyAgbG9uZyBsb25nIGludCB5ID0geDsKKyAgcmV0dXJu IChmbG9hdCkgeTsKK30KKworLyoKKyoqIGYzOgorKioJLi4uCisqKglmcmludDMyeglkMCwg ZDAKKyoqCS4uLgorKi8KK2RvdWJsZQorZjMgKGRvdWJsZSB4KQoreworICBpbnQgeSA9IHg7 CisgIHJldHVybiAoZG91YmxlKSB5OworfQorCisvKgorKiogZjQ6CisqKgkuLi4KKyoqCWZy aW50NjR6CWQwLCBkMAorKioJLi4uCisqLworZG91YmxlCitmNCAoZG91YmxlIHgpCit7Cisg IGxvbmcgbG9uZyBpbnQgeSA9IHg7CisgIHJldHVybiAoZG91YmxlKSB5OworfQorCitmbG9h dAorZjFfZG9udCAoZmxvYXQgeCkKK3sKKyAgdW5zaWduZWQgaW50IHkgPSB4OworICByZXR1 cm4gKGZsb2F0KSB5OworfQorCitmbG9hdAorZjJfZG9udCAoZmxvYXQgeCkKK3sKKyAgdW5z aWduZWQgbG9uZyBsb25nIGludCB5ID0geDsKKyAgcmV0dXJuIChmbG9hdCkgeTsKK30KKwor ZG91YmxlCitmM19kb250IChkb3VibGUgeCkKK3sKKyAgdW5zaWduZWQgaW50IHkgPSB4Owor ICByZXR1cm4gKGRvdWJsZSkgeTsKK30KKworZG91YmxlCitmNF9kb250IChkb3VibGUgeCkK K3sKKyAgdW5zaWduZWQgbG9uZyBsb25nIGludCB5ID0geDsKKyAgcmV0dXJuIChkb3VibGUp IHk7Cit9CisKKy8qIE1ha2Ugc3VyZSB0aGUgJ2RvbnQncyBkb24ndCBnZW5lcmF0ZSBhbnkg ZnJpbnROei4gICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge2Zy aW50MzJ6fSAyIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVz IHtmcmludDY0en0gMiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9hYXJjaDY0L21lcmdlX3RydW5jMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FhcmNoNjQvbWVyZ2VfdHJ1bmMxLmMKaW5kZXggMDcyMTcwNjRlMmJhNTRmY2Y0ZjVlZGM0 NDBlNmVjMTlkZGFlNjZlMS4uM2IzNGRjM2FkNzlmMTQwNmE0MWVjNGMwMGRiMTAzNDdiYTFj YTJjNCAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvbWVy Z2VfdHJ1bmMxLmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvbWVy Z2VfdHJ1bmMxLmMKQEAgLTEsNSArMSw2IEBACiAvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLwog LyogeyBkZy1vcHRpb25zICItTzIgLWZmYXN0LW1hdGgiIH0gKi8KKy8qIHsgZGctc2tpcC1p ZiAiIiB7IGFybV92OF81YV9mcmludG56eF9vayB9IH0gKi8KIAogZmxvYXQKIGYxIChmbG9h dCB4KQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9saWIvdGFyZ2V0LXN1cHBvcnRzLmV4 cCBiL2djYy90ZXN0c3VpdGUvbGliL3RhcmdldC1zdXBwb3J0cy5leHAKaW5kZXggOGNiZGEx OTJmZTBmYWU1OWVhMjA4ZWU0MzY5NmI0ZDIyYzQzZTYxZS4uN2ZhMTY1OWNlNzM0MjU3ZjNj ZDk2ZjFlMmU1MGFjZTRkMDJkY2Y1MSAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9saWIv dGFyZ2V0LXN1cHBvcnRzLmV4cAorKysgYi9nY2MvdGVzdHN1aXRlL2xpYi90YXJnZXQtc3Vw cG9ydHMuZXhwCkBAIC0xMTM2NSw2ICsxMTM2NSwzMyBAQCBwcm9jIGNoZWNrX2VmZmVjdGl2 ZV90YXJnZXRfYXJtX3Y4XzNhX2JrZXlfZGlyZWN0aXZlIHsgfSB7CiAJfV0KIH0KIAorIyBS ZXR1cm4gMSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIEFSTXY4LjUgc2NhbGFyIGFuZCBBZHYu U2ltZCBGUklOVDMyW1pYXQorIyBhbmQgRlJJTlQ2NFtaWF0gaW5zdHJ1Y3Rpb25zLCAwIG90 aGVyd2lzZS4gVGhlIHRlc3QgaXMgdmFsaWQgZm9yIEFBcmNoNjQuCisjIFJlY29yZCB0aGUg Y29tbWFuZCBsaW5lIG9wdGlvbnMgbmVlZGVkLgorCitwcm9jIGNoZWNrX2VmZmVjdGl2ZV90 YXJnZXRfYXJtX3Y4XzVhX2ZyaW50bnp4X29rX25vY2FjaGUgeyB9IHsKKworICAgIGlmIHsg IVtpc3RhcmdldCBhYXJjaDY0Ki0qLSpdIH0geworICAgICAgICByZXR1cm4gMDsKKyAgICB9 CisKKyAgICBpZiB7IFtjaGVja19ub19jb21waWxlcl9tZXNzYWdlc19ub2NhY2hlIFwKKwkg ICAgICBhcm1fdjhfNWFfZnJpbnRuenhfb2sgYXNzZW1ibHkgeworCSNpZiAhZGVmaW5lZCAo X19BUk1fRkVBVFVSRV9GUklOVCkKKwkjZXJyb3IgIl9fQVJNX0ZFQVRVUkVfRlJJTlQgbm90 IGRlZmluZWQiCisJI2VuZGlmCisgICAgfSBbY3VycmVudF9jb21waWxlcl9mbGFnc11dIH0g eworCXJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitwcm9jIGNoZWNr X2VmZmVjdGl2ZV90YXJnZXRfYXJtX3Y4XzVhX2ZyaW50bnp4X29rIHsgfSB7CisgICAgcmV0 dXJuIFtjaGVja19jYWNoZWRfZWZmZWN0aXZlX3RhcmdldCBhcm1fdjhfNWFfZnJpbnRuenhf b2sgXAorICAgICAgICAgICAgICAgIGNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfYXJtX3Y4XzVh X2ZyaW50bnp4X29rX25vY2FjaGVdIAorfQorCiAjIFJldHVybiAxIGlmIHRoZSB0YXJnZXQg c3VwcG9ydHMgZXhlY3V0aW5nIHRoZSBBcm12OC4xLU0gTWFpbmxpbmUgTG93CiAjIE92ZXJo ZWFkIExvb3AsIDAgb3RoZXJ3aXNlLiAgVGhlIHRlc3QgaXMgdmFsaWQgZm9yIEFSTS4KIAo= --------------sRG5l2YWyVfv7TZAp9jZh6RR--