AMD64 fixes
parent
136e249f6d
commit
dacab19574
|
@ -206,10 +206,10 @@ M: x86-backend %box-small-struct ( size -- )
|
||||||
|
|
||||||
M: x86-backend %prepare-alien-indirect ( -- )
|
M: x86-backend %prepare-alien-indirect ( -- )
|
||||||
"unbox_alien" f %alien-invoke
|
"unbox_alien" f %alien-invoke
|
||||||
ESP cell temp@ [+] EAX MOV ;
|
cell temp@ EAX MOV ;
|
||||||
|
|
||||||
M: x86-backend %alien-indirect ( -- )
|
M: x86-backend %alien-indirect ( -- )
|
||||||
ESP cell temp@ [+] CALL ;
|
cell temp@ CALL ;
|
||||||
|
|
||||||
M: x86-backend %alien-callback ( quot -- )
|
M: x86-backend %alien-callback ( quot -- )
|
||||||
4 [
|
4 [
|
||||||
|
|
|
@ -16,10 +16,10 @@ M: amd64-backend stack-reg RSP ;
|
||||||
M: x86-backend xt-reg RCX ;
|
M: x86-backend xt-reg RCX ;
|
||||||
M: x86-backend stack-save-reg RSI ;
|
M: x86-backend stack-save-reg RSI ;
|
||||||
|
|
||||||
M: temp-reg v>operand drop R13 ;
|
M: temp-reg v>operand drop RBX ;
|
||||||
|
|
||||||
M: int-regs return-reg drop RAX ;
|
M: int-regs return-reg drop RAX ;
|
||||||
M: int-regs vregs drop { RAX RBX RCX RDX RBP RSI RDI R8 R9 R10 R11 R12 } ;
|
M: int-regs vregs drop { RAX RCX RDX RBP RSI RDI R8 R9 R10 R11 R12 R13 } ;
|
||||||
M: int-regs param-regs drop { RDI RSI RDX RCX R8 R9 } ;
|
M: int-regs param-regs drop { RDI RSI RDX RCX R8 R9 } ;
|
||||||
|
|
||||||
M: float-regs return-reg drop XMM0 ;
|
M: float-regs return-reg drop XMM0 ;
|
||||||
|
@ -146,17 +146,17 @@ M: amd64-backend %alien-indirect ( -- )
|
||||||
cell temp@ CALL ;
|
cell temp@ CALL ;
|
||||||
|
|
||||||
M: amd64-backend %alien-callback ( quot -- )
|
M: amd64-backend %alien-callback ( quot -- )
|
||||||
RDI load-indirect "run_callback" f compile-c-call ;
|
RDI load-indirect "c_to_factor" f compile-c-call ;
|
||||||
|
|
||||||
M: amd64-backend %callback-value ( ctype -- )
|
M: amd64-backend %callback-value ( ctype -- )
|
||||||
! Save top of data stack
|
! Save top of data stack
|
||||||
%prepare-unbox
|
%prepare-unbox
|
||||||
! Put former top of data stack in RDI
|
! Put former top of data stack in RDI
|
||||||
temp@ RDI MOV
|
cell temp@ RDI MOV
|
||||||
! Restore data/call/retain stacks
|
! Restore data/call/retain stacks
|
||||||
"unnest_stacks" f %alien-invoke
|
"unnest_stacks" f %alien-invoke
|
||||||
! Put former top of data stack in RDI
|
! Put former top of data stack in RDI
|
||||||
RDI temp@ MOV
|
RDI cell temp@ MOV
|
||||||
! Unbox former top of data stack to return registers
|
! Unbox former top of data stack to return registers
|
||||||
unbox-return ;
|
unbox-return ;
|
||||||
|
|
||||||
|
|
|
@ -150,7 +150,7 @@ M: x86-backend small-enough? ( n -- ? )
|
||||||
|
|
||||||
: %tag-fixnum ( reg -- ) tag-bits get SHL ;
|
: %tag-fixnum ( reg -- ) tag-bits get SHL ;
|
||||||
|
|
||||||
: temp@ \ stack-frame get swap - ;
|
: temp@ stack-reg \ stack-frame get rot - [+] ;
|
||||||
|
|
||||||
: struct-return@ ( size n -- n )
|
: struct-return@ ( size n -- n )
|
||||||
[
|
[
|
||||||
|
|
|
@ -29,7 +29,7 @@ DEF(FASTCALL void,dosym,(CELL word)):
|
||||||
/* Here we have two entry points. The first one is taken when profiling is
|
/* Here we have two entry points. The first one is taken when profiling is
|
||||||
enabled */
|
enabled */
|
||||||
DEF(FASTCALL void,docol_profiling,(CELL word)):
|
DEF(FASTCALL void,docol_profiling,(CELL word)):
|
||||||
add $CELL_SIZE,PROFILING_OFFSET(%eax) /* Increment profile-count slot */
|
add $CELL_SIZE,PROFILING_OFFSET(ARG0) /* Increment profile-count slot */
|
||||||
DEF(FASTCALL void,docol,(CELL word)):
|
DEF(FASTCALL void,docol,(CELL word)):
|
||||||
mov WORD_DEF_OFFSET(ARG0),ARG0 /* Load word-def slot */
|
mov WORD_DEF_OFFSET(ARG0),ARG0 /* Load word-def slot */
|
||||||
JUMP_QUOT
|
JUMP_QUOT
|
||||||
|
|
|
@ -135,6 +135,7 @@ void init_factor_from_args(F_CHAR *image, int argc, F_CHAR **argv, bool embedded
|
||||||
}
|
}
|
||||||
|
|
||||||
nest_stacks();
|
nest_stacks();
|
||||||
|
printf("%lx\n",untag_quotation(userenv[BOOT_ENV])->xt);
|
||||||
c_to_factor_toplevel(userenv[BOOT_ENV]);
|
c_to_factor_toplevel(userenv[BOOT_ENV]);
|
||||||
unnest_stacks();
|
unnest_stacks();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#define UAP_PROGRAM_COUNTER(ucontext) \
|
||||||
|
(((ucontext_t *)(ucontext))->uc_mcontext.gregs[16])
|
Loading…
Reference in New Issue