wcc/ww: global float-struct by-value arg keys the SSE drain off the type

A module-global float-bearing struct passed by value drained all-GP —
the SSE-cursor classify keyed on the node shape and missed the global
ident; key off the stamped struct type (per-eightbyte classify,
F7-flavored stamp fix). Review item #31; dual-stage rows red-proven.
This commit is contained in:
2026-06-12 09:24:39 +09:00
parent e416885d96
commit 9f4626c546
5 changed files with 205 additions and 3 deletions

View File

@@ -30607,7 +30607,17 @@ fn cgcall(c: *cgen, n: *node) void = {
let stfc: i32 = 0;
if (a.kind == nkind.N_IDENT) {
let lc: *local = localfindnode(c, a.str);
if (lc != nil) { stfc = structfloatclass(c, lc.tnode); };
if (lc != nil) { stfc = structfloatclass(c, lc.tnode); }
else {
// #31 EXCEPTION (align-UP): a module-global float-bearing
// struct arg — lc is nil, so the local-only stfc stayed 0 and
// the drain fell to all-GP (X0 never loaded). Key the float-
// class off the global's declared tnode (letvartnode), the same
// SysV classification the local path uses. cstage keys
// structfloatclass off the operand TYPE, not a local slot.
let gtn: *node = letvartnode(c, a.str);
if (gtn != nil) { stfc = structfloatclass(c, gtn); };
};
};
if (stfc != 0) {
// #165: float-bearing struct arg — drain by SysV

View File

@@ -7750,7 +7750,17 @@ fn cgcall(c: *cgen, n: *node) void = {
let stfc: i32 = 0;
if (a.kind == nkind.N_IDENT) {
let lc: *local = localfindnode(c, a.str);
if (lc != nil) { stfc = structfloatclass(c, lc.tnode); };
if (lc != nil) { stfc = structfloatclass(c, lc.tnode); }
else {
// #31 EXCEPTION (align-UP): a module-global float-bearing
// struct arg — lc is nil, so the local-only stfc stayed 0 and
// the drain fell to all-GP (X0 never loaded). Key the float-
// class off the global's declared tnode (letvartnode), the same
// SysV classification the local path uses. cstage keys
// structfloatclass off the operand TYPE, not a local slot.
let gtn: *node = letvartnode(c, a.str);
if (gtn != nil) { stfc = structfloatclass(c, gtn); };
};
};
if (stfc != 0) {
// #165: float-bearing struct arg — drain by SysV

View File

@@ -30607,7 +30607,17 @@ fn cgcall(c: *cgen, n: *node) void = {
let stfc: i32 = 0;
if (a.kind == nkind.N_IDENT) {
let lc: *local = localfindnode(c, a.str);
if (lc != nil) { stfc = structfloatclass(c, lc.tnode); };
if (lc != nil) { stfc = structfloatclass(c, lc.tnode); }
else {
// #31 EXCEPTION (align-UP): a module-global float-bearing
// struct arg — lc is nil, so the local-only stfc stayed 0 and
// the drain fell to all-GP (X0 never loaded). Key the float-
// class off the global's declared tnode (letvartnode), the same
// SysV classification the local path uses. cstage keys
// structfloatclass off the operand TYPE, not a local slot.
let gtn: *node = letvartnode(c, a.str);
if (gtn != nil) { stfc = structfloatclass(c, gtn); };
};
};
if (stfc != 0) {
// #165: float-bearing struct arg — drain by SysV