@@@ fltfmt mess
[mLib] / utils / t / fltfmt.tests
diff --git a/utils/t/fltfmt.tests b/utils/t/fltfmt.tests
new file mode 100644 (file)
index 0000000..4b4c358
--- /dev/null
@@ -0,0 +1,551 @@
+;;; -*-conf-*-
+;;; Tests for floating-point conversions
+
+;;;--------------------------------------------------------------------------
+[round]
+
+;; Some easy special cases.
+
+round = nearest-even
+n = 16
+f = ZERO
+ff = ZERO
+err = OK
+
+round = nearest-even
+n = 16
+f = INF | NEG
+ff = INF | NEG
+err = OK
+
+;; Check that we round at the right bit.
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = fff00000
+ff = 0
+ee = 0
+mm = fff00000
+err = OK
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = ffe80000
+ff = 0
+ee = 0
+mm = ffe00000
+err = INEXACT
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = fff80000
+ff = 0
+ee = 1
+mm = 80000000
+err = INEXACT
+
+;; Check rounding of multi-word fractions.
+
+round = nearest-even
+n = 76
+f = 0
+e = 12
+m = ffffffff ffffffff fff00000 00000000
+ff = 0
+ee = 12
+mm = ffffffff ffffffff fff00000
+err = OK
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff fffeffff fff00000 00000001
+ff = 0
+ee = 0
+mm = ffffffff fffeffff fff00000
+err = INEXACT
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff ffffffff ffe80000 00000000
+ff = 0
+ee = 0
+mm = ffffffff ffffffff ffe00000
+err = INEXACT
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff fffeffff ffe80000 00000001
+ff = 0
+ee = 0
+mm = ffffffff fffeffff fff00000
+err = INEXACT
+
+round = nearest-even
+n = 76
+f = 0
+e = 0
+m = ffffffff fffeffff fff80000 00000000
+ff = 0
+ee = 0
+mm = ffffffff ffff0000 00000000
+err = INEXACT
+
+;; Check carry up to next exponent.
+
+round = nearest-even
+n = 76
+f = 0
+e = -18
+m = ffffffff ffffffff fff80000 00000000
+ff = 0
+ee = -17
+mm = 80000000 00000000 00000000
+err = INEXACT
+
+;; Check rounding modes.
+
+round = zero
+n = 12
+f = 0
+e = 0
+m = bfffffff
+ff = 0
+ee = 0
+mm = bff00000
+err = INEXACT
+
+round = zero
+n = 12
+f = NEG
+e = 0
+m = bfffffff
+ff = NEG
+ee = 0
+mm = bff00000
+err = INEXACT
+
+round = neginf
+n = 12
+f = 0
+e = 0
+m = bfffffff
+ff = 0
+ee = 0
+mm = bff00000
+err = INEXACT
+
+round = neginf
+n = 12
+f = NEG
+e = 0
+m = bfffffff
+ff = NEG
+ee = 0
+mm = c0000000
+err = INEXACT
+
+;; Check inexactness detection.
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = ffe00001
+ff = 0
+ee = 0
+mm = ffe00000
+err = INEXACT
+
+round = nearest-even
+n = 12
+f = 0
+e = 0
+m = fff00001
+ff = 0
+ee = 0
+mm = fff00000
+err = INEXACT
+
+;; Check rounding at word boundaries.
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000001 00000001
+ff = 0
+ee = 0
+mm = 80000001
+err = INEXACT
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000000 80000000
+ff = 0
+ee = 0
+mm = 80000000
+err = INEXACT
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000000 80000001
+ff = 0
+ee = 0
+mm = 80000001
+err = INEXACT
+
+round = nearest-even
+n = 32
+f = 0
+e = 0
+m = 80000001 80000000
+ff = 0
+ee = 0
+mm = 80000002
+err = INEXACT
+
+;;;--------------------------------------------------------------------------
+;;; IEEE conversions.
+
+[encf64]
+
+;; Check NaN truncation.
+
+errmask = 0
+f = QNAN
+m = 090cad8d 8de42000 00000000
+z = 7ff84865 6c6c6f21
+err = OK
+
+errmask = 0
+f = QNAN
+m = 090cad8d 8de43000
+z = 00000000 00000000
+err = INEXACT
+
+errmask = 0
+f = QNAN
+m = 090cad8d 8de42000 00000001
+z = 00000000 00000000
+err = INEXACT
+
+round = posinf
+errmask = INEXACT
+f = QNAN
+m = 090cad8d 8de43fff
+z = 7ff84865 6c6c6f21
+err = INEXACT
+
+;; Check subnormal underflow.
+
+errmask = 0
+f = 0
+e = -1073
+m = 80000000
+z = 00000000 00000001
+err = OK
+
+errmask = UFLOW | INEXACT
+f = 0
+e = -1074
+m = 80000000
+z = 00000000 00000000
+err = UFLOW | INEXACT
+
+round = projinf
+errmask = UFLOW | INEXACT
+f = 0
+e = -1074
+m = 80000000
+z = 00000000 00000001
+err = INEXACT
+
+round = projinf
+errmask = UFLOW | INEXACT
+f = 0
+e = -1075
+m = ffffffff
+z = 00000000 00000000
+err = UFLOW | INEXACT
+
+;; Check ordinary rounding.
+
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223800
+z = bfe44444 44444447
+err = OK
+
+errmask = 0
+f = NEG
+e = 0
+m = 22222222 22223801
+z = 00000000 00000000
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223801
+z = bfe44444 44444447
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223bff
+z = bfe44444 44444447
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223c00
+z = bfe44444 44444448
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223fff
+z = bfe44444 44444448
+err = INEXACT
+
+round = posinf
+errmask = INEXACT
+f = NEG
+e = 0
+m = 22222222 22223fff
+z = bfe44444 44444447
+err = INEXACT
+
+;; Check overflow and infinity.
+
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffff800
+z = 7fefffff ffffffff
+err = OK
+
+round = nearest-even
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffff801
+z = 7fefffff ffffffff
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffffbff
+z = 7fefffff ffffffff
+err = INEXACT
+
+round = nearest-even
+errmask = INEXACT | OFLOW
+f = 0
+e = 1024
+m = ffffffff fffffc00
+z = 7ff00000 00000000
+err = INEXACT | OFLOW
+
+round = neginf
+errmask = INEXACT | OFLOW
+f = 0
+e = 4096
+m = ffffffff
+z = 7fefffff ffffffff
+err = INEXACT
+
+[encf128]
+
+;; This was a randomized test that caught a bug.
+f = NEG
+e = 4400
+m = cd1c3727 b1c7bb96 c3668568
+z = d12e9a38 6e4f638f 772d86cd 0ad00000
+
+;;;--------------------------------------------------------------------------
+;;; Native format conversions.
+
+[encflt]
+
+f = ZERO
+z = 0.0
+
+@assume = negz
+f = NEG | ZERO
+z = -0.0
+
+@assume = inf
+f = INF
+z = #+inf
+
+@assume = inf
+f = NEG | INF
+z = #-inf
+
+f = NEG
+e = 0
+m = a0000000 00000000
+z = -0.625
+
+@assume = prec24
+f = 0
+e = 3
+m = c90fdb00
+z = 6.2831854820251465
+
+@assume = stdc-nan
+f = QNAN
+m = #empty
+z = #nan
+err = INEXACT
+
+@assume = ieee
+f = QNAN
+m = #empty
+z = #nan
+
+[decflt]
+
+x = 0.0
+f = ZERO
+
+@assume = negz
+x = -0.0
+f = NEG | ZERO
+
+x = -0.625
+f = NEG
+e = 0
+m = a0000000
+
+@assume = prec24
+x = 6.2831853
+f = 0
+e = 3
+m = c90fdb00
+
+@assume = inf
+x = #+inf
+f = INF
+
+@assume = inf
+x = #-inf
+f = NEG | INF
+
+@assume = stdc-nan
+x = #nan
+f = QNAN
+err = INEXACT
+
+@assume = ieee
+x = #nan
+f = QNAN
+m = 00000000 ; maybe
+err = OK
+
+[encdbl]
+
+f = ZERO
+z = 0.0
+
+@assume = negz
+f = NEG | ZERO
+z = -0.0
+
+@assume = inf
+f = INF
+z = #+inf
+
+@assume = inf
+f = NEG | INF
+z = #-inf
+
+f = NEG
+e = 0
+m = a0000000 00000000
+z = -0.625
+
+@assume = prec53
+f = 0
+e = 3
+m = c90fdaa2 2168c000
+z = 6.283185307179586
+
+@assume = stdc-nan
+f = QNAN
+m = #empty
+z = #nan
+err = INEXACT
+
+@assume = ieee
+f = QNAN
+m = #empty
+z = #nan
+
+[decdbl]
+
+x = 0.0
+f = ZERO
+
+@assume = negz
+x = -0.0
+f = NEG | ZERO
+
+x = -0.625
+f = NEG
+e = 0
+m = a0000000 00000000
+
+@assume = prec53
+x = 6.283185307179586
+f = 0
+e = 3
+m = c90fdaa2 2168c000
+
+@assume = inf
+x = #+inf
+f = INF
+
+@assume = inf
+x = #-inf
+f = NEG | INF
+
+@assume = stdc-nan
+x = #nan
+f = QNAN
+err = INEXACT
+
+@assume = ieee
+x = #nan
+f = QNAN
+m = 00000000 00000000 ; maybe
+err = OK
+
+;;;--------------------------------------------------------------------------