From d0d6ea3c201c52118c12c218c97f44efd6252542 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Sat, 24 Jul 2021 00:18:30 +0300 Subject: [SIMD] Refactor extend helper (#4018) --- src/wasm/literal.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'src/wasm/literal.cpp') 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 (Literal::*IntoLanes)() const, - LaneOrder Side> +template Literal extend(const Literal& vec) { - LaneArray lanes = (vec.*IntoLanes)(); + LaneArray lanes = getLanes(vec); LaneArray 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 { -- cgit v1.2.3