From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CAF191386B4; Tue, 1 Jul 2025 18:32:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751394740; cv=none; b=smmxfB0q2/ZMseKHsCIJmoU5SYEOhHMt2Pjdsn32ilrnmveeiIaKOiRL+OMzdyBDIWxvfs0vunLbpYOASnEvmjkpbKGdIkb0vTOuE1QJHumwS0Y0Dhiamn02iphnOMsUwfozsz8PYuHDNPeIyvBDDC16SVqfCLtRvohqObtOzC0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751394740; c=relaxed/simple; bh=xOvQ4YveMJnngVcge4VPkxr/0JPaZcGRhNhGnGOPfxQ=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=BosOrC16T4bRBPGgG4uOyuf1wT2nzizMKneW0OvgvozZcEdIxWZT9EL5+5AcIMG7FpTF8WtLZPeIBM3Rm0+QDikwIu1/UaypT9XPMCrkJ9N62gX4PT8BFz3iwAunw7onTIaM0Z90g2Qf2+W9prHfiS9qkaIBelWxyRZpNJoNQ2g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HPDuZfxz; arc=none smtp.client-ip=209.85.210.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HPDuZfxz" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-747fc7506d4so3317455b3a.0; Tue, 01 Jul 2025 11:32:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751394738; x=1751999538; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=gY6mQVMmIl68dFLJH/SnrEytnvbgKUD06sOpURKt7zw=; b=HPDuZfxzyl67Xlx1HYXvBLRyldjxv7+c9rbstyD0k/XAdNyyFNz3j4pNNf4LvHL6n+ u+MSaAAk8wEXisTC5t0P83v9OzXihxkNMD3L2XEG0yOvbWw+dZ+h4DUfg6wDad8I96nw 1S4X3uD8vUxkG4BthwHhr49wzEajY4COAmtkIiASflcCko42owU3BHLwfbe7eVTjpRCc 12l07JD+CE/wagYJOm2Rh/CTZd2LiH2g2Ambskeei3dmXARpiPefeCSYWSofsGLiBW17 FcBthPu0rxDBuisN4ETSMU432vfNIo7mzPKWCym3cg7Cu5xt0UvDy10ifcGqGpXa4dSV oCyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751394738; x=1751999538; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gY6mQVMmIl68dFLJH/SnrEytnvbgKUD06sOpURKt7zw=; b=X0MOXh7DFdOEB34ohnTsJVkuFCRZtt/++yHC8h0hY7cDHlof5r+egEum5ZLirTFmn8 eL4jT7RKuxho9vAyGqyXL+Wn6lusl/zCky73MpVOdG6nMhKcnS+0wAIIfBd1r3Or4GNF SWQxpSbfGZQmsBuNniwzuhTeLoBY+ocejGbNDTAsRFwIYuhbkmmVIHkljMI4o0Q8uujw U5Kck1sk4QxhGqMqHlW/8216MApYknNkKDA9mqk5NQU5Solm0VlHYSlNUF9TVZ4JljL4 g1PoEXIpYzyDNxwzKW5d7Td9K49prJdZ4Frgc+Bge5r1Mi9dTnr7xNYkZIpt0leHGJdo LmFQ== X-Forwarded-Encrypted: i=1; AJvYcCUOuPyeYfJ+QssMi5gFB4gl99h6AW8XxRovHJCdYqCrxJZanzqwT7iSnpMhUED3NTl2RIXLt7XOWgwW@vger.kernel.org, AJvYcCXAgphjytQUcZd12Zo69JycbDcS7eqgbwyeADe0IYdycK5YUFICyoNQZGncgQ6VxASaO1WDH7YUEGNsQI0n@vger.kernel.org X-Gm-Message-State: AOJu0YzhQ708wqseiN3YFAMkIO+1jT8/GOF1QOFGS8s2gysSDobUbGmE 33TsCy8prp7XBUHGQI79gTg98C/iurcRSKNlBv/ijGJnwjWycgnxV7lk X-Gm-Gg: ASbGncv5ZFyGhaw3gjFyxoEUyQsg1SZHTGVbPKjrWlvWAPpqZ1ak8IX+j1dP21D7Ur1 MVDVxiEvSFmj6xjYEBRqQfJcsNXfI/lJeRYwK1+B7qQisbTPivjN4PIWE/D5iHONFtRBtTVTFer AggV78KP7CvtEeUrsPSYSPjOuvKy0B0s23PYltto3YGGBN3AmZWTJUYGxT6CT4jUl8QLtKZC3Vy xL45d5toBn9DyDzuYOIaML6xjQ4XasfZaLLzZal4QKhD2CCXcm6IAemQ2pURFFGazQtUD+bPXTO s7XrJLakFvuFLn3+1+gsxQ0iMiQCNfPrci32yYzbyVIRHkGYUUKZoNiQuVVk5Q== X-Google-Smtp-Source: AGHT+IFHLL7P1lYF9UPZci0RSTG7Y6C/qYNbKwFfO//TmNisiNGsH7HgHOhmAuCFzDwIfvPTkGQc5Q== X-Received: by 2002:a05:6a00:2e15:b0:732:2923:b70f with SMTP id d2e1a72fcca58-74af6f73b0emr24350576b3a.11.1751394737753; Tue, 01 Jul 2025 11:32:17 -0700 (PDT) Received: from localhost ([216.228.127.130]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74af55c6d49sm12327550b3a.119.2025.07.01.11.32.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 11:32:16 -0700 (PDT) Date: Tue, 1 Jul 2025 14:32:14 -0400 From: Yury Norov To: cp0613@linux.alibaba.com Cc: alex@ghiti.fr, aou@eecs.berkeley.edu, arnd@arndb.de, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux@rasmusvillemoes.dk, palmer@dabbelt.com, paul.walmsley@sifive.com Subject: Re: [PATCH 2/2] bitops: rotate: Add riscv implementation using Zbb extension Message-ID: References: <20250701124737.687-1-cp0613@linux.alibaba.com> Precedence: bulk X-Mailing-List: linux-arch@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20250701124737.687-1-cp0613@linux.alibaba.com> On Tue, Jul 01, 2025 at 08:47:01PM +0800, cp0613@linux.alibaba.com wrote: > On Mon, 30 Jun 2025 12:53:03 -0400, yury.norov@gmail.com wrote: > > > > > 1. The most trivial compile-case is actually evaluated at compile time; and > > > > 2. Any arch-specific code is well explained; and > > > > 3. legacy case optimized just as well as non-legacy. > > > > > > 1. As in the above reply, use the generic implementation when compile-time evaluation > > > is possible。 > > > 2. I will improve the comments later. > > > > I'm particularly interested in ror8/rol8 case: > > > > u32 word32 = ((u32)word << 24) | ((u32)word << 16) | ((u32)word << 8) | word; > > > > When you expand it to 32-bit word, and want to rotate, you obviously > > need to copy lower quarterword to the higher one: > > > > 0xab >> 0xab0000ab > > > > That way generic (u8)ror32(0xab, shift) would work. But I don't understand > > why you copy the lower 8 bits to inner quarterwords. Is that a hardware > > requirement? Can you point to any arch documentation > > > > > 3. As mentioned before, only 8-bit rotation should have no optimization effect, and > > > 16-bit and above will have significant optimization. > > > > I asked you about the asm goto ("legacy") thing: you calculate that > > complex word32 _before_ evaluating the goto. So this word32 may get > > unused, and you waste cycles. I want to make sure this isn't the case. > > Thank you for your suggestion and reminder. This is not a hardware requirement, but it Sure. Please add Suggested-by: Yury Norov (NVIDIA) > is somewhat related because the zbb instruction only supports word-sized rotate [1]. > Considering the case where the shift is greater than 8, if the modulus of the shift is > not taken, it is required to continuously concatenate 8-bit data into 32 bits. > > So, I considered the case of taking the remainder of shift and found that this > implementation would have one less instruction, so the final implementation is as follows: > ``` > static inline u8 variable_rol8(u8 word, unsigned int shift) Now that it has assembler inlines, would it help to add the __pure qualifier? > { > u32 word32; > > asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, > RISCV_ISA_EXT_ZBB, 1) > : : : : legacy); > > word32 = ((u32)word << 24) | word; > shift = shift % 8; shift %= 8; > > asm volatile( > ".option push\n" > ".option arch,+zbb\n" > "rolw %0, %1, %2\n" > ".option pop\n" > : "=r" (word32) : "r" (word32), "r" (shift) :); > > return (u8)word32; > > legacy: > return generic_rol8(word, shift); > } > > static inline u8 variable_ror8(u8 word, unsigned int shift) > { > u32 word32; > > asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, > RISCV_ISA_EXT_ZBB, 1) > : : : : legacy); > > word32 = ((u32)word << 8) | word; > shift = shift % 8; > > asm volatile( > ".option push\n" > ".option arch,+zbb\n" > "rorw %0, %1, %2\n" > ".option pop\n" > : "=r" (word32) : "r" (word32), "r" (shift) :); > > return (u8)word32; > > legacy: > return generic_ror8(word, shift); > } > ``` OK, this looks better. > I compared the performance of ror8 (zbb optimized) and generic_ror8 on the XUANTIE C908 > by looping them. ror8 is better, and the advantage of ror8 becomes more obvious as the > number of iterations increases. The test code is as follows: > ``` > u8 word = 0x5a; > u32 shift = 9; > u32 i, loop = 100; > u8 ret1, ret2; > > u64 t1 = ktime_get_ns(); > for (i = 0; i < loop; i++) { > ret2 = generic_ror8(word, shift); > } > u64 t2 = ktime_get_ns(); > for (i = 0; i < loop; i++) { > ret1 = ror8(word, shift); > } > u64 t3 = ktime_get_ns(); > > pr_info("t2-t1=%lld t3-t2=%lld\n", t2 - t1, t3 - t2); > ``` Please do the following: 1. Drop the generic_ror8() and keep only ror/l8() 2. Add ror/l16, 34 and 64 tests. 3. Adjust the 'loop' so that each subtest will take 1-10 ms on your hw. 4. Name the function like test_rorl(), and put it next to the test_fns() in lib/test_bitops.c. Refer the 0a2c6664e56f0 for implementation. 5. Prepend the series with the benchmark patch, just as with const-eval one, and report before/after for your series. > > Please find attached a test for compile-time ror/rol evaluation. > > Please consider prepending your series with it. > > Okay, I'll bring it to the next series. Still waiting for bloat-o-meter results. Thanks, Yury > > [1] https://github.com/riscv/riscv-bitmanip From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A0B7CC83038 for ; Tue, 1 Jul 2025 20:51:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=IEWrHOEUJ0Z++TXQSWQsTe6OPGL3CRK2tFLJOFHdLRw=; b=E/ejdnZvZtjdi+ CM5fKbGeqfNbuM39+DV40p+YHO36oBC8Kee1+S6buQEfHDdIF/m23kxTHFGOAfcrERRCVoR75GWt4 v1txMqXON8wFpmwK81Fs9nfkKf9mTJTQdycBZZTHC3XcUuNCkxeNe8q4KBKvBWa18Xl1AyebQjy/6 oP+Fv0vKOYygQIKeDkdNcmCNNqHBmVu8iYfHCZAKszsiK4oKCkOHTBkYMpsS3WqyiSaZJfNDKxuD1 Yt6ES4S5vy2Zy73MxakA2PtmSc6KvEGVhQtTbteVmY0U0cSXyfVJ8ONpo3lbzD57GtLVPKE2CVCz4 u4AqnKfyOd/i1sd8u+Hw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uWhwV-00000006cA3-0nhs; Tue, 01 Jul 2025 20:51:03 +0000 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uWfmF-00000006LQG-0oyB for linux-riscv@lists.infradead.org; Tue, 01 Jul 2025 18:32:20 +0000 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-7424ccbef4eso3339237b3a.2 for ; Tue, 01 Jul 2025 11:32:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751394738; x=1751999538; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=gY6mQVMmIl68dFLJH/SnrEytnvbgKUD06sOpURKt7zw=; b=ITBi94UsB8HLzGZ97VCPZWDkMAkBf5Ipiv+4xuPlLD+pALILqMCTswz9sY48Cjxe91 dxnOYrDDwdZghVWEoN11zOS7rDBdP+sP7Uu+GnyLVrkxBdYlwUGq6f0n5BCoVLeZ85TJ m7jPMxA34WAbEdhbb1hzI+e0N5Bd+IU+2BkhwCJsLatAduC06277SZhfBDjDmIzl42ls Gq0mOFJHnHGrCT6LPjHI6JDA76e0z7se7kFLyOJEHHA++0zrodhzIRD7G9/kRypzx4HA 1slM+yMUNojnKxSI0gubhu4WsueDqiuVGV4c1reryyFQ4xcwGgg2ubQvod4dc6pqutsh qQWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751394738; x=1751999538; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gY6mQVMmIl68dFLJH/SnrEytnvbgKUD06sOpURKt7zw=; b=SqRQk2/U+Gdn7CPU6nQj4btkrjEq9LoNAo4v11o3sCiToSe5U1TsJWwCfLM4rFSdpv iH9r/5oNtAwiXUC9pusZc+HBif67T5B81T7nq9Pl65KxhqcPy9OIZ4U7wkrkfunDZwXM +4ZySYmmJtWUFbj3gELK/yqbVpWy1zRlf/7guair6OWCK/FhmYAVDEFeKvlO5FRoxfQG yBgLZKDYwjnuyzZVOZEkodw0KXOBxfdx2JIbZQeI7M8x2ci+6MOYzogiJtF82T2Tb48C y7Na2YntPB8q2vLHr3/yKG0S3YsNP1cUQBqFrpmLS/l7IixAC2UW68ujR3TtJl/Mj2FW CkXA== X-Forwarded-Encrypted: i=1; AJvYcCVuYHeYX4VtZ3sQ7zAcmoAyyS6mbD7S5p6rZl39vksF0N0Njkdcl4pXJV43oRqjfyYpJ8Xg8MnmMfvzLw==@lists.infradead.org X-Gm-Message-State: AOJu0Yx0Rpg7Dxm8aIvKPv2iWiCoRJdsbTiANkYyy8CdtuXikre92VGs akmCVVdafOHggEUe0DOTmny4+v6g+JeTCZMAXDEgGJHlaj6pl2S3aora X-Gm-Gg: ASbGnctnbps18wK3twva/tgzm6IqXdxIrCCUjFRtB3fu5FlKoNH5jEiQxEsSLjYO15D m66z7Xhm//Y12jJHkoo+DUd1N5WpLOrxlb5vI27dLpfkoCbwuhGq4EUAIB11wH9dEHa80UN5nmg wuGsE9UROCo20w0dIw7GpzSnPtiVrGEsSkrhMF3SaG3kdKEqq8Y+7TJg+Dx2TBck3UCKead8muA mg3ZcIAhfKqx4bbmgPKbyG6+XaZOu4krkwscnWTnb8CYgn6TpibYHyxLPLwMBO7nBYNuoQzQtP0 Y7oCTKUQya0yhHLqQ1tOYLYMHqgz0VJsirH1BFqBdp3KHBUTNHl8ffk5I1QCSg== X-Google-Smtp-Source: AGHT+IFHLL7P1lYF9UPZci0RSTG7Y6C/qYNbKwFfO//TmNisiNGsH7HgHOhmAuCFzDwIfvPTkGQc5Q== X-Received: by 2002:a05:6a00:2e15:b0:732:2923:b70f with SMTP id d2e1a72fcca58-74af6f73b0emr24350576b3a.11.1751394737753; Tue, 01 Jul 2025 11:32:17 -0700 (PDT) Received: from localhost ([216.228.127.130]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74af55c6d49sm12327550b3a.119.2025.07.01.11.32.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 11:32:16 -0700 (PDT) Date: Tue, 1 Jul 2025 14:32:14 -0400 From: Yury Norov To: cp0613@linux.alibaba.com Cc: alex@ghiti.fr, aou@eecs.berkeley.edu, arnd@arndb.de, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux@rasmusvillemoes.dk, palmer@dabbelt.com, paul.walmsley@sifive.com Subject: Re: [PATCH 2/2] bitops: rotate: Add riscv implementation using Zbb extension Message-ID: References: <20250701124737.687-1-cp0613@linux.alibaba.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20250701124737.687-1-cp0613@linux.alibaba.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250701_113219_261668_D1778C3C X-CRM114-Status: GOOD ( 33.33 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gVHVlLCBKdWwgMDEsIDIwMjUgYXQgMDg6NDc6MDFQTSArMDgwMCwgY3AwNjEzQGxpbnV4LmFs aWJhYmEuY29tIHdyb3RlOgo+IE9uIE1vbiwgMzAgSnVuIDIwMjUgMTI6NTM6MDMgLTA0MDAsIHl1 cnkubm9yb3ZAZ21haWwuY29tIHdyb3RlOgo+IAo+ID4gPiA+IDEuIFRoZSBtb3N0IHRyaXZpYWwg Y29tcGlsZS1jYXNlIGlzIGFjdHVhbGx5IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWU7IGFuZAo+ ID4gPiA+IDIuIEFueSBhcmNoLXNwZWNpZmljIGNvZGUgaXMgd2VsbCBleHBsYWluZWQ7IGFuZAo+ ID4gPiA+IDMuIGxlZ2FjeSBjYXNlIG9wdGltaXplZCBqdXN0IGFzIHdlbGwgYXMgbm9uLWxlZ2Fj eS4KPiA+ID4gCj4gPiA+IDEuIEFzIGluIHRoZSBhYm92ZSByZXBseSwgdXNlIHRoZSBnZW5lcmlj IGltcGxlbWVudGF0aW9uIHdoZW4gY29tcGlsZS10aW1lIGV2YWx1YXRpb24KPiA+ID4gICAgaXMg cG9zc2libGXjgIIKPiA+ID4gMi4gSSB3aWxsIGltcHJvdmUgdGhlIGNvbW1lbnRzIGxhdGVyLgo+ ID4gCj4gPiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gcm9yOC9yb2w4IGNhc2U6Cj4g PiAKPiA+ICAgICAgICAgdTMyIHdvcmQzMiA9ICgodTMyKXdvcmQgPDwgMjQpIHwgKCh1MzIpd29y ZCA8PCAxNikgfCAoKHUzMil3b3JkIDw8IDgpIHwgd29yZDsKPiA+IAo+ID4gV2hlbiB5b3UgZXhw YW5kIGl0IHRvIDMyLWJpdCB3b3JkLCBhbmQgd2FudCB0byByb3RhdGUsIHlvdSBvYnZpb3VzbHkK PiA+IG5lZWQgdG8gY29weSBsb3dlciBxdWFydGVyd29yZCB0byB0aGUgaGlnaGVyIG9uZToKPiA+ IAo+ID4gICAgICAgICAweGFiID4+IDB4YWIwMDAwYWIKPiA+IAo+ID4gVGhhdCB3YXkgZ2VuZXJp YyAodTgpcm9yMzIoMHhhYiwgc2hpZnQpIHdvdWxkIHdvcmsuIEJ1dCBJIGRvbid0IHVuZGVyc3Rh bmQKPiA+IHdoeSB5b3UgY29weSB0aGUgbG93ZXIgOCBiaXRzIHRvIGlubmVyIHF1YXJ0ZXJ3b3Jk cy4gSXMgdGhhdCBhIGhhcmR3YXJlCj4gPiByZXF1aXJlbWVudD8gQ2FuIHlvdSBwb2ludCB0byBh bnkgYXJjaCBkb2N1bWVudGF0aW9uIAo+ID4gCj4gPiA+IDMuIEFzIG1lbnRpb25lZCBiZWZvcmUs IG9ubHkgOC1iaXQgcm90YXRpb24gc2hvdWxkIGhhdmUgbm8gb3B0aW1pemF0aW9uIGVmZmVjdCwg YW5kCj4gPiA+ICAgIDE2LWJpdCBhbmQgYWJvdmUgd2lsbCBoYXZlIHNpZ25pZmljYW50IG9wdGlt aXphdGlvbi4KPiA+IAo+ID4gSSBhc2tlZCB5b3UgYWJvdXQgdGhlIGFzbSBnb3RvICgibGVnYWN5 IikgdGhpbmc6IHlvdSBjYWxjdWxhdGUgdGhhdAo+ID4gY29tcGxleCB3b3JkMzIgX2JlZm9yZV8g ZXZhbHVhdGluZyB0aGUgZ290by4gU28gdGhpcyB3b3JkMzIgbWF5IGdldAo+ID4gdW51c2VkLCBh bmQgeW91IHdhc3RlIGN5Y2xlcy4gSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIGlzbid0IHRoZSBj YXNlLgo+IAo+IFRoYW5rIHlvdSBmb3IgeW91ciBzdWdnZXN0aW9uIGFuZCByZW1pbmRlci4gVGhp cyBpcyBub3QgYSBoYXJkd2FyZSByZXF1aXJlbWVudCwgYnV0IGl0CgpTdXJlLiBQbGVhc2UgYWRk CgpTdWdnZXN0ZWQtYnk6IFl1cnkgTm9yb3YgKE5WSURJQSkgPHl1cnkubm9yb3ZAZ21haWwuY29t PgoKPiBpcyBzb21ld2hhdCByZWxhdGVkIGJlY2F1c2UgdGhlIHpiYiBpbnN0cnVjdGlvbiBvbmx5 IHN1cHBvcnRzIHdvcmQtc2l6ZWQgcm90YXRlIFsxXS4KPiBDb25zaWRlcmluZyB0aGUgY2FzZSB3 aGVyZSB0aGUgc2hpZnQgaXMgZ3JlYXRlciB0aGFuIDgsIGlmIHRoZSBtb2R1bHVzIG9mIHRoZSBz aGlmdCBpcwo+IG5vdCB0YWtlbiwgaXQgaXMgcmVxdWlyZWQgdG8gY29udGludW91c2x5IGNvbmNh dGVuYXRlIDgtYml0IGRhdGEgaW50byAzMiBiaXRzLgo+IAo+IFNvLCBJIGNvbnNpZGVyZWQgdGhl IGNhc2Ugb2YgdGFraW5nIHRoZSByZW1haW5kZXIgb2Ygc2hpZnQgYW5kIGZvdW5kIHRoYXQgdGhp cwo+IGltcGxlbWVudGF0aW9uIHdvdWxkIGhhdmUgb25lIGxlc3MgaW5zdHJ1Y3Rpb24sIHNvIHRo ZSBmaW5hbCBpbXBsZW1lbnRhdGlvbiBpcyBhcyBmb2xsb3dzOgo+IGBgYAo+IHN0YXRpYyBpbmxp bmUgdTggdmFyaWFibGVfcm9sOCh1OCB3b3JkLCB1bnNpZ25lZCBpbnQgc2hpZnQpCgpOb3cgdGhh dCBpdCBoYXMgYXNzZW1ibGVyIGlubGluZXMsIHdvdWxkIGl0IGhlbHAgdG8gYWRkIHRoZSBfX3B1 cmUKcXVhbGlmaWVyPwoKPiB7Cj4gCXUzMiB3b3JkMzI7Cj4gCj4gCWFzbSBnb3RvKEFMVEVSTkFU SVZFKCJqICVsW2xlZ2FjeV0iLCAibm9wIiwgMCwKPiAJCQkJICAgICAgUklTQ1ZfSVNBX0VYVF9a QkIsIDEpCj4gCQkJICA6IDogOiA6IGxlZ2FjeSk7Cj4gCj4gCXdvcmQzMiA9ICgodTMyKXdvcmQg PDwgMjQpIHwgd29yZDsKPiAJc2hpZnQgPSBzaGlmdCAlIDg7CgogICAgICAgIHNoaWZ0ICU9IDg7 Cgo+IAo+IAlhc20gdm9sYXRpbGUoCj4gCQkiLm9wdGlvbiBwdXNoXG4iCj4gCQkiLm9wdGlvbiBh cmNoLCt6YmJcbiIKPiAJCSJyb2x3ICUwLCAlMSwgJTJcbiIKPiAJCSIub3B0aW9uIHBvcFxuIgo+ IAkJOiAiPXIiICh3b3JkMzIpIDogInIiICh3b3JkMzIpLCAiciIgKHNoaWZ0KSA6KTsKPiAKPiAJ cmV0dXJuICh1OCl3b3JkMzI7Cj4gCj4gbGVnYWN5Ogo+IAlyZXR1cm4gZ2VuZXJpY19yb2w4KHdv cmQsIHNoaWZ0KTsKPiB9Cj4gCj4gc3RhdGljIGlubGluZSB1OCB2YXJpYWJsZV9yb3I4KHU4IHdv cmQsIHVuc2lnbmVkIGludCBzaGlmdCkKPiB7Cj4gCXUzMiB3b3JkMzI7Cj4gCj4gCWFzbSBnb3Rv KEFMVEVSTkFUSVZFKCJqICVsW2xlZ2FjeV0iLCAibm9wIiwgMCwKPiAJCQkJICAgICAgUklTQ1Zf SVNBX0VYVF9aQkIsIDEpCj4gCQkJICA6IDogOiA6IGxlZ2FjeSk7Cj4gCj4gCXdvcmQzMiA9ICgo dTMyKXdvcmQgPDwgOCkgfCB3b3JkOwo+IAlzaGlmdCA9IHNoaWZ0ICUgODsKPiAKPiAJYXNtIHZv bGF0aWxlKAo+IAkJIi5vcHRpb24gcHVzaFxuIgo+IAkJIi5vcHRpb24gYXJjaCwremJiXG4iCj4g CQkicm9ydyAlMCwgJTEsICUyXG4iCj4gCQkiLm9wdGlvbiBwb3BcbiIKPiAJCTogIj1yIiAod29y ZDMyKSA6ICJyIiAod29yZDMyKSwgInIiIChzaGlmdCkgOik7Cj4gCj4gCXJldHVybiAodTgpd29y ZDMyOwo+IAo+IGxlZ2FjeToKPiAJcmV0dXJuIGdlbmVyaWNfcm9yOCh3b3JkLCBzaGlmdCk7Cj4g fQo+IGBgYAoKT0ssIHRoaXMgbG9va3MgYmV0dGVyLgoKPiBJIGNvbXBhcmVkIHRoZSBwZXJmb3Jt YW5jZSBvZiByb3I4ICh6YmIgb3B0aW1pemVkKSBhbmQgZ2VuZXJpY19yb3I4IG9uIHRoZSBYVUFO VElFIEM5MDgKPiBieSBsb29waW5nIHRoZW0uIHJvcjggaXMgYmV0dGVyLCBhbmQgdGhlIGFkdmFu dGFnZSBvZiByb3I4IGJlY29tZXMgbW9yZSBvYnZpb3VzIGFzIHRoZQo+IG51bWJlciBvZiBpdGVy YXRpb25zIGluY3JlYXNlcy4gVGhlIHRlc3QgY29kZSBpcyBhcyBmb2xsb3dzOgo+IGBgYAo+IAl1 OCB3b3JkID0gMHg1YTsKPiAJdTMyIHNoaWZ0ID0gOTsKPiAJdTMyIGksIGxvb3AgPSAxMDA7Cj4g CXU4IHJldDEsIHJldDI7Cj4gCj4gCXU2NCB0MSA9IGt0aW1lX2dldF9ucygpOwo+IAlmb3IgKGkg PSAwOyBpIDwgbG9vcDsgaSsrKSB7Cj4gCQlyZXQyID0gZ2VuZXJpY19yb3I4KHdvcmQsIHNoaWZ0 KTsKPiAJfQo+IAl1NjQgdDIgPSBrdGltZV9nZXRfbnMoKTsKPiAJZm9yIChpID0gMDsgaSA8IGxv b3A7IGkrKykgewo+IAkJcmV0MSA9IHJvcjgod29yZCwgc2hpZnQpOwo+IAl9Cj4gCXU2NCB0MyA9 IGt0aW1lX2dldF9ucygpOwo+IAo+IAlwcl9pbmZvKCJ0Mi10MT0lbGxkIHQzLXQyPSVsbGRcbiIs IHQyIC0gdDEsIHQzIC0gdDIpOwo+IGBgYAoKUGxlYXNlIGRvIHRoZSBmb2xsb3dpbmc6CgoxLiBE cm9wIHRoZSBnZW5lcmljX3JvcjgoKSBhbmQga2VlcCBvbmx5IHJvci9sOCgpCjIuIEFkZCByb3Iv bDE2LCAzNCBhbmQgNjQgdGVzdHMuCjMuIEFkanVzdCB0aGUgJ2xvb3AnIHNvIHRoYXQgZWFjaCBz dWJ0ZXN0IHdpbGwgdGFrZSAxLTEwIG1zIG9uIHlvdXIgaHcuCjQuIE5hbWUgdGhlIGZ1bmN0aW9u IGxpa2UgdGVzdF9yb3JsKCksIGFuZCBwdXQgaXQgbmV4dCB0byB0aGUgdGVzdF9mbnMoKQogICBp biBsaWIvdGVzdF9iaXRvcHMuYy4gUmVmZXIgdGhlIDBhMmM2NjY0ZTU2ZjAgZm9yIGltcGxlbWVu dGF0aW9uLgo1LiBQcmVwZW5kIHRoZSBzZXJpZXMgd2l0aCB0aGUgYmVuY2htYXJrIHBhdGNoLCBq dXN0IGFzIHdpdGggY29uc3QtZXZhbAogICBvbmUsIGFuZCByZXBvcnQgYmVmb3JlL2FmdGVyIGZv ciB5b3VyIHNlcmllcy4gCgo+ID4gUGxlYXNlIGZpbmQgYXR0YWNoZWQgYSB0ZXN0IGZvciBjb21w aWxlLXRpbWUgcm9yL3JvbCBldmFsdWF0aW9uLgo+ID4gUGxlYXNlIGNvbnNpZGVyIHByZXBlbmRp bmcgeW91ciBzZXJpZXMgd2l0aCBpdC4KPiAKPiBPa2F5LCBJJ2xsIGJyaW5nIGl0IHRvIHRoZSBu ZXh0IHNlcmllcy4KClN0aWxsIHdhaXRpbmcgZm9yIGJsb2F0LW8tbWV0ZXIgcmVzdWx0cy4KClRo YW5rcywKWXVyeQoKPiAKPiBbMV0gaHR0cHM6Ly9naXRodWIuY29tL3Jpc2N2L3Jpc2N2LWJpdG1h bmlwCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==