diff --git a/basis/cpu/x86/64/64.factor b/basis/cpu/x86/64/64.factor index 8c713eac8b..46b1e9866f 100644 --- a/basis/cpu/x86/64/64.factor +++ b/basis/cpu/x86/64/64.factor @@ -172,9 +172,13 @@ M: x86.64 %alien-invoke rc-absolute-cell rel-dlsym R11 CALL ; -M: x86.64 %vm-invoke-1st-arg ( function -- ) f %alien-invoke ; +M: x86.64 %vm-invoke-1st-arg ( function -- ) + param-reg-1 0 MOV rc-absolute-cell rt-vm rel-fixup + f %alien-invoke ; -M: x86.64 %vm-invoke-3rd-arg ( function -- ) f %alien-invoke ; +M: x86.64 %vm-invoke-3rd-arg ( function -- ) + param-reg-3 0 MOV rc-absolute-cell rt-vm rel-fixup + f %alien-invoke ; M: x86.64 %prepare-alien-indirect ( -- ) "unbox_alien" f %alien-invoke diff --git a/vm/cpu-x86.32.S b/vm/cpu-x86.32.S index 9d2bf082d1..326ddb6eb8 100644 --- a/vm/cpu-x86.32.S +++ b/vm/cpu-x86.32.S @@ -80,7 +80,7 @@ DEF(void,set_x87_env,(const void*)): ret DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to, void *vm)): - mov CELL_SIZE(STACK_REG),NV_TEMP_REG /* stash vm ptr */ + mov CELL_SIZE(STACK_REG),NV_TEMP_REG /* get vm ptr in case quot_xt = lazy_jit_compile */ /* clear x87 stack, but preserve rounding mode and exception flags */ sub $2,STACK_REG fnstcw (STACK_REG) @@ -91,6 +91,18 @@ DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to, void *vm)): mov NV_TEMP_REG,ARG1 jmp *QUOT_XT_OFFSET(ARG0) + +DEF(F_FASTCALL void,lazy_jit_compile,(CELL quot, void *vm)): + mov ARG1,NV_TEMP_REG /* stash vm ptr */ + mov STACK_REG,ARG1 /* Save stack pointer */ + sub $STACK_PADDING,STACK_REG + push NV_TEMP_REG /* push vm ptr as arg3 */ + call MANGLE(lazy_jit_compile_impl) + pop NV_TEMP_REG + mov RETURN_REG,ARG0 /* No-op on 32-bit */ + add $STACK_PADDING,STACK_REG + jmp *QUOT_XT_OFFSET(ARG0) /* Call the quotation */ + #include "cpu-x86.S" diff --git a/vm/cpu-x86.64.S b/vm/cpu-x86.64.S index 98addeb80d..4d5c70616f 100644 --- a/vm/cpu-x86.64.S +++ b/vm/cpu-x86.64.S @@ -115,6 +115,17 @@ DEF(F_FASTCALL void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to, void *vm)): fldcw (STACK_REG) /* rewind_to */ mov ARG1,STACK_REG + mov ARG2,ARG1 /* make vm ptr 2nd arg in case quot_xt = lazy_jit_compile */ jmp *QUOT_XT_OFFSET(ARG0) + +DEF(F_FASTCALL void,lazy_jit_compile,(CELL quot, void *vm)): + mov ARG1,ARG2 /* vm is 3rd arg */ + mov STACK_REG,ARG1 /* Save stack pointer */ + sub $STACK_PADDING,STACK_REG + call MANGLE(lazy_jit_compile_impl) + mov RETURN_REG,ARG0 /* No-op on 32-bit */ + add $STACK_PADDING,STACK_REG + jmp *QUOT_XT_OFFSET(ARG0) /* Call the quotation */ + #include "cpu-x86.S" diff --git a/vm/cpu-x86.S b/vm/cpu-x86.S index 03f08fdabc..2599ba3f97 100644 --- a/vm/cpu-x86.S +++ b/vm/cpu-x86.S @@ -56,17 +56,6 @@ DEF(F_FASTCALL void,c_to_factor,(CELL quot, void *vm)): POP_NONVOLATILE ret -DEF(F_FASTCALL void,lazy_jit_compile,(CELL quot, void *vm)): - mov ARG1,NV_TEMP_REG /* stash vm ptr */ - mov STACK_REG,ARG1 /* Save stack pointer */ - sub $STACK_PADDING,STACK_REG - push NV_TEMP_REG /* push vm ptr as arg3 */ - call MANGLE(lazy_jit_compile_impl) - pop NV_TEMP_REG - mov RETURN_REG,ARG0 /* No-op on 32-bit */ - add $STACK_PADDING,STACK_REG - jmp *QUOT_XT_OFFSET(ARG0) /* Call the quotation */ - /* cpu.x86.features calls this */ DEF(bool,sse_version,(void)): mov $0x1,RETURN_REG @@ -103,6 +92,7 @@ sse_2: sse_1: mov $10,RETURN_REG ret + #ifdef WINDOWS .section .drectve .ascii " -export:sse_version"