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