From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by sourceware.org (Postfix) with ESMTPS id C733B3858C5F for ; Tue, 15 Aug 2023 08:12:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C733B3858C5F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-26b67b38b61so776820a91.0 for ; Tue, 15 Aug 2023 01:12:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1692087178; x=1692691978; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=QULv0rbU6Mlk+4g5RRkM9dGVEtkR25fJbq1YzfXyBHQ=; b=ZzqbcZgYGELRaUHae9jFG+9KI0Y/7RZ4qH7hqZhqRPCHHeoARR8YdpGGy6NHCgDQmX 9i+c2OS/kVyHlh7AWNed8uDzAyYaN+4m+HM06M6z/G1IAnjH6aAVGZXmKVCpvc63+Cm5 r6e928Mwz31WFEVvX+HTp6lN1oRVyTMDyEByxOcWV5FYKWIQGU0giFc39eERxKd84bCF MiXdQmzIZWVhXKZ1YezmbdotJSwnwkvGdPEsoFVpATUzdItV0Vf1cnq/nt5sOFOEaWjo Lu5GY0rHxst1Ck8KUnz35rZojUGHmZK/mZzkChJi9FfuFVCPpxR4qSjdtM2FH6YK/8vq vXmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692087178; x=1692691978; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=QULv0rbU6Mlk+4g5RRkM9dGVEtkR25fJbq1YzfXyBHQ=; b=co/93sjgW+djaLP1eeWCwRHiAJUHVcsQ2hGkTgcrGO1kqd/LWSUZQ8rnjNDD2jnVOR BR0xhDAScMzKSXdkCKQ5gyrck0oxnqZ/AVfCVFC8cSJmN427Cw0D6X/GQfovlTvhBoxL xu2F2Iqp/eDvVmKtr3Q26mbD5IdKkGBq2qGy06pMYYiPjMvQUfW8Z9inhEH7EYCfqUOv Gitp85szBsS5sgfGf34oI4tD5e7yZ628Pk2gAD2XxyNyq/qIcugZW8zyTnbU3LKSb87m vIQc9wMm5rKJEzQx4BQy9uRBRqqUFefm3w+qeygmTm5o8jvAyxLq7WMCAqCR+EjUYcsL ahzA== X-Gm-Message-State: AOJu0YxIRqNo+AW601dZQIL+hRynCVnyq9HUVYB7tBByYbWIqLUZoLiu Q4QI+nrDWuC+eg1MwQifdsDcNJrX5SyEhvbg3QeDBQ== X-Google-Smtp-Source: AGHT+IFXWGUB4rFKyMsqw2xFkTCnA7QsUuclYGyB04j2OE2B9n23njba2IvH5bU9B0I8vngJyYqOb2Y7bGr0FZ1gaf4= X-Received: by 2002:a17:90b:2310:b0:269:38c2:dbd8 with SMTP id mt16-20020a17090b231000b0026938c2dbd8mr8514804pjb.25.1692087177769; Tue, 15 Aug 2023 01:12:57 -0700 (PDT) MIME-Version: 1.0 References: <1525C65921357A3C+2023080507101006323211@rivai.ai> <5814e96a-9d86-d428-cf48-ec1ab80eb2d9@gmail.com> <960B8F718A41FF46+2023080507344044042924@rivai.ai> In-Reply-To: <960B8F718A41FF46+2023080507344044042924@rivai.ai> From: Joern Rennecke Date: Tue, 15 Aug 2023 09:12:46 +0100 Message-ID: Subject: Re: Re: cpymem for RISCV with v extension To: =?UTF-8?B?6ZKf5bGF5ZOy?= Cc: Jeff Law , gcc-patches , "kito.cheng" , "kito.cheng" , "rdapp.gcc" Content-Type: multipart/mixed; boundary="000000000000292a470602f1bf69" X-Spam-Status: No, score=-8.4 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000292a470602f1bf69 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, 5 Aug 2023 at 00:35, =E9=92=9F=E5=B1=85=E5=93=B2 wrote: > > >> Testing what specifically? Are you asking for correctness tests, > >> performance/code quality tests? > > Add memcpy test using RVV instructions, just like we are adding testcases= for auto-vectorization support. I wanted to get in the test infrastructure first. > void foo (int32_t * a, int32_t * b, int num) > { > memcpy (a, b, num); > } > > > In my downstream LLVM/GCC codegen: > foo: > .L2: > vsetvli a5,a2,e8,m8,ta,ma > vle8.v v24,(a1) > sub a2,a2,a5 > vse8.v v24,(a0) > add a1,a1,a5 > add a0,a0,a5 > bne a2,zero,.L2 > ret Yeah, it does that. > > Another example: > void foo (int32_t * a, int32_t * b, int num) > { > memcpy (a, b, 4); > } > > > My downstream LLVM/GCC assembly: > > foo: > vsetvli zero,16,e8,m1,ta,ma > vle8.v v24,(a1) > vse8.v v24,(a0) > ret copying 16 bytes when asked to copy 4 is problematic. Mine copies 4. Note also for: typedef struct { int a[31]; } s; void foo (s *a, s *b) { *a =3D *b; } You get: vsetivli zero,31,e32,m8,ta,ma vle32.v v8,0(a1) vse32.v v8,0(a0) Using memcpy, the compiler unfortunately discards the alignment. > emit_insn (gen_pred_store...) Thanks to pointing me in the right direction. From the naming of the patterns, the dearth of comments, and the default behaviour of the compiler when optimizing with generic optimization options (i.e. no vectorization) I had assumed that the infrastructure was still missing. I have attached a re-worked patch that uses pred_mov / pred_store and as adapted to the refactored modes. It lacks the strength reduction of the opaque pattern version for -O3, though. Would people also like to see that expanded into RTL? Or should I just drop in the opaque pattern for that? Or not at all, because everyone uses Superscalar Out-Of-Order execution? --000000000000292a470602f1bf69 Content-Type: text/plain; charset="US-ASCII"; name="cpymem-20230815.txt" Content-Disposition: attachment; filename="cpymem-20230815.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_llc0y85m0 Y29tbWl0IDFmNGI3YThlNjc5OGFjYWIxZjc5ZGUzOGU4NWQ5ZDA4MGE3NmViNGEKQXV0aG9yOiBK b2VybiBSZW5uZWNrZSA8am9lcm4ucmVubmVja2VAZW1iZWNvc20uY29tPgpEYXRlOiAgIFR1ZSBB dWcgMTUgMDg6MTg6NTMgMjAyMyArMDEwMAoKICAgIGNweW1lbSB1c2luZyBwcmVkX21vdiAvIHBy ZWRfc3RvcmUgYW5kIGFkYXB0ZWQgdG8gbW9kZSByZWZhY3RvcmluZy4KICAgIAogICAgMjAyMy0w Ny0xMiAgSnUtWmhlIFpob25nIDxqdXpoZS56aG9uZ0ByaXZhaS5haT4KICAgICAgICAgICAgICAg IEpvZXJuIFJlbm5lY2tlICA8am9lcm4ucmVubmVja2VAZW1iZWNvc20uY29tPgogICAgCiAgICBn Y2MvCiAgICAgICAgICAgICogY29uZmlnL3Jpc2N2L3Jpc2N2LXByb3Rvcy5oIChyaXNjdl92ZWN0 b3I6OmV4cGFuZF9ibG9ja19tb3ZlKToKICAgICAgICAgICAgRGVjbGFyZS4KICAgICAgICAgICAg KiBjb25maWcvcmlzY3YvcmlzY3Ytdi5jYyAocmlzY3ZfdmVjdG9yOjpleHBhbmRfYmxvY2tfbW92 ZSk6CiAgICAgICAgICAgIE5ldyBmdW5jdGlvbi4KICAgICAgICAgICAgKiBjb25maWcvcmlzY3Yv cmlzY3YubWQgKGNweW1lbXNpKTogVXNlIHJpc2N2X3ZlY3Rvcjo6ZXhwYW5kX2Jsb2NrX21vdmUu CiAgICAgICAgICAgIENoYW5nZSB0byAuLgogICAgICAgICAgICAoY3B5bWVtPFA6bW9kZT4pIC4u IHRoaXMuCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9yaXNjdi9yaXNjdi1wcm90b3MuaCBiL2dj Yy9jb25maWcvcmlzY3YvcmlzY3YtcHJvdG9zLmgKaW5kZXggMmZiZWQwNGZmODQuLjcwZmZkY2Rm MTgwIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL3Jpc2N2L3Jpc2N2LXByb3Rvcy5oCisrKyBiL2dj Yy9jb25maWcvcmlzY3YvcmlzY3YtcHJvdG9zLmgKQEAgLTMxNSw2ICszMTUsNyBAQCBib29sIHNs aWRlMV9zZXc2NF9oZWxwZXIgKGludCwgbWFjaGluZV9tb2RlLCBtYWNoaW5lX21vZGUsCiAJCQkg IG1hY2hpbmVfbW9kZSwgcnR4ICopOwogcnR4IGdlbl9hdmxfZm9yX3NjYWxhcl9tb3ZlIChydHgp Owogdm9pZCBleHBhbmRfdHVwbGVfbW92ZSAocnR4ICopOworYm9vbCBleHBhbmRfYmxvY2tfbW92 ZSAocnR4LCBydHgsIHJ0eCk7CiBtYWNoaW5lX21vZGUgcHJlZmVycmVkX3NpbWRfbW9kZSAoc2Nh bGFyX21vZGUpOwogbWFjaGluZV9tb2RlIGdldF9tYXNrX21vZGUgKG1hY2hpbmVfbW9kZSk7CiB2 b2lkIGV4cGFuZF92ZWNfc2VyaWVzIChydHgsIHJ0eCwgcnR4KTsKZGlmZiAtLWdpdCBhL2djYy9j b25maWcvcmlzY3YvcmlzY3Ytdi5jYyBiL2djYy9jb25maWcvcmlzY3YvcmlzY3Ytdi5jYwppbmRl eCA1ZjliMjk2YzkyZS4uZWE5NmEwZWY4NGQgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvcmlzY3Yv cmlzY3Ytdi5jYworKysgYi9nY2MvY29uZmlnL3Jpc2N2L3Jpc2N2LXYuY2MKQEAgLTQ5LDYgKzQ5 LDcgQEAKICNpbmNsdWRlICJ0bS1jb25zdHJzLmgiCiAjaW5jbHVkZSAicnR4LXZlY3Rvci1idWls ZGVyLmgiCiAjaW5jbHVkZSAidGFyZ2hvb2tzLmgiCisjaW5jbHVkZSAicHJlZGljdC5oIgogCiB1 c2luZyBuYW1lc3BhY2UgcmlzY3ZfdmVjdG9yOwogCkBAIC0yMzc5LDYgKzIzODAsMTkyIEBAIGV4 cGFuZF90dXBsZV9tb3ZlIChydHggKm9wcykKICAgICB9CiB9CiAKKy8qIFVzZWQgYnkgY3B5bWVt c2kgaW4gcmlzY3YubWQgLiAgKi8KKworYm9vbAorZXhwYW5kX2Jsb2NrX21vdmUgKHJ0eCBkc3Rf aW4sIHJ0eCBzcmNfaW4sIHJ0eCBsZW5ndGhfaW4pCit7CisgIC8qCisgICAgbWVtY3B5OgorCW12 IGEzLCBhMCAgICAgICAgICAgICAgICAgICAgICAgIyBDb3B5IGRlc3RpbmF0aW9uCisgICAgbG9v cDoKKwl2c2V0dmxpIHQwLCBhMiwgZTgsIG04LCB0YSwgbWEgICMgVmVjdG9ycyBvZiA4YgorCXZs ZTgudiB2MCwgKGExKSAgICAgICAgICAgICAgICAgIyBMb2FkIGJ5dGVzCisJYWRkIGExLCBhMSwg dDAgICAgICAgICAgICAgICAgICAjIEJ1bXAgcG9pbnRlcgorCXN1YiBhMiwgYTIsIHQwICAgICAg ICAgICAgICAgICAgIyBEZWNyZW1lbnQgY291bnQKKwl2c2U4LnYgdjAsIChhMykgICAgICAgICAg ICAgICAgICMgU3RvcmUgYnl0ZXMKKwlhZGQgYTMsIGEzLCB0MCAgICAgICAgICAgICAgICAgICMg QnVtcCBwb2ludGVyCisJYm5leiBhMiwgbG9vcCAgICAgICAgICAgICAgICAgICAjIEFueSBtb3Jl PworCXJldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXR1cm4KKyAgKi8KKyAgaWYg KCFUQVJHRVRfVkVDVE9SKQorICAgIHJldHVybiBmYWxzZTsKKyAgSE9TVF9XSURFX0lOVCBwb3Rl bnRpYWxfZXcKKyAgICA9IChNSU4gKE1JTiAoTUVNX0FMSUdOIChzcmNfaW4pLCBNRU1fQUxJR04g KGRzdF9pbikpLCBCSVRTX1BFUl9XT1JEKQorICAgICAgIC8gQklUU19QRVJfVU5JVCk7CisgIG1h Y2hpbmVfbW9kZSB2bW9kZSA9IFZPSURtb2RlOworICBib29sIG5lZWRfbG9vcCA9IHRydWU7Cisg IGJvb2wgc2l6ZV9wID0gb3B0aW1pemVfZnVuY3Rpb25fZm9yX3NpemVfcCAoY2Z1bik7CisgIHJ0 eCBzcmMsIGRzdDsKKyAgcnR4IGVuZCA9IGdlbl9yZWdfcnR4IChQbW9kZSk7CisgIHJ0eCB2ZWM7 CisgIHJ0eCBsZW5ndGhfcnR4ID0gbGVuZ3RoX2luOworCisgIGlmIChDT05TVF9JTlRfUCAobGVu Z3RoX2luKSkKKyAgICB7CisgICAgICBIT1NUX1dJREVfSU5UIGxlbmd0aCA9IElOVFZBTCAobGVu Z3RoX2luKTsKKworICAgIC8qIEJ5IHVzaW5nIExNVUw9OCwgd2UgY2FuIGNvcHkgYXMgbWFueSBi eXRlcyBpbiBvbmUgZ28gYXMgdGhlcmUKKyAgICAgICBhcmUgYml0cyBpbiBhIHZlY3RvciByZWdp c3Rlci4gIElmIHRoZSBlbnRpcmUgYmxvY2sgdGh1cyBmaXRzLAorICAgICAgIHdlIGRvbid0IG5l ZWQgYSBsb29wLiAgKi8KKyAgICBpZiAobGVuZ3RoIDw9IFRBUkdFVF9NSU5fVkxFTikKKyAgICAg IHsKKwluZWVkX2xvb3AgPSBmYWxzZTsKKworCS8qIElmIGEgc2luZ2xlIHNjYWxhciBsb2FkIC8g c3RvcmUgcGFpciBjYW4gZG8gdGhlIGpvYiwgbGVhdmUgaXQKKwkgICB0byB0aGUgc2NhbGFyIGNv ZGUgdG8gZG8gdGhhdC4gICovCisKKwlpZiAocG93MnBfaHdpIChsZW5ndGgpICYmIGxlbmd0aCA8 PSBwb3RlbnRpYWxfZXcpCisJICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8qIEZp bmQgdGhlIHZlY3RvciBtb2RlIHRvIHVzZS4gIFVzaW5nIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGVs ZW1lbnQKKwkgc2l6ZSBpcyBsaWtlbHkgdG8gZ2l2ZSBzbWFsbGVyIGNvbnN0YW50cywgYW5kIHRo dXMgcG90ZW50aWFsbHkKKwkgcmVkdWNpbmcgY29kZSBzaXplLiAgSG93ZXZlciwgaWYgd2UgbmVl ZCBhIGxvb3AsIHdlIG5lZWQgdG8gdXBkYXRlCisJIHRoZSBwb2ludGVycywgYW5kIHRoYXQgaXMg bW9yZSBjb21wbGljYXRlZCB3aXRoIGEgbGFyZ2VyIGVsZW1lbnQKKwkgc2l6ZSwgdW5sZXNzIHdl IHVzZSBhbiBpbW1lZGlhdGUsIHdoaWNoIHByZXZlbnRzIHVzIGZyb20gZHluYW1pY2FsbHkKKwkg dXNpbmcgdGhlIHRhcmdldHMgdHJhbnNmZXIgc2l6ZSB0aGF0IHRoZSBoYXJ0IHN1cHBvcnRzLiAg QW5kIHRoZW4sCisJIHVubGVzcyB3ZSBrbm93IHRoZSAqZXhhY3QqIHZlY3RvciBzaXplIG9mIHRo ZSBoYXJ0LCB3ZSdkIG5lZWQKKwkgbXVsdGlwbGUgdnNldHZsaSAvIGJyYW5jaCBzdGF0ZW1lbnRz LCBzbyBpdCdzIG5vdCBldmVuIGEgc2l6ZSB3aW4uCisJIElmLCBpbiB0aGUgZnV0dXJlLCB3ZSBm aW5kIGFuIFJJU0NWLVYgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzbG93ZXIKKwkgZm9yIHNtYWxs IGVsZW1lbnQgd2lkdGhzLCB3ZSBtaWdodCBhbGxvdyBsYXJnZXIgZWxlbWVudCB3aWR0aHMgZm9y CisJIGxvb3BzIHRvby4gICovCisgICAgICBpZiAobmVlZF9sb29wKQorCXBvdGVudGlhbF9ldyA9 IDE7CisgICAgICBmb3IgKDsgcG90ZW50aWFsX2V3OyBwb3RlbnRpYWxfZXcgPj49IDEpCisJewor CSAgc2NhbGFyX2ludF9tb2RlIGVsZW1fbW9kZTsKKwkgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQg Yml0cyA9IHBvdGVudGlhbF9ldyAqIEJJVFNfUEVSX1VOSVQ7CisJICB1bnNpZ25lZCBIT1NUX1dJ REVfSU5UIHBlcl9pdGVyOworCSAgSE9TVF9XSURFX0lOVCBudW5pdHM7CisKKwkgIGlmIChuZWVk X2xvb3ApCisJICAgIHBlcl9pdGVyID0gVEFSR0VUX01JTl9WTEVOOworCSAgZWxzZQorCSAgICBw ZXJfaXRlciA9IGxlbmd0aDsKKwkgIG51bml0cyA9IHBlcl9pdGVyIC8gcG90ZW50aWFsX2V3Owor CisJICAvKiBVbmxlc3Mgd2UgZ2V0IGFuIGltcGxlbWVudGF0aW9uIHRoYXQncyBzbG93IGZvciBz bWFsbCBlbGVtZW50CisJICAgICBzaXplIC8gbm9uLXdvcmQtYWxpZ25lZCBhY2Nlc3Nlcywgd2Ug YXNzdW1lIHRoYXQgdGhlIGhhcmR3YXJlCisJICAgICBoYW5kbGVzIHRoaXMgd2VsbCwgYW5kIHdl IGRvbid0IHdhbnQgdG8gY29tcGxpY2F0ZSB0aGUgY29kZQorCSAgICAgd2l0aCBzaGlmdGluZyB3 b3JkIGNvbnRlbnRzIGFyb3VuZCBvciBoYW5kbGluZyBleHRyYSBieXRlcyBhdAorCSAgICAgdGhl IHN0YXJ0IGFuZC9vciBlbmQuICBTbyB3ZSB3YW50IHRoZSB0b3RhbCB0cmFuc2ZlciBzaXplIGFu ZAorCSAgICAgYWxpZ25tZW50IHRvIGZpdCB3aXRoIHRoZSBlbGVtZW50IHNpemUuICAqLworCSAg aWYgKGxlbmd0aCAlIHBvdGVudGlhbF9ldyAhPSAwCisJICAgICAgfHwgIWludF9tb2RlX2Zvcl9z aXplIChiaXRzLCAwKS5leGlzdHMgKCZlbGVtX21vZGUpKQorCSAgICBjb250aW51ZTsKKwkgIC8q IEZpbmQgdGhlIG1vZGUgdG8gdXNlIGZvciB0aGUgY29weSBpbnNpZGUgdGhlIGxvb3AgLSBvciB0 aGUKKwkgICAgIHNvbGUgY29weSwgaWYgdGhlcmUgaXMgbm8gbG9vcC4gICovCisJICBpZiAoIW5l ZWRfbG9vcCkKKwkgICAgeworCSAgICAgIC8qIFRyeSBpZiB3ZSBoYXZlIGFuIGV4YWN0IG1vZGUg Zm9yIHRoZSBjb3B5LiAgKi8KKwkgICAgICBpZiAoZ2V0X3ZlY3Rvcl9tb2RlIChlbGVtX21vZGUs IG51bml0cykuZXhpc3RzICgmdm1vZGUpKQorCQlicmVhazsKKwkgICAgICAvKiBXZSBtaWdodCBo YXZlIGFuIG9kZCB0cmFuc2ZlciBzaXplLiAgVHJ5IHRvIHJvdW5kIGl0IHVwIHRvCisJCSBhIHBv d2VyIG9mIHR3byB0byBnZXQgYSB2YWxpZCB2ZWN0b3IgbW9kZSBmb3IgYSBjbG9iYmVyLiAgKi8K KwkgICAgICBmb3IgKG51bml0cyA9IDFVTEwgPDwgY2VpbF9sb2cyIChudW5pdHMpOworCQkgICBu dW5pdHMgPD0gVEFSR0VUX01JTl9WTEVOOworCQkgICBudW5pdHMgPDw9IDEpCisJCWlmIChnZXRf dmVjdG9yX21vZGUgKGVsZW1fbW9kZSwgbnVuaXRzKS5leGlzdHMgKCZ2bW9kZSkpCisJCSAgYnJl YWs7CisKKwkgICAgICBpZiAodm1vZGUgIT0gVk9JRG1vZGUpCisJCWJyZWFrOworCSAgICB9CisK KwkgIC8qIFRoZSBSVlZNOD9JIG1vZGVzIGFyZSBub3Rpb25hbGx5IDggKiBCWVRFU19QRVJfUklT Q1ZfVkVDVE9SIGJ5dGVzCisJICAgICB3aWRlLiAgQllURVNfUEVSX1JJU0NWX1ZFQ1RPUiBjYW4n dCBiZSBlYXZlbmx5IGRpdmlkZWQgYnkKKwkgICAgIHRoZSBzaXplcyBvZiBsYXJnZXIgZWxlbWVu dCB0eXBlczsgdGhlIExNVUwgZmFjdG9yIG9mIDggY2FuIGF0CisJICAgICB0aGUgbW9tZW50IHdp dGggU0VXIG9mIHVwIHRvIDggYnl0ZXMsIGJ1dCB0aGVyZSBhcmUgcmVzZXJ2ZWQKKwkgICAgIGVu Y29kaW5ncyBzbyB0aGVyZSBtaWdodCBiZSBsYXJnZXIgU0VXIGluIHRoZSBmdXR1cmUuICAqLwor CSAgaWYgKGdldF92ZWN0b3JfbW9kZSAoZWxlbV9tb2RlLAorCQkJICAgICAgIGV4YWN0X2RpdiAo QllURVNfUEVSX1JJU0NWX1ZFQ1RPUiAqIDgsCisJCQkJCSAgcG90ZW50aWFsX2V3KSkuZXhpc3Rz ICgmdm1vZGUpKQorCSAgICBicmVhazsKKworCSAgLyogV2UgbWF5IGdldCBoZXJlIGlmIHdlIHRy aWVkIGFuIGVsZW1lbnQgc2l6ZSB0aGF0J3MgbGFyZ2VyIHRoYW4KKwkgICAgIHRoZSBoYXJkd2Fy ZSBzdXBwb3J0cywgYnV0IHdlIHNob3VsZCBhdCBsZWFzdCBmaW5kIGEgc3VpdGFibGUKKwkgICAg IGJ5dGUgdmVjdG9yIG1vZGUuICAqLworCSAgZ2NjX2Fzc2VydCAocG90ZW50aWFsX2V3ID4gMSk7 CisJfQorICAgICAgaWYgKHBvdGVudGlhbF9ldyA+IDEpCisJbGVuZ3RoX3J0eCA9IEdFTl9JTlQg KGxlbmd0aCAvIHBvdGVudGlhbF9ldyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdm1v ZGUgPSBFX1JWVk04UUltb2RlOworICAgIH0KKworICAvKiBBIG1lbWNweSBsaWJjYWxsIGluIHRo ZSB3b3JzdCBjYXNlIHRha2VzIDMgaW5zdHJ1Y3Rpb25zIHRvIHByZXBhcmUgdGhlCisgICAgIGFy Z3VtZW50cyArIDEgZm9yIHRoZSBjYWxsLiAgV2hlbiBSVlYgc2hvdWxkIHRha2UgNyBpbnN0cnVj dGlvbnMgYW5kCisgICAgIHdlJ3JlIG9wdGltaXppbmcgZm9yIHNpemUgYSBsaWJjYWxsIG1heSBi ZSBwcmVmZXJhYmxlLiAgKi8KKyAgaWYgKHNpemVfcCAmJiBuZWVkX2xvb3ApCisgICAgcmV0dXJu IGZhbHNlOworCisgIHJ0eCBjbnQgPSBsZW5ndGhfcnR4OworICBydHggbGFiZWwgPSBOVUxMX1JU WDsKKyAgcnR4IGRzdF9hZGRyID0gY29weV9hZGRyX3RvX3JlZyAoWEVYUCAoZHN0X2luLCAwKSk7 CisgIHJ0eCBzcmNfYWRkciA9IGNvcHlfYWRkcl90b19yZWcgKFhFWFAgKHNyY19pbiwgMCkpOwor CisgIGlmIChuZWVkX2xvb3ApCisgICAgeworICAgICAgbGVuZ3RoX3J0eCA9IGNvcHlfdG9fbW9k ZV9yZWcgKFBtb2RlLCBsZW5ndGhfcnR4KTsKKyAgICAgIGxhYmVsID0gZ2VuX2xhYmVsX3J0eCAo KTsKKworICAgICAgZW1pdF9sYWJlbCAobGFiZWwpOworICAgICAgZW1pdF9pbnNuIChnZW5fbm9f c2lkZV9lZmZlY3RzX3ZzZXR2bF9ydHggKHZtb2RlLCBjbnQsIGxlbmd0aF9ydHgpKTsKKyAgICB9 CisKKyAgdmVjID0gZ2VuX3JlZ19ydHggKHZtb2RlKTsKKyAgc3JjID0gY2hhbmdlX2FkZHJlc3Mg KHNyY19pbiwgdm1vZGUsIHNyY19hZGRyKTsKKyAgZHN0ID0gY2hhbmdlX2FkZHJlc3MgKGRzdF9p biwgdm1vZGUsIGRzdF9hZGRyKTsKKworICAvKiBJZiB3ZSBkb24ndCBuZWVkIGEgbG9vcCBhbmQg aGF2ZSBhIHN1aXRhYmxlIG1vZGUgdG8gZGVzY3JpYmUgdGhlIHNpemUsCisgICAgIGp1c3QgZG8g YSBsb2FkIC8gc3RvcmUgcGFpciBhbmQgbGVhdmUgaXQgdXAgdG8gdGhlIGxhdGVyIGxhenkgY29k ZQorICAgICBtb3Rpb24gcGFzcyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIHZzZXR2bGkuICAq LworICBpZiAoIW5lZWRfbG9vcCAmJiBrbm93bl9lcSAoR0VUX01PREVfU0laRSAodm1vZGUpLCBJ TlRWQUwgKGxlbmd0aF9pbikpKQorICAgIHsKKyAgICAgIGVtaXRfbW92ZV9pbnNuICh2ZWMsIHNy Yyk7CisgICAgICBlbWl0X21vdmVfaW5zbiAoZHN0LCB2ZWMpOworICAgIH0KKyAgZWxzZQorICAg IHsKKyAgICAgIG1hY2hpbmVfbW9kZSBtYXNrX21vZGUgPSBnZXRfdmVjdG9yX21vZGUgKEJJbW9k ZSwgR0VUX01PREVfTlVOSVRTICh2bW9kZSkpLnJlcXVpcmUgKCk7CisgICAgICBydHggbWFzayA9 ICBDT05TVE0xX1JUWCAobWFza19tb2RlKTsKKyAgICAgIGlmICghc2F0aXNmaWVzX2NvbnN0cmFp bnRfSyAoY250KSkKKwljbnQ9IGZvcmNlX3JlZyAoUG1vZGUsIGNudCk7CisgICAgICBydHggbV9v cHNbXSA9IHt2ZWMsIG1hc2ssIFJWVl9WVU5ERUYgKHZtb2RlKSwgc3JjfTsKKyAgICAgIGVtaXRf bm9udmxtYXhfbWFza2VkX2luc24gKGNvZGVfZm9yX3ByZWRfbW92ICh2bW9kZSksIFJWVl9VTk9Q X00sCisJCQkJIG1fb3BzLCBjbnQpOworICAgICAgZW1pdF9pbnNuIChnZW5fcHJlZF9zdG9yZSAo dm1vZGUsIGRzdCwgbWFzaywgdmVjLCBjbnQsCisJCQkJIGdldF9hdmxfdHlwZV9ydHggKE5PTlZM TUFYKSkpOworICAgIH0KKworICBpZiAobmVlZF9sb29wKQorICAgIHsKKyAgICAgIGVtaXRfaW5z biAoZ2VuX3J0eF9TRVQgKHNyY19hZGRyLCBnZW5fcnR4X1BMVVMgKFBtb2RlLCBzcmNfYWRkciwg Y250KSkpOworICAgICAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoZHN0X2FkZHIsIGdlbl9ydHhf UExVUyAoUG1vZGUsIGRzdF9hZGRyLCBjbnQpKSk7CisgICAgICBlbWl0X2luc24gKGdlbl9ydHhf U0VUIChsZW5ndGhfcnR4LCBnZW5fcnR4X01JTlVTIChQbW9kZSwgbGVuZ3RoX3J0eCwgY250KSkp OworCisgICAgICAvKiBFbWl0IHRoZSBsb29wIGNvbmRpdGlvbi4gICovCisgICAgICBydHggdGVz dCA9IGdlbl9ydHhfTkUgKFZPSURtb2RlLCBlbmQsIGNvbnN0MF9ydHgpOworICAgICAgZW1pdF9q dW1wX2luc24gKGdlbl9jYnJhbmNoNCAoUG1vZGUsIHRlc3QsIGxlbmd0aF9ydHgsIGNvbnN0MF9y dHgsIGxhYmVsKSk7CisgICAgICBlbWl0X2luc24gKGdlbl9ub3AgKCkpOworICAgIH0KKworICBy ZXR1cm4gdHJ1ZTsKK30KKwogLyogUmV0dXJuIHRoZSB2ZWN0b3JpemF0aW9uIG1hY2hpbmUgbW9k ZSBmb3IgUlZWIGFjY29yZGluZyB0byBMTVVMLiAgKi8KIG1hY2hpbmVfbW9kZQogcHJlZmVycmVk X3NpbWRfbW9kZSAoc2NhbGFyX21vZGUgbW9kZSkKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvcmlz Y3YvcmlzY3YubWQgYi9nY2MvY29uZmlnL3Jpc2N2L3Jpc2N2Lm1kCmluZGV4IGI0NTZmYTZhYmIz Li41YjYzZGE0ZDkzYiAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9yaXNjdi9yaXNjdi5tZAorKysg Yi9nY2MvY29uZmlnL3Jpc2N2L3Jpc2N2Lm1kCkBAIC0yMTQ5LDE0ICsyMTQ5LDE2IEBACiAgIERP TkU7CiB9KQogCi0oZGVmaW5lX2V4cGFuZCAiY3B5bWVtc2kiCisoZGVmaW5lX2V4cGFuZCAiY3B5 bWVtPG1vZGU+IgogICBbKHBhcmFsbGVsIFsoc2V0IChtYXRjaF9vcGVyYW5kOkJMSyAwICJnZW5l cmFsX29wZXJhbmQiKQogCQkgICAobWF0Y2hfb3BlcmFuZDpCTEsgMSAiZ2VuZXJhbF9vcGVyYW5k IikpCi0JICAgICAgKHVzZSAobWF0Y2hfb3BlcmFuZDpTSSAyICIiKSkKKwkgICAgICAodXNlICht YXRjaF9vcGVyYW5kOlAgMiAiIikpCiAJICAgICAgKHVzZSAobWF0Y2hfb3BlcmFuZDpTSSAzICJj b25zdF9pbnRfb3BlcmFuZCIpKV0pXQogICAiIgogewotICBpZiAocmlzY3ZfZXhwYW5kX2Jsb2Nr X21vdmUgKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pKQorICBpZiAocmlz Y3ZfdmVjdG9yOjpleHBhbmRfYmxvY2tfbW92ZSAob3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFdLCBv cGVyYW5kc1syXSkpCisgICAgRE9ORTsKKyAgZWxzZSBpZiAocmlzY3ZfZXhwYW5kX2Jsb2NrX21v dmUgKG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pKQogICAgIERPTkU7CiAg IGVsc2UKICAgICBGQUlMOwo= --000000000000292a470602f1bf69--