From 40590c8bf976a44451e161b4a75d7f8bac15a7d4 Mon Sep 17 00:00:00 2001 From: Koakuma Date: Mon, 13 Jun 2022 22:34:10 +0700 Subject: [PATCH] stage2: sparc64: Save registers before calling another function --- src/arch/sparc64/CodeGen.zig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/arch/sparc64/CodeGen.zig b/src/arch/sparc64/CodeGen.zig index d0eee413ad..3c9083faa1 100644 --- a/src/arch/sparc64/CodeGen.zig +++ b/src/arch/sparc64/CodeGen.zig @@ -1081,6 +1081,13 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallOptions. // (SCD 2.4.1, page 3P-10) try self.spillConditionFlagsIfOccupied(); + // Save caller-saved registers, but crucially *after* we save the + // compare flags as saving compare flags may require a new + // caller-saved register + for (abi.caller_preserved_regs) |reg| { + try self.register_manager.getReg(reg, null); + } + for (info.args) |mc_arg, arg_i| { const arg = args[arg_i]; const arg_ty = self.air.typeOf(arg);