selfhost: fix 4B array load/store width + 8B uninit zero-init
This commit is contained in:
@@ -516,18 +516,22 @@ fn cgident(c: *cgen, n: *node) void = {
|
||||
};
|
||||
|
||||
fn cgindex(c: *cgen, n: *node) void = {
|
||||
// Element-size-aware load: u8-element bases use MOVZBQ,
|
||||
// everything else MOVQ. Fast path when the base is a bare
|
||||
// ident (mem.ww shape).
|
||||
// Element-size-aware load: u8 → MOVZBQ, i32 → MOVSXD, u32 → MOVL,
|
||||
// str → (ptr, len) into (AX, BX), everything else → MOVQ. Fast
|
||||
// path when the base is a bare ident (mem.ww shape).
|
||||
let base: *node = n.lhs;
|
||||
let idx: *node = n.rhs;
|
||||
let esz: i32 = 8;
|
||||
let signed_elem: bool = false;
|
||||
let baselocal: *local = nil;
|
||||
if (base != nil) {
|
||||
if (base.kind == nkind.N_IDENT) {
|
||||
let bn: str = base.str;
|
||||
baselocal = localfindnode(c, bn);
|
||||
if (baselocal != nil) { esz = elemsizeof(baselocal.tnode); };
|
||||
if (baselocal != nil) {
|
||||
esz = elemsizeof(baselocal.tnode);
|
||||
signed_elem = elemissigned(baselocal.tnode);
|
||||
};
|
||||
} else { if (base.kind == nkind.N_DOT) {
|
||||
esz = indexbaseesz(c, base);
|
||||
};};
|
||||
@@ -561,8 +565,12 @@ fn cgindex(c: *cgen, n: *node) void = {
|
||||
emitline("\tMOVQ\tCX, BX\n");
|
||||
return;
|
||||
};
|
||||
if (esz == 1) { emitline("\tMOVZBQ\t(BX), AX\n"); }
|
||||
else { emitline("\tMOVQ\t(BX), AX\n"); };
|
||||
if (esz == 1) { emitline("\tMOVZBQ\t(BX), AX\n"); }
|
||||
else { if (esz == 4) {
|
||||
if (signed_elem) { emitline("\tMOVSXD\t(BX), AX\n"); }
|
||||
else { emitline("\tMOVL\t(BX), AX\n"); };
|
||||
}
|
||||
else { emitline("\tMOVQ\t(BX), AX\n"); };};
|
||||
return;
|
||||
};
|
||||
// Generic fallback when base isn't a plain ident.
|
||||
@@ -575,8 +583,12 @@ fn cgindex(c: *cgen, n: *node) void = {
|
||||
emitline("\tMOVQ\t(AX), AX\n");
|
||||
return;
|
||||
};
|
||||
if (esz == 1) { emitline("\tMOVZBQ\t(AX), AX\n"); }
|
||||
else { emitline("\tMOVQ\t(AX), AX\n"); };
|
||||
if (esz == 1) { emitline("\tMOVZBQ\t(AX), AX\n"); }
|
||||
else { if (esz == 4) {
|
||||
if (signed_elem) { emitline("\tMOVSXD\t(AX), AX\n"); }
|
||||
else { emitline("\tMOVL\t(AX), AX\n"); };
|
||||
}
|
||||
else { emitline("\tMOVQ\t(AX), AX\n"); };};
|
||||
return;
|
||||
};
|
||||
|
||||
@@ -1822,8 +1834,9 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
emitline("\tMOVQ\tCX, 8(BX)\n");
|
||||
return;
|
||||
};
|
||||
if (esz == 1) { emitline("\tMOVB\tAX, (BX)\n"); }
|
||||
else { emitline("\tMOVQ\tAX, (BX)\n"); };
|
||||
if (esz == 1) { emitline("\tMOVB\tAX, (BX)\n"); }
|
||||
else { if (esz == 4) { emitline("\tMOVL\tAX, (BX)\n"); }
|
||||
else { emitline("\tMOVQ\tAX, (BX)\n"); };};
|
||||
return;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user