about summary refs log tree commit diff stats
path: root/src/dynarec/arm64/arm64_prolog.S
blob: eaee127feab52904ceb35ed236bcc9ecf0ef1816 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//arm prologue for dynarec
//Save stuff, prepare stack and register
//called with pointer to emu as 1st parameter
//and address to jump to as 2nd parameter

.text
.align 4

.global arm64_prolog
arm64_prolog:
    //save all 18 used register
    stp     x30, x29, [sp, -16]!  // save lr
    sub     sp,  sp, (8 * 18)
    stp     x19, x20, [sp, (8 * 0)]
    stp     x21, x22, [sp, (8 * 2)]
    stp     x23, x24, [sp, (8 * 4)]
    stp     x25, x26, [sp, (8 * 6)]
    stp     x27, X28, [sp, (8 * 8)]
    stp     d8, d9,   [sp, (8 *10)]
    stp     d10, d11, [sp, (8 *12)]
    stp     d12, d13, [sp, (8 *14)]
    stp     d14, d15, [sp, (8 *16)]
    //vpush     {d8-d15}    // save NEON regs?
    //setup emu -> register
    ldp     x10, x11, [x0, (8 *  0)]
    ldp     x12, x13, [x0, (8 *  2)]
    ldp     x14, x15, [x0, (8 *  4)]
    ldp     x16, x17, [x0, (8 *  6)]
    ldp     x18, x19, [x0, (8 *  8)]
    ldp     x20, x21, [x0, (8 * 10)]
    ldp     x22, x23, [x0, (8 * 12)]
    ldp     x24, x25, [x0, (8 * 14)]
    ldp     x26, x27, [x0, (8 * 16)]
    // Push a jump next on the stack
    stp     xzr, xzr, [sp, -16]!
    // Save old xSP in x28
    add     x28, sp, 16
    //jump to function
    br       x1