w6c+wwstage: array return-by-value via the struct-return ABI (#267 fold-2)
Wire TY_ARRAY into the existing struct-return gates so arrays ride the same reg-class (<=24B in AX:DX:CX) / sret-class (>24B) path the struct return ABI already emits byte-identically. No new ABI machinery. Both stages, uniform gate-widen: - cg_sret_retsize / sretretsize: +TY_ARRAY (natural size sub.size*len, the type table) -> auto-enables sret send/recv + the >24B sret N_IDENT word-copy + return-forward, all keyed on the shared sret SSoT. - cgreturn <=24B reg-send: +TY_ARRAY (N_IDENT scratch word-copy -> AX/DX/CX). reg-class return-forward rides the default cgexpr passthrough. - let-init / assign <=24B recv: +TY_ARRAY (AX/DX/CX sized stores). struct_float_class stays struct-only: pure-int element arrays only; no pure-float-array-return consumer exists today. 949 +11 rows: reg-class 8/16/24B + sret-class 32B, [N]u32 and [N]u8, at let-init/assign/return-forward, full-member readback, + a struct- return regression control. All cstage-run + cs==ww byte-id.
This commit is contained in:
@@ -954,6 +954,72 @@ static const struct row rows[] = {
|
||||
" let c: T = G;\n"
|
||||
" return (c.a+c.b+c.c+c.d): i32;\n"
|
||||
"};\n", 100, 1 },
|
||||
/* #267 fold-2: array return-by-value ABI. Arrays ride the existing
|
||||
* struct-return path (≤24B in AX:DX:CX, >24B via sret) — these rows
|
||||
* pin the runtime value AND cs==ww byte-id across reg-class (8/16/
|
||||
* 24B) and sret-class (32B), [N]u32 and [N]u8, at the let-init /
|
||||
* assign / return-forward receive contexts. ctrl_struct_ret is the
|
||||
* regression control: a struct return still byte-id (the struct path
|
||||
* the arrays were wired into didn't change). FULL readback (sum every
|
||||
* member) so a dropped eightbyte surfaces. */
|
||||
{ "ret_arr_u32_8",
|
||||
"package main;\n"
|
||||
"fn mk() [2]u32 = { let a: [2]u32; a[0]=3u32; a[1]=4u32; return a; };\n"
|
||||
"export fn main() i32 = { let c = mk(); return (c[0]+c[1]): i32; };\n",
|
||||
7, 1 },
|
||||
{ "ret_arr_u32_16",
|
||||
"package main;\n"
|
||||
"fn mk() [4]u32 = { let a: [4]u32; a[0]=1u32;a[1]=2u32;a[2]=3u32;a[3]=4u32; return a; };\n"
|
||||
"export fn main() i32 = { let c = mk(); return (c[0]+c[1]+c[2]+c[3]): i32; };\n",
|
||||
10, 1 },
|
||||
{ "ret_arr_u32_24",
|
||||
"package main;\n"
|
||||
"fn mk() [6]u32 = { let a: [6]u32; a[0]=1u32;a[1]=2u32;a[2]=3u32;a[3]=4u32;a[4]=5u32;a[5]=6u32; return a; };\n"
|
||||
"export fn main() i32 = { let c = mk(); return (c[0]+c[1]+c[2]+c[3]+c[4]+c[5]): i32; };\n",
|
||||
21, 1 },
|
||||
{ "ret_arr_u32_32_sret",
|
||||
"package main;\n"
|
||||
"fn mk() [8]u32 = { let a: [8]u32; a[0]=1u32;a[1]=2u32;a[2]=3u32;a[3]=4u32;a[4]=5u32;a[5]=6u32;a[6]=7u32;a[7]=8u32; return a; };\n"
|
||||
"export fn main() i32 = { let c = mk(); return (c[0]+c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]): i32; };\n",
|
||||
36, 1 },
|
||||
{ "ret_arr_u8_4",
|
||||
"package main;\n"
|
||||
"fn mk() [4]u8 = { let a: [4]u8; a[0]=10u8;a[1]=20u8;a[2]=30u8;a[3]=40u8; return a; };\n"
|
||||
"export fn main() i32 = { let c = mk(); return (c[0]+c[1]+c[2]+c[3]): i32; };\n",
|
||||
100, 1 },
|
||||
{ "ret_arr_u8_32_sret",
|
||||
"package main;\n"
|
||||
"fn mk() [32]u8 = { let a: [32]u8; a[0]=50u8;a[15]=30u8;a[31]=40u8; return a; };\n"
|
||||
"export fn main() i32 = { let c = mk(); return (c[0]+c[15]+c[31]): i32; };\n",
|
||||
120, 1 },
|
||||
{ "ret_arr_assign_16",
|
||||
"package main;\n"
|
||||
"fn mk() [4]u32 = { let a: [4]u32; a[0]=1u32;a[1]=2u32;a[2]=3u32;a[3]=4u32; return a; };\n"
|
||||
"export fn main() i32 = { let c: [4]u32; c = mk(); return (c[0]+c[1]+c[2]+c[3]): i32; };\n",
|
||||
10, 1 },
|
||||
{ "ret_arr_assign_32_sret",
|
||||
"package main;\n"
|
||||
"fn mk() [8]u32 = { let a: [8]u32; a[0]=1u32;a[7]=8u32; return a; };\n"
|
||||
"export fn main() i32 = { let c: [8]u32; c = mk(); return (c[0]+c[7]): i32; };\n",
|
||||
9, 1 },
|
||||
{ "ret_arr_fwd_16",
|
||||
"package main;\n"
|
||||
"fn mk() [4]u32 = { let a: [4]u32; a[0]=1u32;a[1]=2u32;a[2]=3u32;a[3]=4u32; return a; };\n"
|
||||
"fn fwd() [4]u32 = { return mk(); };\n"
|
||||
"export fn main() i32 = { let c = fwd(); return (c[0]+c[1]+c[2]+c[3]): i32; };\n",
|
||||
10, 1 },
|
||||
{ "ret_arr_fwd_32_sret",
|
||||
"package main;\n"
|
||||
"fn mk() [8]u32 = { let a: [8]u32; a[0]=1u32;a[7]=8u32; return a; };\n"
|
||||
"fn fwd() [8]u32 = { return mk(); };\n"
|
||||
"export fn main() i32 = { let c = fwd(); return (c[0]+c[7]): i32; };\n",
|
||||
9, 1 },
|
||||
{ "ctrl_struct_ret",
|
||||
"package main;\n"
|
||||
"type T = struct { a: u32, b: u32, c: u32 };\n"
|
||||
"fn mk() T = { let s: T; s.a=1u32;s.b=2u32;s.c=3u32; return s; };\n"
|
||||
"export fn main() i32 = { let v = mk(); return (v.a+v.b+v.c): i32; };\n",
|
||||
6, 1 },
|
||||
{ NULL, NULL, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user