2006-01-24 19:56:08 -05:00
|
|
|
! Copyright (C) 2005, 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2006-04-03 02:18:56 -04:00
|
|
|
IN: compiler
|
2006-01-24 19:56:08 -05:00
|
|
|
USING: alien arrays assembler kernel kernel-internals math
|
|
|
|
sequences ;
|
|
|
|
|
2006-02-23 20:29:53 -05:00
|
|
|
: stack@ RSP swap [+] ;
|
2006-01-24 19:56:08 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
M: int-regs %freg>stack drop >r stack@ r> MOV ;
|
2006-01-24 19:56:08 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
M: int-regs %stack>freg drop swap stack@ MOV ;
|
2006-01-24 20:20:20 -05:00
|
|
|
|
2006-05-04 16:05:58 -04:00
|
|
|
: MOVSS/D float-regs-size 4 = [ MOVSS ] [ MOVSD ] if ;
|
2006-01-24 20:20:20 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
M: float-regs %freg>stack >r >r stack@ r> r> MOVSS/D ;
|
2006-01-24 20:20:20 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
M: float-regs %stack>freg >r swap stack@ r> MOVSS/D ;
|
2006-01-24 19:56:08 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
M: stack-params %stack>freg
|
2006-01-30 02:03:34 -05:00
|
|
|
drop >r R11 swap stack@ MOV r> stack@ R11 MOV ;
|
2006-01-25 01:18:12 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
M: stack-params %freg>stack
|
|
|
|
>r stack-increment + cell + swap r> %stack>freg ;
|
2006-02-20 00:55:38 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: %unbox-struct ( n reg-class size -- )
|
|
|
|
nip
|
2006-02-20 00:55:38 -05:00
|
|
|
! Load destination address
|
|
|
|
RDI RSP MOV
|
2006-05-11 02:22:51 -04:00
|
|
|
RDI rot ADD
|
2006-02-20 00:55:38 -05:00
|
|
|
! Load struct size
|
2006-05-11 02:22:51 -04:00
|
|
|
RSI swap MOV
|
2006-02-20 00:55:38 -05:00
|
|
|
! Copy the struct to the stack
|
|
|
|
"unbox_value_struct" f compile-c-call ;
|
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: %unbox ( n reg-class func -- )
|
2006-01-24 19:56:08 -05:00
|
|
|
! Call the unboxer
|
2006-05-11 02:22:51 -04:00
|
|
|
f compile-c-call
|
2006-01-24 19:56:08 -05:00
|
|
|
! Store the return value on the C stack
|
2006-05-11 02:22:51 -04:00
|
|
|
[ return-reg ] keep %freg>stack ;
|
2006-01-29 22:51:26 -05:00
|
|
|
|
2006-01-24 20:20:20 -05:00
|
|
|
: load-return-value ( reg-class -- )
|
|
|
|
dup fastcall-regs first swap return-reg
|
|
|
|
2dup eq? [ 2drop ] [ MOV ] if ;
|
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: %box ( n reg-class func -- )
|
|
|
|
rot [
|
|
|
|
swap [ fastcall-regs first ] keep %stack>freg
|
2006-02-20 00:55:38 -05:00
|
|
|
] [
|
2006-05-11 02:22:51 -04:00
|
|
|
load-return-value
|
2006-02-20 00:55:38 -05:00
|
|
|
] if*
|
2006-05-11 02:22:51 -04:00
|
|
|
f compile-c-call ;
|
|
|
|
|
|
|
|
: reset-sse RAX RAX XOR ;
|
|
|
|
|
|
|
|
: %alien-invoke ( symbol dll -- )
|
|
|
|
reset-sse compile-c-call ;
|
2006-02-20 00:55:38 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: %alien-callback ( quot -- )
|
|
|
|
RDI swap load-literal "run_callback" f compile-c-call ;
|
2006-02-20 00:55:38 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: save-return 0 swap [ return-reg ] keep %freg>stack ;
|
|
|
|
: load-return 0 swap [ return-reg ] keep %stack>freg ;
|
2006-02-20 00:55:38 -05:00
|
|
|
|
2006-05-11 02:22:51 -04:00
|
|
|
: %callback-value ( reg-class func -- )
|
2006-02-20 00:55:38 -05:00
|
|
|
! Call the unboxer
|
2006-05-11 02:22:51 -04:00
|
|
|
f compile-c-call
|
2006-02-20 00:55:38 -05:00
|
|
|
! Save return register
|
2006-05-11 02:22:51 -04:00
|
|
|
dup save-return
|
2006-02-20 00:55:38 -05:00
|
|
|
! Restore data/callstacks
|
|
|
|
"unnest_stacks" f compile-c-call
|
|
|
|
! Restore return register
|
2006-05-11 02:22:51 -04:00
|
|
|
load-return ;
|