From 110c18588688e4c03010e372668bbb0ab90e4735 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Sun, 21 Nov 2021 17:00:00 +0100 Subject: [PATCH] stage2: add x86_64 NOP MIR inst and lowering If we don't touch the stack, ellide `sub rsp, imm32` to `nop`. --- src/arch/x86_64/CodeGen.zig | 6 ++++++ src/arch/x86_64/Emit.zig | 6 ++++++ src/arch/x86_64/Mir.zig | 3 +++ 3 files changed, 15 insertions(+) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 8f3346e10b..9b2d9c76b0 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -405,6 +405,12 @@ fn gen(self: *Self) InnerError!void { const aligned_stack_end = mem.alignForward(stack_end, self.stack_align); if (aligned_stack_end > 0) { self.mir_instructions.items(.data)[backpatch_reloc].imm = @intCast(i32, aligned_stack_end); + } else { + self.mir_instructions.set(backpatch_reloc, .{ + .tag = .nop, + .ops = undefined, + .data = undefined, + }); } if (self.exitlude_jump_relocs.items.len == 1) { diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index 7fd81d46c2..d337b7c629 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -134,6 +134,7 @@ pub fn emitMir(emit: *Emit) InnerError!void { .@"test" => try emit.mirTest(inst), .brk => try emit.mirBrk(), + .nop => try emit.mirNop(), .call_extern => try emit.mirCallExtern(inst), @@ -185,6 +186,11 @@ fn mirBrk(emit: *Emit) InnerError!void { encoder.opcode_1byte(0xcc); } +fn mirNop(emit: *Emit) InnerError!void { + const encoder = try Encoder.init(emit.code, 1); + encoder.opcode_1byte(0x90); +} + fn mirSyscall(emit: *Emit) InnerError!void { const encoder = try Encoder.init(emit.code, 2); encoder.opcode_2byte(0x0f, 0x05); diff --git a/src/arch/x86_64/Mir.zig b/src/arch/x86_64/Mir.zig index 05d374a856..690b1ce5f2 100644 --- a/src/arch/x86_64/Mir.zig +++ b/src/arch/x86_64/Mir.zig @@ -247,6 +247,9 @@ pub const Inst = struct { /// Breakpoint brk, + /// Nop + nop, + /// Pseudo-instructions /// call extern function /// Notes: