summaryrefslogtreecommitdiff
path: root/amd64
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2020-04-19 16:31:57 -0700
committerQuentin Carbonneaux <quentin@c9x.me>2020-08-06 10:11:01 +0200
commitf059f8b1cf415a7fba36f6b96206bb3d6776e41d (patch)
tree0e9782753789fe9791b46e0684993449d9e56871 /amd64
parent9639940cb46f0f8b5dcd872e99a9801df742f24c (diff)
downloadroux-f059f8b1cf415a7fba36f6b96206bb3d6776e41d.tar.gz
amd64: Use member class for aggregate parameter temporary
Otherwise, we may end up using an integer and floating class for the same register, triggering an assertion failure: qbe: rega.c:215: pmrec: Assertion `KBASE(pm[i].cls) == KBASE(*k)' failed. Test case: type :T = { s } export function $d(:T %.1, s %.2) { @start call $c(s %.2) ret }
Diffstat (limited to 'amd64')
-rw-r--r--amd64/sysv.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/amd64/sysv.c b/amd64/sysv.c
index 286300a..3125069 100644
--- a/amd64/sysv.c
+++ b/amd64/sysv.c
@@ -467,10 +467,10 @@ selpar(Fn *fn, Ins *i0, Ins *i1)
}
r = rarg(a->cls[0], &ni, &ns);
if (i->op == Oparc) {
- emit(Ocopy, Kl, a->ref[0], r, R);
+ emit(Ocopy, a->cls[0], a->ref[0], r, R);
if (a->size > 8) {
r = rarg(a->cls[1], &ni, &ns);
- emit(Ocopy, Kl, a->ref[1], r, R);
+ emit(Ocopy, a->cls[1], a->ref[1], r, R);
}
} else
emit(Ocopy, i->cls, i->to, r, R);