From nobody Fri Aug 25 19:23:06 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RXVGg2X0Nz4qhZb; Fri, 25 Aug 2023 19:23:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RXVGg0KZ6z3RdX; Fri, 25 Aug 2023 19:23:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692991387; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=S72LbTZpe+vjDUwnP0mkcsytnvuDIo6/C+mcGmv+9T8=; b=rnBK9pcoJ8kxHWO6gEXvHyL2+sY56OYdhmfG66XPokinXVAQgl1QFmNQnzVj3WmgNcGd/X wcGHebj7QwaTRAO3sLHBEucdGk358ECuqyKjcqj/vIOmVP2RaCji0OudD2+TVlrv3Y/CNq A1brFEJTRRIQiJNPHkxH9c6+UNqt0841F1F//JPHZb2vweadYauRycQhDtEZHzK85T7kCK NE+1d9V1pjmC3QSTjD5Ya3FN8/eRdavVXaIRsVVIwliPs+g+vC0lYFtFKeri6V6n32ZOg6 cVYFfJ60D1xogv9838TQ20pDJcB22v4fvRE7JqHyJfpgr0QNEAi4QEiTQFdB8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692991387; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=S72LbTZpe+vjDUwnP0mkcsytnvuDIo6/C+mcGmv+9T8=; b=BJpifu1JSgrDaQbgunP3MbeL36moVUrrXi9L0AE15JdzwwSBHczWZ149UkTaE8D95B+Z4s XVWp3yhbAjRLIoP7lmgzmkGWl6gOJa7r1q+HCwX3OkmGmC5pYUDq1Zjw/HzO+FvW4NRim4 e9uBM66eXHZyOd4BOMcypEL0H6N3v+/beLuMJ5aliF4wmkeQrbdO2jMIUMIOAhdl91ydfG T7rlPaTzNTI3fqZ9cGfQfLUpGzUFlNqS7PuJKHWd3jw687tVYPrEba1cL6epi7d5/cfFmz aU4g4IRVkLzpp+3EQlqr0yk8ysL8zB0X/QZjNpPd4Y5UE5ZdaCL9EFQaDRjGBw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1692991387; a=rsa-sha256; cv=none; b=gDfqg47eN2wu+pKhrrn6B73r9TZntITng5xEf3hz7Z59pTnzJH6pdFvhLRrAh3q6uHIqUz RyT3tyu8cPIJg5RMo5poCg3PiBmdmpBeSDpbxk0h11oT8ZMSqePIwW3SOp4VF4yczXifw5 TE+miJm7KJ2e0RVPcZkwqHJhI4zvia6pUClSPRLOe0SaAH10VFnLOEfLT1IG5IV+daBds9 uukMHDyUsT2axKwoH4osIz1aisxT/4qFTrLli3VvKQDJuC/n75maNgE0R5l12y90m8BXKc EmoTsoGVD0CBVNLBrvQTKkbq9PcLxNP5ya8awQmtvTMPNwhG8FbSHaxH/NbVsg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RXVGf6Vjlz1KRk; Fri, 25 Aug 2023 19:23:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37PJN625082301; Fri, 25 Aug 2023 19:23:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37PJN6EM082298; Fri, 25 Aug 2023 19:23:06 GMT (envelope-from git) Date: Fri, 25 Aug 2023 19:23:06 GMT Message-Id: <202308251923.37PJN6EM082298@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Robert Clausecker Subject: git: 3d8ef251aa9d - main - lib/libc/amd64/string/strchrnul.S: fix edge case in scalar code List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: fuz X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3d8ef251aa9dceabd57f7821a0e6749d35317db3 Auto-Submitted: auto-generated The branch main has been updated by fuz: URL: https://cgit.FreeBSD.org/src/commit/?id=3d8ef251aa9dceabd57f7821a0e6749d35317db3 commit 3d8ef251aa9dceabd57f7821a0e6749d35317db3 Author: Robert Clausecker AuthorDate: 2023-08-25 16:22:22 +0000 Commit: Robert Clausecker CommitDate: 2023-08-25 19:21:54 +0000 lib/libc/amd64/string/strchrnul.S: fix edge case in scalar code When the buffer is immediately preceeded by the character we are looking for and begins with one higher than that character, and the buffer is misaligned, a match was errorneously detected in the first character. Fix this by changing the way we prevent matches before the buffer from being detected: instead of removing the corresponding bit from the 0x80..80 mask, set the LSB of bytes before the buffer after xoring with the character we look for. The bug only affects amd64 with ARCHLEVEL=scalar (cf. simd(7)). The change comes at a 2% performance impact for short strings if ARCHLEVEL is set to scalar. The default configuration is not affected. os: FreeBSD arch: amd64 cpu: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz │ strchrnul.scalar.0.out │ strchrnul.scalar.2.out │ │ sec/op │ sec/op vs base │ Short 57.89µ ± 2% 59.08µ ± 1% +2.07% (p=0.030 n=20) Mid 19.24µ ± 0% 19.73µ ± 0% +2.53% (p=0.000 n=20) Long 11.03µ ± 0% 11.03µ ± 0% ~ (p=0.547 n=20) geomean 23.07µ 23.43µ +1.53% │ strchrnul.scalar.0.out │ strchrnul.scalar.2.out │ │ B/s │ B/s vs base │ Short 2.011Gi ± 2% 1.970Gi ± 1% -2.02% (p=0.030 n=20) Mid 6.049Gi ± 0% 5.900Gi ± 0% -2.47% (p=0.000 n=20) Long 10.56Gi ± 0% 10.56Gi ± 0% ~ (p=0.547 n=20) geomean 5.045Gi 4.969Gi -1.50% MFC to: stable/14 MFC after: 3 days Approved by: mjg (blanket, via IRC) Sponsored by: The FreeBSD Foundation --- lib/libc/amd64/string/strchrnul.S | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/libc/amd64/string/strchrnul.S b/lib/libc/amd64/string/strchrnul.S index 9aa9591b07ca..0e70b02311d7 100644 --- a/lib/libc/amd64/string/strchrnul.S +++ b/lib/libc/amd64/string/strchrnul.S @@ -52,22 +52,25 @@ ARCHENTRY(__strchrnul, scalar) movabs $0x0101010101010101, %r8 mov (%rdi), %rax # load first word imul %r8, %rsi # replicate char 8 times - movabs $0x8080808080808080, %r9 /* * Unaligned input: align to 8 bytes. Then proceed the same - * way as with aligned input, but ignore matches before the - * beginning of the string. This is achieved by shifting r9 - * into r10 to have 0x00 bytes before the string begins. + * way as with aligned input, but prevent matches before the + * beginning of the string. This is achieved by oring 0x01 + * into each byte of the buffer before the string */ shl $3, %ecx - mov %r9, %r10 + mov %r8, %r10 add $8, %rdi - shl %cl, %r10 # 0x80 where the string is + shl %cl, %r10 # 0x01 where the string is + xor %r8, %r10 # 0x01 where it is not neg %r8 # negate 01..01 so we can use lea + movabs $0x8080808080808080, %r9 mov %rsi, %rcx xor %rax, %rcx # str ^ c + or %r10, %rax # str without NUL bytes before it + or %r10, %rcx # (str ^ c) without matches before it lea (%rax, %r8, 1), %rdx # str - 0x01..01 lea (%rcx, %r8, 1), %r11 # (str ^ c) - 0x01..01 not %rax # ~str @@ -75,7 +78,7 @@ ARCHENTRY(__strchrnul, scalar) and %rdx, %rax # (str - 0x01..01) & ~str and %r11, %rcx # ((str ^ c - 0x01..01) & ~(str ^ c) or %rcx, %rax # matches for both - and %r10, %rax # not including junk bytes or bytes before the string + and %r9, %rax # not including junk bytes jnz 1f /* main loop unrolled twice */