• Benedikt Meurer's avatar
    [builtins] Support two byte strings in StringEqual builtin. · f597eec1
    Benedikt Meurer authored
    This CL adds support for two byte string comparisons to the StringEqual
    builtin, which so far was bailing out to the generic %StringEqual
    runtime function whenever any two-byte string was involved. This made
    comparisons that involved two-byte strings, either comparing them to
    one-byte strings or comparing two two-byte strings, up to 3x slower than
    if only one-byte strings were involved.
    
    With this change, all direct string (SeqString or ExternalString)
    equality checks are roughly on par now, and the weird performance cliff
    is gone. On the micro-benchmark from the bug we go from
    
      stringEqualBothOneByteSeqString: 162 ms.
      stringEqualTwoByteAndOneByteSeqString: 446 ms.
      stringEqualOneByteAndTwoByteSeqString: 438 ms.
      stringEqualBothTwoByteSeqString: 472 ms.
    
    to
    
      stringEqualBothOneByteSeqString: 151 ms.
      stringEqualTwoByteAndOneByteSeqString: 158 ms.
      stringEqualOneByteAndTwoByteSeqString: 166 ms.
      stringEqualBothTwoByteSeqString: 160 ms.
    
    which is the desired result. On the esprima test of the
    web-tooling-benchmark we seem to improve by 1-2%, which corresponds to
    the savings of going to the runtime for many StringEqual comparisons.
    
    Drive-by-cleanup: Introduce LoadAndUntagStringLength helper into the CSA
    with proper typing to avoid the unnecessary shifts on 64-bit platforms
    when keeping the length tagged initially in StringEqual.
    
    Bug: v8:4913, v8:6365, v8:6371, v8:6936, v8:7022
    Change-Id: I566f4b80e217513775ffbd35e0480154abf59b27
    Reviewed-on: https://chromium-review.googlesource.com/749223Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#49067}
    f597eec1
Name
Last commit
Last update
benchmarks Loading commit data...
build_overrides Loading commit data...
docs Loading commit data...
gni Loading commit data...
gypfiles Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.editorconfig Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.vpython Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
Makefile Loading commit data...
Makefile.android Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...