Release20f

The CMUCL project is pleased to announce the release of CMUCL 20f.
This is a major release which contains numerous enhancements and
bug fixes from the 20e release.

CMUCL is a free, high performance implementation of the Common Lisp
programming language which runs on most major Unix platforms. It
mainly conforms to the ANSI Common Lisp standard. CMUCL provides a
sophisticated native code compiler; a powerful foreign function
interface; an implementation of CLOS, the Common Lisp Object System,
which includes multi-methods and a meta-object protocol; a source-level
debugger and code profiler; and an Emacs-like editor implemented in
Common Lisp. CMUCL is maintained by a team of volunteers collaborating
over the Internet, and is mostly in the public domain.

New in this release:

Known issues:

Support for x87 has been dropped (effective with the 2014-05 snapshot). All further releases will require an x86 chip that supports sse2. SSE2 was introduced with the Pentium 4 in 2001.

Feature enhancements

Trig functions are significantly faster.

Accuracy of trig functions improved. (Previously, they could be off by one or two ulp.)

RUN-PROGRAM accepts :ELEMENT-TYPE to allow specifying the element type for streams that are created for RUN-PROGRAM. (See ticket:92)

Changes

Update to ASDF 3.1.3.

When *PRINT-CASE* is :DOWNCASE, integers are printed with lowercase letters when needed.

Micro-optimize KERNEL:DOUBLE-FLOAT-BITS for x86/sse2.

Add micro-optimization for unary FTRUNCATE for x86/sse2.

Compiler can derive the types of the results of DECODE-FLOAT.

Main disassembly routines in the DISASSEMBLE package accept :BASE, :CASE, and :RADIX keyword arguments, like DISASSEMBLE:DISASSEMBLE.

Micro optimizations for sse2 to allow descriptor regs and stack tns for many operations so that the operands can be in memory instead of a register, thereby removing a register load instruction.

The lisp executable is now compiled to use SSE2 on x86 machines; CMUCL will not run on chips without SSE2 anymore.

(cosh 1000d0) signals an overflow error as it should. Previously, it just incorrectly returned infinity.

Deprecating FLOAT-TRAPPING-NAN-P in favor of FLOAT-SIGNALING-NAN-P. These kinds of numbers are called signaling NaNs, not trapping NaNs.

Changed the printer to print "Signaling" instead of "Trapping" when printing a signaling NaN.

Various issues with the switch to using fdlibm have been fixed. The issues were mostly not signaling floating-point exceptions in places where they were expected.

Restore the x87 FPU support on Linux; these are required because foreign functions and libraries can still use x87 even if cmucl itself does not. This is not required on Darwin because x87 is not used there.

On the ppc port, handle FP exceptions a bit better by not failing if cmucl is unable to interpret the instruction that caused the exception.

Micro-optimization for sparc in rounding a DOUBLE-FLOAT to a 32-bit signed integer.

The compiler can now derive the type of ROUND. (But more work is needed.)

Fix an issue with multi-processing DESTROY-PROCESS doesn't take effect for a schedulable process because it has no run-reason and/or arrest-reason.

ANSI compliance fixes:

The values on the branch cuts for the inverse trig and hyperbolic functions have been updated. Instead of following the text in the CLHS, the values are defined according to the definitions in the formulas. In particular (atanh x) for x real and on the branch cut is now continuous with different quadrants. This differs from the description of the branch cut for atanh in the CLHS.

CLEAR-OUTPUT was not actually doing anything. Now, CLEAR-OUTPUT will discard any buffered data that has not been written out yet.

Bugfixes:

Fix error in pi reduction on x87. It was not noticed previously because the returned values were not used optimally.

Better error message for empty cond clauses.

Fix serious error in the complex multiply vop for sparc. Incorrect results were returned under some conditions when the result TN was packed in the same location as one of the argument TNs.

The float constants for various limits are defined for double-double floats such as LEAST-POSITIVE-DOUBLE-DOUBLE-FLOAT.

When reading very small float values, round to least-positive-foo-float if possible.