Saving the FPU registers

Whereas the CPU has registers with fixed names (EAX, etc), the FPU (Floating-Point Unit or co-processor) has stack-like registers which are numbered according to their position in the stack: ST(0) {top}, ST(1), ST(2), …, ST(7) {bottom}.  You deal with the FPU by loading a value onto the top of the FPU stack, or by storing the value held at the top of the stack.  The latter operation may or may not involve removing the value from the stack.

Note the term loading is used to describe placing a value on the FPU stack, yet it operates more like a PUSH operation.  In PowerBASIC, it is not a question of which FPU registers are available, but that four registers (or stack slots) are usually available for use by the programmer.  If more are required, the stack should be saved and restored accordingly.

FSAVE/FRSTOR

To preserve the entire FPU stack, the mnemonics FSAVE and FRSTOR take care of preserving, and restoring, the FPU stack (respectively).  These work in a similar way to the PUSHFD and POPFD CPU, but are notoriously slow to execute and FPU programmers often avoid their use unless necessary.  However, they can be useful when starting to write FPU code since they guarantee the preservation and restoration of the FPU stack.

 

See Also

The Inline Assembler

Saving registers

Saving Registers at the Sub/Function level

Using ESP and EBP

Tricks in preserving registers