Mercurial > repos > blastem
comparison m68k_to_x86.c @ 548:a3afee2271ce
Initial work on the x86-32 target
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 18 Feb 2014 21:37:31 -0800 |
parents | 3090d016c9e9 |
children | 96489fb27dbf |
comparison
equal
deleted
inserted
replaced
547:3090d016c9e9 | 548:a3afee2271ce |
---|---|
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 #include <string.h> | 14 #include <string.h> |
15 | 15 |
16 #define BUS 4 | 16 #define BUS 4 |
17 #define PREDEC_PENALTY 2 | 17 #define PREDEC_PENALTY 2 |
18 | |
18 #define CYCLES RAX | 19 #define CYCLES RAX |
19 #define LIMIT RBP | 20 #define LIMIT RBP |
21 #define CONTEXT RSI | |
20 #define SCRATCH1 RCX | 22 #define SCRATCH1 RCX |
23 | |
24 #ifdef X86_64 | |
21 #define SCRATCH2 RDI | 25 #define SCRATCH2 RDI |
22 #define CONTEXT RSI | 26 #else |
23 | 27 #define SCRATCH2 RBX |
24 /* | 28 #endif |
25 #define FLAG_N RBX | 29 |
26 #define FLAG_V BH | |
27 #define FLAG_Z RDX | |
28 #define FLAG_C DH | |
29 */ | |
30 enum { | 30 enum { |
31 FLAG_X, | 31 FLAG_X, |
32 FLAG_N, | 32 FLAG_N, |
33 FLAG_Z, | 33 FLAG_Z, |
34 FLAG_V, | 34 FLAG_V, |
4378 dst = cmp_irdisp8(dst, 0, CONTEXT, offsetof(m68k_context, mem_pointers) + sizeof(void*) * memmap[chunk].ptr_index, SZ_Q); | 4378 dst = cmp_irdisp8(dst, 0, CONTEXT, offsetof(m68k_context, mem_pointers) + sizeof(void*) * memmap[chunk].ptr_index, SZ_Q); |
4379 uint8_t * not_null = dst+1; | 4379 uint8_t * not_null = dst+1; |
4380 dst = jcc(dst, CC_NZ, dst+2); | 4380 dst = jcc(dst, CC_NZ, dst+2); |
4381 dst = call(dst, opts->save_context); | 4381 dst = call(dst, opts->save_context); |
4382 if (is_write) { | 4382 if (is_write) { |
4383 //SCRATCH2 is RDI, so no need to move it there | 4383 if (SCRATCH2 != RDI) { |
4384 dst = mov_rr(dst, SCRATCH2, RDI, SZ_D); | |
4385 } | |
4384 dst = mov_rr(dst, SCRATCH1, RDX, size); | 4386 dst = mov_rr(dst, SCRATCH1, RDX, size); |
4385 } else { | 4387 } else { |
4386 dst = push_r(dst, CONTEXT); | 4388 dst = push_r(dst, CONTEXT); |
4387 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); | 4389 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); |
4388 } | 4390 } |
4481 } | 4483 } |
4482 dst = retn(dst); | 4484 dst = retn(dst); |
4483 } else if (cfun) { | 4485 } else if (cfun) { |
4484 dst = call(dst, opts->save_context); | 4486 dst = call(dst, opts->save_context); |
4485 if (is_write) { | 4487 if (is_write) { |
4486 //SCRATCH2 is RDI, so no need to move it there | 4488 if (SCRATCH2 != RDI) { |
4489 dst = mov_rr(dst, SCRATCH2, RDI, SZ_D); | |
4490 } | |
4487 dst = mov_rr(dst, SCRATCH1, RDX, size); | 4491 dst = mov_rr(dst, SCRATCH1, RDX, size); |
4488 } else { | 4492 } else { |
4489 dst = push_r(dst, CONTEXT); | 4493 dst = push_r(dst, CONTEXT); |
4490 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); | 4494 dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); |
4491 } | 4495 } |
4534 void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t num_chunks) | 4538 void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t num_chunks) |
4535 { | 4539 { |
4536 memset(opts, 0, sizeof(*opts)); | 4540 memset(opts, 0, sizeof(*opts)); |
4537 for (int i = 0; i < 8; i++) | 4541 for (int i = 0; i < 8; i++) |
4538 opts->dregs[i] = opts->aregs[i] = -1; | 4542 opts->dregs[i] = opts->aregs[i] = -1; |
4543 #ifdef X86_64 | |
4539 opts->dregs[0] = R10; | 4544 opts->dregs[0] = R10; |
4540 opts->dregs[1] = R11; | 4545 opts->dregs[1] = R11; |
4541 opts->dregs[2] = R12; | 4546 opts->dregs[2] = R12; |
4542 opts->dregs[3] = R8; | 4547 opts->dregs[3] = R8; |
4543 opts->aregs[0] = R13; | 4548 opts->aregs[0] = R13; |
4548 opts->flag_regs[0] = -1; | 4553 opts->flag_regs[0] = -1; |
4549 opts->flag_regs[1] = RBX; | 4554 opts->flag_regs[1] = RBX; |
4550 opts->flag_regs[2] = RDX; | 4555 opts->flag_regs[2] = RDX; |
4551 opts->flag_regs[3] = BH; | 4556 opts->flag_regs[3] = BH; |
4552 opts->flag_regs[4] = DH; | 4557 opts->flag_regs[4] = DH; |
4558 #else | |
4559 opts->dregs[0] = RDX; | |
4560 opts->aregs[7] = RDI; | |
4561 | |
4562 for (int i = 0; i < 5; i++) | |
4563 opts->flag_regs[i] = -1; | |
4564 #endif | |
4565 | |
4566 | |
4553 opts->native_code_map = malloc(sizeof(native_map_slot) * NATIVE_MAP_CHUNKS); | 4567 opts->native_code_map = malloc(sizeof(native_map_slot) * NATIVE_MAP_CHUNKS); |
4554 memset(opts->native_code_map, 0, sizeof(native_map_slot) * NATIVE_MAP_CHUNKS); | 4568 memset(opts->native_code_map, 0, sizeof(native_map_slot) * NATIVE_MAP_CHUNKS); |
4555 opts->deferred = NULL; | 4569 opts->deferred = NULL; |
4556 size_t size = 1024 * 1024; | 4570 size_t size = 1024 * 1024; |
4557 opts->cur_code = alloc_code(&size); | 4571 opts->cur_code = alloc_code(&size); |
4595 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, current_cycle), CYCLES, SZ_D); | 4609 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, current_cycle), CYCLES, SZ_D); |
4596 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, target_cycle), LIMIT, SZ_D); | 4610 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, target_cycle), LIMIT, SZ_D); |
4597 dst = retn(dst); | 4611 dst = retn(dst); |
4598 | 4612 |
4599 opts->start_context = (start_fun)dst; | 4613 opts->start_context = (start_fun)dst; |
4614 if (SCRATCH2 != RDI) { | |
4615 dst = mov_rr(dst, RDI, SCRATCH2, SZ_Q); | |
4616 } | |
4600 //save callee save registers | 4617 //save callee save registers |
4601 dst = push_r(dst, RBP); | 4618 dst = push_r(dst, RBP); |
4602 dst = push_r(dst, R12); | 4619 dst = push_r(dst, R12); |
4603 dst = push_r(dst, R13); | 4620 dst = push_r(dst, R13); |
4604 dst = push_r(dst, R14); | 4621 dst = push_r(dst, R14); |
4605 dst = push_r(dst, R15); | 4622 dst = push_r(dst, R15); |
4606 dst = call(dst, opts->load_context); | 4623 dst = call(dst, opts->load_context); |
4607 dst = call_r(dst, RDI); | 4624 dst = call_r(dst, SCRATCH2); |
4608 dst = call(dst, opts->save_context); | 4625 dst = call(dst, opts->save_context); |
4609 //restore callee save registers | 4626 //restore callee save registers |
4610 dst = pop_r(dst, R15); | 4627 dst = pop_r(dst, R15); |
4611 dst = pop_r(dst, R14); | 4628 dst = pop_r(dst, R14); |
4612 dst = pop_r(dst, R13); | 4629 dst = pop_r(dst, R13); |