#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
#define CELL_SIZE 8
#define STACK_PADDING 56
+#define NV_TEMP_REG %rbp
+
#ifdef WINDOWS
#define ARG0 %rcx
push %rdi ; \
push %rsi ; \
push %rbx ; \
+ push %rbp ; \
push %rbp
#define POP_NONVOLATILE \
+ pop %rbp ; \
pop %rbp ; \
pop %rbx ; \
pop %rsi ; \
push %rbx ; \
push %rbp ; \
push %r12 ; \
+ push %r13 ; \
push %r13
#define POP_NONVOLATILE \
+ pop %r13 ; \
pop %r13 ; \
pop %r12 ; \
pop %rbp ; \
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