! Compute new stack pointer -- 'dst' for memcpy
EAX EDX SUB
! Install new stack pointer
- RSP EAX MOV
+ ESP EAX MOV
! Call memcpy
- ESP 8 [+] EDX MOV
- ESP 4 [+] EBP MOV
- ESP [] EAX MOV
- 0 CALL "memcpy" f rc-relative jit-dlsym
+ EDX PUSH
+ EBP PUSH
+ EAX PUSH
+ 0 CALL "factor_memcpy" f rc-relative jit-dlsym
+ ESP 12 ADD
! Return with new callstack
0 RET
] \ set-callstack define-sub-primitive
! Install new stack pointer
RSP arg1 MOV
! Call memcpy; arguments are now in the correct registers
- safe-reg 0 MOV "memcpy" f rc-absolute-cell jit-dlsym
+ ! Create register shadow area for Win64
+ RSP 32 SUB
+ safe-reg 0 MOV "factor_memcpy" f rc-absolute-cell jit-dlsym
safe-reg CALL
+ ! Tear down register shadow area
+ RSP 32 ADD
! Return with new callstack
0 RET
] \ set-callstack define-sub-primitive
return cell;
}
+/* On Windows, memcpy() is in a different DLL and the non-optimizing
+compiler can't find it */
+VM_C_API void *factor_memcpy(void *dst, void *src, size_t len)
+{
+ return memcpy(dst,src,len);
+}
+
}