unconditionally request MMI
[oota-llvm.git] / lib / Target / X86 / X86CompilationCallback_Win64.asm
1 ;;===-- X86CompilationCallback_Win64.asm - Implement Win64 JIT callback ---===
2 ;;
3 ;;                     The LLVM Compiler Infrastructure
4 ;;
5 ;; This file is distributed under the University of Illinois Open Source
6 ;; License. See LICENSE.TXT for details.
7 ;;
8 ;;===----------------------------------------------------------------------===
9 ;;
10 ;; This file implements the JIT interfaces for the X86 target.
11 ;;
12 ;;===----------------------------------------------------------------------===
13
14 extrn X86CompilationCallback2: PROC
15
16 .code
17 X86CompilationCallback proc
18     push    rbp
19
20     ; Save RSP.
21     mov     rbp, rsp
22
23     ; Save all int arg registers
24     ; WARNING: We cannot use register spill area - we're generating stubs by hands!
25     push    rcx
26     push    rdx
27     push    r8
28     push    r9
29
30     ; Align stack on 16-byte boundary.
31     and     rsp, -16
32
33     ; Save all XMM arg registers. Also allocate reg spill area.
34     sub     rsp, 96
35     movaps  [rsp   +32],  xmm0
36     movaps  [rsp+16+32],  xmm1
37     movaps  [rsp+32+32],  xmm2
38     movaps  [rsp+48+32],  xmm3
39
40     ; JIT callee
41
42     ; Pass prev frame and return address.
43     mov     rcx, rbp
44     mov     rdx, qword ptr [rbp+8]
45     call    X86CompilationCallback2
46
47     ; Restore all XMM arg registers.
48     movaps  xmm3, [rsp+48+32]
49     movaps  xmm2, [rsp+32+32]
50     movaps  xmm1, [rsp+16+32]
51     movaps  xmm0, [rsp   +32]
52
53     ; Restore RSP.
54     mov     rsp, rbp
55
56     ; Restore all int arg registers
57     sub     rsp, 32
58     pop     r9
59     pop     r8
60     pop     rdx
61     pop     rcx
62
63     ; Restore RBP.
64     pop     rbp
65     ret
66 X86CompilationCallback endp
67
68 End