From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17037 invoked by alias); 10 Jul 2019 19:11:04 -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 16820 invoked by uid 89); 10 Jul 2019 19:11:04 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HK_RANDOM_ENVFROM,HK_RANDOM_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=no version=3.3.1 spammy=incorporated X-HELO: mail-wm1-f68.google.com Received: from mail-wm1-f68.google.com (HELO mail-wm1-f68.google.com) (209.85.128.68) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 10 Jul 2019 19:11:03 +0000 Received: by mail-wm1-f68.google.com with SMTP id w9so5309422wmd.1 for ; Wed, 10 Jul 2019 12:11:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=CyxgOXpqzPikStdOxKOlYujJD4CKohLSwBax+V+jtbk=; b=ZIvuIPqstiKEw8a1SshUkCz7tQnP7ccqtWX77BccUqAjIO3EQW5z5Og4jN69pIuI+T cGIC5bZmq2nTzT/fJzNgrcIJWGq5ntlPMuidJ1BPNsTONsexioOpsNT7cIKwnWDo0UAC oHatBE6IroCwKqxX4Z6FVOmV49cClq86K+r4mPlaSa8qiGKBEmSlCxv50BDE/AgWLSMR ossiOF3yK+DQ81061yaqAQ31zw9c/APp605bB5D72wESbaYUe9ipOpRyPd6jmWI7A7Cb SoYDdngRU3JrsagvnPfD4y/X4Brq74T6FqKH7WvxDnxuib5j3P7LUGEbxfbM7Mkqx43l JT7A== MIME-Version: 1.0 References: In-Reply-To: From: Sunil Pandey Date: Wed, 10 Jul 2019 19:20:00 -0000 Message-ID: Subject: Re: [PATCH] i386: Add AVX512 unaligned intrinsics To: Uros Bizjak Cc: "gcc-patches@gcc.gnu.org" , "H. J. Lu" Content-Type: multipart/mixed; boundary="000000000000177f77058d5870ee" X-SW-Source: 2019-07/txt/msg00828.txt.bz2 --000000000000177f77058d5870ee Content-Type: text/plain; charset="UTF-8" Content-length: 3123 Thanks Uros. I incorporated suggested changes in attached patch. --Sunil Pandey i386: Add AVX512 unaligned intrinsics __m512i _mm512_loadu_epi32( void * sa); __m512i _mm512_loadu_epi64( void * sa); void _mm512_storeu_epi32(void * d, __m512i a); void _mm256_storeu_epi32(void * d, __m256i a); void _mm_storeu_epi32(void * d, __m128i a); void _mm512_storeu_epi64(void * d, __m512i a); void _mm256_storeu_epi64(void * d, __m256i a); void _mm_storeu_epi64(void * d, __m128i a); Tested on x86-64. gcc/ PR target/90980 * config/i386/avx512fintrin.h (_mm512_loadu_epi32): New. (_mm512_loadu_epi64): Likewise. (_mm512_storeu_epi32): Likewise. (_mm512_storeu_epi64): Likewise. * config/i386/avx512vlintrin.h (_mm_storeu_epi32): New. (_mm256_storeu_epi32): Likewise. (_mm_storeu_epi64): Likewise. (_mm256_storeu_epi64): Likewise. gcc/testsuite/ PR target/90980 * gcc.target/i386/pr90980-1.c: New test. * gcc.target/i386/pr90980-2.c: Likewise. * gcc.target/i386/pr90980-3.c: Likewise. On Tue, Jul 9, 2019 at 11:39 PM Uros Bizjak wrote: > > On Tue, Jul 9, 2019 at 11:44 PM Sunil Pandey wrote: > > > > __m512i _mm512_loadu_epi32( void * sa); > > __m512i _mm512_loadu_epi64( void * sa); > > void _mm512_storeu_epi32(void * d, __m512i a); > > void _mm256_storeu_epi32(void * d, __m256i a); > > void _mm_storeu_epi32(void * d, __m128i a); > > void _mm512_storeu_epi64(void * d, __m512i a); > > void _mm256_storeu_epi64(void * d, __m256i a); > > void _mm_storeu_epi64(void * d, __m128i a); > > > > Tested on x86-64. > > > > OK for trunk? > > > > --Sunil Pandey > > > > > > gcc/ > > > > PR target/90980 > > * config/i386/avx512fintrin.h (__v16si_u): New data type > > (__v8di_u): Likewise > > (_mm512_loadu_epi32): New. > > (_mm512_loadu_epi64): Likewise. > > (_mm512_storeu_epi32): Likewise. > > (_mm512_storeu_epi64): Likewise. > > * config/i386/avx512vlintrin.h (_mm_storeu_epi32): New. > > (_mm256_storeu_epi32): Likewise. > > (_mm_storeu_epi64): Likewise. > > (_mm256_storeu_epi64): Likewise. > > > > gcc/testsuite/ > > > > PR target/90980 > > * gcc.target/i386/avx512f-vmovdqu32-3.c: New test. > > * gcc.target/i386/avx512f-vmovdqu64-3.c: Likewise. > > * gcc.target/i386/pr90980-1.c: Likewise. > > * gcc.target/i386/pr90980-2.c: Likewise. > > +/* Internal data types for implementing unaligned version of intrinsics. */ > +typedef int __v16si_u __attribute__ ((__vector_size__ (64), > + __aligned__ (1))); > +typedef long long __v8di_u __attribute__ ((__vector_size__ (64), > + __aligned__ (1))); > > You should define only one generic __m512i_u type, something like: > > typedef long long __m512i_u __attribute__ ((__vector_size__ (64), > __may_alias__, __aligned__ (1))); > > Please see avxintrin.h how __m256i_u is defined and used. > > Uros. --000000000000177f77058d5870ee Content-Type: application/octet-stream; name="0001-i386-Add-AVX512-unaligned-intrinsics.patch" Content-Disposition: attachment; filename="0001-i386-Add-AVX512-unaligned-intrinsics.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jxxl3jr10 Content-length: 8309 RnJvbSA3YTBhNGJiN2M0ZDQxMTVhY2Y1NTkwOTRhNzMxN2Q4YjNjMGNlZDA2 IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBTdW5pbCBLIFBhbmRl eSA8c2twZ2twMUBnbWFpbC5jb20+CkRhdGU6IE1vbiwgOCBKdWwgMjAxOSAx MjozNjowMiAtMDcwMApTdWJqZWN0OiBbUEFUQ0hdIGkzODY6IEFkZCBBVlg1 MTIgdW5hbGlnbmVkIGludHJpbnNpY3MKCl9fbTUxMmkgX21tNTEyX2xvYWR1 X2VwaTMyKCB2b2lkICogc2EpOwpfX201MTJpIF9tbTUxMl9sb2FkdV9lcGk2 NCggdm9pZCAqIHNhKTsKdm9pZCBfbW01MTJfc3RvcmV1X2VwaTMyKHZvaWQg KiBkLCBfX201MTJpIGEpOwp2b2lkIF9tbTI1Nl9zdG9yZXVfZXBpMzIodm9p ZCAqIGQsIF9fbTI1NmkgYSk7CnZvaWQgX21tX3N0b3JldV9lcGkzMih2b2lk ICogZCwgX19tMTI4aSBhKTsKdm9pZCBfbW01MTJfc3RvcmV1X2VwaTY0KHZv aWQgKiBkLCBfX201MTJpIGEpOwp2b2lkIF9tbTI1Nl9zdG9yZXVfZXBpNjQo dm9pZCAqIGQsIF9fbTI1NmkgYSk7CnZvaWQgX21tX3N0b3JldV9lcGk2NCh2 b2lkICogZCwgX19tMTI4aSBhKTsKClRlc3RlZCBvbiB4ODYtNjQuCgpnY2Mv CgogICAgICAgIFBSIHRhcmdldC85MDk4MAogICAgICAgICogY29uZmlnL2kz ODYvYXZ4NTEyZmludHJpbi5oIChfbW01MTJfbG9hZHVfZXBpMzIpOiBOZXcu CiAgICAgICAgKF9tbTUxMl9sb2FkdV9lcGk2NCk6IExpa2V3aXNlLgogICAg ICAgIChfbW01MTJfc3RvcmV1X2VwaTMyKTogTGlrZXdpc2UuCiAgICAgICAg KF9tbTUxMl9zdG9yZXVfZXBpNjQpOiBMaWtld2lzZS4KICAgICAgICAqIGNv bmZpZy9pMzg2L2F2eDUxMnZsaW50cmluLmggKF9tbV9zdG9yZXVfZXBpMzIp OiBOZXcuCiAgICAgICAgKF9tbTI1Nl9zdG9yZXVfZXBpMzIpOiBMaWtld2lz ZS4KICAgICAgICAoX21tX3N0b3JldV9lcGk2NCk6IExpa2V3aXNlLgogICAg ICAgIChfbW0yNTZfc3RvcmV1X2VwaTY0KTogTGlrZXdpc2UuCgpnY2MvdGVz dHN1aXRlLwoKICAgICAgICBQUiB0YXJnZXQvOTA5ODAKICAgICAgICAqIGdj Yy50YXJnZXQvaTM4Ni9wcjkwOTgwLTEuYzogTmV3IHRlc3QuCiAgICAgICAg KiBnY2MudGFyZ2V0L2kzODYvcHI5MDk4MC0yLmM6IExpa2V3aXNlLgogICAg ICAgICogZ2NjLnRhcmdldC9pMzg2L3ByOTA5ODAtMy5jOiBMaWtld2lzZS4K LS0tCiBnY2MvY29uZmlnL2kzODYvYXZ4NTEyZmludHJpbi5oICAgICAgICAg ICB8IDI4ICsrKysrKysrKysrKysrKysrKysrKysrCiBnY2MvY29uZmlnL2kz ODYvYXZ4NTEydmxpbnRyaW4uaCAgICAgICAgICB8IDI4ICsrKysrKysrKysr KysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjkwOTgwLTEuYyB8IDE3ICsrKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjkwOTgwLTIuYyB8IDE3ICsrKysrKysrKysr KysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjkwOTgwLTMu YyB8IDIwICsrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMTEw IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjkwOTgwLTEuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByOTA5ODAt Mi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvcHI5MDk4MC0zLmMKCmRpZmYgLS1naXQgYS9nY2MvY29uZmln L2kzODYvYXZ4NTEyZmludHJpbi5oIGIvZ2NjL2NvbmZpZy9pMzg2L2F2eDUx MmZpbnRyaW4uaAppbmRleCBlMzVlZWRiOTI2OC4uNzFhN2RjNWEwMGMgMTAw NjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9hdng1MTJmaW50cmluLmgKKysr IGIvZ2NjL2NvbmZpZy9pMzg2L2F2eDUxMmZpbnRyaW4uaApAQCAtNDA1LDYg KzQwNSwzNCBAQCBfbW01MTJfbWFza3pfbG9hZF9wZCAoX19tbWFzazggX19V LCB2b2lkIGNvbnN0ICpfX1ApCiAJCQkJCQkgICAoX19tbWFzazgpIF9fVSk7 CiB9CiAKK2V4dGVybiBfX2lubGluZSBfX201MTJpCitfX2F0dHJpYnV0ZV9f ICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlm aWNpYWxfXykpCitfbW01MTJfbG9hZHVfZXBpMzIgKHZvaWQgY29uc3QgKl9f UCkKK3sKKyAgcmV0dXJuICooX19tNTEyaV91ICopIF9fUDsKK30KKworZXh0 ZXJuIF9faW5saW5lIF9fbTUxMmkKK19fYXR0cmlidXRlX18gKChfX2dudV9p bmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkK K19tbTUxMl9sb2FkdV9lcGk2NCAodm9pZCBjb25zdCAqX19QKQoreworICBy ZXR1cm4gKihfX201MTJpX3UgKikgX19QOworfQorCitleHRlcm4gX19pbmxp bmUgdm9pZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fs d2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tNTEyX3N0b3Jl dV9lcGkzMiAodm9pZCAqX19QLCBfX201MTJpIF9fQSkKK3sKKyAgKihfX201 MTJpX3UgKikgX19QID0gKF9fbTUxMmlfdSkgX19BOworfQorCitleHRlcm4g X19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9f LCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tNTEy X3N0b3JldV9lcGk2NCAodm9pZCAqX19QLCBfX201MTJpIF9fQSkKK3sKKyAg KihfX201MTJpX3UgKikgX19QID0gKF9fbTUxMmlfdSkgX19BOworfQorCiBl eHRlcm4gX19pbmxpbmUgdm9pZAogX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lu bGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQog X21tNTEyX3N0b3JlX3BkICh2b2lkICpfX1AsIF9fbTUxMmQgX19BKQpkaWZm IC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2F2eDUxMnZsaW50cmluLmggYi9n Y2MvY29uZmlnL2kzODYvYXZ4NTEydmxpbnRyaW4uaAppbmRleCAzZWFmODE3 Zjg5OC4uMDZiY2M1MGI2YjQgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4 Ni9hdng1MTJ2bGludHJpbi5oCisrKyBiL2djYy9jb25maWcvaTM4Ni9hdng1 MTJ2bGludHJpbi5oCkBAIC01OTgsNiArNTk4LDM0IEBAIF9tbTI1Nl9zdG9y ZV9lcGk2NCAodm9pZCAqX19QLCBfX20yNTZpIF9fQSkKICAgKihfX20yNTZp ICopIF9fUCA9IF9fQTsKIH0KIAorZXh0ZXJuIF9faW5saW5lIHZvaWQKK19f YXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5l X18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXVfZXBpMzIgKHZvaWQg Kl9fUCwgX19tMTI4aSBfX0EpCit7CisgICooX19tMTI4aV91ICopIF9fUCA9 IChfX20xMjhpX3UpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQK K19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5s aW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZXVfZXBpMzIg KHZvaWQgKl9fUCwgX19tMjU2aSBfX0EpCit7CisgICooX19tMjU2aV91ICop IF9fUCA9IChfX20yNTZpX3UpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5l IHZvaWQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdh eXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXVfZXBp NjQgKHZvaWQgKl9fUCwgX19tMTI4aSBfX0EpCit7CisgICooX19tMTI4aV91 ICopIF9fUCA9IChfX20xMjhpX3UpIF9fQTsKK30KKworZXh0ZXJuIF9faW5s aW5lIHZvaWQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19h bHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9y ZXVfZXBpNjQgKHZvaWQgKl9fUCwgX19tMjU2aSBfX0EpCit7CisgICooX19t MjU2aV91ICopIF9fUCA9IChfX20yNTZpX3UpIF9fQTsKK30KKwogZXh0ZXJu IF9faW5saW5lIHZvaWQKIF9fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVf XywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKIF9tbV9z dG9yZV9lcGk2NCAodm9pZCAqX19QLCBfX20xMjhpIF9fQSkKZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByOTA5ODAtMS5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI5MDk4MC0xLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjcyYTMw ZGM4ZGEyCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI5MDk4MC0xLmMKQEAgLTAsMCArMSwxNyBAQAorLyog eyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLW1hcmNo PXNreWxha2UtYXZ4NTEyIC1PMiIgfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLXRpbWVzICIoPzp2bW92dXBzfHZtb3ZkcXUpXFsgXFx0 XF0rXFteXHtcblxdKiV4bW1cWzAtOVxdK1xbXlxuXF0qXFwpKD86XG58XFsg XFx0XF0rIykiIDIgfSB9ICovCisKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4K KworaW50ICphOworbG9uZyBsb25nICpiOwordm9sYXRpbGUgX19tMTI4aSB4 eDsKK3ZvbGF0aWxlIF9fbTEyOGkgeHgxOworCit2b2lkIGV4dGVybgorYXZ4 NTEydmxfdGVzdCAodm9pZCkKK3sKKyAgX21tX3N0b3JldV9lcGkzMiAoYSwg eHgpOworICBfbW1fc3RvcmV1X2VwaTY0IChiLCB4eDEpOworfQpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI5MDk4MC0y LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjkwOTgwLTIu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYjE5 ODBlNjUxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjkwOTgwLTIuYwpAQCAtMCwwICsxLDE3IEBACisv KiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItbWFy Y2g9c2t5bGFrZS1hdng1MTIgLU8yIiB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItdGltZXMgInZtb3ZkcXVcWzAtOVxdKlxbIFxcdFxd K1xbXlx7XG5cXSoleW1tXFswLTlcXStcW15cblxdKlxcKSg/OlxufFxbIFxc dFxdKyMpIiAyIH0gfSAqLworCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisK K2ludCAqYTsKK2xvbmcgbG9uZyAqYjsKK3ZvbGF0aWxlIF9fbTI1NmkgeXk7 Cit2b2xhdGlsZSBfX20yNTZpIHl5MTsKKwordm9pZCBleHRlcm4KK2F2eDUx MnZsX3Rlc3QgKHZvaWQpCit7CisgIF9tbTI1Nl9zdG9yZXVfZXBpMzIgKGEs IHl5KTsKKyAgX21tMjU2X3N0b3JldV9lcGk2NCAoYiwgeXkxKTsKK30KZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByOTA5 ODAtMy5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI5MDk4 MC0zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu LmQ4MzllZTAxMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvcHI5MDk4MC0zLmMKQEAgLTAsMCArMSwyMCBA QAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LW1hcmNoPXNreWxha2UtYXZ4NTEyIC1PMiIgfSAqLworLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2bW92ZHF1NjRcWyBcXHRcXStc W15ce1xuXF0qXFwpXFteXG5cXSolem1tXFswLTlcXSsoPzpcbnxcWyBcXHRc XSsjKSIgMiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci10aW1lcyAidm1vdmRxdTY0XFsgXFx0XF0rXFteXHtcblxdKiV6bW1cWzAt OVxdK1xbXlxuXF0qXFwpKD86XG58XFsgXFx0XF0rIykiIDIgfSB9ICovCisK KyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKworaW50ICphOworbG9uZyBsb25n ICpiOwordm9sYXRpbGUgX19tNTEyaSB6ejsKK3ZvbGF0aWxlIF9fbTUxMmkg enoxOworCit2b2lkIGV4dGVybgorYXZ4NTEyZl90ZXN0ICh2b2lkKQorewor ICB6eiA9IF9tbTUxMl9sb2FkdV9lcGkzMiAoYSk7CisgIF9tbTUxMl9zdG9y ZXVfZXBpMzIgKGEsIHp6KTsKKyAgenoxID0gX21tNTEyX2xvYWR1X2VwaTY0 IChiKTsKKyAgX21tNTEyX3N0b3JldV9lcGk2NCAoYiwgenoxKTsKK30KLS0g CjIuMjAuMQoK --000000000000177f77058d5870ee--