| ... | ... | @@ -1296,6 +1296,16 @@ const Memory = struct { |
| 1296 | 1296 | } |
| 1297 | 1297 | } |
| 1298 | 1298 | } |
| 1299 | |
| 1300 | fn encodeDsOrRip(encoder: Encoder, op: u3, disp: i32, rip: bool) void { |
| 1301 | if (rip) { |
| 1302 | encoder.modRm_RIPDisp32(op); |
| 1303 | } else { |
| 1304 | encoder.modRm_SIBDisp0(op); |
| 1305 | encoder.sib_disp32(); |
| 1306 | } |
| 1307 | encoder.disp32(disp); |
| 1308 | } |
| 1299 | 1309 | }; |
| 1300 | 1310 | |
| 1301 | 1311 | const RegisterOrMemory = union(enum) { |
| ... | ... | @@ -1434,13 +1444,7 @@ fn lowerToMEnc(tag: Tag, reg_or_mem: RegisterOrMemory, code: *std.ArrayList(u8)) |
| 1434 | 1444 | Memory.encodeWithReg(encoder, reg.lowId(), modrm_ext, mem_op.disp); |
| 1435 | 1445 | } else { |
| 1436 | 1446 | opc.encode(encoder); |
| 1437 | | if (mem_op.rip) { |
| 1438 | | encoder.modRm_RIPDisp32(modrm_ext); |
| 1439 | | } else { |
| 1440 | | encoder.modRm_SIBDisp0(modrm_ext); |
| 1441 | | encoder.sib_disp32(); |
| 1442 | | } |
| 1443 | | encoder.disp32(mem_op.disp); |
| 1447 | Memory.encodeDsOrRip(encoder, modrm_ext, mem_op.disp, mem_op.rip); |
| 1444 | 1448 | } |
| 1445 | 1449 | }, |
| 1446 | 1450 | } |
| ... | ... | @@ -1576,13 +1580,7 @@ fn lowerToMiEnc(tag: Tag, reg_or_mem: RegisterOrMemory, imm: i32, code: *std.Arr |
| 1576 | 1580 | Memory.encodeWithReg(encoder, dst_reg.lowId(), modrm_ext, dst_mem.disp); |
| 1577 | 1581 | } else { |
| 1578 | 1582 | opc.encode(encoder); |
| 1579 | | if (dst_mem.rip) { |
| 1580 | | encoder.modRm_RIPDisp32(modrm_ext); |
| 1581 | | } else { |
| 1582 | | encoder.modRm_SIBDisp0(modrm_ext); |
| 1583 | | encoder.sib_disp32(); |
| 1584 | | } |
| 1585 | | encoder.disp32(dst_mem.disp); |
| 1583 | Memory.encodeDsOrRip(encoder, modrm_ext, dst_mem.disp, dst_mem.rip); |
| 1586 | 1584 | } |
| 1587 | 1585 | switch (dst_mem.ptr_size) { |
| 1588 | 1586 | .byte_ptr => { |
| ... | ... | @@ -1649,13 +1647,7 @@ fn lowerToRmEnc( |
| 1649 | 1647 | .r = reg.isExtended(), |
| 1650 | 1648 | }); |
| 1651 | 1649 | opc.encode(encoder); |
| 1652 | | if (src_mem.rip) { |
| 1653 | | encoder.modRm_RIPDisp32(reg.lowId()); |
| 1654 | | } else { |
| 1655 | | encoder.modRm_SIBDisp0(reg.lowId()); |
| 1656 | | encoder.sib_disp32(); |
| 1657 | | } |
| 1658 | | encoder.disp32(src_mem.disp); |
| 1650 | Memory.encodeDsOrRip(encoder, reg.lowId(), src_mem.disp, src_mem.rip); |
| 1659 | 1651 | } |
| 1660 | 1652 | }, |
| 1661 | 1653 | } |
| ... | ... | @@ -1707,13 +1699,7 @@ fn lowerToMrEnc( |
| 1707 | 1699 | .r = reg.isExtended(), |
| 1708 | 1700 | }); |
| 1709 | 1701 | opc.encode(encoder); |
| 1710 | | if (dst_mem.rip) { |
| 1711 | | encoder.modRm_RIPDisp32(reg.lowId()); |
| 1712 | | } else { |
| 1713 | | encoder.modRm_SIBDisp0(reg.lowId()); |
| 1714 | | encoder.sib_disp32(); |
| 1715 | | } |
| 1716 | | encoder.disp32(dst_mem.disp); |
| 1702 | Memory.encodeDsOrRip(encoder, reg.lowId(), dst_mem.disp, dst_mem.rip); |
| 1717 | 1703 | } |
| 1718 | 1704 | }, |
| 1719 | 1705 | } |
| ... | ... | @@ -1770,13 +1756,7 @@ fn lowerToRmiEnc( |
| 1770 | 1756 | .r = reg.isExtended(), |
| 1771 | 1757 | }); |
| 1772 | 1758 | opc.encode(encoder); |
| 1773 | | if (src_mem.rip) { |
| 1774 | | encoder.modRm_RIPDisp32(reg.lowId()); |
| 1775 | | } else { |
| 1776 | | encoder.modRm_SIBDisp0(reg.lowId()); |
| 1777 | | encoder.sib_disp32(); |
| 1778 | | } |
| 1779 | | encoder.disp32(src_mem.disp); |
| 1759 | Memory.encodeDsOrRip(encoder, reg.lowId(), src_mem.disp, src_mem.rip); |
| 1780 | 1760 | } |
| 1781 | 1761 | }, |
| 1782 | 1762 | } |