From 68059b52c389143e766c5499c76c6c90c6b82846 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Wed, 3 Apr 2024 23:32:57 +0300 Subject: add callsite register saving --- src/abi.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'src/abi.c') diff --git a/src/abi.c b/src/abi.c index 80f34e4..fede365 100644 --- a/src/abi.c +++ b/src/abi.c @@ -30,7 +30,9 @@ static struct insn rewrite_retval(struct insn n) assert(n.in[1].class == IMM); int64_t nth_retval = n.in[1].v; assert(nth_retval >= 0 && nth_retval < 25); - return insn_create(MOVE, I27, n.out, nth_ar(nth_retval), noclass()); + n = insn_create(MOVE, I27, n.out, nth_ar(nth_retval), noclass()); + set_insn_flags(&n, CALL_TEARDOWN); + return n; } static struct insn rewrite_arg(struct insn n) @@ -40,12 +42,18 @@ static struct insn rewrite_arg(struct insn n) int64_t nth_arg = n.in[1].v; assert(nth_arg >= 0 && nth_arg < 25); - if (n.in[0].class == TMP || n.in[0].class == REG) - return insn_create(MOVE, I27, nth_ar(nth_arg), n.in[0], + if (n.in[0].class == TMP || n.in[0].class == REG) { + n = insn_create(MOVE, I27, nth_ar(nth_arg), n.in[0], noclass()); - else if (n.in[0].class == IMM || n.in[0].class == REF) - return insn_create(COPY, I27, nth_ar(nth_arg), n.in[0], + set_insn_flags(&n, CALL_SETUP); + return n; + } + else if (n.in[0].class == IMM || n.in[0].class == REF) { + n = insn_create(COPY, I27, nth_ar(nth_arg), n.in[0], noclass()); + set_insn_flags(&n, CALL_SETUP); + return n; + } assert("illegal arg type"); abort(); -- cgit v1.3