2006-02-13 22:20:39 -05:00
|
|
|
! Copyright (C) 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
IN: alien
|
2006-04-03 02:18:56 -04:00
|
|
|
USING: arrays compiler generic hashtables kernel
|
2006-02-13 22:20:39 -05:00
|
|
|
kernel-internals math namespaces sequences words ;
|
|
|
|
|
|
|
|
: parameter-size c-size cell align ;
|
|
|
|
|
|
|
|
: parameter-sizes ( types -- offsets )
|
|
|
|
#! Compute stack frame locations.
|
|
|
|
0 [ parameter-size + ] accumulate ;
|
|
|
|
|
|
|
|
: stack-space ( parameters -- n )
|
|
|
|
0 [ parameter-size + ] reduce ;
|
|
|
|
|
|
|
|
: reg-class-full? ( class -- ? )
|
|
|
|
dup class get swap fastcall-regs length >= ;
|
|
|
|
|
|
|
|
: spill-param ( reg-class -- n reg-class )
|
|
|
|
reg-size stack-params dup get -rot +@ T{ stack-params } ;
|
|
|
|
|
|
|
|
: fastcall-param ( reg-class -- n reg-class )
|
|
|
|
[ dup class get swap inc-reg-class ] keep ;
|
|
|
|
|
2006-08-15 04:57:12 -04:00
|
|
|
: alloc-parameter ( parameter -- reg reg-class )
|
2006-02-13 22:20:39 -05:00
|
|
|
#! Allocate a register and stack frame location.
|
|
|
|
#! n is a stack location, and the value of the class
|
|
|
|
#! variable is a register number.
|
|
|
|
c-type "reg-class" swap hash dup reg-class-full?
|
2006-05-11 02:22:51 -04:00
|
|
|
[ spill-param ] [ fastcall-param ] if
|
|
|
|
[ fastcall-regs nth ] keep ;
|
2006-02-13 22:20:39 -05:00
|
|
|
|
|
|
|
: flatten-value-types ( params -- params )
|
|
|
|
#! Convert value type structs to consecutive void*s.
|
|
|
|
[
|
|
|
|
dup c-struct?
|
|
|
|
[ c-size cell / "void*" <array> ] [ 1array ] if
|
|
|
|
] map concat ;
|
|
|
|
|
2006-04-28 18:38:48 -04:00
|
|
|
: each-parameter ( parameters quot -- )
|
|
|
|
>r [ parameter-sizes ] keep r> 2each ; inline
|
|
|
|
|
2006-02-13 22:20:39 -05:00
|
|
|
: reverse-each-parameter ( parameters quot -- )
|
|
|
|
>r [ parameter-sizes ] keep
|
2006-05-14 23:25:34 -04:00
|
|
|
[ <reversed> ] 2apply r> 2each ; inline
|
2006-02-13 22:20:39 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: reset-freg-counts ( -- )
|
|
|
|
0 { int-regs float-regs stack-params } [ set ] each-with ;
|
|
|
|
|
|
|
|
: move-parameters ( params word -- )
|
|
|
|
#! Moves values from C stack to registers (if word is
|
|
|
|
#! %stack>freg) and registers to C stack (if word is
|
2006-02-13 22:20:39 -05:00
|
|
|
#! %freg>stack).
|
|
|
|
swap [
|
|
|
|
flatten-value-types
|
2006-05-11 02:22:51 -04:00
|
|
|
reset-freg-counts
|
2006-04-28 18:38:48 -04:00
|
|
|
[ pick >r alloc-parameter r> execute ] each-parameter
|
|
|
|
drop
|
2006-02-13 22:20:39 -05:00
|
|
|
] with-scope ; inline
|
|
|
|
|
|
|
|
: box-parameter ( stack# type -- node )
|
2006-02-14 23:23:08 -05:00
|
|
|
c-type [ "reg-class" get "boxer" get call ] bind ;
|
|
|
|
|
2006-08-15 16:29:35 -04:00
|
|
|
: if-void ( type true false -- )
|
2006-02-14 23:23:08 -05:00
|
|
|
pick "void" = [ drop nip call ] [ nip call ] if ; inline
|
2006-02-19 23:08:00 -05:00
|
|
|
|
2006-02-23 01:33:15 -05:00
|
|
|
: compile-gc ; ! "simple_gc" f %alien-invoke , ;
|