ffi 0.2: fold Pair64 + Quad32 back into small-struct baseline

Now that emit_llvm.zig bridges the struct<->[2 x i64] ABI mismatch
(previous commit), the 9..16-byte integer-only shapes round-trip
cleanly. Extended `examples/ffi-02-small-struct.sx` to cover all
four aggregate ABI slots in one place:

  Vec2   — 8 B,  two f32    (register pair, float)
  Vec4f  — 16 B, four f32   (HFA — homogeneous float aggregate)
  Pair64 — 16 B, two s64    (9..16 B int — [2 x i64] coercion slot)
  Quad32 — 16 B, four s32   (same slot as Pair64)

Vendor helpers (`vendors/ffi_structs/{ffi_structs.h,ffi_structs.c}`)
grow `ffi_pair64_*` + `ffi_quad32_*` companions. Snapshot updated
to capture the full output. 89/89 regression tests pass.

`examples/101-ffi-medium-struct.sx` keeps a minimal focused repro
of the Pair64 case so the issue's emergence-and-fix history stays
greppable.
This commit is contained in:
agra
2026-05-19 11:32:36 +03:00
parent 7d2c2fb062
commit edd8689fb2
4 changed files with 111 additions and 41 deletions

View File

@@ -1,6 +1,12 @@
vec2 make = (1.500000, 2.500000)
vec2 swap = (2.500000, 1.500000)
vec2 sum = 4.000000
vec4f make = (1.000000, 2.000000, 3.000000, 4.000000)
vec4f rev = (4.000000, 3.000000, 2.000000, 1.000000)
vec4f sum = 10.000000
vec2 make = (1.500000, 2.500000)
vec2 swap = (2.500000, 1.500000)
vec2 sum = 4.000000
vec4f make = (1.000000, 2.000000, 3.000000, 4.000000)
vec4f rev = (4.000000, 3.000000, 2.000000, 1.000000)
vec4f sum = 10.000000
pair64 make = (100, 200)
pair64 swap = (200, 100)
pair64 sum = 300
quad32 make = (10, 20, 30, 40)
quad32 rev = (40, 30, 20, 10)
quad32 sum = 100