From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id ECD8A3828903 for ; Fri, 10 Jun 2022 13:37:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org ECD8A3828903 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 92C6B1FB; Fri, 10 Jun 2022 06:37:21 -0700 (PDT) Received: from [10.57.10.220] (unknown [10.57.10.220]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C1B6A3F73B; Fri, 10 Jun 2022 06:37:20 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------QfFZh09BlIIZNeUGiwOmRXxn" Message-ID: Date: Fri, 10 Jun 2022 14:37:14 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Content-Language: en-US To: "gcc-patches@gcc.gnu.org" Cc: Kyrylo Tkachov , Richard Sandiford From: "Andre Vieira (lists)" Subject: [PATCH][AArch64] Implement ACLE Data Intrinsics X-Spam-Status: No, score=-27.5 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_LOTSOFHASH, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: Fri, 10 Jun 2022 13:37:26 -0000 This is a multi-part message in MIME format. --------------QfFZh09BlIIZNeUGiwOmRXxn Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, This patch adds support for the ACLE Data Intrinsics to the AArch64 port. Bootstrapped and regression tested on aarch64-none-linux. OK for trunk? gcc/ChangeLog: 2022-06-10  Andre Vieira          * config/aarch64/aarch64.md (rbit2): Rename this ...         (@aarch64_rbit): ... this and change it in...         (ffs2,ctz2): ... here.         (@aarch64_rev16): New.         * config/aarch64/aarch64-builtins.cc: (aarch64_builtins):         Define the following enum AARCH64_REV16, AARCH64_REV16L, AARCH64_REV16LL,         AARCH64_RBIT, AARCH64_RBITL, AARCH64_RBITLL.         (aarch64_init_data_intrinsics): New.         (handle_arm_acle_h): Add call to aarch64_init_data_intrinsics.         (aarch64_expand_builtin_data_intrinsic): New.         (aarch64_general_expand_builtin): Add call to aarch64_expand_builtin_data_intrinsic.         * config/aarch64/arm_acle.h (__clz, __clzl, __clzll, __cls, __clsl, __clsll, __rbit,         __rbitl, __rbitll, __rev, __revl, __revll, __rev16, __rev16l, __rev16ll, __ror, __rorl,         __rorll, __revsh): New. gcc/testsuite/ChangeLog: 2022-06-10  Andre Vieira      * gcc.target/aarch64/acle/data-intrinsics.c: New test. --------------QfFZh09BlIIZNeUGiwOmRXxn Content-Type: text/plain; charset=UTF-8; name="data_intrinsics.patch" Content-Disposition: attachment; filename="data_intrinsics.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LWJ1aWx0aW5zLmNjIGIv Z2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtYnVpbHRpbnMuY2MKaW5kZXggZTBhNzQxYWM2 NjMxODg3MTNlMjFmNDU3YWZmYTU3MjE3ZDA3NDc4My4uOTFhNjg3ZGVlMTNhMjdjMjFmMGM1 MGRlOWJhNzc3YWE5MDBkNjA5NiAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2Fh cmNoNjQtYnVpbHRpbnMuY2MKKysrIGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtYnVp bHRpbnMuY2MKQEAgLTYxMyw2ICs2MTMsMTIgQEAgZW51bSBhYXJjaDY0X2J1aWx0aW5zCiAg IEFBUkNINjRfTFM2NF9CVUlMVElOX1NUNjRCLAogICBBQVJDSDY0X0xTNjRfQlVJTFRJTl9T VDY0QlYsCiAgIEFBUkNINjRfTFM2NF9CVUlMVElOX1NUNjRCVjAsCisgIEFBUkNINjRfUkVW MTYsCisgIEFBUkNINjRfUkVWMTZMLAorICBBQVJDSDY0X1JFVjE2TEwsCisgIEFBUkNINjRf UkJJVCwKKyAgQUFSQ0g2NF9SQklUTCwKKyAgQUFSQ0g2NF9SQklUTEwsCiAgIEFBUkNINjRf QlVJTFRJTl9NQVgKIH07CiAKQEAgLTE2NjQsMTAgKzE2NzAsNDEgQEAgYWFyY2g2NF9pbml0 X2xzNjRfYnVpbHRpbnMgKHZvaWQpCiAgICAgICA9IGFhcmNoNjRfZ2VuZXJhbF9hZGRfYnVp bHRpbiAoZGF0YVtpXS5uYW1lLCBkYXRhW2ldLnR5cGUsIGRhdGFbaV0uY29kZSk7CiB9CiAK K3N0YXRpYyB2b2lkCithYXJjaDY0X2luaXRfZGF0YV9pbnRyaW5zaWNzICh2b2lkKQorewor ICB0cmVlIHVpbnQzMl9mbnR5cGUgPSBidWlsZF9mdW5jdGlvbl90eXBlX2xpc3QgKHVpbnQz Ml90eXBlX25vZGUsCisJCQkJCQkgdWludDMyX3R5cGVfbm9kZSwgTlVMTF9UUkVFKTsKKyAg dHJlZSBsb25nX2ZudHlwZSA9IGJ1aWxkX2Z1bmN0aW9uX3R5cGVfbGlzdCAobG9uZ191bnNp Z25lZF90eXBlX25vZGUsCisJCQkJCSAgICAgICBsb25nX3Vuc2lnbmVkX3R5cGVfbm9kZSwK KwkJCQkJICAgICAgIE5VTExfVFJFRSk7CisgIHRyZWUgdWludDY0X2ZudHlwZSA9IGJ1aWxk X2Z1bmN0aW9uX3R5cGVfbGlzdCAodWludDY0X3R5cGVfbm9kZSwKKwkJCQkJCSB1aW50NjRf dHlwZV9ub2RlLCBOVUxMX1RSRUUpOworICBhYXJjaDY0X2J1aWx0aW5fZGVjbHNbQUFSQ0g2 NF9SRVYxNl0KKyAgICA9IGFhcmNoNjRfZ2VuZXJhbF9hZGRfYnVpbHRpbiAoIl9fYnVpbHRp bl9hYXJjaDY0X3JldjE2IiwgdWludDMyX2ZudHlwZSwKKwkJCQkgICBBQVJDSDY0X1JFVjE2 KTsKKyAgYWFyY2g2NF9idWlsdGluX2RlY2xzW0FBUkNINjRfUkVWMTZMXQorICAgID0gYWFy Y2g2NF9nZW5lcmFsX2FkZF9idWlsdGluICgiX19idWlsdGluX2FhcmNoNjRfcmV2MTZsIiwg bG9uZ19mbnR5cGUsCisJCQkJICAgQUFSQ0g2NF9SRVYxNkwpOworICBhYXJjaDY0X2J1aWx0 aW5fZGVjbHNbQUFSQ0g2NF9SRVYxNkxMXQorICAgID0gYWFyY2g2NF9nZW5lcmFsX2FkZF9i dWlsdGluICgiX19idWlsdGluX2FhcmNoNjRfcmV2MTZsbCIsIHVpbnQ2NF9mbnR5cGUsCisJ CQkJICAgQUFSQ0g2NF9SRVYxNkxMKTsKKyAgYWFyY2g2NF9idWlsdGluX2RlY2xzW0FBUkNI NjRfUkJJVF0KKyAgICA9IGFhcmNoNjRfZ2VuZXJhbF9hZGRfYnVpbHRpbiAoIl9fYnVpbHRp bl9hYXJjaDY0X3JiaXQiLCB1aW50MzJfZm50eXBlLAorCQkJCSAgIEFBUkNINjRfUkJJVCk7 CisgIGFhcmNoNjRfYnVpbHRpbl9kZWNsc1tBQVJDSDY0X1JCSVRMXQorICAgID0gYWFyY2g2 NF9nZW5lcmFsX2FkZF9idWlsdGluICgiX19idWlsdGluX2FhcmNoNjRfcmJpdGwiLCBsb25n X2ZudHlwZSwKKwkJCQkgICBBQVJDSDY0X1JCSVRMKTsKKyAgYWFyY2g2NF9idWlsdGluX2Rl Y2xzW0FBUkNINjRfUkJJVExMXQorICAgID0gYWFyY2g2NF9nZW5lcmFsX2FkZF9idWlsdGlu ICgiX19idWlsdGluX2FhcmNoNjRfcmJpdGxsIiwgdWludDY0X2ZudHlwZSwKKwkJCQkgICBB QVJDSDY0X1JCSVRMTCk7Cit9CisKIC8qIEltcGxlbWVudCAjcHJhZ21hIEdDQyBhYXJjaDY0 ICJhcm1fYWNsZS5oIi4gICovCiB2b2lkCiBoYW5kbGVfYXJtX2FjbGVfaCAodm9pZCkKIHsK KyAgYWFyY2g2NF9pbml0X2RhdGFfaW50cmluc2ljcyAoKTsKICAgaWYgKFRBUkdFVF9MUzY0 KQogICAgIGFhcmNoNjRfaW5pdF9sczY0X2J1aWx0aW5zICgpOwogfQpAQCAtMjM5Myw2ICsy NDMwLDMyIEBAIGFhcmNoNjRfZXhwYW5kX2J1aWx0aW5fbWVtdGFnIChpbnQgZmNvZGUsIHRy ZWUgZXhwLCBydHggdGFyZ2V0KQogICBlbWl0X2luc24gKHBhdCk7CiAgIHJldHVybiB0YXJn ZXQ7CiB9CisvKiBGdW5jdGlvbiB0byBleHBhbmQgYW4gZXhwcmVzc2lvbiBFWFAgd2hpY2gg Y2FsbHMgb25lIG9mIHRoZSBBQ0xFIERhdGEKKyAgIEludHJpbnNpYyBidWlsdGlucyBGQ09E RSB3aXRoIHRoZSByZXN1bHQgZ29pbmcgdG8gVEFSR0VULiAgKi8KK3N0YXRpYyBydHgKK2Fh cmNoNjRfZXhwYW5kX2J1aWx0aW5fZGF0YV9pbnRyaW5zaWMgKHVuc2lnbmVkIGludCBmY29k ZSwgdHJlZSBleHAsIHJ0eCB0YXJnZXQpCit7CisgIHJ0eCBvcDAgPSBleHBhbmRfbm9ybWFs IChDQUxMX0VYUFJfQVJHIChleHAsIDApKTsKKyAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRf TU9ERSAob3AwKTsKKyAgcnR4IHBhdDsKKyAgc3dpdGNoIChmY29kZSkKKyAgICB7CisgICAg Y2FzZSBBQVJDSDY0X1JFVjE2OgorICAgIGNhc2UgQUFSQ0g2NF9SRVYxNkw6CisgICAgY2Fz ZSBBQVJDSDY0X1JFVjE2TEw6CisgICAgICBwYXQgPSBnZW5fYWFyY2g2NF9yZXYxNiAobW9k ZSwgdGFyZ2V0LCBvcDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQVJDSDY0X1JCSVQ6 CisgICAgY2FzZSBBQVJDSDY0X1JCSVRMOgorICAgIGNhc2UgQUFSQ0g2NF9SQklUTEw6Cisg ICAgICBwYXQgPSBnZW5fYWFyY2g2NF9yYml0IChtb2RlLCB0YXJnZXQsIG9wMCk7CisgICAg ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOworICAg IH0KKyAgZW1pdF9pbnNuIChwYXQpOworICByZXR1cm4gdGFyZ2V0OworfQogCiAvKiBFeHBh bmQgYW4gZXhwcmVzc2lvbiBFWFAgYXMgZnBzciBvciBmcGNyIHNldHRlciAoZGVwZW5kaW5n IG9uCiAgICBVTlNQRUMpIHVzaW5nIE1PREUuICAqLwpAQCAtMjU1MSw2ICsyNjE0LDkgQEAg YWFyY2g2NF9nZW5lcmFsX2V4cGFuZF9idWlsdGluICh1bnNpZ25lZCBpbnQgZmNvZGUsIHRy ZWUgZXhwLCBydHggdGFyZ2V0LAogICBpZiAoZmNvZGUgPj0gQUFSQ0g2NF9NRU1UQUdfQlVJ TFRJTl9TVEFSVAogICAgICAgJiYgZmNvZGUgPD0gQUFSQ0g2NF9NRU1UQUdfQlVJTFRJTl9F TkQpCiAgICAgcmV0dXJuIGFhcmNoNjRfZXhwYW5kX2J1aWx0aW5fbWVtdGFnIChmY29kZSwg ZXhwLCB0YXJnZXQpOworICBpZiAoZmNvZGUgPj0gQUFSQ0g2NF9SRVYxNgorICAgICAgJiYg ZmNvZGUgPD0gQUFSQ0g2NF9SQklUTEwpCisgICAgcmV0dXJuIGFhcmNoNjRfZXhwYW5kX2J1 aWx0aW5fZGF0YV9pbnRyaW5zaWMgKGZjb2RlLCBleHAsIHRhcmdldCk7CiAKICAgZ2NjX3Vu cmVhY2hhYmxlICgpOwogfQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNo NjQubWQgYi9nY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC5tZAppbmRleCBhY2VjOGMxMTQ2 NzY1YzBmYWM3M2MxNTM1MTg1MzMyNGI4ZjAzMjA5Li5lZjBhZWQyNWM2YjI2ZWZmNjFmOWY2 MDMwZGM1OTIxYTUzNGUzZDE5IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FhcmNoNjQvYWFy Y2g2NC5tZAorKysgYi9nY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC5tZApAQCAtNDk1MCw3 ICs0OTUwLDcgQEAgKGRlZmluZV9leHBhbmQgImZmczxtb2RlPjIiCiAgICAgcnR4IGNjcmVn ID0gYWFyY2g2NF9nZW5fY29tcGFyZV9yZWcgKEVRLCBvcGVyYW5kc1sxXSwgY29uc3QwX3J0 eCk7CiAgICAgcnR4IHggPSBnZW5fcnR4X05FIChWT0lEbW9kZSwgY2NyZWcsIGNvbnN0MF9y dHgpOwogCi0gICAgZW1pdF9pbnNuIChnZW5fcmJpdDxtb2RlPjIgKG9wZXJhbmRzWzBdLCBv cGVyYW5kc1sxXSkpOworICAgIGVtaXRfaW5zbiAoZ2VuX2FhcmNoNjRfcmJpdCAoPE1PREU+ bW9kZSwgb3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFdKSk7CiAgICAgZW1pdF9pbnNuIChnZW5f Y2x6PG1vZGU+MiAob3BlcmFuZHNbMF0sIG9wZXJhbmRzWzBdKSk7CiAgICAgZW1pdF9pbnNu IChnZW5fY3NpbmMzPG1vZGU+X2luc24gKG9wZXJhbmRzWzBdLCB4LCBvcGVyYW5kc1swXSwg Y29uc3QwX3J0eCkpOwogICAgIERPTkU7CkBAIC00OTk2LDcgKzQ5OTYsNyBAQCAoZGVmaW5l X2luc24gImNscnNiPG1vZGU+MiIKICAgWyhzZXRfYXR0ciAidHlwZSIgImNseiIpXQogKQog Ci0oZGVmaW5lX2luc24gInJiaXQ8bW9kZT4yIgorKGRlZmluZV9pbnNuICJAYWFyY2g2NF9y Yml0PG1vZGU+IgogICBbKHNldCAobWF0Y2hfb3BlcmFuZDpHUEkgMCAicmVnaXN0ZXJfb3Bl cmFuZCIgIj1yIikKIAkodW5zcGVjOkdQSSBbKG1hdGNoX29wZXJhbmQ6R1BJIDEgInJlZ2lz dGVyX29wZXJhbmQiICJyIildIFVOU1BFQ19SQklUKSldCiAgICIiCkBAIC01MDE3LDcgKzUw MTcsNyBAQCAoZGVmaW5lX2luc25fYW5kX3NwbGl0ICJjdHo8bW9kZT4yIgogICAicmVsb2Fk X2NvbXBsZXRlZCIKICAgWyhjb25zdF9pbnQgMCldCiAgICIKLSAgZW1pdF9pbnNuIChnZW5f cmJpdDxtb2RlPjIgKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSkpOworICBlbWl0X2luc24g KGdlbl9hYXJjaDY0X3JiaXQgKDxNT0RFPm1vZGUsIG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sx XSkpOwogICBlbWl0X2luc24gKGdlbl9jbHo8bW9kZT4yIChvcGVyYW5kc1swXSwgb3BlcmFu ZHNbMF0pKTsKICAgRE9ORTsKICIpCkBAIC02MDIyLDYgKzYwMjIsMTMgQEAgKGRlZmluZV9p bnNuICJic3dhcGhpMiIKICAgWyhzZXRfYXR0ciAidHlwZSIgInJldiIpXQogKQogCisoZGVm aW5lX2luc24gIkBhYXJjaDY0X3JldjE2PG1vZGU+IgorICBbKHNldCAobWF0Y2hfb3BlcmFu ZDpHUEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkodW5zcGVjOkdQSSBbKG1hdGNo X29wZXJhbmQ6R1BJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJyIildIFVOU1BFQ19SRVYpKV0K KyAgIiIKKyAgInJldjE2XFx0JTx3PjAsICU8dz4xIgorICBbKHNldF9hdHRyICJ0eXBlIiAi cmV2IildKQorCiAoZGVmaW5lX2luc24gIiphYXJjaDY0X2JmeGlsPG1vZGU+IgogICBbKHNl dCAobWF0Y2hfb3BlcmFuZDpHUEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yLHIiKQogICAg IChpb3I6R1BJIChhbmQ6R1BJIChtYXRjaF9vcGVyYW5kOkdQSSAxICJyZWdpc3Rlcl9vcGVy YW5kIiAiciwwIikKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hcm1fYWNsZS5o IGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FybV9hY2xlLmgKaW5kZXggOTc3NWE0OGM2NTgyNWI0 MjRkM2ViNDQyMzg0ZjVhYjg3YjczNGZkNy4uZmFkZGQ1ZDBhNzgwYzVkNjViYTQzMGJkMzE3 NGM3MDFlODQ4Yzc5NCAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FybV9hY2xl LmgKKysrIGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FybV9hY2xlLmgKQEAgLTI4LDYgKzI4LDcg QEAKICNkZWZpbmUgX0dDQ19BUk1fQUNMRV9ICiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNp bmNsdWRlIDxzdGRkZWYuaD4KIAogI3ByYWdtYSBHQ0MgYWFyY2g2NCAiYXJtX2FjbGUuaCIK IApAQCAtMzUsNiArMzYsNTQgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNkZWZpbmUg X0dDQ19BUk1fQUNMRV9ST1JfRk4oTkFNRSwgVFlQRSkJCQkgICAgICBcCitfX2V4dGVuc2lv bl9fIGV4dGVybiBfX2lubGluZSBUWVBFCQkJCSAgICAgIFwKK19fYXR0cmlidXRlX18gKChf X2Fsd2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkgICBc CitOQU1FIChUWVBFIHZhbHVlLCB1aW50MzJfdCByb3RhdGUpCQkJCSAgICAgIFwKK3sJCQkJ CQkJCSAgICAgIFwKKyAgc2l6ZV90IHNpemUgPSBzaXplb2YgKFRZUEUpICogX19DSEFSX0JJ VF9fOwkJCSAgICAgIFwKKyAgcm90YXRlID0gcm90YXRlICUgc2l6ZTsJCQkJCSAgICAgIFwK KyAgcmV0dXJuIHZhbHVlID4+IHJvdGF0ZSB8IHZhbHVlIDw8IChzaXplIC0gcm90YXRlKTsJ CSAgICAgIFwKK30KKworX0dDQ19BUk1fQUNMRV9ST1JfRk4gKF9fcm9yLCB1aW50MzJfdCkK K19HQ0NfQVJNX0FDTEVfUk9SX0ZOIChfX3JvcmwsIHVuc2lnbmVkIGxvbmcpCitfR0NDX0FS TV9BQ0xFX1JPUl9GTiAoX19yb3JsbCwgdWludDY0X3QpCisKKyNkZWZpbmUgX0dDQ19BUk1f QUNMRV9EQVRBX0ZOKE5BTUUsIEJVSUxUSU4sIFRZUEUpCQkgICAgXAorX19leHRlbnNpb25f XyBleHRlcm4gX19pbmxpbmUgVFlQRQkJCQkgICAgXAorX19hdHRyaWJ1dGVfXyAoKF9fYWx3 YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKSBcCitfXyMj TkFNRSAoVFlQRSB2YWx1ZSkJCQkJCQkgICAgXAorewkJCQkJCQkJICAgIFwKKyAgcmV0dXJu IF9fYnVpbHRpbl8jI0JVSUxUSU4gKHZhbHVlKTsJCQkJICAgIFwKK30KKworX0dDQ19BUk1f QUNMRV9EQVRBX0ZOIChjbHosIGNseiwgdWludDMyX3QpCitfR0NDX0FSTV9BQ0xFX0RBVEFf Rk4gKGNsemwsIGNsemwsIHVuc2lnbmVkIGxvbmcpCitfR0NDX0FSTV9BQ0xFX0RBVEFfRk4g KGNsemxsLCBjbHpsbCwgdWludDY0X3QpCitfR0NDX0FSTV9BQ0xFX0RBVEFfRk4gKGNscywg Y2xyc2IsIHVpbnQzMl90KQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChjbHNsLCBjbHJzYmws IHVuc2lnbmVkIGxvbmcpCitfR0NDX0FSTV9BQ0xFX0RBVEFfRk4gKGNsc2xsLCBjbHJzYmxs LCB1aW50NjRfdCkKK19HQ0NfQVJNX0FDTEVfREFUQV9GTiAocmV2MTYsIGFhcmNoNjRfcmV2 MTYsIHVpbnQzMl90KQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChyZXYxNmwsIGFhcmNoNjRf cmV2MTZsLCB1bnNpZ25lZCBsb25nKQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChyZXYxNmxs LCBhYXJjaDY0X3JldjE2bGwsIHVpbnQ2NF90KQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChy Yml0LCBhYXJjaDY0X3JiaXQsIHVpbnQzMl90KQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChy Yml0bCwgYWFyY2g2NF9yYml0bCwgdW5zaWduZWQgbG9uZykKK19HQ0NfQVJNX0FDTEVfREFU QV9GTiAocmJpdGxsLCBhYXJjaDY0X3JiaXRsbCwgdWludDY0X3QpCitfR0NDX0FSTV9BQ0xF X0RBVEFfRk4gKHJldnNoLCBic3dhcDE2LCBpbnQxNl90KQorX0dDQ19BUk1fQUNMRV9EQVRB X0ZOIChyZXYsIGJzd2FwMzIsIHVpbnQzMl90KQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChy ZXZsbCwgYnN3YXA2NCwgdWludDY0X3QpCisKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5s aW5lIHVuc2lnbmVkIGxvbmcKK19fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXywg X19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcmV2bCAodW5zaWduZWQgbG9u ZyBfX3ZhbHVlKQoreworICBpZiAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSA9PSA4KQorICAg IHJldHVybiBfX3JldmxsIChfX3ZhbHVlKTsKKyAgZWxzZQorICAgIHJldHVybiBfX3JldiAo X192YWx1ZSk7Cit9CisKICNwcmFnbWEgR0NDIHB1c2hfb3B0aW9ucwogI3ByYWdtYSBHQ0Mg dGFyZ2V0ICgiYXJjaD1hcm12OC4zLWEiKQogX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxp bmUgaW50MzJfdApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNo NjQvYWNsZS9kYXRhLWludHJpbnNpY3MuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h YXJjaDY0L2FjbGUvZGF0YS1pbnRyaW5zaWNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTA4MTMxODQ3 MDRkZmNkYWYyZDI0ZDUyM2ZmNzQ0YWE2Y2JlZGYxYQotLS0gL2Rldi9udWxsCisrKyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hYXJjaDY0L2FjbGUvZGF0YS1pbnRyaW5zaWNzLmMK QEAgLTAsMCArMSwyMTUgQEAKKy8qIFRlc3QgdGhlIEFDTEUgZGF0YSBpbnRyaW5zaWNzLiAg Ki8KKy8qIHsgZGctZG8gYXNzZW1ibGUgfSAqLworLyogeyBkZy1hZGRpdGlvbmFsLW9wdGlv bnMgIi0tc2F2ZS10ZW1wcyAtTzEiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBjaGVjay1mdW5j dGlvbi1ib2RpZXMgIioqIiAiIiAiIiB9IH0gKi8KKworI2luY2x1ZGUgImFybV9hY2xlLmgi CisKKy8qCisqKiB0ZXN0X2NsejoKKyoqCWNsegl3MCwgdzAKKyoqCXJldAorKi8KKwordWlu dDMyX3QgdGVzdF9jbHogKHVpbnQzMl90IGEpCit7CisgIHJldHVybiBfX2NseiAoYSk7Cit9 CisKKy8qCisqKiB0ZXN0X2Nsemw6CisqKgljbHoJW3d4XTAsIFt3eF0wCisqKglyZXQKKyov CisKK3Vuc2lnbmVkIGxvbmcgdGVzdF9jbHpsICh1bnNpZ25lZCBsb25nIGEpCit7CisgIHJl dHVybiBfX2NsemwgKGEpOworfQorCisvKgorKiogdGVzdF9jbHpsbDoKKyoqCWNsegl4MCwg eDAKKyoqCXJldAorKi8KKwordWludDY0X3QgdGVzdF9jbHpsbCAodWludDY0X3QgYSkKK3sK KyAgcmV0dXJuIF9fY2x6bGwgKGEpOworfQorCisvKgorKiogdGVzdF9jbHM6CisqKgljbHMJ dzAsIHcwCisqKglyZXQKKyovCisKK3VpbnQzMl90IHRlc3RfY2xzICh1aW50MzJfdCBhKQor eworICByZXR1cm4gX19jbHMgKGEpOworfQorCisvKgorKiogdGVzdF9jbHNsOgorKioJY2xz CVt3eF0wLCBbd3hdMAorKioJcmV0CisqLworCit1bnNpZ25lZCBsb25nIHRlc3RfY2xzbCAo dW5zaWduZWQgbG9uZyBhKQoreworICByZXR1cm4gX19jbHNsIChhKTsKK30KKworLyoKKyoq IHRlc3RfY2xzbGw6CisqKgljbHMJeDAsIHgwCisqKglyZXQKKyovCisKK3VpbnQ2NF90IHRl c3RfY2xzbGwgKHVpbnQ2NF90IGEpCit7CisgIHJldHVybiBfX2Nsc2xsIChhKTsKK30KKwor LyoKKyoqIHRlc3RfcmJpdDoKKyoqCXJiaXQJdzAsIHcwCisqKglyZXQKKyovCisKK3VpbnQz Ml90IHRlc3RfcmJpdCAodWludDMyX3QgYSkKK3sKKyAgcmV0dXJuIF9fcmJpdCAoYSk7Cit9 CisKKy8qCisqKiB0ZXN0X3JiaXRsOgorKioJcmJpdAlbd3hdMCwgW3d4XTAKKyoqCXJldAor Ki8KKwordW5zaWduZWQgbG9uZyB0ZXN0X3JiaXRsICh1bnNpZ25lZCBsb25nIGEpCit7Cisg IHJldHVybiBfX3JiaXRsIChhKTsKK30KKworLyoKKyoqIHRlc3RfcmJpdGxsOgorKioJcmJp dAl4MCwgeDAKKyoqCXJldAorKi8KKwordWludDY0X3QgdGVzdF9yYml0bGwgKHVpbnQ2NF90 IGEpCit7CisgIHJldHVybiBfX3JiaXRsbCAoYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JldjoK KyoqCXJldgl3MCwgdzAKKyoqCXJldAorKi8KKwordWludDMyX3QgdGVzdF9yZXYgKHVpbnQz Ml90IGEpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMiAoYSk7Cit9CisKKy8qCisq KiB0ZXN0X3Jldmw6CisqKglyZXYJW3d4XTAsIFt3eF0wCisqKglyZXQKKyovCisKK3Vuc2ln bmVkIGxvbmcgdGVzdF9yZXZsICh1bnNpZ25lZCBsb25nIGEpCit7CisgIHJldHVybiBfX3Jl dmwgKGEpOworfQorCisvKgorKiogdGVzdF9yZXZsbDoKKyoqCXJldgl4MCwgeDAKKyoqCXJl dAorKi8KKwordWludDY0X3QgdGVzdF9yZXZsbCAodWludDY0X3QgYSkKK3sKKyAgcmV0dXJu IF9fcmV2bGwgKGEpOworfQorCisvKgorKiogdGVzdF9yZXYxNjoKKyoqCXJldjE2CXcwLCB3 MAorKioJcmV0CisqLworCit1aW50MzJfdCB0ZXN0X3JldjE2ICh1aW50MzJfdCBhKQorewor ICByZXR1cm4gX19yZXYxNiAoYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JldjE2bDoKKyoqCXJl djE2CVt3eF0wLCBbd3hdMAorKioJcmV0CisqLworCit1bnNpZ25lZCBsb25nIHRlc3RfcmV2 MTZsICh1bnNpZ25lZCBsb25nIGEpCit7CisgIHJldHVybiBfX3JldjE2bCAoYSk7Cit9CisK Ky8qCisqKiB0ZXN0X3JldjE2bGw6CisqKglyZXYxNgl4MCwgeDAKKyoqCXJldAorKi8KKwor dWludDY0X3QgdGVzdF9yZXYxNmxsICh1aW50NjRfdCBhKQoreworICByZXR1cm4gX19yZXYx NmxsIChhKTsKK30KKworLyoKKyoqIHRlc3Rfcm9yOgorKioJcm9yCXcwLCB3MCwgdzEKKyoq CXJldAorKi8KKwordWludDMyX3QgdGVzdF9yb3IgKHVpbnQzMl90IGEsIHVpbnQzMl90IHIp Cit7CisgIHJldHVybiBfX3JvciAoYSwgcik7Cit9CisKKy8qCisqKiB0ZXN0X3Jvcmw6Cisq Kglyb3IJW3d4XTAsIFt3eF0wLCBbd3hdMQorKioJcmV0CisqLworCit1bnNpZ25lZCBsb25n IHRlc3Rfcm9ybCAodW5zaWduZWQgbG9uZyBhLCB1aW50MzJfdCByKQoreworICByZXR1cm4g X19yb3JsIChhLCByKTsKK30KKworLyoKKyoqIHRlc3Rfcm9ybGw6CisqKglyb3IJeDAsIHgw LCB4MQorKioJcmV0CisqLworCit1aW50NjRfdCB0ZXN0X3JvcmxsICh1aW50NjRfdCBhLCB1 aW50MzJfdCByKQoreworICByZXR1cm4gX19yb3JsbCAoYSwgcik7Cit9CisKKy8qCisqKiB0 ZXN0X3JldnNoOgorKioJcmV2MTYJdzAsIHcwCisqKglyZXQKKyovCisKK2ludDE2X3QgdGVz dF9yZXZzaCAoaW50MTZfdCBhKQoreworICByZXR1cm4gX19yZXZzaCAoYSk7Cit9Cg== --------------QfFZh09BlIIZNeUGiwOmRXxn--