cstage's N_CAST narrow-clamp emitted `MOVL AX, AX` on u32 → enum-u32 casts. wwstage's cgcast walker steps through N_TBANG / N_TNAME alias links only; an enum's aliaslookup returns the N_TENUM body, which breaks the loop and skips the clamp. The asymmetry surfaced during #10 (lib/os/stat) when kstat.mode typed as u32 tripped the cross- stage diff; worker-stat sidestepped by typing kstat.mode as `mode`. Single-site gate: skip the narrow-clamp when the destination type is TY_ENUM. Mirrors wwstage's N_TENUM lacuna exactly. Predicate recursion (type_isint, type_isunsigned) over TY_ENUM stays intact — this is emit-side only. Wwstage unchanged. Test 710 (cast_enum_movl): 5 rows × {exit-code per driver, asm byte-id when w6c_ww built} = 10+ assertions. u32→enum-u32 headline, enum-u32→u32 reverse (pins direction-of-asymmetry), u32→enum-u8 different-width, i64→enum-i32 signed-narrow, struct-field rt mirror of `out.mode = k.mode` (the #10 trip-wire). A principled identity-width identity-sign skip across both stages is filed as #33. The lib/os.ww kstat.mode workaround revert is a sibling cleanup, not in #25 scope.
236 KiB
236 KiB