comparison m68k_to_x86.c @ 113:d260996eea55

Defer the correct address for pc relative jsr/jmp
author Mike Pavone <pavone@retrodev.com>
date Fri, 28 Dec 2012 17:59:41 -0800
parents e3594572fb98
children 9eaba47c429d
comparison
equal deleted inserted replaced
112:e3594572fb98 113:d260996eea55
1447 break; 1447 break;
1448 case MODE_PC_DISPLACE: 1448 case MODE_PC_DISPLACE:
1449 dst = cycles(dst, 10); 1449 dst = cycles(dst, 10);
1450 dest_addr = get_native_address(opts->native_code_map, inst->src.params.regs.displacement + inst->address + 2); 1450 dest_addr = get_native_address(opts->native_code_map, inst->src.params.regs.displacement + inst->address + 2);
1451 if (!dest_addr) { 1451 if (!dest_addr) {
1452 opts->deferred = defer_address(opts->deferred, inst->src.params.immed, dst + 1); 1452 opts->deferred = defer_address(opts->deferred, inst->src.params.regs.displacement + inst->address + 2, dst + 1);
1453 //dummy address to be replaced later, make sure it generates a 4-byte displacement 1453 //dummy address to be replaced later, make sure it generates a 4-byte displacement
1454 dest_addr = dst + 256; 1454 dest_addr = dst + 256;
1455 } 1455 }
1456 dst = jmp(dst, dest_addr); 1456 dst = jmp(dst, dest_addr);
1457 break; 1457 break;
1555 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); 1555 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D);
1556 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); 1556 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D);
1557 dst = call(dst, (char *)m68k_write_long_highfirst); 1557 dst = call(dst, (char *)m68k_write_long_highfirst);
1558 dest_addr = get_native_address(opts->native_code_map, inst->src.params.regs.displacement + inst->address + 2); 1558 dest_addr = get_native_address(opts->native_code_map, inst->src.params.regs.displacement + inst->address + 2);
1559 if (!dest_addr) { 1559 if (!dest_addr) {
1560 opts->deferred = defer_address(opts->deferred, inst->src.params.immed, dst + 1); 1560 opts->deferred = defer_address(opts->deferred, inst->src.params.regs.displacement + inst->address + 2, dst + 1);
1561 //dummy address to be replaced later, make sure it generates a 4-byte displacement 1561 //dummy address to be replaced later, make sure it generates a 4-byte displacement
1562 dest_addr = dst + 5; 1562 dest_addr = dst + 5;
1563 } 1563 }
1564 dst = call(dst, (char *)dest_addr); 1564 dst = call(dst, (char *)dest_addr);
1565 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? 1565 //would add_ir(dst, 8, RSP, SZ_Q) be faster here?