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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#define ASM_MAPPING 1
#include "la64_mapping.h"
#undef ASM_MAPPING
//loongarch 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
.extern cpuext
.global la64_prolog
la64_prolog:
//save all 18 used register
addi.d $sp, $sp, -(8 * 19)
st.d $r1, $sp, (8 * 0) //save ra
st.d $r22, $sp, (8 * 1) //save fp
// save s0 - s8
st.d $r23, $sp, (8 * 2)
st.d $r24, $sp, (8 * 3)
st.d $r25, $sp, (8 * 4)
st.d $r26, $sp, (8 * 5)
st.d $r27, $sp, (8 * 6)
st.d $r28, $sp, (8 * 7)
st.d $r29, $sp, (8 * 8)
st.d $r30, $sp, (8 * 9)
st.d $r31, $sp, (8 * 10)
// save fs0 - fs7
fst.d $f24, $sp, (8 * 11)
fst.d $f25, $sp, (8 * 12)
fst.d $f26, $sp, (8 * 13)
fst.d $f27, $sp, (8 * 14)
fst.d $f28, $sp, (8 * 15)
fst.d $f29, $sp, (8 * 16)
fst.d $f30, $sp, (8 * 17)
fst.d $f31, $sp, (8 * 18)
// save a1
move $r16, $a1
// setup emu -> register
move Emu, $a0
ld.d RAX, Emu, (8 * 0)
ld.d RCX, Emu, (8 * 1)
ld.d RDX, Emu, (8 * 2)
ld.d RBX, Emu, (8 * 3)
ld.d RSP, Emu, (8 * 4)
ld.d RBP, Emu, (8 * 5)
ld.d RSI, Emu, (8 * 6)
ld.d RDI, Emu, (8 * 7)
ld.d R8, Emu, (8 * 8)
ld.d R9, Emu, (8 * 9)
ld.d R10, Emu, (8 * 10)
ld.d R11, Emu, (8 * 11)
ld.d R12, Emu, (8 * 12)
ld.d R13, Emu, (8 * 13)
ld.d R14, Emu, (8 * 14)
ld.d R15, Emu, (8 * 15)
ld.d Flags, Emu, (8 * 16) // xFlags
ld.d RIP, Emu, (8 * 17) // xRIP
// spill xFlags to LBT.eflags
la.global $r19, cpuext
ldptr.d $r19, $r19, 0
andi $r19, $r19, 1
beqz $r19, 1f
x86mtflag Flags, 0b111111
1:
// push sentinel onto the stack
st.d $r0, $sp, -16
st.d $r0, $sp, -8
addi.d $sp, $sp, -16
// save old sp into xSavedSP
addi.d SavedSP, $sp, 16
//jump to function
jirl $r0, $r16, 0
|