aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-03-23 14:44:32 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-03-23 14:44:32 +0000
commit5f287b943f833d3bd88af077d06292e8990ad62a (patch)
treea02b87fb43994863c3549bb0875e7ff3fc9cc814 /lib
parent112a17aacbe157b4401bb5454356209ca84c9508 (diff)
downloadexternal_llvm-5f287b943f833d3bd88af077d06292e8990ad62a.zip
external_llvm-5f287b943f833d3bd88af077d06292e8990ad62a.tar.gz
external_llvm-5f287b943f833d3bd88af077d06292e8990ad62a.tar.bz2
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
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/X86/X86CompilationCallback_Win64.asm54
-rw-r--r--lib/Target/X86/X86JITInfo.cpp9
2 files changed, 58 insertions, 5 deletions
diff --git a/lib/Target/X86/X86CompilationCallback_Win64.asm b/lib/Target/X86/X86CompilationCallback_Win64.asm
new file mode 100644
index 0000000..f9b5481
--- /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 a98d66d..5d942a1 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