diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-interpreter.h | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 0843de8b4..b8fcf2509 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -359,20 +359,30 @@ public: case ExtendSInt32: return Flow(Literal(int64_t(value.geti32()))); case ExtendUInt32: return Flow(Literal(uint64_t((uint32_t)value.geti32()))); case WrapInt64: return Flow(Literal(int32_t(value.geti64()))); - case TruncSFloat32: { - float val = value.getf32(); + case TruncSFloat32: + case TruncSFloat64: { + double val = curr->op == TruncSFloat32 ? value.getf32() : value.getf64(); if (isnan(val)) instance.externalInterface->trap(); - if (val > (double)INT_MAX || val < (double)INT_MIN) instance.externalInterface->trap(); - return Flow(Literal(int32_t(val))); + if (curr->type == i32) { + if (val > (double)INT_MAX || val < (double)INT_MIN) instance.externalInterface->trap(); + return Flow(Literal(int32_t(val))); + } else { + if (val > (double)LLONG_MAX || val < (double)LLONG_MIN) instance.externalInterface->trap(); + return Flow(Literal(int64_t(val))); + } } - case TruncUFloat32: { - float val = value.getf32(); + case TruncUFloat32: + case TruncUFloat64: { + double val = curr->op == TruncUFloat32 ? value.getf32() : value.getf64(); if (isnan(val)) instance.externalInterface->trap(); - if (val > (double)UINT_MAX || val <= (double)-1) instance.externalInterface->trap(); - return Flow(Literal(uint32_t(val))); + if (curr->type == i32) { + if (val > (double)UINT_MAX || val <= (double)-1) instance.externalInterface->trap(); + return Flow(Literal(uint32_t(val))); + } else { + if (val > (double)ULLONG_MAX || val <= (double)-1) instance.externalInterface->trap(); + return Flow(Literal(uint64_t(val))); + } } - case TruncSFloat64: return Flow(Literal(int32_t(value.getf64()))); - case TruncUFloat64: return Flow(Literal(int32_t((uint32_t)value.getf64()))); case ReinterpretFloat: return curr->type == i32 ? Flow(Literal(value.reinterpreti32())) : Flow(Literal(value.reinterpreti64())); case ConvertUInt32: return Flow(Literal(double(uint32_t(value.geti32())))); case ConvertSInt32: return Flow(Literal(double(int32_t(value.geti32())))); |