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