authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-25 21:26:12-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-25 21:26:18-04:00
log14c0b8c54863a4f88ffc0e6a740998bc0ebe89d5
tree3be5e5f1bd8e660a97618e0a193310afdb124167
parenta80be15cd494dbd25874db8ef63c1cbbcdfc732a

x86_64: remove unused Mir encodings

This also restores the size of Mir.Inst and simplifies logic in general.

3 files changed, 13 insertions(+), 38 deletions(-)

src/arch/x86_64/CodeGen.zig+3-12
......@@ -668,20 +668,11 @@ fn asmMemoryRegisterImmediate(
668668 _ = try self.addInst(.{
669669 .tag = tag,
670670 .ops = switch (m) {
671 .sib => switch (imm) {
672 .signed => .mri_sib_s,
673 .unsigned => .mri_sib_u,
674 },
675 .rip => switch (imm) {
676 .signed => .mri_rip_s,
677 .unsigned => .mri_sib_u,
678 },
671 .sib => .mri_sib,
672 .rip => .mri_rip,
679673 else => unreachable,
680674 },
681 .data = .{ .rix = .{ .r = reg, .i = switch (imm) {
682 .signed => |s| @bitCast(u32, s),
683 .unsigned => |u| @intCast(u32, u),
684 }, .payload = switch (m) {
675 .data = .{ .rix = .{ .r = reg, .i = @intCast(u8, imm.unsigned), .payload = switch (m) {
685676 .sib => try self.addExtra(Mir.MemorySib.encode(m)),
686677 .rip => try self.addExtra(Mir.MemoryRip.encode(m)),
687678 else => unreachable,
src/arch/x86_64/Emit.zig+4-14
......@@ -359,27 +359,17 @@ fn mirEncodeGeneric(emit: *Emit, tag: Mir.Inst.Tag, inst: Mir.Inst.Index) InnerE
359359 op2 = .{ .reg = data.rrx.r1 };
360360 op2 = .{ .reg = data.rrx.r2 };
361361 },
362 .mri_sib_u, .mri_sib_s => {
362 .mri_sib => {
363363 const msib = emit.mir.extraData(Mir.MemorySib, data.rix.payload).data;
364 const imm = switch (ops) {
365 .mri_sib_s => Immediate.s(@bitCast(i32, data.rix.i)),
366 .mri_sib_u, .lock_mi_rip_u => Immediate.u(data.rix.i),
367 else => unreachable,
368 };
369364 op1 = .{ .mem = Mir.MemorySib.decode(msib) };
370365 op2 = .{ .reg = data.rix.r };
371 op3 = .{ .imm = imm };
366 op3 = .{ .imm = Immediate.u(data.rix.i) };
372367 },
373 .mri_rip_u, .mri_rip_s => {
368 .mri_rip => {
374369 const mrip = emit.mir.extraData(Mir.MemoryRip, data.rix.payload).data;
375 const imm = switch (ops) {
376 .mri_rip_s => Immediate.s(@bitCast(i32, data.rix.i)),
377 .mri_rip_u, .lock_mi_rip_u => Immediate.u(data.rix.i),
378 else => unreachable,
379 };
380370 op1 = .{ .mem = Mir.MemoryRip.decode(mrip) };
381371 op2 = .{ .reg = data.rix.r };
382 op3 = .{ .imm = imm };
372 op3 = .{ .imm = Immediate.u(data.rix.i) };
383373 },
384374 else => return emit.fail("TODO handle generic encoding: {s}, {s}", .{
385375 @tagName(mnemonic),
src/arch/x86_64/Mir.zig+6-12
......@@ -343,18 +343,12 @@ pub const Inst = struct {
343343 /// Memory (RIP), register, register operands.
344344 /// Uses `rrx` payload with extra data of type `MemoryRip`.
345345 mrr_rip,
346 /// Memory (SIB), register, immediate (unsigned) operands.
346 /// Memory (SIB), register, immediate (byte) operands.
347347 /// Uses `rix` payload with extra data of type `MemorySib`.
348 mri_sib_u,
349 /// Memory (RIP), register, immediate (unsigned) operands.
348 mri_sib,
349 /// Memory (RIP), register, immediate (byte) operands.
350350 /// Uses `rix` payload with extra data of type `MemoryRip`.
351 mri_rip_u,
352 /// Memory (SIB), register, immediate (signed) operands.
353 /// Uses `rix` payload with extra data of type `MemorySib`.
354 mri_sib_s,
355 /// Memory (RIP), register, immediate (signed) operands.
356 /// Uses `rix` payload with extra data of type `MemoryRip`.
357 mri_rip_s,
351 mri_rip,
358352 /// Rax, Memory moffs.
359353 /// Uses `payload` with extra data of type `MemoryMoffs`.
360354 rax_moffs,
......@@ -481,10 +475,10 @@ pub const Inst = struct {
481475 r2: Register,
482476 payload: u32,
483477 },
484 /// Register, immediate, followed by Custom payload found in extra.
478 /// Register, byte immediate, followed by Custom payload found in extra.
485479 rix: struct {
486480 r: Register,
487 i: u32,
481 i: u8,
488482 payload: u32,
489483 },
490484 /// String instruction prefix and width.