diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-03-23 14:44:32 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-03-23 14:44:32 +0000 |
commit | 9f0e820fa3d500c85a5f1a1cf0add7e999ebfa7a (patch) | |
tree | 896da40c03b7bad98341150e404c3cb333bc9004 /llvm/lib/Target | |
parent | 058014972a25b08184de6c8641f8fccf9e121a8a (diff) | |
download | bcm5719-llvm-9f0e820fa3d500c85a5f1a1cf0add7e999ebfa7a.tar.gz bcm5719-llvm-9f0e820fa3d500c85a5f1a1cf0add7e999ebfa7a.zip |
Add Win64 compilation callback. This allows easy examples to be JITed on Win64!
llvm-svn: 48706
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/X86/X86CompilationCallback_Win64.asm | 54 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86JITInfo.cpp | 9 |
2 files changed, 58 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86CompilationCallback_Win64.asm b/llvm/lib/Target/X86/X86CompilationCallback_Win64.asm new file mode 100644 index 00000000000..f9b5481a01f --- /dev/null +++ b/llvm/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/llvm/lib/Target/X86/X86JITInfo.cpp b/llvm/lib/Target/X86/X86JITInfo.cpp index a98d66d4d98..5d942a1768e 100644 --- a/llvm/lib/Target/X86/X86JITInfo.cpp +++ b/llvm/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 |