From b6fa245118b63e672d45974cf89414112c4ad02c Mon Sep 17 00:00:00 2001 From: Paul Dennis Date: Mon, 24 Nov 2025 14:50:33 +0100 Subject: [PATCH] add test cases for rounding variants the test cases are supposed to minimal in the sens that when you mix up the implementation with a variant of the same type the testcase can detect such oversights --- test/core/rounding-variants.wast | 149 +++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 test/core/rounding-variants.wast diff --git a/test/core/rounding-variants.wast b/test/core/rounding-variants.wast new file mode 100644 index 00000000..681e4d2c --- /dev/null +++ b/test/core/rounding-variants.wast @@ -0,0 +1,149 @@ +(module + (func (export "f32.sqrt_ceil") (param $a f32) (result f32) (f32.sqrt_ceil (local.get $a))) + (func (export "f32.add_ceil") (param $a f32) (param $b f32) (result f32) (f32.add_ceil (local.get $a) (local.get $b))) + (func (export "f32.sub_ceil") (param $a f32) (param $b f32) (result f32) (f32.sub_ceil (local.get $a) (local.get $b))) + (func (export "f32.mul_ceil") (param $a f32) (param $b f32) (result f32) (f32.mul_ceil (local.get $a) (local.get $b))) + (func (export "f32.div_ceil") (param $a f32) (param $b f32) (result f32) (f32.div_ceil (local.get $a) (local.get $b))) + (func (export "f64.sqrt_ceil") (param $a f64) (result f64) (f64.sqrt_ceil (local.get $a))) + (func (export "f64.add_ceil") (param $a f64) (param $b f64) (result f64) (f64.add_ceil (local.get $a) (local.get $b))) + (func (export "f64.sub_ceil") (param $a f64) (param $b f64) (result f64) (f64.sub_ceil (local.get $a) (local.get $b))) + (func (export "f64.mul_ceil") (param $a f64) (param $b f64) (result f64) (f64.mul_ceil (local.get $a) (local.get $b))) + (func (export "f64.div_ceil") (param $a f64) (param $b f64) (result f64) (f64.div_ceil (local.get $a) (local.get $b))) + (func (export "f32.convert_ceil_i32_s") (param $a i32) (result f32) (f32.convert_ceil_i32_s (local.get $a))) + (func (export "f32.convert_ceil_i32_u") (param $a i32) (result f32) (f32.convert_ceil_i32_u (local.get $a))) + (func (export "f32.convert_ceil_i64_s") (param $a i64) (result f32) (f32.convert_ceil_i64_s (local.get $a))) + (func (export "f32.convert_ceil_i64_u") (param $a i64) (result f32) (f32.convert_ceil_i64_u (local.get $a))) + (func (export "f32.demote_ceil_f64") (param $a f64) (result f32) (f32.demote_ceil_f64 (local.get $a))) + (func (export "f64.convert_ceil_i32_s") (param $a i32) (result f64) (f64.convert_ceil_i32_s (local.get $a))) + (func (export "f64.convert_ceil_i32_u") (param $a i32) (result f64) (f64.convert_ceil_i32_u (local.get $a))) + (func (export "f64.convert_ceil_i64_s") (param $a i64) (result f64) (f64.convert_ceil_i64_s (local.get $a))) + (func (export "f64.convert_ceil_i64_u") (param $a i64) (result f64) (f64.convert_ceil_i64_u (local.get $a))) + (func (export "f64.promote_ceil_f32") (param $a f32) (result f64) (f64.promote_ceil_f32 (local.get $a))) + (func (export "f32.sqrt_floor") (param $a f32) (result f32) (f32.sqrt_floor (local.get $a))) + (func (export "f32.add_floor") (param $a f32) (param $b f32) (result f32) (f32.add_floor (local.get $a) (local.get $b))) + (func (export "f32.sub_floor") (param $a f32) (param $b f32) (result f32) (f32.sub_floor (local.get $a) (local.get $b))) + (func (export "f32.mul_floor") (param $a f32) (param $b f32) (result f32) (f32.mul_floor (local.get $a) (local.get $b))) + (func (export "f32.div_floor") (param $a f32) (param $b f32) (result f32) (f32.div_floor (local.get $a) (local.get $b))) + (func (export "f64.sqrt_floor") (param $a f64) (result f64) (f64.sqrt_floor (local.get $a))) + (func (export "f64.add_floor") (param $a f64) (param $b f64) (result f64) (f64.add_floor (local.get $a) (local.get $b))) + (func (export "f64.sub_floor") (param $a f64) (param $b f64) (result f64) (f64.sub_floor (local.get $a) (local.get $b))) + (func (export "f64.mul_floor") (param $a f64) (param $b f64) (result f64) (f64.mul_floor (local.get $a) (local.get $b))) + (func (export "f64.div_floor") (param $a f64) (param $b f64) (result f64) (f64.div_floor (local.get $a) (local.get $b))) + (func (export "f32.convert_floor_i32_s") (param $a i32) (result f32) (f32.convert_floor_i32_s (local.get $a))) + (func (export "f32.convert_floor_i32_u") (param $a i32) (result f32) (f32.convert_floor_i32_u (local.get $a))) + (func (export "f32.convert_floor_i64_s") (param $a i64) (result f32) (f32.convert_floor_i64_s (local.get $a))) + (func (export "f32.convert_floor_i64_u") (param $a i64) (result f32) (f32.convert_floor_i64_u (local.get $a))) + (func (export "f32.demote_floor_f64") (param $a f64) (result f32) (f32.demote_floor_f64 (local.get $a))) + (func (export "f64.convert_floor_i32_s") (param $a i32) (result f64) (f64.convert_floor_i32_s (local.get $a))) + (func (export "f64.convert_floor_i32_u") (param $a i32) (result f64) (f64.convert_floor_i32_u (local.get $a))) + (func (export "f64.convert_floor_i64_s") (param $a i64) (result f64) (f64.convert_floor_i64_s (local.get $a))) + (func (export "f64.convert_floor_i64_u") (param $a i64) (result f64) (f64.convert_floor_i64_u (local.get $a))) + (func (export "f64.promote_floor_f32") (param $a f32) (result f64) (f64.promote_floor_f32 (local.get $a))) + (func (export "f32.sqrt_trunc") (param $a f32) (result f32) (f32.sqrt_trunc (local.get $a))) + (func (export "f32.add_trunc") (param $a f32) (param $b f32) (result f32) (f32.add_trunc (local.get $a) (local.get $b))) + (func (export "f32.sub_trunc") (param $a f32) (param $b f32) (result f32) (f32.sub_trunc (local.get $a) (local.get $b))) + (func (export "f32.mul_trunc") (param $a f32) (param $b f32) (result f32) (f32.mul_trunc (local.get $a) (local.get $b))) + (func (export "f32.div_trunc") (param $a f32) (param $b f32) (result f32) (f32.div_trunc (local.get $a) (local.get $b))) + (func (export "f64.sqrt_trunc") (param $a f64) (result f64) (f64.sqrt_trunc (local.get $a))) + (func (export "f64.add_trunc") (param $a f64) (param $b f64) (result f64) (f64.add_trunc (local.get $a) (local.get $b))) + (func (export "f64.sub_trunc") (param $a f64) (param $b f64) (result f64) (f64.sub_trunc (local.get $a) (local.get $b))) + (func (export "f64.mul_trunc") (param $a f64) (param $b f64) (result f64) (f64.mul_trunc (local.get $a) (local.get $b))) + (func (export "f64.div_trunc") (param $a f64) (param $b f64) (result f64) (f64.div_trunc (local.get $a) (local.get $b))) + (func (export "f32.convert_trunc_i32_s") (param $a i32) (result f32) (f32.convert_trunc_i32_s (local.get $a))) + (func (export "f32.convert_trunc_i32_u") (param $a i32) (result f32) (f32.convert_trunc_i32_u (local.get $a))) + (func (export "f32.convert_trunc_i64_s") (param $a i64) (result f32) (f32.convert_trunc_i64_s (local.get $a))) + (func (export "f32.convert_trunc_i64_u") (param $a i64) (result f32) (f32.convert_trunc_i64_u (local.get $a))) + (func (export "f32.demote_trunc_f64") (param $a f64) (result f32) (f32.demote_trunc_f64 (local.get $a))) + (func (export "f64.convert_trunc_i32_s") (param $a i32) (result f64) (f64.convert_trunc_i32_s (local.get $a))) + (func (export "f64.convert_trunc_i32_u") (param $a i32) (result f64) (f64.convert_trunc_i32_u (local.get $a))) + (func (export "f64.convert_trunc_i64_s") (param $a i64) (result f64) (f64.convert_trunc_i64_s (local.get $a))) + (func (export "f64.convert_trunc_i64_u") (param $a i64) (result f64) (f64.convert_trunc_i64_u (local.get $a))) + (func (export "f64.promote_trunc_f32") (param $a f32) (result f64) (f64.promote_trunc_f32 (local.get $a))) +) + +(assert_return (invoke "f64.sqrt_ceil" (f64.const 0x1.fffffffffffffp1023)) (f64.const 0x1p512)) +(assert_return (invoke "f64.sqrt_ceil" (f64.const 0x1.ffffffffffffep1023)) (f64.const 0x1.fffffffffffffp511)) +(assert_return (invoke "f32.convert_ceil_i32_s" (i32.const -1)) (f32.const -0x1p0)) +(assert_return (invoke "f32.convert_ceil_i32_s" (i32.const 2147483647)) (f32.const 0x1p31)) +(assert_return (invoke "f32.convert_ceil_i64_s" (i64.const 2251799817879552)) (f32.const 0x1.000002p51)) +(assert_return (invoke "f32.convert_ceil_i64_s" (i64.const -9221120237036896256)) (f32.const -0x1.ffdffep62)) +(assert_return (invoke "f64.convert_ceil_i64_s" (i64.const -9221120237036896256)) (f64.const -0x1.ffdfffffffp62)) +(assert_return (invoke "f64.convert_ceil_i64_s" (i64.const 9223372036854775807)) (f64.const 0x1p63)) +(assert_return (invoke "f64.convert_ceil_i64_u" (i64.const -9221120237036896256)) (f64.const 0x1.00100000008p63)) +(assert_return (invoke "f64.convert_ceil_i64_u" (i64.const 9223372036854775807)) (f64.const 0x1p63)) +(assert_return (invoke "f64.sqrt_floor" (f64.const 0x1.ffffffffffffdp1023)) (f64.const 0x1.ffffffffffffep511)) +(assert_return (invoke "f64.sqrt_floor" (f64.const 0x1.fffffffffffffp1023)) (f64.const 0x1.fffffffffffffp511)) +(assert_return (invoke "f64.add_floor" (f64.const 0x1.f333333333338p-983) (f64.const 0x1.3262a3d08p-1036)) (f64.const 0x1.f333333333338p-983)) +(assert_return (invoke "f64.add_floor" (f64.const -0x1.39dee72a8b9f5p527) (f64.const -0x1.fffffffffffffp1023)) (f64.const -inf)) +(assert_return (invoke "f64.add_floor" (f64.const 0x1.9738b89bc6e7fp-972) (f64.const 0x1.f333333333338p-983)) (f64.const 0x1.97771f022d4e5p-972)) +(assert_return (invoke "f64.add_floor" (f64.const -0x1.39dee72a8b9f5p527) (f64.const -0x1.fffffffffffffp1023)) (f64.const -inf)) +(assert_return (invoke "f64.sub_floor" (f64.const 0x1p-1074) (f64.const 0x1.ffffffffffffdp1023)) (f64.const -0x1.ffffffffffffdp1023)) +(assert_return (invoke "f64.sub_floor" (f64.const -0x1.2d0a2c4f1323ap-535) (f64.const 0x1.fffffffffffffp1023)) (f64.const -inf)) +(assert_return (invoke "f64.convert_floor_i64_s" (i64.const -4611686293305294848)) (f64.const -0x1.000001p62)) +(assert_return (invoke "f64.convert_floor_i64_s" (i64.const -4611694814520410111)) (f64.const -0x1.00002p62)) +(assert_return (invoke "f32.add_trunc" (f32.const -0x1.84153ep-52) (f32.const -0x1.2fe95p-72)) (f32.const -0x1.84155p-52)) +(assert_return (invoke "f32.add_trunc" (f32.const -0x1.84153ep-52) (f32.const 0x1.7f3bccp-25)) (f32.const 0x1.7f3bcap-25)) +(assert_return (invoke "f32.sub_trunc" (f32.const 0x1p-149) (f32.const 0x1.7a6bcap-3)) (f32.const -0x1.7a6bc8p-3)) +(assert_return (invoke "f32.sub_trunc" (f32.const 0x1p-149) (f32.const -0x1p1)) (f32.const 0x1p1)) +(assert_return (invoke "f32.mul_trunc" (f32.const 0x1p-149) (f32.const -0x1.84153ep-52)) (f32.const -0x0p+0)) +(assert_return (invoke "f32.mul_trunc" (f32.const 0x1p-149) (f32.const 0x1.000002p0)) (f32.const 0x1p-149)) +(assert_return (invoke "f32.div_trunc" (f32.const 0x1.7p-145) (f32.const 0x1.cep-142)) (f32.const 0x1.97d3aap-4)) +(assert_return (invoke "f32.div_trunc" (f32.const 0x1p-149) (f32.const -0x1.a3d70ap-15)) (f32.const -0x1.383p-135)) +(assert_return (invoke "f64.add_trunc" (f64.const -0x1.2d0a2c4f1323ap-535) (f64.const 0x1p0)) (f64.const 0x1.fffffffffffffp-1)) +(assert_return (invoke "f64.add_trunc" (f64.const -0x1.39dee72a8b9f5p527) (f64.const -0x1.fffffffffffffp1023)) (f64.const -0x1.fffffffffffffp1023)) +(assert_return (invoke "f64.sub_trunc" (f64.const 0x1p-1074) (f64.const 0x1p0)) (f64.const -0x1.fffffffffffffp-1)) +(assert_return (invoke "f64.sub_trunc" (f64.const 0x1p0) (f64.const 0x1.4ccccccccccccp-921)) (f64.const 0x1.fffffffffffffp-1)) +(assert_return (invoke "f64.mul_trunc" (f64.const -0x1.39dee72a8b9f5p527) (f64.const -0x1.39dee72a8b9f5p527)) (f64.const 0x1.fffffffffffffp1023)) +(assert_return (invoke "f64.mul_trunc" (f64.const -0x1.39dee72a8b9f5p527) (f64.const 0x1.3ec7a13ca219bp809)) (f64.const -0x1.fffffffffffffp1023)) +(assert_return (invoke "f64.div_trunc" (f64.const -0x1.39dee72a8b9f5p527) (f64.const 0x1p-1074)) (f64.const -0x1.fffffffffffffp1023)) +(assert_return (invoke "f64.div_trunc" (f64.const 0x1.3ec7a13ca219bp809) (f64.const 0x1p-1074)) (f64.const 0x1.fffffffffffffp1023)) +(assert_return (invoke "f32.convert_trunc_i32_s" (i32.const 1073741823)) (f32.const 0x1.fffffep29)) +(assert_return (invoke "f32.convert_trunc_i32_s" (i32.const -1073741825)) (f32.const -0x1p30)) +(assert_return (invoke "f32.convert_trunc_i64_s" (i64.const 1923660277)) (f32.const 0x1.caa2e6p30)) +(assert_return (invoke "f32.convert_trunc_i64_s" (i64.const -9223372036854775807)) (f32.const -0x0.ffffffp63)) +(assert_return (invoke "f32.demote_trunc_f64" (f64.const 0x1.d50afcab2f9p44)) (f32.const 0x1.d50afcp44)) +(assert_return (invoke "f32.demote_trunc_f64" (f64.const -0x1.d50afcab2f9p44)) (f32.const -0x1.d50afcp44)) +(assert_return (invoke "f64.convert_trunc_i64_s" (i64.const -9223372036854775807)) (f64.const -0x0.fffffffffffff8p63)) +(assert_return (invoke "f64.convert_trunc_i64_s" (i64.const 9223372036854775806)) (f64.const 0x0.fffffffffffff8p63)) + +(assert_return (invoke "f32.sqrt_ceil" (f32.const 0x1p-149)) (f32.const 0x1.6a09e8p-75)) +(assert_return (invoke "f32.add_ceil" (f32.const 0x1.fffffcp-127) (f32.const 0x1.7a6bcap-3)) (f32.const 0x1.7a6bccp-3)) +(assert_return (invoke "f32.sub_ceil" (f32.const 0x1p-149) (f32.const -0x0.ffffffp1)) (f32.const 0x1p1)) +(assert_return (invoke "f32.mul_ceil" (f32.const 0x1p-149) (f32.const 0x1.000002p0)) (f32.const 0x1p-148)) +(assert_return (invoke "f32.div_ceil" (f32.const 0x1p-149) (f32.const 0x1.fffffcp-127)) (f32.const 0x1.000004p-23)) +(assert_return (invoke "f64.add_ceil" (f64.const 0x1.7a6bca5c20a9fp-3) (f64.const 0x1.fffffffffffffp1023)) (f64.const inf)) +(assert_return (invoke "f64.sub_ceil" (f64.const 0x1.7a6bca5c20a9fp-3) (f64.const -0x1.fffffffffffffp1023)) (f64.const inf)) +(assert_return (invoke "f64.mul_ceil" (f64.const 0x1p-1074) (f64.const 0x1.9e3779b97f4a8p0)) (f64.const 0x1p-1073)) +(assert_return (invoke "f64.div_ceil" (f64.const 0x1p-1074) (f64.const 0x1.7a6bca5c20a9fp-3)) (f64.const 0x1.8p-1072)) +(assert_return (invoke "f32.convert_ceil_i32_u" (i32.const -1)) (f32.const 0x1p32)) +(assert_return (invoke "f32.convert_ceil_i64_u" (i64.const -9223372036854775807)) (f32.const 0x1.000002p63)) +(assert_return (invoke "f32.demote_ceil_f64" (f64.const 0x1.fffffcp-1052)) (f32.const 0x1p-149)) +(assert_return (invoke "f64.convert_ceil_i32_s" (i32.const -1073741825)) (f64.const -0x1.00000004p30)) +(assert_return (invoke "f64.convert_ceil_i32_u" (i32.const -1)) (f64.const 0x1.fffffffep31)) +(assert_return (invoke "f64.promote_ceil_f32" (f32.const 0x1.7a6bcap-3)) (f64.const 0x1.7a6bcap-3)) +(assert_return (invoke "f32.sqrt_floor" (f32.const 0x1p-149)) (f32.const 0x1.6a09e6p-75)) +(assert_return (invoke "f32.add_floor" (f32.const 0x1p-149) (f32.const -0x0.ffffffp1)) (f32.const -0x0.ffffffp1)) +(assert_return (invoke "f32.sub_floor" (f32.const 0x1p-149) (f32.const 0x1.7a6bcap-3)) (f32.const -0x1.7a6bcap-3)) +(assert_return (invoke "f32.mul_floor" (f32.const 0x1p-149) (f32.const -0x0.ffffffp1)) (f32.const -0x1p-148)) +(assert_return (invoke "f32.div_floor" (f32.const 0x1p-149) (f32.const -0x1p1)) (f32.const -0x1p-149)) +(assert_return (invoke "f64.mul_floor" (f64.const 0x1.3504f333f9de6p1) (f64.const -0x1.ffffffffffffdp1023)) (f64.const -inf)) +(assert_return (invoke "f64.div_floor" (f64.const 0x1.7a6bca5c20a9fp-3) (f64.const -0x1.f1e9af28p-1045)) (f64.const -inf)) +(assert_return (invoke "f32.convert_floor_i32_s" (i32.const -1073741825)) (f32.const -0x1.000002p30)) +(assert_return (invoke "f32.convert_floor_i32_u" (i32.const -1)) (f32.const 0x1.fffffep31)) +(assert_return (invoke "f32.convert_floor_i64_s" (i64.const -9223372036854775807)) (f32.const -0x1p63)) +(assert_return (invoke "f32.convert_floor_i64_u" (i64.const -9223372036854775807)) (f32.const 0x1p63)) +(assert_return (invoke "f32.demote_floor_f64" (f64.const -0x1p-1074)) (f32.const -0x1p-149)) +(assert_return (invoke "f64.convert_floor_i64_u" (i64.const -4503599627370499)) (f64.const 0x1.ffdffffffffffp63)) + +(assert_return (invoke "f64.convert_floor_i32_s" (i32.const -1073741825)) (f64.const -0x1.00000004p30)) +(assert_return (invoke "f64.convert_floor_i32_u" (i32.const -1)) (f64.const 0x1.fffffffep31)) +(assert_return (invoke "f64.promote_floor_f32" (f32.const 0x1.7a6bcap-3)) (f64.const 0x1.7a6bcap-3)) +(assert_return (invoke "f32.sqrt_trunc" (f32.const 0x1p-149)) (f32.const 0x1.6a09e6p-75)) +(assert_return (invoke "f64.sqrt_trunc" (f64.const 0x1.ffffffffffffdp1023)) (f64.const 0x1.ffffffffffffep511)) +(assert_return (invoke "f64.sqrt_trunc" (f64.const 0x1.fffffffffffffp1023)) (f64.const 0x1.fffffffffffffp511)) +(assert_return (invoke "f32.convert_trunc_i32_u" (i32.const -1)) (f32.const 0x1.fffffep31)) +(assert_return (invoke "f32.convert_trunc_i64_u" (i64.const -9223372036854775807)) (f32.const 0x1p63)) +(assert_return (invoke "f64.convert_trunc_i32_s" (i32.const -1073741825)) (f64.const -0x1.00000004p30)) +(assert_return (invoke "f64.convert_trunc_i32_u" (i32.const -1)) (f64.const 0x1.fffffffep31)) +(assert_return (invoke "f64.convert_trunc_i64_u" (i64.const -4503599627370499)) (f64.const 0x1.ffdffffffffffp63)) +(assert_return (invoke "f64.promote_trunc_f32" (f32.const 0x1.7a6bcap-3)) (f64.const 0x1.7a6bcap-3))