• Ng Zhi An's avatar
    [liftoff][wasm-simd] Add allocation and spill logic for fp reg pair · 83091c45
    Ng Zhi An authored
    kFpRegPair requires a bit of special case logic in allocation and spill
    logic, since it requires adjacent fp registers, with the low register
    being an even-numbered one.
    
    We make use of a shift+and trick with the reg list to check this. Given
    a bit mask of registers available, AND this with a right-shift-by-one
    version of itself, and then AND it again with with a bit mask of even
    numbered fp registers, we can get a bit mask where all available even
    registers are set.
    
    For example, given 00011011, where 1 means register is available:
    
      00011011
    &  0001101 (right shift by 1)
    ----------
      00001001
    & 01010101 (mask of even registers)
    ----------
      00000001
    
    We see that only the first fp register is available, based on the
    adjacency requirement.
    
    The mask of even registers is defined to be uint64_t, to workarond shift
    overflow issues when non-unsigned values are used, and also to make this
    work on all platforms and compilers without implicit conversion warnings.
    It is a bit wasteful, since we really only need storage_t, but since it
    is a constexpr it should be okay.
    
    The spilling case tries to be a bit smart, since there are three possible
    cases (described in the code), two of which we can spill one register,
    and in the last case we have to spill two registers. We try to
    distinguish between these cases in order to minimize spills. The dumb
    thing here is in the last case, we arbitrarily pick the first two
    registers (d0, d1) to spill.
    
    Bug: v8:9909
    Change-Id: I408f9f79b1f3c505f2fd73bad15923188ae7aaf4
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1975033
    Commit-Queue: Zhi An Ng <zhin@chromium.org>
    Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#65546}
    83091c45
Name
Last commit
Last update
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni 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...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.flake8 Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes 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...
COMMON_OWNERS Loading commit data...
DEPS Loading commit data...
ENG_REVIEW_OWNERS Loading commit data...
INFRA_OWNERS Loading commit data...
INTL_OWNERS 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...
MIPS_OWNERS Loading commit data...
OWNERS Loading commit data...
PPC_OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
S390_OWNERS Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...