• 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...
cctest Loading commit data...
common Loading commit data...
debugger Loading commit data...
fuzzer Loading commit data...
inspector Loading commit data...
intl Loading commit data...
js-perf-test Loading commit data...
memory Loading commit data...
message Loading commit data...
mjsunit Loading commit data...
mkgrokdump Loading commit data...
mozilla Loading commit data...
preparser Loading commit data...
promises-aplus Loading commit data...
test262 Loading commit data...
unittests Loading commit data...
wasm-spec-tests Loading commit data...
webkit Loading commit data...
BUILD.gn Loading commit data...
bot_default.gyp Loading commit data...
bot_default.isolate Loading commit data...
default.gyp Loading commit data...
default.isolate Loading commit data...
optimize_for_size.gyp Loading commit data...
optimize_for_size.isolate Loading commit data...
perf.gyp Loading commit data...
perf.isolate Loading commit data...