diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-06-30 19:09:21 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-06-30 19:39:41 -0700 |
| commit | 095e24e537fcb6a702b992d946d1ca73d6f608b3 (patch) | |
| tree | ff875289e34de2ddba235648435b2abe5dae5bc9 /src/type.zig | |
| parent | d3542be875704bffc931970948345d1a44e25b8e (diff) | |
| download | zig-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.zig | 10 |
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) }, |
