From 231e964ad23f1c37da414068f2e7d44b496d809a Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Sun, 23 Mar 2008 14:44:32 +0000 Subject: [PATCH] Add Win64 compilation callback. This allows easy examples to be JITed on Win64! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48706 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../X86/X86CompilationCallback_Win64.asm | 54 +++++++++++++++++++ lib/Target/X86/X86JITInfo.cpp | 9 ++-- 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 lib/Target/X86/X86CompilationCallback_Win64.asm diff --git a/lib/Target/X86/X86CompilationCallback_Win64.asm b/lib/Target/X86/X86CompilationCallback_Win64.asm new file mode 100644 index 00000000000..f9b5481a01f --- /dev/null +++ b/lib/Target/X86/X86CompilationCallback_Win64.asm @@ -0,0 +1,54 @@ +extrn X86CompilationCallback2: PROC + +.code +X86CompilationCallback proc + push rbp + + ; Save RSP + mov rbp, rsp + + ; Save all int arg registers + push rcx + push rdx + push r8 + push r9 + + ; Align stack on 16-byte boundary. + and rsp, -16 + + ; Save all XMM arg registers + sub rsp, 64 + movaps [rsp], xmm0 + movaps [rsp+16], xmm1 + movaps [rsp+32], xmm2 + movaps [rsp+48], xmm3 + + ; JIT callee + + ; Pass prev frame and return address + mov rcx, rbp + mov rdx, qword ptr [rbp+8] + call X86CompilationCallback2 + + ; Restore all XMM arg registers + movaps xmm3, [rsp+48] + movaps xmm2, [rsp+32] + movaps xmm1, [rsp+16] + movaps xmm0, [rsp] + + ; Restore RSP + mov rsp, rbp + + ; Restore all int arg registers + sub rsp, 32 + pop r9 + pop r8 + pop rdx + pop rcx + + ; Restore RBP + pop rbp + ret +X86CompilationCallback endp + +End diff --git a/lib/Target/X86/X86JITInfo.cpp b/lib/Target/X86/X86JITInfo.cpp index a98d66d4d98..5d942a1768e 100644 --- a/lib/Target/X86/X86JITInfo.cpp +++ b/lib/Target/X86/X86JITInfo.cpp @@ -153,11 +153,10 @@ extern "C" { CFI(".cfi_endproc\n") ); # else - // No inline assembler support on this platform - void X86CompilationCallback() { - assert(0 && "Cannot call X86CompilationCallback() on a non-x86 arch!\n"); - abort(); - } + // No inline assembler support on this platform. The routine is in external + // file. + void X86CompilationCallback(); + # endif #elif defined (X86_32_JIT) # ifndef _MSC_VER -- 2.34.1