test/949: add non-u8 addr-of + slice-via-ptr rows (#252)
The 7-row table covered u8 addr-of (local + *struct param) and the
non-u8 stride only on the slice path. Two coverage gaps closed:
addr_i32 &x.o[2] on a [4]i32 field, *p read -> 88. The addr-of
complex-base arm scales the index by esz=sizeof(elem)
independent of the base-address path; only u8 (esz=1)
rows exercised it before. Proves IMULQ $4 stride
composes with the dotbaseaddr LEAQ base.
slice_ptr_u8 x.o[1:4] via a *e param. dotbaseaddr's viaptr arm
(MOVQ (BP) deref) on the slice base was untested — all
slice rows used a value-struct (LEAQ) base.
Both run-correct + cs==ww byte-identical.
This commit is contained in:
@@ -24,8 +24,10 @@
|
||||
* for rule-10 byte-id):
|
||||
* - addr_local_u8 &x.o[1] on a local value-struct, *p read → 66
|
||||
* - addr_ptr_u8 &x.o[2] via a *struct param, *p read → 77
|
||||
* - addr_i32 &x.o[2] on [4]i32 field, *p read (esz=4) → 88
|
||||
* - slice_u8_expl x.o[1:4] explicit hi, s[0] read → 66
|
||||
* - slice_u8_dflthi x.o[1:] default hi, s[0] read → 66
|
||||
* - slice_ptr_u8 x.o[1:4] via a *struct param, s[0] read → 66
|
||||
* - slice_i32_expl [4]i32 field x.o[1:3], s[1] read (esz=4) → 88
|
||||
* - slice_i32_dflt [4]i32 field x.o[1:], s[2] read (esz=4) → 55
|
||||
* - control_bare bare-local [4]u8 &a[1] write + a[1:4] read → 44
|
||||
@@ -71,6 +73,15 @@ static const struct row rows[] = {
|
||||
" x.o[2] = 77u8;\n"
|
||||
" return rd(&x): i32;\n"
|
||||
"};\n", 77 },
|
||||
{ "addr_i32",
|
||||
"package main;\n"
|
||||
"type e = struct { o: [4]i32 };\n"
|
||||
"export fn main() i32 = {\n"
|
||||
" let x: e;\n"
|
||||
" x.o[2] = 88;\n"
|
||||
" let p: *i32 = &x.o[2];\n"
|
||||
" return *p;\n"
|
||||
"};\n", 88 },
|
||||
{ "slice_u8_expl",
|
||||
"package main;\n"
|
||||
"type e = struct { o: [4]u8 };\n"
|
||||
@@ -89,6 +100,15 @@ static const struct row rows[] = {
|
||||
" let s: []u8 = x.o[1:];\n"
|
||||
" return s[0]: i32;\n"
|
||||
"};\n", 66 },
|
||||
{ "slice_ptr_u8",
|
||||
"package main;\n"
|
||||
"type e = struct { o: [4]u8 };\n"
|
||||
"fn sl(x: *e) u8 = { let s: []u8 = x.o[1:4]; return s[0]; };\n"
|
||||
"export fn main() i32 = {\n"
|
||||
" let x: e;\n"
|
||||
" x.o[1] = 66u8;\n"
|
||||
" return sl(&x): i32;\n"
|
||||
"};\n", 66 },
|
||||
{ "slice_i32_expl",
|
||||
"package main;\n"
|
||||
"type e = struct { o: [4]i32 };\n"
|
||||
|
||||
Reference in New Issue
Block a user