From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 3C1E23857C7B; Tue, 15 Sep 2020 03:56:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 3C1E23857C7B Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 08F3Wk2Y089030; Mon, 14 Sep 2020 23:56:40 -0400 Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 33jm1u2uq1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 14 Sep 2020 23:56:40 -0400 Received: from m0098409.ppops.net (m0098409.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 08F3lMG3132006; Mon, 14 Sep 2020 23:56:39 -0400 Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0a-001b2d01.pphosted.com with ESMTP id 33jm1u2upg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 14 Sep 2020 23:56:39 -0400 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.0.42/8.16.0.42) with SMTP id 08F3ubeZ011761; Tue, 15 Sep 2020 03:56:37 GMT Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by ppma01fra.de.ibm.com with ESMTP id 33hkfagxf9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 15 Sep 2020 03:56:36 +0000 Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 08F3uYsa19988758 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Sep 2020 03:56:34 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 70D9242041; Tue, 15 Sep 2020 03:56:34 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9EBE242045; Tue, 15 Sep 2020 03:56:31 +0000 (GMT) Received: from luoxhus-MacBook-Pro.local (unknown [9.200.42.89]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 15 Sep 2020 03:56:31 +0000 (GMT) Subject: Re: [PATCH v2] rs6000: Expand vec_insert in expander instead of gimple [PR79251] To: Richard Biener Cc: Segher Boessenkool , GCC Patches , David Edelsohn , Bill Schmidt , linkw@gcc.gnu.org References: <20200904102357.GF28786@gate.crashing.org> <98b124ee-b32d-71f7-a662-e0ce2520de6a@linux.ibm.com> <20200909134739.GX28786@gate.crashing.org> <20200909160057.GZ28786@gate.crashing.org> <572b36a7-2d52-2f46-05bd-140e16794a61@linux.ibm.com> From: luoxhu Message-ID: <4013a2e0-2fe2-b626-31ae-f7325a9be678@linux.ibm.com> Date: Tue, 15 Sep 2020 11:56:30 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------C56223626B784E135A7A2131" Content-Language: en-US X-TM-AS-GCONF: 00 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.235, 18.0.687 definitions=2020-09-15_03:2020-09-14, 2020-09-15 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 mlxlogscore=999 lowpriorityscore=0 mlxscore=0 impostorscore=0 malwarescore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2006250000 definitions=main-2009150026 X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, 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, 15 Sep 2020 03:56:43 -0000 This is a multi-part message in MIME format. --------------C56223626B784E135A7A2131 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 2020/9/14 17:47, Richard Biener wrote: > On Mon, Sep 14, 2020 at 10:05 AM luoxhu wrote: >> Not sure whether this reflects the issues you discussed above. >> I constructed below test cases and tested with and without this patch, >> only if "a+c"(which means store only), the performance is getting bad with >> this patch due to extra load/store(about 50% slower). >> For "v = vec_insert (i, v, n);" usage, v is always loaded after store, so this >> patch will always get big benefit. >> But for "v[n % 4] = i;" usage, it depends on whether "v" is used immediately >> inside the function or out of the function soon. Does this mean unify the two >> usage to same gimple code not a good idea sometimes? Or is it possible to >> detect the generated IFN ".VEC_INSERT (&v, i_4(D), _1);" destination "v" is >> used not far away inside or out side of the function? >> >> >> #define TYPE int >> >> vector TYPE v = {1, 2, 3, 4}; // a. global vector. >> vector TYPE s = {4, 3, 2, 1}; >> >> __attribute__ ((noinline)) >> vector TYPE >> test (vector TYPE u, TYPE i, size_t n) >> { >> v[n % 4] = i; > > ^^^ > > this should be > > u[n % 4] = i; > > I guess. Is the % 4 mandated by the vec_insert semantics btw? Yes. Segher pasted the builtin description in his reply. "v = vec_insert (i, u, n);" is a bit different with "u[n % 4] = i;" since it returns a copy of u instead of modify u. The adjust in lower __builtin_vec_insert_xxx gimple will make a copy of u first to meet the requirements. > > If you tested with the above error you probably need to re-measure. No I did test for u as local instead of global before. If u is not used very soon, the performance is almost the same for generating single store or IFN_SET of inserting with variable index. source: __attribute__ ((noinline)) vector TYPE test (vector TYPE u, TYPE i, size_t n) { u[n % 4] = i; vector TYPE r = {0}; for (long k = 0; k < 100; k++) { r += v; } return u+r; } => store hit load is relieved due to long distance. ASM: 0: addis 2,12,.TOC.-.LCF0@ha addi 2,2,.TOC.-.LCF0@l .localentry test,.-test addis 10,2,.LANCHOR0@toc@ha li 8,50 xxspltib 32,0 addi 9,1,-16 rldic 6,6,2,60 stxv 34,-16(1) addi 10,10,.LANCHOR0@toc@l mtctr 8 xxlor 33,32,32 stwx 5,9,6 // short store lxv 45,0(10) .p2align 4,,15 .L2: vadduwm 0,0,13 vadduwm 1,1,13 bdnz .L2 vadduwm 0,0,1 lxv 33,-16(1) // wide load vadduwm 2,0,1 blr Then I intend to use "v" there for global memory insert test to separate the store and load into different function ("v" is stored in function, but loaded out of function will get different performance for single store or lxv+xxperm+xxsel+stxv, the inner function doesn't know the distance between load and store across functions). Do you mean that we don't need generate IFN_SET if "v" is global memory? I only see VAR_DECL and PARM_DECL, is there any function to check the tree variable is global? I added DECL_REGISTER, but the RTL still expands to stack: gcc/internal-fn.c: rtx to_rtx = expand_expr (view_op0, NULL_RTX, VOIDmode, EXPAND_WRITE); (gdb) p view_op0 $584 = (gdb) p DECL_REGISTER(view_op0) $585 = 1 (gdb) p to_rtx $586 = (rtx_def *) (mem/c:V4SI (reg/f:DI 112 virtual-stack-vars) [1 D.3190+0 S16 A128]) > > On gimple the above function (after fixing it) looks like > > VIEW_CONVERT_EXPR(u)[_1] = i_4(D); > > and the IFN idea I had would - for non-global memory 'u' only - transform > this to > > vector_register_2 = u; > vector_register_3 = .IFN_VEC_SET (vector_register_2, _1, i_4(D)); > u = vector_register_3; > > if vec_set can handle variable indexes. This then becomes a > vec_set on a register and if that was the only variable indexing of 'u' > will also cause 'u' to be expanded as register rather than stack memory. > > Note we can't use the direct-optab method here since the vec_set optab > modifies operand 0 which isn't possible in SSA form. That might hint > at that we eventually want to extend BIT_INSERT_EXPR to handle > a non-constant bit position but for experiments using an alternate > internal function is certainly easier. > My current implementation does: 1) v = vec_insert (i, u, n); =>gimple: { register __vector signed int D.3190; D.3190 = u; // *new decl and copy u first.* _1 = n & 3; VIEW_CONVERT_EXPR(D.3190)[_1] = i; // *update op0 of VIEW_CONVERT_EXPR* _2 = D.3190; ... } =>isel: { register __vector signed int D.3190; D.3190 = u_4(D); _1 = n_6(D) & 3; .VEC_SET (&D.3190, i_7(D), _1); _2 = D.3190; ... } 2) u[n % 4] = i; =>gimple: { __vector signed int D.3191; _1 = n & 3; VIEW_CONVERT_EXPR(u)[_1] = i; // *update op0 of VIEW_CONVERT_EXPR* D.3191 = u; ... } =>isel: { D.3190 = u_4(D); _1 = n_6(D) & 3; .VEC_SET (&D.3191, i_7(D), _1); _2 = D.3190; v = _2; } The IFN ".VEC_SET" behavior quite like the other IFN STORE functions and doesn't require a dest operand to be set? Both 1) and 2) are modifying operand 0 of VIEW_CONVERT_EXPR just like vec_set optab. Attached the IFN vec_set patch part, the expand part is moved from expr.c:expand_assignment to internal-fn.c:expand_vec_set_optab_fn now. Thanks, Xionghu --------------C56223626B784E135A7A2131 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0001-IFN-Implement-IFN_VEC_SET-for-vec_insert.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="0001-IFN-Implement-IFN_VEC_SET-for-vec_insert.patch" RnJvbSBhZTY0ZTQ5MDNlYmY5NDU5OTU1MDFjZDU3NTY5Y2ZlNDkzOWJjNTc0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBYaW9uZyBIdSBMdW8gPGx1b3hodUBsaW51eC5pYm0u Y29tPgpEYXRlOiBNb24sIDE0IFNlcCAyMDIwIDIxOjA4OjExIC0wNTAwClN1YmplY3Q6IFtQ QVRDSF0gSUZOOiBJbXBsZW1lbnQgSUZOX1ZFQ19TRVQgZm9yIHZlY19pbnNlcnQKCmdjYy9D aGFuZ2VMb2c6CgoJKiBnaW1wbGUtaXNlbC5jYyAoZ2ltcGxlX2V4cGFuZF92ZWNfc2V0X2V4 cHIpOgoJKGdpbXBsZV9leHBhbmRfdmVjX2NvbmRfZXhwcnMpOgoJKiBpbnRlcm5hbC1mbi5j ICh2ZWNfc2V0X2RpcmVjdCk6CgkoZXhwYW5kX3ZlY19zZXRfb3B0YWJfZm4pOgoJKGRpcmVj dF92ZWNfc2V0X29wdGFiX3N1cHBvcnRlZF9wKToKCSogaW50ZXJuYWwtZm4uZGVmIChWRUNf U0VUKToKLS0tCiBnY2MvZ2ltcGxlLWlzZWwuY2MgIHwgMTE3ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKystCiBnY2MvaW50ZXJuYWwtZm4uYyAgIHwgIDM4 ICsrKysrKysrKysrKysrCiBnY2MvaW50ZXJuYWwtZm4uZGVmIHwgICAyICsKIDMgZmlsZXMg Y2hhbmdlZCwgMTU1IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvZ2NjL2dpbXBsZS1pc2VsLmNjIGIvZ2NjL2dpbXBsZS1pc2VsLmNjCmluZGV4IGIzMzBj ZjRjMjBlLi45MmFmZTAzMDZmYSAxMDA2NDQKLS0tIGEvZ2NjL2dpbXBsZS1pc2VsLmNjCisr KyBiL2djYy9naW1wbGUtaXNlbC5jYwpAQCAtMzUsNiArMzUsNzYgQEAgYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJ0cmVl LWNmZy5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgInRyZWUtc3NhLWRjZS5o IgorI2luY2x1ZGUgImZvbGQtY29uc3QuaCIKKworc3RhdGljIGdpbXBsZSAqCitnaW1wbGVf ZXhwYW5kX3ZlY19leHRyYWN0X2V4cHIgKAorICBnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3Np LAorICBoYXNoX21hcDx0cmVlLCB1bnNpZ25lZCBpbnQ+ICp2ZWNfY29uZF9zc2FfbmFtZV91 c2VzKQoreworICBlbnVtIHRyZWVfY29kZSBjb2RlOworCisgIC8qIE9ubHkgY29uc2lkZXIg Y29kZSA9PSBHSU1QTEVfQVNTSUdOLiAgKi8KKyAgZ2Fzc2lnbiAqc3RtdCA9IGR5bl9jYXN0 PGdhc3NpZ24gKj4gKGdzaV9zdG10ICgqZ3NpKSk7CisgIGlmICghc3RtdCkKKyAgICByZXR1 cm4gTlVMTDsKKworICBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCk7Cisg IGlmIChjb2RlICE9IEFSUkFZX1JFRikKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4g TlVMTDsKK30KKworc3RhdGljIGdpbXBsZSAqCitnaW1wbGVfZXhwYW5kX3ZlY19zZXRfZXhw ciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSkKK3sKKyAgZW51bSB0cmVlX2NvZGUgY29k ZTsKKyAgZW51bSBpbnNuX2NvZGUgaWNvZGU7CisgIGdjYWxsICpuZXdfc3RtdCA9IE5VTEw7 CisKKyAgLyogT25seSBjb25zaWRlciBjb2RlID09IEdJTVBMRV9BU1NJR04uICAqLworICBn YXNzaWduICpzdG10ID0gZHluX2Nhc3Q8Z2Fzc2lnbiAqPiAoZ3NpX3N0bXQgKCpnc2kpKTsK KyAgaWYgKCFzdG10KQorICAgIHJldHVybiBOVUxMOworCisgIGNvZGUgPSBUUkVFX0NPREUg KGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSk7CisgIGlmIChjb2RlICE9IEFSUkFZX1JFRikK KyAgICByZXR1cm4gTlVMTDsKKworICB0cmVlIGxocyA9IGdpbXBsZV9hc3NpZ25fbGhzIChz dG10KTsKKyAgdHJlZSB2YWwgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpOworCisgIHRy ZWUgdHlwZSA9IFRSRUVfVFlQRSAobGhzKTsKKyAgdHJlZSBvcDAgPSBUUkVFX09QRVJBTkQg KGxocywgMCk7CisgIGlmIChUUkVFX0NPREUgKG9wMCkgPT0gVklFV19DT05WRVJUX0VYUFIK KyAgICAgICYmIHRyZWVfZml0c191aHdpX3AgKFRZUEVfU0laRSAodHlwZSkpKQorICAgIHsK KyAgICAgIHRyZWUgcG9zID0gVFJFRV9PUEVSQU5EIChsaHMsIDEpOworICAgICAgdHJlZSB2 aWV3X29wMCA9IFRSRUVfT1BFUkFORCAob3AwLCAwKTsKKyAgICAgIG1hcmtfYWRkcmVzc2Fi bGUgKHZpZXdfb3AwKTsKKyAgICAgIG1hY2hpbmVfbW9kZSBvdXRlcm1vZGUgPSBUWVBFX01P REUgKFRSRUVfVFlQRSAodmlld19vcDApKTsKKyAgICAgIHNjYWxhcl9tb2RlIGlubmVybW9k ZSA9IEdFVF9NT0RFX0lOTkVSIChvdXRlcm1vZGUpOworICAgICAgd2lkZV9pbnQgbWludiwg bWF4djsKKyAgICAgIGlmIChUUkVFX0NPREUgKFRSRUVfVFlQRSAodmlld19vcDApKSA9PSBW RUNUT1JfVFlQRQorCSAgJiYgdHJlZV9maXRzX3Vod2lfcCAoVFlQRV9TSVpFIChUUkVFX1RZ UEUgKHZpZXdfb3AwKSkpCisJICAmJiB0cmVlX3RvX3Vod2kgKFRZUEVfU0laRSAoVFJFRV9U WVBFICh2aWV3X29wMCkpKSA9PSAxMjgKKwkgICYmIGRldGVybWluZV92YWx1ZV9yYW5nZSAo cG9zLCAmbWludiwgJm1heHYpID09IFZSX1JBTkdFCisJICAmJiB3aTo6Z2V1X3AgKG1pbnYs IDApCisJICAmJiB3aTo6bGV1X3AgKG1heHYsICgxMjggLyBHRVRfTU9ERV9CSVRTSVpFIChp bm5lcm1vZGUpKSkpCisJeworCSAgdHJlZSBhZGRyCisJICAgID0gZm9yY2VfZ2ltcGxlX29w ZXJhbmRfZ3NpIChnc2ksIGJ1aWxkX2ZvbGRfYWRkcl9leHByICh2aWV3X29wMCksCisJCQkJ CXRydWUsIE5VTExfVFJFRSwgdHJ1ZSwgR1NJX1NBTUVfU1RNVCk7CisKKwkgIG5ld19zdG10 CisJICAgID0gZ2ltcGxlX2J1aWxkX2NhbGxfaW50ZXJuYWwgKElGTl9WRUNfU0VULCAzLCBh ZGRyLCB2YWwsIHBvcyk7CisJICBnaW1wbGVfbW92ZV92b3BzIChuZXdfc3RtdCwgc3RtdCk7 CisJfQorICAgIH0KKworICByZXR1cm4gbmV3X3N0bXQ7Cit9CiAKIC8qIEV4cGFuZCBhbGwg VkVDX0NPTkRfRVhQUiBnaW1wbGUgYXNzaWdubWVudHMgaW50byBjYWxscyB0byBpbnRlcm5h bAogICAgZnVuY3Rpb24gYmFzZWQgb24gdHlwZSBvZiBzZWxlY3RlZCBleHBhbnNpb24uICAq LwpAQCAtMTg3LDggKzI1NywyNiBAQCBnaW1wbGVfZXhwYW5kX3ZlY19jb25kX2V4cHJzICh2 b2lkKQogICAgIHsKICAgICAgIGZvciAoZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7ICFnc2lf ZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKIAl7Ci0JICBnaW1wbGUgKmcgPSBnaW1w bGVfZXhwYW5kX3ZlY19jb25kX2V4cHIgKCZnc2ksCi0JCQkJCQkgICAmdmVjX2NvbmRfc3Nh X25hbWVfdXNlcyk7CisJICBnYXNzaWduICpzdG10ID0gZHluX2Nhc3Q8Z2Fzc2lnbiAqPiAo Z3NpX3N0bXQgKGdzaSkpOworCSAgaWYgKCFzdG10KQorCSAgICBjb250aW51ZTsKKworCSAg ZW51bSB0cmVlX2NvZGUgY29kZTsKKwkgIGdpbXBsZSAqZyA9IE5VTEw7CisJICBjb2RlID0g Z2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCk7CisJICBzd2l0Y2ggKGNvZGUpCisJICAg IHsKKwkgICAgY2FzZSBWRUNfQ09ORF9FWFBSOgorCSAgICAgIGcgPSBnaW1wbGVfZXhwYW5k X3ZlY19jb25kX2V4cHIgKCZnc2ksICZ2ZWNfY29uZF9zc2FfbmFtZV91c2VzKTsKKwkgICAg ICBicmVhazsKKwkgICAgY2FzZSBBUlJBWV9SRUY6CisJICAgICAgZyA9IGdpbXBsZV9leHBh bmRfdmVjX2V4dHJhY3RfZXhwciAoJmdzaSwKKwkJCQkJCSAgJnZlY19jb25kX3NzYV9uYW1l X3VzZXMpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOwor CSAgICB9CisKIAkgIGlmIChnICE9IE5VTEwpCiAJICAgIHsKIAkgICAgICB0cmVlIGxocyA9 IGdpbXBsZV9hc3NpZ25fbGhzIChnc2lfc3RtdCAoZ3NpKSk7CkBAIC0yMDQsNiArMjkyLDMx IEBAIGdpbXBsZV9leHBhbmRfdmVjX2NvbmRfZXhwcnMgKHZvaWQpCiAKICAgc2ltcGxlX2Rj ZV9mcm9tX3dvcmtsaXN0IChkY2Vfc3NhX25hbWVzKTsKIAorICBGT1JfRUFDSF9CQl9GTiAo YmIsIGNmdW4pCisgICAgeworICAgICAgZm9yIChnc2kgPSBnc2lfc3RhcnRfYmIgKGJiKTsg IWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHQgKCZnc2kpKQorCXsKKwkgIGdhc3NpZ24gKnN0 bXQgPSBkeW5fY2FzdDxnYXNzaWduICo+IChnc2lfc3RtdCAoZ3NpKSk7CisJICBpZiAoIXN0 bXQpCisJICAgIGNvbnRpbnVlOworCisJICBlbnVtIHRyZWVfY29kZSBjb2RlOworCSAgZ2lt cGxlICpnID0gTlVMTDsKKwkgIGNvZGUgPSBUUkVFX0NPREUgKGdpbXBsZV9hc3NpZ25fbGhz IChzdG10KSk7CisJICBzd2l0Y2ggKGNvZGUpCisJICAgIHsKKwkgICAgY2FzZSBBUlJBWV9S RUY6CisJICAgICAgZyA9IGdpbXBsZV9leHBhbmRfdmVjX3NldF9leHByICgmZ3NpKTsKKwkg ICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJ ICBpZiAoZyAhPSBOVUxMKQorCSAgICBnc2lfcmVwbGFjZSAoJmdzaSwgZywgZmFsc2UpOwor CX0KKyAgICB9CisKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2djYy9pbnRlcm5h bC1mbi5jIGIvZ2NjL2ludGVybmFsLWZuLmMKaW5kZXggOGVmYzc3ZDk4NmIuLjQ5MGQyY2Fh NTgyIDEwMDY0NAotLS0gYS9nY2MvaW50ZXJuYWwtZm4uYworKysgYi9nY2MvaW50ZXJuYWwt Zm4uYwpAQCAtMTE1LDYgKzExNSw3IEBAIGluaXRfaW50ZXJuYWxfZm5zICgpCiAjZGVmaW5l IHZlY19jb25kZXFfZGlyZWN0IHsgMCwgMCwgZmFsc2UgfQogI2RlZmluZSBzY2F0dGVyX3N0 b3JlX2RpcmVjdCB7IDMsIDEsIGZhbHNlIH0KICNkZWZpbmUgbGVuX3N0b3JlX2RpcmVjdCB7 IDMsIDMsIGZhbHNlIH0KKyNkZWZpbmUgdmVjX3NldF9kaXJlY3QgeyAzLCAzLCBmYWxzZSB9 CiAjZGVmaW5lIHVuYXJ5X2RpcmVjdCB7IDAsIDAsIHRydWUgfQogI2RlZmluZSBiaW5hcnlf ZGlyZWN0IHsgMCwgMCwgdHJ1ZSB9CiAjZGVmaW5lIHRlcm5hcnlfZGlyZWN0IHsgMCwgMCwg dHJ1ZSB9CkBAIC0yNjU4LDYgKzI2NTksNDIgQEAgZXhwYW5kX3ZlY3RfY29uZF9tYXNrX29w dGFiX2ZuIChpbnRlcm5hbF9mbiwgZ2NhbGwgKnN0bXQsIGNvbnZlcnRfb3B0YWIgb3B0YWIp CiAKICNkZWZpbmUgZXhwYW5kX3ZlY19jb25kX21hc2tfb3B0YWJfZm4gZXhwYW5kX3ZlY3Rf Y29uZF9tYXNrX29wdGFiX2ZuCiAKK3N0YXRpYyB2b2lkCitleHBhbmRfdmVjX3NldF9vcHRh Yl9mbiAoaW50ZXJuYWxfZm4sIGdjYWxsICpzdG10LCBjb252ZXJ0X29wdGFiIG9wdGFiKQor eworICB0cmVlIG9wMCA9IGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwgMCk7CisgIHRyZWUgb3Ax ID0gZ2ltcGxlX2NhbGxfYXJnIChzdG10LCAxKTsKKyAgdHJlZSBvcDIgPSBnaW1wbGVfY2Fs bF9hcmcgKHN0bXQsIDIpOworICB0cmVlIHZpZXdfb3AwID0gVFJFRV9PUEVSQU5EIChvcDAs IDApOworICBydHggdG9fcnR4ID0gZXhwYW5kX2V4cHIgKHZpZXdfb3AwLCBOVUxMX1JUWCwg Vk9JRG1vZGUsIEVYUEFORF9XUklURSk7CisKKyAgbWFjaGluZV9tb2RlIG91dGVybW9kZSA9 IFRZUEVfTU9ERSAoVFJFRV9UWVBFICh2aWV3X29wMCkpOworICBzY2FsYXJfbW9kZSBpbm5l cm1vZGUgPSBHRVRfTU9ERV9JTk5FUiAob3V0ZXJtb2RlKTsKKworICBydHggdmFsdWUgPSBl eHBhbmRfZXhwciAob3AxLCBOVUxMX1JUWCwgVk9JRG1vZGUsIEVYUEFORF9OT1JNQUwpOwor ICBydHggcG9zID0gZXhwYW5kX2V4cHIgKG9wMiwgTlVMTF9SVFgsIFZPSURtb2RlLCBFWFBB TkRfTk9STUFMKTsKKworICBydHggdGVtcF90YXJnZXQgPSBnZW5fcmVnX3J0eCAob3V0ZXJt b2RlKTsKKyAgZW1pdF9tb3ZlX2luc24gKHRlbXBfdGFyZ2V0LCB0b19ydHgpOworCisgIGNs YXNzIGV4cGFuZF9vcGVyYW5kIG9wc1szXTsKKyAgZW51bSBpbnNuX2NvZGUgaWNvZGUgPSBv cHRhYl9oYW5kbGVyIChvcHRhYiwgb3V0ZXJtb2RlKTsKKworICBpZiAoaWNvZGUgIT0gQ09E RV9GT1Jfbm90aGluZykKKyAgICB7CisgICAgICBwb3MgPSBjb252ZXJ0X3RvX21vZGUgKEVf U0ltb2RlLCBwb3MsIDApOworCisgICAgICBjcmVhdGVfZml4ZWRfb3BlcmFuZCAoJm9wc1sw XSwgdGVtcF90YXJnZXQpOworICAgICAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbMV0s IHZhbHVlLCBpbm5lcm1vZGUpOworICAgICAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNb Ml0sIHBvcywgR0VUX01PREUgKHBvcykpOworICAgICAgaWYgKG1heWJlX2V4cGFuZF9pbnNu IChpY29kZSwgMywgb3BzKSkKKwl7CisJICBlbWl0X21vdmVfaW5zbiAodG9fcnR4LCB0ZW1w X3RhcmdldCk7CisJICByZXR1cm47CisJfQorICAgIH0KK30KKwogc3RhdGljIHZvaWQKIGV4 cGFuZF9BQk5PUk1BTF9ESVNQQVRDSEVSIChpbnRlcm5hbF9mbiwgZ2NhbGwgKikKIHsKQEAg LTMyNTMsNiArMzI5MCw3IEBAIG11bHRpX3ZlY3Rvcl9vcHRhYl9zdXBwb3J0ZWRfcCAoY29u dmVydF9vcHRhYiBvcHRhYiwgdHJlZV9wYWlyIHR5cGVzLAogI2RlZmluZSBkaXJlY3RfZm9s ZF9sZWZ0X29wdGFiX3N1cHBvcnRlZF9wIGRpcmVjdF9vcHRhYl9zdXBwb3J0ZWRfcAogI2Rl ZmluZSBkaXJlY3RfbWFza19mb2xkX2xlZnRfb3B0YWJfc3VwcG9ydGVkX3AgZGlyZWN0X29w dGFiX3N1cHBvcnRlZF9wCiAjZGVmaW5lIGRpcmVjdF9jaGVja19wdHJzX29wdGFiX3N1cHBv cnRlZF9wIGRpcmVjdF9vcHRhYl9zdXBwb3J0ZWRfcAorI2RlZmluZSBkaXJlY3RfdmVjX3Nl dF9vcHRhYl9zdXBwb3J0ZWRfcCBkaXJlY3Rfb3B0YWJfc3VwcG9ydGVkX3AKIAogLyogUmV0 dXJuIHRoZSBvcHRhYiB1c2VkIGJ5IGludGVybmFsIGZ1bmN0aW9uIEZOLiAgKi8KIApkaWZm IC0tZ2l0IGEvZ2NjL2ludGVybmFsLWZuLmRlZiBiL2djYy9pbnRlcm5hbC1mbi5kZWYKaW5k ZXggMTNlNjA4MjhmY2YuLmU2Y2ZlMWI2MTU5IDEwMDY0NAotLS0gYS9nY2MvaW50ZXJuYWwt Zm4uZGVmCisrKyBiL2djYy9pbnRlcm5hbC1mbi5kZWYKQEAgLTE0NSw2ICsxNDUsOCBAQCBE RUZfSU5URVJOQUxfT1BUQUJfRk4gKFZDT05EVSwgMCwgdmNvbmR1LCB2ZWNfY29uZHUpCiBE RUZfSU5URVJOQUxfT1BUQUJfRk4gKFZDT05ERVEsIDAsIHZjb25kZXEsIHZlY19jb25kZXEp CiBERUZfSU5URVJOQUxfT1BUQUJfRk4gKFZDT05EX01BU0ssIDAsIHZjb25kX21hc2ssIHZl Y19jb25kX21hc2spCiAKK0RFRl9JTlRFUk5BTF9PUFRBQl9GTiAoVkVDX1NFVCwgMCwgdmVj X3NldCwgdmVjX3NldCkKKwogREVGX0lOVEVSTkFMX09QVEFCX0ZOIChMRU5fU1RPUkUsIDAs IGxlbl9zdG9yZSwgbGVuX3N0b3JlKQogCiBERUZfSU5URVJOQUxfT1BUQUJfRk4gKFdISUxF X1VMVCwgRUNGX0NPTlNUIHwgRUNGX05PVEhST1csIHdoaWxlX3VsdCwgd2hpbGUpCi0tIAoy LjI3LjAuOTAuZ2VlYmI1MWJhOGMKCg== --------------C56223626B784E135A7A2131--