authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-06-30 19:09:21-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-06-30 19:39:41-07:00
log095e24e537fcb6a702b992d946d1ca73d6f608b3
treeff875289e34de2ddba235648435b2abe5dae5bc9
parentd3542be875704bffc931970948345d1a44e25b8e

stage2: implement alignment calculation of vectors

closes #11856

3 files changed, 31 insertions(+), 4 deletions(-)

lib/std/simd.zig-1
...@@ -160,7 +160,6 @@ pub fn extract(...@@ -160,7 +160,6 @@ pub fn extract(
160}160}
161161
162test "vector patterns" {162test "vector patterns" {
163 if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest;
164 const base = @Vector(4, u32){ 10, 20, 30, 40 };163 const base = @Vector(4, u32){ 10, 20, 30, 40 };
165 const other_base = @Vector(4, u32){ 55, 66, 77, 88 };164 const other_base = @Vector(4, u32){ 55, 66, 77, 88 };
166165
src/type.zig+7-3
...@@ -2906,9 +2906,13 @@ pub const Type = extern union {...@@ -2906,9 +2906,13 @@ pub const Type = extern union {
29062906
2907 .array, .array_sentinel => return ty.elemType().abiAlignmentAdvanced(target, strat),2907 .array, .array_sentinel => return ty.elemType().abiAlignmentAdvanced(target, strat),
29082908
2909 // TODO audit this - is there any more complicated logic to determine2909 .vector => {
2910 // ABI alignment of vectors?2910 const len = ty.arrayLen();
2911 .vector => return AbiAlignmentAdvanced{ .scalar = 16 },2911 const bits = try bitSizeAdvanced(ty.elemType(), target, sema_kit);
2912 const bytes = (bits + 7) / 8;
2913 const alignment = std.math.ceilPowerOfTwoAssert(u64, bytes * len);
2914 return AbiAlignmentAdvanced{ .scalar = @intCast(u32, alignment) };
2915 },
29122916
2913 .i16, .u16 => return AbiAlignmentAdvanced{ .scalar = intAbiAlignment(16, target) },2917 .i16, .u16 => return AbiAlignmentAdvanced{ .scalar = intAbiAlignment(16, target) },
2914 .u29 => return AbiAlignmentAdvanced{ .scalar = intAbiAlignment(29, target) },2918 .u29 => return AbiAlignmentAdvanced{ .scalar = intAbiAlignment(29, target) },
test/behavior/vector.zig+24
...@@ -1048,3 +1048,27 @@ test "@shlWithOverflow" {...@@ -1048,3 +1048,27 @@ test "@shlWithOverflow" {
1048 try S.doTheTest();1048 try S.doTheTest();
1049 comptime try S.doTheTest();1049 comptime try S.doTheTest();
1050}1050}
1051
1052test "alignment of vectors" {
1053 try expect(@alignOf(@Vector(2, u8)) == 2);
1054 try expect(@alignOf(@Vector(2, u1)) == 2);
1055 try expect(@alignOf(@Vector(1, u1)) == 1);
1056 try expect(@alignOf(@Vector(2, u16)) == 4);
1057}
1058
1059test "loading the second vector from a slice of vectors" {
1060 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1061 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1062 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1063 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1064 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1065
1066 @setRuntimeSafety(false);
1067 var small_bases = [2]@Vector(2, u8){
1068 @Vector(2, u8){ 0, 1 },
1069 @Vector(2, u8){ 2, 3 },
1070 };
1071 var a: []const @Vector(2, u8) = &small_bases;
1072 var a4 = a[1][1];
1073 try expect(a4 == 3);
1074}