wcc+w6c_ww: >48B tagged args from place-resolved sources (#38b cont.)
Task #40 (FB3): the #38b MEMORY-class staging only accepted ident / aggarg_srcaddr-enumerated sources, loud-stopping on a slice-element arg — the regex run_thread loop-condition shape is_consuming_inst(re.insts[threads[i].pc]) (regex.ha:602) and B4's (*p)[i] spelling. The staging now falls back to cgplaceaddr (the F6 resolver) for the slot's source address; the existing word-push machinery is unchanged. Placed AFTER aggarg_srcaddr so every pre-#40 shape keeps its asm byte-exact (verified vs a master w6c). Boundaries kept loud (rule 7): exact-type rvalue (no place to resolve), sret-class call source (#40-family follow-up), global tagged let (task #25), variadic element, register-overflow mixing. Diagnostic re-worded to match: slice-element is wired, rvalue and unresolvable-place sources are not. test/929 grows 6 run rows (element source with literal+computed index, deref-spine, nested re.insts[threads[i].pc] spelling, element mixed with register args both orders, fn-call index with two mem args per call — the inner CALL runs inside the mem pre-pass with the other slot already staged — and global-slice element, the storage-backed twin of the loud fail_global_src boundary — all build-fail loud at master) and 1 reject row pinning the new boundary text on both stages.
This commit is contained in:
@@ -7391,8 +7391,23 @@ cgexpr(Cg *c, Node *n, Local *locals)
|
||||
memslots += msz / 8;
|
||||
continue;
|
||||
}
|
||||
/* #40/FB3: a place the enumerated arms miss —
|
||||
* slice element, deref-spine element — resolves
|
||||
* through the F6 resolver. AFTER aggarg_srcaddr
|
||||
* so every pre-#40 shape keeps its asm; the
|
||||
* resolver balances its own pushes, so the words
|
||||
* already staged below stay put. */
|
||||
if (cgplaceaddr(c, args[i], D_SI, locals)) {
|
||||
for (int k = msz/8 - 1; k >= 0; k--) {
|
||||
ins2(c, A_MOVQ, amem(D_SI, k*8),
|
||||
areg(D_AX));
|
||||
ins1(c, A_PUSHQ, areg(D_AX));
|
||||
}
|
||||
memslots += msz / 8;
|
||||
continue;
|
||||
}
|
||||
fatal("#38b: >48B tagged arg from unsupported source "
|
||||
"kind %d (slice-element and rvalue sources "
|
||||
"kind %d (rvalue and unresolvable-place sources "
|
||||
"unwired)", args[i]->kind);
|
||||
}
|
||||
/* eval right-to-left, push to stack. Each N_IDENT fast-path
|
||||
|
||||
Reference in New Issue
Block a user