Fix bug: scheme_to_interface must clear the floating-point register
authorChris Hanson <org/chris-hanson/cph>
Mon, 5 May 1997 06:59:35 +0000 (06:59 +0000)
committerChris Hanson <org/chris-hanson/cph>
Mon, 5 May 1997 06:59:35 +0000 (06:59 +0000)
commita1e28f9ce667d593bbd306601e9756deb603bedb
treed9312b82818049442f60a6fd91707dbf14cf3b3d
parent456b62ba0a9311b01590ea42931afeebbda4e91f
Fix bug: scheme_to_interface must clear the floating-point register
stack.  Otherwise, inexplicable floating-point errors can occur.  An
example of such an error can be created by typing `-1e-194' at a
freshly-booted scheme.

The actual problem is somewhat involved.  The C compiler assumes that
all of the floating-point registers are empty on the entry to any
procedure.  As a consequence of this assumption, it feels free to use
all 8 of the registers.  However, if this assumption is violated, a C
procedure that uses too many registers will signal a floating-point
stack overflow.

However, the Scheme compiler does not follow this convention; more
precisely, since it was originally designed to use reasonable
floating-point hardware, in which the floating-point registers are
organized as a bank of registers rather than a stack, it doesn't do
anything about popping registers when it is done with them.  As a
consequence, floating-point operations generated by the Scheme
compiler often leave values on the floating-point stack.

To work around this without redesigning the compiler, the
compiled-code interface clears out the stack whenever it transfers
between C and Scheme code.  The bug fixed by this revision was a
transfer point that did not have code to clear out the stack.
v7/src/microcode/cmpauxmd/i386.m4