Taylor R Campbell [Sun, 2 Dec 2018 01:34:41 +0000 (01:34 +0000)]
Allow the full form of FLUID-LET with ACCESS.
Taylor R Campbell [Sun, 2 Dec 2018 01:33:44 +0000 (01:33 +0000)]
FLUID-LET of ACCESS broke.
(Yes, I know it's legacy, but I need it for another test at the
moment.)
Taylor R Campbell [Sun, 2 Dec 2018 01:00:20 +0000 (01:00 +0000)]
Tickled a bug in connectivity analysis with arity error.
Taylor R Campbell [Sun, 2 Dec 2018 00:14:53 +0000 (00:14 +0000)]
Compiler chokes on a variable named |#[continuation]|.
Taylor R Campbell [Sat, 1 Dec 2018 23:04:19 +0000 (23:04 +0000)]
Open-code some flonum predicates on amd64.
- flonum-is-equal?
- flonum-is-finite?
- flonum-is-infinite?
- flonum-is-nan?
- flonum-is-normal?
- flonum-is-zero?
Taylor R Campbell [Sat, 1 Dec 2018 22:50:22 +0000 (22:50 +0000)]
Teach sf about flo:safe-zero? and flo:safe=.
Taylor R Campbell [Sat, 1 Dec 2018 22:50:07 +0000 (22:50 +0000)]
Speed this up a little at the expense of coverage.
Taylor R Campbell [Sat, 1 Dec 2018 22:49:17 +0000 (22:49 +0000)]
Add some more spot checks. Zero is not exact here, for sign.
Taylor R Campbell [Sat, 1 Dec 2018 22:44:17 +0000 (22:44 +0000)]
Test some more edge cases and exception flags.
Taylor R Campbell [Sat, 1 Dec 2018 22:41:56 +0000 (22:41 +0000)]
Teach Scheme about the floating-point subnormal-operand exception.
Taylor R Campbell [Sat, 1 Dec 2018 22:39:12 +0000 (22:39 +0000)]
Make flo:clear-exceptions! register interest in fp env.
Not sure why I made it conditional before. Makes sense for
flo:raise-exceptions! for functions whose callers might or might not
want them, but usually you do flo:clear-exceptions! only if you are
actually going to use them afterward.
Taylor R Campbell [Sat, 1 Dec 2018 22:34:55 +0000 (22:34 +0000)]
Earlier change to flo:clear-exceptions! is busted.
In particular, the pattern
(flo:preserving-environment
(lambda ()
(flo:clear-exceptions! (flo:supported-exceptions))
...))
ought to give you an environment where the exceptions are cleared,
but it doesn't.
Taylor R Campbell [Sat, 1 Dec 2018 15:32:48 +0000 (15:32 +0000)]
Teach the compiler about more boolean and function primitives.
Taylor R Campbell [Sat, 1 Dec 2018 15:16:49 +0000 (15:16 +0000)]
Recursively integrate after substitution.
The declarations in this context may have changed. This way, you can
get a lot of straight-line floating-point arithmetic like so:
(define (flo:sinh-taylor19 x)
(declare (no-type-checks))
(let* ((x^2 (flo:* x x))
(t8 (flo:/ 1.
121645100408832000.))
(t7 (flo:+ (flo:/ 1.
355687428096000.) (flo:* x^2 t8)))
(t6 (flo:+ (flo:/ 1.
1307674368000.) (flo:* x^2 t7)))
(t5 (flo:+ (flo:/ 1.
6227020800.) (flo:* x^2 t6)))
(t4 (flo:+ (flo:/ 1.
39916800.) (flo:* x^2 t5)))
(t3 (flo:+ (flo:/ 1. 362880.) (flo:* x^2 t4)))
(t2 (flo:+ (flo:/ 1. 5040.) (flo:* x^2 t3)))
(t1 (flo:+ (flo:/ 1. 120.) (flo:* x^2 t2)))
(t0 (flo:+ (flo:/ 1. 6.) (flo:* x^2 t1))))
(declare (integrate t0 t1 t2 t3 t4 t5 t6 t7 t8 x^2))
(flo:* x (flo:+ 1. (flo:* x^2 t0)))))
Previously, the number of variables in this sequence that would be
integrated depended on the number of surrounding integrated calls in
the body of the let (!).
Taylor R Campbell [Sat, 1 Dec 2018 14:53:19 +0000 (14:53 +0000)]
Restore parallel compilation of compiler.
Taylor R Campbell [Sat, 1 Dec 2018 14:34:07 +0000 (14:34 +0000)]
Fix thinko.
Taylor R Campbell [Sat, 1 Dec 2018 02:09:21 +0000 (02:09 +0000)]
Use real:abs, real:copysign.
These aren't guaranteed to be flonums here.
Mixed-exactness complex numbers are pretty silly.
Taylor R Campbell [Sat, 1 Dec 2018 02:07:03 +0000 (02:07 +0000)]
Sqrt is busted on sone mixed-infinite/exact cases.
Taylor R Campbell [Sat, 1 Dec 2018 02:05:40 +0000 (02:05 +0000)]
Make ieee754-binary-hex-string follow IEEE 754-2008.
Taylor R Campbell [Fri, 30 Nov 2018 18:31:20 +0000 (18:31 +0000)]
New procedure (flo:logb x) gives the integer exponent of x.
Taylor R Campbell [Fri, 30 Nov 2018 18:06:44 +0000 (18:06 +0000)]
Implement and fix fenceposts in inf and NaN encoding.
Taylor R Campbell [Fri, 30 Nov 2018 17:42:26 +0000 (17:42 +0000)]
Use ieee754-binary-parameters to reduce magic constants.
Taylor R Campbell [Fri, 30 Nov 2018 17:42:04 +0000 (17:42 +0000)]
Fix broken hexadecimal floating-point printing.
Taylor R Campbell [Fri, 30 Nov 2018 16:24:12 +0000 (16:24 +0000)]
What was I thinking. This is all wrong if the top bit is not 1.
Taylor R Campbell [Fri, 30 Nov 2018 08:50:19 +0000 (08:50 +0000)]
Note copysign procedure.
Taylor R Campbell [Fri, 30 Nov 2018 08:47:59 +0000 (08:47 +0000)]
Remove bogus note about flo:compare and flo:safe-compare.
Never actually committed these; decided a four-way comparison wasn't
worth it without a motivating application. Won't work for anything
that expects a three-way -1/0/+1 compare.
Taylor R Campbell [Fri, 30 Nov 2018 00:43:36 +0000 (00:43 +0000)]
Open-code flo:copysign on amd64.
Taylor R Campbell [Fri, 30 Nov 2018 08:22:27 +0000 (08:22 +0000)]
Add a copysign test case that bit me in a state I can't reproduce.
Taylor R Campbell [Fri, 30 Nov 2018 07:59:04 +0000 (07:59 +0000)]
Don't futz with floenv if not in use.
Makes flo:raise-exceptions! kosher to use anywhere without incurring
cost in threads that don't care.
Taylor R Campbell [Fri, 30 Nov 2018 07:46:42 +0000 (07:46 +0000)]
Clear exceptions so residual crud doesn't trap.
Taylor R Campbell [Fri, 30 Nov 2018 07:26:07 +0000 (07:26 +0000)]
Tidy up some negative tests. No functional change intended.
Taylor R Campbell [Fri, 30 Nov 2018 07:19:49 +0000 (07:19 +0000)]
Rename flo:safe-negative? -> flo:sign-negative?.
It was confusing that (flo:safe< x 0.) was not the same as
(flo:safe-negative? x) -- they disagree on -0 and NaN values with
negative sign bits.
Taylor R Campbell [Fri, 30 Nov 2018 07:11:27 +0000 (07:11 +0000)]
Fix some things that I was mistakenly testing with an old compiler.
sqrt should not trap on qNaN, which requires some care with
comparisons. Further, since sqrt(-0) is supposed to be -0, we can't
just use flo:safe-negative? (which returns true for -0.); we must
instead use (flo:safe< x 0.) (which returns false for -0.).
Taylor R Campbell [Fri, 30 Nov 2018 06:48:05 +0000 (06:48 +0000)]
Define and expose flo:precision.
This is the same as flo:significand-digits-base-2, but its name
doesn't imply base 2 -- it refers to whatever the floating-point
radix is. Not that we're likely to do decimal floating-point ever,
but maybe you might want to write code that could be used in another
environment that does.
Taylor R Campbell [Fri, 30 Nov 2018 06:45:46 +0000 (06:45 +0000)]
Simplify and test some more exception cases.
Taylor R Campbell [Fri, 30 Nov 2018 06:37:51 +0000 (06:37 +0000)]
Test NaN preservation of sqrt.
Taylor R Campbell [Fri, 30 Nov 2018 06:29:58 +0000 (06:29 +0000)]
Handle more sqrt edge cases.
Taylor R Campbell [Fri, 30 Nov 2018 05:51:26 +0000 (05:51 +0000)]
Enable traps here to confirm they don't happen.
Taylor R Campbell [Fri, 30 Nov 2018 05:49:03 +0000 (05:49 +0000)]
Raise the appropriate exceptions in exact->exact.
- inexact-result if result is changed by rounding
- overflow if result is infinite.
Taylor R Campbell [Fri, 30 Nov 2018 05:45:06 +0000 (05:45 +0000)]
Test exceptions in exact->inexact.
Taylor R Campbell [Fri, 30 Nov 2018 05:11:35 +0000 (05:11 +0000)]
Teach exact->inexact to return infinity rather than crash.
Taylor R Campbell [Fri, 30 Nov 2018 04:43:02 +0000 (04:43 +0000)]
Test exact->inexact near integer edge cases.
Taylor R Campbell [Fri, 30 Nov 2018 04:39:18 +0000 (04:39 +0000)]
Use exact-integer-sqrt in sqrt for exact integers and rationals.
Taylor R Campbell [Fri, 30 Nov 2018 04:30:29 +0000 (04:30 +0000)]
Deduplicate test cases.
Taylor R Campbell [Fri, 30 Nov 2018 04:29:55 +0000 (04:29 +0000)]
Fix sqrt along negative real axis with inexact zero imaginary part.
Taylor R Campbell [Fri, 30 Nov 2018 04:24:20 +0000 (04:24 +0000)]
Sqrt shouldn't discard an inexact zero imaginary component.
Taylor R Campbell [Fri, 30 Nov 2018 04:13:51 +0000 (04:13 +0000)]
Test sqrt along the negative real line with/without inexact imaginary part.
Taylor R Campbell [Fri, 30 Nov 2018 03:21:44 +0000 (03:21 +0000)]
Test (sqrt -0.) = -0., per IEEE 754-2008.
Taylor R Campbell [Fri, 30 Nov 2018 03:11:48 +0000 (03:11 +0000)]
More sqrt edge cases, some working and some busted.
Taylor R Campbell [Fri, 30 Nov 2018 03:04:11 +0000 (03:04 +0000)]
Couple more sqrt edge cases.
Taylor R Campbell [Fri, 30 Nov 2018 03:01:32 +0000 (03:01 +0000)]
For +/-2i x, compute sqrt by sqrt(x) +/- i sqrt(x).
Strike off some expected failures.
Taylor R Campbell [Fri, 30 Nov 2018 02:27:07 +0000 (02:27 +0000)]
Fix branch cuts of some test cases -- no more xfail!
Taylor R Campbell [Fri, 30 Nov 2018 01:56:12 +0000 (01:56 +0000)]
Annotate where these tests rely on type and range checks.
Taylor R Campbell [Fri, 30 Nov 2018 01:54:51 +0000 (01:54 +0000)]
Define (copysign m s) = magnitude of m, sign of s.
Taylor R Campbell [Fri, 30 Nov 2018 01:26:31 +0000 (01:26 +0000)]
Add some more edge cases for sqrt.
Taylor R Campbell [Fri, 30 Nov 2018 01:03:30 +0000 (01:03 +0000)]
Test exceptions in sqrt too.
Taylor R Campbell [Fri, 30 Nov 2018 00:53:48 +0000 (00:53 +0000)]
Test flo:negate.
Taylor R Campbell [Fri, 30 Nov 2018 00:53:05 +0000 (00:53 +0000)]
Add some more sqrt edge cases.
Taylor R Campbell [Fri, 30 Nov 2018 00:47:15 +0000 (00:47 +0000)]
Fix mistranscription of opcode for UNPCKLF.
Taylor R Campbell [Thu, 29 Nov 2018 05:30:04 +0000 (05:30 +0000)]
Add some more copysign tests.
Taylor R Campbell [Thu, 29 Nov 2018 03:05:53 +0000 (03:05 +0000)]
Floating-point total ordering.
- (flo:total< x y) is true if x < y in the total ordering on
floating-point values defined in IEEE 754-2008 Sec. 5.10, i.e. this
is the totalOrder function of IEEE 754-2008 Sec. 5.7.2.
- (flo:total-order x y) is -1 if x < y, 0 if x = y, +1 if x > y in the
total ordering -- the three-way comparison version of total<.
- (flo:total-mag< x y) = (flo:total< (flo:abs x) (flo:abs y))
- (flo:total-order-mag x y)
= (flo:total-order (flo:abs x) (flo:abs y))
While here, tweak release notes on flonum stuff.
Taylor R Campbell [Thu, 29 Nov 2018 02:57:09 +0000 (02:57 +0000)]
sqrt is busted on infinities.
Taylor R Campbell [Thu, 29 Nov 2018 02:54:45 +0000 (02:54 +0000)]
Move a bunch of flonum tests to test-flonum.scm.
Let's keep test-arith.scm for higher-level numerical computations.
Taylor R Campbell [Thu, 29 Nov 2018 02:43:50 +0000 (02:43 +0000)]
Make the signature of define-enumerated-test match everyone else.
Not sure why I used vectors here in the first place.
Taylor R Campbell [Thu, 29 Nov 2018 02:12:01 +0000 (02:12 +0000)]
Note string and symbol escape printing bug.
Taylor R Campbell [Thu, 29 Nov 2018 02:11:51 +0000 (02:11 +0000)]
Note local optional parameter bug.
Taylor R Campbell [Thu, 29 Nov 2018 02:11:40 +0000 (02:11 +0000)]
Note magnitude overflow bug.
Taylor R Campbell [Thu, 29 Nov 2018 02:11:21 +0000 (02:11 +0000)]
Note flo:min/max IEEE 754-2008 conformance.
Taylor R Campbell [Thu, 29 Nov 2018 02:10:41 +0000 (02:10 +0000)]
Test more edge cases of rounding operations.
Include the rounding->exact operations too.
Taylor R Campbell [Thu, 29 Nov 2018 02:09:57 +0000 (02:09 +0000)]
Update some release notes on floating-point stuff.
Taylor R Campbell [Thu, 29 Nov 2018 02:05:51 +0000 (02:05 +0000)]
Use fabs(3) for C implementation of FLONUM-ABS.
A conditional based on < doesn't handle NaN correctly.
Taylor R Campbell [Thu, 29 Nov 2018 02:02:22 +0000 (02:02 +0000)]
Our C implementation of flo:abs is busted.
Taylor R Campbell [Thu, 29 Nov 2018 01:59:16 +0000 (01:59 +0000)]
Pass multiple arguments here. No functional change.
Taylor R Campbell [Wed, 28 Nov 2018 19:24:36 +0000 (19:24 +0000)]
New NaN-related and min/max flonum procedures and fixes.
- (flo:qnan) returns a quiet NaN: arithmetic on it quietly returns
another qNaN (usually the same one, unless there are multiple to
choose from) without raising any exception.
- (flo:snan) returns a signalling NaN: arithmetic on it returns
another sNaN (usually the same) and raises an exception, which will
trap if you ask.
- (flo:qnan? f) = (and (flo:nan? f) (flo:nan-quiet? f))
- (flo:snan? f) = (and (flo:nan? f) (not (flo:nan-quiet? f)))
- (flo:min x y) and (flo:max x y) now raise an exception only if at
least one input is a signalling NaN, and traps only if you ask.
These now implement minNum and maxNum of IEEE 754-2008.
- (flo:min-mag x y) and (flo:max-mag x y) return whichever of the
inputs has the smaller magnitude, as in minNumMag and maxNumMag in
IEEE 754-2008.
Taylor R Campbell [Wed, 28 Nov 2018 17:55:03 +0000 (17:55 +0000)]
New primitives for creating and examining NaNs.
- (flo:make-nan negative? quiet? payload)
- (flo:nan-quiet? nan)
- (flo:nan-payload nan)
Taylor R Campbell [Wed, 28 Nov 2018 17:53:31 +0000 (17:53 +0000)]
New CTASSERT macro for compile-time assertions.
Taylor R Campbell [Wed, 28 Nov 2018 17:07:36 +0000 (17:07 +0000)]
Implement flo:safe-zero? and flo:safe=.
Taylor R Campbell [Wed, 28 Nov 2018 16:55:06 +0000 (16:55 +0000)]
Merge these cases again now that the xfails are fixed.
Chris Hanson [Tue, 27 Nov 2018 07:18:35 +0000 (23:18 -0800)]
Implement binary-hash-by-X; some hair to guarantee fixnum result.
Not nearly as fast as the underlying unary hash, but for now that's OK. If need
be we can make it faster.
Chris Hanson [Mon, 26 Nov 2018 07:16:50 +0000 (23:16 -0800)]
Simplify spar-push-body.
Chris Hanson [Mon, 26 Nov 2018 01:09:37 +0000 (17:09 -0800)]
Eliminate unnecessary copy of map-in-order.
Taylor R Campbell [Wed, 28 Nov 2018 09:48:40 +0000 (09:48 +0000)]
Teach LIAR/x86-64 to open-code flo:safe-negative?.
Taylor R Campbell [Wed, 28 Nov 2018 09:19:49 +0000 (09:19 +0000)]
Correctly commute flo:safe>= to flo:safe<=, not to safe:>=.
Until LIAR's RTL code compression was taught to search through
object->float, this code path appears to have been impossible to
exercise.
Taylor R Campbell [Wed, 28 Nov 2018 09:15:45 +0000 (09:15 +0000)]
Teach RTL compression to search through object->float too.
This way it can fold (object->float (constant #x1p+0)) in both
(assign (register #x22) (object->float (constant #x1p+0))
(assign (register #x23) (offset (register 4) (machine-constant 0)))
(assign (register #x24) (object->float (register #x23)))
(jumpc (flonum-pred-2-args flonum-is-greater? (register #x22) (register #x24)) label-3)
and
(assign (register #x21) (offset (register 4) (machine-constant 0)))
(assign (register #x22) (object->float (register #x21)))
(assign (register #x24) (object->float (constant #x1p+0)))
(jumpc (flonum-pred-2-args flonum-is-greater? (register #x22) (register #x24)) label-3)
where previously it could handle only the second one because the
reference appeared in the immediately subsequent instruction.
This exposes a latent bug in the x86-64 code generator, to be fixed
in a subsequent commit.
Taylor R Campbell [Wed, 28 Nov 2018 08:53:20 +0000 (08:53 +0000)]
Taylor R Campbell [Wed, 28 Nov 2018 08:51:28 +0000 (08:51 +0000)]
Delete a rewriting rule that could not possibly have ever matched.
It would have required (object->float (object->float ...)) to appear
in the input, which makes no sense.
Taylor R Campbell [Wed, 28 Nov 2018 08:48:09 +0000 (08:48 +0000)]
Test literal operands to flonum comparators.
This is a failed attempt to trigger a compiler bug that I noticed by
code inspection.
Taylor R Campbell [Wed, 28 Nov 2018 08:47:41 +0000 (08:47 +0000)]
Make thie test actually check something by calling both.
Taylor R Campbell [Wed, 28 Nov 2018 05:33:23 +0000 (05:33 +0000)]
Re-enable invalid-operation traps here and fix the one broken test.
Should maybe add a flo:safe-zero?, or decide that flo:zero? is the
quiet version and (flo:= x 0.) is the signalling one.
Taylor R Campbell [Wed, 28 Nov 2018 05:23:10 +0000 (05:23 +0000)]
Factor out unary->binary predicate conversion.
Taylor R Campbell [Wed, 28 Nov 2018 05:18:21 +0000 (05:18 +0000)]
Add flo:<>, as (or flo:< flo:>) for now.
Taylor R Campbell [Wed, 28 Nov 2018 05:17:34 +0000 (05:17 +0000)]
Test flo:unordered? both ways too.
Taylor R Campbell [Wed, 28 Nov 2018 05:15:41 +0000 (05:15 +0000)]
Test compilation of flonum comparisons both ways.
Taylor R Campbell [Wed, 28 Nov 2018 05:03:39 +0000 (05:03 +0000)]
Run the flonum tests both compiled and interpreted.
Taylor R Campbell [Wed, 28 Nov 2018 04:47:50 +0000 (04:47 +0000)]
These tests now pass on x86-64.
Need to teach i386, svm, and C about this now.
Taylor R Campbell [Wed, 28 Nov 2018 04:45:03 +0000 (04:45 +0000)]
Test compiling in-line calls to the flonum comparators too.
Taylor R Campbell [Wed, 28 Nov 2018 04:43:18 +0000 (04:43 +0000)]
Teach LIAR/x86-64 about ordered vs unordered comparisons.
- Fix miscompilation of ordered comparisons: now the standard
comparison operators raise exceptions, which trap if you ask.
- Open-code the unordered comparisons flo:safe< &c.
Taylor R Campbell [Wed, 28 Nov 2018 03:57:18 +0000 (03:57 +0000)]
Factor out unary->binary predicate conversion.
Taylor R Campbell [Wed, 28 Nov 2018 03:48:20 +0000 (03:48 +0000)]
Explain what commute-flonum-predicate is doing.
Taylor R Campbell [Wed, 28 Nov 2018 03:45:16 +0000 (03:45 +0000)]
Teach rtlgen to open-code flo:safe-negative? too.
Disabled on all machines for now.