From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17485 invoked by alias); 18 Dec 2009 15:33:54 -0000 Received: (qmail 17475 invoked by uid 22791); 18 Dec 2009 15:33:53 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=BAYES_05 X-Spam-Check-By: sourceware.org Received: from portal.icerasemi.com (HELO pOrtaL.icerasemi.com) (213.249.204.90) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 18 Dec 2009 15:33:48 +0000 X-ASG-Debug-ID: 1261150424-7e89000d0000-ThFIni X-Barracuda-URL: http://192.168.1.243:80/cgi-bin/mark.cgi Received: from Exchangevs.Icerasemi.com (cluster1.icerasemi.local [192.168.1.203]) by pOrtaL.icerasemi.com (Spam & Virus Firewall) with ESMTP id AE59DF6FB5 for ; Fri, 18 Dec 2009 15:33:44 +0000 (GMT) Received: from Exchangevs.Icerasemi.com (cluster1.icerasemi.local [192.168.1.203]) by pOrtaL.icerasemi.com with ESMTP id Qq1rLnuvJniGyHEA for ; Fri, 18 Dec 2009 15:33:44 +0000 (GMT) Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01CA7FF7.7BDBAEC3" X-ASG-Orig-Subj: Possible IRA improvements for irregular register architectures Subject: Possible IRA improvements for irregular register architectures Date: Fri, 18 Dec 2009 15:33:00 -0000 Message-ID: <4D60B0700D1DB54A8C0C6E9BE69163700CC3B6D4@EXCHANGEVS.IceraSemi.local> References: <4D60B0700D1DB54A8C0C6E9BE69163700CB4E8EE@EXCHANGEVS.IceraSemi.local> From: "Ian Bolton" To: X-Barracuda-Connect: cluster1.icerasemi.local[192.168.1.203] X-Barracuda-Start-Time: 1261150424 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=9.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.17374 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-IsSubscribed: yes Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org X-SW-Source: 2009-12/txt/msg00282.txt.bz2 This is a multi-part message in MIME format. ------_=_NextPart_001_01CA7FF7.7BDBAEC3 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Content-length: 2768 Let's assume I have two sub-classes of ALL_REGS: BOTTOM_REGS (c0-c15) and TOP_CREGS (c16-c31). Let's also assume I have two main types of instruction: A-type Instructions, which can use ALL 32 registers, and B-type Instructions, which can only use the 16 BOTTOM_REGS. IRA will correctly calculate costs (in ira-costs.c) for allocnos appearing in B-type instructions, such that TOP_CREGS has a higher cost than BOTTOM_REGS. It will also calculate costs for the A-type instructions such that TOP_CREGS and BOTTOM_REGS have the same cost. The order of coloring will be determined by the algorithm chosen: Priority or Chaitin-Briggs. As each allocno is colored, the costs will be inspected and the best available hard register will be chosen, mainly based on the register class costs mentioned above, so allocnos in B-type Instructions will usually be assigned a BOTTOM_REG if one is free. If two or more hard registers share the same cost then whichever one appears first in the REG_ALLOC_ORDER will be assigned. (If no hard register can be found, the allocno is assigned memory and will require a "reload" in a later pass to get a hard register.) I do not wish to alter the coloring algorithms or the coloring order. I believe they are good at determing the order to color allocnos, which dictates the likelihood of being assigned a hard register. What I wish to change is the hard register that is assigned, given that the coloring order has determined that this allocno should get one next. Why do I need to do this? Since the BOTTOM_REGS can be used by all instructions, it makes sense to put them first in the REG_ALLOC_ORDER, so we minimise the number of registers consumed by a low-pressure function. But it also makes sense, in high-pressure functions, to steer A-type Instructions away from using BOTTOM_REGS so that they are free for B-type Instructions to use. To achieve this, I tried altering the costs calculated in ira-costs.c, either explicitly with various hacks or by altering operand constraints. The problem with this approach was that it is static and independent, occurring before any coloring order has been determined and without any awareness of the needs of other allocnos. I believe I require a dynamic way to alter the costs, based on which allocnos conflict with the allocno currently being colored and which hard registers are still available at this point. The patch I have attached here is my first reasonable successful attempt at this dynamic approach, which has led to performance improvements on some of our benchmarks and no significant regressions. I am hoping it will be useful to others, but I post it more as a talking point or perhaps to inspire others to come up with better solutions and share them with me :-) ------_=_NextPart_001_01CA7FF7.7BDBAEC3 Content-Type: application/octet-stream; name="bolton_ira_subset_experiments.diff" Content-Transfer-Encoding: base64 Content-Description: bolton_ira_subset_experiments.diff Content-Disposition: attachment; filename="bolton_ira_subset_experiments.diff" Content-length: 16137 SW5kZXg6IHRvcGxldi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHRv cGxldi5jCShyZXZpc2lvbiAxNTUzNDMpCisrKyB0b3BsZXYuYwkod29ya2lu ZyBjb3B5KQpAQCAtMjg3LDcgKzI4Nyw3IEBACiAvKiBTZXQgdGhlIGRlZmF1 bHQgcmVnaW9uIGFuZCBhbGdvcml0aG0gZm9yIHRoZSBpbnRlZ3JhdGVkIHJl Z2lzdGVyCiAgICBhbGxvY2F0b3IuICAqLwogCi1lbnVtIGlyYV9hbGdvcml0 aG0gZmxhZ19pcmFfYWxnb3JpdGhtID0gSVJBX0FMR09SSVRITV9DQjsKK2Vu dW0gaXJhX2FsZ29yaXRobSBmbGFnX2lyYV9hbGdvcml0aG0gPSBJUkFfQUxH T1JJVEhNX1BSSU9SSVRZOwogZW51bSBpcmFfcmVnaW9uIGZsYWdfaXJhX3Jl Z2lvbiA9IElSQV9SRUdJT05fTUlYRUQ7CiAKIC8qIFNldCB0aGUgZGVmYXVs dCB2YWx1ZSBmb3IgLWZpcmEtdmVyYm9zZS4gICovCkluZGV4OiBpcmEtaW50 LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaXJhLWludC5oCShyZXZp c2lvbiAxNTUzNDMpCisrKyBpcmEtaW50LmgJKHdvcmtpbmcgY29weSkKQEAg LTQxOCw2ICs0MTgsOSBAQAogICBpcmFfYWxsb2Nub190IHByZXZfYnVja2V0 X2FsbG9jbm87CiAgIC8qIFVzZWQgZm9yIHRlbXBvcmFyeSBwdXJwb3Nlcy4g ICovCiAgIGludCB0ZW1wOworICAvKiBtYWtlIG5vdGUgdGhhdCB0aGlzIGFs bG9jbm8gY2FuIG9ubHkgdXNlIGEgc3Vic2V0IG9mIEFMTF9SRUdTLgorICAg ICBlLmcuIEJPVFRPTV9SRUdTICovCisgIGludCByZXF1aXJlc19yZWdpc3Rl cl9zdWJzZXQ7CiB9OwogCiAvKiBBbGwgbWVtYmVycyBvZiB0aGUgYWxsb2Nu byBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBhY2Nlc3NlZCBvbmx5CkBAIC00ODEs NiArNDg0LDcgQEAKICNkZWZpbmUgQUxMT0NOT19NSU4oQSkgKChBKS0+bWlu KQogI2RlZmluZSBBTExPQ05PX01BWChBKSAoKEEpLT5tYXgpCiAjZGVmaW5l IEFMTE9DTk9fQ09ORkxJQ1RfSUQoQSkgKChBKS0+Y29uZmxpY3RfaWQpCisj ZGVmaW5lIEFMTE9DTk9fUkVRVUlSRVNfUkVHSVNURVJfU1VCU0VUKEEpICgo QSktPnJlcXVpcmVzX3JlZ2lzdGVyX3N1YnNldCkKIAogLyogTWFwIHJlZ25v IC0+IGFsbG9jbm9zIHdpdGggZ2l2ZW4gcmVnbm8gKHNlZSBjb21tZW50cyBm b3IKICAgIGFsbG9jbm8gbWVtYmVyIGBuZXh0X3JlZ25vX2FsbG9jbm8nKS4g ICovCkluZGV4OiBpcmEtY29sb3IuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBpcmEtY29sb3IuYwkocmV2aXNpb24gMTU1MzQzKQorKysgaXJhLWNv bG9yLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ1Miw2ICs0NTIsNyBAQAogI2lm ZGVmIFNUQUNLX1JFR1MKICAgYm9vbCBub19zdGFja19yZWdfcDsKICNlbmRp ZgorICBpbnQgbGVhdmVfYm90dG9tID0gMDsKIAogICBpcmFfYXNzZXJ0ICgh IEFMTE9DTk9fQVNTSUdORURfUCAoYWxsb2NubykpOwogICBjb3Zlcl9jbGFz cyA9IEFMTE9DTk9fQ09WRVJfQ0xBU1MgKGFsbG9jbm8pOwpAQCAtNTAyLDYg KzUwMywyMCBAQAogCQkJCSAgICAgQUxMT0NOT19OVU0gKGNvbmZsaWN0X2Fs bG9jbm8pKSkKIAkgIHsKIAkgICAgY29uZmxpY3RfY292ZXJfY2xhc3MgPSBB TExPQ05PX0NPVkVSX0NMQVNTIChjb25mbGljdF9hbGxvY25vKTsKKworICAg ICAgICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGUgcmVnaXN0ZXIgc3Vi c2V0LCBidXQgYSBjb25mbGljdGluZyBhbGxvY25vIGRvZXMsCisgICAgICAg ICAgICAgICB3ZSBzaG91bGQgbGVhdmUgdGhlIGJvdHRvbSByZWdzLCB0byBl bnN1cmUgdGhhdCBhbGxvY25vIGdldHMgd2hhdCBpdCBuZWVkcworICAgICAg ICAgICAgICAgTm8gY2hhbmdlIGlzIG1hZGUgaW4gcmVsb2FkIHBhc3MsIGhv d2V2ZXIuICovCisgICAgICAgICAgICBpZiAoIXJldHJ5X3AgJiYKKyAgICAg ICAgICAgICAgICAhQUxMT0NOT19BU1NJR05FRF9QIChjb25mbGljdF9hbGxv Y25vKSAmJgorICAgICAgICAgICAgICAgICAoQUxMT0NOT19SRVFVSVJFU19S RUdJU1RFUl9TVUJTRVQgKGEpID09IDApICYmIAorICAgICAgICAgICAgICAg ICAoQUxMT0NOT19SRVFVSVJFU19SRUdJU1RFUl9TVUJTRVQgKGNvbmZsaWN0 X2FsbG9jbm8pKSkKKyAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAg ICAvKiBXRSBET04nVCBXQU5UIEJPVFRPTSwgQlVUIFRIRVkgRE8gLi4uCisg ICAgICAgICAgICAgICAgICAgLi4uLiBTTyBJTkNSRUFTRSBUSEUgQ09TVFMg Rk9SIEJPVFRPTV9SRUdTIFNPIFdFIEVSUiBUT1dBUkRTIFRPUF9SRUdTICov CisgICAgICAgICAgICAgICAgbGVhdmVfYm90dG9tICs9IDE7CisgICAgICAg ICAgICAgIH0KKyAgICAgICAKIAkgICAgaXJhX2Fzc2VydCAoaXJhX3JlZ19j bGFzc2VzX2ludGVyc2VjdF9wCiAJCQlbY292ZXJfY2xhc3NdW2NvbmZsaWN0 X2NvdmVyX2NsYXNzXSk7CiAJICAgIGlmIChhbGxvY25vX2NvYWxlc2NlZF9w KQpAQCAtNjAwLDYgKzYxNSwyNyBAQAogCX0KICAgICAgIGlmIChtaW5fY29z dCA+IGNvc3QpCiAJbWluX2Nvc3QgPSBjb3N0OworCisgICAgICAvKiBOdWRn ZSB0aGUgY29zdCBvZiB0aGlzIHJlZyB1cCBiZWNhdXNlIHNvbWVvbmUgZWxz ZSB3YW50cyB0aGlzIG9uZS4KKworICAgICAgICAgTm90ZTogaWYgd2Ugb25s eSBwZW5hbGlzZWQgQk9UVE9NX1JFR1MgdGhlbiB3ZSB3b3VsZCBza2lwIG92 ZXIgYzIsIGMzLCBjNCwgYzUsIGM2CisgICAgICAgICAgICAgICBhbmQgZ28g c3RyYWlnaHQgZm9yIGMxNiBiZWNhdXNlIGl0IGlzIGNoZWFwZXIgdGhhbiBj dXJyZW50bHkgbm9uLWFsbG9jYXRlZAorICAgICAgICAgICAgICAgY2FsbGVl LXNhdmUgVE9QX0NSRUdTLiAgQnkgcGVuYWxpc2luZyBjMTYgdG9vLCB0aGUg Y29zdCBmb3IgYzIsIGMzLCBjNCwgYzUsCisgICAgICAgICAgICAgICBjNiBh bmQgYzE2IHdpbGwgYWxsIGJlIHRoZSBzYW1lIEFORCBsb3dlciB0aGFuIGFu eSBvZiB0aGUgY3VycmVudGx5CisgICAgICAgICAgICAgICB1bmFsbG9jYXRl ZCBUT1BfQ1JFR1MsIHNvIHdlIHdpbGwgdGFrZSB0aGUgbG93ZXN0IG51bWJl ciAoYzIpLiAgVGhpcyBpcyBnb29kCisgICAgICAgICAgICAgICBmb3IgbGlt aXRpbmcgdGhlIHJlZ2lzdGVycyB3ZSB1c2UgdXAgaW4gbG93LXByZXNzdXJl IGNhc2VzLiAqLworICAgICAgaWYgKGxlYXZlX2JvdHRvbSkKKyAgICAgICAg eworICAgICAgICAgIC8qIEFsd2F5cyBhZGQgMSB0byBmdWxsX2Nvc3Qgb2Yg Qk9UVE9NX1JFR1MKKyAgICAgICAgICAgICBPbmx5IGFkZCAxIHRvIGZ1bGxf Y29zdCBvZiBjMTYgd2hlbiBjMTcgKHRoZSBmaXJzdCBjYWxsZWUtc2F2ZSBU T1BfQ1JFRykgaGFzCisgICAgICAgICAgICAgbm90IHlldCBiZWVuIGFsbG9j YXRlZC4gVGhpcyBlZmZlY3RpdmVseSBtZWFucyBhbnlvbmUgY2FuIGdldCBj MS1jNiB1bnRpbCB3ZQorICAgICAgICAgICAgIGdyYWIgb3VyIGZpcnN0IGNh bGxlZS1zYXZlIFRPUF9DUkVHOyBhZnRlciB0aGF0LCB3ZSB0cnkgdG8gcmVz ZXJ2ZSBjMS1jNiBmb3IKKyAgICAgICAgICAgICBpbnN0cnVjdGlvbnMgdGhh dCB3YW50IHRoZW0gc3BlY2lmaWNhbGx5IGJ5IGVuY291cmFnaW5nIHVzZSBv ZiBjMTYsIGMxNyBmaXJzdC4gKi8KKyAgICAgICAgICBpZiAoaGFyZF9yZWdu byA8IDE2IHx8CisgICAgICAgICAgICAgICgoaGFyZF9yZWdubyA9PSAxNikg JiYgKCFhbGxvY2F0ZWRfaGFyZHJlZ19wWzE3XSkpKQorICAgICAgICAgICAg ZnVsbF9jb3N0ICs9IDE7CisgICAgICAgIH0KKwogICAgICAgaWYgKG1pbl9m dWxsX2Nvc3QgPiBmdWxsX2Nvc3QpCiAJewogCSAgbWluX2Z1bGxfY29zdCA9 IGZ1bGxfY29zdDsKQEAgLTI4NTMsMTQgKzI4ODksNDIgQEAKIGlyYV9yZWFz c2lnbl9wc2V1ZG9zIChpbnQgKnNwaWxsZWRfcHNldWRvX3JlZ3MsIGludCBu dW0sCiAJCSAgICAgIEhBUkRfUkVHX1NFVCBiYWRfc3BpbGxfcmVncywKIAkJ ICAgICAgSEFSRF9SRUdfU0VUICpwc2V1ZG9fZm9yYmlkZGVuX3JlZ3MsCi0J CSAgICAgIEhBUkRfUkVHX1NFVCAqcHNldWRvX3ByZXZpb3VzX3JlZ3MsICBi aXRtYXAgc3BpbGxlZCkKKwkJICAgICAgSEFSRF9SRUdfU0VUICpwc2V1ZG9f cHJldmlvdXNfcmVncywKKwkJICAgICAgYml0bWFwIHNwaWxsZWQpCiB7CiAg IGludCBpLCBtLCBuLCByZWdubzsKICAgYm9vbCBjaGFuZ2VkX3A7CiAgIGly YV9hbGxvY25vX3QgYSwgY29uZmxpY3RfYTsKICAgSEFSRF9SRUdfU0VUIGZv cmJpZGRlbl9yZWdzOwogICBpcmFfYWxsb2Nub19jb25mbGljdF9pdGVyYXRv ciBhY2k7CisgIGJpdG1hcCB0ZW1wID0gQklUTUFQX0FMTE9DIChOVUxMKTsK IAorICAvKiBBZGQgcHNldWRvcyB3aGljaCBjb25mbGljdCB3aXRoIHBzZXVk b3MgYWxyZWFkeSBpbgorICAgICBTUElMTEVEX1BTRVVET19SRUdTIHRvIFNQ SUxMRURfUFNFVURPX1JFR1MuICBUaGlzIGlzIHByZWZlcmFibGUKKyAgICAg dG8gYWxsb2NhdGluZyBpbiB0d28gc3RlcHMgYXMgc29tZSBvZiB0aGUgY29u ZmxpY3RzIG1pZ2h0IGhhdmUKKyAgICAgYSBoaWdoZXIgcHJpb3JpdHkgdGhh biB0aGUgcHNldWRvcyBwYXNzZWQgaW4gU1BJTExFRF9QU0VVRE9fUkVHUy4g ICovCisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgICBiaXRtYXBf c2V0X2JpdCAodGVtcCwgc3BpbGxlZF9wc2V1ZG9fcmVnc1tpXSk7CisKKyAg Zm9yIChpID0gMCwgbiA9IG51bTsgaSA8IG47IGkrKykKKyAgICB7CisgICAg ICBpbnQgcmVnbm8gPSBzcGlsbGVkX3BzZXVkb19yZWdzW2ldOworICAgICAg Yml0bWFwX3NldF9iaXQgKHRlbXAsIHJlZ25vKTsKKworICAgICAgYSA9IGly YV9yZWdub19hbGxvY25vX21hcFtyZWdub107CisgICAgICBGT1JfRUFDSF9B TExPQ05PX0NPTkZMSUNUIChhLCBjb25mbGljdF9hLCBhY2kpCisJaWYgKEFM TE9DTk9fSEFSRF9SRUdOTyAoY29uZmxpY3RfYSkgPCAwCisJICAgICYmICEg QUxMT0NOT19ET05UX1JFQVNTSUdOX1AgKGNvbmZsaWN0X2EpCisJICAgICYm ICEgYml0bWFwX2JpdF9wICh0ZW1wLCBBTExPQ05PX1JFR05PIChjb25mbGlj dF9hKSkpCisJICB7CisJICAgIHNwaWxsZWRfcHNldWRvX3JlZ3NbbnVtKytd ID0gQUxMT0NOT19SRUdOTyAoY29uZmxpY3RfYSk7CisJICAgIGJpdG1hcF9z ZXRfYml0ICh0ZW1wLCBBTExPQ05PX1JFR05PIChjb25mbGljdF9hKSk7CisJ ICAgIC8qID8hPyBUaGlzIHNlZW1zIHdyb25nLiAgKi8KKwkgICAgYml0bWFw X3NldF9iaXQgKGNvbnNpZGVyYXRpb25fYWxsb2Nub19iaXRtYXAsCisJCQkg ICAgQUxMT0NOT19OVU0gKGNvbmZsaWN0X2EpKTsKKwkgIH0KKyAgICB9CisK ICAgaWYgKG51bSA+IDEpCiAgICAgcXNvcnQgKHNwaWxsZWRfcHNldWRvX3Jl Z3MsIG51bSwgc2l6ZW9mIChpbnQpLCBwc2V1ZG9fcmVnX2NvbXBhcmUpOwog ICBjaGFuZ2VkX3AgPSBmYWxzZTsKQEAgLTI4NzgsNyArMjk0Miw3IEBACiAg ICAgICBpcmFfYXNzZXJ0IChyZWdfcmVudW1iZXJbcmVnbm9dIDwgMCk7CiAg ICAgICBpZiAoaW50ZXJuYWxfZmxhZ19pcmFfdmVyYm9zZSA+IDMgJiYgaXJh X2R1bXBfZmlsZSAhPSBOVUxMKQogCWZwcmludGYgKGlyYV9kdW1wX2ZpbGUs Ci0JCSAiICAgICAgU3BpbGwgJWQoYSVkKSwgY29zdD0lZCIsIHJlZ25vLCBB TExPQ05PX05VTSAoYSksCisJCSAiICAgICAgVHJ5IEFzc2lnbiAlZChhJWQp LCBjb3N0PSVkIiwgcmVnbm8sIEFMTE9DTk9fTlVNIChhKSwKIAkJIEFMTE9D Tk9fTUVNT1JZX0NPU1QgKGEpCiAJCSAtIEFMTE9DTk9fQ09WRVJfQ0xBU1Nf Q09TVCAoYSkpOwogICAgICAgYWxsb2Nub19yZWxvYWRfYXNzaWduIChhLCBm b3JiaWRkZW5fcmVncyk7CkBAIC0yODg3LDYwICsyOTUxLDggQEAKIAkgIENM RUFSX1JFR05PX1JFR19TRVQgKHNwaWxsZWQsIHJlZ25vKTsKIAkgIGNoYW5n ZWRfcCA9IHRydWU7CiAJfQotICAgICAgZWxzZQotCXNwaWxsZWRfcHNldWRv X3JlZ3NbbSsrXSA9IHJlZ25vOwogICAgIH0KLSAgaWYgKG0gPT0gMCkKLSAg ICByZXR1cm4gY2hhbmdlZF9wOwotICBpZiAoaW50ZXJuYWxfZmxhZ19pcmFf dmVyYm9zZSA+IDMgJiYgaXJhX2R1bXBfZmlsZSAhPSBOVUxMKQotICAgIHsK LSAgICAgIGZwcmludGYgKGlyYV9kdW1wX2ZpbGUsICIgICAgICBTcGlsbGVk IHJlZ3MiKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyBpKyspCi0JZnBy aW50ZiAoaXJhX2R1bXBfZmlsZSwgIiAlZCIsIHNwaWxsZWRfcHNldWRvX3Jl Z3NbaV0pOwotICAgICAgZnByaW50ZiAoaXJhX2R1bXBfZmlsZSwgIlxuIik7 Ci0gICAgfQotICAvKiBUcnkgdG8gYXNzaWduIGhhcmQgcmVnaXN0ZXJzIHRv IHBzZXVkb3MgY29uZmxpY3Rpbmcgd2l0aCBvbmVzCi0gICAgIGZyb20gU1BJ TExFRF9QU0VVRE9fUkVHUy4gICovCi0gIGZvciAoaSA9IG4gPSAwOyBpIDwg bTsgaSsrKQotICAgIHsKLSAgICAgIHJlZ25vID0gc3BpbGxlZF9wc2V1ZG9f cmVnc1tpXTsKLSAgICAgIGEgPSBpcmFfcmVnbm9fYWxsb2Nub19tYXBbcmVn bm9dOwotICAgICAgRk9SX0VBQ0hfQUxMT0NOT19DT05GTElDVCAoYSwgY29u ZmxpY3RfYSwgYWNpKQotCWlmIChBTExPQ05PX0hBUkRfUkVHTk8gKGNvbmZs aWN0X2EpIDwgMAotCSAgICAmJiAhIEFMTE9DTk9fRE9OVF9SRUFTU0lHTl9Q IChjb25mbGljdF9hKQotCSAgICAmJiAhIGJpdG1hcF9iaXRfcCAoY29uc2lk ZXJhdGlvbl9hbGxvY25vX2JpdG1hcCwKLQkJCSAgICAgICBBTExPQ05PX05V TSAoY29uZmxpY3RfYSkpKQotCSAgewotCSAgICBzb3J0ZWRfYWxsb2Nub3Nb bisrXSA9IGNvbmZsaWN0X2E7Ci0JICAgIGJpdG1hcF9zZXRfYml0IChjb25z aWRlcmF0aW9uX2FsbG9jbm9fYml0bWFwLAotCQkJICAgIEFMTE9DTk9fTlVN IChjb25mbGljdF9hKSk7Ci0JICB9Ci0gICAgfQotICBpZiAobiAhPSAwKQot ICAgIHsKLSAgICAgIHNldHVwX2FsbG9jbm9fcHJpb3JpdGllcyAoc29ydGVk X2FsbG9jbm9zLCBuKTsKLSAgICAgIHFzb3J0IChzb3J0ZWRfYWxsb2Nub3Ms IG4sIHNpemVvZiAoaXJhX2FsbG9jbm9fdCksCi0JICAgICBhbGxvY25vX3By aW9yaXR5X2NvbXBhcmVfZnVuYyk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwg bjsgaSsrKQotCXsKLQkgIGEgPSBzb3J0ZWRfYWxsb2Nub3NbaV07Ci0JICBy ZWdubyA9IEFMTE9DTk9fUkVHTk8gKGEpOwotCSAgQ09QWV9IQVJEX1JFR19T RVQgKGZvcmJpZGRlbl9yZWdzLCBiYWRfc3BpbGxfcmVncyk7Ci0JICBJT1Jf SEFSRF9SRUdfU0VUIChmb3JiaWRkZW5fcmVncywgcHNldWRvX2ZvcmJpZGRl bl9yZWdzW3JlZ25vXSk7Ci0JICBJT1JfSEFSRF9SRUdfU0VUIChmb3JiaWRk ZW5fcmVncywgcHNldWRvX3ByZXZpb3VzX3JlZ3NbcmVnbm9dKTsKLQkgIGlm IChpbnRlcm5hbF9mbGFnX2lyYV92ZXJib3NlID4gMyAmJiBpcmFfZHVtcF9m aWxlICE9IE5VTEwpCi0JICAgIGZwcmludGYgKGlyYV9kdW1wX2ZpbGUsCi0J CSAgICAgIiAgICAgICAgVHJ5IGFzc2lnbiAlZChhJWQpLCBjb3N0PSVkIiwK LQkJICAgICByZWdubywgQUxMT0NOT19OVU0gKGEpLAotCQkgICAgIEFMTE9D Tk9fTUVNT1JZX0NPU1QgKGEpCi0JCSAgICAgLSBBTExPQ05PX0NPVkVSX0NM QVNTX0NPU1QgKGEpKTsKLQkgIGlmIChhbGxvY25vX3JlbG9hZF9hc3NpZ24g KGEsIGZvcmJpZGRlbl9yZWdzKSkKLQkgICAgewotCSAgICAgIGNoYW5nZWRf cCA9IHRydWU7Ci0JICAgICAgYml0bWFwX2NsZWFyX2JpdCAoc3BpbGxlZCwg cmVnbm8pOwotCSAgICB9Ci0JfQotICAgIH0KKyAgQklUTUFQX0ZSRUUgKHRl bXApOwogICByZXR1cm4gY2hhbmdlZF9wOwogfQogCkluZGV4OiBpcmEtYnVp bGQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBpcmEtYnVpbGQuYwko cmV2aXNpb24gMTU1MzQzKQorKysgaXJhLWJ1aWxkLmMJKHdvcmtpbmcgY29w eSkKQEAgLTQ4Miw2ICs0ODIsNyBAQAogICBBTExPQ05PX0xJVkVfUkFOR0VT IChhKSA9IE5VTEw7CiAgIEFMTE9DTk9fTUlOIChhKSA9IElOVF9NQVg7CiAg IEFMTE9DTk9fTUFYIChhKSA9IC0xOworICBBTExPQ05PX1JFUVVJUkVTX1JF R0lTVEVSX1NVQlNFVCAoYSkgPSAwOwogICBBTExPQ05PX0NPTkZMSUNUX0lE IChhKSA9IGlyYV9hbGxvY25vc19udW07CiAgIFZFQ19zYWZlX3B1c2ggKGly YV9hbGxvY25vX3QsIGhlYXAsIGFsbG9jbm9fdmVjLCBhKTsKICAgaXJhX2Fs bG9jbm9zID0gVkVDX2FkZHJlc3MgKGlyYV9hbGxvY25vX3QsIGFsbG9jbm9f dmVjKTsKSW5kZXg6IGlyYS1jb3N0cy5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIGlyYS1jb3N0cy5jCShyZXZpc2lvbiAxNTUzNDMpCisrKyBpcmEt Y29zdHMuYwkod29ya2luZyBjb3B5KQpAQCAtNjM3LDYgKzYzNywxNCBAQAog CSAgICBzdHJ1Y3QgY29zdHMgKnBwID0gb3BfY29zdHNbaV0sICpxcSA9IHRo aXNfb3BfY29zdHNbaV07CiAJICAgIGludCBzY2FsZSA9IDEgKyAocmVjb2df ZGF0YS5vcGVyYW5kX3R5cGVbaV0gPT0gT1BfSU5PVVQpOwogCisgICAgICAg ICAgICAvKiBjYXRjaCBhbnkgYWxsb2Nub3MgdGhhdCB3YW50IGJvdHRvbV9y ZWdzIGFuZCByZWNvcmQgdGhpcyBmb3IgbGF0ZXIgKi8KKyAgICAgICAgICAg IGlmIChhbGxvY25vX3ByZWYgJiYgYWxsb2Nub19wcmVmW0FMTE9DTk9fTlVN CisJCQkJICAgICAgIChpcmFfY3Vycl9yZWdub19hbGxvY25vX21hcAorCQkJ CQlbUkVHTk8gKG9wc1tpXSldKV0gPT0gQk9UVE9NX1JFR1MpCisgICAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTExPQ05PX1JFUVVJUkVTX1JF R0lTVEVSX1NVQlNFVCAoaXJhX2N1cnJfcmVnbm9fYWxsb2Nub19tYXBbUkVH Tk8gKG9wc1tpXSldKSA9IDE7CisgICAgICAgICAgICAgIH0KKwogCSAgICBw cC0+bWVtX2Nvc3QgPSBNSU4gKHBwLT5tZW1fY29zdCwKIAkJCQkocXEtPm1l bV9jb3N0ICsgb3BfY29zdF9hZGQpICogc2NhbGUpOwogCkluZGV4OiByZWxv YWQxLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVsb2FkMS5jCShy ZXZpc2lvbiAxNTUzNDMpCisrKyByZWxvYWQxLmMJKHdvcmtpbmcgY29weSkK QEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlICJkZi5oIgogI2luY2x1ZGUg InRhcmdldC5oIgogI2luY2x1ZGUgImVtaXQtcnRsLmgiCisjaW5jbHVkZSAi aXJhLWludC5oIgogCiAvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJlbG9h ZCBwYXNzIG9mIHRoZSBjb21waWxlciwgd2hpY2ggaXMKICAgIHJ1biBhZnRl ciByZWdpc3RlciBhbGxvY2F0aW9uIGhhcyBiZWVuIGRvbmUuICBJdCBjaGVj a3MgdGhhdApAQCAtNTcyMCw2ICs1NzIxLDQ4IEBACiAgIHJldHVybiAwOwog fQogCisvKiBSZXR1cm4gbm9uemVybyBpZiBSRUdOTyBpcyBhIHBhcnRpY3Vs YXJseSBiYWQgY2hvaWNlIGZvciByZWxvYWRpbmcgWC4KKyAgIChQYXJ0IG9m IHRoZSBKZWZmIExhdyBoYWNrKSAqLworc3RhdGljIGludAoraXJhX2JhZF9y ZWxvYWRfcmVnbm9fMSAoaW50IHJlZ25vLCBydHggeCkKK3sKKyAgIGludCB4 X3JlZ25vOworICAgaXJhX2FsbG9jbm9fdCBhOworICAgZW51bSByZWdfY2xh c3MgcHJlZjsKKworICAgLyogV2Ugb25seSBkZWFsIHdpdGggcHNldWRvIHJl Z3MuICAqLworICAgaWYgKCEgeCB8fCBHRVRfQ09ERSAoeCkgIT0gUkVHKQor ICAgICByZXR1cm4gMDsKKworICAgeF9yZWdubyA9IFJFR05PICh4KTsKKyAg IGlmICh4X3JlZ25vIDwgRklSU1RfUFNFVURPX1JFR0lTVEVSKQorICAgICBy ZXR1cm4gMDsKKworICAgLyogSWYgdGhlIHBzZXVkbyBwcmVmZXJzIFJFR05P IGV4cGxpY2l0bHksIHRoZW4gZG8gbm90IGNvbnNpZGVyCisgICAgICBSRUdO TyBhIGJhZCBzcGlsbCBjaG9pY2UuICAqLworICAgcHJlZiA9IHJlZ19wcmVm ZXJyZWRfY2xhc3MgKHhfcmVnbm8pOworICAgaWYgKHJlZ19jbGFzc19zaXpl W3ByZWZdID09IDEKKyYmIFRFU1RfSEFSRF9SRUdfQklUIChyZWdfY2xhc3Nf Y29udGVudHNbcHJlZl0sIHJlZ25vKSkKKyAgICAgcmV0dXJuIDA7CisKKyAg IC8qIElmIHRoZSBwc2V1ZG8gY29uZmxpY3RzIHdpdGggUkVHTk8sIHRoZW4g d2UgY29uc2lkZXIgUkVHTk8gYQorICAgICAgcG9vciBjaG9pY2UgZm9yIGEg cmVsb2FkIHJlZ25vLiAgKi8KKyAgIGEgPSBpcmFfcmVnbm9fYWxsb2Nub19t YXBbeF9yZWdub107CisgICBpZiAoVEVTVF9IQVJEX1JFR19CSVQgKEFMTE9D Tk9fVE9UQUxfQ09ORkxJQ1RfSEFSRF9SRUdTIChhKSwgcmVnbm8pKQorICAg ICByZXR1cm4gMTsKKworICAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiBu b256ZXJvIGlmIFJFR05PIGlzIGEgcGFydGljdWxhcmx5IGJhZCBjaG9pY2Ug Zm9yIHJlbG9hZGluZworICAgIElOIG9yIE9VVC4gIChQYXJ0IG9mIHRoZSBK ZWZmIExhdyBoYWNrKSAqLworaW50CitpcmFfYmFkX3JlbG9hZF9yZWdubyAo aW50IHJlZ25vLCBydHggaW4sIHJ0eCBvdXQpCit7CisgICByZXR1cm4gKGly YV9iYWRfcmVsb2FkX3JlZ25vXzEgKHJlZ25vLCBpbikKKyAgICAgICAgICAg fHwgaXJhX2JhZF9yZWxvYWRfcmVnbm9fMSAocmVnbm8sIG91dCkpOworfQor CiAvKiBGaW5kIGEgc3BpbGwgcmVnaXN0ZXIgdG8gdXNlIGFzIGEgcmVsb2Fk IHJlZ2lzdGVyIGZvciByZWxvYWQgUi4KICAgIExBU1RfUkVMT0FEIGlzIG5v bnplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCByZWxvYWQgZm9yIHRoZSBpbnNu IGJlaW5nCiAgICBwcm9jZXNzZWQuCkBAIC01NzYxLDggKzU4MDQsMTEgQEAK ICAgICAgcnVuIG91dCBvZiByZWxvYWQgcmVncy4gIFN1cHBvc2Ugd2UgaGF2 ZSB0aHJlZSByZWxvYWRzLCBhbmQKICAgICAgcmVsb2FkcyBBIGFuZCBCIGNh biBzaGFyZSByZWdzLiAgVGhlc2UgbmVlZCB0d28gcmVncy4KICAgICAgU3Vw cG9zZSBBIGFuZCBCIGFyZSBnaXZlbiBkaWZmZXJlbnQgcmVncy4KLSAgICAg VGhhdCBsZWF2ZXMgbm9uZSBmb3IgQy4gICovCi0gIGZvciAocGFzcyA9IDA7 IHBhc3MgPCAyOyBwYXNzKyspCisgICAgIFRoYXQgbGVhdmVzIG5vbmUgZm9y IEMuCisKKyAgICAgTk9URTogVGhlcmUgYXJlIG5vdyB0aHJlZSBwYXNzZXMg aW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBKZWZmCisgICAgIExhdyBoYWNrLiAg Ki8KKyAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDM7IHBhc3MrKykKICAgICB7 CiAgICAgICAvKiBJIGlzIHRoZSBpbmRleCBpbiBzcGlsbF9yZWdzLgogCSBX ZSBhZHZhbmNlIGl0IHJvdW5kLXJvYmluIGJldHdlZW4gaW5zbnMgdG8gdXNl IGFsbCBzcGlsbCByZWdzCkBAIC01ODAxLDYgKzU4NDcsMTEgQEAKIAkJICAg ICAgJiYgISBURVNUX0hBUkRfUkVHX0JJVCAocmVsb2FkX3JlZ191c2VkX2Zv cl9pbmhlcml0LAogCQkJCQkgICAgICByZWdudW0pKSkpCiAJICAgIHsKKyAg ICAgICAgICAgICAgLyogQkVHSU46IEplZmYgTGF3J3MgaGFjayAqLworICAg ICAgICAgICAgICBpZiAocGFzcyA9PSAxCisgICAgICAgICAgICAgICAgICAm JiBpcmFfYmFkX3JlbG9hZF9yZWdubyAocmVnbnVtLCBybGRbcl0uaW4sIHJs ZFtyXS5vdXQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg ICAgICAgICAvKiBFTkQ6IEplZmYgTGF3J3MgaGFjayAqLwogCSAgICAgIGlu dCBuciA9IGhhcmRfcmVnbm9fbnJlZ3NbcmVnbnVtXVtybGRbcl0ubW9kZV07 CiAJICAgICAgLyogQXZvaWQgdGhlIHByb2JsZW0gd2hlcmUgc3BpbGxpbmcg YSBHRU5FUkFMX09SX0ZQX1JFRwogCQkgKG9uIDY4MDAwKSBnb3QgdXMgdHdv IEZQIHJlZ3MuICBJZiBOUiBpcyAxLAo= ------_=_NextPart_001_01CA7FF7.7BDBAEC3--