Code Generation

Most of the work is done by a deferred word called PFUNC. It takes source and destination operands and lays down machine code for the requested function. The interface to the target compiler only uses a few deferred words:

PFUNC ( op:s2:s1 dest -- ) Arithmetic, logic and move
^STORE ( x1 x2 operation -- ) Memory stores
^STOREA ( x1 operation -- ) Register stores
^SET ( port# value -- ) Bit set/clear
^ZERO ( operation -- ) Zero operand functions
^BRAN ( destaddr srctype op -- resaddr ) Branches
<bmark ( -- resaddr ) Mark a backward branch
>bresolve ( resaddr -- ) Resolve a forward branch

In order to generate code for a particular target, redirect these words. You can also alter the following VALUEs using TO.

Cellsize Target bytes/cell, usually 2 or 4
Cache Number of registers to use for the top of stack
MaxScratch Number of allowed scratchpad registers
Bigendian Byte order: default is little endian (0)
Bits/cell Target bits/cell
Maxshifts Maximum shift count of compiled shifts

Registers in the virtual machine:

PC Program counter
SP Data stack pointer
RP Return stack pointer, usually hardware SP
A The A register
P1,P2,... Cache for top of stack
P-1,P-2,... Scratchpad registers