[liftoff][wasm-simd] Add allocation and spill logic for fp reg pair
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: Clemens Backes <clemensb@chromium.org> Cr-Commit-Position: refs/heads/master@{#65546}
Showing
Please
register
or
sign in
to comment