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:
@@ -16000,7 +16000,23 @@ fn pushargsrev(c: *cgen, arg: *node, param: *node, memphase: bool) i32 = {
|
||||
};
|
||||
return rest + memsz / 8;
|
||||
};
|
||||
let mu: str = "#38b: >48B tagged arg from unsupported source kind (slice-element and rvalue sources unwired)\n";
|
||||
// #40/FB3: a place the enumerated arms miss — slice
|
||||
// element, deref-spine element — resolves through the F6
|
||||
// resolver. AFTER aggargsrcaddr 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, arg, "SI")) {
|
||||
let w: i32 = memsz / 8 - 1;
|
||||
for (w >= 0) {
|
||||
emitline("\tMOVQ\t");
|
||||
emitoff((w*8): i64);
|
||||
emitline("(SI), AX\n");
|
||||
emitline("\tPUSHQ\tAX\n");
|
||||
w -= 1;
|
||||
};
|
||||
return rest + memsz / 8;
|
||||
};
|
||||
let mu: str = "#38b: >48B tagged arg from unsupported source kind (rvalue and unresolvable-place sources unwired)\n";
|
||||
os.write(2, mu.ptr, mu.len: u64);
|
||||
os.exit(1);
|
||||
};
|
||||
|
||||
@@ -214,7 +214,23 @@ fn pushargsrev(c: *cgen, arg: *node, param: *node, memphase: bool) i32 = {
|
||||
};
|
||||
return rest + memsz / 8;
|
||||
};
|
||||
let mu: str = "#38b: >48B tagged arg from unsupported source kind (slice-element and rvalue sources unwired)\n";
|
||||
// #40/FB3: a place the enumerated arms miss — slice
|
||||
// element, deref-spine element — resolves through the F6
|
||||
// resolver. AFTER aggargsrcaddr 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, arg, "SI")) {
|
||||
let w: i32 = memsz / 8 - 1;
|
||||
for (w >= 0) {
|
||||
emitline("\tMOVQ\t");
|
||||
emitoff((w*8): i64);
|
||||
emitline("(SI), AX\n");
|
||||
emitline("\tPUSHQ\tAX\n");
|
||||
w -= 1;
|
||||
};
|
||||
return rest + memsz / 8;
|
||||
};
|
||||
let mu: str = "#38b: >48B tagged arg from unsupported source kind (rvalue and unresolvable-place sources unwired)\n";
|
||||
os.write(2, mu.ptr, mu.len: u64);
|
||||
os.exit(1);
|
||||
};
|
||||
|
||||
@@ -16000,7 +16000,23 @@ fn pushargsrev(c: *cgen, arg: *node, param: *node, memphase: bool) i32 = {
|
||||
};
|
||||
return rest + memsz / 8;
|
||||
};
|
||||
let mu: str = "#38b: >48B tagged arg from unsupported source kind (slice-element and rvalue sources unwired)\n";
|
||||
// #40/FB3: a place the enumerated arms miss — slice
|
||||
// element, deref-spine element — resolves through the F6
|
||||
// resolver. AFTER aggargsrcaddr 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, arg, "SI")) {
|
||||
let w: i32 = memsz / 8 - 1;
|
||||
for (w >= 0) {
|
||||
emitline("\tMOVQ\t");
|
||||
emitoff((w*8): i64);
|
||||
emitline("(SI), AX\n");
|
||||
emitline("\tPUSHQ\tAX\n");
|
||||
w -= 1;
|
||||
};
|
||||
return rest + memsz / 8;
|
||||
};
|
||||
let mu: str = "#38b: >48B tagged arg from unsupported source kind (rvalue and unresolvable-place sources unwired)\n";
|
||||
os.write(2, mu.ptr, mu.len: u64);
|
||||
os.exit(1);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user