diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-12-20 18:32:06 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-12-20 18:34:33 +0200 |
| commit | 9f23702c21645aeddd64bcf203bc8b62a328f75f (patch) | |
| tree | 5305f31f4a4bfa34630cbab71f20c6f76e34f659 | |
| parent | 6da070c5ac1707f2f5370e2e26124a3e114e25ea (diff) | |
| download | zig-9f23702c21645aeddd64bcf203bc8b62a328f75f.tar.gz zig-9f23702c21645aeddd64bcf203bc8b62a328f75f.zip | |
llvm: fix C ABI for <=256 bit vectors
Closes #13918
| -rw-r--r-- | src/arch/x86_64/abi.zig | 3 | ||||
| -rw-r--r-- | test/c_abi/cfuncs.c | 13 | ||||
| -rw-r--r-- | test/c_abi/main.zig | 17 |
3 files changed, 32 insertions, 1 deletions
diff --git a/src/arch/x86_64/abi.zig b/src/arch/x86_64/abi.zig index 393d4db3d5..54c08e4aa9 100644 --- a/src/arch/x86_64/abi.zig +++ b/src/arch/x86_64/abi.zig @@ -143,7 +143,8 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class { .integer, .integer, .integer, .integer, .integer, .integer, .integer, .integer, }; - if (has_avx512 and bit_size <= 256) return .{ + const has_avx = target.cpu.features.isEnabled(@enumToInt(std.Target.x86.Feature.avx)); + if (has_avx and bit_size <= 256) return .{ .integer, .integer, .integer, .integer, .none, .none, .none, .none, }; diff --git a/test/c_abi/cfuncs.c b/test/c_abi/cfuncs.c index 20896669fe..16851f1c7e 100644 --- a/test/c_abi/cfuncs.c +++ b/test/c_abi/cfuncs.c @@ -742,6 +742,19 @@ SmallVec c_ret_small_vec(void) { return (SmallVec){3, 4}; } +typedef size_t MediumVec __attribute__((vector_size(4 * sizeof(size_t)))); + +void c_medium_vec(MediumVec vec) { + assert_or_panic(vec[0] == 1); + assert_or_panic(vec[1] == 2); + assert_or_panic(vec[2] == 3); + assert_or_panic(vec[3] == 4); +} + +MediumVec c_ret_medium_vec(void) { + return (MediumVec){5, 6, 7, 8}; +} + typedef size_t BigVec __attribute__((vector_size(8 * sizeof(size_t)))); void c_big_vec(BigVec vec) { diff --git a/test/c_abi/main.zig b/test/c_abi/main.zig index 47f0455744..dcf4cbe46f 100644 --- a/test/c_abi/main.zig +++ b/test/c_abi/main.zig @@ -801,6 +801,23 @@ test "small simd vector" { try expect(x[1] == 4); } +const MediumVec = @Vector(4, usize); + +extern fn c_medium_vec(MediumVec) void; +extern fn c_ret_medium_vec() MediumVec; + +test "medium simd vector" { + if (comptime builtin.cpu.arch.isPPC64()) return error.SkipZigTest; + + c_medium_vec(.{ 1, 2, 3, 4 }); + + var x = c_ret_medium_vec(); + try expect(x[0] == 5); + try expect(x[1] == 6); + try expect(x[2] == 7); + try expect(x[3] == 8); +} + const BigVec = @Vector(8, usize); extern fn c_big_vec(BigVec) void; |
