summaryrefslogtreecommitdiff
path: root/src/wasm/literal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r--src/wasm/literal.cpp43
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) {