From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 86546 invoked by alias); 24 May 2015 08:34:05 -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 86533 invoked by uid 89); 24 May 2015 08:34:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_50,KAM_ASCII_DIVIDERS,KAM_LAZY_DOMAIN_SECURITY,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mail3-relais-sop.national.inria.fr Received: from mail3-relais-sop.national.inria.fr (HELO mail3-relais-sop.national.inria.fr) (192.134.164.104) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Sun, 24 May 2015 08:33:53 +0000 Received: from stedding.saclay.inria.fr (HELO stedding) ([193.55.250.194]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/AES128-SHA; 24 May 2015 10:33:49 +0200 Received: from glisse (helo=localhost) by stedding with local-esmtp (Exim 4.85) (envelope-from ) id 1YwRLx-0003N4-8U for gcc-patches@gcc.gnu.org; Sun, 24 May 2015 10:33:49 +0200 Date: Sun, 24 May 2015 12:50:00 -0000 From: Marc Glisse To: gcc-patches@gcc.gnu.org Subject: Move ABS detection from fold-const.c to match.pd Message-ID: User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-1939663061-1432401207=:22033" Content-ID: X-SW-Source: 2015-05/txt/msg02213.txt.bz2 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323329-1939663061-1432401207=:22033 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; format=flowed Content-ID: Content-length: 1749 Hello, I don't think this pattern is done in the branch. Here I am trying to match what is done in fold-const, but the idea is that we can later add an extra block where we replace (cmp (minus @2 @3) zerop) with (cmp @2 @3), maybe with some adjustments ("convert?" all over the place), to help with PR 64450 / PR 61734. I didn't exactly match the code in fold-const.c, among other things because I didn't feel like calling operand_equal_for_comparison_p, and strip_nops can translate to quite heavy patterns. Except for a few irrelevant cases (where I simplify more), this seems to generate the same .original dumps in the cases I tried. But I am not claiming this is the best way to arrange that code, better ideas are welcome. I don't understand the old code handling unsigned, but I couldn't find a case where the new code (doing nothing special for unsigned) generated a different .original dump. The last pattern had a strange mix of requiring integer_zerop and talking about signed zero and NaN, I didn't try to preserve that. The change to genmatch is for zerop, which doesn't try to valueize anything. I had a few issues with the machinery. First, genmatch was generating a switch with duplicate cases (miraculously, replacing 'cond' with an iteration on 'cnd' worked around it). Second, (plus @0 (negate@0 @1)) is treated as (plus @0 @0), the pattern on the second occurence of the capture is silently ignored. Regtested on ppc64le-redhat-linux. 2015-05-25 Marc Glisse * genmatch.c (write_predicate): Add ATTRIBUTE_UNUSED. * match.pd (A op 0 ? A : -A, A op 0 ? A : 0): New simplifications. * fold-const.c (fold_cond_expr_with_comparison): Remove corresponding code. -- Marc Glisse --8323329-1939663061-1432401207=:22033 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=p30 Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: inline; filename=p30 Content-length: 13307 SW5kZXg6IGdjYy9mb2xkLWNvbnN0LmMNCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCi0tLSBnY2MvZm9sZC1jb25zdC5jCShyZXZpc2lvbiAyMjM2MzApDQor KysgZ2NjL2ZvbGQtY29uc3QuYwkod29ya2luZyBjb3B5KQ0KQEAgLTQ4NzUs MTEyICs0ODc1LDI1IEBAIG1lcmdlX3JhbmdlcyAoaW50ICpwaW5fcCwgdHJl ZSAqcGxvdywgdHINCiAgICBSZXR1cm4gYSBmb2xkZWQgZXhwcmVzc2lvbiB3 aG9zZSBjb2RlIGlzIG5vdCBhIENPTkRfRVhQUg0KICAgIGFueW1vcmUsIG9y IE5VTExfVFJFRSBpZiBubyBmb2xkaW5nIG9wcG9ydHVuaXR5IGlzIGZvdW5k LiAgKi8NCiANCiBzdGF0aWMgdHJlZQ0KIGZvbGRfY29uZF9leHByX3dpdGhf Y29tcGFyaXNvbiAobG9jYXRpb25fdCBsb2MsIHRyZWUgdHlwZSwNCiAJCQkJ dHJlZSBhcmcwLCB0cmVlIGFyZzEsIHRyZWUgYXJnMikNCiB7DQogICBlbnVt IHRyZWVfY29kZSBjb21wX2NvZGUgPSBUUkVFX0NPREUgKGFyZzApOw0KICAg dHJlZSBhcmcwMCA9IFRSRUVfT1BFUkFORCAoYXJnMCwgMCk7DQogICB0cmVl IGFyZzAxID0gVFJFRV9PUEVSQU5EIChhcmcwLCAxKTsNCi0gIHRyZWUgYXJn MV90eXBlID0gVFJFRV9UWVBFIChhcmcxKTsNCiAgIHRyZWUgdGVtOw0KIA0K ICAgU1RSSVBfTk9QUyAoYXJnMSk7DQogICBTVFJJUF9OT1BTIChhcmcyKTsN CiANCi0gIC8qIElmIHdlIGhhdmUgQSBvcCAwID8gQSA6IC1BLCBjb25zaWRl ciBhcHBseWluZyB0aGUgZm9sbG93aW5nDQotICAgICB0cmFuc2Zvcm1hdGlv bnM6DQotDQotICAgICBBID09IDA/IEEgOiAtQSAgICBzYW1lIGFzIC1BDQot ICAgICBBICE9IDA/IEEgOiAtQSAgICBzYW1lIGFzIEENCi0gICAgIEEgPj0g MD8gQSA6IC1BICAgIHNhbWUgYXMgYWJzIChBKQ0KLSAgICAgQSA+IDA/ICBB IDogLUEgICAgc2FtZSBhcyBhYnMgKEEpDQotICAgICBBIDw9IDA/IEEgOiAt QSAgICBzYW1lIGFzIC1hYnMgKEEpDQotICAgICBBIDwgMD8gIEEgOiAtQSAg ICBzYW1lIGFzIC1hYnMgKEEpDQotDQotICAgICBOb25lIG9mIHRoZXNlIHRy YW5zZm9ybWF0aW9ucyB3b3JrIGZvciBtb2RlcyB3aXRoIHNpZ25lZA0KLSAg ICAgemVyb3MuICBJZiBBIGlzICsvLTAsIHRoZSBmaXJzdCB0d28gdHJhbnNm b3JtYXRpb25zIHdpbGwNCi0gICAgIGNoYW5nZSB0aGUgc2lnbiBvZiB0aGUg cmVzdWx0IChmcm9tICswIHRvIC0wLCBvciB2aWNlDQotICAgICB2ZXJzYSku ICBUaGUgbGFzdCBmb3VyIHdpbGwgZml4IHRoZSBzaWduIG9mIHRoZSByZXN1 bHQsDQotICAgICBldmVuIHRob3VnaCB0aGUgb3JpZ2luYWwgZXhwcmVzc2lv bnMgY291bGQgYmUgcG9zaXRpdmUgb3INCi0gICAgIG5lZ2F0aXZlLCBkZXBl bmRpbmcgb24gdGhlIHNpZ24gb2YgQS4NCi0NCi0gICAgIE5vdGUgdGhhdCBh bGwgdGhlc2UgdHJhbnNmb3JtYXRpb25zIGFyZSBjb3JyZWN0IGlmIEEgaXMN Ci0gICAgIE5hTiwgc2luY2UgdGhlIHR3byBhbHRlcm5hdGl2ZXMgKEEgYW5k IC1BKSBhcmUgYWxzbyBOYU5zLiAgKi8NCi0gIGlmICghSE9OT1JfU0lHTkVE X1pFUk9TIChlbGVtZW50X21vZGUgKHR5cGUpKQ0KLSAgICAgICYmIChGTE9B VF9UWVBFX1AgKFRSRUVfVFlQRSAoYXJnMDEpKQ0KLQkgID8gcmVhbF96ZXJv cCAoYXJnMDEpDQotCSAgOiBpbnRlZ2VyX3plcm9wIChhcmcwMSkpDQotICAg ICAgJiYgKChUUkVFX0NPREUgKGFyZzIpID09IE5FR0FURV9FWFBSDQotCSAg ICYmIG9wZXJhbmRfZXF1YWxfcCAoVFJFRV9PUEVSQU5EIChhcmcyLCAwKSwg YXJnMSwgMCkpDQotCSAgICAgLyogSW4gdGhlIGNhc2UgdGhhdCBBIGlzIG9m IHRoZSBmb3JtIFgtWSwgJy1BJyAoYXJnMikgbWF5DQotCSAgICAgICAgaGF2 ZSBhbHJlYWR5IGJlZW4gZm9sZGVkIHRvIFktWCwgY2hlY2sgZm9yIHRoYXQu ICovDQotCSAgfHwgKFRSRUVfQ09ERSAoYXJnMSkgPT0gTUlOVVNfRVhQUg0K LQkgICAgICAmJiBUUkVFX0NPREUgKGFyZzIpID09IE1JTlVTX0VYUFINCi0J ICAgICAgJiYgb3BlcmFuZF9lcXVhbF9wIChUUkVFX09QRVJBTkQgKGFyZzEs IDApLA0KLQkJCQkgIFRSRUVfT1BFUkFORCAoYXJnMiwgMSksIDApDQotCSAg ICAgICYmIG9wZXJhbmRfZXF1YWxfcCAoVFJFRV9PUEVSQU5EIChhcmcxLCAx KSwNCi0JCQkJICBUUkVFX09QRVJBTkQgKGFyZzIsIDApLCAwKSkpKQ0KLSAg ICBzd2l0Y2ggKGNvbXBfY29kZSkNCi0gICAgICB7DQotICAgICAgY2FzZSBF UV9FWFBSOg0KLSAgICAgIGNhc2UgVU5FUV9FWFBSOg0KLQl0ZW0gPSBmb2xk X2NvbnZlcnRfbG9jIChsb2MsIGFyZzFfdHlwZSwgYXJnMSk7DQotCXJldHVy biBwZWRhbnRpY19ub25fbHZhbHVlX2xvYyAobG9jLA0KLQkJCQkgICAgZm9s ZF9jb252ZXJ0X2xvYyAobG9jLCB0eXBlLA0KLQkJCQkJCSAgbmVnYXRlX2V4 cHIgKHRlbSkpKTsNCi0gICAgICBjYXNlIE5FX0VYUFI6DQotICAgICAgY2Fz ZSBMVEdUX0VYUFI6DQotCXJldHVybiBwZWRhbnRpY19ub25fbHZhbHVlX2xv YyAobG9jLCBmb2xkX2NvbnZlcnRfbG9jIChsb2MsIHR5cGUsIGFyZzEpKTsN Ci0gICAgICBjYXNlIFVOR0VfRVhQUjoNCi0gICAgICBjYXNlIFVOR1RfRVhQ UjoNCi0JaWYgKGZsYWdfdHJhcHBpbmdfbWF0aCkNCi0JICBicmVhazsNCi0J LyogRmFsbCB0aHJvdWdoLiAgKi8NCi0gICAgICBjYXNlIEdFX0VYUFI6DQot ICAgICAgY2FzZSBHVF9FWFBSOg0KLQlpZiAoVFlQRV9VTlNJR05FRCAoVFJF RV9UWVBFIChhcmcxKSkpDQotCSAgYXJnMSA9IGZvbGRfY29udmVydF9sb2Mg KGxvYywgc2lnbmVkX3R5cGVfZm9yDQotCQkJICAgICAgIChUUkVFX1RZUEUg KGFyZzEpKSwgYXJnMSk7DQotCXRlbSA9IGZvbGRfYnVpbGQxX2xvYyAobG9j LCBBQlNfRVhQUiwgVFJFRV9UWVBFIChhcmcxKSwgYXJnMSk7DQotCXJldHVy biBwZWRhbnRpY19ub25fbHZhbHVlX2xvYyAobG9jLCBmb2xkX2NvbnZlcnRf bG9jIChsb2MsIHR5cGUsIHRlbSkpOw0KLSAgICAgIGNhc2UgVU5MRV9FWFBS Og0KLSAgICAgIGNhc2UgVU5MVF9FWFBSOg0KLQlpZiAoZmxhZ190cmFwcGlu Z19tYXRoKQ0KLQkgIGJyZWFrOw0KLSAgICAgIGNhc2UgTEVfRVhQUjoNCi0g ICAgICBjYXNlIExUX0VYUFI6DQotCWlmIChUWVBFX1VOU0lHTkVEIChUUkVF X1RZUEUgKGFyZzEpKSkNCi0JICBhcmcxID0gZm9sZF9jb252ZXJ0X2xvYyAo bG9jLCBzaWduZWRfdHlwZV9mb3INCi0JCQkgICAgICAgKFRSRUVfVFlQRSAo YXJnMSkpLCBhcmcxKTsNCi0JdGVtID0gZm9sZF9idWlsZDFfbG9jIChsb2Ms IEFCU19FWFBSLCBUUkVFX1RZUEUgKGFyZzEpLCBhcmcxKTsNCi0JcmV0dXJu IG5lZ2F0ZV9leHByIChmb2xkX2NvbnZlcnRfbG9jIChsb2MsIHR5cGUsIHRl bSkpOw0KLSAgICAgIGRlZmF1bHQ6DQotCWdjY19hc3NlcnQgKFRSRUVfQ09E RV9DTEFTUyAoY29tcF9jb2RlKSA9PSB0Y2NfY29tcGFyaXNvbik7DQotCWJy ZWFrOw0KLSAgICAgIH0NCi0NCi0gIC8qIEEgIT0gMCA/IEEgOiAwIGlzIHNp bXBseSBBLCB1bmxlc3MgQSBpcyAtMC4gIExpa2V3aXNlDQotICAgICBBID09 IDAgPyBBIDogMCBpcyBhbHdheXMgMCB1bmxlc3MgQSBpcyAtMC4gIE5vdGUg dGhhdA0KLSAgICAgYm90aCB0cmFuc2Zvcm1hdGlvbnMgYXJlIGNvcnJlY3Qg d2hlbiBBIGlzIE5hTjogQSAhPSAwDQotICAgICBpcyB0aGVuIHRydWUsIGFu ZCBBID09IDAgaXMgZmFsc2UuICAqLw0KLQ0KLSAgaWYgKCFIT05PUl9TSUdO RURfWkVST1MgKGVsZW1lbnRfbW9kZSAodHlwZSkpDQotICAgICAgJiYgaW50 ZWdlcl96ZXJvcCAoYXJnMDEpICYmIGludGVnZXJfemVyb3AgKGFyZzIpKQ0K LSAgICB7DQotICAgICAgaWYgKGNvbXBfY29kZSA9PSBORV9FWFBSKQ0KLQly ZXR1cm4gcGVkYW50aWNfbm9uX2x2YWx1ZV9sb2MgKGxvYywgZm9sZF9jb252 ZXJ0X2xvYyAobG9jLCB0eXBlLCBhcmcxKSk7DQotICAgICAgZWxzZSBpZiAo Y29tcF9jb2RlID09IEVRX0VYUFIpDQotCXJldHVybiBidWlsZF96ZXJvX2Nz dCAodHlwZSk7DQotICAgIH0NCi0NCiAgIC8qIFRyeSBzb21lIHRyYW5zZm9y bWF0aW9ucyBvZiBBIG9wIEIgPyBBIDogQi4NCiANCiAgICAgIEEgPT0gQj8g QSA6IEIgICAgc2FtZSBhcyBCDQogICAgICBBICE9IEI/IEEgOiBCICAgIHNh bWUgYXMgQQ0KICAgICAgQSA+PSBCPyBBIDogQiAgICBzYW1lIGFzIG1heCAo QSwgQikNCiAgICAgIEEgPiBCPyAgQSA6IEIgICAgc2FtZSBhcyBtYXggKEIs IEEpDQogICAgICBBIDw9IEI/IEEgOiBCICAgIHNhbWUgYXMgbWluIChBLCBC KQ0KICAgICAgQSA8IEI/ICBBIDogQiAgICBzYW1lIGFzIG1pbiAoQiwgQSkN CiANCiAgICAgIEFzIGFib3ZlLCB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgZG9u J3Qgd29yayBpbiB0aGUgcHJlc2VuY2UNCkluZGV4OiBnY2MvZ2VubWF0Y2gu Yw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGdjYy9nZW5tYXRjaC5j CShyZXZpc2lvbiAyMjM2MzApDQorKysgZ2NjL2dlbm1hdGNoLmMJKHdvcmtp bmcgY29weSkNCkBAIC0yNjU3LDIxICsyNjU3LDIxIEBAIGRlY2lzaW9uX3Ry ZWU6Omdlbl9nZW5lcmljIChGSUxFICpmKQ0KIA0KIC8qIE91dHB1dCBjb2Rl IHRvIGltcGxlbWVudCB0aGUgcHJlZGljYXRlIFAgZnJvbSB0aGUgZGVjaXNp b24gdHJlZSBEVC4gICovDQogDQogdm9pZA0KIHdyaXRlX3ByZWRpY2F0ZSAo RklMRSAqZiwgcHJlZGljYXRlX2lkICpwLCBkZWNpc2lvbl90cmVlICZkdCwg Ym9vbCBnaW1wbGUpDQogew0KICAgZnByaW50ZiAoZiwgIlxuYm9vbFxuIg0K IAkgICAiJXMlcyAodHJlZSB0JXMlcylcbiINCiAJICAgIntcbiIsIGdpbXBs ZSA/ICJnaW1wbGVfIiA6ICJ0cmVlXyIsIHAtPmlkLA0KIAkgICBwLT5uYXJn cyA+IDAgPyAiLCB0cmVlICpyZXNfb3BzIiA6ICIiLA0KLQkgICBnaW1wbGUg PyAiLCB0cmVlICgqdmFsdWVpemUpKHRyZWUpIiA6ICIiKTsNCisJICAgZ2lt cGxlID8gIiwgdHJlZSAoKnZhbHVlaXplKSh0cmVlKSBBVFRSSUJVVEVfVU5V U0VEIiA6ICIiKTsNCiAgIC8qIENvbnZlbmllbnRseSBtYWtlICd0eXBlJyBh dmFpbGFibGUuICAqLw0KICAgZnByaW50ZiAoZiwgInRyZWUgdHlwZSA9IFRS RUVfVFlQRSAodCk7XG4iKTsNCiANCiAgIGlmICghZ2ltcGxlKQ0KICAgICBm cHJpbnRmIChmLCAiaWYgKFRSRUVfU0lERV9FRkZFQ1RTICh0KSkgcmV0dXJu IGZhbHNlO1xuIik7DQogICBkdC5yb290LT5nZW5fa2lkcyAoZiwgZ2ltcGxl KTsNCiANCiAgIGZwcmludGYgKGYsICJyZXR1cm4gZmFsc2U7XG4iDQogCSAg ICJ9XG4iKTsNCiB9DQpJbmRleDogZ2NjL21hdGNoLnBkDQo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQotLS0gZ2NjL21hdGNoLnBkCShyZXZpc2lvbiAyMjM2 MzApDQorKysgZ2NjL21hdGNoLnBkCSh3b3JraW5nIGNvcHkpDQpAQCAtMTEz MSwxMCArMTEzMSwxMDYgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmls ZSBDT1BZSU5HMy4NCiAJICYmIChUWVBFX09WRVJGTE9XX1dSQVBTIChUUkVF X1RZUEUgKEAwKSkNCiAJICAgICB8fCB0cmVlX2ludF9jc3Rfc2duIChANCkg Pj0gMCkNCiAJICYmIHNpbmdsZV91c2UgKEA1KSkNCiAgICAgICAoaWYgKFRZ UEVfT1ZFUkZMT1dfV1JBUFMgKFRSRUVfVFlQRSAoQDApKSkNCiAJKHdpdGgg eyB0cmVlIG50eXBlID0gVFJFRV9UWVBFIChAMCk7IH0NCiAJICAoY29udmVy dCAoYml0X2FuZCAob3AgQDAgQDEpIChjb252ZXJ0Om50eXBlIEA0KSkpKSkN CiAgICAgICAod2l0aCB7IHRyZWUgdXR5cGUgPSB1bnNpZ25lZF90eXBlX2Zv ciAoVFJFRV9UWVBFIChAMCkpOyB9DQogCShjb252ZXJ0IChiaXRfYW5kIChv cCAoY29udmVydDp1dHlwZSBAMCkgKGNvbnZlcnQ6dXR5cGUgQDEpKQ0KIAkJ CSAgKGNvbnZlcnQ6dXR5cGUgQDQpKSkpKSkpDQogDQorDQorKG1hdGNoIHpl cm9wIGludGVnZXJfemVyb3ApDQorKG1hdGNoIHplcm9wIHJlYWxfemVyb3Ap DQorDQorLyogSWYgd2UgaGF2ZSBBIG9wIDAgPyBBIDogLUEsIGNvbnNpZGVy IGFwcGx5aW5nIHRoZSBmb2xsb3dpbmcNCisgICB0cmFuc2Zvcm1hdGlvbnM6 DQorDQorICAgQSA9PSAwPyBBIDogLUEgICAgc2FtZSBhcyAtQQ0KKyAgIEEg IT0gMD8gQSA6IC1BICAgIHNhbWUgYXMgQQ0KKyAgIEEgPj0gMD8gQSA6IC1B ICAgIHNhbWUgYXMgYWJzIChBKQ0KKyAgIEEgPiAwPyAgQSA6IC1BICAgIHNh bWUgYXMgYWJzIChBKQ0KKyAgIEEgPD0gMD8gQSA6IC1BICAgIHNhbWUgYXMg LWFicyAoQSkNCisgICBBIDwgMD8gIEEgOiAtQSAgICBzYW1lIGFzIC1hYnMg KEEpDQorDQorICAgTm9uZSBvZiB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgd29y ayBmb3IgbW9kZXMgd2l0aCBzaWduZWQNCisgICB6ZXJvcy4gIElmIEEgaXMg Ky8tMCwgdGhlIGZpcnN0IHR3byB0cmFuc2Zvcm1hdGlvbnMgd2lsbA0KKyAg IGNoYW5nZSB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0IChmcm9tICswIHRvIC0w LCBvciB2aWNlDQorICAgdmVyc2EpLiAgVGhlIGxhc3QgZm91ciB3aWxsIGZp eCB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0LA0KKyAgIGV2ZW4gdGhvdWdoIHRo ZSBvcmlnaW5hbCBleHByZXNzaW9ucyBjb3VsZCBiZSBwb3NpdGl2ZSBvcg0K KyAgIG5lZ2F0aXZlLCBkZXBlbmRpbmcgb24gdGhlIHNpZ24gb2YgQS4NCisN CisgICBOb3RlIHRoYXQgYWxsIHRoZXNlIHRyYW5zZm9ybWF0aW9ucyBhcmUg Y29ycmVjdCBpZiBBIGlzDQorICAgTmFOLCBzaW5jZSB0aGUgdHdvIGFsdGVy bmF0aXZlcyAoQSBhbmQgLUEpIGFyZSBhbHNvIE5hTnMuICAqLw0KKyhpZiAo IUhPTk9SX1NJR05FRF9aRVJPUyAodHlwZSkpDQorIChmb3IgY25kIChjb25k IHZlY19jb25kKQ0KKyAgKGZvciBjbXAgKHRjY19jb21wYXJpc29uKQ0KKyAg IChzaW1wbGlmeQ0KKyAgICAoY25kIChjbXAgQDAgemVyb3ApIChjb252ZXJ0 P0AyIEAwKSAobmVnYXRlQDEgQDIpKQ0KKyAgICAoaWYgKGNtcCA9PSBFUV9F WFBSIHx8IGNtcCA9PSBVTkVRX0VYUFIpDQorICAgICBAMSkNCisgICAgKGlm IChjbXAgPT0gTkVfRVhQUiB8fCBjbXAgPT0gTFRHVF9FWFBSKQ0KKyAgICAg KG5vbl9sdmFsdWUgQDIpKQ0KKyAgICAoaWYgKFRZUEVfU0lHTiAoVFJFRV9U WVBFIChAMCkpID09IFNJR05FRCAvKiBpbXBsaWNpdCAqLw0KKwkgJiYgVFlQ RV9TSUdOICh0eXBlKSA9PSBTSUdORUQNCisJICYmIGVsZW1lbnRfcHJlY2lz aW9uICh0eXBlKSA+PSBlbGVtZW50X3ByZWNpc2lvbiAoVFJFRV9UWVBFIChA MCkpKQ0KKyAgICAgKGlmIChjbXAgPT0gR0VfRVhQUiB8fCBjbXAgPT0gR1Rf RVhQUg0KKwkgIHx8ICghZmxhZ190cmFwcGluZ19tYXRoICYmIChjbXAgPT0g VU5HRV9FWFBSIHx8IGNtcCA9PSBVTkdUX0VYUFIpKSkNCisgICAgICAoYWJz IEAyKSkNCisgICAgIChpZiAoY21wID09IExFX0VYUFIgfHwgY21wID09IExU X0VYUFINCisJICB8fCAoIWZsYWdfdHJhcHBpbmdfbWF0aCAmJiAoY21wID09 IFVOTEVfRVhQUiB8fCBjbXAgPT0gVU5MVF9FWFBSKSkpDQorICAgICAgKG5l Z2F0ZSAoYWJzIEAyKSkpKSkNCisgICAvKiBOb3cgd2l0aCB0aGUgYnJhbmNo ZXMgc3dhcHBlZC4gICovDQorICAgKHNpbXBsaWZ5DQorICAgIChjbmQgKGNt cCBAMCB6ZXJvcCkgKG5lZ2F0ZUAxIChjb252ZXJ0P0AyIEAwKSkgQDIpDQor ICAgIChpZiAoY21wID09IEVRX0VYUFIgfHwgY21wID09IFVORVFfRVhQUikN CisgICAgIChub25fbHZhbHVlIEAyKSkNCisgICAgKGlmIChjbXAgPT0gTkVf RVhQUiB8fCBjbXAgPT0gTFRHVF9FWFBSKQ0KKyAgICAgQDEpDQorICAgIChp ZiAoVFlQRV9TSUdOIChUUkVFX1RZUEUgKEAwKSkgPT0gU0lHTkVEIC8qIGlt cGxpY2l0ICovDQorCSAmJiBUWVBFX1NJR04gKHR5cGUpID09IFNJR05FRA0K KwkgJiYgZWxlbWVudF9wcmVjaXNpb24gKHR5cGUpID49IGVsZW1lbnRfcHJl Y2lzaW9uIChUUkVFX1RZUEUgKEAwKSkpDQorICAgICAoaWYgKGNtcCA9PSBH RV9FWFBSIHx8IGNtcCA9PSBHVF9FWFBSDQorCSAgfHwgKCFmbGFnX3RyYXBw aW5nX21hdGggJiYgKGNtcCA9PSBVTkdFX0VYUFIgfHwgY21wID09IFVOR1Rf RVhQUikpKQ0KKyAgICAgIChuZWdhdGUgKGFicyBAMikpKQ0KKyAgICAgKGlm IChjbXAgPT0gTEVfRVhQUiB8fCBjbXAgPT0gTFRfRVhQUg0KKwkgIHx8ICgh ZmxhZ190cmFwcGluZ19tYXRoICYmIChjbXAgPT0gVU5MRV9FWFBSIHx8IGNt cCA9PSBVTkxUX0VYUFIpKSkNCisgICAgICAoYWJzIEAyKSkpKQ0KKyANCisg ICAvKiBTYW1lIGFzIGFib3ZlLCBidXQgaWYgQSBpcyBYIC0gWSwgLUEgbWF5 IGJlIHNwZWxsZWQgWSAtIFguICAqLw0KKyAgIChzaW1wbGlmeQ0KKyAgICAo Y25kIChjbXAgKG1pbnVzQDAgQDIgQDMpIHplcm9wKSBAMCAobWludXNAMSBA MyBAMikpDQorICAgIChpZiAoY21wID09IEVRX0VYUFIgfHwgY21wID09IFVO RVFfRVhQUikNCisgICAgIEAxKQ0KKyAgICAoaWYgKGNtcCA9PSBORV9FWFBS IHx8IGNtcCA9PSBMVEdUX0VYUFIpDQorICAgICBAMCkNCisgICAgKGlmICgh SE9OT1JfU0lHTl9ERVBFTkRFTlRfUk9VTkRJTkcgKHR5cGUpKQ0KKyAgICAg KGlmIChjbXAgPT0gR0VfRVhQUiB8fCBjbXAgPT0gR1RfRVhQUg0KKwkgIHx8 ICghZmxhZ190cmFwcGluZ19tYXRoICYmIChjbXAgPT0gVU5HRV9FWFBSIHx8 IGNtcCA9PSBVTkdUX0VYUFIpKSkNCisgICAgICAoYWJzIEAwKSkNCisgICAg IChpZiAoY21wID09IExFX0VYUFIgfHwgY21wID09IExUX0VYUFINCisJICB8 fCAoIWZsYWdfdHJhcHBpbmdfbWF0aCAmJiAoY21wID09IFVOTEVfRVhQUiB8 fCBjbXAgPT0gVU5MVF9FWFBSKSkpDQorICAgICAgKG5lZ2F0ZSAoYWJzIEAw KSkpKSkNCisgICAoc2ltcGxpZnkNCisgICAgKGNuZCAoY21wIChtaW51c0Aw IEAyIEAzKSB6ZXJvcCkgKG1pbnVzQDEgQDMgQDIpIEAwKQ0KKyAgICAoaWYg KGNtcCA9PSBFUV9FWFBSIHx8IGNtcCA9PSBVTkVRX0VYUFIpDQorICAgICBA MCkNCisgICAgKGlmIChjbXAgPT0gTkVfRVhQUiB8fCBjbXAgPT0gTFRHVF9F WFBSKQ0KKyAgICAgQDEpDQorICAgIChpZiAoIUhPTk9SX1NJR05fREVQRU5E RU5UX1JPVU5ESU5HICh0eXBlKSkNCisgICAgIChpZiAoY21wID09IEdFX0VY UFIgfHwgY21wID09IEdUX0VYUFINCisJICB8fCAoIWZsYWdfdHJhcHBpbmdf bWF0aCAmJiAoY21wID09IFVOR0VfRVhQUiB8fCBjbXAgPT0gVU5HVF9FWFBS KSkpDQorICAgICAgKG5lZ2F0ZSAoYWJzIEAwKSkpDQorICAgICAoaWYgKGNt cCA9PSBMRV9FWFBSIHx8IGNtcCA9PSBMVF9FWFBSDQorCSAgfHwgKCFmbGFn X3RyYXBwaW5nX21hdGggJiYgKGNtcCA9PSBVTkxFX0VYUFIgfHwgY21wID09 IFVOTFRfRVhQUikpKQ0KKyAgICAgIChhYnMgQDApKSkpKQ0KKyANCisgIC8q IEEgIT0gMCA/IEEgOiAwIGlzIHNpbXBseSBBLCB1bmxlc3MgQSBpcyAtMC4g IExpa2V3aXNlDQorICAgICBBID09IDAgPyBBIDogMCBpcyBhbHdheXMgMCB1 bmxlc3MgQSBpcyAtMC4gIE5vdGUgdGhhdA0KKyAgICAgYm90aCB0cmFuc2Zv cm1hdGlvbnMgYXJlIGNvcnJlY3Qgd2hlbiBBIGlzIE5hTjogQSAhPSAwDQor ICAgICBpcyB0aGVuIHRydWUsIGFuZCBBID09IDAgaXMgZmFsc2UuICAqLw0K KyAgKHNpbXBsaWZ5DQorICAgKGNuZCAobmUgQDAgemVyb3ApIChjb252ZXJ0 PyBAMCkgemVyb3ApDQorICAgKG5vbl9sdmFsdWUgKGNvbnZlcnQgQDApKSkN CisgIChzaW1wbGlmeQ0KKyAgIChjbmQgKGVxIEAwIHplcm9wKSAoY29udmVy dD8gQDApIHplcm9wQDEpDQorICAgKG5vbl9sdmFsdWUgKGNvbnZlcnQgQDEp KSkpKQ0K --8323329-1939663061-1432401207=:22033--