diff options
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r-- | src/wasm/literal.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index f2100ea71..a532b92d0 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -20,6 +20,7 @@ #include <cmath> #include "emscripten-optimizer/simple_ast.h" +#include "fp16.h" #include "ir/bits.h" #include "pretty_printing.h" #include "support/bits.h" @@ -1729,6 +1730,13 @@ LaneArray<4> Literal::getLanesI32x4() const { LaneArray<2> Literal::getLanesI64x2() const { return getLanes<int64_t, 2>(*this); } +LaneArray<8> Literal::getLanesF16x8() const { + auto lanes = getLanesUI16x8(); + for (size_t i = 0; i < lanes.size(); ++i) { + lanes[i] = Literal(fp16_ieee_to_fp32_value(lanes[i].geti32())); + } + return lanes; +} LaneArray<4> Literal::getLanesF32x4() const { auto lanes = getLanesI32x4(); for (size_t i = 0; i < lanes.size(); ++i) { @@ -1766,6 +1774,10 @@ Literal Literal::splatI8x16() const { return splat<Type::i32, 16>(*this); } Literal Literal::splatI16x8() const { return splat<Type::i32, 8>(*this); } Literal Literal::splatI32x4() const { return splat<Type::i32, 4>(*this); } Literal Literal::splatI64x2() const { return splat<Type::i64, 2>(*this); } +Literal Literal::splatF16x8() const { + uint16_t f16 = fp16_ieee_from_fp32_value(getf32()); + return splat<Type::i32, 8>(Literal(f16)); +} Literal Literal::splatF32x4() const { return splat<Type::f32, 4>(*this); } Literal Literal::splatF64x2() const { return splat<Type::f64, 2>(*this); } @@ -1787,6 +1799,9 @@ Literal Literal::extractLaneI32x4(uint8_t index) const { Literal Literal::extractLaneI64x2(uint8_t index) const { return getLanesI64x2().at(index); } +Literal Literal::extractLaneF16x8(uint8_t index) const { + return getLanesF16x8().at(index); +} Literal Literal::extractLaneF32x4(uint8_t index) const { return getLanesF32x4().at(index); } @@ -1815,6 +1830,10 @@ Literal Literal::replaceLaneI32x4(const Literal& other, uint8_t index) const { Literal Literal::replaceLaneI64x2(const Literal& other, uint8_t index) const { return replace<2, &Literal::getLanesI64x2>(*this, other, index); } +Literal Literal::replaceLaneF16x8(const Literal& other, uint8_t index) const { + return replace<8, &Literal::getLanesF16x8>( + *this, Literal(fp16_ieee_from_fp32_value(other.getf32())), index); +} Literal Literal::replaceLaneF32x4(const Literal& other, uint8_t index) const { return replace<4, &Literal::getLanesF32x4>(*this, other, index); } |