From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9595 invoked by alias); 13 Jun 2019 16:04:06 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 9585 invoked by uid 89); 13 Jun 2019 16:04:06 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: EUR03-DB5-obe.outbound.protection.outlook.com Received: from mail-eopbgr40079.outbound.protection.outlook.com (HELO EUR03-DB5-obe.outbound.protection.outlook.com) (40.107.4.79) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 13 Jun 2019 16:04:03 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=muKg8vppo2/aBpKGE/QZOBlPDqA/jfrM+3rzHJoBTjE=; b=zRRR3ZlszJE3CBV+1ZKEX5ZhGJONSlRfdQm5kS9+DzwJXHryFjlov/I++k6o0cHLM3zUsv5mkPbcsz4mzNwEWVLMZ4WLoIJ0vUquq/zgWeYqLrxQF5TVSnaomyLJfeXnCua2q7TYATDn1Ez7jHWV1zDM7dOZ+eH/o9JhRAhSgNo= Received: from DB6PR0801MB2054.eurprd08.prod.outlook.com (10.168.86.135) by DB6PR0801MB1925.eurprd08.prod.outlook.com (10.168.85.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1987.12; Thu, 13 Jun 2019 16:04:00 +0000 Received: from DB6PR0801MB2054.eurprd08.prod.outlook.com ([fe80::c95f:673d:46cd:2ca3]) by DB6PR0801MB2054.eurprd08.prod.outlook.com ([fe80::c95f:673d:46cd:2ca3%10]) with mapi id 15.20.1987.010; Thu, 13 Jun 2019 16:04:00 +0000 From: Joel Hutton To: GCC Patches CC: nd Subject: [AArch64] Use scvtf fbits option where appropriate Date: Thu, 13 Jun 2019 16:04:00 -0000 Message-ID: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Joel.Hutton@arm.com; x-ms-oob-tlc-oobclassifiers: OLM:1360; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 Content-Type: multipart/mixed; boundary="_002_DB6PR0801MB205410FFC9CB7FD4B643E765F5EF0DB6PR0801MB2054_" MIME-Version: 1.0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Joel.Hutton@arm.com X-IsSubscribed: yes X-SW-Source: 2019-06/txt/msg00780.txt.bz2 --_002_DB6PR0801MB205410FFC9CB7FD4B643E765F5EF0DB6PR0801MB2054_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-length: 2309 Hi all, There was previously no backend pattern to utilise the scvtf fbits option. = Where a fixed point is converted to a float, and divided by a power of 2, (= or multiplied by the reciprocal of a power of 2), this can be combined into= a single scvtf with fbits operation. This patch adds a pattern to combine = these instructions, and adds a helper function. For the following test case: float f(int a) { return ((float) a) / 65536.0; } double g(int a) { return ((double) a) / 4096.0; } the output generated is currently: f: scvtf s1, w0 // 6 [c=3D8 l=3D4] floatsisf2/1 mov w1, 931135488 // 17 [c=3D4 l=3D4] *movsi_aarch64/3 fmov s0, w1 // 18 [c=3D4 l=3D4] *movsf_aarch64/1 fmul s0, s1, s0 // 13 [c=3D8 l=3D4] mulsf3 ret // 24 [c=3D0 l=3D4] *do_return g: scvtf d1, w0 // 6 [c=3D8 l=3D4] floatsidf2 mov x1, 4553139223271571456 // 17 [c=3D4 l=3D4] *movdi_aarch6= 4/3 fmov d0, x1 // 18 [c=3D4 l=3D4] *movdf_aarch64/1 fmul d0, d1, d0 // 13 [c=3D8 l=3D4] muldf3 ret // 24 [c=3D0 l=3D4] *do_return =20=20=20=20=20=20=20=20 The output with this patch applied is: f: scvtf s0, w0, #16 // 13 [c=3D24 l=3D4] *combine_scvtf_SI_s= f3/1 ret // 22 [c=3D0 l=3D4] *do_return g: scvtf d0, w0, #12 // 13 [c=3D24 l=3D4] *combine_scvtf_SI_d= f3 ret // 22 [c=3D0 l=3D4] *do_return =20=20=20=20=20=20=20=20 gcc/ChangeLog: 2019-06-12 Joel Hutton * config/aarch64/aarch64-protos.h (aarch64_fpconst_pow2_recip): New= prototype * config/aarch64/aarch64.c (aarch64_fpconst_pow2_recip): New functi= on * config/aarch64/aarch64.md (*aarch64_cvtf__= 2_mult): New pattern (aarch64_cvtf__2_mult): New pattern * config/aarch64/constraints.md (Dt): New constraint * config/aarch64/predicates.md (aarch64_fpconst_pow2_recip): New pr= edicate gcc/testsuite/ChangeLog: 2019-06-12 Joel Hutton * gcc.target/aarch64/fmul_scvtf.c: New test. Bootstrapped and regression tested on aarch64-linux-none target.= --_002_DB6PR0801MB205410FFC9CB7FD4B643E765F5EF0DB6PR0801MB2054_ Content-Type: text/x-patch; name="0001-SCVTF-fbits.patch" Content-Description: 0001-SCVTF-fbits.patch Content-Disposition: attachment; filename="0001-SCVTF-fbits.patch"; size=10298; creation-date="Thu, 13 Jun 2019 16:03:47 GMT"; modification-date="Thu, 13 Jun 2019 16:03:47 GMT" Content-Transfer-Encoding: base64 Content-length: 13961 RnJvbSA2YWFjMGQ1NmRjN2QzNGU3YTZmY2FiYzFlOGIwYzdjMjkxYzBkNTFh IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEh1dHRvbiA8 Sm9lbC5IdXR0b25AYXJtLmNvbT4KRGF0ZTogVGh1LCAxMyBKdW4gMjAxOSAx MTowODo1NiArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFNDVlRGIGZiaXRzCgot LS0KIGdjYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LXByb3Rvcy5oICAgICAg ICAgICB8ICAgMSArCiBnY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC5jICAg ICAgICAgICAgICAgICAgfCAgMzAgKysrKwogZ2NjL2NvbmZpZy9hYXJjaDY0 L2FhcmNoNjQubWQgICAgICAgICAgICAgICAgIHwgIDM0ICsrKysrCiBnY2Mv Y29uZmlnL2FhcmNoNjQvY29uc3RyYWludHMubWQgICAgICAgICAgICAgfCAg IDcgKwogZ2NjL2NvbmZpZy9hYXJjaDY0L3ByZWRpY2F0ZXMubWQgICAgICAg ICAgICAgIHwgICA0ICsKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hYXJj aDY0L2ZtdWxfc2N2dGYuYyB8IDE0MCArKysrKysrKysrKysrKysrKysKIDYg ZmlsZXMgY2hhbmdlZCwgMjE2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9mbXVs X3NjdnRmLmMKCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FhcmNoNjQvYWFy Y2g2NC1wcm90b3MuaCBiL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LXBy b3Rvcy5oCmluZGV4IDFlM2IxYzkxZGIxLi5hZDFiYTQ1OGEzZiAxMDA2NDQK LS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtcHJvdG9zLmgKKysr IGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtcHJvdG9zLmgKQEAgLTQ5 NCw2ICs0OTQsNyBAQCBlbnVtIGFhcmNoNjRfc3ltYm9sX3R5cGUgYWFyY2g2 NF9jbGFzc2lmeV90bHNfc3ltYm9sIChydHgpOwogZW51bSByZWdfY2xhc3Mg YWFyY2g2NF9yZWdub19yZWdjbGFzcyAodW5zaWduZWQpOwogaW50IGFhcmNo NjRfYXNtX3ByZWZlcnJlZF9laF9kYXRhX2Zvcm1hdCAoaW50LCBpbnQpOwog aW50IGFhcmNoNjRfZnBjb25zdF9wb3dfb2ZfMiAocnR4KTsKK2ludCBhYXJj aDY0X2ZwY29uc3RfcG93Ml9yZWNpcCAocnR4KTsKIG1hY2hpbmVfbW9kZSBh YXJjaDY0X2hhcmRfcmVnbm9fY2FsbGVyX3NhdmVfbW9kZSAodW5zaWduZWQs IHVuc2lnbmVkLAogCQkJCQkJICAgICAgIG1hY2hpbmVfbW9kZSk7CiBpbnQg YWFyY2g2NF91eHRfc2l6ZSAoaW50LCBIT1NUX1dJREVfSU5UKTsKZGlmZiAt LWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LmMgYi9nY2MvY29u ZmlnL2FhcmNoNjQvYWFyY2g2NC5jCmluZGV4IDlhMDM1ZGQ5ZWQ4Li40OWE3 ZDkyNTZjZiAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNo NjQuYworKysgYi9nY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC5jCkBAIC0x ODcwNyw2ICsxODcwNywzNiBAQCBhYXJjaDY0X2ZwY29uc3RfcG93X29mXzIg KHJ0eCB4KQogICByZXR1cm4gZXhhY3RfbG9nMiAocmVhbF90b19pbnRlZ2Vy IChyKSk7CiB9CiAKKy8qIElmIFggaXMgYSBwb3NpdGl2ZSBDT05TVF9ET1VC TEUgd2l0aCBhIHZhbHVlIHRoYXQgaXMgdGhlIHJlY2lwcm9jYWwgb2YgYQor ICAgcG93ZXIgb2YgMiAoaS5lIDEvMl5uKSByZXR1cm4gdGhlIG51bWJlciBv ZiBmbG9hdCBiaXRzLiBlLmcuIGZvciB4PT0oMS8yXm4pCisgICByZXR1cm4g bG9nMiAobikuIE90aGVyd2lzZSByZXR1cm4gMC4gICovCitpbnQKK2FhcmNo NjRfZnBjb25zdF9wb3cyX3JlY2lwIChydHggeCkKK3sKKyAgUkVBTF9WQUxV RV9UWVBFIHIwOworCisgIGlmICghQ09OU1RfRE9VQkxFX1AgKHgpKQorICAg IHJldHVybiAwOworCisgIHIwID0gKkNPTlNUX0RPVUJMRV9SRUFMX1ZBTFVF ICh4KTsKKyAgaWYgKGV4YWN0X3JlYWxfaW52ZXJzZSAoREZtb2RlLCAmcjAp CisgICAgICAmJiAhUkVBTF9WQUxVRV9ORUdBVElWRSAocjApKQorICAgIHsK KyAgICAgIGlmIChleGFjdF9yZWFsX3RydW5jYXRlIChERm1vZGUsICZyMCkp CisJeworCSAgSE9TVF9XSURFX0lOVCB2YWx1ZSA9IHJlYWxfdG9faW50ZWdl ciAoJnIwKTsKKwkgIHZhbHVlID0gdmFsdWUgJiAweGZmZmZmZmZmOworCSAg aWYgKCh2YWx1ZSAhPSAwKSAmJiAoICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9 PSAwKSkKKwkgICAgeworCSAgICAgIGludCByZXQgPSBleGFjdF9sb2cyICh2 YWx1ZSk7CisJICAgICAgZ2NjX2Fzc2VydCAoSU5fUkFOR0UgKHJldCwgMCwg MzEpKTsKKwkgICAgICByZXR1cm4gcmV0OworCSAgICB9CisJfQorICAgIH0K KyAgcmV0dXJuIDA7Cit9CisKIC8qIElmIFggaXMgYSB2ZWN0b3Igb2YgZXF1 YWwgQ09OU1RfRE9VQkxFIHZhbHVlcyBhbmQgdGhhdCB2YWx1ZSBpcwogICAg WSwgcmV0dXJuIHRoZSBhYXJjaDY0X2ZwY29uc3RfcG93X29mXzIgb2YgWS4g IE90aGVyd2lzZSByZXR1cm4gLTEuICAqLwogCmRpZmYgLS1naXQgYS9nY2Mv Y29uZmlnL2FhcmNoNjQvYWFyY2g2NC5tZCBiL2djYy9jb25maWcvYWFyY2g2 NC9hYXJjaDY0Lm1kCmluZGV4IDUyNmM3ZmIwZGFiLi42MGJjZjFiYzhkOSAx MDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKKysr IGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKQEAgLTYwMTYsNiAr NjAxNiw0MCBAQAogICBbKHNldF9hdHRyICJ0eXBlIiAiZl9jdnRmMmkiKV0K ICkKIAorKGRlZmluZV9pbnNuICIqYWFyY2g2NF88c3Vfb3B0YWI+Y3Z0Zl88 ZmN2dF90YXJnZXQ+XzxHUEY6bW9kZT4yX211bHQiCisgIFsoc2V0IChtYXRj aF9vcGVyYW5kOkdQRiAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXcsdyIpCisJ KG11bHQ6R1BGIChGTE9BVFVPUlM6R1BGCisJCSAgIChtYXRjaF9vcGVyYW5k OjxGQ1ZUX1RBUkdFVD4gMSAicmVnaXN0ZXJfb3BlcmFuZCIgIncsP3IiKSkK KwkJICAgKG1hdGNoX29wZXJhbmQgMiAiYWFyY2g2NF9mcF9wb3cyX3JlY2lw IiJEdCxEdCIpKSldCisgICJUQVJHRVRfRkxPQVQiCisgIHsKKyAgICBvcGVy YW5kc1syXSA9IEdFTl9JTlQgKGFhcmNoNjRfZnBjb25zdF9wb3cyX3JlY2lw IChvcGVyYW5kc1syXSkpOworICAgIHN3aXRjaCAod2hpY2hfYWx0ZXJuYXRp dmUpCisgICAgeworICAgICAgY2FzZSAwOgorCXJldHVybiAiPHN1X29wdGFi PmN2dGZcdCU8R1BGOnM+MCwgJTxzPjEsICMlMiI7CisgICAgICBjYXNlIDE6 CisJcmV0dXJuICI8c3Vfb3B0YWI+Y3Z0Zlx0JTxHUEY6cz4wLCAlPHcxPjEs ICMlMiI7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorICBbKHNldF9h dHRyICJ0eXBlIiAibmVvbl9pbnRfdG9fZnBfPFZldHlwZT4sZl9jdnRpMmYi KQorICAgKHNldF9hdHRyICJhcmNoIiAic2ltZCxmcCIpXQorKQorCisoZGVm aW5lX2luc24gIiphYXJjaDY0XzxzdV9vcHRhYj5jdnRmXzxmY3Z0X2llc2l6 ZT5fPEdQRjptb2RlPjJfbXVsdCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6 R1BGIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9dyIpCisJKG11bHQ6R1BGIChG TE9BVFVPUlM6R1BGCisJCSAgIChtYXRjaF9vcGVyYW5kOjxGQ1ZUX0lFU0la RT4gMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKSkKKwkJICAgKG1hdGNoX29w ZXJhbmQgMiAiYWFyY2g2NF9mcF9wb3cyX3JlY2lwIiAiRHQiKSkpXQorICAi VEFSR0VUX0ZMT0FUIgorICB7CisgICAgb3BlcmFuZHNbMl0gPSBHRU5fSU5U IChhYXJjaDY0X2ZwY29uc3RfcG93Ml9yZWNpcCAob3BlcmFuZHNbMl0pKTsK KyAgICByZXR1cm4gIjxzdV9vcHRhYj5jdnRmXHQlPEdQRjpzPjAsICU8dzI+ MSwgIyUyIjsKKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAiZl9jdnRpMmYi KV0KKykKKwogKGRlZmluZV9pbnNuICI8b3B0YWI+PGZjdnRfdGFyZ2V0PjxH UEY6bW9kZT4yIgogICBbKHNldCAobWF0Y2hfb3BlcmFuZDpHUEYgMCAicmVn aXN0ZXJfb3BlcmFuZCIgIj13LHciKQogICAgICAgICAoRkxPQVRVT1JTOkdQ RiAobWF0Y2hfb3BlcmFuZDo8RkNWVF9UQVJHRVQ+IDEgInJlZ2lzdGVyX29w ZXJhbmQiICJ3LD9yIikpKV0KZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFy Y2g2NC9jb25zdHJhaW50cy5tZCBiL2djYy9jb25maWcvYWFyY2g2NC9jb25z dHJhaW50cy5tZAppbmRleCAyMWY5NTQ5ZTY2MC4uYTc3MzFhMDMzZWEgMTAw NjQ0Ci0tLSBhL2djYy9jb25maWcvYWFyY2g2NC9jb25zdHJhaW50cy5tZAor KysgYi9nY2MvY29uZmlnL2FhcmNoNjQvY29uc3RyYWludHMubWQKQEAgLTMy OSw2ICszMjksMTMgQEAKICAgICAgIChtYXRjaF90ZXN0ICJhYXJjaDY0X3Np bWRfc2NhbGFyX2ltbWVkaWF0ZV92YWxpZF9mb3JfbW92ZSAob3AsCiAJCQkJ CQkgUUltb2RlKSIpKSkKIAorKGRlZmluZV9jb25zdHJhaW50ICJEdCIKKyAg IkBpbnRlcm5hbAorIEEgY29uc3RfZG91YmxlIHdoaWNoIGlzIHRoZSByZWNp cHJvY2FsIG9mIGFuIGV4YWN0IHBvd2VyIG9mIHR3bywgY2FuIGJlCisgdXNl ZCBpbiBhbiBzY3Z0ZiB3aXRoIGZyYWN0IGJpdHMgb3BlcmF0aW9uIgorIChh bmQgKG1hdGNoX2NvZGUgImNvbnN0X2RvdWJsZSIpCisgICAgICAobWF0Y2hf dGVzdCAiYWFyY2g2NF9mcGNvbnN0X3BvdzJfcmVjaXAgKG9wKSIpKSkKKwog KGRlZmluZV9jb25zdHJhaW50ICJEbCIKICAgIkBpbnRlcm5hbAogIEEgY29u c3RyYWludCB0aGF0IG1hdGNoZXMgdmVjdG9yIG9mIGltbWVkaWF0ZXMgZm9y IGxlZnQgc2hpZnRzLiIKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2 NC9wcmVkaWNhdGVzLm1kIGIvZ2NjL2NvbmZpZy9hYXJjaDY0L3ByZWRpY2F0 ZXMubWQKaW5kZXggMTAxMDBjYTgzMGEuLjk5MzI4OTAxNGYwIDEwMDY0NAot LS0gYS9nY2MvY29uZmlnL2FhcmNoNjQvcHJlZGljYXRlcy5tZAorKysgYi9n Y2MvY29uZmlnL2FhcmNoNjQvcHJlZGljYXRlcy5tZApAQCAtOTgsNiArOTgs MTAgQEAKICAgKGFuZCAobWF0Y2hfY29kZSAiY29uc3RfZG91YmxlIikKIAko bWF0Y2hfdGVzdCAiYWFyY2g2NF9mcGNvbnN0X3Bvd19vZl8yIChvcCkgPiAw IikpKQogCisoZGVmaW5lX3ByZWRpY2F0ZSAiYWFyY2g2NF9mcF9wb3cyX3Jl Y2lwIgorICAoYW5kIChtYXRjaF9jb2RlICJjb25zdF9kb3VibGUiKQorICAg ICAgIChtYXRjaF90ZXN0ICJhYXJjaDY0X2ZwY29uc3RfcG93Ml9yZWNpcCAo b3ApIikpKQorCiAoZGVmaW5lX3ByZWRpY2F0ZSAiYWFyY2g2NF9mcF92ZWNf cG93MiIKICAgKG1hdGNoX3Rlc3QgImFhcmNoNjRfdmVjX2ZwY29uc3RfcG93 X29mXzIgKG9wKSA+IDAiKSkKIApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2FhcmNoNjQvZm11bF9zY3Z0Zi5jIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvZm11bF9zY3Z0Zi5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5lOGQxZGU2Mjc5Ygot LS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h YXJjaDY0L2ZtdWxfc2N2dGYuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogeyBk Zy1kbyBydW4gfSAqLworLyogeyBkZy1vcHRpb25zICItc2F2ZS10ZW1wcyAt TzIgLWZuby1pbmxpbmUiIH0gKi8KKworI2RlZmluZSBGVU5DX0RFRlMoX19h KQkJCVwKKwlmbG9hdAkJCQlcCitmc2ZvbyMjX19hIChpbnQgeCkJCQlcCit7 CQkJCQlcCisJcmV0dXJuICgoZmxvYXQpIHgpLygxdSA8PCBfX2EpOwlcCit9 CQkJCQlcCitmbG9hdAkJCQkJXAorZnVzZm9vIyNfX2EgKHVuc2lnbmVkIGlu dCB4KQkJXAorewkJCQkJXAorCXJldHVybiAoKGZsb2F0KSB4KS8oMXUgPDwg X19hKTsJXAorfQkJCQkJXAorZmxvYXQJCQkJCVwKK2ZzbGZvbyMjX19hIChs b25nIHgpCQkJXAorewkJCQkJXAorCXJldHVybiAoKGZsb2F0KSB4KS8oMXUg PDwgX19hKTsJXAorfQkJCQkJXAorZmxvYXQJCQkJCVwKK2Z1bGZvbyMjX19h ICh1bnNpZ25lZCBsb25nIHgpCQlcCit7CQkJCQlcCisJcmV0dXJuICgoZmxv YXQpIHgpLygxdSA8PCBfX2EpOwlcCit9CQkJCQlcCisKKyNkZWZpbmUgRlVO Q19ERUZEKF9fYSkJCQlcCitkb3VibGUJCQkJCVwKK2RzZm9vIyNfX2EgKGlu dCB4KQkJCVwKK3sJCQkJCVwKKwlyZXR1cm4gKChkb3VibGUpIHgpLygxdSA8 PCBfX2EpO1wKK30JCQkJCVwKK2RvdWJsZQkJCQkJXAorZHVzZm9vIyNfX2Eg KHVuc2lnbmVkIGludCB4KQkJXAorewkJCQkJXAorCXJldHVybiAoKGRvdWJs ZSkgeCkvKDF1IDw8IF9fYSk7XAorfQkJCQkJXAorZG91YmxlCQkJCQlcCitk c2xmb28jI19fYSAobG9uZyB4KQkJCVwKK3sJCQkJCVwKKwlyZXR1cm4gKChk b3VibGUpIHgpLygxdSA8PCBfX2EpO1wKK30JCQkJCVwKK2RvdWJsZQkJCQkJ XAorZHVsZm9vIyNfX2EgKHVuc2lnbmVkIGxvbmcgeCkJCVwKK3sJCQkJCVwK KwlyZXR1cm4gKChkb3VibGUpIHgpLygxdSA8PCBfX2EpO1wKK30KKworRlVO Q19ERUZTICg0KQorCS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10 aW1lcyAic2N2dGZcdHNcWzAtOVxdLCB3XFswLTlcXSouKiM0IiAxIH0gfSAq LworCS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidWN2 dGZcdHNcWzAtOVxdLCB3XFswLTlcXSouKiM0IiAxIH0gfSAqLworCS8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAic2N2dGZcdHNcWzAt OVxdLCB4XFswLTlcXSouKiM0IiAxIH0gfSAqLworCS8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyAidWN2dGZcdHNcWzAtOVxdLCB4XFsw LTlcXSouKiM0IiAxIH0gfSAqLworCitGVU5DX0RFRkQgKDQpCisJLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJzY3Z0Zlx0ZFxbMC05 XF0sIHdcWzAtOVxdKi4qIzQiIDEgfSB9ICovCisJLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ1Y3Z0Zlx0ZFxbMC05XF0sIHdcWzAt OVxdKi4qIzQiIDEgfSB9ICovCisJLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLXRpbWVzICJzY3Z0Zlx0ZFxbMC05XF0sIHhcWzAtOVxdKi4qIzQi IDEgfSB9ICovCisJLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRp bWVzICJ1Y3Z0Zlx0ZFxbMC05XF0sIHhcWzAtOVxdKi4qIzQiIDEgfSB9ICov CisKK0ZVTkNfREVGUyAoOCkKKwkvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItdGltZXMgInNjdnRmXHRzXFswLTlcXSwgd1xbMC05XF0qLiojOCIg MSB9IH0gKi8KKwkvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGlt ZXMgInVjdnRmXHRzXFswLTlcXSwgd1xbMC05XF0qLiojOCIgMSB9IH0gKi8K KwkvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInNjdnRm XHRzXFswLTlcXSwgeFxbMC05XF0qLiojOCIgMSB9IH0gKi8KKwkvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInVjdnRmXHRzXFswLTlc XSwgeFxbMC05XF0qLiojOCIgMSB9IH0gKi8KKworRlVOQ19ERUZEICg4KQor CS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAic2N2dGZc dGRcWzAtOVxdLCB3XFswLTlcXSouKiM4IiAxIH0gfSAqLworCS8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidWN2dGZcdGRcWzAtOVxd LCB3XFswLTlcXSouKiM4IiAxIH0gfSAqLworCS8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci10aW1lcyAic2N2dGZcdGRcWzAtOVxdLCB4XFswLTlc XSouKiM4IiAxIH0gfSAqLworCS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci10aW1lcyAidWN2dGZcdGRcWzAtOVxdLCB4XFswLTlcXSouKiM4IiAx IH0gfSAqLworCitGVU5DX0RFRlMgKDE2KQorCS8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci10aW1lcyAic2N2dGZcdHNcWzAtOVxdLCB3XFswLTlc XSouKiMxNiIgMSB9IH0gKi8KKwkvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItdGltZXMgInVjdnRmXHRzXFswLTlcXSwgd1xbMC05XF0qLiojMTYi IDEgfSB9ICovCisJLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRp bWVzICJzY3Z0Zlx0c1xbMC05XF0sIHhcWzAtOVxdKi4qIzE2IiAxIH0gfSAq LworCS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidWN2 dGZcdHNcWzAtOVxdLCB4XFswLTlcXSouKiMxNiIgMSB9IH0gKi8KKworRlVO Q19ERUZEICgxNikKKwkvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt dGltZXMgInNjdnRmXHRkXFswLTlcXSwgd1xbMC05XF0qLiojMTYiIDEgfSB9 ICovCisJLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ1 Y3Z0Zlx0ZFxbMC05XF0sIHdcWzAtOVxdKi4qIzE2IiAxIH0gfSAqLworCS8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAic2N2dGZcdGRc WzAtOVxdLCB4XFswLTlcXSouKiMxNiIgMSB9IH0gKi8KKwkvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInVjdnRmXHRkXFswLTlcXSwg eFxbMC05XF0qLiojMTYiIDEgfSB9ICovCisKK0ZVTkNfREVGUyAoMzEpCisJ LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJzY3Z0Zlx0 c1xbMC05XF0sIHdcWzAtOVxdKi4qIzMxIiAxIH0gfSAqLworCS8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidWN2dGZcdHNcWzAtOVxd LCB3XFswLTlcXSouKiMzMSIgMSB9IH0gKi8KKwkvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItdGltZXMgInNjdnRmXHRzXFswLTlcXSwgeFxbMC05 XF0qLiojMzEiIDEgfSB9ICovCisJLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLXRpbWVzICJ1Y3Z0Zlx0c1xbMC05XF0sIHhcWzAtOVxdKi4qIzMx IiAxIH0gfSAqLworCitGVU5DX0RFRkQgKDMxKQorCS8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyAic2N2dGZcdGRcWzAtOVxdLCB3XFsw LTlcXSouKiMzMSIgMSB9IH0gKi8KKwkvKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItdGltZXMgInVjdnRmXHRkXFswLTlcXSwgd1xbMC05XF0qLioj MzEiIDEgfSB9ICovCisJLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzICJzY3Z0Zlx0ZFxbMC05XF0sIHhcWzAtOVxdKi4qIzMxIiAxIH0g fSAqLworCS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAi dWN2dGZcdGRcWzAtOVxdLCB4XFswLTlcXSouKiMzMSIgMSB9IH0gKi8KKwor I2RlZmluZSBGVU5DX1RFU1RTKF9fYSwgX19iKQkJCQkJCVwKK2RvCQkJCQkJ CQkJXAorewkJCQkJCQkJCVwKKwlpZiAoZnNmb28jI19fYSAoX19iKSAhPSAg KChpbnQpIGkpICogKDEuMGYvKDF1IDw8IF9fYSkpICkJXAorCV9fYnVpbHRp bl9hYm9ydCAoKTsJCQkJCQlcCisJaWYgKGZ1c2ZvbyMjX19hIChfX2IpICE9 ICgoaW50KSBpKSAqICgxLjBmLygxdSA8PCBfX2EpKSApCVwKKwlfX2J1aWx0 aW5fYWJvcnQgKCk7CQkJCQkJXAorCWlmIChmc2xmb28jI19fYSAoX19iKSAh PSAoKGludCkgaSkgKiAoMS4wZi8oMXUgPDwgX19hKSkgKQlcCisJX19idWls dGluX2Fib3J0ICgpOwkJCQkJCVwKKwlpZiAoZnVsZm9vIyNfX2EgKF9fYikg IT0gKChpbnQpIGkpICogKDEuMGYvKDF1IDw8IF9fYSkpICkJXAorCV9fYnVp bHRpbl9hYm9ydCAoKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5l IEZVTkNfVEVTVEQoX19hLCBfX2IpCQkJCQkJXAorZG8JCQkJCQkJCQlcCit7 CQkJCQkJCQkJXAorCWlmIChmc2ZvbyMjX19hIChfX2IpICE9ICAoKGludCkg aSkgKiAoMS4wZC8oMXUgPDwgX19hKSkgKQlcCisJX19idWlsdGluX2Fib3J0 ICgpOwkJCQkJCVwKKwlpZiAoZnVzZm9vIyNfX2EgKF9fYikgIT0gKChpbnQp IGkpICogKDEuMGQvKDF1IDw8IF9fYSkpICkJXAorCV9fYnVpbHRpbl9hYm9y dCAoKTsJCQkJCQlcCisJaWYgKGZzbGZvbyMjX19hIChfX2IpICE9ICgoaW50 KSBpKSAqICgxLjBkLygxdSA8PCBfX2EpKSApCVwKKwlfX2J1aWx0aW5fYWJv cnQgKCk7CQkJCQkJXAorCWlmIChmdWxmb28jI19fYSAoX19iKSAhPSAoKGlu dCkgaSkgKiAoMS4wZC8oMXUgPDwgX19hKSkgKQlcCisJX19idWlsdGluX2Fi b3J0ICgpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKwlpbnQKK21haW4gKHZv aWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKysp CisJeworCQlGVU5DX1RFU1RTICg0LCBpKTsKKwkJRlVOQ19URVNUUyAoOCwg aSk7CisJCUZVTkNfVEVTVFMgKDE2LCBpKTsKKwkJRlVOQ19URVNUUyAoMzEs IGkpOworCisJCUZVTkNfVEVTVEQgKDQsIGkpOworCQlGVU5DX1RFU1REICg4 LCBpKTsKKwkJRlVOQ19URVNURCAoMTYsIGkpOworCQlGVU5DX1RFU1REICgz MSwgaSk7CisJfQorCXJldHVybiAwOworfQotLSAKMi4xNy4xCgo= --_002_DB6PR0801MB205410FFC9CB7FD4B643E765F5EF0DB6PR0801MB2054_--