From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd34.google.com (mail-io1-xd34.google.com [IPv6:2607:f8b0:4864:20::d34]) by sourceware.org (Postfix) with ESMTPS id 09FEC3858D37 for ; Mon, 10 Oct 2022 10:49:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 09FEC3858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-io1-xd34.google.com with SMTP id l127so8110039iof.12 for ; Mon, 10 Oct 2022 03:49:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=C8HXKKv1jF4jGVJfh6V7fC8r7L6jGGNWbOKGlkLr13U=; b=df84oaX84h6DOPKzq22osvgFcAsG58DRqH9OUE+BymznLtkOuhIBVAccS7upkdGRKO z6rQ7L4yGM28CyIM4f2GVmxCXIbQGxZHMkCdWOzw46dONIcdKq4OfS7Q2RPXa9sg7oY1 ohNs0Oh3ZTX6uOwPbMmmSKPIHfpK8gRF6EAV4d4jjpHD7N5AlSgPb+m1e0RzjLt7FlNs eBItjprXqiBTz6gt989LNU8hFD0JM97BO/NANhWcqJEeN+ImyuEKRNR/6wi1i6sKsUlP FXEzkYajQCx0DJ3AajJQQKSP7Auo55tWzGQxBt5lzuPIeNmH2RughXPo7gWSLL3nryyT aCxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=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=C8HXKKv1jF4jGVJfh6V7fC8r7L6jGGNWbOKGlkLr13U=; b=sKkJKiCROEpL9FKWjTgL0xc01sX8sISblkmalHPIYgVbhsoTV00DZaX7vGSwhZk8bh YplQBU6Vb/lX0pOGL6MqUIUOp54kFlQPUiGt/6qWYCcxvlpvWjoBTwIaP2Y4wmCx0yHx jKRFPMddGtRUsC6vSHA+0crq0qEGHZP8qcLlFXTv+PF/FOr2NmV1uzoDARQZOO49nwb/ LolPD4r1sf0CrbpXU364I+PUn9GZBQEglqkh3Sg5xTQURt1bM3J8SdFZY9PePf8sE3Lf +GwU6ZWQC0XOY+jEJM2D4+F6Qgwh87aPSAYvqtl3eNjLvDuVFOqFKh2w5zhlcEKhfDaE 85fQ== X-Gm-Message-State: ACrzQf2qvXkE4ICYLfb2XQDND6rxFJRw+8UC7I4KlZcfO/UPCImL0rhv OeYHjTZ69G9Gc095ELaD2FPt9nZ1h4fxCattcNrIjw== X-Google-Smtp-Source: AMsMyM5Yy0N/M0X3xtfZV9y15BS2TTWimVg/h95BucQt+OEEZV3PWowvT2MRmHKnVoeSrXqmtw7RFjs+05+lDmKsLSM= X-Received: by 2002:a02:c72a:0:b0:35a:3fdd:d09a with SMTP id h10-20020a02c72a000000b0035a3fddd09amr9272876jao.89.1665398974157; Mon, 10 Oct 2022 03:49:34 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Prathamesh Kulkarni Date: Mon, 10 Oct 2022 16:18:57 +0530 Message-ID: Subject: Re: Extend fold_vec_perm to fold VEC_PERM_EXPR in VLA manner To: Prathamesh Kulkarni , gcc Patches , Richard Biener , richard.sandiford@arm.com Content-Type: multipart/mixed; boundary="00000000000043c6b505eaabeaff" X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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: --00000000000043c6b505eaabeaff Content-Type: text/plain; charset="UTF-8" On Fri, 30 Sept 2022 at 21:38, Richard Sandiford wrote: > > Richard Sandiford via Gcc-patches writes: > > Prathamesh Kulkarni writes: > >> Sorry to ask a silly question but in which case shall we select 2nd vector ? > >> For num_poly_int_coeffs == 2, > >> a1 /trunc n1 == (a1 + 0x) / (n1.coeffs[0] + n1.coeffs[1]*x) > >> If a1/trunc n1 succeeds, > >> 0 / n1.coeffs[1] == a1/n1.coeffs[0] == 0. > >> So, a1 has to be < n1.coeffs[0] ? > > > > Remember that a1 is itself a poly_int. It's not necessarily a constant. > > > > E.g. the TRN1 .D instruction maps to a VEC_PERM_EXPR with the selector: > > > > { 0, 2 + 2x, 1, 4 + 2x, 2, 6 + 2x, ... } > > Sorry, should have been: > > { 0, 2 + 2x, 2, 4 + 2x, 4, 6 + 2x, ... } Hi Richard, Thanks for the clarifications, and sorry for late reply. I have attached POC patch that tries to implement the above approach. Passes bootstrap+test on x86_64-linux-gnu and aarch64-linux-gnu for VLS vectors. For VLA vectors, I have only done limited testing so far. It seems to pass couple of tests written in the patch for nelts_per_pattern == 3, and folds the following svld1rq test: int32x4_t v = {1, 2, 3, 4}; return svld1rq_s32 (svptrue_b8 (), &v[0]) into: return {1, 2, 3, 4, ...}; I will try to bootstrap+test it on SVE machine to test further for VLA folding. I have a couple of questions: 1] When mask selects elements from same vector but from different patterns: For eg: arg0 = {1, 11, 2, 12, 3, 13, ...}, arg1 = {21, 31, 22, 32, 23, 33, ...}, mask = {0, 0, 0, 1, 0, 2, ... }, All have npatterns = 2, nelts_per_pattern = 3. With above mask, Pattern {0, ...} selects arg0[0], ie {1, ...} Pattern {0, 1, 2, ...} selects arg0[0], arg0[1], arg0[2], ie {1, 11, 2, ...} While arg0[0] and arg0[2] belong to same pattern, arg0[1] belongs to different pattern in arg0. The result is: res = {1, 1, 1, 11, 1, 2, ...} In this case, res's 2nd pattern {1, 11, 2, ...} is encoded with: with a0 = 1, a1 = 11, S = -9. Is that expected tho ? It seems to create a new encoding which wasn't present in the input vector. For instance, the next elem in sequence would be -7, which is not present originally in arg0. I suppose it's fine since if the user defines mask to have pattern {0, 1, 2, ...} they intended result to have pattern with above encoding. Just wanted to confirm if this is correct ? 2] Could you please suggest a test-case for S < 0 ? I am not able to come up with one :/ Thanks, Prathamesh > > > which is an interleaving of the two patterns: > > > > { 0, 2, 4, ... } a0 = 0, a1 = 2, S = 2 > > { 2 + 2x, 4 + 2x, 6 + 2x } a0 = 2 + 2x, a1 = 4 + 2x, S = 2 --00000000000043c6b505eaabeaff Content-Type: text/plain; charset="US-ASCII"; name="fold-vec-perm-2.txt" Content-Disposition: attachment; filename="fold-vec-perm-2.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l92mwn6u0 ZGlmZiAtLWdpdCBhL2djYy9mb2xkLWNvbnN0LmNjIGIvZ2NjL2ZvbGQtY29uc3QuY2MKaW5kZXgg OWY3YmVhZTE0ZTUuLmExNTBhNzVmYWY1IDEwMDY0NAotLS0gYS9nY2MvZm9sZC1jb25zdC5jYwor KysgYi9nY2MvZm9sZC1jb25zdC5jYwpAQCAtODUsNiArODUsOSBAQCBhbG9uZyB3aXRoIEdDQzsg c2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgInZlYy1wZXJtLWlu ZGljZXMuaCIKICNpbmNsdWRlICJhc2FuLmgiCiAjaW5jbHVkZSAiZ2ltcGxlLXJhbmdlLmgiCisj aW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgInRyZWUtcHJldHR5LXByaW50LmgiCisjaW5j bHVkZSAicHJpbnQtdHJlZS5oIgogCiAvKiBOb256ZXJvIGlmIHdlIGFyZSBmb2xkaW5nIGNvbnN0 YW50cyBpbnNpZGUgYW4gaW5pdGlhbGl6ZXIgb3IgYSBDKysKICAgIG1hbmlmZXN0bHktY29uc3Rh bnQtZXZhbHVhdGVkIGNvbnRleHQ7IHplcm8gb3RoZXJ3aXNlLgpAQCAtMTA0OTQsMzggKzEwNDk3 LDUzIEBAIGZvbGRfbXVsdF96Y29uanogKGxvY2F0aW9uX3QgbG9jLCB0cmVlIHR5cGUsIHRyZWUg ZXhwcikKIAkJCSAgYnVpbGRfemVyb19jc3QgKGl0eXBlKSk7CiB9CiAKKy8qIENoZWNrIGlmIFBB VFRFUk4gaW4gU0VMIHNlbGVjdHMgZWl0aGVyIEFSRzAgb3IgQVJHMSwKKyAgIGFuZCByZXR1cm4g dGhlIHNlbGVjdGVkIGFyZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMX1RSRUUuICAqLwogCi0vKiBI ZWxwZXIgZnVuY3Rpb24gZm9yIGZvbGRfdmVjX3Blcm0uICBTdG9yZSBlbGVtZW50cyBvZiBWRUNU T1JfQ1NUIG9yCi0gICBDT05TVFJVQ1RPUiBBUkcgaW50byBhcnJheSBFTFRTLCB3aGljaCBoYXMg TkVMVFMgZWxlbWVudHMsIGFuZCByZXR1cm4KLSAgIHRydWUgaWYgc3VjY2Vzc2Z1bC4gICovCi0K LXN0YXRpYyBib29sCi12ZWNfY3N0X2N0b3JfdG9fYXJyYXkgKHRyZWUgYXJnLCB1bnNpZ25lZCBp bnQgbmVsdHMsIHRyZWUgKmVsdHMpCitzdGF0aWMgdHJlZQorZ2V0X3ZlY3Rvcl9mb3JfcGF0dGVy biAodHJlZSBhcmcwLCB0cmVlIGFyZzEsCisJCQljb25zdCB2ZWNfcGVybV9pbmRpY2VzICZzZWws IHVuc2lnbmVkIHBhdHRlcm4pCiB7Ci0gIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgaSwgbnVuaXRz OworICB1bnNpZ25lZCBzZWxfbnBhdHRlcm5zID0gc2VsLmVuY29kaW5nICgpLm5wYXR0ZXJucyAo KTsKKyAgdW5zaWduZWQgc2VsX25lbHRzX3Blcl9wYXR0ZXJuID0gc2VsLmVuY29kaW5nICgpLm5l bHRzX3Blcl9wYXR0ZXJuICgpOwogCi0gIGlmIChUUkVFX0NPREUgKGFyZykgPT0gVkVDVE9SX0NT VAotICAgICAgJiYgVkVDVE9SX0NTVF9ORUxUUyAoYXJnKS5pc19jb25zdGFudCAoJm51bml0cykp CisgIHBvbHlfdWludDY0IG4xID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJn MCkpOworICBwb2x5X3VpbnQ2NCBuc2VsID0gc2VsLmxlbmd0aCAoKTsKKyAgcG9seV91aW50NjQg ZXNlbDsKKworICBpZiAoIW11bHRpcGxlX3AgKG5zZWwsIHNlbF9ucGF0dGVybnMsICZlc2VsKSkK KyAgICByZXR1cm4gTlVMTF9UUkVFOworCisgIHBvbHlfdWludDY0IGExID0gc2VsW3BhdHRlcm4g KyBzZWxfbnBhdHRlcm5zXTsKKyAgaW50IFMgPSAwOworICBpZiAoc2VsX25lbHRzX3Blcl9wYXR0 ZXJuID09IDMpCiAgICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG51bml0czsgKytpKQotCWVs dHNbaV0gPSBWRUNUT1JfQ1NUX0VMVCAoYXJnLCBpKTsKKyAgICAgIHBvbHlfdWludDY0IGEyID0g c2VsW3BhdHRlcm4gKyAyICogc2VsX25wYXR0ZXJuc107CisgICAgICBTID0gKGEyIC0gYTEpLnRv X2NvbnN0YW50ICgpOwogICAgIH0KLSAgZWxzZSBpZiAoVFJFRV9DT0RFIChhcmcpID09IENPTlNU UlVDVE9SKQorICAKKyAgcG9seV91aW50NjQgYWUgPSBhMSArIChlc2VsIC0gMikgKiBTOworICB1 aW50NjRfdCBxMSwgcWU7CisgIHBvbHlfdWludDY0IHIxLCByZTsKKworICBpZiAoIWNhbl9kaXZf dHJ1bmNfcCAoYTEsIG4xLCAmcTEsICZyMSkKKyAgICAgIHx8ICFjYW5fZGl2X3RydW5jX3AgKGFl LCBuMSwgJnFlLCAmcmUpCisgICAgICB8fCAocTEgIT0gcWUpKQorICAgIHJldHVybiBOVUxMX1RS RUU7CisKKyAgdHJlZSBhcmcgPSAoKHExICYgMSkgPT0gMCkgPyBhcmcwIDogYXJnMTsKKworICBp ZiAoUyA8IDApCiAgICAgewotICAgICAgY29uc3RydWN0b3JfZWx0ICplbHQ7CisgICAgICBwb2x5 X3VpbnQ2NCBhMCA9IHNlbFtwYXR0ZXJuXTsKKyAgICAgIGlmICgha25vd25fZXEgKFMsIGExIC0g YTApKQorICAgICAgICByZXR1cm4gTlVMTF9UUkVFOwogCi0gICAgICBGT1JfRUFDSF9WRUNfU0FG RV9FTFQgKENPTlNUUlVDVE9SX0VMVFMgKGFyZyksIGksIGVsdCkKLQlpZiAoaSA+PSBuZWx0cyB8 fCBUUkVFX0NPREUgKFRSRUVfVFlQRSAoZWx0LT52YWx1ZSkpID09IFZFQ1RPUl9UWVBFKQotCSAg cmV0dXJuIGZhbHNlOwotCWVsc2UKLQkgIGVsdHNbaV0gPSBlbHQtPnZhbHVlOworICAgICAgaWYg KCFrbm93bl9ndCAocmUsIFZFQ1RPUl9DU1RfTlBBVFRFUk5TIChhcmcpKSkKKyAgICAgICAgcmV0 dXJuIE5VTExfVFJFRTsKICAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAo OyBpIDwgbmVsdHM7IGkrKykKLSAgICBlbHRzW2ldCi0gICAgICA9IGZvbGRfY29udmVydCAoVFJF RV9UWVBFIChUUkVFX1RZUEUgKGFyZykpLCBpbnRlZ2VyX3plcm9fbm9kZSk7Ci0gIHJldHVybiB0 cnVlOworICAKKyAgcmV0dXJuIGFyZzsKIH0KIAogLyogQXR0ZW1wdCB0byBmb2xkIHZlY3RvciBw ZXJtdXRhdGlvbiBvZiBBUkcwIGFuZCBBUkcxIHZlY3RvcnMgdXNpbmcgU0VMCkBAIC0xMDUzOSw0 MSArMTA1NTcsMTEyIEBAIGZvbGRfdmVjX3Blcm0gKHRyZWUgdHlwZSwgdHJlZSBhcmcwLCB0cmVl IGFyZzEsIGNvbnN0IHZlY19wZXJtX2luZGljZXMgJnNlbCkKICAgdW5zaWduZWQgSE9TVF9XSURF X0lOVCBuZWx0czsKICAgYm9vbCBuZWVkX2N0b3IgPSBmYWxzZTsKIAotICBpZiAoIXNlbC5sZW5n dGggKCkuaXNfY29uc3RhbnQgKCZuZWx0cykpCi0gICAgcmV0dXJuIE5VTExfVFJFRTsKLSAgZ2Nj X2Fzc2VydCAoa25vd25fZXEgKFRZUEVfVkVDVE9SX1NVQlBBUlRTICh0eXBlKSwgbmVsdHMpCi0J ICAgICAgJiYga25vd25fZXEgKFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVFX1RZUEUgKGFyZzAp KSwgbmVsdHMpCi0JICAgICAgJiYga25vd25fZXEgKFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVF X1RZUEUgKGFyZzEpKSwgbmVsdHMpKTsKKyAgZ2NjX2Fzc2VydCAoa25vd25fZXEgKFRZUEVfVkVD VE9SX1NVQlBBUlRTICh0eXBlKSwgc2VsLmxlbmd0aCAoKSkKKwkgICAgICAmJiBrbm93bl9lcSAo VFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMCkpLAorCQkJICAgVFlQRV9WRUNU T1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMSkpKSk7CiAgIGlmIChUUkVFX1RZUEUgKFRSRUVf VFlQRSAoYXJnMCkpICE9IFRSRUVfVFlQRSAodHlwZSkKICAgICAgIHx8IFRSRUVfVFlQRSAoVFJF RV9UWVBFIChhcmcxKSkgIT0gVFJFRV9UWVBFICh0eXBlKSkKICAgICByZXR1cm4gTlVMTF9UUkVF OwogCi0gIHRyZWUgKmluX2VsdHMgPSBYQUxMT0NBVkVDICh0cmVlLCBuZWx0cyAqIDIpOwotICBp ZiAoIXZlY19jc3RfY3Rvcl90b19hcnJheSAoYXJnMCwgbmVsdHMsIGluX2VsdHMpCi0gICAgICB8 fCAhdmVjX2NzdF9jdG9yX3RvX2FycmF5IChhcmcxLCBuZWx0cywgaW5fZWx0cyArIG5lbHRzKSkK KyAgdW5zaWduZWQgcmVzX25wYXR0ZXJucyA9IDA7CisgIHVuc2lnbmVkIHJlc19uZWx0c19wZXJf cGF0dGVybiA9IDA7CisgIHVuc2lnbmVkIHNlbF9ucGF0dGVybnMgPSAwOworICB0cmVlICp2ZWN0 b3JfZm9yX3BhdHRlcm4gPSBOVUxMOworCisgIGlmIChUUkVFX0NPREUgKGFyZzApID09IFZFQ1RP Ul9DU1QKKyAgICAgICYmIFRSRUVfQ09ERSAoYXJnMSkgPT0gVkVDVE9SX0NTVAorICAgICAgJiYg IXNlbC5sZW5ndGggKCkuaXNfY29uc3RhbnQgKCkpCisgICAgeworICAgICAgc2VsX25wYXR0ZXJu cyA9IHNlbC5lbmNvZGluZyAoKS5ucGF0dGVybnMgKCk7CisgICAgICB2ZWN0b3JfZm9yX3BhdHRl cm4gPSBYQUxMT0NBVkVDICh0cmVlLCBzZWxfbnBhdHRlcm5zKTsKKyAgICAgIGZvciAodW5zaWdu ZWQgaSA9IDA7IGkgPCBzZWxfbnBhdHRlcm5zOyBpKyspCisJeworCSAgdHJlZSBvcCA9IGdldF92 ZWN0b3JfZm9yX3BhdHRlcm4gKGFyZzAsIGFyZzEsIHNlbCwgaSk7CisJICBpZiAoIW9wKQorCSAg ICByZXR1cm4gTlVMTF9UUkVFOworCSAgdmVjdG9yX2Zvcl9wYXR0ZXJuW2ldID0gb3A7CisJfQor CisgICAgICB1bnNpZ25lZCBhcmcwX25wYXR0ZXJucyA9IFZFQ1RPUl9DU1RfTlBBVFRFUk5TIChh cmcwKTsKKyAgICAgIHVuc2lnbmVkIGFyZzFfbnBhdHRlcm5zID0gVkVDVE9SX0NTVF9OUEFUVEVS TlMgKGFyZzEpOworCisgICAgICByZXNfbnBhdHRlcm5zCisgICAgICAgID0gbGVhc3RfY29tbW9u X211bHRpcGxlIChzZWxfbnBhdHRlcm5zLAorCQkJCSBsZWFzdF9jb21tb25fbXVsdGlwbGUgKGFy ZzBfbnBhdHRlcm5zLAorCQkJCSAJCQlhcmcxX25wYXR0ZXJucykpOworICAgICAgcmVzX25lbHRz X3Blcl9wYXR0ZXJuCisJPSBzdGQ6Om1heChzZWwuZW5jb2RpbmcgKCkubmVsdHNfcGVyX3BhdHRl cm4gKCksCisJCSAgIHN0ZDo6bWF4IChWRUNUT1JfQ1NUX05FTFRTX1BFUl9QQVRURVJOIChhcmcw KSwKKwkJCSAgICAgVkVDVE9SX0NTVF9ORUxUU19QRVJfUEFUVEVSTiAoYXJnMSkpKTsKKyAgICB9 CisgIGVsc2UgaWYgKHNlbC5sZW5ndGggKCkuaXNfY29uc3RhbnQgKCZuZWx0cykKKwkgICAmJiBU WVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSkuaXNfY29uc3RhbnQgKCkKKwkg ICAmJiBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSkudG9fY29uc3RhbnQg KCkgPT0gbmVsdHMpCisgICAgeworICAgICAgLyogRm9yIFZMUyB2ZWN0b3JzLCB0cmVhdCBhbGwg dmVjdG9ycyB3aXRoCisJIG5wYXR0ZXJucyA9IG5lbHRzLCBuZWx0c19wZXJfcGF0dGVybiA9IDEu ICovCisgICAgICByZXNfbnBhdHRlcm5zID0gc2VsX25wYXR0ZXJucyA9IG5lbHRzOworICAgICAg cmVzX25lbHRzX3Blcl9wYXR0ZXJuID0gMTsKKyAgICAgIHZlY3Rvcl9mb3JfcGF0dGVybiA9IFhB TExPQ0FWRUMgKHRyZWUsIG5lbHRzKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBu ZWx0czsgaSsrKQorICAgICAgICB7CisJICBIT1NUX1dJREVfSU5UIGluZGV4OworCSAgaWYgKCFz ZWxbaV0uaXNfY29uc3RhbnQgKCZpbmRleCkpCisJICAgIHJldHVybiBOVUxMX1RSRUU7CisJICB2 ZWN0b3JfZm9yX3BhdHRlcm5baV0gPSAoaW5kZXggPCBuZWx0cykgPyBhcmcwIDogYXJnMTsJCisJ fQorICAgIH0KKyAgZWxzZQogICAgIHJldHVybiBOVUxMX1RSRUU7CiAKLSAgdHJlZV92ZWN0b3Jf YnVpbGRlciBvdXRfZWx0cyAodHlwZSwgbmVsdHMsIDEpOwotICBmb3IgKGkgPSAwOyBpIDwgbmVs dHM7IGkrKykKKyAgdHJlZV92ZWN0b3JfYnVpbGRlciBvdXRfZWx0cyAodHlwZSwgcmVzX25wYXR0 ZXJucywKKwkJCQlyZXNfbmVsdHNfcGVyX3BhdHRlcm4pOworICB1bnNpZ25lZCByZXNfbmVsdHMg PSByZXNfbnBhdHRlcm5zICogcmVzX25lbHRzX3Blcl9wYXR0ZXJuOworICBmb3IgKHVuc2lnbmVk IGkgPSAwOyBpIDwgcmVzX25lbHRzOyBpKyspCiAgICAgewotICAgICAgSE9TVF9XSURFX0lOVCBp bmRleDsKLSAgICAgIGlmICghc2VsW2ldLmlzX2NvbnN0YW50ICgmaW5kZXgpKQorICAgICAgcG9s eV91aW50NjQgbjEgPSBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSk7Cisg ICAgICB1aW50NjRfdCBxOworICAgICAgcG9seV91aW50NjQgcjsKKworICAgICAgLyogRGl2aWRl IHNlbFtpXSBieSBpbnB1dCB2ZWN0b3IgbGVuZ3RoLCB0byBvYnRhaW4gcmVtYWluZGVyLAorCSB3 aGljaCB3b3VsZCBiZSB0aGUgaW5kZXggZm9yIGVpdGhlciBpbnB1dCB2ZWN0b3IuICAqLworICAg ICAgaWYgKCFjYW5fZGl2X3RydW5jX3AgKHNlbFtpXSwgbjEsICZxLCAmcikpCiAJcmV0dXJuIE5V TExfVFJFRTsKLSAgICAgIGlmICghQ09OU1RBTlRfQ0xBU1NfUCAoaW5fZWx0c1tpbmRleF0pKQot CW5lZWRfY3RvciA9IHRydWU7Ci0gICAgICBvdXRfZWx0cy5xdWlja19wdXNoICh1bnNoYXJlX2V4 cHIgKGluX2VsdHNbaW5kZXhdKSk7CisKKyAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgaW5k ZXg7CisgICAgICBpZiAoIXIuaXNfY29uc3RhbnQgKCZpbmRleCkpCisJcmV0dXJuIE5VTExfVFJF RTsKKworICAgICAgLyogRm9yIFZMQSB2ZWN0b3JzLCBpICUgc2VsX25wYXR0ZXJucyB3b3VsZCBn aXZlIHRoZSBwYXR0ZXJuCisgICAgICAgICBpbiBzZWwgdGhhdCBpdGggZWxlbSBiZWxvbmdzIHRv LgorCSBGb3IgVkxTIHZlY3RvcnMsIHNlbF9ucGF0dGVybnMgPT0gcmVzX25lbHRzID09IG5lbHRz LAorCSBzbyBpICUgc2VsX25wYXR0ZXJucyA9PSBpIHNpbmNlIGkgPCBuZWx0cyAqLworICAgICAg dHJlZSBhcmcgPSB2ZWN0b3JfZm9yX3BhdHRlcm5baSAlIHNlbF9ucGF0dGVybnNdOworICAgICAg dHJlZSBlbGVtOworICAgICAgaWYgKFRSRUVfQ09ERSAoYXJnKSA9PSBDT05TVFJVQ1RPUikKKyAg ICAgICAgeworCSAgZ2NjX2Fzc2VydCAoaW5kZXggPCBuZWx0cyk7CisJICBpZiAoaW5kZXggPj0g dmVjX3NhZmVfbGVuZ3RoIChDT05TVFJVQ1RPUl9FTFRTIChhcmcpKSkKKwkgICAgcmV0dXJuIE5V TExfVFJFRTsKKwkgIGVsZW0gPSBDT05TVFJVQ1RPUl9FTFQgKGFyZywgaW5kZXgpLT52YWx1ZTsK KwkgIGlmIChWRUNUT1JfVFlQRV9QIChUUkVFX1RZUEUgKGVsZW0pKSkKKwkgICAgcmV0dXJuIE5V TExfVFJFRTsKKwkgIG5lZWRfY3RvciA9IHRydWU7CisJfQorICAgICAgZWxzZQorICAgICAgICBl bGVtID0gdmVjdG9yX2NzdF9lbHQgKGFyZywgaW5kZXgpOworICAgICAgb3V0X2VsdHMucXVpY2tf cHVzaCAoZWxlbSk7CiAgICAgfQogCiAgIGlmIChuZWVkX2N0b3IpCiAgICAgewogICAgICAgdmVj PGNvbnN0cnVjdG9yX2VsdCwgdmFfZ2M+ICp2OwotICAgICAgdmVjX2FsbG9jICh2LCBuZWx0cyk7 Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbmVsdHM7IGkrKykKKyAgICAgIHZlY19hbGxvYyAodiwg cmVzX25lbHRzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNfbmVsdHM7IGkrKykKIAlDT05T VFJVQ1RPUl9BUFBFTkRfRUxUICh2LCBOVUxMX1RSRUUsIG91dF9lbHRzW2ldKTsKICAgICAgIHJl dHVybiBidWlsZF9jb25zdHJ1Y3RvciAodHlwZSwgdik7CiAgICAgfQotICBlbHNlCi0gICAgcmV0 dXJuIG91dF9lbHRzLmJ1aWxkICgpOworICByZXR1cm4gb3V0X2VsdHMuYnVpbGQgKCk7CiB9CiAK IC8qIFRyeSB0byBmb2xkIGEgcG9pbnRlciBkaWZmZXJlbmNlIG9mIHR5cGUgVFlQRSB0d28gYWRk cmVzcyBleHByZXNzaW9ucyBvZgpAQCAtMTY5MTAsNiArMTY5OTksOTcgQEAgdGVzdF92ZWNfZHVw bGljYXRlX2ZvbGRpbmcgKCkKICAgQVNTRVJUX1RSVUUgKG9wZXJhbmRfZXF1YWxfcCAoZHVwNV9l eHByLCBkdXA1X2NzdCwgMCkpOwogfQogCitzdGF0aWMgdHJlZQorYnVpbGRfdmVjX2ludF9jc3Qg KHVuc2lnbmVkIG5wYXR0ZXJucywgdW5zaWduZWQgbmVsdHNfcGVyX3BhdHRlcm4sCisJCSAgIGlu dCAqZW5jb2RlZF9lbGVtcykKK3sKKyAgc2NhbGFyX2ludF9tb2RlIGludF9tb2RlID0gU0NBTEFS X0lOVF9UWVBFX01PREUgKGludGVnZXJfdHlwZV9ub2RlKTsKKyAgbWFjaGluZV9tb2RlIHZtb2Rl ID0gdGFyZ2V0bS52ZWN0b3JpemUucHJlZmVycmVkX3NpbWRfbW9kZSAoaW50X21vZGUpOworICAv L21hY2hpbmVfbW9kZSB2bW9kZSA9IFZOeDRTSW1vZGU7CisgIHBvbHlfdWludDY0IG51bml0cyA9 IEdFVF9NT0RFX05VTklUUyAodm1vZGUpOworICB0cmVlIHZlY3R5cGUgPSBidWlsZF92ZWN0b3Jf dHlwZSAoaW50ZWdlcl90eXBlX25vZGUsIG51bml0cyk7CisKKyAgdHJlZV92ZWN0b3JfYnVpbGRl ciBidWlsZGVyICh2ZWN0eXBlLCBucGF0dGVybnMsIG5lbHRzX3Blcl9wYXR0ZXJuKTsKKyAgZm9y ICh1bnNpZ25lZCBpID0gMDsgaSA8IG5wYXR0ZXJucyAqIG5lbHRzX3Blcl9wYXR0ZXJuOyBpKysp CisgICAgYnVpbGRlci5xdWlja19wdXNoIChidWlsZF9pbnRfY3N0IChpbnRlZ2VyX3R5cGVfbm9k ZSwgZW5jb2RlZF9lbGVtc1tpXSkpOworICByZXR1cm4gYnVpbGRlci5idWlsZCAoKTsKK30KKwor c3RhdGljIHZvaWQKK3Rlc3RfdmVjX3Blcm1fdmxhX2ZvbGRpbmcgKCkKK3sKKyAgaW50IGFyZzBf ZWxlbXNbXSA9IHsgMSwgMTEsIDIsIDEyLCAzLCAxMyB9OworICB0cmVlIGFyZzAgPSBidWlsZF92 ZWNfaW50X2NzdCAoMiwgMywgYXJnMF9lbGVtcyk7CisKKyAgaW50IGFyZzFfZWxlbXNbXSA9IHsg MjEsIDMxLCAyMiwgMzIsIDIzLCAzMyB9OworICB0cmVlIGFyZzEgPSBidWlsZF92ZWNfaW50X2Nz dCAoMiwgMywgYXJnMV9lbGVtcyk7CisKKyAgaWYgKFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVF X1RZUEUgKGFyZzApKS5pc19jb25zdGFudCAoKQorICAgICAgfHwgVFlQRV9WRUNUT1JfU1VCUEFS VFMgKFRSRUVfVFlQRSAoYXJnMSkpLmlzX2NvbnN0YW50ICgpKQorICAgIHJldHVybjsKKworICAv KiBDYXNlIDE6IEZvciBtYXNrOiB7MCwgMSwgMiwgLi4ufSwgbnBhdHRlcm5zID09IDEsIG5lbHRz X3Blcl9wYXR0ZXJuID09IDMsCisgICAgIHNob3VsZCBzZWxlY3QgYXJnMC4gICovCisgIHsKKyAg ICBpbnQgbWFza19lbGVtc1tdID0gezAsIDEsIDJ9OworICAgIHRyZWUgbWFzayA9IGJ1aWxkX3Zl Y19pbnRfY3N0ICgxLCAzLCBtYXNrX2VsZW1zKTsKKyAgICB0cmVlIHJlcyA9IGZvbGRfdGVybmFy eSAoVkVDX1BFUk1fRVhQUiwgVFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwgbWFzayk7Cisg ICAgQVNTRVJUX1RSVUUgKFZFQ1RPUl9DU1RfTlBBVFRFUk5TIChyZXMpID09IDIpOworICAgIEFT U0VSVF9UUlVFIChWRUNUT1JfQ1NUX05FTFRTX1BFUl9QQVRURVJOIChyZXMpID09IDMpOworCisg ICAgdW5zaWduZWQgcmVzX25lbHRzID0gdmVjdG9yX2NzdF9lbmNvZGVkX25lbHRzIChyZXMpOwor ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZXNfbmVsdHM7IGkrKykKKyAgICAgIEFTU0VS VF9UUlVFIChvcGVyYW5kX2VxdWFsX3AgKFZFQ1RPUl9DU1RfRUxUIChyZXMsIGkpLAorCQkJCSAg ICBWRUNUT1JfQ1NUX0VMVCAoYXJnMCwgaSksIDApKTsKKyAgfQorCisgIC8qIENhc2UgMjogRm9y IG1hc2s6IHs0LCA1LCA2LCAuLi59LCBucGF0dGVybnMgPT0gMSwgbmVsdHNfcGVyX3BhdHRlcm4g PT0gMywKKyAgICAgc2hvdWxkIHJldHVybiBOVUxMIGJlY2F1c2UgZm9yIGxlbiA9IDQgKyA0eCwK KyAgICAgaWYgeCA9PSAwLCB3ZSBzZWxlY3QgZnJvbSBhcmcxCisgICAgIGlmIHggPiAwLCB3ZSBz ZWxlY3QgZnJvbSBhcmcwCisgICAgIGFuZCB0aHVzIGNhbm5vdCBkZXRlcm1pbmUgcmVzdWx0IGF0 IGNvbXBpbGUgdGltZS4gICovCisgIHsKKyAgICBpbnQgbWFza19lbGVtc1tdID0gezQsIDUsIDZ9 OworICAgIHRyZWUgbWFzayA9IGJ1aWxkX3ZlY19pbnRfY3N0ICgxLCAzLCBtYXNrX2VsZW1zKTsK KyAgICB0cmVlIHJlcyA9IGZvbGRfdGVybmFyeSAoVkVDX1BFUk1fRVhQUiwgVFJFRV9UWVBFIChh cmcwKSwgYXJnMCwgYXJnMSwgbWFzayk7CisgICAgZ2NjX2Fzc2VydCAocmVzID09IE5VTExfVFJF RSk7CisgIH0KKworICAvKiBDYXNlIDM6CisgICAgIG1hc2s6IHswLCAwLCAwLCAxLCAwLCAyLCAu Li59IAorICAgICBucGF0dGVybnMgPT0gMiwgbmVsdHNfcGVyX3BhdHRlcm4gPT0gMworICAgICBQ YXR0ZXJuIHswLCAuLi59IHNob3VsZCBzZWxlY3QgYXJnMFswXSwgaWUsIDEuCisgICAgIFBhdHRl cm4gezAsIDEsIDIsIC4uLn0gc2hvdWxkIHNlbGVjdCBhcmcwOiB7MSwgMTEsIDIsIC4uLn0sCisg ICAgIHNvIHJlcyA9IHsxLCAxLCAxLCAxMSwgMSwgMiwgLi4ufS4gICovCisgIHsKKyAgICBpbnQg bWFza19lbGVtc1tdID0gezAsIDAsIDAsIDEsIDAsIDJ9OworICAgIHRyZWUgbWFzayA9IGJ1aWxk X3ZlY19pbnRfY3N0ICgyLCAzLCBtYXNrX2VsZW1zKTsKKyAgICB0cmVlIHJlcyA9IGZvbGRfdGVy bmFyeSAoVkVDX1BFUk1fRVhQUiwgVFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwgbWFzayk7 CisKKyAgICBBU1NFUlRfVFJVRSAoVkVDVE9SX0NTVF9OUEFUVEVSTlMgKHJlcykgPT0gMik7Cisg ICAgQVNTRVJUX1RSVUUgKFZFQ1RPUl9DU1RfTkVMVFNfUEVSX1BBVFRFUk4gKHJlcykgPT0gMyk7 CisKKyAgICAvKiBDaGVjayBlbmNvZGluZzogezEsIDExLCAyLCAuLi59ICovCisgICAgaW50IHJl c19lbmNvZGVkX2VsZW1zW10gPSB7MSwgMSwgMSwgMTEsIDEsIDJ9OworICAgIGZvciAodW5zaWdu ZWQgaSA9IDA7IGkgPCB2ZWN0b3JfY3N0X2VuY29kZWRfbmVsdHMgKHJlcyk7IGkrKykKKyAgICAg IEFTU0VSVF9UUlVFICh3aTo6dG9fd2lkZShWRUNUT1JfQ1NUX0VMVCAocmVzLCBpKSkgPT0gcmVz X2VuY29kZWRfZWxlbXNbaV0pOworICB9CisKKyAgLyogQ2FzZSA0OgorICAgICBtYXNrOiB7MCwg NCArIDR4LCAwLCA1ICsgNHgsIDAsIDYgKyA0eCwgLi4ufQorICAgICBucGF0dGVybnMgPT0gMiwg bmVsdHNfcGVyX3BhdHRlcm4gPT0gMworICAgICBQYXR0ZXJuIHswLCAuLi59IHNob3VsZCBzZWxl Y3QgYXJnMFsxXQorICAgICBQYXR0ZXJuIHs0ICsgNHgsIDUgKyA0eCwgNiArIDR4LCAuLi59IHNo b3VsZCBzZWxlY3QgZnJvbSBhcmcxLCBzaW5jZToKKyAgICAgYTEgPSA1ICsgNHgKKyAgICAgYWUg PSAoNSArIDR4KSArICgoNCArIDR4KSAvIDIgLSAyKSAqIDEKKyAgICAgICAgPSA1ICsgNngKKyAg ICAgU2luY2UgYTEvNCs0eCA9PSBhZS80KzR4ID09IDEsIHdlIHNlbGVjdCBhcmcxWzBdLCBhcmcx WzFdLCBhcmcxWzJdLCAuLi4KKyAgICAgcmVzOiB7MSwgMjEsIDEsIDMxLCAxLCAyMiwgLi4uIH0K KyAgICAgRklYTUU6IEhvdyB0byBidWlsZCB2ZWN0b3Igd2l0aCBwb2x5X2ludCBlbGVtcyA/ICAq LworCisgIC8qIENhc2UgNTogUyA8IDAuICAqLworfQorCiAvKiBSdW4gYWxsIG9mIHRoZSBzZWxm dGVzdHMgd2l0aGluIHRoaXMgZmlsZS4gICovCiAKIHZvaWQKQEAgLTE2OTE4LDYgKzE3MDk4LDcg QEAgZm9sZF9jb25zdF9jY190ZXN0cyAoKQogICB0ZXN0X2FyaXRobWV0aWNfZm9sZGluZyAoKTsK ICAgdGVzdF92ZWN0b3JfZm9sZGluZyAoKTsKICAgdGVzdF92ZWNfZHVwbGljYXRlX2ZvbGRpbmcg KCk7CisgIHRlc3RfdmVjX3Blcm1fdmxhX2ZvbGRpbmcgKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNl IHNlbGZ0ZXN0Cg== --00000000000043c6b505eaabeaff--