From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yb1-xb30.google.com (mail-yb1-xb30.google.com [IPv6:2607:f8b0:4864:20::b30]) by sourceware.org (Postfix) with ESMTPS id 2F6053857C74 for ; Mon, 5 Feb 2024 19:08:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2F6053857C74 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 2F6053857C74 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::b30 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707160104; cv=none; b=a0Js3XkTKAZ91D9NClH9wtGB57QWxBQLMGb0dvkJSULs8aOSlkwuaXgO1IB1atKjWywuTCUOzAmAZDWure3MVm8nyZuP85rDg+EPq79bCI8+8s7k1LE4zy1xu5mUTQ3klzWNyhijfSUpTh8P1PFDacb9n+dAD5kPNJXuF1SInbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707160104; c=relaxed/simple; bh=x89cyG/5c3KTuvDklJpbDKZr2oWLe1ayjRpbv/bjLdU=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=jG0tQ8eCuSZj2gOtSbYkPRycrk7Ntl//FuhTjPbw46A8fwf0WaqBpGwmBTJnXXhTtQhHC6aDDdPY5mSzBYpQVd/yeU6ZyCba/1VQwZoBcd51xjYe0rcRUeW30nkgjHVCvuY4VXBnPJfY/bHQXZxp76AXm2iMGIlPhYc3iIIIpV8= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-yb1-xb30.google.com with SMTP id 3f1490d57ef6-dc6d94b9961so4620341276.3 for ; Mon, 05 Feb 2024 11:08:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707160101; x=1707764901; darn=gcc.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Q7Yx7jP2GP7POXcc4leBN7h+qXR5LH9x5uEAGz4bFLw=; b=EI2oaM6ojt+D5+RX+PhKm50MRtJP6PHFAKa17Sqt71YikrCaGGx3i/yMaJo+89ghAU KuarPfoX2nqieYywAMf8CLZEyTKsHp22J/PvyJQZoSiDV3h9cucaTIyTXAe4H9C1fWQS k9YFTXvqftfgxo+m4SebvwVgZK+nWt9/U57DiKSpVBHdok5qtrv7iUkdKX/aurUGdfbV 70P29EK/IjLZe8KuCEQWOU46sPz0rgyNNBQXNUGnTFwmV8350P4bde+nirvLxQlFknwU rZ67MLxgvQ0EfM8DFCrhcH1jxsyx5FAYVNJUG7uonU/rCLId2jltRJMvY99x91bJfqsD CaMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707160101; x=1707764901; 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=Q7Yx7jP2GP7POXcc4leBN7h+qXR5LH9x5uEAGz4bFLw=; b=YZe9vrB9a0QgzvvnY6e7b0iZcqYg4Mt+z4WFrKBaJGVf4mPt+KIx7aQgXiGCgBr/8o jndZj+DJKXwZHeW/uc033mORv1ArVXDryHU7qg2n+q6lP2PfNiEdkYlTp6J7l+/tvMSp TyVIEd+iGwtdXHivKWIlXKf1cDoFFIndqp9oOUzJIi3e6hclIqoLmY/77SRkm9L+uQqc KBei8uXXDNQD4sqUee0/RCjiA7ytF0br8Jf77gGz1WKuq22i80jayFWN7tW3CKu4DY4b KinI8Gl7cljqbKnXJFneSNAG+sfhbEMWGfu60hKG+DDtSTnUtSSOlUBMTD4G69cAcePQ jnfA== X-Gm-Message-State: AOJu0YxKonh3UC6DGGGGyRBMYfgugCDIVNIZcw3K43ZHbWfvyF6c6TUF JY+e5OvrU4XXsT+7059lR3V33Q1b0+2Yq4AXIaIZoqzCZ1Qi/hcQ/vQbdeN2ceyDPQkVurzDiGs 2RC2PANONrVq2Ubj0e0xuAXFzkF0= X-Google-Smtp-Source: AGHT+IEB4jSI6jBM1oBF7o/Zv5EryzM6t3AKq9v2i+gDmJeZ1VU0c4Waqa3P7tJQrfXOqOoaQ7AKM3+LTYgcErFajs8= X-Received: by 2002:a25:ae27:0:b0:dc2:3b5f:b80 with SMTP id a39-20020a25ae27000000b00dc23b5f0b80mr314567ybj.44.1707160101421; Mon, 05 Feb 2024 11:08:21 -0800 (PST) MIME-Version: 1.0 References: <20240205164329.60300-1-hjl.tools@gmail.com> In-Reply-To: From: "H.J. Lu" Date: Mon, 5 Feb 2024 11:07:45 -0800 Message-ID: Subject: Re: [PATCH v6] x86-64: Find a scratch register for large model profiling To: Uros Bizjak Cc: gcc-patches@gcc.gnu.org, jakub@redhat.com, rep.dot.nop@gmail.com Content-Type: multipart/mixed; boundary="0000000000006ba0920610a72f88" X-Spam-Status: No, score=-3020.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE 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: --0000000000006ba0920610a72f88 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Feb 5, 2024 at 10:01=E2=80=AFAM Uros Bizjak wro= te: > > On Mon, Feb 5, 2024 at 5:43=E2=80=AFPM H.J. Lu wrot= e: > > > > Changes in v6: > > > > 1. Use ix86_save_reg and accessible_reg_set in > > x86_64_select_profile_regnum. > > 2. Construct a complete reg name in x86_function_profiler. > > > > Changes in v5: > > > > 1. Add pr113689-3.c. > > 2. Use %r10 if ix86_profile_before_prologue () return true. > > 3. Try a callee-saved register which has been saved on stack in the > > prologue. > > > > Changes in v4: > > > > 1. Remove pr113689-3.c. > > 2. Use df_get_live_out. > > > > Changes in v3: > > > > 1. Remove r10_ok. > > > > Changes in v2: > > > > 1. Add int_parameter_registers to machine_function to track integer > > registers used for parameter passing. > > 2. Update x86_64_select_profile_regnum to try %r10 first and use an > > caller-saved register, which isn't used for parameter passing. > > > > --- > > 2 scratch registers, %r10 and %r11, are available at function entry for > > large model profiling. But %r10 may be used by stack realignment and w= e > > can't use %r10 in this case. Add x86_64_select_profile_regnum to find > > a caller-saved register which isn't live or a callee-saved register > > which has been saved on stack in the prologue at entry for large model > > profiling and sorry if we can't find one. > > > > gcc/ > > > > PR target/113689 > > * config/i386/i386.cc (x86_64_select_profile_regnum): New. > > (x86_function_profiler): Call x86_64_select_profile_regnum to > > get a scratch register for large model profiling. > > > > gcc/testsuite/ > > > > PR target/113689 > > * gcc.target/i386/pr113689-1.c: New file. > > * gcc.target/i386/pr113689-2.c: Likewise. > > * gcc.target/i386/pr113689-3.c: Likewise. > > --- > > gcc/config/i386/i386.cc | 91 ++++++++++++++++++---- > > gcc/testsuite/gcc.target/i386/pr113689-1.c | 49 ++++++++++++ > > gcc/testsuite/gcc.target/i386/pr113689-2.c | 41 ++++++++++ > > gcc/testsuite/gcc.target/i386/pr113689-3.c | 48 ++++++++++++ > > 4 files changed, 214 insertions(+), 15 deletions(-) > > create mode 100644 gcc/testsuite/gcc.target/i386/pr113689-1.c > > create mode 100644 gcc/testsuite/gcc.target/i386/pr113689-2.c > > create mode 100644 gcc/testsuite/gcc.target/i386/pr113689-3.c > > > > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > > index b3e7c74846e..08aad32af85 100644 > > --- a/gcc/config/i386/i386.cc > > +++ b/gcc/config/i386/i386.cc > > @@ -22749,6 +22749,48 @@ current_fentry_section (const char **name) > > return true; > > } > > > > +/* Return a caller-saved register which isn't live or a callee-saved > > + register which has been saved on stack in the prologue at entry for > > + profile. */ > > + > > +static int > > +x86_64_select_profile_regnum (bool r11_ok ATTRIBUTE_UNUSED) > > +{ > > + /* Use %r10 if the profiler is emitted before the prologue or it isn= 't > > + used by DRAP. */ > > + if (ix86_profile_before_prologue () > > + || !crtl->drap_reg > > + || REGNO (crtl->drap_reg) !=3D R10_REG) > > + return R10_REG; > > + > > + /* The profiler is emitted after the prologue. If there is a > > + caller-saved register which isn't live or a callee-saved > > + register saved on stack in the prologue, use it. */ > > + > > + bitmap reg_live =3D df_get_live_out (ENTRY_BLOCK_PTR_FOR_FN (cfun)); > > + > > + int i; > > + for (i =3D 0; i < FIRST_PSEUDO_REGISTER; i++) > > + if (GENERAL_REGNO_P (i) > > + && i !=3D R10_REG > > +#ifdef NO_PROFILE_COUNTERS > > + && (r11_ok || i !=3D R11_REG) > > +#else > > + && i !=3D R11_REG > > +#endif > > + && TEST_HARD_REG_BIT (accessible_reg_set, i) > > + && !fixed_regs[i] > > + && (ix86_save_reg (i, true, true) > > + || (call_used_regs[i] > > + && !REGNO_REG_SET_P (reg_live, i)))) > > + return i; > > ix86_save_reg will never save fixed regs, so the above can be optimized a= bit: > > && TEST_HARD_REG_BIT (accessible_reg_set, i) > && (ix86_save_reg (i, true, true) > || (call_used_regs[i] && !fixed_regs[i] > && !REGNO_REG_SET_P (reg_live, i)))) > > OK with the above change. Fixed. This is the patch I am checking in. Thanks. > Thanks, > Uros. > --=20 H.J. --0000000000006ba0920610a72f88 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-x86-64-Find-a-scratch-register-for-large-model-profi.patch" Content-Disposition: attachment; filename="0001-x86-64-Find-a-scratch-register-for-large-model-profi.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ls9b00xg0 RnJvbSBkYzNmZTUxMWExM2JjY2Y1MTA3OTNjMjJlNmJhN2EwY2MwYjljMWY2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhqbC50b29sc0BnbWFpbC5jb20+CkRhdGU6 IFRodSwgMSBGZWIgMjAyNCAwODowMjoyNyAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIHg4Ni02NDog RmluZCBhIHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIGxhcmdlIG1vZGVsIHByb2ZpbGluZwoKMiBzY3Jh dGNoIHJlZ2lzdGVycywgJXIxMCBhbmQgJXIxMSwgYXJlIGF2YWlsYWJsZSBhdCBmdW5jdGlvbiBl bnRyeSBmb3IKbGFyZ2UgbW9kZWwgcHJvZmlsaW5nLiAgQnV0ICVyMTAgbWF5IGJlIHVzZWQgYnkg c3RhY2sgcmVhbGlnbm1lbnQgYW5kIHdlCmNhbid0IHVzZSAlcjEwIGluIHRoaXMgY2FzZS4gIEFk ZCB4ODZfNjRfc2VsZWN0X3Byb2ZpbGVfcmVnbnVtIHRvIGZpbmQKYSBjYWxsZXItc2F2ZWQgcmVn aXN0ZXIgd2hpY2ggaXNuJ3QgbGl2ZSBvciBhIGNhbGxlZS1zYXZlZCByZWdpc3Rlcgp3aGljaCBo YXMgYmVlbiBzYXZlZCBvbiBzdGFjayBpbiB0aGUgcHJvbG9ndWUgYXQgZW50cnkgZm9yIGxhcmdl IG1vZGVsCnByb2ZpbGluZyBhbmQgc29ycnkgaWYgd2UgY2FuJ3QgZmluZCBvbmUuCgpnY2MvCgoJ UFIgdGFyZ2V0LzExMzY4OQoJKiBjb25maWcvaTM4Ni9pMzg2LmNjICh4ODZfNjRfc2VsZWN0X3By b2ZpbGVfcmVnbnVtKTogTmV3LgoJKHg4Nl9mdW5jdGlvbl9wcm9maWxlcik6IENhbGwgeDg2XzY0 X3NlbGVjdF9wcm9maWxlX3JlZ251bSB0bwoJZ2V0IGEgc2NyYXRjaCByZWdpc3RlciBmb3IgbGFy Z2UgbW9kZWwgcHJvZmlsaW5nLgoKZ2NjL3Rlc3RzdWl0ZS8KCglQUiB0YXJnZXQvMTEzNjg5Cgkq IGdjYy50YXJnZXQvaTM4Ni9wcjExMzY4OS0xLmM6IE5ldyBmaWxlLgoJKiBnY2MudGFyZ2V0L2kz ODYvcHIxMTM2ODktMi5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByMTEzNjg5LTMu YzogTGlrZXdpc2UuCi0tLQogZ2NjL2NvbmZpZy9pMzg2L2kzODYuY2MgICAgICAgICAgICAgICAg ICAgIHwgOTEgKysrKysrKysrKysrKysrKysrLS0tLQogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2kzODYvcHIxMTM2ODktMS5jIHwgNDkgKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjExMzY4OS0yLmMgfCA0MSArKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjExMzY4OS0zLmMgfCA0OCArKysrKysrKysrKysKIDQgZmlsZXMgY2hh bmdlZCwgMjE0IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByMTEzNjg5LTEuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByMTEzNjg5LTIuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByMTEzNjg5LTMu YwoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2LmNjIGIvZ2NjL2NvbmZpZy9pMzg2 L2kzODYuY2MKaW5kZXggYjNlN2M3NDg0NmUuLmYwMmM2YzAyYWM2IDEwMDY0NAotLS0gYS9nY2Mv Y29uZmlnL2kzODYvaTM4Ni5jYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5jYwpAQCAtMjI3 NDksNiArMjI3NDksNDggQEAgY3VycmVudF9mZW50cnlfc2VjdGlvbiAoY29uc3QgY2hhciAqKm5h bWUpCiAgIHJldHVybiB0cnVlOwogfQogCisvKiBSZXR1cm4gYSBjYWxsZXItc2F2ZWQgcmVnaXN0 ZXIgd2hpY2ggaXNuJ3QgbGl2ZSBvciBhIGNhbGxlZS1zYXZlZAorICAgcmVnaXN0ZXIgd2hpY2gg aGFzIGJlZW4gc2F2ZWQgb24gc3RhY2sgaW4gdGhlIHByb2xvZ3VlIGF0IGVudHJ5IGZvcgorICAg cHJvZmlsZS4gICovCisKK3N0YXRpYyBpbnQKK3g4Nl82NF9zZWxlY3RfcHJvZmlsZV9yZWdudW0g KGJvb2wgcjExX29rIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIC8qIFVzZSAlcjEwIGlmIHRoZSBw cm9maWxlciBpcyBlbWl0dGVkIGJlZm9yZSB0aGUgcHJvbG9ndWUgb3IgaXQgaXNuJ3QKKyAgICAg dXNlZCBieSBEUkFQLiAgKi8KKyAgaWYgKGl4ODZfcHJvZmlsZV9iZWZvcmVfcHJvbG9ndWUgKCkK KyAgICAgIHx8ICFjcnRsLT5kcmFwX3JlZworICAgICAgfHwgUkVHTk8gKGNydGwtPmRyYXBfcmVn KSAhPSBSMTBfUkVHKQorICAgIHJldHVybiBSMTBfUkVHOworCisgIC8qIFRoZSBwcm9maWxlciBp cyBlbWl0dGVkIGFmdGVyIHRoZSBwcm9sb2d1ZS4gIElmIHRoZXJlIGlzIGEKKyAgICAgY2FsbGVy LXNhdmVkIHJlZ2lzdGVyIHdoaWNoIGlzbid0IGxpdmUgb3IgYSBjYWxsZWUtc2F2ZWQKKyAgICAg cmVnaXN0ZXIgc2F2ZWQgb24gc3RhY2sgaW4gdGhlIHByb2xvZ3VlLCB1c2UgaXQuICAqLworCisg IGJpdG1hcCByZWdfbGl2ZSA9IGRmX2dldF9saXZlX291dCAoRU5UUllfQkxPQ0tfUFRSX0ZPUl9G TiAoY2Z1bikpOworCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgRklSU1RfUFNFVURPX1JF R0lTVEVSOyBpKyspCisgICAgaWYgKEdFTkVSQUxfUkVHTk9fUCAoaSkKKwkmJiBpICE9IFIxMF9S RUcKKyNpZmRlZiBOT19QUk9GSUxFX0NPVU5URVJTCisJJiYgKHIxMV9vayB8fCBpICE9IFIxMV9S RUcpCisjZWxzZQorCSYmIGkgIT0gUjExX1JFRworI2VuZGlmCisJJiYgVEVTVF9IQVJEX1JFR19C SVQgKGFjY2Vzc2libGVfcmVnX3NldCwgaSkKKwkmJiAoaXg4Nl9zYXZlX3JlZyAoaSwgdHJ1ZSwg dHJ1ZSkKKwkgICAgfHwgKGNhbGxfdXNlZF9yZWdzW2ldCisJCSYmICFmaXhlZF9yZWdzW2ldCisJ CSYmICFSRUdOT19SRUdfU0VUX1AgKHJlZ19saXZlLCBpKSkpKQorICAgICAgcmV0dXJuIGk7CisK KyAgc29ycnkgKCJubyByZWdpc3RlciBhdmFpbGFibGUgZm9yIHByb2ZpbGluZyAlPC1tY21vZGVs PWxhcmdlJXMlPiIsCisJIGl4ODZfY21vZGVsID09IENNX0xBUkdFX1BJQyA/ICIgLWZQSUMiIDog IiIpOworCisgIHJldHVybiBJTlZBTElEX1JFR05VTTsKK30KKwogLyogT3V0cHV0IGFzc2VtYmxl ciBjb2RlIHRvIEZJTEUgdG8gaW5jcmVtZW50IHByb2ZpbGVyIGxhYmVsICMgTEFCRUxOTwogICAg Zm9yIHByb2ZpbGluZyBhIGZ1bmN0aW9uIGVudHJ5LiAgKi8KIHZvaWQKQEAgLTIyNzgzLDQyICsy MjgyNSw2MSBAQCB4ODZfZnVuY3Rpb25fcHJvZmlsZXIgKEZJTEUgKmZpbGUsIGludCBsYWJlbG5v IEFUVFJJQlVURV9VTlVTRUQpCiAJZnByaW50ZiAoZmlsZSwgIlx0bGVhcVx0JXNQJWQoJSVyaXAp LCAlJXIxMVxuIiwgTFBSRUZJWCwgbGFiZWxubyk7CiAjZW5kaWYKIAorICAgICAgaW50IHNjcmF0 Y2g7CisgICAgICBjb25zdCBjaGFyICpyZWc7CisgICAgICBjaGFyIGxlZ2FjeV9yZWdbNF0gPSB7 IDAgfTsKKwogICAgICAgaWYgKCFUQVJHRVRfUEVDT0ZGKQogCXsKIAkgIHN3aXRjaCAoaXg4Nl9j bW9kZWwpCiAJICAgIHsKIAkgICAgY2FzZSBDTV9MQVJHRToKLQkgICAgICAvKiBOQjogUjEwIGlz IGNhbGxlci1zYXZlZC4gIEFsdGhvdWdoIGl0IGNhbiBiZSB1c2VkIGFzIGEKLQkJIHN0YXRpYyBj aGFpbiByZWdpc3RlciwgaXQgaXMgcHJlc2VydmVkIHdoZW4gY2FsbGluZwotCQkgbWNvdW50IGZv ciBuZXN0ZWQgZnVuY3Rpb25zLiAgKi8KKwkgICAgICBzY3JhdGNoID0geDg2XzY0X3NlbGVjdF9w cm9maWxlX3JlZ251bSAodHJ1ZSk7CisJICAgICAgcmVnID0gaGlfcmVnX25hbWVbc2NyYXRjaF07 CisJICAgICAgaWYgKExFR0FDWV9JTlRfUkVHTk9fUCAoc2NyYXRjaCkpCisJCXsKKwkJICBsZWdh Y3lfcmVnWzBdID0gJ3InOworCQkgIGxlZ2FjeV9yZWdbMV0gPSByZWdbMF07CisJCSAgbGVnYWN5 X3JlZ1syXSA9IHJlZ1sxXTsKKwkJICByZWcgPSBsZWdhY3lfcmVnOworCQl9CiAJICAgICAgaWYg KEFTU0VNQkxFUl9ESUFMRUNUID09IEFTTV9JTlRFTCkKLQkJZnByaW50ZiAoZmlsZSwgIjE6XHRt b3ZhYnNcdHIxMCwgT0ZGU0VUIEZMQVQ6JXNcbiIKLQkJCSAgICAgICAiXHRjYWxsXHRyMTBcbiIs IG1jb3VudF9uYW1lKTsKKwkJZnByaW50ZiAoZmlsZSwgIjE6XHRtb3ZhYnNcdCVzLCBPRkZTRVQg RkxBVDolc1xuIgorCQkJICAgICAgICJcdGNhbGxcdCVzXG4iLCByZWcsIG1jb3VudF9uYW1lLCBy ZWcpOwogCSAgICAgIGVsc2UKLQkJZnByaW50ZiAoZmlsZSwgIjE6XHRtb3ZhYnNxXHQkJXMsICUl cjEwXG5cdGNhbGxcdColJXIxMFxuIiwKLQkJCSBtY291bnRfbmFtZSk7CisJCWZwcmludGYgKGZp bGUsICIxOlx0bW92YWJzcVx0JCVzLCAlJSVzXG5cdGNhbGxcdColJSVzXG4iLAorCQkJIG1jb3Vu dF9uYW1lLCByZWcsIHJlZyk7CiAJICAgICAgYnJlYWs7CiAJICAgIGNhc2UgQ01fTEFSR0VfUElD OgogI2lmZGVmIE5PX1BST0ZJTEVfQ09VTlRFUlMKKwkgICAgICBzY3JhdGNoID0geDg2XzY0X3Nl bGVjdF9wcm9maWxlX3JlZ251bSAoZmFsc2UpOworCSAgICAgIHJlZyA9IGhpX3JlZ19uYW1lW3Nj cmF0Y2hdOworCSAgICAgIGlmIChMRUdBQ1lfSU5UX1JFR05PX1AgKHNjcmF0Y2gpKQorCQl7CisJ CSAgbGVnYWN5X3JlZ1swXSA9ICdyJzsKKwkJICBsZWdhY3lfcmVnWzFdID0gcmVnWzBdOworCQkg IGxlZ2FjeV9yZWdbMl0gPSByZWdbMV07CisJCSAgcmVnID0gbGVnYWN5X3JlZzsKKwkJfQogCSAg ICAgIGlmIChBU1NFTUJMRVJfRElBTEVDVCA9PSBBU01fSU5URUwpCiAJCXsKIAkJICBmcHJpbnRm IChmaWxlLCAiMTptb3ZhYnNcdHIxMSwgIgogCQkJCSAiT0ZGU0VUIEZMQVQ6X0dMT0JBTF9PRkZT RVRfVEFCTEVfLTFiXG4iKTsKLQkJICBmcHJpbnRmIChmaWxlLCAiXHRsZWFcdHIxMCwgMWJbcmlw XVxuIik7Ci0JCSAgZnByaW50ZiAoZmlsZSwgIlx0YWRkXHRyMTAsIHIxMVxuIik7CisJCSAgZnBy aW50ZiAoZmlsZSwgIlx0bGVhXHQlcywgMWJbcmlwXVxuIiwgcmVnKTsKKwkJICBmcHJpbnRmIChm aWxlLCAiXHRhZGRcdCVzLCByMTFcbiIsIHJlZyk7CiAJCSAgZnByaW50ZiAoZmlsZSwgIlx0bW92 YWJzXHRyMTEsIE9GRlNFVCBGTEFUOiVzQFBMVE9GRlxuIiwKIAkJCSAgIG1jb3VudF9uYW1lKTsK LQkJICBmcHJpbnRmIChmaWxlLCAiXHRhZGRcdHIxMCwgcjExXG4iKTsKLQkJICBmcHJpbnRmIChm aWxlLCAiXHRjYWxsXHRyMTBcbiIpOworCQkgIGZwcmludGYgKGZpbGUsICJcdGFkZFx0JXMsIHIx MVxuIiwgcmVnKTsKKwkJICBmcHJpbnRmIChmaWxlLCAiXHRjYWxsXHQlc1xuIiwgcmVnKTsKIAkJ ICBicmVhazsKIAkJfQogCSAgICAgIGZwcmludGYgKGZpbGUsCiAJCSAgICAgICAiMTpcdG1vdmFi c3FcdCRfR0xPQkFMX09GRlNFVF9UQUJMRV8tMWIsICUlcjExXG4iKTsKLQkgICAgICBmcHJpbnRm IChmaWxlLCAiXHRsZWFxXHQxYiglJXJpcCksICUlcjEwXG4iKTsKLQkgICAgICBmcHJpbnRmIChm aWxlLCAiXHRhZGRxXHQlJXIxMSwgJSVyMTBcbiIpOworCSAgICAgIGZwcmludGYgKGZpbGUsICJc dGxlYXFcdDFiKCUlcmlwKSwgJSUlc1xuIiwgcmVnKTsKKwkgICAgICBmcHJpbnRmIChmaWxlLCAi XHRhZGRxXHQlJXIxMSwgJSUlc1xuIiwgcmVnKTsKIAkgICAgICBmcHJpbnRmIChmaWxlLCAiXHRt b3ZhYnNxXHQkJXNAUExUT0ZGLCAlJXIxMVxuIiwgbWNvdW50X25hbWUpOwotCSAgICAgIGZwcmlu dGYgKGZpbGUsICJcdGFkZHFcdCUlcjExLCAlJXIxMFxuIik7Ci0JICAgICAgZnByaW50ZiAoZmls ZSwgIlx0Y2FsbFx0KiUlcjEwXG4iKTsKKwkgICAgICBmcHJpbnRmIChmaWxlLCAiXHRhZGRxXHQl JXIxMSwgJSUlc1xuIiwgcmVnKTsKKwkgICAgICBmcHJpbnRmIChmaWxlLCAiXHRjYWxsXHQqJSUl c1xuIiwgcmVnKTsKICNlbHNlCiAJICAgICAgc29ycnkgKCJwcm9maWxpbmcgJTwtbWNtb2RlbD1s YXJnZSU+IHdpdGggUElDIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIxMTM2ODktMS5jIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvcHIxMTM2ODktMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi44Mjg1YzBhMDdiNwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByMTEzNjg5LTEuYwpAQCAtMCwwICsxLDQ5IEBACisvKiB7IGRn LWRvIHJ1biB7IHRhcmdldCB7IGxwNjQgJiYgZnBpYyB9IH0gfSAqLworLyogeyBkZy1vcHRpb25z ICItTzIgLWZuby1waWMgLWZwcm9maWxlIC1tY21vZGVsPWxhcmdlIiB9ICovCisKKyNpbmNsdWRl IDxzdGRhcmcuaD4KKworX19hdHRyaWJ1dGVfXygobm9pcGEpKQordm9pZAorYmFyIChpbnQgYTEs IGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LAorICAgICBjaGFyICp4LCBj aGFyICp5LCBpbnQgKnopCit7CisgIGlmIChhMSAhPSAxKQorICAgIF9fYnVpbHRpbl9hYm9ydCAo KTsKKyAgaWYgKGEyICE9IDIpCisgICAgX19idWlsdGluX2Fib3J0ICgpOworICBpZiAoYTMgIT0g MykKKyAgICBfX2J1aWx0aW5fYWJvcnQgKCk7CisgIGlmIChhNCAhPSA0KQorICAgIF9fYnVpbHRp bl9hYm9ydCAoKTsKKyAgaWYgKGE1ICE9IDUpCisgICAgX19idWlsdGluX2Fib3J0ICgpOworICBp ZiAoYTYgIT0gNikKKyAgICBfX2J1aWx0aW5fYWJvcnQgKCk7CisgIHhbMF0gPSA0MjsKKyAgeVsw XSA9IDQyOworICBpZiAoelswXSAhPSAxNikKKyAgICBfX2J1aWx0aW5fYWJvcnQgKCk7Cit9CisK K19fYXR0cmlidXRlX18oKG5vaXBhKSkKK3ZvaWQgCitmb28gKGludCBjLCBpbnQgZCwgaW50IGUs IGludCBmLCBpbnQgZywgaW50IGgsIGludCB6LCAuLi4pCit7CisgIHR5cGVkZWYgY2hhciBCWzMy XTsKKyAgQiBiIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDMyKSkpOworICB2YV9saXN0IGFwOwor ICB2YV9zdGFydCAoYXAsIHopOworICBkb3VibGUgeCA9IHZhX2FyZyAoYXAsIGRvdWJsZSk7Cisg IGlmICh4ID4gNDAuMCkKKyAgICBfX2J1aWx0aW5fYWJvcnQgKCk7CisgIGJhciAoYywgZCwgZSwg ZiwgZywgaCwgJmJbMF0sIF9fYnVpbHRpbl9hbGxvY2EgKHopLCAmeik7CisgIHZhX2VuZCAoYXAp OworfQorCitpbnQKK21haW4gKCkKK3sKKyAgZm9vICgxLCAyLCAzLCA0LCA1LCA2LCAxNiwgMzgu MCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2kzODYvcHIxMTM2ODktMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIxMTM2 ODktMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yZTU1NzlhYzU0 NgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByMTEz Njg5LTIuYwpAQCAtMCwwICsxLDQxIEBACisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCB7IGxwNjQg JiYgZnBpYyB9IH0gfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZwaWMgLWZwcm9maWxlIC1t Y21vZGVsPWxhcmdlIiB9ICovCisKK19fYXR0cmlidXRlX18oKG5vaXBhKSkKK3ZvaWQKK2JhciAo aW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwKKyAgICAgY2hh ciAqeCwgY2hhciAqeSwgaW50ICp6KQoreworICBpZiAoYTEgIT0gMSkKKyAgICBfX2J1aWx0aW5f YWJvcnQgKCk7CisgIGlmIChhMiAhPSAyKQorICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAgaWYg KGEzICE9IDMpCisgICAgX19idWlsdGluX2Fib3J0ICgpOworICBpZiAoYTQgIT0gNCkKKyAgICBf X2J1aWx0aW5fYWJvcnQgKCk7CisgIGlmIChhNSAhPSA1KQorICAgIF9fYnVpbHRpbl9hYm9ydCAo KTsKKyAgaWYgKGE2ICE9IDYpCisgICAgX19idWlsdGluX2Fib3J0ICgpOworICB4WzBdID0gNDI7 CisgIHlbMF0gPSA0MjsKKyAgaWYgKHpbMF0gIT0gMTYpCisgICAgX19idWlsdGluX2Fib3J0ICgp OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSkpCit2b2lkIAorZm9vIChpbnQgYywgaW50IGQs IGludCBlLCBpbnQgZiwgaW50IGcsIGludCBoLCBpbnQgeikKK3sKKyAgdHlwZWRlZiBjaGFyIEJb MzJdOworICBCIGIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMzIpKSk7CisgIGJhciAoYywgZCwg ZSwgZiwgZywgaCwgJmJbMF0sIF9fYnVpbHRpbl9hbGxvY2EgKHopLCAmeik7Cit9CisKK2ludAor bWFpbiAoKQoreworICBmb28gKDEsIDIsIDMsIDQsIDUsIDYsIDE2KTsKKyAgcmV0dXJuIDA7Cit9 CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjExMzY4OS0zLmMg Yi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjExMzY4OS0zLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmRhYjc1MTkwNjM1Ci0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIxMTM2ODktMy5jCkBAIC0wLDAgKzEs NDggQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgbHA2NCAmJiBmcGljIH0gfSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtZnBpYyAtZnByb2ZpbGUgLW1jbW9kZWw9bGFyZ2UiIH0gKi8K KworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitfX2F0dHJpYnV0ZV9fKChub2lwYSkpCit2b2lkCiti YXIgKGNoYXIgKngsIGNoYXIgKnksIGludCAqeikKK3sKKyAgeFswXSA9IDQyOworICB5WzBdID0g NDI7CisgIGlmICh6WzBdICE9IDE2KQorICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKK30KKworX19h dHRyaWJ1dGVfXygobm9pcGEpKQordm9pZCAKK2ZvbyAoaW50IGExLCBpbnQgYTIsIGludCBhMywg aW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IHosIC4uLikKK3sKKyAgdHlwZWRlZiBjaGFyIEJb MzJdOworICBCIGIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoMzIpKSk7CisgIHZhX2xpc3QgYXA7 CisgIHZhX3N0YXJ0IChhcCwgeik7CisgIGRvdWJsZSB4ID0gdmFfYXJnIChhcCwgZG91YmxlKTsK KyAgaWYgKHggPiA0MC4wKQorICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAgaWYgKGExICE9IDEp CisgICAgX19idWlsdGluX2Fib3J0ICgpOworICBpZiAoYTIgIT0gMikKKyAgICBfX2J1aWx0aW5f YWJvcnQgKCk7CisgIGlmIChhMyAhPSAzKQorICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAgaWYg KGE0ICE9IDQpCisgICAgX19idWlsdGluX2Fib3J0ICgpOworICBpZiAoYTUgIT0gNSkKKyAgICBf X2J1aWx0aW5fYWJvcnQgKCk7CisgIGlmIChhNiAhPSA2KQorICAgIF9fYnVpbHRpbl9hYm9ydCAo KTsKKyAgYmFyICgmYlswXSwgX19idWlsdGluX2FsbG9jYSAoeiksICZ6KTsKKyAgdmFfZW5kIChh cCk7Cit9CisKK2ludAorbWFpbiAoKQoreworICBmb28gKDEsIDIsIDMsIDQsIDUsIDYsIDE2LCAz OC4wKTsKKyAgcmV0dXJuIDA7Cit9Ci0tIAoyLjQzLjAKCg== --0000000000006ba0920610a72f88--