diff options
-rw-r--r-- | src/support/safe_integer.cpp | 4 | ||||
-rw-r--r-- | test/spec/conversions.wast | 5 |
2 files changed, 5 insertions, 4 deletions
diff --git a/src/support/safe_integer.cpp b/src/support/safe_integer.cpp index 9b6b56be0..4afc7afea 100644 --- a/src/support/safe_integer.cpp +++ b/src/support/safe_integer.cpp @@ -136,7 +136,7 @@ bool wasm::isInRangeI64TruncU(int32_t i) { * 1 00000000000 0000...000000...000 0x8000000000000000 => -0 * 1 01111111110 1111...111111...111 0xbfefffffffffffff => -1 + ulp (~UINT32_MIN, ~UINT64_MIN) * 1 01111111111 0000...000000...000 0xbff0000000000000 => -1 - * 1 10000011110 0000...000000...000 0xc1e0000000000000 => -2147483648 (INT32_MIN) + * 1 10000011110 0000...000000...111 0xc1e00000001fffff => -2147483648.9999995 (rounds up to INT32_MIN) * 1 10000111110 0000...000000...000 0xc3e0000000000000 => -9223372036854775808 (INT64_MIN) * 1 11111111111 0000...000000...000 0xfff0000000000000 => -inf * 1 11111111111 0000...000000...001 0xfff0000000000001 => -nan(0x1) @@ -147,7 +147,7 @@ bool wasm::isInRangeI64TruncU(int32_t i) { bool wasm::isInRangeI32TruncS(int64_t i) { uint64_t u = i; return (u <= 0x41dfffffffffffffULL) || - (u >= 0x8000000000000000ULL && u <= 0xc1e0000000000000ULL); + (u >= 0x8000000000000000ULL && u <= 0xc1e00000001fffffULL); } bool wasm::isInRangeI32TruncU(int64_t i) { diff --git a/test/spec/conversions.wast b/test/spec/conversions.wast index 2b3e30498..4e779aa8e 100644 --- a/test/spec/conversions.wast +++ b/test/spec/conversions.wast @@ -67,8 +67,6 @@ (assert_return (invoke "i32.trunc_f32_s" (f32.const -2.0)) (i32.const -2)) (assert_return (invoke "i32.trunc_f32_s" (f32.const 2147483520.0)) (i32.const 2147483520)) (assert_return (invoke "i32.trunc_f32_s" (f32.const -2147483648.0)) (i32.const -2147483648)) -(assert_return (invoke "i32.trunc_f64_s" (f64.const 2147483647.9999998)) (i32.const 2147483647)) -(assert_trap (invoke "i32.trunc_f64_s" (f64.const 2147483647.9999999)) "integer overflow") (assert_trap (invoke "i32.trunc_f32_s" (f32.const 2147483648.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f32_s" (f32.const -2147483904.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f32_s" (f32.const inf)) "integer overflow") @@ -114,6 +112,9 @@ (assert_return (invoke "i32.trunc_f64_s" (f64.const -2.0)) (i32.const -2)) (assert_return (invoke "i32.trunc_f64_s" (f64.const 2147483647.0)) (i32.const 2147483647)) (assert_return (invoke "i32.trunc_f64_s" (f64.const -2147483648.0)) (i32.const -2147483648)) +(assert_return (invoke "i32.trunc_f64_s" (f64.const -2147483648.9999995)) (i32.const -2147483648)) +(assert_return (invoke "i32.trunc_f64_s" (f64.const 2147483647.9999998)) (i32.const 2147483647)) +(assert_trap (invoke "i32.trunc_f64_s" (f64.const 2147483647.9999999)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_s" (f64.const 2147483648.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_s" (f64.const -2147483649.0)) "integer overflow") (assert_trap (invoke "i32.trunc_f64_s" (f64.const inf)) "integer overflow") |