From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vk1-xa43.google.com (mail-vk1-xa43.google.com [IPv6:2607:f8b0:4864:20::a43]) by sourceware.org (Postfix) with ESMTPS id 3F5F43858D37 for ; Tue, 27 Oct 2020 07:50:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 3F5F43858D37 Received: by mail-vk1-xa43.google.com with SMTP id p16so142580vkf.13 for ; Tue, 27 Oct 2020 00:50:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=TKjZ3JmwJgLhy2LTEjzTpXw2FM4Dd+ZNWzf+g/A8NiA=; b=dM/4KHrx15jePVdpZeXNgRsNsg9h3/jqQinIvQOAdUO7t++05jErVE3ue8ohN1BpoW 5FyHcU1ptLp14z2MxU/L2N6RBd3kWouBlaezgOgNqvzRmVHmHBoAY+XiiUVrdO3nRScE trdndydk62gw2bweLcaRKZQJ6Sarza4rNNvgTfGc25bvRXSLyiWQfpq+cACjl/xy+p7b YDjkF0W3JBjz57uEx35mMg5Kwo76je6aPg2acLyJFApG2VVW1wuncejzBf/lEPizeC06 KOkQBkB+y4gjqAAemMvrwwmcYCvZkAt3Dpb/F3/RkdWF94cwQh6vPq+Q1pl5urp8IOcX G3dA== X-Gm-Message-State: AOAM530SdCHHBCPkGHj3C5rjahvDJEy0ApWRFWysQsSUHBKP5EOIePt4 YUyHsHItOGgjro+QjMMzUobg/x3bi8n0SMa3lcVxguyGMi0= X-Google-Smtp-Source: ABdhPJwk9olTtI6IpKRjsz/AXOILiNUOR5+6Zq855m0GjknhaUp7q6rFjcsMHAFnJel6/n5miYjKlxQfGl44pjpi0Og= X-Received: by 2002:a1f:1242:: with SMTP id 63mr402644vks.8.1603785016583; Tue, 27 Oct 2020 00:50:16 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Hongtao Liu Date: Tue, 27 Oct 2020 15:51:53 +0800 Message-ID: Subject: Re: [PATCH] [PR target/97194] [AVX2] Support variable index vec_set. To: GCC Patches , Kirill Yukhin Content-Type: multipart/mixed; boundary="00000000000035cb1a05b2a24ca0" X-Spam-Status: No, score=-8.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Oct 2020 07:50:19 -0000 --00000000000035cb1a05b2a24ca0 Content-Type: text/plain; charset="UTF-8" ping^1 On Tue, Oct 20, 2020 at 3:36 PM Richard Biener wrote: > > On Tue, Oct 20, 2020 at 4:35 AM Hongtao Liu wrote: > > > > On Mon, Oct 19, 2020 at 5:55 PM Richard Biener > > wrote: > > > > > > On Mon, Oct 19, 2020 at 11:37 AM Hongtao Liu wrote: > > > > > > > > On Mon, Oct 19, 2020 at 5:07 PM Richard Biener > > > > wrote: > > > > > > > > > > On Mon, Oct 19, 2020 at 10:21 AM Hongtao Liu wrote: > > > > > > > > > > > > Hi: > > > > > > It's implemented as below: > > > > > > V setg (V v, int idx, T val) > > > > > > > > > > > > { > > > > > > V idxv = (V){idx, idx, idx, idx, idx, idx, idx, idx}; > > > > > > V valv = (V){val, val, val, val, val, val, val, val}; > > > > > > V mask = ((V){0, 1, 2, 3, 4, 5, 6, 7} == idxv); > > > > > > v = (v & ~mask) | (valv & mask); > > > > > > return v; > > > > > > } > > > > > > > > > > > > Bootstrap is fine, regression test for i386/x86-64 backend is ok. > > > > > > Ok for trunk? > > > > > > > > > > Hmm, I guess you're trying to keep the code for !AVX512BW simple > > > > > but isn't just splitting the compare into > > > > > > > > > > clow = {0, 1, 2, 3 ... } == idxv > > > > > chigh = {16, 17, 18, ... } == idxv; > > > > > cmp = {clow, chigh} > > > > > > > > > > > > > We also don't have 512-bits byte/word blend instructions without > > > > TARGET_AVX512W, so how to use 512-bits cmp? > > > > > > Oh, I see. Guess two back-to-back vpternlog could emulate > > > > Yes, we can have something like vpternlogd %zmm0, %zmm1, %zmm2, 0xD8, > > but since we don't have 512-bits bytes/word broadcast instruction, > > It would need 2 broadcast and 1 vec_concat to get 1 512-bits vector. > > it wouldn't save many instructions compared to my version(as below). > > > > --- > > leal -16(%rsi), %eax > > vmovd %edi, %xmm2 > > vmovdqa .LC0(%rip), %ymm4 > > vextracti64x4 $0x1, %zmm0, %ymm3 > > vmovd %eax, %xmm1 > > vpbroadcastw %xmm2, %ymm2 > > vpbroadcastw %xmm1, %ymm1 > > vpcmpeqw %ymm4, %ymm1, %ymm1 > > vpblendvb %ymm1, %ymm2, %ymm3, %ymm3 > > vmovd %esi, %xmm1 > > vpbroadcastw %xmm1, %ymm1 > > vpcmpeqw %ymm4, %ymm1, %ymm1 > > vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 > > vinserti64x4 $0x1, %ymm3, %zmm0, %zmm0 > > --- > > > > > the blend? Not sure if important - I recall only knl didn't have bw? > > > > > > > Yes, after(including) SKX, all avx512 targets will support AVX512BW. > > And i don't think performance for V32HI/V64QI without AVX512BW is important. > > True. > > I have no further comments on the patch then - it still needs i386 maintainer > approval though. > > Thanks, > Richard. > > > > > > > cut from i386-expand.c: > > > > in ix86_expand_sse_movcc > > > > 3682 case E_V64QImode: > > > > 3683 gen = gen_avx512bw_blendmv64qi; ---> TARGET_AVX512BW needed > > > > 3684 break; > > > > 3685 case E_V32HImode: > > > > 3686 gen = gen_avx512bw_blendmv32hi; --> TARGET_AVX512BW needed > > > > 3687 break; > > > > 3688 case E_V16SImode: > > > > 3689 gen = gen_avx512f_blendmv16si; > > > > 3690 break; > > > > 3691 case E_V8DImode: > > > > 3692 gen = gen_avx512f_blendmv8di; > > > > 3693 break; > > > > 3694 case E_V8DFmode: > > > > > > > > > faster, smaller and eventually even easier during expansion? > > > > > > > > > > + gcc_assert (ix86_expand_vector_init_duplicate (false, mode, valv, val)); > > > > > + gcc_assert (ix86_expand_vector_init_duplicate (false, cmp_mode, > > > > > idxv, idx_tmp)); > > > > > > > > > > side-effects in gcc_assert is considered bad style, use > > > > > > > > > > ok = ix86_expand_vector_init_duplicate (false, mode, valv, val); > > > > > gcc_assert (ok); > > > > > > > > > > + vec[5] = constv; > > > > > + ix86_expand_int_vcond (vec); > > > > > > > > > > this also returns a bool you probably should assert true. > > > > > > > > > > > > > Yes, will change. > > > > > > > > > Otherwise thanks for tackling this. > > > > > > > > > > Richard. > > > > > > > > > > > gcc/ChangeLog: > > > > > > > > > > > > PR target/97194 > > > > > > * config/i386/i386-expand.c (ix86_expand_vector_set_var): New function. > > > > > > * config/i386/i386-protos.h (ix86_expand_vector_set_var): New Decl. > > > > > > * config/i386/predicates.md (vec_setm_operand): New predicate, > > > > > > true for const_int_operand or register_operand under TARGET_AVX2. > > > > > > * config/i386/sse.md (vec_set): Support both constant > > > > > > and variable index vec_set. > > > > > > > > > > > > gcc/testsuite/ChangeLog: > > > > > > > > > > > > * gcc.target/i386/avx2-vec-set-1.c: New test. > > > > > > * gcc.target/i386/avx2-vec-set-2.c: New test. > > > > > > * gcc.target/i386/avx512bw-vec-set-1.c: New test. > > > > > > * gcc.target/i386/avx512bw-vec-set-2.c: New test. > > > > > > * gcc.target/i386/avx512f-vec-set-2.c: New test. > > > > > > * gcc.target/i386/avx512vl-vec-set-2.c: New test. > > > > > > > > > > > > -- > > > > > > BR, > > > > > > Hongtao > > > > > > > > > > > > > > > > -- > > > > BR, > > > > Hongtao > > > > > > > > -- > > BR, > > Hongtao -- BR, Hongtao --00000000000035cb1a05b2a24ca0 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Support-variable-index-vec_set-V2.patch" Content-Disposition: attachment; filename="0001-Support-variable-index-vec_set-V2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kgro8rl80 RnJvbSAzYjI0ZTY2ZDg2MWMzODI5MmRhNDNhNTVmNWIyYTUxZDBmODlkMDQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBNb24sIDE5IE9jdCAyMDIwIDE2OjA0OjM5ICswODAwClN1YmplY3Q6IFtQQVRDSF0gU3VwcG9y dCB2YXJpYWJsZSBpbmRleCB2ZWNfc2V0LgoKZ2NjL0NoYW5nZUxvZzoKCglQUiB0YXJnZXQvOTcx OTQKCSogY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYyAoaXg4Nl9leHBhbmRfdmVjdG9yX3NldF92 YXIpOiBOZXcgZnVuY3Rpb24uCgkqIGNvbmZpZy9pMzg2L2kzODYtcHJvdG9zLmggKGl4ODZfZXhw YW5kX3ZlY3Rvcl9zZXRfdmFyKTogTmV3IERlY2wuCgkqIGNvbmZpZy9pMzg2L3ByZWRpY2F0ZXMu bWQgKHZlY19zZXRtX29wZXJhbmQpOiBOZXcgcHJlZGljYXRlLAoJdHJ1ZSBmb3IgY29uc3RfaW50 X29wZXJhbmQgb3IgcmVnaXN0ZXJfb3BlcmFuZCB1bmRlciBUQVJHRVRfQVZYMi4KCSogY29uZmln L2kzODYvc3NlLm1kICh2ZWNfc2V0PG1vZGU+KTogU3VwcG9ydCBib3RoIGNvbnN0YW50CglhbmQg dmFyaWFibGUgaW5kZXggdmVjX3NldC4KCmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOgoKCSogZ2Nj LnRhcmdldC9pMzg2L2F2eDItdmVjLXNldC0xLmM6IE5ldyB0ZXN0LgoJKiBnY2MudGFyZ2V0L2kz ODYvYXZ4Mi12ZWMtc2V0LTIuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvaTM4Ni9hdng1MTJi dy12ZWMtc2V0LTEuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvaTM4Ni9hdng1MTJidy12ZWMt c2V0LTIuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvaTM4Ni9hdng1MTJmLXZlYy1zZXQtMi5j OiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdldC9pMzg2L2F2eDUxMnZsLXZlYy1zZXQtMi5jOiBOZXcg dGVzdC4KLS0tCiBnY2MvY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYyAgICAgICAgICAgICAgICAg fCAxMDYgKysrKysrKysrKysrKysrKysrCiBnY2MvY29uZmlnL2kzODYvaTM4Ni1wcm90b3MuaCAg ICAgICAgICAgICAgICAgfCAgIDEgKwogZ2NjL2NvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQgICAg ICAgICAgICAgICAgIHwgICA2ICsKIGdjYy9jb25maWcvaTM4Ni9zc2UubWQgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgOSArLQogLi4uL2djYy50YXJnZXQvaTM4Ni9hdngyLXZlYy1zZXQtMS5j ICAgICAgICAgIHwgIDQ5ICsrKysrKysrCiAuLi4vZ2NjLnRhcmdldC9pMzg2L2F2eDItdmVjLXNl dC0yLmMgICAgICAgICAgfCAgNTAgKysrKysrKysrCiAuLi4vZ2NjLnRhcmdldC9pMzg2L2F2eDUx MmJ3LXZlYy1zZXQtMS5jICAgICAgfCAgMjAgKysrKwogLi4uL2djYy50YXJnZXQvaTM4Ni9hdng1 MTJidy12ZWMtc2V0LTIuYyAgICAgIHwgIDQ0ICsrKysrKysrCiAuLi4vZ2NjLnRhcmdldC9pMzg2 L2F2eDUxMmYtdmVjLXNldC0yLmMgICAgICAgfCAgNDIgKysrKysrKwogLi4uL2djYy50YXJnZXQv aTM4Ni9hdng1MTJ2bC12ZWMtc2V0LTIuYyAgICAgIHwgIDU1ICsrKysrKysrKwogMTAgZmlsZXMg Y2hhbmdlZCwgMzc5IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAx MDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4Mi12ZWMtc2V0LTEuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDItdmVjLXNl dC0yLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9h dng1MTJidy12ZWMtc2V0LTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L2F2eDUxMmJ3LXZlYy1zZXQtMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEyZi12ZWMtc2V0LTIuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMnZsLXZlYy1zZXQt Mi5jCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYtZXhwYW5kLmMgYi9nY2MvY29u ZmlnL2kzODYvaTM4Ni1leHBhbmQuYwppbmRleCAzZThhZmU2ODNkYy4uZmU0NDlhYzg1NWUgMTAw NjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9pMzg2LWV4cGFuZC5jCisrKyBiL2djYy9jb25maWcv aTM4Ni9pMzg2LWV4cGFuZC5jCkBAIC0xNDIzNSw2ICsxNDIzNSwxMTIgQEAgaXg4Nl9leHBhbmRf dmVjdG9yX2luaXQgKGJvb2wgbW14X29rLCBydHggdGFyZ2V0LCBydHggdmFscykKICAgaXg4Nl9l eHBhbmRfdmVjdG9yX2luaXRfZ2VuZXJhbCAobW14X29rLCBtb2RlLCB0YXJnZXQsIHZhbHMpOwog fQogCisvKiBJbXBsZW1lbnRlZCBhcworICAgViBzZXRnIChWIHYsIGludCBpZHgsIFQgdmFsKQor ICAgeworICAgICBWIGlkeHYgPSAoVil7aWR4LCBpZHgsIGlkeCwgaWR4LCBpZHgsIGlkeCwgaWR4 LCBpZHh9OworICAgICBWIHZhbHYgPSAoVil7dmFsLCB2YWwsIHZhbCwgdmFsLCB2YWwsIHZhbCwg dmFsLCB2YWx9OworICAgICBWIG1hc2sgPSAoKFYpezAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9ID09 IGlkeHYpOworICAgICB2ID0gKHYgJiB+bWFzaykgfCAodmFsdiAmIG1hc2spOworICAgICByZXR1 cm4gdjsKKyAgIH0uICAqLwordm9pZAoraXg4Nl9leHBhbmRfdmVjdG9yX3NldF92YXIgKHJ0eCB0 YXJnZXQsIHJ0eCB2YWwsIHJ0eCBpZHgpCit7CisgIHJ0eCB2ZWNbNjRdOworICBtYWNoaW5lX21v ZGUgbW9kZSA9IEdFVF9NT0RFICh0YXJnZXQpOworICBtYWNoaW5lX21vZGUgY21wX21vZGUgPSBt b2RlOworICBpbnQgbl9lbHRzID0gR0VUX01PREVfTlVOSVRTIChtb2RlKTsKKyAgcnR4IHZhbHYs aWR4dixjb25zdHYsaWR4X3RtcDsKKyAgYm9vbCBvayA9IGZhbHNlOworCisgIC8qIDUxMi1iaXRz IHZlY3RvciBieXRlL3dvcmQgYnJvYWRjYXN0IGFuZCBjb21wYXJpc29uIG9ubHkgYXZhaWxhYmxl CisgICAgIHVuZGVyIFRBUkdFVF9BVlg1MTJCVywgYnJlYWsgNTEyLWJpdHMgdmVjdG9yIGludG8g dHdvIDI1Ni1iaXRzIHZlY3RvcgorICAgICB3aGVuIHdpdGhvdXQgVEFSR0VUX0FWWDUxMkJXLiAg Ki8KKyAgaWYgKChtb2RlID09IFYzMkhJbW9kZSB8fCBtb2RlID09IFY2NFFJbW9kZSkgJiYgIVRB UkdFVF9BVlg1MTJCVykKKyAgICB7CisgICAgICBnY2NfYXNzZXJ0IChUQVJHRVRfQVZYNTEyRik7 CisgICAgICBydHggdmhpLCB2bG8sIGlkeF9oaTsKKyAgICAgIG1hY2hpbmVfbW9kZSBoYWxmX21v ZGU7CisgICAgICBydHggKCpleHRyYWN0X2hpKShydHgsIHJ0eCk7CisgICAgICBydHggKCpleHRy YWN0X2xvKShydHgsIHJ0eCk7CisKKyAgICAgIGlmIChtb2RlID09IFYzMkhJbW9kZSkKKwl7CisJ ICBoYWxmX21vZGUgPSBWMTZISW1vZGU7CisJICBleHRyYWN0X2hpID0gZ2VuX3ZlY19leHRyYWN0 X2hpX3YzMmhpOworCSAgZXh0cmFjdF9sbyA9IGdlbl92ZWNfZXh0cmFjdF9sb192MzJoaTsKKwl9 CisgICAgICBlbHNlCisJeworCSAgaGFsZl9tb2RlID0gVjMyUUltb2RlOworCSAgZXh0cmFjdF9o aSA9IGdlbl92ZWNfZXh0cmFjdF9oaV92NjRxaTsKKwkgIGV4dHJhY3RfbG8gPSBnZW5fdmVjX2V4 dHJhY3RfbG9fdjY0cWk7CisJfQorCisgICAgICB2aGkgPSBnZW5fcmVnX3J0eCAoaGFsZl9tb2Rl KTsKKyAgICAgIHZsbyA9IGdlbl9yZWdfcnR4IChoYWxmX21vZGUpOworICAgICAgaWR4X2hpID0g Z2VuX3JlZ19ydHggKEdFVF9NT0RFIChpZHgpKTsKKyAgICAgIGVtaXRfaW5zbiAoZXh0cmFjdF9o aSAodmhpLCB0YXJnZXQpKTsKKyAgICAgIGVtaXRfaW5zbiAoZXh0cmFjdF9sbyAodmxvLCB0YXJn ZXQpKTsKKyAgICAgIHZlY1swXSA9IGlkeF9oaTsKKyAgICAgIHZlY1sxXSA9IGlkeDsKKyAgICAg IHZlY1syXSA9IEdFTl9JTlQgKG5fZWx0cy8yKTsKKyAgICAgIGl4ODZfZXhwYW5kX2JpbmFyeV9v cGVyYXRvciAoTUlOVVMsIEdFVF9NT0RFIChpZHgpLCB2ZWMpOworICAgICAgaXg4Nl9leHBhbmRf dmVjdG9yX3NldF92YXIgKHZoaSwgdmFsLCBpZHhfaGkpOworICAgICAgaXg4Nl9leHBhbmRfdmVj dG9yX3NldF92YXIgKHZsbywgdmFsLCBpZHgpOworICAgICAgZW1pdF9pbnNuIChnZW5fcnR4X1NF VCAodGFyZ2V0LCBnZW5fcnR4X1ZFQ19DT05DQVQgKG1vZGUsIHZsbywgdmhpKSkpOworICAgICAg cmV0dXJuOworICAgIH0KKworICBpZiAoRkxPQVRfTU9ERV9QIChHRVRfTU9ERV9JTk5FUiAobW9k ZSkpKQorICAgIHsKKyAgICAgIHN3aXRjaCAobW9kZSkKKwl7CisJY2FzZSBFX1YyREZtb2RlOgor CSAgY21wX21vZGUgPSBWMkRJbW9kZTsKKwkgIGJyZWFrOworCWNhc2UgRV9WNERGbW9kZToKKwkg IGNtcF9tb2RlID0gVjRESW1vZGU7CisJICBicmVhazsKKwljYXNlIEVfVjhERm1vZGU6CisJICBj bXBfbW9kZSA9IFY4REltb2RlOworCSAgYnJlYWs7CisJY2FzZSBFX1Y0U0Ztb2RlOgorCSAgY21w X21vZGUgPSBWNFNJbW9kZTsKKwkgIGJyZWFrOworCWNhc2UgRV9WOFNGbW9kZToKKwkgIGNtcF9t b2RlID0gVjhTSW1vZGU7CisJICBicmVhazsKKwljYXNlIEVfVjE2U0Ztb2RlOgorCSAgY21wX21v ZGUgPSBWMTZTSW1vZGU7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZ2NjX3VucmVhY2hhYmxl ICgpOworCX0KKyAgICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbl9lbHRzOyBpKyspCisg ICAgdmVjW2ldID0gR0VOX0lOVCAoaSk7CisgIGNvbnN0diA9IGdlbl9ydHhfQ09OU1RfVkVDVE9S IChjbXBfbW9kZSwgZ2VuX3J0dmVjX3YgKG5fZWx0cywgdmVjKSk7CisgIHZhbHYgPSBnZW5fcmVn X3J0eCAobW9kZSk7CisgIGlkeHYgPSBnZW5fcmVnX3J0eCAoY21wX21vZGUpOworICBpZHhfdG1w ID0gY29udmVydF90b19tb2RlIChHRVRfTU9ERV9JTk5FUiAoY21wX21vZGUpLCBpZHgsIDEpOwor CisgIG9rID0gaXg4Nl9leHBhbmRfdmVjdG9yX2luaXRfZHVwbGljYXRlIChmYWxzZSwgbW9kZSwg dmFsdiwgdmFsKTsKKyAgZ2NjX2Fzc2VydCAob2spOworICBvayA9IGl4ODZfZXhwYW5kX3ZlY3Rv cl9pbml0X2R1cGxpY2F0ZSAoZmFsc2UsIGNtcF9tb2RlLCBpZHh2LCBpZHhfdG1wKTsKKyAgZ2Nj X2Fzc2VydCAob2spOworICB2ZWNbMF0gPSB0YXJnZXQ7CisgIHZlY1sxXSA9IHZhbHY7CisgIHZl Y1syXSA9IHRhcmdldDsKKyAgdmVjWzNdID0gZ2VuX3J0eF9FUSAobW9kZSwgaWR4diwgY29uc3R2 KTsKKyAgdmVjWzRdID0gaWR4djsKKyAgdmVjWzVdID0gY29uc3R2OworICBvayA9IGl4ODZfZXhw YW5kX2ludF92Y29uZCAodmVjKTsKKyAgZ2NjX2Fzc2VydCAob2spOworfQorCiB2b2lkCiBpeDg2 X2V4cGFuZF92ZWN0b3Jfc2V0IChib29sIG1teF9vaywgcnR4IHRhcmdldCwgcnR4IHZhbCwgaW50 IGVsdCkKIHsKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2LXByb3Rvcy5oIGIvZ2Nj L2NvbmZpZy9pMzg2L2kzODYtcHJvdG9zLmgKaW5kZXggYzViNzAwZWZkMGUuLjdhMWRjM2Q0ZDY0 IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni1wcm90b3MuaAorKysgYi9nY2MvY29u ZmlnL2kzODYvaTM4Ni1wcm90b3MuaApAQCAtMjQyLDYgKzI0Miw3IEBAIGV4dGVybiBydHggaXg4 Nl9yZXdyaXRlX3Rsc19hZGRyZXNzIChydHgpOwogCiBleHRlcm4gdm9pZCBpeDg2X2V4cGFuZF92 ZWN0b3JfaW5pdCAoYm9vbCwgcnR4LCBydHgpOwogZXh0ZXJuIHZvaWQgaXg4Nl9leHBhbmRfdmVj dG9yX3NldCAoYm9vbCwgcnR4LCBydHgsIGludCk7CitleHRlcm4gdm9pZCBpeDg2X2V4cGFuZF92 ZWN0b3Jfc2V0X3ZhciAocnR4LCBydHgsIHJ0eCk7CiBleHRlcm4gdm9pZCBpeDg2X2V4cGFuZF92 ZWN0b3JfZXh0cmFjdCAoYm9vbCwgcnR4LCBydHgsIGludCk7CiBleHRlcm4gdm9pZCBpeDg2X2V4 cGFuZF9yZWR1YyAocnR4ICgqKShydHgsIHJ0eCwgcnR4KSwgcnR4LCBydHgpOwogCmRpZmYgLS1n aXQgYS9nY2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZCBiL2djYy9jb25maWcvaTM4Ni9wcmVk aWNhdGVzLm1kCmluZGV4IGJlNTdjZGFmNzY4Li5kMmEyZWVjZTAyYiAxMDA2NDQKLS0tIGEvZ2Nj L2NvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L3ByZWRpY2F0 ZXMubWQKQEAgLTEwMjMsNiArMTAyMywxMiBAQCAoZGVmaW5lX3ByZWRpY2F0ZSAiaW5jZGVjX29w ZXJhbmQiCiAgIHJldHVybiBvcCA9PSBjb25zdDFfcnR4IHx8IG9wID09IGNvbnN0bTFfcnR4Owog fSkKIAorOzsgVHJ1ZSBmb3IgcmVnaXN0ZXJzLCBvciBjb25zdF9pbnRfb3BlcmFuZCwgdXNlZCB0 byB2ZWNfc2V0bSBleHBhbmRlci4KKyhkZWZpbmVfcHJlZGljYXRlICJ2ZWNfc2V0bV9vcGVyYW5k IgorICAoaW9yIChhbmQgKG1hdGNoX29wZXJhbmQgMCAicmVnaXN0ZXJfb3BlcmFuZCIpCisJICAg IChtYXRjaF90ZXN0ICJUQVJHRVRfQVZYMiIpKQorICAgICAgIChtYXRjaF9jb2RlICJjb25zdF9p bnQiKSkpCisKIDs7IFRydWUgZm9yIHJlZ2lzdGVycywgb3IgMSBvciAtMS4gIFVzZWQgdG8gb3B0 aW1pemUgZG91YmxlLXdvcmQgc2hpZnRzLgogKGRlZmluZV9wcmVkaWNhdGUgInJlZ19vcl9wbTFf b3BlcmFuZCIKICAgKGlvciAobWF0Y2hfb3BlcmFuZCAwICJyZWdpc3Rlcl9vcGVyYW5kIikKZGlm ZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9zc2UubWQgYi9nY2MvY29uZmlnL2kzODYvc3NlLm1k CmluZGV4IDUyNjM1ZjZiYzA4Li4zNWE2NGI3YjMzMyAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9p Mzg2L3NzZS5tZAorKysgYi9nY2MvY29uZmlnL2kzODYvc3NlLm1kCkBAIC04MDg1LDExICs4MDg1 LDE0IEBAIChkZWZpbmVfaW5zbiAidmVjX3NldHYyZGZfMCIKIChkZWZpbmVfZXhwYW5kICJ2ZWNf c2V0PG1vZGU+IgogICBbKG1hdGNoX29wZXJhbmQ6ViAwICJyZWdpc3Rlcl9vcGVyYW5kIikKICAg IChtYXRjaF9vcGVyYW5kOjxzc2VzY2FsYXJtb2RlPiAxICJyZWdpc3Rlcl9vcGVyYW5kIikKLSAg IChtYXRjaF9vcGVyYW5kIDIgImNvbnN0X2ludF9vcGVyYW5kIildCisgICAobWF0Y2hfb3BlcmFu ZCAyICJ2ZWNfc2V0bV9vcGVyYW5kIildCiAgICJUQVJHRVRfU1NFIgogewotICBpeDg2X2V4cGFu ZF92ZWN0b3Jfc2V0IChmYWxzZSwgb3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFdLAotCQkJICBJTlRW QUwgKG9wZXJhbmRzWzJdKSk7CisgIGlmIChDT05TVF9JTlRfUCAob3BlcmFuZHNbMl0pKQorICAg IGl4ODZfZXhwYW5kX3ZlY3Rvcl9zZXQgKGZhbHNlLCBvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0s CisJCQkgICAgSU5UVkFMIChvcGVyYW5kc1syXSkpOworICBlbHNlCisgICAgaXg4Nl9leHBhbmRf dmVjdG9yX3NldF92YXIgKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pOwog ICBET05FOwogfSkKIApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv YXZ4Mi12ZWMtc2V0LTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDItdmVj LXNldC0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjRjMTZlYzVk ZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4 Mi12ZWMtc2V0LTEuYwpAQCAtMCwwICsxLDQ5IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLwor LyogeyBkZy1vcHRpb25zICItbWF2eDIgLU8yIC1tbm8tYXZ4NTEyZiIgfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHsoP24pdnBjbXBlcVtid2RxXX0gMTIgfSB9ICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgeyg/bil2cD9ibGVuZHZ9IDEy IH0gfSAqLworCit0eXBlZGVmIGNoYXIgdjMycWkgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXpl ICgzMikpKTsKK3R5cGVkZWYgY2hhciB2MTZxaSBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUg KDE2KSkpOworCit0eXBlZGVmIHNob3J0IHYxNmhpIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6 ZSAoMzIpKSk7Cit0eXBlZGVmIHNob3J0IHY4aGkgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXpl ICgxNikpKTsKKwordHlwZWRlZiBpbnQgdjhzaSBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUg KDMyKSkpOwordHlwZWRlZiBpbnQgdjRzaSBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2 KSkpOworCit0eXBlZGVmIGxvbmcgbG9uZyB2NGRpIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6 ZSAoMzIpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyB2MmRpIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jf c2l6ZSAoMTYpKSk7CisKK3R5cGVkZWYgZmxvYXQgdjhzZiBfX2F0dHJpYnV0ZV9fICgodmVjdG9y X3NpemUgKDMyKSkpOwordHlwZWRlZiBmbG9hdCB2NHNmIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jf c2l6ZSAoMTYpKSk7CisKK3R5cGVkZWYgZG91YmxlIHY0ZGYgX19hdHRyaWJ1dGVfXyAoKHZlY3Rv cl9zaXplICgzMikpKTsKK3R5cGVkZWYgZG91YmxlIHYyZGYgX19hdHRyaWJ1dGVfXyAoKHZlY3Rv cl9zaXplICgxNikpKTsKKworI2RlZmluZSBGT08oVlRZUEUsIFRZUEUpCQkJXAorICBWVFlQRQkJ CQkJCVwKKyAgX19hdHRyaWJ1dGVfXyAoKG5vaXBhKSkJCQlcCisgIGZvb18jI1ZUWVBFIChWVFlQ RSBhLCBUWVBFIGIsIHVuc2lnbmVkIGludCBjKQlcCisgIHsJCQkJCQlcCisgICAgYVtjXSA9IGI7 CQkJCQlcCisgICAgcmV0dXJuIGE7CQkJCQlcCisgIH0JCQkJCQlcCisKK0ZPTyAodjE2cWksIGNo YXIpOworRk9PICh2MzJxaSwgY2hhcik7CisKK0ZPTyAodjhoaSwgc2hvcnQpOworRk9PICh2MTZo aSwgc2hvcnQpOworCitGT08gKHY0c2ksIGludCk7CitGT08gKHY4c2ksIGludCk7CisKK0ZPTyAo djJkaSwgbG9uZyBsb25nKTsKK0ZPTyAodjRkaSwgbG9uZyBsb25nKTsKKworRk9PICh2NHNmLCBm bG9hdCk7CitGT08gKHY4c2YsIGZsb2F0KTsKKworRk9PICh2MmRmLCBkb3VibGUpOworRk9PICh2 NGRmLCBkb3VibGUpOwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv YXZ4Mi12ZWMtc2V0LTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDItdmVj LXNldC0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjkwODZlZjQw NmYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4 Mi12ZWMtc2V0LTIuYwpAQCAtMCwwICsxLDUwIEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7 IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhdngyIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LU8yIC1tYXZ4MiIgfSAqLworCisKKyNpZm5kZWYgQ0hFQ0sKKyNkZWZpbmUgQ0hFQ0sgImF2eDIt Y2hlY2suaCIKKyNlbmRpZgorCisjaWZuZGVmIFRFU1QKKyNkZWZpbmUgVEVTVCBhdngyX3Rlc3QK KyNlbmRpZgorCisjaW5jbHVkZSBDSEVDSworCisjaW5jbHVkZSAiYXZ4Mi12ZWMtc2V0LTEuYyIK KworI2RlZmluZSBDQUxDX1RFU1QodnR5cGUsIHR5cGUsIE4sIGlkeCkJCQkJXAorZG8JCQkJCQkJ CVwKKyAgewkJCQkJCQkJXAorICAgIGludCBpLHZhbCA9IGlkeCAqIGlkeCAtIGlkeCAqIDMgKyAx NjsJCQlcCisgICAgdHlwZSByZXNbTl0sZXhwW05dOwkJCQkJCVwKKyAgICB2dHlwZSByZXN2OwkJ CQkJCQlcCisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykJCQkJCVwKKyAgICAgIHsJCQkJCQkJ CVwKKwlyZXNbaV0gPSBpICogaSAtIGkgKiAzICsgMTU7CQkJCVwKKwlleHBbaV0gPSByZXNbaV07 CQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgICAgZXhwW2lkeF0gPSB2YWw7CQkJCQkJXAorICAg IHJlc3YgPSBmb29fIyN2dHlwZSAoKih2dHlwZSAqKSZyZXNbMF0sIHZhbCwgaWR4KTsJCVwKKyAg ICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCWlmIChy ZXN2W2ldICE9IGV4cFtpXSkJCQkJCVwKKwkgIGFib3J0ICgpOwkJCQkJCVwKKyAgICAgIH0JCQkJ CQkJCVwKKyAgfQkJCQkJCQkJXAord2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCitURVNUICh2b2lk KQoreworICBDQUxDX1RFU1QgKHYzMnFpLCBjaGFyLCAzMiwgMTcpOworICBDQUxDX1RFU1QgKHYx NnFpLCBjaGFyLCAxNiwgNSk7CisgIENBTENfVEVTVCAodjE2aGksIHNob3J0LCAxNiwgOSk7Cisg IENBTENfVEVTVCAodjhoaSwgc2hvcnQsIDgsIDYpOworICBDQUxDX1RFU1QgKHY4c2ksIGludCwg OCwgMyk7CisgIENBTENfVEVTVCAodjRzaSwgaW50LCA0LCAyKTsKKyAgQ0FMQ19URVNUICh2NGRp LCBsb25nIGxvbmcsIDQsIDEpOworICBDQUxDX1RFU1QgKHYyZGksIGxvbmcgbG9uZywgMiwgMCk7 Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJidy12 ZWMtc2V0LTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmJ3LXZlYy1z ZXQtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41Y2ZiYzg1NzMy ZQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUx MmJ3LXZlYy1zZXQtMS5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICov CisvKiB7IGRnLW9wdGlvbnMgIi1tYXZ4NTEydmwgLW1hdng1MTJidyAtTzIiIH0gKi8KKy8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7KD9uKSg/OnZwP2Jyb2FkY2FzdHx2bW92 ZGR1cCl9IDM2IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHso P24pdnBjbXBbYndkcV1bIFx0XStcJDB9IDE4IH0gfSAqLworCit0eXBlZGVmIGNoYXIgdjY0cWkg X19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg2NCkpKTsKK3R5cGVkZWYgc2hvcnQgdjMyaGkg X19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg2NCkpKTsKK3R5cGVkZWYgaW50IHYxNnNpIF9f YXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNjQpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyB2OGRp IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNjQpKSk7Cit0eXBlZGVmIGZsb2F0IHYxNnNm IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNjQpKSk7Cit0eXBlZGVmIGRvdWJsZSB2OGRm IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNjQpKSk7CisKKyNpbmNsdWRlICJhdngyLXZl Yy1zZXQtMS5jIgorCitGT08gKHY2NHFpLCBjaGFyKTsKK0ZPTyAodjMyaGksIHNob3J0KTsKK0ZP TyAodjE2c2ksIGludCk7CitGT08gKHY4ZGksIGxvbmcgbG9uZyk7CitGT08gKHYxNnNmLCBmbG9h dCk7CitGT08gKHY4ZGYsIGRvdWJsZSk7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9hdng1MTJidy12ZWMtc2V0LTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L2F2eDUxMmJ3LXZlYy1zZXQtMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwLi4yMmU2NDE4M2ViZAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L2F2eDUxMmJ3LXZlYy1zZXQtMi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8q IHsgZGctZG8gcnVuIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGF2eDUx MmJ3IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tYXZ4NTEyYnciIH0gKi8KKworCisjaWZu ZGVmIENIRUNLCisjZGVmaW5lIENIRUNLICJhdng1MTJmLWNoZWNrLmgiCisjZW5kaWYKKworI2Rl ZmluZSBBVlg1MTJCVworCisjaW5jbHVkZSBDSEVDSworCisjaW5jbHVkZSAiYXZ4NTEyYnctdmVj LXNldC0xLmMiCisKKyNkZWZpbmUgQ0FMQ19URVNUKHZ0eXBlLCB0eXBlLCBOLCBpZHgpCQkJCVwK K2RvCQkJCQkJCQlcCisgIHsJCQkJCQkJCVwKKyAgICBpbnQgaSx2YWwgPSBpZHggKiBpZHggLSBp ZHggKiAzICsgMTY7CQkJXAorICAgIHR5cGUgcmVzW05dLGV4cFtOXTsJCQkJCQlcCisgICAgdnR5 cGUgcmVzdjsJCQkJCQkJXAorICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCQkJCQlcCisgICAg ICB7CQkJCQkJCQlcCisJcmVzW2ldID0gaSAqIGkgLSBpICogMyArIDE1OwkJCQlcCisJZXhwW2ld ID0gcmVzW2ldOwkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICAgIGV4cFtpZHhdID0gdmFsOwkJ CQkJCVwKKyAgICByZXN2ID0gZm9vXyMjdnR5cGUgKCoodnR5cGUgKikmcmVzWzBdLCB2YWwsIGlk eCk7CQlcCisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykJCQkJCVwKKyAgICAgIHsJCQkJCQkJ CVwKKwlpZiAocmVzdltpXSAhPSBleHBbaV0pCQkJCQlcCisJICBhYm9ydCAoKTsJCQkJCQlcCisg ICAgICB9CQkJCQkJCQlcCisgIH0JCQkJCQkJCVwKK3doaWxlICgwKQorCitzdGF0aWMgdm9pZAor dGVzdF81MTIgKHZvaWQpCit7CisgIENBTENfVEVTVCAodjY0cWksIGNoYXIsIDY0LCA1MCk7Cisg IENBTENfVEVTVCAodjMyaGksIHNob3J0LCAzMiwgMzApOworICBDQUxDX1RFU1QgKHYxNnNpLCBp bnQsIDE2LCAxNSk7CisgIENBTENfVEVTVCAodjhkaSwgbG9uZyBsb25nLCA4LCA3KTsKK30KZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmYtdmVjLXNldC0y LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJmLXZlYy1zZXQtMi5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi44ZjJhYTAzZWMxMQotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmYtdmVjLXNl dC0yLmMKQEAgLTAsMCArMSw0MiBAQAorLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXZ4NTEyZiB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAt bWF2eDUxMmYgLW1uby1hdng1MTJidyIgfSAqLworCisKKyNpZm5kZWYgQ0hFQ0sKKyNkZWZpbmUg Q0hFQ0sgImF2eDUxMmYtY2hlY2suaCIKKyNlbmRpZgorCisjZGVmaW5lIEFWWDUxMkYKKworI2lu Y2x1ZGUgQ0hFQ0sKKworI2luY2x1ZGUgImF2eDUxMmJ3LXZlYy1zZXQtMS5jIgorCisjZGVmaW5l IENBTENfVEVTVCh2dHlwZSwgdHlwZSwgTiwgaWR4KQkJCQlcCitkbwkJCQkJCQkJXAorICB7CQkJ CQkJCQlcCisgICAgaW50IGksdmFsID0gaWR4ICogaWR4IC0gaWR4ICogMyArIDE2OwkJCVwKKyAg ICB0eXBlIHJlc1tOXSxleHBbTl07CQkJCQkJXAorICAgIHZ0eXBlIHJlc3Y7CQkJCQkJCVwKKyAg ICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCXJlc1tp XSA9IGkgKiBpIC0gaSAqIDMgKyAxNTsJCQkJXAorCWV4cFtpXSA9IHJlc1tpXTsJCQkJCVwKKyAg ICAgIH0JCQkJCQkJCVwKKyAgICBleHBbaWR4XSA9IHZhbDsJCQkJCQlcCisgICAgcmVzdiA9IGZv b18jI3Z0eXBlICgqKHZ0eXBlICopJnJlc1swXSwgdmFsLCBpZHgpOwkJXAorICAgIGZvciAoaSA9 IDA7IGkgPCBOOyBpKyspCQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJaWYgKHJlc3ZbaV0gIT0g ZXhwW2ldKQkJCQkJXAorCSAgYWJvcnQgKCk7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICB9 CQkJCQkJCQlcCit3aGlsZSAoMCkKKworc3RhdGljIHZvaWQKK3Rlc3RfNTEyICh2b2lkKQorewor ICBDQUxDX1RFU1QgKHY2NHFpLCBjaGFyLCA2NCwgNTApOworICBDQUxDX1RFU1QgKHYzMmhpLCBz aG9ydCwgMzIsIDMwKTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9p Mzg2L2F2eDUxMnZsLXZlYy1zZXQtMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv YXZ4NTEydmwtdmVjLXNldC0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLjRmMzI3NDI3YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvYXZ4NTEydmwtdmVjLXNldC0yLmMKQEAgLTAsMCArMSw1NSBAQAorLyogeyBkZy1k byBydW4gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXZ4NTEyYncgfSAq LworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXZ4NTEydmwgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzIgLW1hdng1MTJidyAtbWF2eDUxMnZsIiB9ICovCisKKworI2lmbmRlZiBD SEVDSworI2RlZmluZSBDSEVDSyAiYXZ4NTEyZi1jaGVjay5oIgorI2VuZGlmCisKKyNkZWZpbmUg QVZYNTEyVkwKKyNkZWZpbmUgQVZYNTEyQlcKKworI2luY2x1ZGUgQ0hFQ0sKKworI2luY2x1ZGUg ImF2eDUxMmJ3LXZlYy1zZXQtMS5jIgorCisjZGVmaW5lIENBTENfVEVTVCh2dHlwZSwgdHlwZSwg TiwgaWR4KQkJCQlcCitkbwkJCQkJCQkJXAorICB7CQkJCQkJCQlcCisgICAgaW50IGksdmFsID0g aWR4ICogaWR4IC0gaWR4ICogMyArIDE2OwkJCVwKKyAgICB0eXBlIHJlc1tOXSxleHBbTl07CQkJ CQkJXAorICAgIHZ0eXBlIHJlc3Y7CQkJCQkJCVwKKyAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsr KQkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCXJlc1tpXSA9IGkgKiBpIC0gaSAqIDMgKyAxNTsJ CQkJXAorCWV4cFtpXSA9IHJlc1tpXTsJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgICBleHBb aWR4XSA9IHZhbDsJCQkJCQlcCisgICAgcmVzdiA9IGZvb18jI3Z0eXBlICgqKHZ0eXBlICopJnJl c1swXSwgdmFsLCBpZHgpOwkJXAorICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCQkJCQlcCisg ICAgICB7CQkJCQkJCQlcCisJaWYgKHJlc3ZbaV0gIT0gZXhwW2ldKQkJCQkJXAorCSAgYWJvcnQg KCk7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICB9CQkJCQkJCQlcCit3aGlsZSAoMCkKKwor c3RhdGljIHZvaWQKK3Rlc3RfMjU2ICh2b2lkKQoreworICBDQUxDX1RFU1QgKHYzMnFpLCBjaGFy LCAzMiwgMTcpOworICBDQUxDX1RFU1QgKHYxNmhpLCBzaG9ydCwgMTYsIDkpOworICBDQUxDX1RF U1QgKHY4c2ksIGludCwgOCwgMyk7CisgIENBTENfVEVTVCAodjRkaSwgbG9uZyBsb25nLCA0LCAx KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfMTI4ICh2b2lkKQoreworICBDQUxDX1RFU1QgKHYx NnFpLCBjaGFyLCAxNiwgNSk7CisgIENBTENfVEVTVCAodjhoaSwgc2hvcnQsIDgsIDYpOworICBD QUxDX1RFU1QgKHY0c2ksIGludCwgNCwgMik7CisgIENBTENfVEVTVCAodjJkaSwgbG9uZyBsb25n LCAyLCAwKTsKK30KLS0gCjIuMTguMQoK --00000000000035cb1a05b2a24ca0--