diff options
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r-- | src/wasm/literal.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 6aaba729a..b53378cfa 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -798,6 +798,20 @@ Literal Literal::wrapToI32() const { return Literal((int32_t)i64); } +Literal Literal::convertSIToF16() const { + if (type == Type::i32) { + return Literal(fp16_ieee_from_fp32_value(float(i32))); + } + WASM_UNREACHABLE("invalid type"); +} + +Literal Literal::convertUIToF16() const { + if (type == Type::i32) { + return Literal(fp16_ieee_from_fp32_value(float(uint16_t(i32)))); + } + WASM_UNREACHABLE("invalid type"); +} + Literal Literal::convertSIToF32() const { if (type == Type::i32) { return Literal(float(i32)); @@ -861,6 +875,14 @@ static Literal saturating_trunc(typename AsInt<F>::type val) { return Literal(I(std::trunc(bit_cast<F>(val)))); } +Literal Literal::truncSatToSI16() const { + if (type == Type::f32) { + return saturating_trunc<float, int16_t, isInRangeI16TruncS>( + Literal(*this).castToI32().geti32()); + } + WASM_UNREACHABLE("invalid type"); +} + Literal Literal::truncSatToSI32() const { if (type == Type::f32) { return saturating_trunc<float, int32_t, isInRangeI32TruncS>( @@ -885,6 +907,14 @@ Literal Literal::truncSatToSI64() const { WASM_UNREACHABLE("invalid type"); } +Literal Literal::truncSatToUI16() const { + if (type == Type::f32) { + return saturating_trunc<float, uint16_t, isInRangeI16TruncU>( + Literal(*this).castToI32().geti32()); + } + WASM_UNREACHABLE("invalid type"); +} + Literal Literal::truncSatToUI32() const { if (type == Type::f32) { return saturating_trunc<float, uint32_t, isInRangeI32TruncU>( @@ -1997,6 +2027,19 @@ Literal Literal::convertUToF32x4() const { return unary<4, &Literal::getLanesI32x4, &Literal::convertUIToF32>(*this); } +Literal Literal::truncSatToSI16x8() const { + return unary<8, &Literal::getLanesF16x8, &Literal::truncSatToSI16>(*this); +} +Literal Literal::truncSatToUI16x8() const { + return unary<8, &Literal::getLanesF16x8, &Literal::truncSatToUI16>(*this); +} +Literal Literal::convertSToF16x8() const { + return unary<8, &Literal::getLanesSI16x8, &Literal::convertSIToF16>(*this); +} +Literal Literal::convertUToF16x8() const { + return unary<8, &Literal::getLanesSI16x8, &Literal::convertUIToF16>(*this); +} + Literal Literal::anyTrueV128() const { auto lanes = getLanesI32x4(); for (size_t i = 0; i < 4; ++i) { |