From 4552ccb6856a84bb88badb265c43114ff57bd90c Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 16 Jul 2022 16:48:47 -0700 Subject: stage2: make `@Vector` ABI size agree with LLVM --- src/type.zig | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/type.zig') 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", -- cgit v1.2.3