Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pJj98-0005jW-7x for pgsql-hackers@arkaria.postgresql.org; Sun, 22 Jan 2023 22:49:06 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pJj96-0005MQ-Mf for pgsql-hackers@arkaria.postgresql.org; Sun, 22 Jan 2023 22:49:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pJj95-0005KV-LY for pgsql-hackers@lists.postgresql.org; Sun, 22 Jan 2023 22:49:04 +0000 Received: from out3-smtp.messagingengine.com ([66.111.4.27]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pJj93-0002vZ-3j for pgsql-hackers@postgresql.org; Sun, 22 Jan 2023 22:49:02 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id 527335C003E; Sun, 22 Jan 2023 17:49:00 -0500 (EST) Received: from imap48 ([10.202.2.98]) by compute2.internal (MEProxy); Sun, 22 Jan 2023 17:49:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:date:date:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to; s=fm3; t=1674427740; x=1674514140; bh=fF7+BpSnZI d/7YYpLJOupbxzt65vJ1AG6yFeclikzek=; b=KFmvaIxMGOm+9zvXGMSEc1gpJm VdXVdojKtxzO3HMum+NbS6H40xVmj2yB/LPIuQtVD9IsbkuEuwHLi6hGZ6HGbOBR 2gOcquK82FivvwvhqZ+F2SM4xa3UrultrrlvGkoNCBrGBZpED1kYalHy9RoxV/cD 0r+xthbELlQJxjkRbhLM0SO1gLre+xvrk/m9BTwIYJ2Ams1tply9ebFI1zeligYp vMtYNjW5K6xDdVxfqsm03mKozjCp6G8YKA2z5Nd6YJ87ewF0/mP58wvCMMbAWvAJ YuLN/sl/Ok6gn6oRtZqodDURf17n3bAMNtEJVmbYEU0TgNtYgBZ8QWdPzpbA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:date:date:feedback-id :feedback-id:from:from:in-reply-to:in-reply-to:message-id :mime-version:references:reply-to:sender:subject:subject:to:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; t=1674427740; x=1674514140; bh=fF7+BpSnZId/7YYpLJOupbxzt65v J1AG6yFeclikzek=; b=Y14EiKGseipmVW4qK1krWFKQ6Otd71a+OH2vvYTs0yJj 2t5DJrypcRr6EZsvAkILUyHcMMItoHgBV2ORdQUT9pPKkkDhUrEeE7wKcywplrLw HSlamZ7ceRhBuRN3RAgOFkVLmZgK9gc8/4oIUcETlrGJ2CqOdmockSoo7Y2vWtbb 8TonsqlmRhWOCxHgo8BEVTBJtuN0M69iHKIwR0o7tZ5v/L91LziGSBiy6vWnar76 1DNg2NIv785iEf/UHI4+emBNDHj95FPvVe4EOfR3Dq2NWczN/rkx8oNfwC7GGH58 DXgI0jtiqmT41fthX0NsUoSlWBOfqLnpLBB/0eFuuQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedruddujedgtdegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtsehmtderreerredtnecuhfhrohhmpedflfho vghlucflrggtohgsshhonhdfuceojhhovghlsegtohhmphhilhgvrhdrohhrgheqnecugg ftrfgrthhtvghrnheptefgjedvffeuudejkedtgfejheefffeguefhgeetueejvddtieef fedvvdevueeunecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrh homhepjhhovghlsegtohhmphhilhgvrhdrohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id E8B9931A0063; Sun, 22 Jan 2023 17:48:59 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.9.0-alpha0-85-gd6d859e0cf-fm-20230116.001-gd6d859e0 Mime-Version: 1.0 Message-Id: <38f41b4d-eff7-4d6a-a1ae-28339291cd72@app.fastmail.com> In-Reply-To: References: <889c4fa6-d750-41d1-8c15-ade7df0caf1e@app.fastmail.com> Date: Sun, 22 Jan 2023 19:48:37 -0300 From: "Joel Jacobson" To: "Dean Rasheed" Cc: pgsql-hackers Subject: Re: [PATCH] Use 128-bit math to accelerate numeric division, when 8 < divisor digits <= 16 Content-Type: multipart/mixed; boundary=3751659a51ed4974abd6416e9c4b5838 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --3751659a51ed4974abd6416e9c4b5838 Content-Type: text/plain On Sun, Jan 22, 2023, at 14:25, Dean Rasheed wrote: > I just modified the previous test you posted: > > \timing on > SELECT count(numeric_div_volatile(1e131071,123456)) FROM generate_series(1,1e4); > > Time: 2048.060 ms (00:02.048) -- HEAD > Time: 2422.720 ms (00:02.423) -- With patch > ... > > Apparently it can make a difference. Probably something to do with > having less data to move around. I remember noticing that when I wrote > div_var_int(), which is why I split it into 2 branches in that way. Many thanks for feedback. Nice catch! New patch attached. Interesting, I'm not able to reproduce this on my MacBook Pro M1 Max: SELECT version; PostgreSQL 16devel on aarch64-apple-darwin22.2.0, compiled by Apple clang version 14.0.0 (clang-1400.0.29.202), 64-bit SELECT count(numeric_div_volatile(1e131071,123456)) FROM generate_series(1,1e 4); Time: 1569.730 ms (00:01.570) - HEAD Time: 1569.918 ms (00:01.570) -- div_var_int64.patch Time: 1569.038 ms (00:01.569) -- div_var_int64-2.patch Just curious, what platform are you on? /Joel --3751659a51ed4974abd6416e9c4b5838 Content-Disposition: attachment; filename="div_var_int64-2.patch" Content-Type: application/octet-stream; name="div_var_int64-2.patch" Content-Transfer-Encoding: BASE64 RnJvbSAzMGQ3MThkYjI2ZjQ0MmY1NThlMmRmOWE3NjA0YjhiYmRjZDRhZTk0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEpha29ic3NvbiA8am9lbEBjb21waWxlci5v cmc+CkRhdGU6IFN1biwgMjIgSmFuIDIwMjMgMTI6NTc6MzAgLTA0MDAKU3ViamVjdDogW1BB VENIIDEvNV0gVXNlIDEyOC1iaXQgbWF0aCB0byBhY2NlbGVyYXRlIG51bWVyaWMgZGl2aXNp b24sIHdoZW4gOCA8CiBkaXZpc29yIGRpZ2l0cyA8PSAxNgoKVGhpcyBwYXRjaCBhZGRzIGRp dl92YXJfaW50NjQoKSwgd2hpY2ggaXMgc2ltaWxhciB0byB0aGUgZXhpc3RpbmcgZGl2X3Zh cl9pbnQoKSwKYnV0IGFjY2VwdHMgYSA2NC1iaXQgZGl2aXNvciBpbnN0ZWFkIG9mIGEgMzIt Yml0IGRpdmlzb3IuCgpUaGUgbmV3IGZ1bmN0aW9uIGlzIHVzZWQgd2l0aGluIGRpdl92YXIo KSBhbmQgZGl2X3Zhcl9mYXN0KCkuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVy aWMuYyB8IDE2NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNo YW5nZWQsIDE2NyBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L251bWVyaWMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMKaW5k ZXggYTY0MDllY2JlZS4uZTQ4NDkzYWM0YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L251bWVyaWMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbnVtZXJpYy5j CkBAIC01NTQsNiArNTU0LDEwIEBAIHN0YXRpYyB2b2lkIGRpdl92YXJfZmFzdChjb25zdCBO dW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogCQkJCQkJIE51bWVy aWNWYXIgKnJlc3VsdCwgaW50IHJzY2FsZSwgYm9vbCByb3VuZCk7CiBzdGF0aWMgdm9pZCBk aXZfdmFyX2ludChjb25zdCBOdW1lcmljVmFyICp2YXIsIGludCBpdmFsLCBpbnQgaXZhbF93 ZWlnaHQsCiAJCQkJCQlOdW1lcmljVmFyICpyZXN1bHQsIGludCByc2NhbGUsIGJvb2wgcm91 bmQpOworI2lmZGVmIEhBVkVfSU5UMTI4CitzdGF0aWMgdm9pZCBkaXZfdmFyX2ludDY0KGNv bnN0IE51bWVyaWNWYXIgKnZhciwgaW50NjQgaXZhbCwgaW50IGl2YWxfd2VpZ2h0LAorCQkJ CQkJTnVtZXJpY1ZhciAqcmVzdWx0LCBpbnQgcnNjYWxlLCBib29sIHJvdW5kKTsKKyNlbmRp Zgogc3RhdGljIGludAlzZWxlY3RfZGl2X3NjYWxlKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEs IGNvbnN0IE51bWVyaWNWYXIgKnZhcjIpOwogc3RhdGljIHZvaWQgbW9kX3Zhcihjb25zdCBO dW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogCQkJCQlOdW1lcmlj VmFyICpyZXN1bHQpOwpAQCAtODQ4NCw2ICs4NDg4LDEwIEBAIGRpdl92YXIoY29uc3QgTnVt ZXJpY1ZhciAqdmFyMSwgY29uc3QgTnVtZXJpY1ZhciAqdmFyMiwgTnVtZXJpY1ZhciAqcmVz dWx0LAogCS8qCiAJICogSWYgdGhlIGRpdmlzb3IgaGFzIGp1c3Qgb25lIG9yIHR3byBkaWdp dHMsIGRlbGVnYXRlIHRvIGRpdl92YXJfaW50KCksCiAJICogd2hpY2ggdXNlcyBmYXN0IHNo b3J0IGRpdmlzaW9uLgorCSAqCisJICogT24gcGxhdGZvcm1zIHdpdGggMTI4LWJpdCBpbnRl Z2VyIHN1cHBvcnQsIGFuZCBpZiB0aGUgZGl2aXNvciBoYXMKKwkgKiB0aHJlZSBvciBmb3Vy IGRpZ2l0cywgZGVsZWdhdGUgdG8gZGl2X3Zhcl9pbnQ2NCgpLAorCSAqIHdoaWNoIGFsc28g dXNlcyBmYXN0IHNob3J0IGRpdmlzaW9uLgogCSAqLwogCWlmICh2YXIybmRpZ2l0cyA8PSAy KQogCXsKQEAgLTg1MDMsNiArODUxMSwyNyBAQCBkaXZfdmFyKGNvbnN0IE51bWVyaWNWYXIg KnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsIE51bWVyaWNWYXIgKnJlc3VsdCwKIAkJ ZGl2X3Zhcl9pbnQodmFyMSwgaWRpdmlzb3IsIGlkaXZpc29yX3dlaWdodCwgcmVzdWx0LCBy c2NhbGUsIHJvdW5kKTsKIAkJcmV0dXJuOwogCX0KKwkjaWZkZWYgSEFWRV9JTlQxMjgKKwll bHNlIGlmICh2YXIybmRpZ2l0cyA8PSA0KQorCXsKKwkJaW50NjQJCWlkaXZpc29yOworCQlp bnQJCQlpZGl2aXNvcl93ZWlnaHQ7CisKKwkJaWRpdmlzb3IgPSB2YXIyLT5kaWdpdHNbMF07 CisJCWlkaXZpc29yX3dlaWdodCA9IHZhcjItPndlaWdodDsKKwkJZm9yIChpID0gMTsgaSA8 IHZhcjJuZGlnaXRzOyBpKyspCisJCXsKKwkJCWlkaXZpc29yICo9IE5CQVNFOworCQkJaWRp dmlzb3IgKz0gdmFyMi0+ZGlnaXRzW2ldOworCQkJaWRpdmlzb3Jfd2VpZ2h0LS07CisJCX0K KwkJaWYgKHZhcjItPnNpZ24gPT0gTlVNRVJJQ19ORUcpCisJCQlpZGl2aXNvciA9IC1pZGl2 aXNvcjsKKworCQlkaXZfdmFyX2ludDY0KHZhcjEsIGlkaXZpc29yLCBpZGl2aXNvcl93ZWln aHQsIHJlc3VsdCwgcnNjYWxlLCByb3VuZCk7CisJCXJldHVybjsKKwl9CisJI2VuZGlmCiAK IAkvKgogCSAqIE90aGVyd2lzZSwgcGVyZm9ybSBmdWxsIGxvbmcgZGl2aXNpb24uCkBAIC04 Nzc0LDYgKzg4MDMsMTAgQEAgZGl2X3Zhcl9mYXN0KGNvbnN0IE51bWVyaWNWYXIgKnZhcjEs IGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsCiAJLyoKIAkgKiBJZiB0aGUgZGl2aXNvciBoYXMg anVzdCBvbmUgb3IgdHdvIGRpZ2l0cywgZGVsZWdhdGUgdG8gZGl2X3Zhcl9pbnQoKSwKIAkg KiB3aGljaCB1c2VzIGZhc3Qgc2hvcnQgZGl2aXNpb24uCisJICoKKwkgKiBPbiBwbGF0Zm9y bXMgd2l0aCAxMjgtYml0IGludGVnZXIgc3VwcG9ydCwgYW5kIGlmIHRoZSBkaXZpc29yIGhh cworCSAqIHRocmVlIG9yIGZvdXIgZGlnaXRzLCBkZWxlZ2F0ZSB0byBkaXZfdmFyX2ludDY0 KCksCisJICogd2hpY2ggYWxzbyB1c2VzIGZhc3Qgc2hvcnQgZGl2aXNpb24uCiAJICovCiAJ aWYgKHZhcjJuZGlnaXRzIDw9IDIpCiAJewpAQCAtODc5Myw2ICs4ODI2LDI3IEBAIGRpdl92 YXJfZmFzdChjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIy LAogCQlkaXZfdmFyX2ludCh2YXIxLCBpZGl2aXNvciwgaWRpdmlzb3Jfd2VpZ2h0LCByZXN1 bHQsIHJzY2FsZSwgcm91bmQpOwogCQlyZXR1cm47CiAJfQorCSNpZmRlZiBIQVZFX0lOVDEy OAorCWVsc2UgaWYgKHZhcjJuZGlnaXRzIDw9IDQpCisJeworCQlpbnQ2NAkJaWRpdmlzb3I7 CisJCWludAkJCWlkaXZpc29yX3dlaWdodDsKKworCQlpZGl2aXNvciA9IHZhcjItPmRpZ2l0 c1swXTsKKwkJaWRpdmlzb3Jfd2VpZ2h0ID0gdmFyMi0+d2VpZ2h0OworCQlmb3IgKGkgPSAx OyBpIDwgdmFyMm5kaWdpdHM7IGkrKykKKwkJeworCQkJaWRpdmlzb3IgKj0gTkJBU0U7CisJ CQlpZGl2aXNvciArPSB2YXIyLT5kaWdpdHNbaV07CisJCQlpZGl2aXNvcl93ZWlnaHQtLTsK KwkJfQorCQlpZiAodmFyMi0+c2lnbiA9PSBOVU1FUklDX05FRykKKwkJCWlkaXZpc29yID0g LWlkaXZpc29yOworCisJCWRpdl92YXJfaW50NjQodmFyMSwgaWRpdmlzb3IsIGlkaXZpc29y X3dlaWdodCwgcmVzdWx0LCByc2NhbGUsIHJvdW5kKTsKKwkJcmV0dXJuOworCX0KKwkjZW5k aWYKIAogCS8qCiAJICogT3RoZXJ3aXNlLCBwZXJmb3JtIGZ1bGwgbG9uZyBkaXZpc2lvbi4K QEAgLTkxODIsNiArOTIzNiwxMTkgQEAgZGl2X3Zhcl9pbnQoY29uc3QgTnVtZXJpY1ZhciAq dmFyLCBpbnQgaXZhbCwgaW50IGl2YWxfd2VpZ2h0LAogfQogCiAKKyNpZmRlZiBIQVZFX0lO VDEyOAorLyoKKyAqIGRpdl92YXJfaW50NjQoKSAtCisgKgorICoJRGl2aWRlIGEgbnVtZXJp YyB2YXJpYWJsZSBieSBhIDY0LWJpdCBpbnRlZ2VyIHdpdGggdGhlIHNwZWNpZmllZCB3ZWln aHQuCisgKglUaGUgcXVvdGllbnQgdmFyIC8gKGl2YWwgKiBOQkFTRV5pdmFsX3dlaWdodCkg aXMgc3RvcmVkIGluIHJlc3VsdC4KKyAqLworc3RhdGljIHZvaWQKK2Rpdl92YXJfaW50NjQo Y29uc3QgTnVtZXJpY1ZhciAqdmFyLCBpbnQ2NCBpdmFsLCBpbnQgaXZhbF93ZWlnaHQsCisJ CQlOdW1lcmljVmFyICpyZXN1bHQsIGludCByc2NhbGUsIGJvb2wgcm91bmQpCit7CisJTnVt ZXJpY0RpZ2l0ICp2YXJfZGlnaXRzID0gdmFyLT5kaWdpdHM7CisJaW50CQkJdmFyX25kaWdp dHMgPSB2YXItPm5kaWdpdHM7CisJaW50CQkJcmVzX3NpZ247CisJaW50CQkJcmVzX3dlaWdo dDsKKwlpbnQJCQlyZXNfbmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnJlc19idWY7CisJTnVt ZXJpY0RpZ2l0ICpyZXNfZGlnaXRzOworCXVpbnQ2NAkJZGl2aXNvcjsKKwlpbnQJCQlpOwor CisJLyogR3VhcmQgYWdhaW5zdCBkaXZpc2lvbiBieSB6ZXJvICovCisJaWYgKGl2YWwgPT0g MCkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQllcnJjb2RlKEVSUkNPREVfRElWSVNJT05fQllf WkVSTyksCisJCQkJZXJybXNnKCJkaXZpc2lvbiBieSB6ZXJvIikpOworCisJLyogUmVzdWx0 IHplcm8gY2hlY2sgKi8KKwlpZiAodmFyX25kaWdpdHMgPT0gMCkKKwl7CisJCXplcm9fdmFy KHJlc3VsdCk7CisJCXJlc3VsdC0+ZHNjYWxlID0gcnNjYWxlOworCQlyZXR1cm47CisJfQor CisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHJlc3VsdCBzaWduLCB3ZWlnaHQgYW5kIG51bWJl ciBvZiBkaWdpdHMgdG8gY2FsY3VsYXRlLgorCSAqIFRoZSB3ZWlnaHQgZmlndXJlZCBoZXJl IGlzIGNvcnJlY3QgaWYgdGhlIGVtaXR0ZWQgcXVvdGllbnQgaGFzIG5vCisJICogbGVhZGlu ZyB6ZXJvIGRpZ2l0czsgb3RoZXJ3aXNlIHN0cmlwX3ZhcigpIHdpbGwgZml4IHRoaW5ncyB1 cC4KKwkgKi8KKwlpZiAodmFyLT5zaWduID09IE5VTUVSSUNfUE9TKQorCQlyZXNfc2lnbiA9 IGl2YWwgPiAwID8gTlVNRVJJQ19QT1MgOiBOVU1FUklDX05FRzsKKwllbHNlCisJCXJlc19z aWduID0gaXZhbCA+IDAgPyBOVU1FUklDX05FRyA6IE5VTUVSSUNfUE9TOworCXJlc193ZWln aHQgPSB2YXItPndlaWdodCAtIGl2YWxfd2VpZ2h0OworCS8qIFRoZSBudW1iZXIgb2YgYWNj dXJhdGUgcmVzdWx0IGRpZ2l0cyB3ZSBuZWVkIHRvIHByb2R1Y2U6ICovCisJcmVzX25kaWdp dHMgPSByZXNfd2VpZ2h0ICsgMSArIChyc2NhbGUgKyBERUNfRElHSVRTIC0gMSkgLyBERUNf RElHSVRTOworCS8qIC4uLiBidXQgYWx3YXlzIGF0IGxlYXN0IDEgKi8KKwlyZXNfbmRpZ2l0 cyA9IE1heChyZXNfbmRpZ2l0cywgMSk7CisJLyogSWYgcm91bmRpbmcgbmVlZGVkLCBmaWd1 cmUgb25lIG1vcmUgZGlnaXQgdG8gZW5zdXJlIGNvcnJlY3QgcmVzdWx0ICovCisJaWYgKHJv dW5kKQorCQlyZXNfbmRpZ2l0cysrOworCisJcmVzX2J1ZiA9IGRpZ2l0YnVmX2FsbG9jKHJl c19uZGlnaXRzICsgMSk7CisJcmVzX2J1ZlswXSA9IDA7CQkJCS8qIHNwYXJlIGRpZ2l0IGZv ciBsYXRlciByb3VuZGluZyAqLworCXJlc19kaWdpdHMgPSByZXNfYnVmICsgMTsKKworCS8q CisJICogTm93IGNvbXB1dGUgdGhlIHF1b3RpZW50IGRpZ2l0cy4gIFRoaXMgaXMgdGhlIHNo b3J0IGRpdmlzaW9uIGFsZ29yaXRobQorCSAqIGRlc2NyaWJlZCBpbiBLbnV0aCB2b2x1bWUg Miwgc2VjdGlvbiA0LjMuMSBleGVyY2lzZSAxNiwgZXhjZXB0IHRoYXQgd2UKKwkgKiBhbGxv dyB0aGUgZGl2aXNvciB0byBleGNlZWQgdGhlIGludGVybmFsIGJhc2UuCisJICoKKwkgKiBJ biB0aGlzIGFsZ29yaXRobSwgdGhlIGNhcnJ5IGZyb20gb25lIGRpZ2l0IHRvIHRoZSBuZXh0 IGlzIGF0IG1vc3QKKwkgKiBkaXZpc29yIC0gMS4gIFRoZXJlZm9yZSwgd2hpbGUgcHJvY2Vz c2luZyB0aGUgbmV4dCBkaWdpdCwgY2FycnkgbWF5CisJICogYmVjb21lIGFzIGxhcmdlIGFz IGRpdmlzb3IgKiBOQkFTRSAtIDEsIGFuZCBzbyBpdCByZXF1aXJlcyBhIDEyOC1iaXQKKwkg KiBpbnRlZ2VyIGlmIHRoaXMgZXhjZWVkcyBQR19VSU5UNjRfTUFYLgorCSAqLworCWRpdmlz b3IgPSBpNjRhYnMoaXZhbCk7CisKKwlpZiAoZGl2aXNvciA8PSBQR19VSU5UNjRfTUFYIC8g TkJBU0UpCisJeworCQkvKiBjYXJyeSBjYW5ub3Qgb3ZlcmZsb3cgNjQgYml0cyAqLworCQl1 aW50NjQJCWNhcnJ5ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgcmVzX25kaWdpdHM7IGkr KykKKwkJeworCQkJY2FycnkgPSBjYXJyeSAqIE5CQVNFICsgKGkgPCB2YXJfbmRpZ2l0cyA/ IHZhcl9kaWdpdHNbaV0gOiAwKTsKKwkJCXJlc19kaWdpdHNbaV0gPSAoTnVtZXJpY0RpZ2l0 KSAoY2FycnkgLyBkaXZpc29yKTsKKwkJCWNhcnJ5ID0gY2FycnkgJSBkaXZpc29yOworCQl9 CisJfQorCWVsc2UKKwl7CisJCS8qIGNhcnJ5IG1heSBleGNlZWQgNjQgYml0cyAqLworCQl1 aW50MTI4CQljYXJyeSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IHJlc19uZGlnaXRzOyBp KyspCisJCXsKKwkJCWNhcnJ5ID0gY2FycnkgKiBOQkFTRSArIChpIDwgdmFyX25kaWdpdHMg PyB2YXJfZGlnaXRzW2ldIDogMCk7CisJCQlyZXNfZGlnaXRzW2ldID0gKE51bWVyaWNEaWdp dCkgKGNhcnJ5IC8gZGl2aXNvcik7CisJCQljYXJyeSA9IGNhcnJ5ICUgZGl2aXNvcjsKKwkJ fQorCX0KKworCS8qIFN0b3JlIHRoZSBxdW90aWVudCBpbiByZXN1bHQgKi8KKwlkaWdpdGJ1 Zl9mcmVlKHJlc3VsdC0+YnVmKTsKKwlyZXN1bHQtPm5kaWdpdHMgPSByZXNfbmRpZ2l0czsK KwlyZXN1bHQtPmJ1ZiA9IHJlc19idWY7CisJcmVzdWx0LT5kaWdpdHMgPSByZXNfZGlnaXRz OworCXJlc3VsdC0+d2VpZ2h0ID0gcmVzX3dlaWdodDsKKwlyZXN1bHQtPnNpZ24gPSByZXNf c2lnbjsKKworCS8qIFJvdW5kIG9yIHRydW5jYXRlIHRvIHRhcmdldCByc2NhbGUgKGFuZCBz ZXQgcmVzdWx0LT5kc2NhbGUpICovCisJaWYgKHJvdW5kKQorCQlyb3VuZF92YXIocmVzdWx0 LCByc2NhbGUpOworCWVsc2UKKwkJdHJ1bmNfdmFyKHJlc3VsdCwgcnNjYWxlKTsKKworCS8q IFN0cmlwIGxlYWRpbmcvdHJhaWxpbmcgemVyb2VzICovCisJc3RyaXBfdmFyKHJlc3VsdCk7 Cit9CisjZW5kaWYKKwogLyoKICAqIERlZmF1bHQgc2NhbGUgc2VsZWN0aW9uIGZvciBkaXZp c2lvbgogICoKLS0gCjIuMzcuMSAoQXBwbGUgR2l0LTEzNy4xKQoK --3751659a51ed4974abd6416e9c4b5838--