90/90 regression tests pass (+ffi-03-large-struct).
vendors/ffi_large_struct/{.h,.c} defines:
Big24 — 24 B, three s64 (byval params + sret return)
Big48 — 48 B, six s64 (same path, larger)
`make / rotate-or-reverse / sum` helpers per shape. The sx-side
example imports via `#source` only and declares matching structs +
hand-written #foreign decls.
Snapshot pins today's >16-byte aggregate ABI now that the
emit_llvm.zig sret-return transform is in place (previous commit).
That gives us a regression net for all four C-ABI aggregate slots
in one place:
≤8 B int — i64 coercion (ffi-01 vec-likes)
9..16 B int — [2 x i64] coercion (ffi-02 Pair64/Quad32, 101)
16 B HFA — struct, no coercion (ffi-02 Vec2/Vec4f)
>16 B — byval params + sret (this commit)
31 lines
645 B
C
31 lines
645 B
C
#include "ffi_large_struct.h"
|
|
|
|
Big24 ffi_big24_make(long long a, long long b, long long c) {
|
|
Big24 r = { a, b, c };
|
|
return r;
|
|
}
|
|
|
|
Big24 ffi_big24_rotate(Big24 v) {
|
|
Big24 r = { v.c, v.a, v.b };
|
|
return r;
|
|
}
|
|
|
|
long long ffi_big24_sum(Big24 v) {
|
|
return v.a + v.b + v.c;
|
|
}
|
|
|
|
Big48 ffi_big48_make(long long a, long long b, long long c,
|
|
long long d, long long e, long long f) {
|
|
Big48 r = { a, b, c, d, e, f };
|
|
return r;
|
|
}
|
|
|
|
Big48 ffi_big48_reverse(Big48 v) {
|
|
Big48 r = { v.f, v.e, v.d, v.c, v.b, v.a };
|
|
return r;
|
|
}
|
|
|
|
long long ffi_big48_sum(Big48 v) {
|
|
return v.a + v.b + v.c + v.d + v.e + v.f;
|
|
}
|