From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 8BE15385829D for ; Mon, 17 Oct 2022 06:21:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8BE15385829D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1665987676; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=tJExxV2w/hApUfH+h9rcCEay9d2BfIeyP11DDTQT5KI=; b=Aw3dwRsuAkWMdCWuaOTX2k7Awahzmj49ViNNGdA7atzX3/PXjhmDyPOHo0G4WP4VAods4p s/Sppk/DlsudHx9BU5TXQtn/Npu3CvcwoS166NF/ldkjBFIDojUfXbLR8OknCTVydIoBzy Q68F/G44IUXUv/qcv7qsx40Pqo5iy8M= Received: from mail-yb1-f199.google.com (mail-yb1-f199.google.com [209.85.219.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-25-9TVYDcNpMC-kdBnPLiomOA-1; Mon, 17 Oct 2022 02:21:13 -0400 X-MC-Unique: 9TVYDcNpMC-kdBnPLiomOA-1 Received: by mail-yb1-f199.google.com with SMTP id f9-20020a25b089000000b006be298e2a8dso9848373ybj.20 for ; Sun, 16 Oct 2022 23:21:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=tJExxV2w/hApUfH+h9rcCEay9d2BfIeyP11DDTQT5KI=; b=lICE11F9WcajJg+MWcRWiG4opHE8VMxCoFyzVkWWexTrwebCErEWstjxTJE2iv+f7C fbtTjwf6NssEMROETRlYfvxoZ3Ui+9UPEWhPYlVFbs7sLuiYBg2Sj86Yx1S9D1qDwQbG CGiodQmalAuHOvXwkTYM3NgpP/2XgyS4jNaZEVpUM67CNHIb+BhrSxDao8hx+U2ouFPa an2gQH3k6eCtYKpwUawejiwaQ70fljwPgt0Nzyc2V5e+yaDEaZ2LPBUEhgW+U2ZO84OK L2GSY4qfyiDB6TmxLryD3q5wR4anowrTfCiGwMD9xniWJujJdurHoVZIb+wEmTDXD/rb R/gg== X-Gm-Message-State: ACrzQf3V7Zdu8JY7sHV0gTkkk0Oj/NrnuhVfyDQr3NiFwMByjJYK6vN8 lAIogI6EPlfL/QWKs+tI4aJ0A9FIEbKkeohwxpISk4NE25sfdHkbQUFYOxik+b+bFB5+UO+9F7H MdpWF72xtKY2UY9fsNphoz0B6HsWPDDle6w== X-Received: by 2002:a25:c205:0:b0:6b8:eca8:d97d with SMTP id s5-20020a25c205000000b006b8eca8d97dmr8348651ybf.172.1665987673332; Sun, 16 Oct 2022 23:21:13 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5XFG7fptmSRGP+YyNFMkEcTZzNRxxaaZ06CCMl2Jxso7EheHIJ8N+nUbuVH9dcBlFnYW3nU87KskvrBF8RobA= X-Received: by 2002:a25:c205:0:b0:6b8:eca8:d97d with SMTP id s5-20020a25c205000000b006b8eca8d97dmr8348637ybf.172.1665987673045; Sun, 16 Oct 2022 23:21:13 -0700 (PDT) MIME-Version: 1.0 References: <20221013123649.474497-1-aldyh@redhat.com> In-Reply-To: From: Aldy Hernandez Date: Mon, 17 Oct 2022 08:21:01 +0200 Message-ID: Subject: Re: [PATCH] [PR24021] Implement PLUS_EXPR range-op entry for floats. To: Jakub Jelinek Cc: GCC patches , Andrew MacLeod X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="00000000000073fbf505eb34fb62" X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP 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: --00000000000073fbf505eb34fb62 Content-Type: text/plain; charset="UTF-8" On Thu, Oct 13, 2022 at 7:57 PM Jakub Jelinek wrote: > > On Thu, Oct 13, 2022 at 02:36:49PM +0200, Aldy Hernandez wrote: > > +// Like real_arithmetic, but round the result to INF if the operation > > +// produced inexact results. > > +// > > +// ?? There is still one problematic case, i387. With > > +// -fexcess-precision=standard we perform most SF/DFmode arithmetic in > > +// XFmode (long_double_type_node), so that case is OK. But without > > +// -mfpmath=sse, all the SF/DFmode computations are in XFmode > > +// precision (64-bit mantissa) and only occassionally rounded to > > +// SF/DFmode (when storing into memory from the 387 stack). Maybe > > +// this is ok as well though it is just occassionally more precise. ?? > > + > > +static void > > +frange_arithmetic (enum tree_code code, tree type, > > + REAL_VALUE_TYPE &result, > > + const REAL_VALUE_TYPE &op1, > > + const REAL_VALUE_TYPE &op2, > > + const REAL_VALUE_TYPE &inf) > > +{ > > + REAL_VALUE_TYPE value; > > + enum machine_mode mode = TYPE_MODE (type); > > + bool mode_composite = MODE_COMPOSITE_P (mode); > > + > > + bool inexact = real_arithmetic (&value, code, &op1, &op2); > > + real_convert (&result, mode, &value); > > + > > + // If real_convert above has rounded an inexact value to towards > > + // inf, we can keep the result as is, otherwise we'll adjust by 1 ulp > > + // later (real_nextafter). > > + bool rounding = (flag_rounding_math > > + && (real_isneg (&inf) > > + ? real_less (&result, &value) > > + : !real_less (&value, &result))); > > I thought the agreement during Cauldron was that we'd do this always, > regardless of flag_rounding_math. > Because excess precision (the fast one like on ia32 or -mfpmath=387 on > x86_64), or -frounding-math, or FMA contraction can all increase precision > and worst case it all behaves like -frounding-math for the ranges. > > So, perhaps use: > if ((mode_composite || (real_isneg (&inf) ? real_less (&result, &value) > : !real_less (&value, &result)) > && (inexact || !real_identical (&result, &value)))) Done. > ? > No need to do the real_isneg/real_less stuff for mode_composite, then > we do it always for inexacts, but otherwise we check if the rounding > performed by real.cc has been in the conservative direction (for upper > bound to +inf, for lower bound to -inf), if yes, we don't need to do > anything, if yes, we frange_nextafter. > > As discussed, for mode_composite, I think we want to do the extra > stuff for inexact denormals and otherwise do the nextafter unconditionally, > because our internal mode_composite representation isn't precise enough. > > > + // Be extra careful if there may be discrepancies between the > > + // compile and runtime results. > > + if ((rounding || mode_composite) > > + && (inexact || !real_identical (&result, &value))) > > + { > > + if (mode_composite) > > + { > > + bool denormal = (result.sig[SIGSZ-1] & SIG_MSB) == 0; > > Use real_isdenormal here? Done. > Though, real_iszero needs the same thing. So... real_isdenormal() || real_iszero() as in the attached patch? > > > + if (denormal) > > + { > > + REAL_VALUE_TYPE tmp; > > And explain here why is this, that IBM extended denormals have just > DFmode precision. Done. > Though, now that I think about it, while this is correct for denormals, > > > + real_convert (&tmp, DFmode, &value); > > + frange_nextafter (DFmode, tmp, inf); > > + real_convert (&result, mode, &tmp); > > + } > > there are also the cases where the higher double exponent is in the > [__DBL_MIN_EXP__, __LDBL_MIN_EXP__] aka [-1021, -968] or so. > https://en.wikipedia.org/wiki/Double-precision_floating-point_format > If the upper double is denormal in the DFmode sense, so smaller absolute > value than __DBL_MIN__, then doing nextafter in DFmode is the right thing to > do, the lower double must be always +/- zero. > Now, if the result is __DBL_MIN__, the upper double is already normalized > but we can add __DBL_DENORM_MIN__ to it, which will make the number have > 54-bit precision. > If the result is __DBL_MIN__ * 2, we can again add __DBL_DENORM_MIN__ > and make it 55-bit precision. Etc. until we reach __DBL_MIN__ * 2e53 > where it acts like fully normalized 106-bit precision number. > I must say I'm not really sure what real_nextafter is doing in those cases, > I'm afraid it doesn't handle it correctly but the only other use > of real_nextafter is guarded with: > /* Don't handle composite modes, nor decimal, nor modes without > inf or denorm at least for now. */ > if (format->pnan < format->p > || format->b == 10 > || !format->has_inf > || !format->has_denorm) > return false; Dunno. Is there a conservative thing we can do for mode_composites that aren't denormal or zero? How does this look? Aldy --00000000000073fbf505eb34fb62 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-PR24021-Implement-PLUS_EXPR-range-op-entry-for-float.patch" Content-Disposition: attachment; filename="0001-PR24021-Implement-PLUS_EXPR-range-op-entry-for-float.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l9ce08v10 RnJvbSBkN2JlNmNhZjYwMTMzYmMzOWY4MjI0ZTJmMGUwMGRhYmNkYmJlNTVkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogVGh1LCAxMyBPY3QgMjAyMiAwODoxNDoxNiArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFtQUjI0 MDIxXSBJbXBsZW1lbnQgUExVU19FWFBSIHJhbmdlLW9wIGVudHJ5IGZvciBmbG9hdHMuCgpUaGlz IGlzIHRoZSByYW5nZS1vcCBlbnRyeSBmb3IgZmxvYXRpbmcgcG9pbnQgUExVU19FWFBSLiAgSXQn cyB0aGUKbW9zdCBpbnRyaWNhdGUgcmFuZ2UgZW50cnkgd2UgaGF2ZSBzbyBmYXIsIGJlY2F1c2Ug d2UgbmVlZCB0byBrZWVwCnRyYWNrIG9mIHJvdW5kaW5nIGFuZCB0YXJnZXQgRlAgZm9ybWF0cy4g IFRoaXMgd2lsbCBiZSB0aGUgbGFzdCBGUAplbnRyeSBJIGNvbW1pdCwgbW9zdGx5IHRvIGF2b2lk IGRpc3R1cmJpbmcgdGhlIHRyZWUgYW55IGZ1cnRoZXIsIGFuZAphbHNvIGJlY2F1c2Ugd2hhdCB3 ZSBoYXZlIHNvIGZhciBpcyBlbm91Z2ggZm9yIGEgc29saWQgVlJQLgoKU28gZmFyIHdlIHRyYWNr IE5BTnMgYW5kIHNpZ25zIGNvcnJlY3RseS4gIFdlIGFsc28gaGFuZGxlIHJlbGF0aW9uYWxzCihz eW1ib2xpY3MgYW5kIG51bWVyaWMpLCBib3RoIG9yZGVyZWQgYW5kIHVub3JkZXJlZCwgQUJTX0VY UFIgYW5kCk5FR0FURV9FWFBSIHdoaWNoIGFyZSB1c2VkIHRvIGZvbGQgX19idWlsdGluX2lzaW5m LCBhbmQgX19idWlsdGluX3NpZ24KKF9fYnVpbHRpbl9jb3B5c2lnbiBpcyBjb21pbmcgdXApLiAg QWxsIGluIGFsbCwgSSB0aGluayB0aGlzIHByb3ZpZGUKbW9yZSB0aGFuIGVub3VnaCBmb3IgYmFz aWMgVlJQIG9uIGZsb2F0cywgYXMgd2VsbCBhcyBwcm92aWRlIGEgYmFzaXMKdG8gZmxlc2ggb3V0 IHRoZSByZXN0IGlmIHRoZXJlJ3MgaW50ZXJlc3QuCgpNeSBnb2FsIHdpdGggdGhpcyBlbnRyeSBp cyB0byBwcm92aWRlIGEgdGVtcGxhdGUgZm9yIGFkZGl0aW9uYWwgYmluYXJ5Cm9wZXJhdG9ycywg YXMgdGhleSB0ZW5kIHRvIGZvbGxvdyBhIHNpbWlsYXIgcGF0dGVybjogaGFuZGxlIE5BTnMsIGRv CnRoZSBhcml0aG1ldGljIHdoaWxlIGtlZXBpbmcgdHJhY2sgb2Ygcm91bmRpbmcsIGFuZCBhZGp1 c3QgZm9yIE5BTi4gIEkKbWF5IGFic3RyYWN0IHRoZSBnZW5lcmFsIHBhcnRzIGFzIHdlIGRvIGZv ciBpcmFuZ2UncyBmb2xkX3JhbmdlIGFuZAp3aV9mb2xkLgoKCVBSIHRyZWUtb3B0aW1pemF0aW9u LzI0MDIxCgpnY2MvQ2hhbmdlTG9nOgoKCSogcmFuZ2Utb3AtZmxvYXQuY2MgKHVwZGF0ZV9uYW5f c2lnbik6IE5ldy4KCShwcm9wYWdhdGVfbmFucyk6IE5ldy4KCShmcmFuZ2VfbmV4dGFmdGVyKTog TmV3LgoJKGZyYW5nZV9hcml0aG1ldGljKTogTmV3LgoJKGNsYXNzIGZvcGVyYXRvcl9wbHVzKTog TmV3LgoJKGZsb2F0aW5nX29wX3RhYmxlOjpmbG9hdGluZ19vcF90YWJsZSk6IEFkZCBQTFVTX0VY UFIgZW50cnkuCgpnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoKCgkqIGdjYy5kZy90cmVlLXNzYS92 cnAtZmxvYXQtcGx1cy5jOiBOZXcgdGVzdC4KLS0tCiBnY2MvcmFuZ2Utb3AtZmxvYXQuY2MgICAg ICAgICAgICAgICAgICAgICAgICAgfCAxNjMgKysrKysrKysrKysrKysrKysrCiAuLi4vZ2NjLmRn L3RyZWUtc3NhL3ZycC1mbG9hdC1wbHVzLmMgICAgICAgICAgfCAgMjEgKysrCiAyIGZpbGVzIGNo YW5nZWQsIDE4NCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LXBsdXMuYwoKZGlmZiAtLWdpdCBhL2djYy9yYW5n ZS1vcC1mbG9hdC5jYyBiL2djYy9yYW5nZS1vcC1mbG9hdC5jYwppbmRleCAyM2UwZjVlZjRlMi4u N2ZmZDU3OTVlMTcgMTAwNjQ0Ci0tLSBhL2djYy9yYW5nZS1vcC1mbG9hdC5jYworKysgYi9nY2Mv cmFuZ2Utb3AtZmxvYXQuY2MKQEAgLTIwMCw2ICsyMDAsMTE2IEBAIGZyZWxvcF9lYXJseV9yZXNv bHZlIChpcmFuZ2UgJnIsIHRyZWUgdHlwZSwKIAkgICYmIHJlbG9wX2Vhcmx5X3Jlc29sdmUgKHIs IHR5cGUsIG9wMSwgb3AyLCByZWwsIG15X3JlbCkpOwogfQogCisvLyBJZiBSIGNvbnRhaW5zIGEg TkFOIG9mIHVua25vd24gc2lnbiwgdXBkYXRlIHRoZSBOQU4ncyBzaWduYml0CisvLyBkZXBlbmRp bmcgb24gdHdvIG9wZXJhbmRzLgorCitpbmxpbmUgdm9pZAordXBkYXRlX25hbl9zaWduIChmcmFu Z2UgJnIsIGNvbnN0IGZyYW5nZSAmb3AxLCBjb25zdCBmcmFuZ2UgJm9wMikKK3sKKyAgaWYgKCFy Lm1heWJlX2lzbmFuICgpKQorICAgIHJldHVybjsKKworICBib29sIG9wMV9uYW4gPSBvcDEubWF5 YmVfaXNuYW4gKCk7CisgIGJvb2wgb3AyX25hbiA9IG9wMi5tYXliZV9pc25hbiAoKTsKKyAgYm9v bCBzaWduMSwgc2lnbjI7CisKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoIXIubmFuX3NpZ25iaXRf cCAoc2lnbjEpKTsKKyAgaWYgKG9wMV9uYW4gJiYgb3AyX25hbikKKyAgICB7CisgICAgICBpZiAo b3AxLm5hbl9zaWduYml0X3AgKHNpZ24xKSAmJiBvcDIubmFuX3NpZ25iaXRfcCAoc2lnbjIpKQor CXIudXBkYXRlX25hbiAoc2lnbjEgfCBzaWduMik7CisgICAgfQorICBlbHNlIGlmIChvcDFfbmFu KQorICAgIHsKKyAgICAgIGlmIChvcDEubmFuX3NpZ25iaXRfcCAoc2lnbjEpKQorCXIudXBkYXRl X25hbiAoc2lnbjEpOworICAgIH0KKyAgZWxzZSBpZiAob3AyX25hbikKKyAgICB7CisgICAgICBp ZiAob3AyLm5hbl9zaWduYml0X3AgKHNpZ24yKSkKKwlyLnVwZGF0ZV9uYW4gKHNpZ24yKTsKKyAg ICB9Cit9CisKKy8vIElmIGVpdGhlciBvcGVyYW5kIGlzIGEgTkFOLCBzZXQgUiB0byB0aGUgY29t YmluYXRpb24gb2YgYm90aCBOQU5zCisvLyBzaWdud2lzZSBhbmQgcmV0dXJuIFRSVUUuCisKK2lu bGluZSBib29sCitwcm9wYWdhdGVfbmFucyAoZnJhbmdlICZyLCBjb25zdCBmcmFuZ2UgJm9wMSwg Y29uc3QgZnJhbmdlICZvcDIpCit7CisgIGlmIChvcDEua25vd25faXNuYW4gKCkgfHwgb3AyLmtu b3duX2lzbmFuICgpKQorICAgIHsKKyAgICAgIHIuc2V0X25hbiAob3AxLnR5cGUgKCkpOworICAg ICAgdXBkYXRlX25hbl9zaWduIChyLCBvcDEsIG9wMik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAg ICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gU2V0IFZBTFVFIHRvIGl0cyBuZXh0IHJlYWwg dmFsdWUsIG9yIElORiBpZiB0aGUgb3BlcmF0aW9uIG92ZXJmbG93cy4KKworaW5saW5lIHZvaWQK K2ZyYW5nZV9uZXh0YWZ0ZXIgKGVudW0gbWFjaGluZV9tb2RlIG1vZGUsCisJCSAgUkVBTF9WQUxV RV9UWVBFICZ2YWx1ZSwKKwkJICBjb25zdCBSRUFMX1ZBTFVFX1RZUEUgJmluZikKK3sKKyAgY29u c3QgcmVhbF9mb3JtYXQgKmZtdCA9IFJFQUxfTU9ERV9GT1JNQVQgKG1vZGUpOworICBSRUFMX1ZB TFVFX1RZUEUgdG1wOworICBib29sIG92ZXJmbG93ID0gcmVhbF9uZXh0YWZ0ZXIgKCZ0bXAsIGZt dCwgJnZhbHVlLCAmaW5mKTsKKyAgaWYgKG92ZXJmbG93KQorICAgIHZhbHVlID0gaW5mOworICBl bHNlCisgICAgdmFsdWUgPSB0bXA7Cit9CisKKy8vIExpa2UgcmVhbF9hcml0aG1ldGljLCBidXQg cm91bmQgdGhlIHJlc3VsdCB0byBJTkYgaWYgdGhlIG9wZXJhdGlvbgorLy8gcHJvZHVjZWQgaW5l eGFjdCByZXN1bHRzLgorLy8KKy8vID8/IFRoZXJlIGlzIHN0aWxsIG9uZSBwcm9ibGVtYXRpYyBj YXNlLCBpMzg3LiAgV2l0aAorLy8gLWZleGNlc3MtcHJlY2lzaW9uPXN0YW5kYXJkIHdlIHBlcmZv cm0gbW9zdCBTRi9ERm1vZGUgYXJpdGhtZXRpYyBpbgorLy8gWEZtb2RlIChsb25nX2RvdWJsZV90 eXBlX25vZGUpLCBzbyB0aGF0IGNhc2UgaXMgT0suICBCdXQgd2l0aG91dAorLy8gLW1mcG1hdGg9 c3NlLCBhbGwgdGhlIFNGL0RGbW9kZSBjb21wdXRhdGlvbnMgYXJlIGluIFhGbW9kZQorLy8gcHJl Y2lzaW9uICg2NC1iaXQgbWFudGlzc2EpIGFuZCBvbmx5IG9jY2Fzc2lvbmFsbHkgcm91bmRlZCB0 bworLy8gU0YvREZtb2RlICh3aGVuIHN0b3JpbmcgaW50byBtZW1vcnkgZnJvbSB0aGUgMzg3IHN0 YWNrKS4gIE1heWJlCisvLyB0aGlzIGlzIG9rIGFzIHdlbGwgdGhvdWdoIGl0IGlzIGp1c3Qgb2Nj YXNzaW9uYWxseSBtb3JlIHByZWNpc2UuID8/CisKK3N0YXRpYyB2b2lkCitmcmFuZ2VfYXJpdGht ZXRpYyAoZW51bSB0cmVlX2NvZGUgY29kZSwgdHJlZSB0eXBlLAorCQkgICBSRUFMX1ZBTFVFX1RZ UEUgJnJlc3VsdCwKKwkJICAgY29uc3QgUkVBTF9WQUxVRV9UWVBFICZvcDEsCisJCSAgIGNvbnN0 IFJFQUxfVkFMVUVfVFlQRSAmb3AyLAorCQkgICBjb25zdCBSRUFMX1ZBTFVFX1RZUEUgJmluZikK K3sKKyAgUkVBTF9WQUxVRV9UWVBFIHZhbHVlOworICBlbnVtIG1hY2hpbmVfbW9kZSBtb2RlID0g VFlQRV9NT0RFICh0eXBlKTsKKyAgYm9vbCBtb2RlX2NvbXBvc2l0ZSA9IE1PREVfQ09NUE9TSVRF X1AgKG1vZGUpOworCisgIGJvb2wgaW5leGFjdCA9IHJlYWxfYXJpdGhtZXRpYyAoJnZhbHVlLCBj b2RlLCAmb3AxLCAmb3AyKTsKKyAgcmVhbF9jb252ZXJ0ICgmcmVzdWx0LCBtb2RlLCAmdmFsdWUp OworCisgIC8vIEJlIGV4dHJhIGNhcmVmdWwgaWYgdGhlcmUgbWF5IGJlIGRpc2NyZXBhbmNpZXMg YmV0d2VlbiB0aGUKKyAgLy8gY29tcGlsZSBhbmQgcnVudGltZSByZXN1bHRzLgorICBpZiAoKG1v ZGVfY29tcG9zaXRlIHx8IChyZWFsX2lzbmVnICgmaW5mKSA/IHJlYWxfbGVzcyAoJnJlc3VsdCwg JnZhbHVlKQorCQkJICA6ICFyZWFsX2xlc3MgKCZ2YWx1ZSwgJnJlc3VsdCkpKQorICAgICAgJiYg KGluZXhhY3QgfHwgIXJlYWxfaWRlbnRpY2FsICgmcmVzdWx0LCAmdmFsdWUpKSkKKyAgICB7Cisg ICAgICBpZiAobW9kZV9jb21wb3NpdGUpCisJeworCSAgaWYgKHJlYWxfaXNkZW5vcm1hbCAoJnJl c3VsdCkKKwkgICAgICB8fCByZWFsX2lzemVybyAoJnJlc3VsdCkpCisJICAgIHsKKwkgICAgICAv LyBJQk0gZXh0ZW5kZWQgZGVub3JtYWxzIG9ubHkgaGF2ZSBERm1vZGUgcHJlY2lzaW9uLgorCSAg ICAgIFJFQUxfVkFMVUVfVFlQRSB0bXA7CisJICAgICAgcmVhbF9jb252ZXJ0ICgmdG1wLCBERm1v ZGUsICZ2YWx1ZSk7CisJICAgICAgZnJhbmdlX25leHRhZnRlciAoREZtb2RlLCB0bXAsIGluZik7 CisJICAgICAgcmVhbF9jb252ZXJ0ICgmcmVzdWx0LCBtb2RlLCAmdG1wKTsKKwkgICAgICByZXR1 cm47CisJICAgIH0KKwl9CisgICAgICBmcmFuZ2VfbmV4dGFmdGVyIChtb2RlLCByZXN1bHQsIGlu Zik7CisgICAgfQorfQorCiAvLyBDcm9wIFIgdG8gWy1JTkYsIE1BWF0gd2hlcmUgTUFYIGlzIHRo ZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgbnVtYmVyCiAvLyBmb3IgVFlQRS4KIApAQCAtMTYyMCw2 ICsxNzMwLDU4IEBAIGZvcGVyYXRvcl91bm9yZGVyZWRfZXF1YWw6Om9wMV9yYW5nZSAoZnJhbmdl ICZyLCB0cmVlIHR5cGUsCiAgIHJldHVybiB0cnVlOwogfQogCitjbGFzcyBmb3BlcmF0b3JfcGx1 cyA6IHB1YmxpYyByYW5nZV9vcGVyYXRvcl9mbG9hdAoreworICB1c2luZyByYW5nZV9vcGVyYXRv cl9mbG9hdDo6Zm9sZF9yYW5nZTsKKworcHVibGljOgorICBib29sIGZvbGRfcmFuZ2UgKGZyYW5n ZSAmciwgdHJlZSB0eXBlLAorCQkgICBjb25zdCBmcmFuZ2UgJmxoLAorCQkgICBjb25zdCBmcmFu Z2UgJnJoLAorCQkgICByZWxhdGlvbl9raW5kIHJlbCA9IFZSRUxfVkFSWUlORykgY29uc3QgZmlu YWwgb3ZlcnJpZGU7Cit9IGZvcF9wbHVzOworCitib29sCitmb3BlcmF0b3JfcGx1czo6Zm9sZF9y YW5nZSAoZnJhbmdlICZyLCB0cmVlIHR5cGUsCisJCQkgICAgY29uc3QgZnJhbmdlICZvcDEsIGNv bnN0IGZyYW5nZSAmb3AyLAorCQkJICAgIHJlbGF0aW9uX2tpbmQpIGNvbnN0Cit7CisgIGlmIChl bXB0eV9yYW5nZV92YXJ5aW5nIChyLCB0eXBlLCBvcDEsIG9wMikpCisgICAgcmV0dXJuIHRydWU7 CisgIGlmIChwcm9wYWdhdGVfbmFucyAociwgb3AxLCBvcDIpKQorICAgIHJldHVybiB0cnVlOwor CisgIFJFQUxfVkFMVUVfVFlQRSBsYiwgdWI7CisgIGZyYW5nZV9hcml0aG1ldGljIChQTFVTX0VY UFIsIHR5cGUsIGxiLAorCQkgICAgIG9wMS5sb3dlcl9ib3VuZCAoKSwgb3AyLmxvd2VyX2JvdW5k ICgpLCBkY29uc3RuaW5mKTsKKyAgZnJhbmdlX2FyaXRobWV0aWMgKFBMVVNfRVhQUiwgdHlwZSwg dWIsCisJCSAgICAgb3AxLnVwcGVyX2JvdW5kICgpLCBvcDIudXBwZXJfYm91bmQgKCksIGRjb25z dGluZik7CisKKyAgLy8gSGFuZGxlIHBvc3NpYmxlIE5BTnMgYnkgc2F0dXJhdGluZyB0byB0aGUg YXBwcm9wcmlhdGUgSU5GIGlmIG9ubHkKKyAgLy8gb25lIGVuZCBpcyBhIE5BTi4gIElmIGJvdGgg ZW5kcyBhcmUgYSBOQU4sIGp1c3QgcmV0dXJuIGEgTkFOLgorICBib29sIGxiX25hbiA9IHJlYWxf aXNuYW4gKCZsYik7CisgIGJvb2wgdWJfbmFuID0gcmVhbF9pc25hbiAoJnViKTsKKyAgaWYgKGxi X25hbiAmJiB1Yl9uYW4pCisgICAgeworICAgICAgci5zZXRfbmFuICh0eXBlKTsKKyAgICAgIHJl dHVybiB0cnVlOworICAgIH0KKyAgaWYgKGxiX25hbikKKyAgICBsYiA9IGRjb25zdG5pbmY7Cisg IGVsc2UgaWYgKHViX25hbikKKyAgICB1YiA9IGRjb25zdGluZjsKKworICAvLyBUaGUgc2V0dGVy IHNldHMgTkFOIGJ5IGRlZmF1bHQgZm9yIEhPTk9SX05BTlMuCisgIHIuc2V0ICh0eXBlLCBsYiwg dWIpOworCisgIGlmIChsYl9uYW4gfHwgdWJfbmFuKQorICAgIHVwZGF0ZV9uYW5fc2lnbiAociwg b3AxLCBvcDIpOworICBlbHNlIGlmICghb3AxLm1heWJlX2lzbmFuICgpICYmICFvcDIubWF5YmVf aXNuYW4gKCkpCisgICAgci5jbGVhcl9uYW4gKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKIC8v IEluc3RhbnRpYXRlIGEgcmFuZ2Vfb3BfdGFibGUgZm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlv bnMuCiBzdGF0aWMgZmxvYXRpbmdfb3BfdGFibGUgZ2xvYmFsX2Zsb2F0aW5nX3RhYmxlOwogCkBA IC0xNjUyLDYgKzE4MTQsNyBAQCBmbG9hdGluZ19vcF90YWJsZTo6ZmxvYXRpbmdfb3BfdGFibGUg KCkKIAogICBzZXQgKEFCU19FWFBSLCBmb3BfYWJzKTsKICAgc2V0IChORUdBVEVfRVhQUiwgZm9w X25lZ2F0ZSk7CisgIHNldCAoUExVU19FWFBSLCBmb3BfcGx1cyk7CiB9CiAKIC8vIFJldHVybiBh IHBvaW50ZXIgdG8gdGhlIHJhbmdlX29wZXJhdG9yX2Zsb2F0IGluc3RhbmNlLCBpZiB0aGVyZSBp cwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LXBs dXMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL3ZycC1mbG9hdC1wbHVzLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjM3MzllYTRlODEwCi0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvdnJwLWZsb2F0LXBsdXMu YwpAQCAtMCwwICsxLDIxIEBACisvLyB7IGRnLWRvIGNvbXBpbGUgfQorLy8geyBkZy1vcHRpb25z ICItTzIgLWZuby10cmVlLWZyZSAtZm5vLXRyZWUtZG9taW5hdG9yLW9wdHMgLWZuby10aHJlYWQt anVtcHMgLWZkdW1wLXRyZWUtdnJwMiIgfQorCitkb3VibGUgQkdfU3BsaW5lTGVuZ3RoICgpCit7 CisgIGRvdWJsZSBsYXN0UG9pbnQ7CisgIGRvdWJsZSBpOworCisgIGZvciAoaSA9IDAuMDE7aTw9 MTtpKz0wLjFmKQorICAgIGlmICghKGkgIT0gMC4wKSkKKyAgICAgIHsKKyAgICAgICAgbGFzdFBv aW50ID0gaTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3RQb2ludCA9 IDI7CisgICAgICB9CisgIHJldHVybiBsYXN0UG9pbnQ7Cit9CisKKy8vIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcC10aW1lcyAicmV0dXJuIDJcXC4wZSIgMSAidnJwMiIgfSB9Ci0tIAoyLjM3 LjMKCg== --00000000000073fbf505eb34fb62--