diff options
Diffstat (limited to 'src/abi.c')
| -rw-r--r-- | src/abi.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -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(); |
