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