summaryrefslogtreecommitdiff
path: root/src/wasm/literal.cpp
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2021-07-24 00:18:30 +0300
committerGitHub <noreply@github.com>2021-07-23 14:18:30 -0700
commitd0d6ea3c201c52118c12c218c97f44efd6252542 (patch)
tree140155032dc8cf433ec0e9feea6ff6b1d700ba2a /src/wasm/literal.cpp
parent7996c8e5979147a8035e8f3ed7dfc9e02fc73152 (diff)
downloadbinaryen-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.cpp25
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 {