aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-12-20 18:32:06 +0200
committerVeikka Tuominen <git@vexu.eu>2022-12-20 18:34:33 +0200
commit9f23702c21645aeddd64bcf203bc8b62a328f75f (patch)
tree5305f31f4a4bfa34630cbab71f20c6f76e34f659
parent6da070c5ac1707f2f5370e2e26124a3e114e25ea (diff)
downloadzig-9f23702c21645aeddd64bcf203bc8b62a328f75f.tar.gz
zig-9f23702c21645aeddd64bcf203bc8b62a328f75f.zip
llvm: fix C ABI for <=256 bit vectors
Closes #13918
-rw-r--r--src/arch/x86_64/abi.zig3
-rw-r--r--test/c_abi/cfuncs.c13
-rw-r--r--test/c_abi/main.zig17
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;