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);