Updating x86-64 port for global register variable removal
parent
819e46f42b
commit
a77f48fe6b
|
@ -77,9 +77,9 @@ M: stack-params copy-register*
|
||||||
{ [ over integer? ] [ R11 swap MOV param@ R11 MOV ] }
|
{ [ over integer? ] [ R11 swap MOV param@ R11 MOV ] }
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: x86 %save-param-reg [ param@ ] 2dip %copy ;
|
M: x86.64 %save-param-reg [ param@ ] 2dip %copy ;
|
||||||
|
|
||||||
M: x86 %load-param-reg [ swap param@ ] dip %copy ;
|
M: x86.64 %load-param-reg [ swap param@ ] dip %copy ;
|
||||||
|
|
||||||
: with-return-regs ( quot -- )
|
: with-return-regs ( quot -- )
|
||||||
[
|
[
|
||||||
|
@ -91,6 +91,12 @@ M: x86 %load-param-reg [ swap param@ ] dip %copy ;
|
||||||
M: x86.64 %pop-stack ( n -- )
|
M: x86.64 %pop-stack ( n -- )
|
||||||
param-reg-1 swap ds-reg reg-stack MOV ;
|
param-reg-1 swap ds-reg reg-stack MOV ;
|
||||||
|
|
||||||
|
M: x86.64 %pop-context-stack ( -- )
|
||||||
|
temp-reg %load-context-datastack
|
||||||
|
param-reg-1 temp-reg [] MOV
|
||||||
|
param-reg-1 param-reg-1 [] MOV
|
||||||
|
temp-reg [] bootstrap-cell SUB ;
|
||||||
|
|
||||||
M:: x86.64 %unbox ( n rep func -- )
|
M:: x86.64 %unbox ( n rep func -- )
|
||||||
param-reg-2 %mov-vm-ptr
|
param-reg-2 %mov-vm-ptr
|
||||||
! Call the unboxer
|
! Call the unboxer
|
||||||
|
@ -206,8 +212,10 @@ M: x86.64 %unnest-stacks ( -- )
|
||||||
"unnest_stacks" f %alien-invoke ;
|
"unnest_stacks" f %alien-invoke ;
|
||||||
|
|
||||||
M: x86.64 %prepare-alien-indirect ( -- )
|
M: x86.64 %prepare-alien-indirect ( -- )
|
||||||
param-reg-1 %mov-vm-ptr
|
param-reg-1 ds-reg [] MOV
|
||||||
"unbox_alien" f %alien-invoke
|
ds-reg 8 SUB
|
||||||
|
param-reg-2 %mov-vm-ptr
|
||||||
|
"pinned_alien_offset" f %alien-invoke
|
||||||
RBP RAX MOV ;
|
RBP RAX MOV ;
|
||||||
|
|
||||||
M: x86.64 %alien-indirect ( -- )
|
M: x86.64 %alien-indirect ( -- )
|
||||||
|
@ -219,7 +227,7 @@ M: x86.64 %alien-callback ( quot -- )
|
||||||
"c_to_factor" f %alien-invoke ;
|
"c_to_factor" f %alien-invoke ;
|
||||||
|
|
||||||
M: x86.64 %callback-value ( ctype -- )
|
M: x86.64 %callback-value ( ctype -- )
|
||||||
0 %pop-stack
|
%pop-context-stack
|
||||||
RSP 8 SUB
|
RSP 8 SUB
|
||||||
param-reg-1 PUSH
|
param-reg-1 PUSH
|
||||||
param-reg-1 %mov-vm-ptr
|
param-reg-1 %mov-vm-ptr
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
! Copyright (C) 2007, 2009 Slava Pestov.
|
! Copyright (C) 2007, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: bootstrap.image.private kernel namespaces system
|
USING: bootstrap.image.private kernel kernel.private namespaces
|
||||||
layouts vocabs parser compiler.constants math math.private
|
system layouts vocabs parser compiler.constants math
|
||||||
cpu.x86.assembler cpu.x86.assembler.operands sequences
|
math.private cpu.x86.assembler cpu.x86.assembler.operands
|
||||||
generic.single.private ;
|
sequences generic.single.private ;
|
||||||
IN: bootstrap.x86
|
IN: bootstrap.x86
|
||||||
|
|
||||||
8 \ cell set
|
8 \ cell set
|
||||||
|
@ -33,23 +33,52 @@ IN: bootstrap.x86
|
||||||
RSP stack-frame-size 3 bootstrap-cells - SUB
|
RSP stack-frame-size 3 bootstrap-cells - SUB
|
||||||
] jit-prolog jit-define
|
] jit-prolog jit-define
|
||||||
|
|
||||||
|
: jit-load-vm ( -- )
|
||||||
|
RBP 0 MOV 0 rc-absolute-cell jit-vm ;
|
||||||
|
|
||||||
: jit-save-context ( -- )
|
: jit-save-context ( -- )
|
||||||
temp0 0 MOV rc-absolute-cell rt-context jit-rel
|
! VM pointer must be in RBP already
|
||||||
temp0 temp0 [] MOV
|
RCX RBP [] MOV
|
||||||
! save stack pointer
|
! save ctx->callstack_top
|
||||||
temp1 stack-reg bootstrap-cell neg [+] LEA
|
RAX RSP -8 [+] LEA
|
||||||
temp0 [] temp1 MOV ;
|
RCX [] RAX MOV
|
||||||
|
! save ctx->datastack
|
||||||
|
RCX 16 [+] ds-reg MOV
|
||||||
|
! save ctx->retainstack
|
||||||
|
RCX 24 [+] rs-reg MOV ;
|
||||||
|
|
||||||
|
: jit-restore-context ( -- )
|
||||||
|
! VM pointer must be in EBP already
|
||||||
|
RCX RBP [] MOV
|
||||||
|
! restore ctx->datastack
|
||||||
|
ds-reg RCX 16 [+] MOV
|
||||||
|
! restore ctx->retainstack
|
||||||
|
rs-reg RCX 24 [+] MOV ;
|
||||||
|
|
||||||
[
|
[
|
||||||
|
jit-load-vm
|
||||||
|
! save ds, rs registers
|
||||||
jit-save-context
|
jit-save-context
|
||||||
! load vm ptr
|
! call the primitive
|
||||||
arg1 0 MOV rc-absolute-cell rt-vm jit-rel
|
arg1 RBP MOV
|
||||||
! load XT
|
RAX 0 MOV rc-absolute-cell rt-primitive jit-rel
|
||||||
temp1 0 MOV rc-absolute-cell rt-primitive jit-rel
|
RAX CALL
|
||||||
! go
|
! restore ds, rs registers
|
||||||
temp1 CALL
|
jit-restore-context
|
||||||
] jit-primitive jit-define
|
] jit-primitive jit-define
|
||||||
|
|
||||||
|
[
|
||||||
|
! load from stack
|
||||||
|
arg1 ds-reg [] MOV
|
||||||
|
! pop stack
|
||||||
|
ds-reg bootstrap-cell SUB
|
||||||
|
! load VM pointer
|
||||||
|
arg2 0 MOV 0 rc-absolute-cell jit-vm
|
||||||
|
]
|
||||||
|
[ arg1 quot-xt-offset [+] CALL ]
|
||||||
|
[ arg1 quot-xt-offset [+] JMP ]
|
||||||
|
\ (call) define-sub-primitive*
|
||||||
|
|
||||||
! Inline cache miss entry points
|
! Inline cache miss entry points
|
||||||
: jit-load-return-address ( -- )
|
: jit-load-return-address ( -- )
|
||||||
RBX RSP stack-frame-size bootstrap-cell - [+] MOV ;
|
RBX RSP stack-frame-size bootstrap-cell - [+] MOV ;
|
||||||
|
@ -57,10 +86,13 @@ IN: bootstrap.x86
|
||||||
! These are always in tail position with an existing stack
|
! These are always in tail position with an existing stack
|
||||||
! frame, and the stack. The frame setup takes this into account.
|
! frame, and the stack. The frame setup takes this into account.
|
||||||
: jit-inline-cache-miss ( -- )
|
: jit-inline-cache-miss ( -- )
|
||||||
|
jit-load-vm
|
||||||
jit-save-context
|
jit-save-context
|
||||||
arg1 RBX MOV
|
arg1 RBX MOV
|
||||||
arg2 0 MOV 0 rc-absolute-cell jit-vm
|
arg2 RBP MOV
|
||||||
0 CALL "inline_cache_miss" f rc-relative jit-dlsym ;
|
RAX 0 MOV "inline_cache_miss" f rc-absolute-cell jit-dlsym
|
||||||
|
RAX CALL
|
||||||
|
jit-restore-context ;
|
||||||
|
|
||||||
[ jit-load-return-address jit-inline-cache-miss ]
|
[ jit-load-return-address jit-inline-cache-miss ]
|
||||||
[ RAX CALL ]
|
[ RAX CALL ]
|
||||||
|
@ -74,17 +106,19 @@ IN: bootstrap.x86
|
||||||
|
|
||||||
! Overflowing fixnum arithmetic
|
! Overflowing fixnum arithmetic
|
||||||
: jit-overflow ( insn func -- )
|
: jit-overflow ( insn func -- )
|
||||||
|
ds-reg 8 SUB
|
||||||
|
jit-load-vm
|
||||||
jit-save-context
|
jit-save-context
|
||||||
arg1 ds-reg bootstrap-cell neg [+] MOV
|
arg1 ds-reg [] MOV
|
||||||
arg2 ds-reg [] MOV
|
arg2 ds-reg 8 [+] MOV
|
||||||
ds-reg bootstrap-cell SUB
|
|
||||||
arg3 arg1 MOV
|
arg3 arg1 MOV
|
||||||
[ [ arg3 arg2 ] dip call ] dip
|
[ [ arg3 arg2 ] dip call ] dip
|
||||||
ds-reg [] arg3 MOV
|
ds-reg [] arg3 MOV
|
||||||
[ JNO ]
|
[ JNO ]
|
||||||
[
|
[
|
||||||
arg3 0 MOV 0 rc-absolute-cell jit-vm
|
arg3 RBP MOV
|
||||||
[ 0 CALL ] dip f rc-relative jit-dlsym
|
RAX 0 MOV f rc-absolute-cell jit-dlsym
|
||||||
|
RAX CALL
|
||||||
]
|
]
|
||||||
jit-conditional ; inline
|
jit-conditional ; inline
|
||||||
|
|
||||||
|
@ -93,11 +127,12 @@ IN: bootstrap.x86
|
||||||
[ [ SUB ] "overflow_fixnum_subtract" jit-overflow ] \ fixnum- define-sub-primitive
|
[ [ SUB ] "overflow_fixnum_subtract" jit-overflow ] \ fixnum- define-sub-primitive
|
||||||
|
|
||||||
[
|
[
|
||||||
|
ds-reg 8 SUB
|
||||||
|
jit-load-vm
|
||||||
jit-save-context
|
jit-save-context
|
||||||
RCX ds-reg bootstrap-cell neg [+] MOV
|
RCX ds-reg [] MOV
|
||||||
RBX ds-reg [] MOV
|
RBX ds-reg 8 [+] MOV
|
||||||
RBX tag-bits get SAR
|
RBX tag-bits get SAR
|
||||||
ds-reg bootstrap-cell SUB
|
|
||||||
RAX RCX MOV
|
RAX RCX MOV
|
||||||
RBX IMUL
|
RBX IMUL
|
||||||
ds-reg [] RAX MOV
|
ds-reg [] RAX MOV
|
||||||
|
@ -106,8 +141,9 @@ IN: bootstrap.x86
|
||||||
arg1 RCX MOV
|
arg1 RCX MOV
|
||||||
arg1 tag-bits get SAR
|
arg1 tag-bits get SAR
|
||||||
arg2 RBX MOV
|
arg2 RBX MOV
|
||||||
arg3 0 MOV 0 rc-absolute-cell jit-vm
|
arg3 RBP MOV
|
||||||
0 CALL "overflow_fixnum_multiply" f rc-relative jit-dlsym
|
RAX 0 MOV "overflow_fixnum_multiply" f rc-absolute-cell jit-dlsym
|
||||||
|
RAX CALL
|
||||||
]
|
]
|
||||||
jit-conditional
|
jit-conditional
|
||||||
] \ fixnum* define-sub-primitive
|
] \ fixnum* define-sub-primitive
|
||||||
|
|
127
vm/cpu-x86.64.S
127
vm/cpu-x86.64.S
|
@ -1,15 +1,10 @@
|
||||||
#include "asm.h"
|
#include "asm.h"
|
||||||
|
|
||||||
#define STACK_REG %rsp
|
|
||||||
#define DS_REG %r14
|
#define DS_REG %r14
|
||||||
#define RS_REG %r15
|
#define RS_REG %r15
|
||||||
#define RETURN_REG %rax
|
#define RETURN_REG %rax
|
||||||
|
|
||||||
#define CELL_SIZE 8
|
#define QUOT_XT_OFFSET 28
|
||||||
#define STACK_PADDING 56
|
|
||||||
|
|
||||||
#define NV0 %rbp
|
|
||||||
#define NV1 %r12
|
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
|
|
||||||
|
@ -63,82 +58,122 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define QUOT_XT_OFFSET 28
|
DEF(void,c_to_factor,(cell quot, void *vm)):
|
||||||
|
|
||||||
DEF(F_FASTCALL void,c_to_factor,(CELL quot, void *vm)):
|
|
||||||
PUSH_NONVOLATILE
|
PUSH_NONVOLATILE
|
||||||
mov ARG0,NV0
|
|
||||||
mov ARG1,NV1
|
|
||||||
|
|
||||||
|
/* Save old stack pointer and align */
|
||||||
|
mov %rsp,%rbp
|
||||||
|
and $-16,%rsp
|
||||||
|
push %rbp
|
||||||
|
|
||||||
|
/* Set up stack frame for the call to the boot quotation */
|
||||||
push ARG0
|
push ARG0
|
||||||
push ARG1
|
push ARG1
|
||||||
|
|
||||||
/* Create register shadow area (required for Win64 only) */
|
/* Create register shadow area (required for Win64 only) */
|
||||||
sub $32,STACK_REG
|
sub $40,%rsp
|
||||||
|
|
||||||
/* Load context */
|
/* Load context */
|
||||||
mov (NV1),ARG0
|
mov (ARG1),ARG2
|
||||||
|
|
||||||
/* Save ctx->callstack_bottom */
|
/* Save ctx->callstack_bottom */
|
||||||
lea -CELL_SIZE(STACK_REG),ARG1
|
lea -8(%rsp),ARG3
|
||||||
mov ARG1,CELL_SIZE(ARG0)
|
mov ARG3,8(ARG2)
|
||||||
|
|
||||||
/* Load ctx->datastack */
|
/* Load ctx->datastack */
|
||||||
mov (CELL_SIZE * 2)(ARG0),DS_REG
|
mov 16(ARG2),DS_REG
|
||||||
|
|
||||||
/* Load ctx->retainstack */
|
/* Load ctx->retainstack */
|
||||||
mov (CELL_SIZE * 3)(ARG0),RS_REG
|
mov 24(ARG2),RS_REG
|
||||||
|
|
||||||
/* Call quot-xt */
|
/* Call quot-xt */
|
||||||
mov NV0,ARG0
|
|
||||||
mov NV1,ARG1
|
|
||||||
call *QUOT_XT_OFFSET(ARG0)
|
call *QUOT_XT_OFFSET(ARG0)
|
||||||
|
|
||||||
/* Tear down register shadow area */
|
/* Tear down register shadow area */
|
||||||
add $32,STACK_REG
|
add $40,%rsp
|
||||||
|
|
||||||
/* Load context */
|
/* Tear down stack frame for the call to the boot quotation */
|
||||||
pop ARG1
|
pop ARG1
|
||||||
pop ARG0
|
pop ARG0
|
||||||
mov (ARG1),ARG0
|
|
||||||
|
/* Undo stack alignment */
|
||||||
|
pop %rbp
|
||||||
|
mov %rbp,%rsp
|
||||||
|
|
||||||
|
/* Load context */
|
||||||
|
mov (ARG1),ARG2
|
||||||
|
|
||||||
/* Save ctx->datastack */
|
/* Save ctx->datastack */
|
||||||
mov DS_REG,(CELL_SIZE * 2)(ARG0)
|
mov DS_REG,16(ARG2)
|
||||||
|
|
||||||
/* Save ctx->retainstack */
|
/* Save ctx->retainstack */
|
||||||
mov RS_REG,(CELL_SIZE * 3)(ARG0)
|
mov RS_REG,24(ARG2)
|
||||||
|
|
||||||
POP_NONVOLATILE
|
POP_NONVOLATILE
|
||||||
ret
|
ret
|
||||||
|
|
||||||
/* We pass a function pointer to memcpy to work around a Mac OS X
|
DEF(void,set_callstack,(void *vm, stack_frame *to, stack_frame *from, cell length)):
|
||||||
ABI limitation which would otherwise require us to do a bizzaro PC-relative
|
/* save VM pointer in non-volatile register */
|
||||||
trampoline to retrieve the function address */
|
mov ARG0,%rbp
|
||||||
DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy)):
|
|
||||||
sub ARG2,ARG0 /* compute new stack pointer */
|
|
||||||
mov ARG0,%rsp
|
|
||||||
call *ARG3 /* call memcpy */
|
|
||||||
ret /* return _with new stack_ */
|
|
||||||
|
|
||||||
DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to, void *vm)):
|
/* compute new stack pointer */
|
||||||
|
sub ARG3,ARG1
|
||||||
|
mov ARG1,%rsp
|
||||||
|
|
||||||
|
/* call memcpy */
|
||||||
|
mov ARG1,ARG0
|
||||||
|
mov ARG2,ARG1
|
||||||
|
mov ARG3,ARG2
|
||||||
|
call MANGLE(memcpy)
|
||||||
|
|
||||||
|
/* load context */
|
||||||
|
mov (%rbp),ARG2
|
||||||
|
/* load datastack */
|
||||||
|
mov 16(ARG2),DS_REG
|
||||||
|
/* load retainstack */
|
||||||
|
mov 24(ARG2),RS_REG
|
||||||
|
|
||||||
|
/* return with new stack */
|
||||||
|
ret
|
||||||
|
|
||||||
|
DEF(void,throw_impl,(cell quot, void *new_stack, void *vm)):
|
||||||
/* clear x87 stack, but preserve rounding mode and exception flags */
|
/* clear x87 stack, but preserve rounding mode and exception flags */
|
||||||
sub $2,STACK_REG
|
sub $2,%rsp
|
||||||
fnstcw (STACK_REG)
|
fnstcw (%rsp)
|
||||||
fninit
|
fninit
|
||||||
fldcw (STACK_REG)
|
fldcw (%rsp)
|
||||||
/* rewind_to */
|
|
||||||
mov ARG1,STACK_REG
|
/* shuffle args */
|
||||||
mov ARG2,ARG1 /* make vm ptr 2nd arg in case quot_xt = lazy_jit_compile_impl */
|
mov ARG1,%rsp
|
||||||
|
mov ARG2,ARG1
|
||||||
|
|
||||||
|
/* load context */
|
||||||
|
mov (ARG1),ARG2
|
||||||
|
/* load datastack */
|
||||||
|
mov 16(ARG2),DS_REG
|
||||||
|
/* load retainstack */
|
||||||
|
mov 24(ARG2),RS_REG
|
||||||
|
|
||||||
jmp *QUOT_XT_OFFSET(ARG0)
|
jmp *QUOT_XT_OFFSET(ARG0)
|
||||||
|
|
||||||
DEF(F_FASTCALL void,lazy_jit_compile_impl,(CELL quot, void *vm)):
|
DEF(void,lazy_jit_compile_impl,(cell quot, void *vm)):
|
||||||
mov ARG1,ARG2 /* vm is 3rd arg */
|
/* load context */
|
||||||
mov STACK_REG,ARG1 /* Save stack pointer */
|
mov (ARG1),ARG2
|
||||||
sub $STACK_PADDING,STACK_REG
|
/* save datastack */
|
||||||
|
mov DS_REG,16(ARG2)
|
||||||
|
/* save retainstack */
|
||||||
|
mov RS_REG,24(ARG2)
|
||||||
|
/* save callstack */
|
||||||
|
lea -8(%rsp),%rbp
|
||||||
|
mov %rbp,(ARG2)
|
||||||
|
|
||||||
|
/* compile quotation */
|
||||||
|
sub $8,%rsp
|
||||||
call MANGLE(lazy_jit_compile)
|
call MANGLE(lazy_jit_compile)
|
||||||
mov RETURN_REG,ARG0 /* No-op on 32-bit */
|
add $8,%rsp
|
||||||
add $STACK_PADDING,STACK_REG
|
|
||||||
jmp *QUOT_XT_OFFSET(ARG0) /* Call the quotation */
|
/* call quotation */
|
||||||
|
jmp *QUOT_XT_OFFSET(RETURN_REG)
|
||||||
|
|
||||||
DEF(long long,read_timestamp_counter,(void)):
|
DEF(long long,read_timestamp_counter,(void)):
|
||||||
mov $0,%rax
|
mov $0,%rax
|
||||||
|
|
Loading…
Reference in New Issue