opnsense-src/lib/libc/amd64
Robert Clausecker 8b81116755 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), re (gjb)
Sponsored by:	The FreeBSD Foundation

(cherry picked from commit 3d8ef251aa9dceabd57f7821a0e6749d35317db3)
2023-08-28 19:45:51 +02:00
..
gen Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
stdlib Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
string lib/libc/amd64/string/strchrnul.S: fix edge case in scalar code 2023-08-28 19:45:51 +02:00
sys Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
_fpmath.h Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:16 -06:00
amd64_archlevel.h lib/libc/amd64: add archlevel-based simd dispatch framework 2023-08-04 01:53:43 +03:00
arith.h Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:16 -06:00
gd_qnan.h Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:16 -06:00
Makefile.inc Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
static_tls.h Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:16 -06:00
Symbol.map Remove $FreeBSD$: one-line .h pattern 2023-08-16 11:54:23 -06:00
SYS.h Remove $FreeBSD$: one-line .h pattern 2023-08-16 11:54:23 -06:00