Mercurial > repos > blastem
comparison m68k_to_x86.c @ 119:ee19ddadb398
Fix return address pushed to stack for jsr
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 28 Dec 2012 22:47:10 -0800 |
parents | d9ff99ef5533 |
children | f848aad2abef |
comparison
equal
deleted
inserted
replaced
118:d9ff99ef5533 | 119:ee19ddadb398 |
---|---|
1563 uint32_t after; | 1563 uint32_t after; |
1564 switch(inst->src.addr_mode) | 1564 switch(inst->src.addr_mode) |
1565 { | 1565 { |
1566 case MODE_AREG_INDIRECT: | 1566 case MODE_AREG_INDIRECT: |
1567 dst = cycles(dst, BUS*2); | 1567 dst = cycles(dst, BUS*2); |
1568 dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); | 1568 dst = mov_ir(dst, inst->address + 2, SCRATCH1, SZ_D); |
1569 dst = push_r(dst, SCRATCH1); | 1569 dst = push_r(dst, SCRATCH1); |
1570 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1570 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1571 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1571 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1572 dst = call(dst, (char *)m68k_write_long_highfirst); | 1572 dst = call(dst, (char *)m68k_write_long_highfirst); |
1573 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 1573 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
1580 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? | 1580 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? |
1581 dst = pop_r(dst, SCRATCH1); | 1581 dst = pop_r(dst, SCRATCH1); |
1582 break; | 1582 break; |
1583 case MODE_AREG_INDEX_DISP8: | 1583 case MODE_AREG_INDEX_DISP8: |
1584 dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct | 1584 dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct |
1585 dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); | 1585 dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); |
1586 dst = push_r(dst, SCRATCH1); | 1586 dst = push_r(dst, SCRATCH1); |
1587 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1587 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1588 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1588 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1589 dst = call(dst, (char *)m68k_write_long_highfirst); | 1589 dst = call(dst, (char *)m68k_write_long_highfirst); |
1590 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 1590 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
1632 dst = pop_r(dst, SCRATCH1); | 1632 dst = pop_r(dst, SCRATCH1); |
1633 break; | 1633 break; |
1634 case MODE_PC_DISPLACE: | 1634 case MODE_PC_DISPLACE: |
1635 //TODO: Add cycles in the right place relative to pushing the return address on the stack | 1635 //TODO: Add cycles in the right place relative to pushing the return address on the stack |
1636 dst = cycles(dst, 10); | 1636 dst = cycles(dst, 10); |
1637 dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); | 1637 dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); |
1638 dst = push_r(dst, SCRATCH1); | 1638 dst = push_r(dst, SCRATCH1); |
1639 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1639 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1640 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1640 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1641 dst = call(dst, (char *)m68k_write_long_highfirst); | 1641 dst = call(dst, (char *)m68k_write_long_highfirst); |
1642 dest_addr = get_native_address(opts->native_code_map, inst->src.params.regs.displacement + inst->address + 2); | 1642 dest_addr = get_native_address(opts->native_code_map, inst->src.params.regs.displacement + inst->address + 2); |
1649 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? | 1649 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? |
1650 dst = pop_r(dst, SCRATCH1); | 1650 dst = pop_r(dst, SCRATCH1); |
1651 break; | 1651 break; |
1652 case MODE_PC_INDEX_DISP8: | 1652 case MODE_PC_INDEX_DISP8: |
1653 dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct | 1653 dst = cycles(dst, BUS*3);//TODO: CHeck that this is correct |
1654 dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); | 1654 dst = mov_ir(dst, inst->address + 4, SCRATCH1, SZ_D); |
1655 dst = push_r(dst, SCRATCH1); | 1655 dst = push_r(dst, SCRATCH1); |
1656 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1656 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1657 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1657 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1658 dst = call(dst, (char *)m68k_write_long_highfirst); | 1658 dst = call(dst, (char *)m68k_write_long_highfirst); |
1659 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | 1659 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); |
1698 break; | 1698 break; |
1699 case MODE_ABSOLUTE: | 1699 case MODE_ABSOLUTE: |
1700 case MODE_ABSOLUTE_SHORT: | 1700 case MODE_ABSOLUTE_SHORT: |
1701 //TODO: Add cycles in the right place relative to pushing the return address on the stack | 1701 //TODO: Add cycles in the right place relative to pushing the return address on the stack |
1702 dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); | 1702 dst = cycles(dst, inst->src.addr_mode == MODE_ABSOLUTE ? 12 : 10); |
1703 dst = mov_ir(dst, inst->address + 8, SCRATCH1, SZ_D); | 1703 dst = mov_ir(dst, inst->address + (inst->src.addr_mode == MODE_ABSOLUTE ? 6 : 4), SCRATCH1, SZ_D); |
1704 dst = push_r(dst, SCRATCH1); | 1704 dst = push_r(dst, SCRATCH1); |
1705 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1705 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1706 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1706 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1707 dst = call(dst, (char *)m68k_write_long_highfirst); | 1707 dst = call(dst, (char *)m68k_write_long_highfirst); |
1708 dest_addr = get_native_address(opts->native_code_map, inst->src.params.immed); | 1708 dest_addr = get_native_address(opts->native_code_map, inst->src.params.immed); |