Mercurial > repos > blastem
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? |