From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [85.215.255.25]) by sourceware.org (Postfix) with ESMTPS id 50E1E3858D1E for ; Thu, 9 Nov 2023 18:08:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 50E1E3858D1E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gjlay.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=gjlay.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 50E1E3858D1E Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=85.215.255.25 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1699553289; cv=pass; b=ZXIdcYNFXO05DEXeqIM7PYuprxtJUqTvHBl6zhrDAeCQeUBpcOWXYnHuRLJMBWokIuHukR1h8hzxYWH032EzPlFnk8n4LI9GiterziOuo+Z+Of4kV51EYW8tJEQXdxLMvmG8BEd6uB+BD2uhR/iInHr6X7Lrt0qJOR5Cx2FOzfo= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1699553289; c=relaxed/simple; bh=Tm0+uEbHHJcGJUzkUaNvbbpU6OEMa33Dc7RudwBBs7Q=; h=DKIM-Signature:DKIM-Signature:Message-ID:Date:MIME-Version: Subject:To:From; b=nOmTuJS8BwGpW52N7I4x1yDrcxmz9Z4WA0kU+WFIUV/RufK+bW7yNEotipxjqZ7K9CzDAb8toMeKfLyNhRjkzKAnL3chKFOL3BdGVUo7jy/atBPBPf57zgiivmZeG9bgyyPjuY1OdXOG7ZF9FK530pj9ka9PPPpn4pkESy0rxD4= ARC-Authentication-Results: i=2; server2.sourceware.org ARC-Seal: i=1; a=rsa-sha256; t=1699553282; cv=none; d=strato.com; s=strato-dkim-0002; b=rMJPr5u1dDI3aLihK/pnpYxvjyZVDi1wk+wGCC6DV1MN3j4Yx6HPPNmM/uqkxuHMys pZs5Q9HMFWoq40ADSQzeXKWSltV/rpeJwEjYU6BHRLx3vzVSvsUjydPtQzJos8HPlvNp pPFvpNXi6V0+1hO7FlmjesvyJR9VkfPCFsNZn81BOxLZ7hmdvY+p/3tySVhUY2rUFdKS EJeQn073nTN2pzRByHQ7XIYF75b/Tu2To9caOsaUqLolID5jnjrqpcTJksjqkbvjtDPf h4YPACbS4zLu05I2HLcpLIBdHDnJLyjg2HmgC0m1YXXkS3Z8EgRY3LNt8zqBphNbxtt+ 4kDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; t=1699553282; s=strato-dkim-0002; d=strato.com; h=In-Reply-To:From:References:Cc:To:Subject:Date:Message-ID:Cc:Date: From:Subject:Sender; bh=pK3Ndh9rDZreQhooEQ34ZyYL/rV90orUoIepN48+muQ=; b=XFcPh06+FyjTaPDN0zjEo36RkETaiC3ue+iPjOzjjvNbCCWjv6vMRalP+ypp+v4Nby 3fOzJdnwE3mNA+s+pTPAowgz7w8Z0K3endSSttgAHmqRzcNpieQniqfGfZDLlA7e1tIR Axa3IXnQiTTZlY1ie/0D3Vi9Dw0IlBEfMdf7NZY8SlEUYTjBjAW9L2QiiATBdjuTk1wd rHo18gQGC9K+JJ+4Pgdr/yzklcluuvi9LOOchyHibJ9xpXe7/rVNwlZ7ISwUhrJhvlss palXJdDMZGNV35LueZHpwavuq2hSQ5+ghjpla/t8ApZTOYDmRCezKM0mJWwlFKWYWAH2 fYBw== ARC-Authentication-Results: i=1; strato.com; arc=none; dkim=none X-RZG-CLASS-ID: mo00 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1699553282; s=strato-dkim-0002; d=gjlay.de; h=In-Reply-To:From:References:Cc:To:Subject:Date:Message-ID:Cc:Date: From:Subject:Sender; bh=pK3Ndh9rDZreQhooEQ34ZyYL/rV90orUoIepN48+muQ=; b=N6J7sK7f8KeQM87yQCLZnUShSbeJVYl2ayz17q6Lc7S+jRXVVApuOJRVlErYbUs8Ai r59sZkC321GDsK/PclstuWpyhDfqbFcelQEdrsdlrGQrhKxTbP7qxA3EZej7KR49teCi ZHcmLQiQ8mfqjkMY6c9mqNh7XNdQf/XX8MJFI51qzg7gADBmkCE3HUNGUaWrSMMMVrAd yBa1CIddiHTSsc3DdO1AkuzqwAABntMH/bCB/nM8i5RKmxcluVMpjUoQESIN9dxf+gG5 YjfssnDQzLiBwdm16ZyYRFBni/xbAWHX5Kqo/lL6igOwRYCXLBTmgmsai7pIK6zBMaim gscg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1699553282; s=strato-dkim-0003; d=gjlay.de; h=In-Reply-To:From:References:Cc:To:Subject:Date:Message-ID:Cc:Date: From:Subject:Sender; bh=pK3Ndh9rDZreQhooEQ34ZyYL/rV90orUoIepN48+muQ=; b=YEuhb6AUxtLqCB8DWH9E7MlUde2HssTzwEdpYxMyu+bA8kw3jFb5dNOZJ8u6S6bmRg f7FOsCM+uN1xf7clihBw== X-RZG-AUTH: ":LXoWVUeid/7A29J/hMvvT3koxZnKT7Qq0xotTetVnKkbjtK7q2y9LkX3hYlnPQ==" Received: from [192.168.2.102] by smtp.strato.de (RZmta 49.9.1 DYNA|AUTH) with ESMTPSA id v1b9a8zA9I8276e (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits)) (Client did not present a certificate); Thu, 9 Nov 2023 19:08:02 +0100 (CET) Content-Type: multipart/mixed; boundary="------------mYZ6SxechewmEj1GJopu9f51" Message-ID: <0d9ec2fa-f446-4ece-b1f2-c1ca0b9ece34@gjlay.de> Date: Thu, 9 Nov 2023 19:08:01 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [AVR PATCH] Optimize (X>>C)&1 for C in [1,4,8,16,24] in *insv.any_shift.. Content-Language: en-US To: Roger Sayle , gcc-patches@gcc.gnu.org Cc: 'Denis Chertykov' , Andrew Pinski References: <025901da0d82$cd5aa3f0$680febd0$@nextmovesoftware.com> From: Georg-Johann Lay In-Reply-To: <025901da0d82$cd5aa3f0$680febd0$@nextmovesoftware.com> Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------mYZ6SxechewmEj1GJopu9f51 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Am 02.11.23 um 12:50 schrieb Roger Sayle: > > This patch optimizes a few special cases in avr.md's *insv.any_shift. > instruction. This template handles tests for a single bit, where the result > has only a (different) single bit set in the result. Usually (currently) > this always requires a three-instruction sequence of a BST, a CLR and a BLD > (plus any additional CLR instructions to clear the rest of the result > bytes). > The special cases considered here are those that can be done with only two > instructions (plus CLRs); an ANDI preceded by either a MOV, a SHIFT or a > SWAP. > > Hence for C=1 in HImode, GCC with -O2 currently generates: > > bst r24,1 > clr r24 > clr r25 > bld r24,0 > > with this patch, we now generate: > > lsr r24 > andi r24,1 > clr r25 > > Likewise, HImode C=4 now becomes: > > swap r24 > andi r24,1 > clr r25 > > and SImode C=8 now becomes: > > mov r22,r23 > andi r22,1 > clr 23 > clr 24 > clr 25 > > > I've not attempted to model the instruction length accurately for these > special cases; the logic would be ugly, but it's safe to use the current > (1 insn longer) length. > > This patch has been (partially) tested with a cross-compiler to avr-elf > hosted on x86_64, without a simulator, where the compile-only tests in > the gcc testsuite show no regressions. If someone could test this more > thoroughly that would be great. > > > 2023-11-02 Roger Sayle CCing Andrew. Hi, here is a version based on yours. I am still unsure of what to make with this insn; one approach would be to post-reload split which simplifies the pattern a bit. However, when the current pattern would use MOVW, in a split version we'd get one more instruction because there would be no MOVW but two MOV's. Splitting would improve situation when not all of the output bytes are used by following code, though. Maybe Andrew has an idea; he helped a lot to improve code generation by fixing and tweaking middle-end using AVR test cases like for PR55181 or PR109907. Anyway, here is a version that works out exact code lengths, and it handles some more cases. Then I am not really sure if testcases that assert certain instruction sequences from optimizers is a good idea or rather a liability: The middle-end is not very good at generating reproducible code across versions. In particular, it's not uncommon that newer GCC versions no more find some optimizations. So the attached patch just has a dg-do run without asserting anything on the exact code sequence. Johann -- Improve insn output for "*insv.any_shift.". gcc/ * config/avr/avr-protos.h (avr_out_insv): New proto. * config/avr/avr.md (adjust_len) [insv]: Add to define_attr. (*insv.any_shift.): Output using... * config/avr/avr.cc (avr_out_insv): ...this new function. (avr_adjust_insn_length) [ADJUST_LEN_INSV]: Handle new case. gcc/testsuite/ * gcc.target/avr/torture/insv-anyshift.c: New test. --------------mYZ6SxechewmEj1GJopu9f51 Content-Type: text/x-patch; charset=UTF-8; name="x.diff" Content-Disposition: attachment; filename="x.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXZyL2F2ci1wcm90b3MuaCBiL2djYy9jb25maWcv YXZyL2F2ci1wcm90b3MuaAppbmRleCA1YzEzNDNmMGRmOC4uZGZjOTQ5YThjMGYgMTAwNjQ0 Ci0tLSBhL2djYy9jb25maWcvYXZyL2F2ci1wcm90b3MuaAorKysgYi9nY2MvY29uZmlnL2F2 ci9hdnItcHJvdG9zLmgKQEAgLTU4LDYgKzU4LDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKnJl dF9jb25kX2JyYW5jaCAocnR4IHgsIGludCBsZW4sIGludCByZXZlcnNlKTsKIGV4dGVybiBj b25zdCBjaGFyICphdnJfb3V0X21vdnBzaSAocnR4X2luc24gKiwgcnR4KiwgaW50Kik7CiBl eHRlcm4gY29uc3QgY2hhciAqYXZyX291dF9zaWduX2V4dGVuZCAocnR4X2luc24gKiwgcnR4 KiwgaW50Kik7CiBleHRlcm4gY29uc3QgY2hhciAqYXZyX291dF9pbnNlcnRfbm90Yml0IChy dHhfaW5zbiAqLCBydHgqLCBpbnQqKTsKK2V4dGVybiBjb25zdCBjaGFyICphdnJfb3V0X2lu c3YgKHJ0eF9pbnNuICosIHJ0eCosIGludCopOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmF2cl9v dXRfZXh0ciAocnR4X2luc24gKiwgcnR4KiwgaW50Kik7CiBleHRlcm4gY29uc3QgY2hhciAq YXZyX291dF9leHRyX25vdCAocnR4X2luc24gKiwgcnR4KiwgaW50Kik7CiBleHRlcm4gY29u c3QgY2hhciAqYXZyX291dF9wbHVzX3NldF9aTiAocnR4KiwgaW50Kik7CmRpZmYgLS1naXQg YS9nY2MvY29uZmlnL2F2ci9hdnIuY2MgYi9nY2MvY29uZmlnL2F2ci9hdnIuY2MKaW5kZXgg NWUwMjE3ZGUzNmYuLmI0ZDA4MjMxNWI1IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2F2ci9h dnIuY2MKKysrIGIvZ2NjL2NvbmZpZy9hdnIvYXZyLmNjCkBAIC05MDY2LDYgKzkwNjYsMTU5 IEBAIGF2cl9vdXRfaW5zZXJ0X25vdGJpdCAocnR4X2luc24gKmluc24sIHJ0eCBvcFtdLCBp bnQgKnBsZW4pCiB9CiAKIAorLyogT3V0cHV0IGluc3RydWN0aW9ucyBmb3IgIFhPUFswXSA9 IChYT1BbMV0gPFNoaWZ0PiBYT1BbMl0pICYgWE9QWzNdICB3aGVyZQorICAgKiBYT1BbMF0g YW5kIFhPUFsxXSBoYXZlIHRoZSBzYW1lIG1vZGUgd2hpY2ggaXMgb25lIG9mOiBRSSwgSEks IFBTSSwgU0kuCisgICAqIFhPUFszXSBpcyBhbiBleGFjdCBwb3dlciBvZiAyLgorICAgKiBY T1BbMl0gYW5kIFhPUFszXSBhcmUgY29uc3RfaW50LgorICAgKiA8U2hpZnQ+IGlzIGFueSBv ZjogQVNISUZULCBMU0hJRlRSVCwgQVNISUZUUlQuCisgICAqIFRoZSByZXN1bHQgZGVwZW5k cyBvbiBYT1BbMV0uCisgICBSZXR1cm5zICIiLgorICAgUExFTiAhPSAwOiBTZXQgKlBMRU4g dG8gdGhlIGNvZGUgbGVuZ3RoIGluIHdvcmRzLiAgRG9uJ3Qgb3V0cHV0IGFueXRoaW5nLgor ICAgUExFTiA9PSAwOiBPdXRwdXQgaW5zdHJ1Y3Rpb25zLiAgKi8KKworY29uc3QgY2hhcioK K2F2cl9vdXRfaW5zdiAocnR4X2luc24gKmluc24sIHJ0eCB4b3BbXSwgaW50ICpwbGVuKQor eworICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFICh4b3BbMF0pOworICBpbnQgbl9i eXRlcyA9IEdFVF9NT0RFX1NJWkUgKG1vZGUpOworICBydHggeHNyYyA9IFNFVF9TUkMgKHNp bmdsZV9zZXQgKGluc24pKTsKKworICAvLyBBbnkgb2YgQVNISUZULCBMU0hJRlRSVCwgQVNI SUZUUlQuCisgIGVudW0gcnR4X2NvZGUgY29kZSA9IEdFVF9DT0RFIChYRVhQICh4c3JjLCAw KSk7CisgIGludCBzaGlmdCA9IGNvZGUgPT0gQVNISUZUID8gSU5UVkFMICh4b3BbMl0pIDog LUlOVFZBTCAoeG9wWzJdKTsKKworICAvLyBEZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0 aGUgb3V0cHV0IGJpdC4KKyAgdW5zaWduZWQgbWFzayA9IEdFVF9NT0RFX01BU0sgKG1vZGUp ICYgSU5UVkFMICh4b3BbM10pOworCisgIC8vIFBvc2l0aW9uIG9mIHRoZSBvdXRwdXQgLyBp bnB1dCBiaXQsIHJlc3BlY3RpdmVseS4KKyAgaW50IG9iaXQgPSBleGFjdF9sb2cyIChtYXNr KTsKKyAgaW50IGliaXQgPSBvYml0IC0gc2hpZnQ7CisKKyAgZ2NjX2Fzc2VydCAoSU5fUkFO R0UgKG9iaXQsIDAsIEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpIC0gMSkpOworICBnY2NfYXNz ZXJ0IChJTl9SQU5HRSAoaWJpdCwgMCwgR0VUX01PREVfQklUU0laRSAobW9kZSkgLSAxKSk7 CisKKyAgLy8gSW4gdGhlIHJlbWFpbmRlciwgdXNlIHRoZSBzdWItYnl0ZXMgdGhhdCBob2xk IHRoZSBiaXRzLgorICBydHggb3BbNF0gPQorICAgIHsKKyAgICAgIC8vIE91dHB1dAorICAg ICAgc2ltcGxpZnlfZ2VuX3N1YnJlZyAoUUltb2RlLCB4b3BbMF0sIG1vZGUsIG9iaXQgLyA4 KSwKKyAgICAgIEdFTl9JTlQgKG9iaXQgJiA3KSwKKyAgICAgIC8vIElucHV0CisgICAgICBz aW1wbGlmeV9nZW5fc3VicmVnIChRSW1vZGUsIHhvcFsxXSwgbW9kZSwgaWJpdCAvIDgpLAor ICAgICAgR0VOX0lOVCAoaWJpdCAmIDcpCisgICAgfTsKKyAgb2JpdCAmPSA3OworICBpYml0 ICY9IDc7CisKKyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgZGVmYXVsdCBzZXF1ZW5jZSBhdCB0 aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uCisgIC8vIFdlIG9ubHkgZW1pdCBhbnl0aGluZyBv dGhlciB0aGFuIHRoZSBkZWZhdWx0IHdoZW4gd2UgZmluZCBhIHNlcXVlbmNlCisgIC8vIHRo YXQgaXMgc3RyaWN0bHkgc2hvcnRlciB0aGFuIHRoZSBkZWZhdWx0IHNlcXVlbmNlLgorICBj b25zdCBpbnQgbGVuMCA9IDIgKyBuX2J5dGVzIC0gKG5fYnl0ZXMgPT0gNCAmJiBBVlJfSEFW RV9NT1ZXKTsKKworICAvLyBGaW5kaW5nIHNvbWV0aGluZyBzaG9ydGVyIHRoYW4gdGhlIGRl ZmF1bHQgc2VxdWVuY2UgaW1wbGllcyB0aGF0IHRoZXJlCisgIC8vIG11c3QgYmUgYXQgbW9z dCAyIGluc3RydWN0aW9ucyB0aGF0IGRlYWwgd2l0aCB0aGUgYnl0ZXMgY29udGFpbmluZyB0 aGUKKyAgLy8gcmVsZXZhbnQgYml0cy4gIEluIGFkZGl0aW9uLCB3ZSBuZWVkICBOX0JZVEVT IC0gMSAgaW5zdHJ1Y3Rpb25zIHRvIGNsZWFyCisgIC8vIHRoZSByZW1haW5pbmcgcmVzdWx0 IGJ5dGVzLgorCisgIGNvbnN0IGludCBuX2NsciA9IG5fYnl0ZXMgLSAxOworICBib29sIGNs cl9wID0gZmFsc2U7CisgIGJvb2wgYW5kaV9wID0gZmFsc2U7CisKKyAgaWYgKHBsZW4pCisg ICAgKnBsZW4gPSAwOworCisgIGlmIChSRUdOTyAob3BbMF0pID09IFJFR05PIChvcFsyXSkK KyAgICAgIC8vIE91dHB1dCByZWcgYWxsb3dzIEFOREkuCisgICAgICAmJiB0ZXN0X2hhcmRf cmVnX2NsYXNzIChMRF9SRUdTLCBvcFswXSkpCisgICAgeworICAgICAgaWYgKDEgKyBuX2Ns ciA8IGxlbjAKKwkgIC8vIFNhbWUgYnl0ZSBhbmQgYml0OiBBIHNpbmdsZSBBTkRJIHdpbGwg ZG8uCisJICAmJiBvYml0ID09IGliaXQpCisJeworCSAgY2xyX3AgPSBhbmRpX3AgPSB0cnVl OworCX0KKyAgICAgIGVsc2UgaWYgKDIgKyBuX2NsciA8IGxlbjAKKwkgICAgICAgLy8gfG9i aXQgLSBpYml0fCA9IDQ6ICBTV0FQICsgQU5ESSB3aWxsIGRvLgorCSAgICAgICAmJiAob2Jp dCA9PSBpYml0ICsgNCB8fCBvYml0ID09IGliaXQgLSA0KSkKKwl7CisJICBhdnJfYXNtX2xl biAoInN3YXAgJTAiLCBvcCwgcGxlbiwgMSk7CisJICBjbHJfcCA9IGFuZGlfcCA9IHRydWU7 CisJfQorICAgICAgZWxzZSBpZiAoMiArIG5fY2xyIDwgbGVuMAorCSAgICAgICAvLyBMU0wg KyBBTkRJIHdpbGwgZG8uCisJICAgICAgICYmIG9iaXQgPT0gaWJpdCArIDEpCisJeworCSAg YXZyX2FzbV9sZW4gKCJsc2wgJTAiLCBvcCwgcGxlbiwgMSk7CisJICBjbHJfcCA9IGFuZGlf cCA9IHRydWU7CisJfQorICAgICAgZWxzZSBpZiAoMiArIG5fY2xyIDwgbGVuMAorCSAgICAg ICAvLyBMU1IgKyBBTkRJIHdpbGwgZG8uCisJICAgICAgICYmIG9iaXQgPT0gaWJpdCAtIDEp CisJeworCSAgYXZyX2FzbV9sZW4gKCJsc3IgJTAiLCBvcCwgcGxlbiwgMSk7CisJICBjbHJf cCA9IGFuZGlfcCA9IHRydWU7CisJfQorICAgIH0KKworICBpZiAoUkVHTk8gKG9wWzBdKSAh PSBSRUdOTyAob3BbMl0pCisgICAgICAmJiBvYml0ID09IGliaXQpCisgICAgeworICAgICAg aWYgKDIgKyBuX2NsciA8IGxlbjAKKwkgIC8vIFNhbWUgYml0IGJ1dCBkaWZmZXJlbnQgYnl0 ZTogTU9WICsgQU5ESSB3aWxsIGRvLgorCSAgJiYgdGVzdF9oYXJkX3JlZ19jbGFzcyAoTERf UkVHUywgb3BbMF0pKQorCXsKKwkgIGF2cl9hc21fbGVuICgibW92ICUwLCUyIiwgb3AsIHBs ZW4sIDEpOworCSAgY2xyX3AgPSBhbmRpX3AgPSB0cnVlOworCX0KKyAgICAgIGVsc2UgaWYg KDIgKyBuX2NsciA8IGxlbjAKKwkgICAgICAgLy8gU2FtZSBiaXQgYnV0IGRpZmZlcmVudCBi eXRlOiAgV2UgY2FuIHVzZSBBTkRJICsgTU9WLAorCSAgICAgICAvLyBidXQgb25seSBpZiB0 aGUgaW5wdXQgYnl0ZSBpcyBMRF9SRUdTIGFuZCB1bnVzZWQgYWZ0ZXIuCisJICAgICAgICYm IHRlc3RfaGFyZF9yZWdfY2xhc3MgKExEX1JFR1MsIG9wWzJdKQorCSAgICAgICAmJiByZWdf dW51c2VkX2FmdGVyIChpbnNuLCBvcFsyXSkpCisJeworCSAgYXZyX2FzbV9sZW4gKCJhbmRp ICUyLDE8PCUzIiAgQ1JfVEFCCisJCSAgICAgICAibW92ICUwLCUyIiwgb3AsIHBsZW4sIDIp OworCSAgY2xyX3AgPSB0cnVlOworCX0KKyAgICB9CisKKyAgLy8gT3V0cHV0IHJlbWFpbmlu ZyBpbnN0cnVjdGlvbnMgb2YgdGhlIHNob3J0ZXIgc2VxdWVuY2UuCisKKyAgaWYgKGFuZGlf cCkKKyAgICBhdnJfYXNtX2xlbiAoImFuZGkgJTAsMTw8JTEiLCBvcCwgcGxlbiwgMSk7CisK KyAgaWYgKGNscl9wKQorICAgIHsKKyAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbl9ieXRl czsgKytiKQorCXsKKwkgIHJ0eCBieXRlID0gc2ltcGxpZnlfZ2VuX3N1YnJlZyAoUUltb2Rl LCB4b3BbMF0sIG1vZGUsIGIpOworCSAgaWYgKFJFR05PIChieXRlKSAhPSBSRUdOTyAob3Bb MF0pKQorCSAgICBhdnJfYXNtX2xlbiAoImNsciAlMCIsICZieXRlLCBwbGVuLCAxKTsKKwl9 CisKKyAgICAgIC8vIENMUl9QIG1lYW5zIHdlIGZvdW5kIGEgc2hvcnRlciBzZXF1ZW5jZSwg c28gd2UgYXJlIGRvbmUgbm93LgorICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAvLyBO byBzaG9ydGVyIHNlcXVlbmNlIGZvdW5kLCBqdXN0IGVtaXQgIEJTVCwgQ0xSKiwgQkxEICBz ZXF1ZW5jZS4KKworICBhdnJfYXNtX2xlbiAoImJzdCAlMiwlMyIsIG9wLCBwbGVuLCAtMSk7 CisKKyAgaWYgKG5fYnl0ZXMgPT0gNCAmJiBBVlJfSEFWRV9NT1ZXKQorICAgIGF2cl9hc21f bGVuICgiY2xyICVBMCIgICBDUl9UQUIKKwkJICJjbHIgJUIwIiAgIENSX1RBQgorCQkgIm1v dncgJUMwLCVBMCIsIHhvcCwgcGxlbiwgMyk7CisgIGVsc2UKKyAgICBmb3IgKGludCBiID0g MDsgYiA8IG5fYnl0ZXM7ICsrYikKKyAgICAgIHsKKwlydHggYnl0ZSA9IHNpbXBsaWZ5X2dl bl9zdWJyZWcgKFFJbW9kZSwgeG9wWzBdLCBtb2RlLCBiKTsKKwlhdnJfYXNtX2xlbiAoImNs ciAlMCIsICZieXRlLCBwbGVuLCAxKTsKKyAgICAgIH0KKworICByZXR1cm4gYXZyX2FzbV9s ZW4gKCJibGQgJTAsJTEiLCBvcCwgcGxlbiwgMSk7Cit9CisKKwogLyogT3V0cHV0IGluc3Ry dWN0aW9ucyB0byBleHRyYWN0IGEgYml0IHRvIDgtYml0IHJlZ2lzdGVyIFhPUFswXS4KICAg IFRoZSBpbnB1dCBYT1BbMV0gaXMgYSByZWdpc3RlciBvciBhbiA4LWJpdCBNRU0gaW4gdGhl IGxvd2VyIEkvTyByYW5nZS4KICAgIFhPUFsyXSBpcyB0aGUgY29uc3RfaW50IGJpdCBwb3Np dGlvbi4gIFJldHVybiAiIi4KQEAgLTk5OTQsNiArMTAxNDcsNyBAQCBhdnJfYWRqdXN0X2lu c25fbGVuZ3RoIChydHhfaW5zbiAqaW5zbiwgaW50IGxlbikKICAgICBjYXNlIEFESlVTVF9M RU5fT1VUX0JJVE9QOiBhdnJfb3V0X2JpdG9wIChpbnNuLCBvcCwgJmxlbik7IGJyZWFrOwog ICAgIGNhc2UgQURKVVNUX0xFTl9FWFRSX05PVDogYXZyX291dF9leHRyX25vdCAoaW5zbiwg b3AsICZsZW4pOyBicmVhazsKICAgICBjYXNlIEFESlVTVF9MRU5fRVhUUjogYXZyX291dF9l eHRyIChpbnNuLCBvcCwgJmxlbik7IGJyZWFrOworICAgIGNhc2UgQURKVVNUX0xFTl9JTlNW OiBhdnJfb3V0X2luc3YgKGluc24sIG9wLCAmbGVuKTsgYnJlYWs7CiAKICAgICBjYXNlIEFE SlVTVF9MRU5fUExVUzogYXZyX291dF9wbHVzIChpbnNuLCBvcCwgJmxlbik7IGJyZWFrOwog ICAgIGNhc2UgQURKVVNUX0xFTl9BRERUT19TUDogYXZyX291dF9hZGR0b19zcCAob3AsICZs ZW4pOyBicmVhazsKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXZyL2F2ci5tZCBiL2djYy9j b25maWcvYXZyL2F2ci5tZAppbmRleCA4M2RkMTUwNDBiMC4uNzNiZGRlYzJiMzMgMTAwNjQ0 Ci0tLSBhL2djYy9jb25maWcvYXZyL2F2ci5tZAorKysgYi9nY2MvY29uZmlnL2F2ci9hdnIu bWQKQEAgLTE2Myw3ICsxNjMsNyBAQCAoZGVmaW5lX2F0dHIgImFkanVzdF9sZW4iCiAgICBh c2hsaGksIGFzaHJoaSwgbHNocmhpLAogICAgYXNobHNpLCBhc2hyc2ksIGxzaHJzaSwKICAg IGFzaGxwc2ksIGFzaHJwc2ksIGxzaHJwc2ksCi0gICBpbnNlcnRfYml0cywgaW5zdl9ub3Ri aXQsCisgICBpbnNlcnRfYml0cywgaW5zdl9ub3RiaXQsIGluc3YsCiAgICBhZGRfc2V0X1pO LCBjbXBfdWV4dCwgY21wX3NleHQsCiAgICBubyIKICAgKGNvbnN0X3N0cmluZyAibm8iKSkK QEAgLTk4MTgsNiArOTgxOCwxMiBAQCAoZGVmaW5lX2luc25fYW5kX3NwbGl0ICIqZXh0enYu aW8ubHNyNyIKICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfaW50IDEpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2ludCA3KSkpXSkKIAorOzsgVGhpcyBpbnNu IHNlcnZlcyBhcyBhIGNvbWJpbmUgYnJpZGdlIGJlY2F1c2UgaW5zbiBjb21iaW5lIHdpbGwg b25seQorOzsgY29tYmluZSBzbyBtdWNoICgzKSBpbnNucyBhdCBtb3N0LiAgSXQncyBub3Qg YWN0dWFsbHkgYW4gb3BlbiBjb2RlZAorOzsgYml0LWluc2VydGlvbiBidXQganVzdCBhIHBh cnQgb2YgaXQuICBJdCBtYXkgb2NjdXIgaW4gb3RoZXIgY29udGV4dHMKKzs7IHRoYW4gSU5T ViB0aG91Z2gsIGFuZCBpbiBzdWNoIGEgY2FzZSB0aGUgY29kZSBtYXkgYmUgd29yc2UgdGhh biB3aXRob3V0Cis7OyB0aGlzIHBhdHRlcm4uICBXZSBzdGlsbCBoYXZlIHRvIGVtaXQgY29k ZSBmb3IgaXQgaW4gdGhhdCBjYXNlIGJlY2F1c2UKKzs7IHdlIGNhbm5vdCByb2xsIGJhY2su CiAoZGVmaW5lX2luc25fYW5kX3NwbGl0ICIqaW5zdi5hbnlfc2hpZnQuPG1vZGU+X3NwbGl0 IgogICBbKHNldCAobWF0Y2hfb3BlcmFuZDpRSVNJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9 ciIpCiAgICAgICAgIChhbmQ6UUlTSSAoYW55X3NoaWZ0OlFJU0kgKG1hdGNoX29wZXJhbmQ6 UUlTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiciIpCkBAIC05ODQwLDI3ICs5ODQ2LDkgQEAg KGRlZmluZV9pbnNuICIqaW5zdi5hbnlfc2hpZnQuPG1vZGU+IgogICAgKGNsb2JiZXIgKHJl ZzpDQyBSRUdfQ0MpKV0KICAgInJlbG9hZF9jb21wbGV0ZWQiCiAgIHsKLSAgICBpbnQgc2hp ZnQgPSA8Q09ERT4gPT0gQVNISUZUID8gSU5UVkFMIChvcGVyYW5kc1syXSkgOiAtSU5UVkFM IChvcGVyYW5kc1syXSk7Ci0gICAgaW50IG1hc2sgPSBHRVRfTU9ERV9NQVNLICg8TU9ERT5t b2RlKSAmIElOVFZBTCAob3BlcmFuZHNbM10pOwotICAgIC8vIFBvc2l0aW9uIG9mIHRoZSBv dXRwdXQgLyBpbnB1dCBiaXQsIHJlc3BlY3RpdmVseS4KLSAgICBpbnQgb2JpdCA9IGV4YWN0 X2xvZzIgKG1hc2spOwotICAgIGludCBpYml0ID0gb2JpdCAtIHNoaWZ0OwotICAgIGdjY19h c3NlcnQgKElOX1JBTkdFIChvYml0LCAwLCA8TVNCPikpOwotICAgIGdjY19hc3NlcnQgKElO X1JBTkdFIChpYml0LCAwLCA8TVNCPikpOwotICAgIG9wZXJhbmRzWzNdID0gR0VOX0lOVCAo b2JpdCk7Ci0gICAgb3BlcmFuZHNbMl0gPSBHRU5fSU5UIChpYml0KTsKLQotICAgIGlmICg8 U0laRT4gPT0gMSkgcmV0dXJuICJic3QgJVQxJVQyXDtjbHIgJTBcOyIgICAgICAgICAgICAg ICAgICJibGQgJVQwJVQzIjsKLSAgICBpZiAoPFNJWkU+ID09IDIpIHJldHVybiAiYnN0ICVU MSVUMlw7Y2xyICVBMFw7Y2xyICVCMFw7IiAgICAgICAiYmxkICVUMCVUMyI7Ci0gICAgaWYg KDxTSVpFPiA9PSAzKSByZXR1cm4gImJzdCAlVDElVDJcO2NsciAlQTBcO2NsciAlQjBcO2Ns ciAlQzBcO2JsZCAlVDAlVDMiOwotICAgIHJldHVybiBBVlJfSEFWRV9NT1ZXCi0gICAgICA/ ICJic3QgJVQxJVQyXDtjbHIgJUEwXDtjbHIgJUIwXDttb3Z3ICVDMCwlQTBcOyIgICJibGQg JVQwJVQzIgotICAgICAgOiAiYnN0ICVUMSVUMlw7Y2xyICVBMFw7Y2xyICVCMFw7Y2xyICVD MFw7Y2xyICVEMFw7YmxkICVUMCVUMyI7CisgICAgcmV0dXJuIGF2cl9vdXRfaW5zdiAoaW5z biwgb3BlcmFuZHMsIG51bGxwdHIpOwogICB9Ci0gIFsoc2V0IChhdHRyICJsZW5ndGgiKQot ICAgICAgICAobWludXMgKHN5bWJvbF9yZWYgIjIgKyA8U0laRT4iKQotICAgICAgICAgICAg ICAgOyBPbmUgbGVzcyBpZiB3ZSBjYW4gdXNlIGEgTU9WVyB0byBjbGVhci4KLSAgICAgICAg ICAgICAgIChzeW1ib2xfcmVmICI8U0laRT4gPT0gNCAmJiBBVlJfSEFWRV9NT1ZXIikpKV0p CisgIFsoc2V0X2F0dHIgImFkanVzdF9sZW4iICJpbnN2IildKQogCiAKIChkZWZpbmVfaW5z bl9hbmRfc3BsaXQgIipleHR6di48bW9kZT5oaTIiCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvYXZyL3RvcnR1cmUvaW5zdi1hbnlzaGlmdC5jIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2F2ci90b3J0dXJlL2luc3YtYW55c2hpZnQuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMmY5NGUxNzg3YjEKLS0tIC9kZXYvbnVs bAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXZyL3RvcnR1cmUvaW5zdi1hbnlz aGlmdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIHsgZGctZG8gcnVuIH0gKi8KKwordHlwZWRl ZiBfX1VJTlQzMl9UWVBFX18gdWludDMyX3Q7CisKKy8qIFRlc3RpbmcgaW5saW5lZCBhbmQg Y29tcGxldGVseSBmb2xkZWQgdmVyc2lvbnMgb2YgZnVuY3Rpb25zCisgICBhZ2FpbnN0IHRo ZWlyIG5vbi1pbmxpbmVkLCBub24tZm9sZGVkIGNvdW5udGVycGFydHMuICAqLworCisjZGVm aW5lIE1LX0ZVTjEoT0JJVCwgTFNSKQkJCQkJCVwKKyAgc3RhdGljIF9faW5saW5lX18gX19h dHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQkJCVwKKyAgdWludDMyX3QgZnVuMV9s c3JfIyNPQklUIyNfIyNMU1IjI19haSAoaW50IHgsIHVpbnQzMl90IGEpCQlcCisgIHsJCQkJ CQkJCQlcCisgICAgKHZvaWQpIHg7CQkJCQkJCQlcCisgICAgcmV0dXJuIChhID4+IExTUikg JiAoMXVsIDw8IE9CSVQpOwkJCQkJXAorICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICBf X2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18sX19ub2Nsb25lX18pKQkJCQlcCisgIHVpbnQz Ml90IGZ1bjFfbHNyXyMjT0JJVCMjXyMjTFNSIyNfbmkgKGludCB4LCB1aW50MzJfdCBhKQkJ XAorICB7CQkJCQkJCQkJXAorICAgIHJldHVybiBmdW4xX2xzcl8jI09CSVQjI18jI0xTUiMj X2FpICh4LCBhKTsJCQkJXAorICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB2b2lkIHRl c3RfZnVuMV9sc3JfIyNPQklUIyNfIyNMU1IgKHZvaWQpCQkJCVwKKyAgewkJCQkJCQkJCVwK KyAgICBpZiAoZnVuMV9sc3JfIyNPQklUIyNfIyNMU1IjI19uaSAoMCwgMXVsIDw8IChPQklU ICsgTFNSKSkJCVwKKwkhPSBmdW4xX2xzcl8jI09CSVQjI18jI0xTUiMjX2FpICgwLCAxdWwg PDwgKE9CSVQgKyBMU1IpKSkJXAorICAgICAgX19idWlsdGluX2Fib3J0KCk7CQkJCQkJXAor CQkJCQkJCQkJXAorICAgIGlmIChmdW4xX2xzcl8jI09CSVQjI18jI0xTUiMjX25pICgwLCAx dWwgPDwgKE9CSVQgKyBMU1IpKQkJXAorCSE9IGZ1bjFfbHNyXyMjT0JJVCMjXyMjTFNSIyNf YWkgKDAsIC0xdWwpKQkJCVwKKyAgICAgIF9fYnVpbHRpbl9hYm9ydCgpOwkJCQkJCVwKKyAg fQorICAKKworI2RlZmluZSBNS19GVU4yKE9CSVQsIExTTCkJCQkJCQlcCisgIHN0YXRpYyBf X2lubGluZV9fIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkJCQlcCisgIHVp bnQzMl90IGZ1bjJfbHNsXyMjT0JJVCMjXyMjTFNMIyNfYWkgKGludCB4LCB1aW50MzJfdCBh KQkJXAorICB7CQkJCQkJCQkJXAorICAgICh2b2lkKSB4OwkJCQkJCQkJXAorICAgIHJldHVy biAoYSA8PCBMU0wpICYgKDF1bCA8PCBPQklUKTsJCQkJCVwKKyAgfQkJCQkJCQkJCVwKKwkJ CQkJCQkJCVwKKyAgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fLF9fbm9jbG9uZV9fKSkJ CQkJXAorICB1aW50MzJfdCBmdW4yX2xzbF8jI09CSVQjI18jI0xTTCMjX25pIChpbnQgeCwg dWludDMyX3QgYSkJCVwKKyAgewkJCQkJCQkJCVwKKyAgICByZXR1cm4gZnVuMl9sc2xfIyNP QklUIyNfIyNMU0wjI19haSAoeCwgYSk7CQkJCVwKKyAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJ CVwKKyAgdm9pZCB0ZXN0X2Z1bjJfbHNsXyMjT0JJVCMjXyMjTFNMICh2b2lkKQkJCQlcCisg IHsJCQkJCQkJCQlcCisgICAgaWYgKGZ1bjJfbHNsXyMjT0JJVCMjXyMjTFNMIyNfbmkgKDAs IDF1bCA8PCAoT0JJVCAtIExTTCkpCQlcCisJIT0gZnVuMl9sc2xfIyNPQklUIyNfIyNMU0wj I19haSAoMCwgMXVsIDw8IChPQklUIC0gTFNMKSkpCVwKKyAgICAgIF9fYnVpbHRpbl9hYm9y dCgpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBpZiAoZnVuMl9sc2xfIyNPQklUIyNfIyNM U0wjI19uaSAoMCwgMXVsIDw8IChPQklUIC0gTFNMKSkJCVwKKwkhPSBmdW4yX2xzbF8jI09C SVQjI18jI0xTTCMjX2FpICgwLCAtMXVsKSkJCQlcCisgICAgICBfX2J1aWx0aW5fYWJvcnQo KTsJCQkJCQlcCisgIH0KKworCitNS19GVU4xICgxMywgMTUpCitNS19GVU4xICgxMywgMTYp CitNS19GVU4xICgxMywgMTcpCitNS19GVU4xICgxMywgMTIpCisKK01LX0ZVTjIgKDEyLCA4 KQorTUtfRlVOMiAoMTMsIDgpCitNS19GVU4yICgxNiwgOCkKKworaW50IG1haW4gKHZvaWQp Cit7CisgIHRlc3RfZnVuMV9sc3JfMTNfMTUgKCk7CisgIHRlc3RfZnVuMV9sc3JfMTNfMTYg KCk7CisgIHRlc3RfZnVuMV9sc3JfMTNfMTcgKCk7CisgIHRlc3RfZnVuMV9sc3JfMTNfMTIg KCk7CisKKyAgdGVzdF9mdW4yX2xzbF8xMl84ICgpOworICB0ZXN0X2Z1bjJfbHNsXzEzXzgg KCk7CisgIHRlc3RfZnVuMl9sc2xfMTZfOCAoKTsKKworICByZXR1cm4gMDsKK30K --------------mYZ6SxechewmEj1GJopu9f51--