comparison runtime.S @ 485:b449af228c63

Follow amd64 ABI stack alignment requirements in places it matters so we can call sprintf with floating point arguments without crashing
author Mike Pavone <pavone@retrodev.com>
date Thu, 03 Oct 2013 21:21:47 -0700
parents 8e136187c0e0
children 4ca826862174
comparison
equal deleted inserted replaced
484:0bf5e6b672fe 485:b449af228c63
8 push %rcx 8 push %rcx
9 push %rdi 9 push %rdi
10 call m68k_save_context 10 call m68k_save_context
11 mov %rsi, %rdi 11 mov %rsi, %rdi
12 xor %esi, %esi 12 xor %esi, %esi
13 call sync_components 13 test $8, %esp
14 jnz adjust_rsp
15 call sync_components
16 jmp done_adjust
17 adjust_rsp:
18 sub $8, %rsp
19 call sync_components
20 add $8, %rsp
21 done_adjust:
14 mov %rax, %rsi 22 mov %rax, %rsi
15 call m68k_load_context 23 call m68k_load_context
16 pop %rdi 24 pop %rdi
17 pop %rcx 25 pop %rcx
18 skip_sync: 26 skip_sync:
19 ret 27 ret
20 28
21 sr_msg_int: 29 sr_msg_int:
22 .asciz "SR set to $%X due to interrupt\n" 30 .asciz "SR set to $%X due to interrupt\n"
23 debug_print_sr_int: 31 debug_print_sr_int:
24 call m68k_save_context 32 call m68k_save_context
25 push %rsi 33 push %rsi
45 call m68k_load_context 53 call m68k_load_context
46 ret 54 ret
47 55
48 invalid_msg: 56 invalid_msg:
49 .asciz "Invalid instruction at %X\n" 57 .asciz "Invalid instruction at %X\n"
50 58
51 .global m68k_invalid 59 .global m68k_invalid
52 m68k_invalid: 60 m68k_invalid:
53 lea invalid_msg(%rip), %rdi 61 lea invalid_msg(%rip), %rdi
54 mov %ecx, %esi 62 mov %ecx, %esi
55 xor %rax, %rax 63 xor %rax, %rax
58 call exit 66 call exit
59 67
60 .global bcd_add 68 .global bcd_add
61 bcd_add: 69 bcd_add:
62 xchg %rax, %rdi 70 xchg %rax, %rdi
63 71
64 mov %cl, %ch 72 mov %cl, %ch
65 mov %al, %ah 73 mov %al, %ah
66 and $0xF, %ch 74 and $0xF, %ch
67 and $0xF, %ah 75 and $0xF, %ah
68 and $0xF0, %cl 76 and $0xF0, %cl
80 jb no_adjust_h 88 jb no_adjust_h
81 def_adjust: 89 def_adjust:
82 add $0x60, %cl 90 add $0x60, %cl
83 mov $1, %ch 91 mov $1, %ch
84 no_adjust_h: 92 no_adjust_h:
85 93
86 mov %rdi, %rax 94 mov %rdi, %rax
87 ret 95 ret
88 96
89 .global bcd_sub 97 .global bcd_sub
90 bcd_sub: 98 bcd_sub:
91 xchg %rax, %rdi 99 xchg %rax, %rdi
92 100
93 mov %cl, %ch 101 mov %cl, %ch
94 mov %al, %ah 102 mov %al, %ah
95 and $0xF, %ch 103 and $0xF, %ch
96 and $0xF, %ah 104 and $0xF, %ah
97 and $0xF0, %cl 105 and $0xF0, %cl
109 jb no_adjust_hs 117 jb no_adjust_hs
110 def_adjusts: 118 def_adjusts:
111 sub $0x60, %cl 119 sub $0x60, %cl
112 mov $1, %ch 120 mov $1, %ch
113 no_adjust_hs: 121 no_adjust_hs:
114 122
115 mov %rdi, %rax 123 mov %rdi, %rax
116 ret 124 ret
117 125
118 .global get_sr 126 .global get_sr
119 get_sr: 127 get_sr:
166 and $1, %bl 174 and $1, %bl
167 shr $1, %cl 175 shr $1, %cl
168 and $1, %cl 176 and $1, %cl
169 mov %cl, (%rsi) 177 mov %cl, (%rsi)
170 ret 178 ret
171 179
172 .global m68k_modified_ret_addr 180 .global m68k_modified_ret_addr
173 m68k_modified_ret_addr: 181 m68k_modified_ret_addr:
174 add $16, %rsp 182 add $16, %rsp
175 call m68k_native_addr 183 call m68k_native_addr
176 jmp *%rcx 184 jmp *%rcx
179 m68k_native_addr_and_sync: 187 m68k_native_addr_and_sync:
180 call m68k_save_context 188 call m68k_save_context
181 push %rcx 189 push %rcx
182 mov %rsi, %rdi 190 mov %rsi, %rdi
183 xor %esi, %esi 191 xor %esi, %esi
184 call sync_components 192 test $8, %rsp
193 jnz adjust_rsp_na
194 call sync_components
195 jmp no_adjust_rsp_na
196 adjust_rsp_na:
197 sub $8, %rsp
198 call sync_components
199 add $8, %rsp
200 no_adjust_rsp_na:
185 pop %rsi 201 pop %rsi
186 push %rax 202 push %rax
187 mov %rax, %rdi 203 mov %rax, %rdi
188 call get_native_address_trans 204 call get_native_address_trans
189 mov %rax, %rcx 205 mov %rax, %rcx
200 call get_native_address_trans 216 call get_native_address_trans
201 mov %rax, %rcx 217 mov %rax, %rcx
202 pop %rsi 218 pop %rsi
203 call m68k_load_context 219 call m68k_load_context
204 ret 220 ret
205 221
206 .global m68k_retrans_stub 222 .global m68k_retrans_stub
207 m68k_retrans_stub: 223 m68k_retrans_stub:
208 call m68k_save_context 224 call m68k_save_context
209 push %rsi 225 push %rsi
210 call m68k_retranslate_inst 226 call m68k_retranslate_inst
253 push %rbp 269 push %rbp
254 push %r12 270 push %r12
255 push %r13 271 push %r13
256 push %r14 272 push %r14
257 push %r15 273 push %r15
258 274
259 call m68k_load_context 275 call m68k_load_context
260 call *%rdi 276 call *%rdi
261 call m68k_save_context 277 call m68k_save_context
262 278
263 pop %r15 279 pop %r15
264 pop %r14 280 pop %r14
265 pop %r13 281 pop %r13
266 pop %r12 282 pop %r12
267 pop %rbp 283 pop %rbp
268 284
269 ret 285 ret