cell "align" set
"box_float" "boxer" set
"unbox_float" "unboxer" set
- << float-regs f >> "reg-class" set
+ << float-regs f 4 >> "reg-class" set
] "float" define-primitive-type
[
cell 2 * "align" set
"box_double" "boxer" set
"unbox_double" "unboxer" set
- << double-regs f >> "reg-class" set
+ << float-regs f 8 >> "reg-class" set
] "double" define-primitive-type
! FIXME for 64-bit platforms
: parameters alien-node-parameters reverse ;
+: c-aligned c-size cell align ;
+
: stack-space ( parameters -- n )
- 0 swap [ c-size cell align + ] each ;
+ 0 swap [ c-aligned + ] each ;
: unbox-parameter ( n parameter -- node )
c-type [ "unboxer" get "reg-class" get ] bind %unbox ;
-: unbox-parameters ( len params -- )
- [ >r 1 - dup r> unbox-parameter ] map nip % ;
+: unbox-parameters ( params -- )
+ [ stack-space ] keep
+ [ [ c-aligned - dup ] keep unbox-parameter ] map nip % ;
: load-parameter ( n parameter -- node )
c-type "reg-class" swap hash
[
0 int-regs set
0 float-regs set
- 0 double-regs set
reverse 0 swap
- [ dupd load-parameter >r 1 + r> ] map nip
+ [ 2dup load-parameter >r c-aligned + r> ] map nip
] with-scope % ;
: linearize-parameters ( parameters -- )
#! architectures where parameters are passed in registers
#! (PowerPC).
dup stack-space %parameters ,
- [ length ] keep tuck
- unbox-parameters load-parameters ;
+ dup unbox-parameters load-parameters ;
: linearize-return ( return -- )
alien-node-return dup "void" = [
dup vop-in-1 swap vop-in-2 load-library compile-c-call ;
: stack-reserve 8 + 16 align ;
-: stack@ 3 + cell * ;
+: stack@ 12 + ;
M: %parameters generate-node ( vop -- )
vop-in-1 dup 0 =
M: int-regs return-reg drop 3 ;
M: int-regs load-insn drop 3 + 1 rot LWZ ;
-M: float-regs store-insn drop STFS ;
+M: float-regs store-insn
+ float-regs-size 4 = [ STFS ] [ STFD ] ifte ;
M: float-regs return-reg drop 1 ;
-M: float-regs load-insn drop 1 + 1 rot LFS ;
-
-M: double-regs store-insn drop STFD ;
-M: double-regs return-reg drop 1 ;
-M: double-regs load-insn drop 1 + 1 rot LFD ;
+M: float-regs load-insn
+ >r 1 + 1 rot r> float-regs-size 4 = [ LFS ] [ LFD ] ifte ;
M: %unbox generate-node ( vop -- )
[ vop-in-2 f compile-c-call ] keep
! Register classes
TUPLE: int-regs ;
-TUPLE: float-regs ;
-TUPLE: double-regs ;
+TUPLE: float-regs size ;
! A virtual operation
TUPLE: vop inputs outputs label ;
M: int-regs reg-size drop cell ;
M: int-regs push-reg drop EAX PUSH ;
-M: float-regs reg-size drop 4 ;
+M: float-regs reg-size float-reg-size ;
M: float-regs push-reg
- ESP swap reg-size SUB [ ESP ] FSTPS ;
-
-M: double-regs reg-size drop 8 ;
-M: double-regs push-reg
- ESP swap reg-size SUB [ ESP ] FSTPL ;
+ ESP swap reg-size [ SUB [ ESP ] ] keep
+ 4 = [ FSTPS ] [ FSTPL ] ifte ;
M: %unbox generate-node
dup vop-in-2 f compile-c-call vop-in-3 push-reg ;
full-gc
full-gc
] unit-test
-
-! Out of memory handling
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
-1000000 <vector> drop
printf("%f\n",z);
}
+void in_id_test(double x, int y, double z)
+{
+ printf("%f\n",x);
+ printf("%d\n",y);
+ printf("%f\n",z);
+}
+
double to_float(CELL tagged)
{
F_RATIO* r;