OSDN Git Service

Add Win64 compilation callback. This allows easy examples to be JITed on Win64!
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 23 Mar 2008 14:44:32 +0000 (14:44 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 23 Mar 2008 14:44:32 +0000 (14:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48706 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86CompilationCallback_Win64.asm [new file with mode: 0644]
lib/Target/X86/X86JITInfo.cpp

diff --git a/lib/Target/X86/X86CompilationCallback_Win64.asm b/lib/Target/X86/X86CompilationCallback_Win64.asm
new file mode 100644 (file)
index 0000000..f9b5481
--- /dev/null
@@ -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
index a98d66d..5d942a1 100644 (file)
@@ -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