aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-07-16 16:48:47 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-08-18 17:11:34 -0700
commit4552ccb6856a84bb88badb265c43114ff57bd90c (patch)
tree74f98912258e39539812b71d6890ba3fe4b06334 /src/type.zig
parent6e313eb1107d4f5d7b0ada0a67c810ce90e79bf5 (diff)
downloadzig-4552ccb6856a84bb88badb265c43114ff57bd90c.tar.gz
zig-4552ccb6856a84bb88badb265c43114ff57bd90c.zip
stage2: make `@Vector` ABI size agree with LLVM
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/type.zig b/src/type.zig
index 4432ae9cf3..fb2ca1e3fc 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -3260,8 +3260,8 @@ pub const Type = extern union {
.array_u8 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8).?.data },
.array_u8_sentinel_0 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8_sentinel_0).?.data + 1 },
- .array, .vector => {
- const payload = ty.cast(Payload.Array).?.data;
+ .array => {
+ const payload = ty.castTag(.array).?.data;
switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {
.scalar => |elem_size| return AbiSizeAdvanced{ .scalar = payload.len * elem_size },
.val => switch (strat) {
@@ -3283,6 +3283,28 @@ pub const Type = extern union {
}
},
+ .vector => {
+ const payload = ty.castTag(.vector).?.data;
+ const sema_kit = switch (strat) {
+ .sema_kit => |sk| sk,
+ .eager => null,
+ .lazy => |arena| return AbiSizeAdvanced{
+ .val = try Value.Tag.lazy_size.create(arena, ty),
+ },
+ };
+ const elem_bits = try payload.elem_type.bitSizeAdvanced(target, sema_kit);
+ const total_bits = elem_bits * payload.len;
+ const total_bytes = (total_bits + 7) / 8;
+ const alignment = switch (try ty.abiAlignmentAdvanced(target, strat)) {
+ .scalar => |x| x,
+ .val => return AbiSizeAdvanced{
+ .val = try Value.Tag.lazy_size.create(strat.lazy, ty),
+ },
+ };
+ const result = std.mem.alignForwardGeneric(u64, total_bytes, alignment);
+ return AbiSizeAdvanced{ .scalar = result };
+ },
+
.isize,
.usize,
.@"anyframe",