Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sPRQW-004d3n-Gz for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Jul 2024 18:43:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sPRQU-0029DZ-Ff for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Jul 2024 18:43:27 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sPRQU-0029DR-1Z for pgsql-hackers@lists.postgresql.org; Thu, 04 Jul 2024 18:43:26 +0000 Received: from mail-il1-x133.google.com ([2607:f8b0:4864:20::133]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sPRQS-000QnV-1d for pgsql-hackers@postgresql.org; Thu, 04 Jul 2024 18:43:26 +0000 Received: by mail-il1-x133.google.com with SMTP id e9e14a558f8ab-37636c38d6aso3765075ab.3 for ; Thu, 04 Jul 2024 11:43:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720118601; x=1720723401; darn=postgresql.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=ODvYrP96u2erYe7E4ajEjc9QJ1c07omEff3JJpAByh0=; b=QUpEjHhKPUfDFnADFqZI4EAHz4+imBKGDWnDaaEfCfbLCOWxKaeHef6DodNyZZWonX 5Y322QzmE9FoudeC0NmjDQecG2FrR/8ufs+vu7ixKJ5YragHWyTrrPmpEKKf7NruaWM0 yY/+ZO03GeyoOM7YxVACs7pC4BLdtc3yVjPIjJ/GRZLAUq8UWKkSc5Dh4ELBWCEdezBG pda0iOOXAurFMKjkqdkCk7KGuwXsG+bXQ+BoWJ2SbZjMlFMJm0NuV6hDaT3+B7TmZtPT E6UohSGWcMaUErJbn9am+ht2yRy8xtr6NCvH1tFxrn7BBktKoFcvWl4Fs0/ANqgS5eAO egNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720118601; x=1720723401; 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=ODvYrP96u2erYe7E4ajEjc9QJ1c07omEff3JJpAByh0=; b=sQ/4xMHoImSEWmAq9xM6PNsyigz81EYmSzrfTWXaEJ3TZ65Q4fpJU11KHlzvYuue6I liJejHPSQa+iOVlBTBTNIQyQhzKxae9qcszrwYCI3uYugI7hlLdvddiknj4KTP9y6bgm fXiGj+V1ALq1jRw+2gAYJDl5F5nbAkQAC875QSqsP2C5tbx2Fw4Gsi1c9prL9ahm4GZO xQXOiQIYPE6qVdR9Bn9GDhRwd3CJF1tdCaAdgAk8RAG7Cv63lrtmSCdzlq2pEALjTjLw JC7wvgyVTCWFYCPU6ZvzdyL/loT9NbsWm5Nt7K9kd9N64u3sZg3IeUkVp4flW+OHU116 /k9A== X-Forwarded-Encrypted: i=1; AJvYcCWiBjC302Ts1yFO62Mgp0VTs7wau8+zydahcO7QQixXsArQYVgUKooVASLjRiUmLjW8owHgDmOAYv3sI2vf1KGKB5kFZD1ibNYmIdC9 X-Gm-Message-State: AOJu0YzJmezNQBOxVZmhGJ6c8t+X2rnzDY3h5QaBxSGdoCQExnMJ5eX/ 84C/h4zVfmjRpYygx6AHlPEiMVQCqyy4f+3By5gVre2mQTOCXwE8tCFafX2ucNKeN1ZeaAkjSdU AwfCetJQQ+Z9tShhkh3WFL3Da/Vw8feKS X-Google-Smtp-Source: AGHT+IHu8ouMHiwvyhuNgb+kjGzGPcPJT736IjFDU03Euu7Uh/we7Z1SodA1SBMWfPcgPpODj3X8IAOBm1HOzLCPGxU= X-Received: by 2002:a05:6e02:1647:b0:381:aa0b:3cd8 with SMTP id e9e14a558f8ab-3839861adaamr34749185ab.4.1720118601470; Thu, 04 Jul 2024 11:43:21 -0700 (PDT) MIME-Version: 1.0 References: <44d2ffca-d560-4919-b85a-4d07060946aa@app.fastmail.com> <87zfr1e1uj.fsf@wibble.ilmari.org> <9ff90ff9-5ac1-4529-b2f4-f93b37734b9c@app.fastmail.com> <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> <8e909218-1965-4515-99e3-4bb5b625e004@app.fastmail.com> <0459ded5-6daf-4bf0-9ab0-e1f11ab15ec6@app.fastmail.com> <4e54bf4f-59fe-4c9a-b446-a2b64cbfd584@app.fastmail.com> <27d42b25-f328-4231-9db0-3811dc77c8cf@app.fastmail.com> <33c51978-8ee8-438c-9804-e46c0ca8f3f9@app.fastmail.com> <018dd6e8-8f21-4b3b-8d80-2d128f6d00b4@app.fastmail.com> <32510d71-8c00-4896-9c11-5ea4b3c01ffc@app.fastmail.com> <31b8386d-4bcb-4909-b7da-bbeb9a8ece55@app.fastmail.com> In-Reply-To: <31b8386d-4bcb-4909-b7da-bbeb9a8ece55@app.fastmail.com> From: Dean Rasheed Date: Thu, 4 Jul 2024 19:43:10 +0100 Message-ID: Subject: Re: Optimize numeric multiplication for one and two base-NBASE digit multiplicands. To: Joel Jacobson Cc: =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= , pgsql-hackers Content-Type: multipart/mixed; boundary="00000000000036add3061c70527d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000036add3061c70527d Content-Type: text/plain; charset="UTF-8" On Wed, 3 Jul 2024 at 21:45, Joel Jacobson wrote: > > > On Wed, Jul 3, 2024, at 20:57, Dean Rasheed wrote: > >> I wouldn't expect it to ever be off by more than 1 > > > > OK, so then the cases I found where it was off by 2 for the mul_var_int() patch > > are unexpected? > > Sorry, I meant off by 2 for the mul_var_small() patch, these cases that I found: > Yeah, so that was another bug in mul_var_small(). If rscale is made small enough, the result index for the digits computed before the main loop overlaps the ones after, so it would overwrite digits already computed. Of course, that's fairly easy to fix, but at this point I think the better solution is to only use mul_var_small() when an exact product is requested. We would have to do that for mul_var_int() anyway, because of its accuracy issues discussed earlier. I think this is a reasonable thing to do because only functions like ln_var() and exp_var() will ask mul_var() for a reduced-rscale result, and those functions are likely to be dominated by computations involving larger numbers, for which this patch wouldn't help anyway. Also those functions are probably less widely used. If we make that decision, a lot of the complexity in mul_var_small() goes away, including all the conditional array accesses, making it simpler and more efficient. v6 patch attached. I also updated the mul_var_int() patch so that it is also only invoked when an exact product is requested, and I noticed a couple of other minor optimisations that could be made. Then I decided to try implementing mul_var_int64(). This gives a pretty decent speedup for 3-digit inputs, but unfortunately it is much slower for 4-digit inputs (for which most values will go through the 128-bit code path). I'm attaching that too, just for information, but it's clearly not going to be acceptable as-is. Running your benchmark queries, I got these results: SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_1; Time: 4520.874 ms (00:04.521) -- HEAD Time: 3937.536 ms (00:03.938) -- v5-mul_var_int.patch Time: 3919.495 ms (00:03.919) -- v5-mul_var_small.patch Time: 3916.964 ms (00:03.917) -- v6-mul_var_int64.patch Time: 3811.118 ms (00:03.811) -- v6-mul_var_small.patch SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_2; Time: 4762.528 ms (00:04.763) -- HEAD Time: 4075.546 ms (00:04.076) -- v5-mul_var_int.patch Time: 4055.180 ms (00:04.055) -- v5-mul_var_small.patch Time: 4037.866 ms (00:04.038) -- v6-mul_var_int64.patch Time: 4018.488 ms (00:04.018) -- v6-mul_var_small.patch SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_3; Time: 5387.514 ms (00:05.388) -- HEAD Time: 5350.736 ms (00:05.351) -- v5-mul_var_int.patch Time: 4648.449 ms (00:04.648) -- v5-mul_var_small.patch Time: 4655.204 ms (00:04.655) -- v6-mul_var_int64.patch Time: 4645.962 ms (00:04.646) -- v6-mul_var_small.patch SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_4; Time: 5617.150 ms (00:05.617) -- HEAD Time: 5505.913 ms (00:05.506) -- v5-mul_var_int.patch Time: 5486.441 ms (00:05.486) -- v5-mul_var_small.patch Time: 8203.081 ms (00:08.203) -- v6-mul_var_int64.patch Time: 5598.909 ms (00:05.599) -- v6-mul_var_small.patch So v6-mul_var_int64 improves on v5-mul_var_int in the 3-digit case, but is terrible in the 4-digit case. None of the other patches touch the 4-digit case, but it might be interesting to try mul_var_small() with 4 digits. Regards, Dean --00000000000036add3061c70527d Content-Type: text/x-patch; charset="US-ASCII"; name="v6-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch" Content-Disposition: attachment; filename="v6-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ly7lufmt0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvbnVtZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTBhMjAu LmJhZTA3ZjIKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYworKysgYi9zcmMv YmFja2VuZC91dGlscy9hZHQvbnVtZXJpYy5jCkBAIC01NTEsNiArNTUxLDggQEAgc3RhdGljIHZv aWQgc3ViX3Zhcihjb25zdCBOdW1lcmljVmFyICp2YQogc3RhdGljIHZvaWQgbXVsX3Zhcihjb25z dCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogCQkJCQlOdW1lcmlj VmFyICpyZXN1bHQsCiAJCQkJCWludCByc2NhbGUpOworc3RhdGljIHZvaWQgbXVsX3Zhcl9zbWFs bChjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAorCQkJCQkJ ICBOdW1lcmljVmFyICpyZXN1bHQsIGludCByc2NhbGUpOwogc3RhdGljIHZvaWQgZGl2X3Zhcihj b25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogCQkJCQlOdW1l cmljVmFyICpyZXN1bHQsCiAJCQkJCWludCByc2NhbGUsIGJvb2wgcm91bmQpOwpAQCAtODcwNyw3 ICs4NzA5LDcgQEAgbXVsX3Zhcihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdQogCXZh cjFkaWdpdHMgPSB2YXIxLT5kaWdpdHM7CiAJdmFyMmRpZ2l0cyA9IHZhcjItPmRpZ2l0czsKIAot CWlmICh2YXIxbmRpZ2l0cyA9PSAwIHx8IHZhcjJuZGlnaXRzID09IDApCisJaWYgKHZhcjFuZGln aXRzID09IDApCiAJewogCQkvKiBvbmUgb3IgYm90aCBpbnB1dHMgaXMgemVybzsgc28gaXMgcmVz dWx0ICovCiAJCXplcm9fdmFyKHJlc3VsdCk7CkBAIC04NzE1LDYgKzg3MTcsMTcgQEAgbXVsX3Zh cihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdQogCQlyZXR1cm47CiAJfQogCisJLyoK KwkgKiBJZiB2YXIxIGhhcyAzIGRpZ2l0cyBvciBmZXdlciwgYW5kIHdlIGFyZSBjb21wdXRpbmcg dGhlIGV4YWN0IHJlc3VsdCwKKwkgKiB3aXRoIG5vIHJvdW5kaW5nLCBkZWxlZ2F0ZSB0byBtdWxf dmFyX3NtYWxsKCkgd2hpY2ggdXNlcyBhIGZhc3RlciBzaG9ydAorCSAqIG11bHRpcGxpY2F0aW9u IGFsZ29yaXRobS4KKwkgKi8KKwlpZiAodmFyMW5kaWdpdHMgPD0gMyAmJiByc2NhbGUgPT0gdmFy MS0+ZHNjYWxlICsgdmFyMi0+ZHNjYWxlKQorCXsKKwkJbXVsX3Zhcl9zbWFsbCh2YXIxLCB2YXIy LCByZXN1bHQsIHJzY2FsZSk7CisJCXJldHVybjsKKwl9CisKIAkvKiBEZXRlcm1pbmUgcmVzdWx0 IHNpZ24gYW5kIChtYXhpbXVtIHBvc3NpYmxlKSB3ZWlnaHQgKi8KIAlpZiAodmFyMS0+c2lnbiA9 PSB2YXIyLT5zaWduKQogCQlyZXNfc2lnbiA9IE5VTUVSSUNfUE9TOwpAQCAtODg1OCw2ICs4ODcx LDE2OCBAQCBtdWxfdmFyKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51CiAJcmVzdWx0 LT5zaWduID0gcmVzX3NpZ247CiAKIAkvKiBSb3VuZCB0byB0YXJnZXQgcnNjYWxlIChhbmQgc2V0 IHJlc3VsdC0+ZHNjYWxlKSAqLworCXJvdW5kX3ZhcihyZXN1bHQsIHJzY2FsZSk7CisKKwkvKiBT dHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB6ZXJvZXMgKi8KKwlzdHJpcF92YXIocmVzdWx0KTsK K30KKworCisvKgorICogbXVsX3Zhcl9zbWFsbCgpIC0KKyAqCisgKglUaGlzIGhhcyB0aGUgc2Ft ZSBBUEkgYXMgbXVsX3ZhciwgYnV0IGl0IGFzc3VtZXMgdGhhdCB2YXIxIGhhcyBubyBtb3JlCisg Kgl0aGFuIDMgZGlnaXRzIGFuZCB2YXIyIGhhcyBhdCBsZWFzdCBhcyBtYW55IGRpZ2l0cyBhcyB2 YXIxLiAgRm9yIHZhcmlhYmxlcworICoJc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zLCB0aGUg cHJvZHVjdCBjYW4gYmUgY29tcHV0ZWQgbW9yZSBxdWlja2x5IHRoYW4KKyAqCXRoZSBnZW5lcmFs IGFsZ29yaXRobSB1c2VkIGluIG11bF92YXIuCisgKi8KK3N0YXRpYyB2b2lkCittdWxfdmFyX3Nt YWxsKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsCisJCQkg IE51bWVyaWNWYXIgKnJlc3VsdCwgaW50IHJzY2FsZSkKK3sKKwlpbnQJCQl2YXIxbmRpZ2l0cyA9 IHZhcjEtPm5kaWdpdHM7CisJaW50CQkJdmFyMm5kaWdpdHMgPSB2YXIyLT5uZGlnaXRzOworCU51 bWVyaWNEaWdpdCAqdmFyMWRpZ2l0cyA9IHZhcjEtPmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnZh cjJkaWdpdHMgPSB2YXIyLT5kaWdpdHM7CisJaW50CQkJcmVzX3NpZ247CisJaW50CQkJcmVzX3dl aWdodDsKKwlpbnQJCQlyZXNfbmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnJlc19idWY7CisJTnVt ZXJpY0RpZ2l0ICpyZXNfZGlnaXRzOworCXVpbnQzMgkJY2Fycnk7CisJdWludDMyCQl0ZXJtOwor CisJLyogQ2hlY2sgcHJlY29uZGl0aW9ucyAqLworCUFzc2VydCh2YXIxbmRpZ2l0cyA8PSAzKTsK KwlBc3NlcnQodmFyMm5kaWdpdHMgPj0gdmFyMW5kaWdpdHMpOworCisJLyogRGV0ZXJtaW5lIHJl c3VsdCBzaWduIGFuZCAobWF4aW11bSBwb3NzaWJsZSkgd2VpZ2h0ICovCisJaWYgKHZhcjEtPnNp Z24gPT0gdmFyMi0+c2lnbikKKwkJcmVzX3NpZ24gPSBOVU1FUklDX1BPUzsKKwllbHNlCisJCXJl c19zaWduID0gTlVNRVJJQ19ORUc7CisJcmVzX3dlaWdodCA9IHZhcjEtPndlaWdodCArIHZhcjIt PndlaWdodCArIDI7CisKKwkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiByZXN1bHQgZGlnaXRz IHRvIGNvbXB1dGUgLSBjZi4gbXVsX3ZhcigpICovCisJcmVzX25kaWdpdHMgPSB2YXIxbmRpZ2l0 cyArIHZhcjJuZGlnaXRzICsgMTsKKworCWlmIChyZXNfbmRpZ2l0cyA8IDMpCisJeworCQkvKiBB bGwgaW5wdXQgZGlnaXRzIHdpbGwgYmUgaWdub3JlZDsgc28gcmVzdWx0IGlzIHplcm8gKi8KKwkJ emVyb192YXIocmVzdWx0KTsKKwkJcmVzdWx0LT5kc2NhbGUgPSByc2NhbGU7CisJCXJldHVybjsK Kwl9CisKKwkvKiBBbGxvY2F0ZSByZXN1bHQgZGlnaXQgYXJyYXkgKi8KKwlyZXNfYnVmID0gZGln aXRidWZfYWxsb2MocmVzX25kaWdpdHMpOworCXJlc19idWZbMF0gPSAwOwkJCQkvKiBzcGFyZSBk aWdpdCBmb3IgbGF0ZXIgcm91bmRpbmcgKi8KKwlyZXNfZGlnaXRzID0gcmVzX2J1ZiArIDE7CisK KwkvKgorCSAqIENvbXB1dGUgdGhlIHJlc3VsdCBkaWdpdHMgaW4gcmV2ZXJzZSwgaW4gb25lIHBh c3MsIHByb3BhZ2F0aW5nIHRoZQorCSAqIGNhcnJ5IHVwIGFzIHdlIGdvLgorCSAqCisJICogVGhp cyBjb21wdXRlcyByZXNfZGlnaXRzW3Jlc19uZGlnaXRzIC0gMl0sIC4uLiByZXNfZGlnaXRzWzBd IGJ5IHN1bW1pbmcKKwkgKiB0aGUgcHJvZHVjdHMgdmFyMWRpZ2l0c1tpMV0gKiB2YXIyZGlnaXRz W2kyXSBmb3Igd2hpY2ggaTEgKyBpMiArIDEgaXMKKwkgKiB0aGUgcmVzdWx0IGluZGV4LgorCSAq LworCXN3aXRjaCAodmFyMW5kaWdpdHMpCisJeworCQljYXNlIDE6CisJCQkvKiAtLS0tLS0tLS0K KwkJCSAqIDEtZGlnaXQgY2FzZToKKwkJCSAqCQl2YXIxbmRpZ2l0cyA9IDEKKwkJCSAqCQl2YXIy bmRpZ2l0cyA+PSAxCisJCQkgKgkJcmVzX25kaWdpdHMgPSB2YXIybmRpZ2l0cyArIDIKKwkJCSAq IC0tLS0tLS0tLS0KKwkJCSAqLworCQkJY2FycnkgPSAwOworCQkJZm9yIChpbnQgaSA9IHJlc19u ZGlnaXRzIC0gMzsgaSA+PSAwOyBpLS0pCisJCQl7CisJCQkJdGVybSA9ICh1aW50MzIpIHZhcjFk aWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ldICsgY2Fycnk7CisJCQkJcmVzX2RpZ2l0c1tpICsgMV0g PSAoTnVtZXJpY0RpZ2l0KSAodGVybSAlIE5CQVNFKTsKKwkJCQljYXJyeSA9IHRlcm0gLyBOQkFT RTsKKwkJCX0KKwkJCXJlc19kaWdpdHNbMF0gPSAoTnVtZXJpY0RpZ2l0KSBjYXJyeTsKKwkJCWJy ZWFrOworCisJCWNhc2UgMjoKKwkJCS8qIC0tLS0tLS0tLQorCQkJICogMi1kaWdpdCBjYXNlOgor CQkJICoJCXZhcjFuZGlnaXRzID0gMgorCQkJICoJCXZhcjJuZGlnaXRzID49IDIKKwkJCSAqCQly ZXNfbmRpZ2l0cyA9IHZhcjJuZGlnaXRzICsgMworCQkJICogLS0tLS0tLS0tLQorCQkJICovCisJ CQkvKiBsYXN0IHJlc3VsdCBkaWdpdCBhbmQgY2FycnkgKi8KKwkJCXRlcm0gPSAodWludDMyKSB2 YXIxZGlnaXRzWzFdICogdmFyMmRpZ2l0c1tyZXNfbmRpZ2l0cyAtIDRdOworCQkJcmVzX2RpZ2l0 c1tyZXNfbmRpZ2l0cyAtIDJdID0gKE51bWVyaWNEaWdpdCkgKHRlcm0gJSBOQkFTRSk7CisJCQlj YXJyeSA9IHRlcm0gLyBOQkFTRTsKKworCQkJLyogcmVtYWluaW5nIGRpZ2l0cywgZXhjZXB0IGZv ciB0aGUgZmlyc3QgdHdvICovCisJCQlmb3IgKGludCBpID0gcmVzX25kaWdpdHMgLSA0OyBpID49 IDE7IGktLSkKKwkJCXsKKwkJCQl0ZXJtID0gKHVpbnQzMikgdmFyMWRpZ2l0c1swXSAqIHZhcjJk aWdpdHNbaV0gKworCQkJCQkodWludDMyKSB2YXIxZGlnaXRzWzFdICogdmFyMmRpZ2l0c1tpIC0g MV0gKyBjYXJyeTsKKwkJCQlyZXNfZGlnaXRzW2kgKyAxXSA9IChOdW1lcmljRGlnaXQpICh0ZXJt ICUgTkJBU0UpOworCQkJCWNhcnJ5ID0gdGVybSAvIE5CQVNFOworCQkJfQorCisJCQkvKiBmaXJz dCB0d28gZGlnaXRzICovCisJCQl0ZXJtID0gKHVpbnQzMikgdmFyMWRpZ2l0c1swXSAqIHZhcjJk aWdpdHNbMF0gKyBjYXJyeTsKKwkJCXJlc19kaWdpdHNbMV0gPSAoTnVtZXJpY0RpZ2l0KSAodGVy bSAlIE5CQVNFKTsKKwkJCXJlc19kaWdpdHNbMF0gPSAoTnVtZXJpY0RpZ2l0KSAodGVybSAvIE5C QVNFKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMzoKKwkJCS8qIC0tLS0tLS0tLQorCQkJICogMy1k aWdpdCBjYXNlOgorCQkJICoJCXZhcjFuZGlnaXRzID0gMworCQkJICoJCXZhcjJuZGlnaXRzID49 IDMKKwkJCSAqCQlyZXNfbmRpZ2l0cyA9IHZhcjJuZGlnaXRzICsgNAorCQkJICogLS0tLS0tLS0t LQorCQkJICovCisJCQkvKiBsYXN0IHR3byByZXN1bHQgZGlnaXRzICovCisJCQl0ZXJtID0gKHVp bnQzMikgdmFyMWRpZ2l0c1syXSAqIHZhcjJkaWdpdHNbcmVzX25kaWdpdHMgLSA1XTsKKwkJCXJl c19kaWdpdHNbcmVzX25kaWdpdHMgLSAyXSA9IChOdW1lcmljRGlnaXQpICh0ZXJtICUgTkJBU0Up OworCQkJY2FycnkgPSB0ZXJtIC8gTkJBU0U7CisKKwkJCXRlcm0gPSAodWludDMyKSB2YXIxZGln aXRzWzFdICogdmFyMmRpZ2l0c1tyZXNfbmRpZ2l0cyAtIDVdICsKKwkJCQkodWludDMyKSB2YXIx ZGlnaXRzWzJdICogdmFyMmRpZ2l0c1tyZXNfbmRpZ2l0cyAtIDZdICsgY2Fycnk7CisJCQlyZXNf ZGlnaXRzW3Jlc19uZGlnaXRzIC0gM10gPSAoTnVtZXJpY0RpZ2l0KSAodGVybSAlIE5CQVNFKTsK KwkJCWNhcnJ5ID0gdGVybSAvIE5CQVNFOworCisJCQkvKiByZW1haW5pbmcgZGlnaXRzLCBleGNl cHQgZm9yIHRoZSBmaXJzdCB0aHJlZSAqLworCQkJZm9yIChpbnQgaSA9IHJlc19uZGlnaXRzIC0g NTsgaSA+PSAyOyBpLS0pCisJCQl7CisJCQkJdGVybSA9ICh1aW50MzIpIHZhcjFkaWdpdHNbMF0g KiB2YXIyZGlnaXRzW2ldICsKKwkJCQkJKHVpbnQzMikgdmFyMWRpZ2l0c1sxXSAqIHZhcjJkaWdp dHNbaSAtIDFdICsKKwkJCQkJKHVpbnQzMikgdmFyMWRpZ2l0c1syXSAqIHZhcjJkaWdpdHNbaSAt IDJdICsgY2Fycnk7CisJCQkJcmVzX2RpZ2l0c1tpICsgMV0gPSAoTnVtZXJpY0RpZ2l0KSAodGVy bSAlIE5CQVNFKTsKKwkJCQljYXJyeSA9IHRlcm0gLyBOQkFTRTsKKwkJCX0KKworCQkJLyogZmly c3QgdGhyZWUgZGlnaXRzICovCisJCQl0ZXJtID0gKHVpbnQzMikgdmFyMWRpZ2l0c1swXSAqIHZh cjJkaWdpdHNbMV0gKworCQkJCSh1aW50MzIpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzWzBd ICsgY2Fycnk7CisJCQlyZXNfZGlnaXRzWzJdID0gKE51bWVyaWNEaWdpdCkgKHRlcm0gJSBOQkFT RSk7CisJCQljYXJyeSA9IHRlcm0gLyBOQkFTRTsKKwkJCXRlcm0gPSAodWludDMyKSB2YXIxZGln aXRzWzBdICogdmFyMmRpZ2l0c1swXSArIGNhcnJ5OworCQkJcmVzX2RpZ2l0c1sxXSA9IChOdW1l cmljRGlnaXQpICh0ZXJtICUgTkJBU0UpOworCQkJcmVzX2RpZ2l0c1swXSA9IChOdW1lcmljRGln aXQpICh0ZXJtIC8gTkJBU0UpOworCQkJYnJlYWs7CisJfQorCisJLyogU3RvcmUgdGhlIHByb2R1 Y3QgaW4gcmVzdWx0IChtaW51cyBleHRyYSByb3VuZGluZyBkaWdpdCkgKi8KKwlkaWdpdGJ1Zl9m cmVlKHJlc3VsdC0+YnVmKTsKKwlyZXN1bHQtPm5kaWdpdHMgPSByZXNfbmRpZ2l0cyAtIDE7CisJ cmVzdWx0LT5idWYgPSByZXNfYnVmOworCXJlc3VsdC0+ZGlnaXRzID0gcmVzX2RpZ2l0czsKKwly ZXN1bHQtPndlaWdodCA9IHJlc193ZWlnaHQgLSAxOworCXJlc3VsdC0+c2lnbiA9IHJlc19zaWdu OworCisJLyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkg Ki8KIAlyb3VuZF92YXIocmVzdWx0LCByc2NhbGUpOwogCiAJLyogU3RyaXAgbGVhZGluZyBhbmQg dHJhaWxpbmcgemVyb2VzICovCg== --00000000000036add3061c70527d Content-Type: text/x-patch; charset="US-ASCII"; name="v6-add-mul_var_int64.patch" Content-Disposition: attachment; filename="v6-add-mul_var_int64.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ly7lula91 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvbnVtZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTBhMjAu Ljk2NDU2ZDgKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYworKysgYi9zcmMv YmFja2VuZC91dGlscy9hZHQvbnVtZXJpYy5jCkBAIC01NTEsNiArNTUxLDEyIEBAIHN0YXRpYyB2 b2lkIHN1Yl92YXIoY29uc3QgTnVtZXJpY1ZhciAqdmEKIHN0YXRpYyB2b2lkIG11bF92YXIoY29u c3QgTnVtZXJpY1ZhciAqdmFyMSwgY29uc3QgTnVtZXJpY1ZhciAqdmFyMiwKIAkJCQkJTnVtZXJp Y1ZhciAqcmVzdWx0LAogCQkJCQlpbnQgcnNjYWxlKTsKK3N0YXRpYyB2b2lkIG11bF92YXJfaW50 KGNvbnN0IE51bWVyaWNWYXIgKnZhciwgaW50IGl2YWwsIGludCBpdmFsX3dlaWdodCwKKwkJCQkJ CU51bWVyaWNWYXIgKnJlc3VsdCwgaW50IHJzY2FsZSk7CisjaWZkZWYgSEFWRV9JTlQxMjgKK3N0 YXRpYyB2b2lkIG11bF92YXJfaW50NjQoY29uc3QgTnVtZXJpY1ZhciAqdmFyLCBpbnQ2NCBpdmFs LCBpbnQgaXZhbF93ZWlnaHQsCisJCQkJCQkgIE51bWVyaWNWYXIgKnJlc3VsdCwgaW50IHJzY2Fs ZSk7CisjZW5kaWYKIHN0YXRpYyB2b2lkIGRpdl92YXIoY29uc3QgTnVtZXJpY1ZhciAqdmFyMSwg Y29uc3QgTnVtZXJpY1ZhciAqdmFyMiwKIAkJCQkJTnVtZXJpY1ZhciAqcmVzdWx0LAogCQkJCQlp bnQgcnNjYWxlLCBib29sIHJvdW5kKTsKQEAgLTg3MDcsNyArODcxMyw3IEBAIG11bF92YXIoY29u c3QgTnVtZXJpY1ZhciAqdmFyMSwgY29uc3QgTnUKIAl2YXIxZGlnaXRzID0gdmFyMS0+ZGlnaXRz OwogCXZhcjJkaWdpdHMgPSB2YXIyLT5kaWdpdHM7CiAKLQlpZiAodmFyMW5kaWdpdHMgPT0gMCB8 fCB2YXIybmRpZ2l0cyA9PSAwKQorCWlmICh2YXIxbmRpZ2l0cyA9PSAwKQogCXsKIAkJLyogb25l IG9yIGJvdGggaW5wdXRzIGlzIHplcm87IHNvIGlzIHJlc3VsdCAqLwogCQl6ZXJvX3ZhcihyZXN1 bHQpOwpAQCAtODcxNSw2ICs4NzIxLDU0IEBAIG11bF92YXIoY29uc3QgTnVtZXJpY1ZhciAqdmFy MSwgY29uc3QgTnUKIAkJcmV0dXJuOwogCX0KIAorCS8qCisJICogSWYgdmFyMSBoYXMganVzdCBv bmUgb3IgdHdvIGRpZ2l0cywgYW5kIHdlIGFyZSBjb21wdXRpbmcgdGhlIGV4YWN0CisJICogcmVz dWx0LCB3aXRoIG5vIHJvdW5kaW5nLCBkZWxlZ2F0ZSB0byBtdWxfdmFyX2ludCgpLCB3aGljaCB1 c2VzIGEKKwkgKiBmYXN0ZXIgZGlyZWN0IG11bHRpcGxpY2F0aW9uIGFsZ29yaXRobS4KKwkgKgor CSAqIFNpbWlsYXJseSwgb24gcGxhdGZvcm1zIHdpdGggMTI4LWJpdCBpbnRlZ2VyIHN1cHBvcnQs IGRlbGVnYXRlIHRvCisJICogbXVsX3Zhcl9pbnQ2NCgpIGlmIHZhcjEgaGFzIHRocmVlIG9yIGZv dXIgZGlnaXRzLCBhbmQgd2UgYXJlIGNvbXB1dGluZworCSAqIHRoZSBleGFjdCByZXN1bHQsIHdp dGggbm8gcm91bmRpbmcuCisJICovCisJaWYgKHZhcjFuZGlnaXRzIDw9IDIgJiYgcnNjYWxlID09 IHZhcjEtPmRzY2FsZSArIHZhcjItPmRzY2FsZSkKKwl7CisJCWludAkJCWlmYWN0b3I7CisJCWlu dAkJCWlmYWN0b3Jfd2VpZ2h0OworCisJCWlmYWN0b3IgPSB2YXIxLT5kaWdpdHNbMF07CisJCWlm YWN0b3Jfd2VpZ2h0ID0gdmFyMS0+d2VpZ2h0OworCQlpZiAodmFyMW5kaWdpdHMgPT0gMikKKwkJ eworCQkJaWZhY3RvciA9IGlmYWN0b3IgKiBOQkFTRSArIHZhcjEtPmRpZ2l0c1sxXTsKKwkJCWlm YWN0b3Jfd2VpZ2h0LS07CisJCX0KKwkJaWYgKHZhcjEtPnNpZ24gPT0gTlVNRVJJQ19ORUcpCisJ CQlpZmFjdG9yID0gLWlmYWN0b3I7CisKKwkJbXVsX3Zhcl9pbnQodmFyMiwgaWZhY3RvciwgaWZh Y3Rvcl93ZWlnaHQsIHJlc3VsdCwgcnNjYWxlKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBIQVZF X0lOVDEyOAorCWlmICh2YXIxbmRpZ2l0cyA8PSA0ICYmIHJzY2FsZSA9PSB2YXIxLT5kc2NhbGUg KyB2YXIyLT5kc2NhbGUpCisJeworCQlpbnQ2NAkJaWZhY3RvcjsKKwkJaW50CQkJaWZhY3Rvcl93 ZWlnaHQ7CisKKwkJaWZhY3RvciA9IHZhcjEtPmRpZ2l0c1swXTsKKwkJaWZhY3Rvcl93ZWlnaHQg PSB2YXIxLT53ZWlnaHQ7CisJCWZvciAoaSA9IDE7IGkgPCB2YXIxbmRpZ2l0czsgaSsrKQorCQl7 CisJCQlpZmFjdG9yID0gaWZhY3RvciAqIE5CQVNFICsgdmFyMS0+ZGlnaXRzW2ldOworCQkJaWZh Y3Rvcl93ZWlnaHQtLTsKKwkJfQorCQlpZiAodmFyMS0+c2lnbiA9PSBOVU1FUklDX05FRykKKwkJ CWlmYWN0b3IgPSAtaWZhY3RvcjsKKworCQltdWxfdmFyX2ludDY0KHZhcjIsIGlmYWN0b3IsIGlm YWN0b3Jfd2VpZ2h0LCByZXN1bHQsIHJzY2FsZSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwog CS8qIERldGVybWluZSByZXN1bHQgc2lnbiBhbmQgKG1heGltdW0gcG9zc2libGUpIHdlaWdodCAq LwogCWlmICh2YXIxLT5zaWduID09IHZhcjItPnNpZ24pCiAJCXJlc19zaWduID0gTlVNRVJJQ19Q T1M7CkBAIC04ODY2LDYgKzg5MjAsMjMzIEBAIG11bF92YXIoY29uc3QgTnVtZXJpY1ZhciAqdmFy MSwgY29uc3QgTnUKIAogCiAvKgorICogbXVsX3Zhcl9pbnQoKSAtCisgKgorICoJTXVsdGlwbHkg YSBudW1lcmljIHZhcmlhYmxlIGJ5IGEgMzItYml0IGludGVnZXIgd2l0aCB0aGUgc3BlY2lmaWVk IHdlaWdodC4KKyAqCVRoZSBwcm9kdWN0IHZhciAqIGl2YWwgKiBOQkFTRV5pdmFsX3dlaWdodCBp cyBzdG9yZWQgaW4gcmVzdWx0LgorICovCitzdGF0aWMgdm9pZAorbXVsX3Zhcl9pbnQoY29uc3Qg TnVtZXJpY1ZhciAqdmFyLCBpbnQgaXZhbCwgaW50IGl2YWxfd2VpZ2h0LAorCQkJTnVtZXJpY1Zh ciAqcmVzdWx0LCBpbnQgcnNjYWxlKQoreworCU51bWVyaWNEaWdpdCAqdmFyX2RpZ2l0cyA9IHZh ci0+ZGlnaXRzOworCWludAkJCXZhcl9uZGlnaXRzID0gdmFyLT5uZGlnaXRzOworCWludAkJCXJl c19zaWduOworCWludAkJCXJlc193ZWlnaHQ7CisJaW50CQkJcmVzX25kaWdpdHM7CisJTnVtZXJp Y0RpZ2l0ICpyZXNfYnVmOworCU51bWVyaWNEaWdpdCAqcmVzX2RpZ2l0czsKKwl1aW50MzIJCWZh Y3RvcjsKKwl1aW50MzIJCWNhcnJ5OworCisJaWYgKGl2YWwgPT0gMCB8fCB2YXJfbmRpZ2l0cyA9 PSAwKQorCXsKKwkJemVyb192YXIocmVzdWx0KTsKKwkJcmVzdWx0LT5kc2NhbGUgPSByc2NhbGU7 CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgcmVzdWx0IHNpZ24sICht YXhpbXVtIHBvc3NpYmxlKSB3ZWlnaHQgYW5kIG51bWJlciBvZgorCSAqIGRpZ2l0cyB0byBjYWxj dWxhdGUuICBUaGUgd2VpZ2h0IGZpZ3VyZWQgaGVyZSBpcyBjb3JyZWN0IGlmIHRoZSBlbWl0dGVk CisJICogcHJvZHVjdCBoYXMgbm8gbGVhZGluZyB6ZXJvIGRpZ2l0czsgb3RoZXJ3aXNlIHN0cmlw X3ZhcigpIHdpbGwgZml4CisJICogdGhpbmdzIHVwLgorCSAqLworCWlmICh2YXItPnNpZ24gPT0g TlVNRVJJQ19QT1MpCisJCXJlc19zaWduID0gaXZhbCA+IDAgPyBOVU1FUklDX1BPUyA6IE5VTUVS SUNfTkVHOworCWVsc2UKKwkJcmVzX3NpZ24gPSBpdmFsID4gMCA/IE5VTUVSSUNfTkVHIDogTlVN RVJJQ19QT1M7CisJcmVzX3dlaWdodCA9IHZhci0+d2VpZ2h0ICsgaXZhbF93ZWlnaHQgKyAzOwor CS8qIFRoZSBudW1iZXIgb2YgYWNjdXJhdGUgcmVzdWx0IGRpZ2l0cyB3ZSBuZWVkIHRvIHByb2R1 Y2U6ICovCisJcmVzX25kaWdpdHMgPSB2YXJfbmRpZ2l0cyArIDM7CisKKwlyZXNfYnVmID0gZGln aXRidWZfYWxsb2MocmVzX25kaWdpdHMgKyAxKTsKKwlyZXNfYnVmWzBdID0gMDsJCQkJLyogc3Bh cmUgZGlnaXQgZm9yIGxhdGVyIHJvdW5kaW5nICovCisJcmVzX2RpZ2l0cyA9IHJlc19idWYgKyAx OworCisJLyoKKwkgKiBOb3cgY29tcHV0ZSB0aGUgcHJvZHVjdCBkaWdpdHMgYnkgcHJvY2Vzc2lu ZyB0aGUgaW5wdXQgZGlnaXRzIGluCisJICogcmV2ZXJzZSBhbmQgcHJvcGFnYXRpbmcgdGhlIGNh cnJ5IHVwIGFzIHdlIGdvLgorCSAqCisJICogSW4gdGhpcyBhbGdvcml0aG0sIHRoZSBjYXJyeSBm cm9tIG9uZSBkaWdpdCB0byB0aGUgbmV4dCBpcyBhdCBtb3N0CisJICogZmFjdG9yIC0gMSwgYW5k IHByb2R1Y3QgaXMgYXQgbW9zdCBmYWN0b3IgKiBOQkFTRSAtIDEsIGFuZCBzbyBpdCBuZWVkcwor CSAqIHRvIGJlIGEgNjQtYml0IGludGVnZXIgaWYgdGhpcyBleGNlZWRzIFVJTlRfTUFYLgorCSAq LworCWZhY3RvciA9IGFicyhpdmFsKTsKKwljYXJyeSA9IDA7CisKKwlpZiAoZmFjdG9yIDw9IFVJ TlRfTUFYIC8gTkJBU0UpCisJeworCQkvKiBwcm9kdWN0IGNhbm5vdCBvdmVyZmxvdyAzMiBiaXRz ICovCisJCXVpbnQzMgkJcHJvZHVjdDsKKworCQlmb3IgKGludCBpID0gcmVzX25kaWdpdHMgLSA0 OyBpID49IDA7IGktLSkKKwkJeworCQkJcHJvZHVjdCA9IGZhY3RvciAqIHZhcl9kaWdpdHNbaV0g KyBjYXJyeTsKKwkJCXJlc19kaWdpdHNbaSArIDNdID0gKE51bWVyaWNEaWdpdCkgKHByb2R1Y3Qg JSBOQkFTRSk7CisJCQljYXJyeSA9IHByb2R1Y3QgLyBOQkFTRTsKKwkJfQorCQkvKiBub3RlOiBj YXJyeSA8IFVJTlRfTUFYIC8gTkJBU0UgaW4gdGhpcyBicmFuY2ggKi8KKwkJcmVzX2RpZ2l0c1sy XSA9IChOdW1lcmljRGlnaXQpIChjYXJyeSAlIE5CQVNFKTsKKwkJY2FycnkgPSBjYXJyeSAvIE5C QVNFOworCQlBc3NlcnQoY2FycnkgPCBOQkFTRSk7CisJCXJlc19kaWdpdHNbMV0gPSAoTnVtZXJp Y0RpZ2l0KSBjYXJyeTsKKwkJcmVzX2RpZ2l0c1swXSA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8q IHByb2R1Y3QgbWF5IGV4Y2VlZCAzMiBiaXRzICovCisJCXVpbnQ2NAkJcHJvZHVjdDsKKworCQlm b3IgKGludCBpID0gcmVzX25kaWdpdHMgLSA0OyBpID49IDA7IGktLSkKKwkJeworCQkJcHJvZHVj dCA9ICh1aW50NjQpIGZhY3RvciAqIHZhcl9kaWdpdHNbaV0gKyBjYXJyeTsKKwkJCXJlc19kaWdp dHNbaSArIDNdID0gKE51bWVyaWNEaWdpdCkgKHByb2R1Y3QgJSBOQkFTRSk7CisJCQljYXJyeSA9 ICh1aW50MzIpIChwcm9kdWN0IC8gTkJBU0UpOworCQl9CisJCXJlc19kaWdpdHNbMl0gPSAoTnVt ZXJpY0RpZ2l0KSAoY2FycnkgJSBOQkFTRSk7CisJCWNhcnJ5ID0gY2FycnkgLyBOQkFTRTsKKwkJ cmVzX2RpZ2l0c1sxXSA9IChOdW1lcmljRGlnaXQpIChjYXJyeSAlIE5CQVNFKTsKKwkJcmVzX2Rp Z2l0c1swXSA9IChOdW1lcmljRGlnaXQpIChjYXJyeSAvIE5CQVNFKTsKKwl9CisKKwkvKiBTdG9y ZSB0aGUgcHJvZHVjdCBpbiByZXN1bHQgKi8KKwlkaWdpdGJ1Zl9mcmVlKHJlc3VsdC0+YnVmKTsK KwlyZXN1bHQtPm5kaWdpdHMgPSByZXNfbmRpZ2l0czsKKwlyZXN1bHQtPmJ1ZiA9IHJlc19idWY7 CisJcmVzdWx0LT5kaWdpdHMgPSByZXNfZGlnaXRzOworCXJlc3VsdC0+d2VpZ2h0ID0gcmVzX3dl aWdodDsKKwlyZXN1bHQtPnNpZ24gPSByZXNfc2lnbjsKKworCS8qIFJvdW5kIHRvIHRhcmdldCBy c2NhbGUgKGFuZCBzZXQgcmVzdWx0LT5kc2NhbGUpICovCisJcm91bmRfdmFyKHJlc3VsdCwgcnNj YWxlKTsKKworCS8qIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHplcm9lcyAqLworCXN0cmlw X3ZhcihyZXN1bHQpOworfQorCisKKyNpZmRlZiBIQVZFX0lOVDEyOAorLyoKKyAqIG11bF92YXJf aW50NjQoKSAtCisgKgorICoJTXVsdGlwbHkgYSBudW1lcmljIHZhcmlhYmxlIGJ5IGEgNjQtYml0 IGludGVnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHdlaWdodC4KKyAqCVRoZSBwcm9kdWN0IHZhciAq IGl2YWwgKiBOQkFTRV5pdmFsX3dlaWdodCBpcyBzdG9yZWQgaW4gcmVzdWx0LgorICoKKyAqCVRo aXMgZHVwbGljYXRlcyB0aGUgbG9naWMgaW4gbXVsX3Zhcl9pbnQoKSwgc28gYW55IGNoYW5nZXMg bWFkZSB0aGVyZQorICoJc2hvdWxkIGJlIG1hZGUgaGVyZSB0b28uCisgKi8KK3N0YXRpYyB2b2lk CittdWxfdmFyX2ludDY0KGNvbnN0IE51bWVyaWNWYXIgKnZhciwgaW50NjQgaXZhbCwgaW50IGl2 YWxfd2VpZ2h0LAorCQkJICBOdW1lcmljVmFyICpyZXN1bHQsIGludCByc2NhbGUpCit7CisJTnVt ZXJpY0RpZ2l0ICp2YXJfZGlnaXRzID0gdmFyLT5kaWdpdHM7CisJaW50CQkJdmFyX25kaWdpdHMg PSB2YXItPm5kaWdpdHM7CisJaW50CQkJcmVzX3NpZ247CisJaW50CQkJcmVzX3dlaWdodDsKKwlp bnQJCQlyZXNfbmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnJlc19idWY7CisJTnVtZXJpY0RpZ2l0 ICpyZXNfZGlnaXRzOworCXVpbnQ2NAkJZmFjdG9yOworCXVpbnQ2NAkJY2Fycnk7CisKKwlpZiAo aXZhbCA9PSAwIHx8IHZhcl9uZGlnaXRzID09IDApCisJeworCQl6ZXJvX3ZhcihyZXN1bHQpOwor CQlyZXN1bHQtPmRzY2FsZSA9IHJzY2FsZTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRGV0 ZXJtaW5lIHRoZSByZXN1bHQgc2lnbiwgKG1heGltdW0gcG9zc2libGUpIHdlaWdodCBhbmQgbnVt YmVyIG9mCisJICogZGlnaXRzIHRvIGNhbGN1bGF0ZS4gIFRoZSB3ZWlnaHQgZmlndXJlZCBoZXJl IGlzIGNvcnJlY3QgaWYgdGhlIGVtaXR0ZWQKKwkgKiBwcm9kdWN0IGhhcyBubyBsZWFkaW5nIHpl cm8gZGlnaXRzOyBvdGhlcndpc2Ugc3RyaXBfdmFyKCkgd2lsbCBmaXgKKwkgKiB0aGluZ3MgdXAu CisJICovCisJaWYgKHZhci0+c2lnbiA9PSBOVU1FUklDX1BPUykKKwkJcmVzX3NpZ24gPSBpdmFs ID4gMCA/IE5VTUVSSUNfUE9TIDogTlVNRVJJQ19ORUc7CisJZWxzZQorCQlyZXNfc2lnbiA9IGl2 YWwgPiAwID8gTlVNRVJJQ19ORUcgOiBOVU1FUklDX1BPUzsKKwlyZXNfd2VpZ2h0ID0gdmFyLT53 ZWlnaHQgKyBpdmFsX3dlaWdodCArIDU7CisJLyogVGhlIG51bWJlciBvZiBhY2N1cmF0ZSByZXN1 bHQgZGlnaXRzIHdlIG5lZWQgdG8gcHJvZHVjZTogKi8KKwlyZXNfbmRpZ2l0cyA9IHZhcl9uZGln aXRzICsgNTsKKworCXJlc19idWYgPSBkaWdpdGJ1Zl9hbGxvYyhyZXNfbmRpZ2l0cyArIDEpOwor CXJlc19idWZbMF0gPSAwOwkJCQkvKiBzcGFyZSBkaWdpdCBmb3IgbGF0ZXIgcm91bmRpbmcgKi8K KwlyZXNfZGlnaXRzID0gcmVzX2J1ZiArIDE7CisKKwkvKgorCSAqIE5vdyBjb21wdXRlIHRoZSBw cm9kdWN0IGRpZ2l0cyBieSBwcm9jZXNzaW5nIHRoZSBpbnB1dCBkaWdpdHMgaW4KKwkgKiByZXZl cnNlIGFuZCBwcm9wYWdhdGluZyB0aGUgY2FycnkgdXAgYXMgd2UgZ28uCisJICoKKwkgKiBJbiB0 aGlzIGFsZ29yaXRobSwgdGhlIGNhcnJ5IGZyb20gb25lIGRpZ2l0IHRvIHRoZSBuZXh0IGlzIGF0 IG1vc3QKKwkgKiBmYWN0b3IgLSAxLCBhbmQgcHJvZHVjdCBpcyBhdCBtb3N0IGZhY3RvciAqIE5C QVNFIC0gMSwgYW5kIHNvIGl0IG5lZWRzCisJICogdG8gYmUgYSAxMjgtYml0IGludGVnZXIgaWYg dGhpcyBleGNlZWRzIFBHX1VJTlQ2NF9NQVguCisJICovCisJZmFjdG9yID0gaTY0YWJzKGl2YWwp OworCWNhcnJ5ID0gMDsKKworCWlmIChmYWN0b3IgPD0gUEdfVUlOVDY0X01BWCAvIE5CQVNFKQor CXsKKwkJLyogcHJvZHVjdCBjYW5ub3Qgb3ZlcmZsb3cgNjQgYml0cyAqLworCQl1aW50NjQJCXBy b2R1Y3Q7CisKKwkJZm9yIChpbnQgaSA9IHJlc19uZGlnaXRzIC0gNjsgaSA+PSAwOyBpLS0pCisJ CXsKKwkJCXByb2R1Y3QgPSBmYWN0b3IgKiB2YXJfZGlnaXRzW2ldICsgY2Fycnk7CisJCQlyZXNf ZGlnaXRzW2kgKyA1XSA9IChOdW1lcmljRGlnaXQpIChwcm9kdWN0ICUgTkJBU0UpOworCQkJY2Fy cnkgPSBwcm9kdWN0IC8gTkJBU0U7CisJCX0KKwkJLyogbm90ZTogY2FycnkgPCBQR19VSU5UNjRf TUFYIC8gTkJBU0UgaW4gdGhpcyBicmFuY2ggKi8KKwkJcmVzX2RpZ2l0c1s0XSA9IChOdW1lcmlj RGlnaXQpIChjYXJyeSAlIE5CQVNFKTsKKwkJY2FycnkgPSBjYXJyeSAvIE5CQVNFOworCQlyZXNf ZGlnaXRzWzNdID0gKE51bWVyaWNEaWdpdCkgKGNhcnJ5ICUgTkJBU0UpOworCQljYXJyeSA9IGNh cnJ5IC8gTkJBU0U7CisJCXJlc19kaWdpdHNbMl0gPSAoTnVtZXJpY0RpZ2l0KSAoY2FycnkgJSBO QkFTRSk7CisJCWNhcnJ5ID0gY2FycnkgLyBOQkFTRTsKKwkJQXNzZXJ0KGNhcnJ5IDwgTkJBU0Up OworCQlyZXNfZGlnaXRzWzFdID0gKE51bWVyaWNEaWdpdCkgY2Fycnk7CisJCXJlc19kaWdpdHNb MF0gPSAwOworCX0KKwllbHNlCisJeworCQkvKiBwcm9kdWN0IG1heSBleGNlZWQgNjQgYml0cyAq LworCQl1aW50MTI4CQlwcm9kdWN0OworCisJCWZvciAoaW50IGkgPSByZXNfbmRpZ2l0cyAtIDY7 IGkgPj0gMDsgaS0tKQorCQl7CisJCQlwcm9kdWN0ID0gKHVpbnQxMjgpIGZhY3RvciAqIHZhcl9k aWdpdHNbaV0gKyBjYXJyeTsKKwkJCXJlc19kaWdpdHNbaSArIDVdID0gKE51bWVyaWNEaWdpdCkg KHByb2R1Y3QgJSBOQkFTRSk7CisJCQljYXJyeSA9ICh1aW50NjQpIChwcm9kdWN0IC8gTkJBU0Up OworCQl9CisJCXJlc19kaWdpdHNbNF0gPSAoTnVtZXJpY0RpZ2l0KSAoY2FycnkgJSBOQkFTRSk7 CisJCWNhcnJ5ID0gY2FycnkgLyBOQkFTRTsKKwkJcmVzX2RpZ2l0c1szXSA9IChOdW1lcmljRGln aXQpIChjYXJyeSAlIE5CQVNFKTsKKwkJY2FycnkgPSBjYXJyeSAvIE5CQVNFOworCQlyZXNfZGln aXRzWzJdID0gKE51bWVyaWNEaWdpdCkgKGNhcnJ5ICUgTkJBU0UpOworCQljYXJyeSA9IGNhcnJ5 IC8gTkJBU0U7CisJCXJlc19kaWdpdHNbMV0gPSAoTnVtZXJpY0RpZ2l0KSAoY2FycnkgJSBOQkFT RSk7CisJCXJlc19kaWdpdHNbMF0gPSAoTnVtZXJpY0RpZ2l0KSAoY2FycnkgLyBOQkFTRSk7CisJ fQorCisJLyogU3RvcmUgdGhlIHByb2R1Y3QgaW4gcmVzdWx0ICovCisJZGlnaXRidWZfZnJlZShy ZXN1bHQtPmJ1Zik7CisJcmVzdWx0LT5uZGlnaXRzID0gcmVzX25kaWdpdHM7CisJcmVzdWx0LT5i dWYgPSByZXNfYnVmOworCXJlc3VsdC0+ZGlnaXRzID0gcmVzX2RpZ2l0czsKKwlyZXN1bHQtPndl aWdodCA9IHJlc193ZWlnaHQ7CisJcmVzdWx0LT5zaWduID0gcmVzX3NpZ247CisKKwkvKiBSb3Vu ZCB0byB0YXJnZXQgcnNjYWxlIChhbmQgc2V0IHJlc3VsdC0+ZHNjYWxlKSAqLworCXJvdW5kX3Zh cihyZXN1bHQsIHJzY2FsZSk7CisKKwkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB6ZXJv ZXMgKi8KKwlzdHJpcF92YXIocmVzdWx0KTsKK30KKyNlbmRpZgorCisKKy8qCiAgKiBkaXZfdmFy KCkgLQogICoKICAqCURpdmlzaW9uIG9uIHZhcmlhYmxlIGxldmVsLiBRdW90aWVudCBvZiB2YXIx IC8gdmFyMiBpcyBzdG9yZWQgaW4gcmVzdWx0Lgo= --00000000000036add3061c70527d--