| ... | @@ -1296,6 +1296,16 @@ const Memory = struct { | ... | @@ -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 | const RegisterOrMemory = union(enum) { | 1311 | const RegisterOrMemory = union(enum) { |
| ... | @@ -1434,13 +1444,7 @@ fn lowerToMEnc(tag: Tag, reg_or_mem: RegisterOrMemory, code: *std.ArrayList(u8)) | ... | @@ -1434,13 +1444,7 @@ fn lowerToMEnc(tag: Tag, reg_or_mem: RegisterOrMemory, code: *std.ArrayList(u8)) |
| 1434 | Memory.encodeWithReg(encoder, reg.lowId(), modrm_ext, mem_op.disp); | 1444 | Memory.encodeWithReg(encoder, reg.lowId(), modrm_ext, mem_op.disp); |
| 1435 | } else { | 1445 | } else { |
| 1436 | opc.encode(encoder); | 1446 | opc.encode(encoder); |
| 1437 | if (mem_op.rip) { | 1447 | Memory.encodeDsOrRip(encoder, modrm_ext, mem_op.disp, 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); | | |
| 1444 | } | 1448 | } |
| 1445 | }, | 1449 | }, |
| 1446 | } | 1450 | } |
| ... | @@ -1576,13 +1580,7 @@ fn lowerToMiEnc(tag: Tag, reg_or_mem: RegisterOrMemory, imm: i32, code: *std.Arr | ... | @@ -1576,13 +1580,7 @@ fn lowerToMiEnc(tag: Tag, reg_or_mem: RegisterOrMemory, imm: i32, code: *std.Arr |
| 1576 | Memory.encodeWithReg(encoder, dst_reg.lowId(), modrm_ext, dst_mem.disp); | 1580 | Memory.encodeWithReg(encoder, dst_reg.lowId(), modrm_ext, dst_mem.disp); |
| 1577 | } else { | 1581 | } else { |
| 1578 | opc.encode(encoder); | 1582 | opc.encode(encoder); |
| 1579 | if (dst_mem.rip) { | 1583 | Memory.encodeDsOrRip(encoder, modrm_ext, dst_mem.disp, 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); | | |
| 1586 | } | 1584 | } |
| 1587 | switch (dst_mem.ptr_size) { | 1585 | switch (dst_mem.ptr_size) { |
| 1588 | .byte_ptr => { | 1586 | .byte_ptr => { |
| ... | @@ -1649,13 +1647,7 @@ fn lowerToRmEnc( | ... | @@ -1649,13 +1647,7 @@ fn lowerToRmEnc( |
| 1649 | .r = reg.isExtended(), | 1647 | .r = reg.isExtended(), |
| 1650 | }); | 1648 | }); |
| 1651 | opc.encode(encoder); | 1649 | opc.encode(encoder); |
| 1652 | if (src_mem.rip) { | 1650 | Memory.encodeDsOrRip(encoder, reg.lowId(), src_mem.disp, 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); | | |
| 1659 | } | 1651 | } |
| 1660 | }, | 1652 | }, |
| 1661 | } | 1653 | } |
| ... | @@ -1707,13 +1699,7 @@ fn lowerToMrEnc( | ... | @@ -1707,13 +1699,7 @@ fn lowerToMrEnc( |
| 1707 | .r = reg.isExtended(), | 1699 | .r = reg.isExtended(), |
| 1708 | }); | 1700 | }); |
| 1709 | opc.encode(encoder); | 1701 | opc.encode(encoder); |
| 1710 | if (dst_mem.rip) { | 1702 | Memory.encodeDsOrRip(encoder, reg.lowId(), dst_mem.disp, 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); | | |
| 1717 | } | 1703 | } |
| 1718 | }, | 1704 | }, |
| 1719 | } | 1705 | } |
| ... | @@ -1770,13 +1756,7 @@ fn lowerToRmiEnc( | ... | @@ -1770,13 +1756,7 @@ fn lowerToRmiEnc( |
| 1770 | .r = reg.isExtended(), | 1756 | .r = reg.isExtended(), |
| 1771 | }); | 1757 | }); |
| 1772 | opc.encode(encoder); | 1758 | opc.encode(encoder); |
| 1773 | if (src_mem.rip) { | 1759 | Memory.encodeDsOrRip(encoder, reg.lowId(), src_mem.disp, 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); | | |
| 1780 | } | 1760 | } |
| 1781 | }, | 1761 | }, |
| 1782 | } | 1762 | } |