diff options
author | Max Graey <maxgraey@gmail.com> | 2021-07-24 00:18:30 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-23 14:18:30 -0700 |
commit | d0d6ea3c201c52118c12c218c97f44efd6252542 (patch) | |
tree | 140155032dc8cf433ec0e9feea6ff6b1d700ba2a /src/wasm/literal.cpp | |
parent | 7996c8e5979147a8035e8f3ed7dfc9e02fc73152 (diff) | |
download | binaryen-d0d6ea3c201c52118c12c218c97f44efd6252542.tar.gz binaryen-d0d6ea3c201c52118c12c218c97f44efd6252542.tar.bz2 binaryen-d0d6ea3c201c52118c12c218c97f44efd6252542.zip |
[SIMD] Refactor extend helper (#4018)
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r-- | src/wasm/literal.cpp | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index afaafe5e4..2c5bff5b1 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -2352,41 +2352,40 @@ Literal Literal::narrowUToVecI16x8(const Literal& other) const { enum class LaneOrder { Low, High }; -template<size_t Lanes, - LaneArray<Lanes * 2> (Literal::*IntoLanes)() const, - LaneOrder Side> +template<size_t Lanes, typename LaneFrom, typename LaneTo, LaneOrder Side> Literal extend(const Literal& vec) { - LaneArray<Lanes* 2> lanes = (vec.*IntoLanes)(); + LaneArray<Lanes* 2> lanes = getLanes<LaneFrom, Lanes * 2>(vec); LaneArray<Lanes> result; for (size_t i = 0; i < Lanes; ++i) { - result[i] = lanes[(Side == LaneOrder::Low) ? i : i + Lanes]; + size_t idx = (Side == LaneOrder::Low) ? i : i + Lanes; + result[i] = Literal((LaneTo)(LaneFrom)lanes[idx].geti32()); } return Literal(result); } Literal Literal::extendLowSToVecI16x8() const { - return extend<8, &Literal::getLanesSI8x16, LaneOrder::Low>(*this); + return extend<8, int8_t, int16_t, LaneOrder::Low>(*this); } Literal Literal::extendHighSToVecI16x8() const { - return extend<8, &Literal::getLanesSI8x16, LaneOrder::High>(*this); + return extend<8, int8_t, int16_t, LaneOrder::High>(*this); } Literal Literal::extendLowUToVecI16x8() const { - return extend<8, &Literal::getLanesUI8x16, LaneOrder::Low>(*this); + return extend<8, uint8_t, uint16_t, LaneOrder::Low>(*this); } Literal Literal::extendHighUToVecI16x8() const { - return extend<8, &Literal::getLanesUI8x16, LaneOrder::High>(*this); + return extend<8, uint8_t, uint16_t, LaneOrder::High>(*this); } Literal Literal::extendLowSToVecI32x4() const { - return extend<4, &Literal::getLanesSI16x8, LaneOrder::Low>(*this); + return extend<4, int16_t, int32_t, LaneOrder::Low>(*this); } Literal Literal::extendHighSToVecI32x4() const { - return extend<4, &Literal::getLanesSI16x8, LaneOrder::High>(*this); + return extend<4, int16_t, int32_t, LaneOrder::High>(*this); } Literal Literal::extendLowUToVecI32x4() const { - return extend<4, &Literal::getLanesUI16x8, LaneOrder::Low>(*this); + return extend<4, uint16_t, uint32_t, LaneOrder::Low>(*this); } Literal Literal::extendHighUToVecI32x4() const { - return extend<4, &Literal::getLanesUI16x8, LaneOrder::High>(*this); + return extend<4, uint16_t, uint32_t, LaneOrder::High>(*this); } Literal Literal::extMulLowSI16x8(const Literal& other) const { |