• 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
liftoff-assembler.h 35.8 KB