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:
@@ -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 —
|
||||
|
||||
Reference in New Issue
Block a user