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 {
12961296 }
12971297 }
12981298 }
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 }
12991309};
13001310
13011311const RegisterOrMemory = union(enum) {
......@@ -1434,13 +1444,7 @@ fn lowerToMEnc(tag: Tag, reg_or_mem: RegisterOrMemory, code: *std.ArrayList(u8))
14341444 Memory.encodeWithReg(encoder, reg.lowId(), modrm_ext, mem_op.disp);
14351445 } else {
14361446 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);
14441448 }
14451449 },
14461450 }
......@@ -1576,13 +1580,7 @@ fn lowerToMiEnc(tag: Tag, reg_or_mem: RegisterOrMemory, imm: i32, code: *std.Arr
15761580 Memory.encodeWithReg(encoder, dst_reg.lowId(), modrm_ext, dst_mem.disp);
15771581 } else {
15781582 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);
15861584 }
15871585 switch (dst_mem.ptr_size) {
15881586 .byte_ptr => {
......@@ -1649,13 +1647,7 @@ fn lowerToRmEnc(
16491647 .r = reg.isExtended(),
16501648 });
16511649 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);
16591651 }
16601652 },
16611653 }
......@@ -1707,13 +1699,7 @@ fn lowerToMrEnc(
17071699 .r = reg.isExtended(),
17081700 });
17091701 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);
17171703 }
17181704 },
17191705 }
......@@ -1770,13 +1756,7 @@ fn lowerToRmiEnc(
17701756 .r = reg.isExtended(),
17711757 });
17721758 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);
17801760 }
17811761 },
17821762 }