aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-06-30 19:09:21 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-06-30 19:39:41 -0700
commit095e24e537fcb6a702b992d946d1ca73d6f608b3 (patch)
treeff875289e34de2ddba235648435b2abe5dae5bc9 /src/type.zig
parentd3542be875704bffc931970948345d1a44e25b8e (diff)
downloadzig-095e24e537fcb6a702b992d946d1ca73d6f608b3.tar.gz
zig-095e24e537fcb6a702b992d946d1ca73d6f608b3.zip
stage2: implement alignment calculation of vectors
closes #11856
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/type.zig b/src/type.zig
index 0ca7ba83c5..e116f1ed20 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -2906,9 +2906,13 @@ pub const Type = extern union {
.array, .array_sentinel => return ty.elemType().abiAlignmentAdvanced(target, strat),
- // TODO audit this - is there any more complicated logic to determine
- // ABI alignment of vectors?
- .vector => return AbiAlignmentAdvanced{ .scalar = 16 },
+ .vector => {
+ const len = ty.arrayLen();
+ const bits = try bitSizeAdvanced(ty.elemType(), target, sema_kit);
+ const bytes = (bits + 7) / 8;
+ const alignment = std.math.ceilPowerOfTwoAssert(u64, bytes * len);
+ return AbiAlignmentAdvanced{ .scalar = @intCast(u32, alignment) };
+ },
.i16, .u16 => return AbiAlignmentAdvanced{ .scalar = intAbiAlignment(16, target) },
.u29 => return AbiAlignmentAdvanced{ .scalar = intAbiAlignment(29, target) },