M: ppc %load-indirect ( reg obj -- )
[ 0 swap LOAD32 ] [ rc-absolute-ppc-2/2 rel-immediate ] bi* ;
+: %load-dlsym ( symbol dll register -- )
+ 0 swap LOAD32 rc-absolute-ppc-2/2 rel-dlsym ;
+
: ds-reg 29 ; inline
: rs-reg 30 ; inline
M: ppc %not NOT ;
: %alien-invoke-tail ( func dll -- )
- 11 %load-dlsym 11 MTCTR BCTR ;
+ scratch-reg %load-dlsym scratch-reg MTCTR BCTR ;
-: exchange-regs ( r1 r2 -- )
- scratch-reg swap MR scratch-reg MR ;
+:: exchange-regs ( r1 r2 -- )
+ scratch-reg r1 MR
+ r1 r2 MR
+ r2 scratch-reg MR ;
+
+: ?MR ( r1 r2 -- ) 2dup = [ 2drop ] [ MR ] if ;
:: move>args ( src1 src2 -- )
{
[ 3 src1 MR 4 src2 MR ]
} cond ;
-:: overflow-check ( src1 src2 insn insn-o func -- )
+:: overflow-template ( src1 src2 insn func -- )
"no-overflow" define-label
0 0 LI
0 MTXER
- scratch-reg src1 src2 insn-o execute
+ scratch-reg src2 src1 insn call
scratch-reg ds-reg 0 STW
"no-overflow" get BNO
- move>args
+ src2 src1 move>args
%prepare-alien-invoke
func f %alien-invoke
"no-overflow" resolve-label ; inline
-:: overflow-check-tail ( src1 src2 insn insn-o func -- )
- "no-overflow" define-label
+:: overflow-template-tail ( src1 src2 insn func -- )
+ "overflow" define-label
0 0 LI
0 MTXER
- scratch-reg src1 src2 insn-o execute
- "no-overflow" get BNO
- move>args
+ scratch-reg src2 src1 insn call
+ "overflow" get BO
+ scratch-reg ds-reg 0 STW
+ BLR
+ "overflow" resolve-label
+ src2 src1 move>args
%prepare-alien-invoke
- func f %alien-invoke-tail
- "no-overflow" resolve-label
- scratch-reg ds-reg 0 STW ; inline
+ func f %alien-invoke-tail ;
M: ppc %fixnum-add ( src1 src2 -- )
- [ ADD ] [ ADDO. ] "overflow_fixnum_add" overflow-template ;
+ [ ADDO. ] "overflow_fixnum_add" overflow-template ;
M: ppc %fixnum-add-tail ( src1 src2 -- )
- [ ADD ] [ ADDO. ] "overflow_fixnum_add" overflow-template-tail ;
+ [ ADDO. ] "overflow_fixnum_add" overflow-template-tail ;
M: ppc %fixnum-sub ( src1 src2 -- )
- [ SUBF ] [ SUBFO. ] "overflow_fixnum_subtract" overflow-template ;
+ [ SUBFO. ] "overflow_fixnum_subtract" overflow-template ;
M: ppc %fixnum-sub-tail ( src1 src2 -- )
- [ SUBF ] [ SUBFO. ] "overflow_fixnum_subtract" overflow-template-tail ;
+ [ SUBFO. ] "overflow_fixnum_subtract" overflow-template-tail ;
-M: ppc %fixnum-mul ( src1 src2 -- )
- [ MULLW ] [ MULLWO. ] "overflow_fixnum_multiply" overflow-template ;
+M:: ppc %fixnum-mul ( src1 src2 -- )
+ "no-overflow" define-label
+ 0 0 LI
+ 0 MTXER
+ src1 src1 tag-bits get SRAWI
+ scratch-reg src1 src2 MULLWO.
+ scratch-reg ds-reg 0 STW
+ "no-overflow" get BNO
+ src2 src2 tag-bits get SRAWI
+ src1 src2 move>args
+ %prepare-alien-invoke
+ "overflow_fixnum_multiply" f %alien-invoke
+ "no-overflow" resolve-label ;
-M: ppc %fixnum-mul-tail ( src1 src2 -- )
- [ MULLW ] [ MULLWO. ] "overflow_fixnum_multiply" overflow-template-tail ;
+M:: ppc %fixnum-mul-tail ( src1 src2 -- )
+ "overflow" define-label
+ 0 0 LI
+ 0 MTXER
+ src1 src1 tag-bits get SRAWI
+ scratch-reg src1 src2 MULLWO.
+ "overflow" get BO
+ scratch-reg ds-reg 0 STW
+ BLR
+ "overflow" resolve-label
+ src2 src2 tag-bits get SRAWI
+ src1 src2 move>args
+ %prepare-alien-invoke
+ "overflow_fixnum_multiply" f %alien-invoke-tail ;
: bignum@ ( n -- offset ) cells bignum tag-number - ; inline
M: ppc %set-alien-float swap 0 STFS ;
M: ppc %set-alien-double swap 0 STFD ;
-: %load-dlsym ( symbol dll register -- )
- 0 swap LOAD32 rc-absolute-ppc-2/2 rel-dlsym ;
-
: load-zone-ptr ( reg -- )
[ "nursery" f ] dip %load-dlsym ;
#! Save Factor stack pointers in case the C code calls a
#! callback which does a GC, which must reliably trace
#! all roots.
- "stack_chain" f 11 %load-dlsym
- 11 11 0 LWZ
- 1 11 0 STW
- ds-reg 11 8 STW
- rs-reg 11 12 STW ;
+ "stack_chain" f scratch-reg %load-dlsym
+ scratch-reg scratch-reg 0 LWZ
+ 1 scratch-reg 0 STW
+ ds-reg scratch-reg 8 STW
+ rs-reg scratch-reg 12 STW ;
M: ppc %alien-invoke ( symbol dll -- )
11 %load-dlsym 11 MTLR BLRL ;