w6c: widen of a module-global tagged ident copies the whole box

cstage spilled frame garbage as the box; mirror the landed wwstage
emission (copy from gi(SB)). The F8-era divergence-only rows gain
pinned cs==ww values. Task #44.
This commit is contained in:
2026-06-12 22:41:45 +09:00
parent ca4ff4b882
commit fc47c3d0f2
2 changed files with 37 additions and 42 deletions

View File

@@ -2611,7 +2611,8 @@ cg_widen_tagged_store(Cg *c, Local **locals_p, Type *dst, Node *src,
for (int k = 0; k < sz; k += 8)
ins2(c, A_MOVQ, areg(D_AX),
amem(D_BP, write_off + k));
if (src->kind == N_IDENT) {
if (src->kind == N_IDENT
&& localfind(*locals_p, src->str) != 0) {
int soff = localfind(*locals_p, src->str);
for (int k = 0; k < ssz; k += 8) {
ins2(c, A_MOVQ, amem(D_BP, soff + k),
@@ -2619,6 +2620,21 @@ cg_widen_tagged_store(Cg *c, Local **locals_p, Type *dst, Node *src,
ins2(c, A_MOVQ, areg(D_AX),
amem(D_BP, write_off + 8 + k));
}
} else if (src->kind == N_IDENT) {
/* #44 (#263): a module-global tagged ident
* source has no BP slot — land gi(SB) in SI
* (aggarg_srcaddr) and copy the inner box into
* slot+8. Pre-fix the BP copy read frame garbage
* off 0(BP). ww half landed F8-c8. */
if (aggarg_srcaddr(c, src, D_SI, *locals_p)) {
for (int k = 0; k < ssz; k += 8) {
ins2(c, A_MOVQ,
amem(D_SI, k), areg(D_AX));
ins2(c, A_MOVQ, areg(D_AX),
amem(D_BP,
write_off + 8 + k));
}
}
} else {
/* #38b: an sret-classified call result is in
* memory (AX = dest pointer), not the cursor —