VM fixes for Win64 calling convention
parent
de0cc7f99a
commit
359fb6e518
|
@ -10,14 +10,18 @@ and the callstack top is passed in EDX */
|
|||
#define DS_REG %esi
|
||||
#define RETURN_REG %eax
|
||||
|
||||
#define NV_TEMP_REG %rbx
|
||||
|
||||
#define CELL_SIZE 4
|
||||
#define STACK_PADDING 12
|
||||
|
||||
#define PUSH_NONVOLATILE \
|
||||
push %ebx ; \
|
||||
push %ebp ; \
|
||||
push %ebp
|
||||
|
||||
#define POP_NONVOLATILE \
|
||||
pop %ebp ; \
|
||||
pop %ebp ; \
|
||||
pop %ebx
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#define CELL_SIZE 8
|
||||
#define STACK_PADDING 56
|
||||
|
||||
#define NV_TEMP_REG %rbp
|
||||
|
||||
#ifdef WINDOWS
|
||||
|
||||
#define ARG0 %rcx
|
||||
|
@ -20,9 +22,11 @@
|
|||
push %rdi ; \
|
||||
push %rsi ; \
|
||||
push %rbx ; \
|
||||
push %rbp ; \
|
||||
push %rbp
|
||||
|
||||
#define POP_NONVOLATILE \
|
||||
pop %rbp ; \
|
||||
pop %rbp ; \
|
||||
pop %rbx ; \
|
||||
pop %rsi ; \
|
||||
|
@ -41,9 +45,11 @@
|
|||
push %rbx ; \
|
||||
push %rbp ; \
|
||||
push %r12 ; \
|
||||
push %r13 ; \
|
||||
push %r13
|
||||
|
||||
#define POP_NONVOLATILE \
|
||||
pop %r13 ; \
|
||||
pop %r13 ; \
|
||||
pop %r12 ; \
|
||||
pop %rbp ; \
|
||||
|
|
17
vm/cpu-x86.S
17
vm/cpu-x86.S
|
@ -1,20 +1,21 @@
|
|||
DEF(F_FASTCALL void,c_to_factor,(CELL quot)):
|
||||
PUSH_NONVOLATILE
|
||||
push ARG0
|
||||
|
||||
/* Save stack pointer */
|
||||
lea -CELL_SIZE(STACK_REG),ARG0
|
||||
mov ARG0,NV_TEMP_REG
|
||||
|
||||
/* Create register shadow area for Win64 */
|
||||
sub $32,STACK_REG
|
||||
sub $32,STACK_REG
|
||||
|
||||
/* Save stack pointer */
|
||||
lea -CELL_SIZE(STACK_REG),ARG0
|
||||
call MANGLE(save_callstack_bottom)
|
||||
add $32,STACK_REG
|
||||
|
||||
/* Call quot-xt */
|
||||
mov (STACK_REG),ARG0
|
||||
mov NV_TEMP_REG,ARG0
|
||||
call *QUOT_XT_OFFSET(ARG0)
|
||||
|
||||
pop ARG0
|
||||
/* Tear down register shadow area */
|
||||
add $32,STACK_REG
|
||||
|
||||
POP_NONVOLATILE
|
||||
ret
|
||||
|
||||
|
|
Loading…
Reference in New Issue