svp compiler direct calls
[picodrive.git] / Pico / carthw / svp / stub_arm.S
1 @ vim:filetype=armasm
2
3 .if 0
4 #include "compiler.h"
5 .endif
6
7 .global tcache
8
9 .global flush_inval_caches
10 .global regfile_load
11 .global regfile_store
12
13 @ translation cache buffer
14 .text
15 .align 12 @ 4096
16 .size tcache, TCACHE_SIZE
17 tcache:
18  .space TCACHE_SIZE
19
20
21 .text
22 .align 2
23
24
25 flush_inval_caches:
26     mov     r2, #0x0  @ must be 0
27     swi     0x9f0002
28     bx      lr
29
30
31 @       SSP_GR0, SSP_X,     SSP_Y,   SSP_A,
32 @       SSP_ST,  SSP_STACK, SSP_PC,  SSP_P,
33 @       SSP_PM0, SSP_PM1,   SSP_PM2, SSP_XST,
34 @       SSP_PM4, SSP_gr13,  SSP_PMC, SSP_AL
35
36 @ register map:
37 @ r4:  XXYY
38 @ r5:  A
39 @ r6:  STACK and emu flags
40 @ r7:  SSP context
41 @ r8:  r0-r2
42 @ r9:  r4-r6
43 @ r10: P
44 @ r11: cycles
45
46 @ trashes r2,r3
47
48 regfile_load:
49     ldr     r7, =ssp
50     ldr     r7, [r7]
51     add     r2, r7, #0x400
52     add     r2, r2, #4
53     ldmia   r2, {r3,r4,r5,r6,r8}
54     mov     r3, r3, lsr #16
55     mov     r3, r3, lsl #16
56     orr     r4, r3, r4, lsr #16         @ XXYY
57     bic     r6, r6, #0xff
58     orr     r6, r6, r8, lsr #16         @ flags + STACK
59     ldr     r8, [r7, #0x440]            @ r0-r2
60     ldr     r9, [r7, #0x444]            @ r4-r6
61     ldr     r10,[r7, #(0x400+7*4)]      @ P
62     bx      lr
63
64
65 regfile_store:
66     str     r10,[r7, #(0x400+7*4)]      @ P
67     str     r8, [r7, #0x440]            @ r0-r2
68     str     r9, [r7, #0x444]            @ r4-r6
69     mov     r9, r6, lsl #16
70     and     r9, r9, #(7<<16)            @ STACK
71     bic     r6, r6, #0xff               @ ST
72     mov     r3, r4, lsl #16             @ Y
73     mov     r2, r4, lsr #16
74     mov     r2, r2, lsl #16             @ X
75     add     r8, r7, #0x400
76     add     r8, r8, #4
77     stmia   r8, {r2,r3,r5,r6,r9}
78     bx      lr
79
80
81