diff --git a/Userland/Libraries/LibWasm/AbstractMachine/Operators.h b/Userland/Libraries/LibWasm/AbstractMachine/Operators.h index 5d3305a0cf..a3a61589d1 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/Operators.h +++ b/Userland/Libraries/LibWasm/AbstractMachine/Operators.h @@ -431,11 +431,16 @@ struct SaturatingTruncate { // FIXME: This assumes that all values in ResultT are representable in 'double'. // that assumption is not correct, which makes this function yield incorrect values // for 'edge' values of type i64. - constexpr auto convert = [](auto truncated_value) { + constexpr auto convert = [](ConvertT truncated_value) { if (truncated_value < NumericLimits::min()) return NumericLimits::min(); - if (static_cast(truncated_value) > static_cast(NumericLimits::max())) - return NumericLimits::max(); + if constexpr (IsSame) { + if (truncated_value >= static_cast(NumericLimits::max())) + return NumericLimits::max(); + } else { + if (static_cast(truncated_value) >= static_cast(NumericLimits::max())) + return NumericLimits::max(); + } return static_cast(truncated_value); };