aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-03-27 22:23:14 +0100
committerJakub Konka <kubkon@jakubkonka.com>2021-03-31 23:27:50 +0200
commit1b657e6e41bcaf362d1cc9455c17e06e57973554 (patch)
tree796f29c590abe7d5dc5d0ab5ad195ab8a890e7d0 /src
parente088a17f56a154ecc43c36e8308833d657e6f43e (diff)
downloadzig-1b657e6e41bcaf362d1cc9455c17e06e57973554.tar.gz
zig-1b657e6e41bcaf362d1cc9455c17e06e57973554.zip
stage2 codegen: Make sure function return value is in a callee
preserved register
Diffstat (limited to 'src')
-rw-r--r--src/codegen.zig10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 6365d66ec6..bc3480ca01 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -2194,6 +2194,16 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
unreachable;
}
+ switch (info.return_value) {
+ .register => |reg| {
+ if (Register.allocIndex(reg) == null) {
+ // Save function return value in a callee saved register
+ return try self.copyToNewRegister(&inst.base, info.return_value);
+ }
+ },
+ else => {},
+ }
+
return info.return_value;
}