From 15ab43a565187947ebfc95616e7c287edfd6bc0e Mon Sep 17 00:00:00 2001 From: Max Graey Date: Wed, 11 Mar 2020 20:12:32 +0200 Subject: [PATCH] Fix float to int saturate conversions (#118) Resolves #21 --- source/m3_math_utils.h | 24 ++++++++++++------------ test/run-spec-test.py | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/source/m3_math_utils.h b/source/m3_math_utils.h index 4f2e5c0..ed82b9f 100644 --- a/source/m3_math_utils.h +++ b/source/m3_math_utils.h @@ -208,26 +208,26 @@ u64 rotr64(u64 n, unsigned c) { #define OP_I64_TRUNC_F64(RES, A) OP_TRUNC(RES, A, i64, -9223372036854777856.0 , 9223372036854775808.0 ) #define OP_U64_TRUNC_F64(RES, A) OP_TRUNC(RES, A, u64, -1.0 , 18446744073709551616.0 ) -#define OP_TRUNC_SAT(RES, A, TYPE, RMIN, RMAX) \ +#define OP_TRUNC_SAT(RES, A, TYPE, RMIN, RMAX, IMIN, IMAX) \ if (UNLIKELY(isnan(A))) { \ - RES = (TYPE)0; \ + RES = 0; \ } else if (UNLIKELY(A <= RMIN)) { \ - RES = (TYPE)RMIN; \ + RES = IMIN; \ } else if (UNLIKELY(A >= RMAX)) { \ - RES = (TYPE)RMAX; \ + RES = IMAX; \ } else { \ RES = (TYPE)A; \ } -#define OP_I32_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, i32, -2147483904.0f, 2147483648.0f) -#define OP_U32_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, u32, -1.0f, 4294967296.0f) -#define OP_I32_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, i32, -2147483649.0 , 2147483648.0 ) -#define OP_U32_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, u32, -1.0 , 4294967296.0 ) +#define OP_I32_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, i32, -2147483904.0f, 2147483648.0f, -2147483648, 2147483647) +#define OP_U32_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, u32, -1.0f, 4294967296.0f, 0UL, 4294967295UL) +#define OP_I32_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, i32, -2147483649.0 , 2147483648.0, -2147483648, 2147483647) +#define OP_U32_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, u32, -1.0 , 4294967296.0, 0UL, 4294967295UL) -#define OP_I64_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, i64, -9223373136366403584.0f, 9223372036854775808.0f) -#define OP_U64_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, u64, -1.0f, 18446744073709551616.0f) -#define OP_I64_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, i64, -9223372036854777856.0 , 9223372036854775808.0 ) -#define OP_U64_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, u64, -1.0 , 18446744073709551616.0 ) +#define OP_I64_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, i64, -9223373136366403584.0f, 9223372036854775808.0f, -9223372036854775808LL, 9223372036854775807LL) +#define OP_U64_TRUNC_SAT_F32(RES, A) OP_TRUNC_SAT(RES, A, u64, -1.0f, 18446744073709551616.0f, 0ULL, 18446744073709551615ULL) +#define OP_I64_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, i64, -9223372036854777856.0 , 9223372036854775808.0, -9223372036854775808LL, 9223372036854775807LL) +#define OP_U64_TRUNC_SAT_F64(RES, A) OP_TRUNC_SAT(RES, A, u64, -1.0 , 18446744073709551616.0, 0ULL, 18446744073709551615ULL) /* * Min, Max diff --git a/test/run-spec-test.py b/test/run-spec-test.py index 5347c85..4178a59 100755 --- a/test/run-spec-test.py +++ b/test/run-spec-test.py @@ -432,7 +432,7 @@ if args.file: else: jsonFiles = glob.glob(os.path.join(".", "core", "*.json")) jsonFiles += glob.glob(os.path.join(".", "proposals", "sign-extension-ops", "*.json")) - #jsonFiles += glob.glob(os.path.join(".", "proposals", "nontrapping-float-to-int-conversions", "*.json")) + jsonFiles += glob.glob(os.path.join(".", "proposals", "nontrapping-float-to-int-conversions", "*.json")) jsonFiles = list(map(lambda x: os.path.relpath(x, scriptDir), jsonFiles)) jsonFiles.sort()