selfhost: fix 4B array load/store width + 8B uninit zero-init
This commit is contained in:
@@ -299,7 +299,24 @@ fn typeis8byteprimitive(c: *cgen, t: *node) bool = {
|
||||
if (k == nkind.N_TFN) { return true; };
|
||||
if (k == nkind.N_TCHAN) { return true; };
|
||||
if (k == nkind.N_TSLICE) { return false; };
|
||||
if (k == nkind.N_TARRAY) { return false; };
|
||||
if (k == nkind.N_TARRAY) {
|
||||
// C cgen (cmd/w6c/cgen.c:3317) zero-inits TY_ARRAY whenever
|
||||
// its raw byte size is 8 — e.g. `[8]bool`, `[2]i32`, `[4]i16`,
|
||||
// `[1]i64`. Mirror that here so the wwstage matches.
|
||||
let lenn: *node = t.rhs;
|
||||
let elemn: *node = t.lhs;
|
||||
if (lenn == nil) { return false; };
|
||||
if (lenn.kind != nkind.N_INTLIT) { return false; };
|
||||
let elen: i64 = lenn.uval: i64;
|
||||
let esz: i32 = 8;
|
||||
if (elemn != nil) {
|
||||
if (elemn.kind == nkind.N_TNAME) {
|
||||
let ps: i32 = primsize(elemn.str);
|
||||
if (ps > 0) { esz = ps; };
|
||||
};
|
||||
};
|
||||
return (esz: i64 * elen) == 8i64;
|
||||
};
|
||||
if (k == nkind.N_TTUPLE) { return false; };
|
||||
if (k == nkind.N_TTAGGED){ return false; };
|
||||
if (k == nkind.N_TNAME) {
|
||||
@@ -315,6 +332,22 @@ fn typeis8byteprimitive(c: *cgen, t: *node) bool = {
|
||||
return false;
|
||||
};
|
||||
|
||||
// elemissigned — given an indexable type (`*T`, `[]T`, `[N]T`), is
|
||||
// its element a signed narrow primitive (i8/i16/i32/rune)? Used by
|
||||
// cgindex to pick MOVSXD vs MOVL at esz=4. Mirrors C cgen's
|
||||
// `signed_elem` check.
|
||||
fn elemissigned(t: *node) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let elem: *node = nil;
|
||||
let k: nkind = t.kind;
|
||||
if (k == nkind.N_TPTR) { elem = t.lhs; };
|
||||
if (k == nkind.N_TSLICE) { elem = t.lhs; };
|
||||
if (k == nkind.N_TARRAY) { elem = t.lhs; };
|
||||
if (elem == nil) { return false; };
|
||||
if (elem.kind != nkind.N_TNAME) { return false; };
|
||||
return typenameissigned(elem.str);
|
||||
};
|
||||
|
||||
// typenameissigned — true for i8/i16/i32/i64/int/rune.
|
||||
fn typenameissigned(nm: str) bool = {
|
||||
if (streq(nm, "i8")) { return true; };
|
||||
|
||||
Reference in New Issue
Block a user