Mercurial > repos > blastem
comparison m68k_to_x86.c @ 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 | 140af5509ce7 |
children | 7f54f1773e84 |
comparison
equal
deleted
inserted
replaced
484:0bf5e6b672fe | 485:b449af228c63 |
---|---|
1 /* | 1 /* |
2 Copyright 2013 Michael Pavone | 2 Copyright 2013 Michael Pavone |
3 This file is part of BlastEm. | 3 This file is part of BlastEm. |
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. | 4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. |
5 */ | 5 */ |
6 #include "gen_x86.h" | 6 #include "gen_x86.h" |
7 #include "m68k_to_x86.h" | 7 #include "m68k_to_x86.h" |
8 #include "68kinst.h" | 8 #include "68kinst.h" |
4244 dst = mov_rr(dst, SCRATCH1, RDX, size); | 4244 dst = mov_rr(dst, SCRATCH1, RDX, size); |
4245 } else { | 4245 } else { |
4246 dst = push_r(dst, CONTEXT); | 4246 dst = push_r(dst, CONTEXT); |
4247 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); | 4247 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); |
4248 } | 4248 } |
4249 dst = test_ir(dst, 8, RSP, SZ_D); | |
4250 uint8_t *adjust_rsp = dst+1; | |
4251 dst = jcc(dst, CC_NZ, dst+2); | |
4249 dst = call(dst, cfun); | 4252 dst = call(dst, cfun); |
4253 uint8_t *no_adjust = dst+1; | |
4254 dst = jmp(dst, dst+2); | |
4255 *adjust_rsp = dst - (adjust_rsp + 1); | |
4256 dst = sub_ir(dst, 8, RSP, SZ_Q); | |
4257 dst = call(dst, cfun); | |
4258 dst = add_ir(dst, 8, RSP, SZ_Q); | |
4259 *no_adjust = dst - (no_adjust + 1); | |
4250 if (is_write) { | 4260 if (is_write) { |
4251 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); | 4261 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); |
4252 } else { | 4262 } else { |
4253 dst = pop_r(dst, CONTEXT); | 4263 dst = pop_r(dst, CONTEXT); |
4254 dst = mov_rr(dst, RAX, SCRATCH1, size); | 4264 dst = mov_rr(dst, RAX, SCRATCH1, size); |
4337 dst = mov_rr(dst, SCRATCH1, RDX, size); | 4347 dst = mov_rr(dst, SCRATCH1, RDX, size); |
4338 } else { | 4348 } else { |
4339 dst = push_r(dst, CONTEXT); | 4349 dst = push_r(dst, CONTEXT); |
4340 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); | 4350 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); |
4341 } | 4351 } |
4352 dst = test_ir(dst, 8, RSP, SZ_D); | |
4353 uint8_t *adjust_rsp = dst+1; | |
4354 dst = jcc(dst, CC_NZ, dst+2); | |
4342 dst = call(dst, cfun); | 4355 dst = call(dst, cfun); |
4356 uint8_t *no_adjust = dst+1; | |
4357 dst = jmp(dst, dst+2); | |
4358 *adjust_rsp = dst - (adjust_rsp + 1); | |
4359 dst = sub_ir(dst, 8, RSP, SZ_Q); | |
4360 dst = call(dst, cfun); | |
4361 dst = add_ir(dst, 8, RSP, SZ_Q); | |
4362 *no_adjust = dst - (no_adjust+1); | |
4343 if (is_write) { | 4363 if (is_write) { |
4344 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); | 4364 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); |
4345 } else { | 4365 } else { |
4346 dst = pop_r(dst, CONTEXT); | 4366 dst = pop_r(dst, CONTEXT); |
4347 dst = mov_rr(dst, RAX, SCRATCH1, size); | 4367 dst = mov_rr(dst, RAX, SCRATCH1, size); |
4442 uint8_t * skip_sync = dst+1; | 4462 uint8_t * skip_sync = dst+1; |
4443 dst = jcc(dst, CC_C, dst+2); | 4463 dst = jcc(dst, CC_C, dst+2); |
4444 dst = call(dst, (uint8_t *)m68k_save_context); | 4464 dst = call(dst, (uint8_t *)m68k_save_context); |
4445 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q); | 4465 dst = mov_rr(dst, CONTEXT, RDI, SZ_Q); |
4446 dst = mov_rr(dst, SCRATCH1, RSI, SZ_D); | 4466 dst = mov_rr(dst, SCRATCH1, RSI, SZ_D); |
4467 dst = test_ir(dst, 8, RSP, SZ_D); | |
4468 uint8_t *adjust_rsp = dst+1; | |
4469 dst = jcc(dst, CC_NZ, dst+2); | |
4447 dst = call(dst, (uint8_t *)sync_components); | 4470 dst = call(dst, (uint8_t *)sync_components); |
4471 uint8_t *no_adjust = dst+1; | |
4472 dst = jmp(dst, dst+2); | |
4473 *adjust_rsp = dst - (adjust_rsp + 1); | |
4474 dst = sub_ir(dst, 8, RSP, SZ_Q); | |
4475 dst = call(dst, (uint8_t *)sync_components); | |
4476 dst = add_ir(dst, 8, RSP, SZ_Q); | |
4477 *no_adjust = dst - (no_adjust+1); | |
4448 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); | 4478 dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); |
4449 dst = jmp(dst, (uint8_t *)m68k_load_context); | 4479 dst = jmp(dst, (uint8_t *)m68k_load_context); |
4450 *skip_sync = dst - (skip_sync+1); | 4480 *skip_sync = dst - (skip_sync+1); |
4451 dst = retn(dst); | 4481 dst = retn(dst); |
4452 *do_int = dst - (do_int+1); | 4482 *do_int = dst - (do_int+1); |