aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKoakuma <koachan@protonmail.com>2022-06-13 22:34:10 +0700
committerKoakuma <koachan@protonmail.com>2022-06-24 21:08:41 +0700
commit40590c8bf976a44451e161b4a75d7f8bac15a7d4 (patch)
tree249d5671d25df337af85ae8ccd3dd0217553aaf5 /src
parent5c8612642b84d2d3f91e6bbe26f9cde2579997f7 (diff)
downloadzig-40590c8bf976a44451e161b4a75d7f8bac15a7d4.tar.gz
zig-40590c8bf976a44451e161b4a75d7f8bac15a7d4.zip
stage2: sparc64: Save registers before calling another function
Diffstat (limited to 'src')
-rw-r--r--src/arch/sparc64/CodeGen.zig7
1 files changed, 7 insertions, 0 deletions
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);