: local@ ( n -- x )
reserved-area-size param-save-size + + ; inline
-: spill-integer@ ( n -- offset )
- spill-integer-offset local@ ;
-
-: spill-float@ ( n -- offset )
- spill-float-offset local@ ;
+: spill@ ( n -- offset )
+ spill-offset local@ ;
! Some FP intrinsics need a temporary scratch area in the stack
! frame, 8 bytes in size. This is in the param-save area so it
temp dst 1 bignum@ STW
! Compute sign
temp src MR
- temp temp cell-bits 1- SRAWI
+ temp temp cell-bits 1 - SRAWI
temp temp 1 ANDI
! Store sign
temp dst 2 bignum@ STW
fp-scratch-reg 1 0 scratch@ STFD
dst 1 4 scratch@ LWZ ;
-M: ppc %copy ( dst src -- ) MR ;
-
-M: ppc %copy-float ( dst src -- ) FMR ;
+M: ppc %copy ( dst src rep -- )
+ {
+ { int-rep [ MR ] }
+ { double-float-rep [ FMR ] }
+ } case ;
M: ppc %unbox-float ( dst src -- ) float-offset LFD ;
M: ppc %compare-imm-branch (%compare-imm) %branch ;
M: ppc %compare-float-branch (%compare-float) %branch ;
-M: ppc %spill-integer ( src n -- ) spill-integer@ 1 swap STW ;
-M: ppc %reload-integer ( dst n -- ) spill-integer@ 1 swap LWZ ;
+: load-from-frame ( dst n rep -- )
+ {
+ { int-rep [ [ 1 ] dip LWZ ] }
+ { single-float-rep [ [ 1 ] dip LFS ] }
+ { double-float-rep [ [ 1 ] dip LFD ] }
+ { stack-params [ [ 0 1 ] dip LWZ [ 0 1 ] dip param@ STW ] }
+ } case ;
-M: ppc %spill-float ( src n -- ) spill-float@ 1 swap STFD ;
-M: ppc %reload-float ( dst n -- ) spill-float@ 1 swap LFD ;
+: next-param@ ( n -- x ) param@ stack-frame get total-size>> + ;
+
+: store-to-frame ( src n rep -- )
+ {
+ { int-rep [ [ 1 ] dip STW ] }
+ { single-float-rep [ [ 1 ] dip STFS ] }
+ { double-float-rep [ [ 1 ] dip STFD ] }
+ { stack-params [ [ [ 0 1 ] dip next-param@ LWZ 0 1 ] dip STW ] }
+ } case ;
+
+M: ppc %spill ( src n rep -- )
+ [ spill@ ] dip store-to-frame ;
+
+M: ppc %reload ( dst n rep -- )
+ [ spill@ ] dip load-from-frame ;
M: ppc %loop-entry ;
M: int-regs param-regs drop { 3 4 5 6 7 8 9 10 } ;
M: float-regs return-reg drop 1 ;
-M: int-regs %save-param-reg drop 1 rot local@ STW ;
-M: int-regs %load-param-reg drop 1 rot local@ LWZ ;
-
-M: single-float-rep %save-param-reg drop 1 rot local@ STFS ;
-M: single-float-rep %load-param-reg 1 rot local@ LFS ;
-
-M: double-float-rep %save-param-reg drop 1 rot local@ STFD ;
-M: double-float-rep %load-param-reg 1 rot local@ LFD ;
-
-M: stack-params %load-param-reg ( stack reg rep -- )
- drop [ 0 1 rot local@ LWZ 0 1 ] dip param@ STW ;
-
-: next-param@ ( n -- x ) param@ stack-frame get total-size>> + ;
+M:: ppc %save-param-reg ( stack reg rep -- )
+ reg stack local@ rep store-to-frame ;
-M: stack-params %save-param-reg ( stack reg rep -- )
- #! Funky. Read the parameter from the caller's stack frame.
- #! This word is used in callbacks
- drop
- [ 0 1 ] dip next-param@ LWZ
- [ 0 1 ] dip local@ STW ;
+M:: ppc %load-param-reg ( stack reg rep -- )
+ reg stack local@ rep load-from-frame ;
M: ppc %prepare-unbox ( -- )
! First parameter is top of stack