From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3536 invoked by alias); 5 Jan 2013 21:13:53 -0000 Received: (qmail 3520 invoked by uid 22791); 5 Jan 2013 21:13:53 -0000 X-SWARE-Spam-Status: No, hits=-4.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,SARE_SUB_IMPROVE,TW_CP X-Spam-Check-By: sourceware.org Received: from mail-la0-f51.google.com (HELO mail-la0-f51.google.com) (209.85.215.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 05 Jan 2013 21:13:49 +0000 Received: by mail-la0-f51.google.com with SMTP id fj20so12092080lab.10 for ; Sat, 05 Jan 2013 13:13:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.112.36.161 with SMTP id r1mr4769450lbj.39.1357420427192; Sat, 05 Jan 2013 13:13:47 -0800 (PST) Received: by 10.152.133.14 with HTTP; Sat, 5 Jan 2013 13:13:46 -0800 (PST) In-Reply-To: References: Date: Sat, 05 Jan 2013 21:13:00 -0000 Message-ID: Subject: Re: [Patch, libfortran] Improve performance of byte swapped IO From: Janne Blomqvist To: Richard Biener Cc: Andreas Schwab , GCC Patches , Fortran List Content-Type: multipart/mixed; boundary=e0cb4efe31785fa89204d29112b6 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 X-SW-Source: 2013-01/txt/msg00228.txt.bz2 --e0cb4efe31785fa89204d29112b6 Content-Type: text/plain; charset=UTF-8 Content-length: 1562 On Sat, Jan 5, 2013 at 5:35 PM, Richard Biener wrote: > On Fri, Jan 4, 2013 at 11:35 PM, Andreas Schwab wrote: >> Janne Blomqvist writes: >> >>> diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c >>> index c8ecc3a..bf2250a 100644 >>> --- a/libgfortran/io/file_pos.c >>> +++ b/libgfortran/io/file_pos.c >>> @@ -140,15 +140,21 @@ unformatted_backspace (st_parameter_filepos *fpp, gfc_unit *u) >>> } >>> else >>> { >>> + uint32_t u32; >>> + uint64_t u64; >>> switch (length) >>> { >>> case sizeof(GFC_INTEGER_4): >>> - reverse_memcpy (&m4, p, sizeof (m4)); >>> + memcpy (&u32, p, sizeof (u32)); >>> + u32 = __builtin_bswap32 (u32); >>> + m4 = *(GFC_INTEGER_4*)&u32; >> >> Isn't that an aliasing violation? > > It looks like one. Why not simply do > > m4 = (GFC_INTEGER_4) u32; > > ? I suppose GFC_INTEGER_4 is always the same size as uint32_t but signed? Yes, GFC_INTEGER_4 is a typedef for int32_t. As for why I didn't do the above, C99 6.3.1.3(3) says that if the unsigned value is outside the range of the signed variable, the result is implementation-defined. Though I suppose the sensible "implementation-defined behavior" in this case on a two's complement target is to just do a bitwise copy. Anyway, to be really safe one could use memcpy instead; the compiler optimizes small fixed size memcpy's just fine. Updated patch attached. -- Janne Blomqvist --e0cb4efe31785fa89204d29112b6 Content-Type: application/octet-stream; name="bswap2.diff" Content-Disposition: attachment; filename="bswap2.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hbl90t7x0 Content-length: 10427 ZGlmZiAtLWdpdCBhL2xpYmdmb3J0cmFuL2lvL2ZpbGVfcG9zLmMgYi9saWJn Zm9ydHJhbi9pby9maWxlX3Bvcy5jCmluZGV4IGM4ZWNjM2EuLjIyZDE5ZGQg MTAwNjQ0Ci0tLSBhL2xpYmdmb3J0cmFuL2lvL2ZpbGVfcG9zLmMKKysrIGIv bGliZ2ZvcnRyYW4vaW8vZmlsZV9wb3MuYwpAQCAtMTQwLDE1ICsxNDAsMjEg QEAgdW5mb3JtYXR0ZWRfYmFja3NwYWNlIChzdF9wYXJhbWV0ZXJfZmlsZXBv cyAqZnBwLCBnZmNfdW5pdCAqdSkKIAl9CiAgICAgICBlbHNlCiAJeworCSAg dWludDMyX3QgdTMyOworCSAgdWludDY0X3QgdTY0OwogCSAgc3dpdGNoIChs ZW5ndGgpCiAJICAgIHsKIAkgICAgY2FzZSBzaXplb2YoR0ZDX0lOVEVHRVJf NCk6Ci0JICAgICAgcmV2ZXJzZV9tZW1jcHkgKCZtNCwgcCwgc2l6ZW9mICht NCkpOworCSAgICAgIG1lbWNweSAoJnUzMiwgcCwgc2l6ZW9mICh1MzIpKTsK KwkgICAgICB1MzIgPSBfX2J1aWx0aW5fYnN3YXAzMiAodTMyKTsKKwkgICAg ICBtZW1jcHkgKCZtNCwgJnUzMiwgc2l6ZW9mIChtNCkpOwogCSAgICAgIG0g PSBtNDsKIAkgICAgICBicmVhazsKIAogCSAgICBjYXNlIHNpemVvZihHRkNf SU5URUdFUl84KToKLQkgICAgICByZXZlcnNlX21lbWNweSAoJm04LCBwLCBz aXplb2YgKG04KSk7CisJICAgICAgbWVtY3B5ICgmdTY0LCBwLCBzaXplb2Yg KHU2NCkpOworCSAgICAgIHU2NCA9IF9fYnVpbHRpbl9ic3dhcDY0ICh1NjQp OworCSAgICAgIG1lbWNweSAoJm04LCAmdTY0LCBzaXplb2YgKG04KSk7CiAJ ICAgICAgbSA9IG04OwogCSAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9s aWJnZm9ydHJhbi9pby9pby5oIGIvbGliZ2ZvcnRyYW4vaW8vaW8uaAppbmRl eCA0M2FlYWZkLi5mMTdkZTE5IDEwMDY0NAotLS0gYS9saWJnZm9ydHJhbi9p by9pby5oCisrKyBiL2xpYmdmb3J0cmFuL2lvL2lvLmgKQEAgLTY0OSw5ICs2 NDksNiBAQCBpbnRlcm5hbF9wcm90byhpbml0X2xvb3Bfc3BlYyk7CiBleHRl cm4gdm9pZCBuZXh0X3JlY29yZCAoc3RfcGFyYW1ldGVyX2R0ICosIGludCk7 CiBpbnRlcm5hbF9wcm90byhuZXh0X3JlY29yZCk7CiAKLWV4dGVybiB2b2lk IHJldmVyc2VfbWVtY3B5ICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90 KTsKLWludGVybmFsX3Byb3RvIChyZXZlcnNlX21lbWNweSk7Ci0KIGV4dGVy biB2b2lkIHN0X3dhaXQgKHN0X3BhcmFtZXRlcl93YWl0ICopOwogZXhwb3J0 X3Byb3RvKHN0X3dhaXQpOwogCmRpZmYgLS1naXQgYS9saWJnZm9ydHJhbi9p by90cmFuc2Zlci5jIGIvbGliZ2ZvcnRyYW4vaW8vdHJhbnNmZXIuYwppbmRl eCA2ZGRhMWRmLi41Y2VmYzM4IDEwMDY0NAotLS0gYS9saWJnZm9ydHJhbi9p by90cmFuc2Zlci5jCisrKyBiL2xpYmdmb3J0cmFuL2lvL3RyYW5zZmVyLmMK QEAgLTg3OCw1MCArODc4LDkxIEBAIHdyaXRlX2J1ZiAoc3RfcGFyYW1ldGVy X2R0ICpkdHAsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlcykKIH0KIAogCi0v KiBNYXN0ZXIgZnVuY3Rpb24gZm9yIHVuZm9ybWF0dGVkIHJlYWRzLiAgKi8K Ky8qIFJldmVyc2UgbWVtY3B5IC0gdXNlZCBmb3IgYnl0ZSBzd2FwcGluZy4g ICovCiAKIHN0YXRpYyB2b2lkCi11bmZvcm1hdHRlZF9yZWFkIChzdF9wYXJh bWV0ZXJfZHQgKmR0cCwgYnQgdHlwZSwKLQkJICB2b2lkICpkZXN0LCBpbnQg a2luZCwgc2l6ZV90IHNpemUsIHNpemVfdCBuZWxlbXMpCityZXZlcnNlX21l bWNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikK IHsKLSAgaWYgKGxpa2VseSAoZHRwLT51LnAuY3VycmVudF91bml0LT5mbGFn cy5jb252ZXJ0ID09IEdGQ19DT05WRVJUX05BVElWRSkKLSAgICAgIHx8IGtp bmQgPT0gMSkKKyAgY2hhciAqZCwgKnM7CisgIHNpemVfdCBpOworCisgIGQg PSAoY2hhciAqKSBkZXN0OworICBzID0gKGNoYXIgKikgc3JjICsgbiAtIDE7 CisKKyAgLyogV3JpdGUgd2l0aCBhc2NlbmRpbmcgb3JkZXIgLSB0aGlzIGlz IGxpa2VseSBmYXN0ZXIKKyAgICAgb24gbW9kZXJuIGFyY2hpdGVjdHVyZXMg YmVjYXVzZSBvZiB3cml0ZSBjb21iaW5pbmcuICAqLworICBmb3IgKGk9MDsg aTxuOyBpKyspCisgICAgICAqKGQrKykgPSAqKHMtLSk7Cit9CisKKworLyog VXRpbGl0eSBmdW5jdGlvbiBmb3IgYnl0ZXN3YXBwaW5nIGFuIGFycmF5LCB1 c2luZyB0aGUgYnN3YXAKKyAgIGJ1aWx0aW5zIGlmIHBvc3NpYmxlLiBkZXN0 IGFuZCBzcmMgY2FuIG92ZXJsYXAuICAqLworCitzdGF0aWMgdm9pZAorYnN3 YXBfYXJyYXkgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90 IHNpemUsIHNpemVfdCBuZWxlbXMpCit7CisgIGNoYXIgYnVmZmVyWzE2XTsK KyAgY29uc3QgY2hhciAqcHM7IAorICBjaGFyICpwZDsKKworICBzd2l0Y2gg KHNpemUpCiAgICAgewotICAgICAgaWYgKHR5cGUgPT0gQlRfQ0hBUkFDVEVS KQotCXNpemUgKj0gR0ZDX1NJWkVfT0ZfQ0hBUl9LSU5EKGtpbmQpOwotICAg ICAgcmVhZF9ibG9ja19kaXJlY3QgKGR0cCwgZGVzdCwgc2l6ZSAqIG5lbGVt cyk7CisgICAgY2FzZSAxOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgor ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWxlbXM7IGkrKykKKwko KHVpbnQxNl90KilkZXN0KVtpXSA9IF9fYnVpbHRpbl9ic3dhcDE2ICgoKHVp bnQxNl90KilzcmMpW2ldKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoK KyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVsZW1zOyBpKyspCisJ KCh1aW50MzJfdCopZGVzdClbaV0gPSBfX2J1aWx0aW5fYnN3YXAzMiAoKCh1 aW50MzJfdCopc3JjKVtpXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6 CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lbGVtczsgaSsrKQor CSgodWludDY0X3QqKWRlc3QpW2ldID0gX19idWlsdGluX2Jzd2FwNjQgKCgo dWludDY0X3QqKXNyYylbaV0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVs dDoKKyAgICAgIHBzID0gc3JjOworICAgICAgcGQgPSBkZXN0OworICAgICAg Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWxlbXM7IGkrKykKKwl7CisJICBy ZXZlcnNlX21lbWNweSAoYnVmZmVyLCBwcywgc2l6ZSk7CisJICBtZW1jcHkg KHBkLCBidWZmZXIsIHNpemUpOworCSAgcHMgKz0gc2l6ZTsKKwkgIHBkICs9 IHNpemU7CisJfQogICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIg YnVmZmVyWzE2XTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBzaXplX3QgaTsK K30KIAotICAgICAgcCA9IGRlc3Q7CiAKKy8qIE1hc3RlciBmdW5jdGlvbiBm b3IgdW5mb3JtYXR0ZWQgcmVhZHMuICAqLworCitzdGF0aWMgdm9pZAordW5m b3JtYXR0ZWRfcmVhZCAoc3RfcGFyYW1ldGVyX2R0ICpkdHAsIGJ0IHR5cGUs CisJCSAgdm9pZCAqZGVzdCwgaW50IGtpbmQsIHNpemVfdCBzaXplLCBzaXpl X3QgbmVsZW1zKQoreworICBpZiAodHlwZSA9PSBCVF9DSEFSQUNURVIpCisg ICAgc2l6ZSAqPSBHRkNfU0laRV9PRl9DSEFSX0tJTkQoa2luZCk7CisgIHJl YWRfYmxvY2tfZGlyZWN0IChkdHAsIGRlc3QsIHNpemUgKiBuZWxlbXMpOwor CisgIGlmICh1bmxpa2VseSAoZHRwLT51LnAuY3VycmVudF91bml0LT5mbGFn cy5jb252ZXJ0ID09IEdGQ19DT05WRVJUX1NXQVApCisgICAgICAmJiBraW5k ICE9IDEpCisgICAgewogICAgICAgLyogSGFuZGxlIHdpZGUgY2hyYWN0ZXJz LiAgKi8KLSAgICAgIGlmICh0eXBlID09IEJUX0NIQVJBQ1RFUiAmJiBraW5k ICE9IDEpCi0JewotCSAgbmVsZW1zICo9IHNpemU7Ci0JICBzaXplID0ga2lu ZDsKLQl9CisgICAgICBpZiAodHlwZSA9PSBCVF9DSEFSQUNURVIpCisgIAl7 CisgIAkgIG5lbGVtcyAqPSBzaXplOworICAJICBzaXplID0ga2luZDsKKyAg CX0KIAogICAgICAgLyogQnJlYWsgdXAgY29tcGxleCBpbnRvIGl0cyBjb25z dGl0dWVudCByZWFscy4gICovCi0gICAgICBpZiAodHlwZSA9PSBCVF9DT01Q TEVYKQotCXsKLQkgIG5lbGVtcyAqPSAyOwotCSAgc2l6ZSAvPSAyOwotCX0K LSAgICAgIAotICAgICAgLyogQnkgbm93LCBhbGwgY29tcGxleCB2YXJpYWJs ZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gdGhlaXIKLQkgY29uc3RpdHVlbnQg cmVhbHMuICAqLwotICAgICAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbmVs ZW1zOyBpKyspCi0JewotIAkgIHJlYWRfYmxvY2tfZGlyZWN0IChkdHAsIGJ1 ZmZlciwgc2l6ZSk7Ci0gCSAgcmV2ZXJzZV9tZW1jcHkgKHAsIGJ1ZmZlciwg c2l6ZSk7Ci0gCSAgcCArPSBzaXplOwotIAl9CisgICAgICBlbHNlIGlmICh0 eXBlID09IEJUX0NPTVBMRVgpCisgIAl7CisgIAkgIG5lbGVtcyAqPSAyOwor ICAJICBzaXplIC89IDI7CisgIAl9CisgICAgICBic3dhcF9hcnJheSAoZGVz dCwgZGVzdCwgc2l6ZSwgbmVsZW1zKTsKICAgICB9CiB9CiAKQEAgLTk0NSw5 ICs5ODYsMTAgQEAgdW5mb3JtYXR0ZWRfd3JpdGUgKHN0X3BhcmFtZXRlcl9k dCAqZHRwLCBidCB0eXBlLAogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAg IGNoYXIgYnVmZmVyWzE2XTsKKyNkZWZpbmUgQlNXQVBfQlVGU1ogNTEyCisg ICAgICBjaGFyIGJ1ZmZlcltCU1dBUF9CVUZTWl07CiAgICAgICBjaGFyICpw OwotICAgICAgc2l6ZV90IGk7CisgICAgICBzaXplX3QgbnJlbTsKIAogICAg ICAgcCA9IHNvdXJjZTsKIApAQCAtOTY4LDEyICsxMDEwLDIxIEBAIHVuZm9y bWF0dGVkX3dyaXRlIChzdF9wYXJhbWV0ZXJfZHQgKmR0cCwgYnQgdHlwZSwK ICAgICAgIC8qIEJ5IG5vdywgYWxsIGNvbXBsZXggdmFyaWFibGVzIGhhdmUg YmVlbiBzcGxpdCBpbnRvIHRoZWlyCiAJIGNvbnN0aXR1ZW50IHJlYWxzLiAg Ki8KIAotICAgICAgZm9yIChpID0gMDsgaSA8IG5lbGVtczsgaSsrKQorICAg ICAgbnJlbSA9IG5lbGVtczsKKyAgICAgIGRvCiAJewotCSAgcmV2ZXJzZV9t ZW1jcHkoYnVmZmVyLCBwLCBzaXplKTsKLSAJICBwICs9IHNpemU7Ci0JICB3 cml0ZV9idWYgKGR0cCwgYnVmZmVyLCBzaXplKTsKKwkgIHNpemVfdCBuYzsK KwkgIGlmIChzaXplICogbnJlbSA+IEJTV0FQX0JVRlNaKQorCSAgICBuYyA9 IEJTV0FQX0JVRlNaIC8gc2l6ZTsKKwkgIGVsc2UKKwkgICAgbmMgPSBucmVt OworCisJICBic3dhcF9hcnJheSAoYnVmZmVyLCBwLCBzaXplLCBuYyk7CisJ ICB3cml0ZV9idWYgKGR0cCwgYnVmZmVyLCBzaXplICogbmMpOworCSAgcCAr PSBzaXplICogbmM7CisJICBucmVtIC09IG5jOwogCX0KKyAgICAgIHdoaWxl IChucmVtID4gMCk7CiAgICAgfQogfQogCkBAIC0yMTUzLDE1ICsyMjA0LDIy IEBAIHVzX3JlYWQgKHN0X3BhcmFtZXRlcl9kdCAqZHRwLCBpbnQgY29udGlu dWVkKQogCX0KICAgICB9CiAgIGVsc2UKKyAgICB7CisgICAgICB1aW50MzJf dCB1MzI7CisgICAgICB1aW50NjRfdCB1NjQ7CiAgICAgICBzd2l0Y2ggKG5y KQogCXsKIAljYXNlIHNpemVvZihHRkNfSU5URUdFUl80KToKLQkgIHJldmVy c2VfbWVtY3B5ICgmaTQsICZpLCBzaXplb2YgKGk0KSk7CisJICBtZW1jcHkg KCZ1MzIsICZpLCBzaXplb2YgKHUzMikpOworCSAgdTMyID0gX19idWlsdGlu X2Jzd2FwMzIgKHUzMik7CisJICBtZW1jcHkgKCZpNCwgJnUzMiwgc2l6ZW9m IChpNCkpOwogCSAgaSA9IGk0OwogCSAgYnJlYWs7CiAKIAljYXNlIHNpemVv ZihHRkNfSU5URUdFUl84KToKLQkgIHJldmVyc2VfbWVtY3B5ICgmaTgsICZp LCBzaXplb2YgKGk4KSk7CisJICBtZW1jcHkgKCZ1NjQsICZpLCBzaXplb2Yg KHU2NCkpOworCSAgdTY0ID0gX19idWlsdGluX2Jzd2FwNjQgKHU2NCk7CisJ ICBtZW1jcHkgKCZpOCwgJnU2NCwgc2l6ZW9mIChpOCkpOwogCSAgaSA9IGk4 OwogCSAgYnJlYWs7CiAKQEAgLTIxNjksNiArMjIyNyw3IEBAIHVzX3JlYWQg KHN0X3BhcmFtZXRlcl9kdCAqZHRwLCBpbnQgY29udGludWVkKQogCSAgcnVu dGltZV9lcnJvciAoIklsbGVnYWwgdmFsdWUgZm9yIHJlY29yZCBtYXJrZXIi KTsKIAkgIGJyZWFrOwogCX0KKyAgICB9CiAKICAgaWYgKGkgPj0gMCkKICAg ICB7CkBAIC0zMDM2LDcgKzMwOTUsNiBAQCB3cml0ZV91c19tYXJrZXIgKHN0 X3BhcmFtZXRlcl9kdCAqZHRwLCBjb25zdCBnZmNfb2Zmc2V0IGJ1ZikKICAg c2l6ZV90IGxlbjsKICAgR0ZDX0lOVEVHRVJfNCBidWY0OwogICBHRkNfSU5U RUdFUl84IGJ1Zjg7Ci0gIGNoYXIgcFtzaXplb2YgKEdGQ19JTlRFR0VSXzgp XTsKIAogICBpZiAoY29tcGlsZV9vcHRpb25zLnJlY29yZF9tYXJrZXIgPT0g MCkKICAgICBsZW4gPSBzaXplb2YgKEdGQ19JTlRFR0VSXzQpOwpAQCAtMzA2 NSwxOCArMzEyMywyMiBAQCB3cml0ZV91c19tYXJrZXIgKHN0X3BhcmFtZXRl cl9kdCAqZHRwLCBjb25zdCBnZmNfb2Zmc2V0IGJ1ZikKICAgICB9CiAgIGVs c2UKICAgICB7CisgICAgICB1aW50MzJfdCB1MzI7CisgICAgICB1aW50NjRf dCB1NjQ7CiAgICAgICBzd2l0Y2ggKGxlbikKIAl7CiAJY2FzZSBzaXplb2Yg KEdGQ19JTlRFR0VSXzQpOgogCSAgYnVmNCA9IGJ1ZjsKLQkgIHJldmVyc2Vf bWVtY3B5IChwLCAmYnVmNCwgc2l6ZW9mIChHRkNfSU5URUdFUl80KSk7Ci0J ICByZXR1cm4gc3dyaXRlIChkdHAtPnUucC5jdXJyZW50X3VuaXQtPnMsIHAs IGxlbik7CisJICBtZW1jcHkgKCZ1MzIsICZidWY0LCBzaXplb2YgKHUzMikp OworCSAgdTMyID0gX19idWlsdGluX2Jzd2FwMzIgKHUzMik7CisJICByZXR1 cm4gc3dyaXRlIChkdHAtPnUucC5jdXJyZW50X3VuaXQtPnMsICZ1MzIsIGxl bik7CiAJICBicmVhazsKIAogCWNhc2Ugc2l6ZW9mIChHRkNfSU5URUdFUl84 KToKIAkgIGJ1ZjggPSBidWY7Ci0JICByZXZlcnNlX21lbWNweSAocCwgJmJ1 ZjgsIHNpemVvZiAoR0ZDX0lOVEVHRVJfOCkpOwotCSAgcmV0dXJuIHN3cml0 ZSAoZHRwLT51LnAuY3VycmVudF91bml0LT5zLCBwLCBsZW4pOworCSAgbWVt Y3B5ICgmdTY0LCAmYnVmOCwgc2l6ZW9mICh1NjQpKTsKKwkgIHU2NCA9IF9f YnVpbHRpbl9ic3dhcDY0ICh1NjQpOworCSAgcmV0dXJuIHN3cml0ZSAoZHRw LT51LnAuY3VycmVudF91bml0LT5zLCAmdTY0LCBsZW4pOwogCSAgYnJlYWs7 CiAKIAlkZWZhdWx0OgpAQCAtMzcxMywyMiArMzc3NSw2IEBAIHN0X3NldF9u bWxfdmFyX2RpbSAoc3RfcGFyYW1ldGVyX2R0ICpkdHAsIEdGQ19JTlRFR0VS XzQgbl9kaW0sCiAgIEdGQ19ESU1FTlNJT05fU0VUKG5tbC0+ZGltW25dLGxi b3VuZCx1Ym91bmQsc3RyaWRlKTsKIH0KIAotLyogUmV2ZXJzZSBtZW1jcHkg LSB1c2VkIGZvciBieXRlIHN3YXBwaW5nLiAgKi8KLQotdm9pZCByZXZlcnNl X21lbWNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qg bikKLXsKLSAgY2hhciAqZCwgKnM7Ci0gIHNpemVfdCBpOwotCi0gIGQgPSAo Y2hhciAqKSBkZXN0OwotICBzID0gKGNoYXIgKikgc3JjICsgbiAtIDE7Ci0K LSAgLyogV3JpdGUgd2l0aCBhc2NlbmRpbmcgb3JkZXIgLSB0aGlzIGlzIGxp a2VseSBmYXN0ZXIKLSAgICAgb24gbW9kZXJuIGFyY2hpdGVjdHVyZXMgYmVj YXVzZSBvZiB3cml0ZSBjb21iaW5pbmcuICAqLwotICBmb3IgKGk9MDsgaTxu OyBpKyspCi0gICAgICAqKGQrKykgPSAqKHMtLSk7Ci19Ci0KIAogLyogT25j ZSB1cG9uIGEgdGltZSwgYSBwb29yIGlubm9jZW50IEZvcnRyYW4gcHJvZ3Jh bSB3YXMgcmVhZGluZyBhCiAgICBmaWxlLCB3aGVuIHN1ZGRlbmx5IGl0IGhp dCB0aGUgZW5kLW9mLWZpbGUgKEVPRikuICBVbmZvcnR1bmF0ZWx5Cg== --e0cb4efe31785fa89204d29112b6--