• 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
string-equal.js 507 Bytes