about summary refs log tree commit diff stats
path: root/src/dynarec/la64/la64_next.S
blob: fd33ad0024d58ce615844b210276a643774cdaa9 (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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#define ASM_MAPPING 1
#include "la64_mapping.h"
#undef ASM_MAPPING

//la64 update linker table for dynarec
//called with pointer to emu as 1st parameter
//and address of table to as 2nd parameter
//ip is at r12

.text
.align 4

.extern LinkNext

.global la64_next

    .8byte  0   // NULL pointer before la64_next, for getDB
la64_next:
    // move emu to a0
    // move IP address to a1
    addi.d $sp, $sp, -(8 * 11)
    st.d   RDI, $sp, 0
    st.d   RSI, $sp, 8
    st.d   RDX, $sp, 16
    st.d   RCX, $sp, 24
    st.d   R8,  $sp, 32
    st.d   R9,  $sp, 40
    st.d   RAX, $sp, 48
    st.d   RBX, $sp, 56
    st.d   RSP, $sp, 64
    st.d   RBP, $sp, 72
    st.d   RIP, $sp, 80 // also save r29(rip) to allow change in LinkNext

    move   $a0, Emu
    move   $a1, RIP
    move   $a2, $ra      // "from" is in ra, so put in a2
    addi.d $a3, $sp, 80  // a3 is address to change rip
    // call the function
    bl LinkNext
    // preserve return value
    move   $r16, $a0
    // pop regs
    ld.d   RDI, $sp, 0
    ld.d   RSI, $sp, 8
    ld.d   RDX, $sp, 16
    ld.d   RCX, $sp, 24
    ld.d   R8,  $sp, 32
    ld.d   R9,  $sp, 40
    ld.d   RAX, $sp, 48
    ld.d   RBX, $sp, 56
    ld.d   RSP, $sp, 64
    ld.d   RBP, $sp, 72
    ld.d   RIP, $sp, 80
    addi.d $sp, $sp, (8 * 11)
    // return offset is jump address
    jr     $r16