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;