| author | |
| committer | |
| log | 14c0b8c54863a4f88ffc0e6a740998bc0ebe89d5 |
| tree | 3be5e5f1bd8e660a97618e0a193310afdb124167 |
| parent | a80be15cd494dbd25874db8ef63c1cbbcdfc732a |
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( |
| 668 | 668 | _ = try self.addInst(.{ |
| 669 | 669 | .tag = tag, |
| 670 | 670 | .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, | |
| 679 | 673 | else => unreachable, |
| 680 | 674 | }, |
| 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) { | |
| 685 | 676 | .sib => try self.addExtra(Mir.MemorySib.encode(m)), |
| 686 | 677 | .rip => try self.addExtra(Mir.MemoryRip.encode(m)), |
| 687 | 678 | 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 |
| 359 | 359 | op2 = .{ .reg = data.rrx.r1 }; |
| 360 | 360 | op2 = .{ .reg = data.rrx.r2 }; |
| 361 | 361 | }, |
| 362 | .mri_sib_u, .mri_sib_s => { | |
| 362 | .mri_sib => { | |
| 363 | 363 | 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 | }; | |
| 369 | 364 | op1 = .{ .mem = Mir.MemorySib.decode(msib) }; |
| 370 | 365 | op2 = .{ .reg = data.rix.r }; |
| 371 | op3 = .{ .imm = imm }; | |
| 366 | op3 = .{ .imm = Immediate.u(data.rix.i) }; | |
| 372 | 367 | }, |
| 373 | .mri_rip_u, .mri_rip_s => { | |
| 368 | .mri_rip => { | |
| 374 | 369 | 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 | }; | |
| 380 | 370 | op1 = .{ .mem = Mir.MemoryRip.decode(mrip) }; |
| 381 | 371 | op2 = .{ .reg = data.rix.r }; |
| 382 | op3 = .{ .imm = imm }; | |
| 372 | op3 = .{ .imm = Immediate.u(data.rix.i) }; | |
| 383 | 373 | }, |
| 384 | 374 | else => return emit.fail("TODO handle generic encoding: {s}, {s}", .{ |
| 385 | 375 | @tagName(mnemonic), |
src/arch/x86_64/Mir.zig+6-12| ... | ... | @@ -343,18 +343,12 @@ pub const Inst = struct { |
| 343 | 343 | /// Memory (RIP), register, register operands. |
| 344 | 344 | /// Uses `rrx` payload with extra data of type `MemoryRip`. |
| 345 | 345 | mrr_rip, |
| 346 | /// Memory (SIB), register, immediate (unsigned) operands. | |
| 346 | /// Memory (SIB), register, immediate (byte) operands. | |
| 347 | 347 | /// 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. | |
| 350 | 350 | /// 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, | |
| 358 | 352 | /// Rax, Memory moffs. |
| 359 | 353 | /// Uses `payload` with extra data of type `MemoryMoffs`. |
| 360 | 354 | rax_moffs, |
| ... | ... | @@ -481,10 +475,10 @@ pub const Inst = struct { |
| 481 | 475 | r2: Register, |
| 482 | 476 | payload: u32, |
| 483 | 477 | }, |
| 484 | /// Register, immediate, followed by Custom payload found in extra. | |
| 478 | /// Register, byte immediate, followed by Custom payload found in extra. | |
| 485 | 479 | rix: struct { |
| 486 | 480 | r: Register, |
| 487 | i: u32, | |
| 481 | i: u8, | |
| 488 | 482 | payload: u32, |
| 489 | 483 | }, |
| 490 | 484 | /// String instruction prefix and width. |