Three benchmarks were 7-9% slower than develop on Apple M1 (Apple Clang,
-O3 -flto): Accept/jeopardy, Dump/citm_catalog, and Dump/jeopardy.
- dump(): the serializer passes a string without its closing quote, so
plain_run_end() ran out of input and called the out-of-line NEON loop
for every string, with fewer than 16 bytes left. The loop is now only
called for 16 bytes or more.
- accept(): no string of jeopardy.json reaches the vector UTF-8 check,
yet compiling it into the lexer's scan function made it 5% slower: the
function runs once per token and now saved more registers and kept a
stack slot. lexer_string_bulk_run() checks the first four words inline
and continues out of line, and the serializer keeps string_bulk_run()
inline, which is faster there.
- The byte that ends a run is read from the scanned buffer instead of
through get(), which Apple Clang merged with the other get() calls that
load the read position again right after it was stored (3%).
Signed-off-by: Niels Lohmann <mail@nlohmann.me>