authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-02 01:00:21+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-04 01:21:23+01:00
log7a8a630bb22a0f632f13f3cb36715002df9985cc
tree4007b0e2d9c3ab83a131190f04fe118774d337ff
parent8628bb780f6d9c6b4667571b48f90d84374d2b59

stage2: dedup DS/RIP encoding for memory operand in Isel


1 files changed, 15 insertions(+), 35 deletions(-)

src/arch/x86_64/Isel.zig+15-35
...@@ -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};
13001310
1301const RegisterOrMemory = union(enum) {1311const 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 }