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 DS_REG %esi
|
||||||
#define RETURN_REG %eax
|
#define RETURN_REG %eax
|
||||||
|
|
||||||
|
#define NV_TEMP_REG %rbx
|
||||||
|
|
||||||
#define CELL_SIZE 4
|
#define CELL_SIZE 4
|
||||||
#define STACK_PADDING 12
|
#define STACK_PADDING 12
|
||||||
|
|
||||||
#define PUSH_NONVOLATILE \
|
#define PUSH_NONVOLATILE \
|
||||||
push %ebx ; \
|
push %ebx ; \
|
||||||
|
push %ebp ; \
|
||||||
push %ebp
|
push %ebp
|
||||||
|
|
||||||
#define POP_NONVOLATILE \
|
#define POP_NONVOLATILE \
|
||||||
|
pop %ebp ; \
|
||||||
pop %ebp ; \
|
pop %ebp ; \
|
||||||
pop %ebx
|
pop %ebx
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#define CELL_SIZE 8
|
#define CELL_SIZE 8
|
||||||
#define STACK_PADDING 56
|
#define STACK_PADDING 56
|
||||||
|
|
||||||
|
#define NV_TEMP_REG %rbp
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
|
|
||||||
#define ARG0 %rcx
|
#define ARG0 %rcx
|
||||||
|
@ -20,9 +22,11 @@
|
||||||
push %rdi ; \
|
push %rdi ; \
|
||||||
push %rsi ; \
|
push %rsi ; \
|
||||||
push %rbx ; \
|
push %rbx ; \
|
||||||
|
push %rbp ; \
|
||||||
push %rbp
|
push %rbp
|
||||||
|
|
||||||
#define POP_NONVOLATILE \
|
#define POP_NONVOLATILE \
|
||||||
|
pop %rbp ; \
|
||||||
pop %rbp ; \
|
pop %rbp ; \
|
||||||
pop %rbx ; \
|
pop %rbx ; \
|
||||||
pop %rsi ; \
|
pop %rsi ; \
|
||||||
|
@ -41,9 +45,11 @@
|
||||||
push %rbx ; \
|
push %rbx ; \
|
||||||
push %rbp ; \
|
push %rbp ; \
|
||||||
push %r12 ; \
|
push %r12 ; \
|
||||||
|
push %r13 ; \
|
||||||
push %r13
|
push %r13
|
||||||
|
|
||||||
#define POP_NONVOLATILE \
|
#define POP_NONVOLATILE \
|
||||||
|
pop %r13 ; \
|
||||||
pop %r13 ; \
|
pop %r13 ; \
|
||||||
pop %r12 ; \
|
pop %r12 ; \
|
||||||
pop %rbp ; \
|
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)):
|
DEF(F_FASTCALL void,c_to_factor,(CELL quot)):
|
||||||
PUSH_NONVOLATILE
|
PUSH_NONVOLATILE
|
||||||
push ARG0
|
mov ARG0,NV_TEMP_REG
|
||||||
|
|
||||||
/* Save stack pointer */
|
|
||||||
lea -CELL_SIZE(STACK_REG),ARG0
|
|
||||||
|
|
||||||
/* Create register shadow area for Win64 */
|
/* 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)
|
call MANGLE(save_callstack_bottom)
|
||||||
add $32,STACK_REG
|
|
||||||
|
|
||||||
/* Call quot-xt */
|
/* Call quot-xt */
|
||||||
mov (STACK_REG),ARG0
|
mov NV_TEMP_REG,ARG0
|
||||||
call *QUOT_XT_OFFSET(ARG0)
|
call *QUOT_XT_OFFSET(ARG0)
|
||||||
|
|
||||||
pop ARG0
|
/* Tear down register shadow area */
|
||||||
|
add $32,STACK_REG
|
||||||
|
|
||||||
POP_NONVOLATILE
|
POP_NONVOLATILE
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue