authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-16 16:48:47-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-18 17:11:34-07:00
log4552ccb6856a84bb88badb265c43114ff57bd90c
tree74f98912258e39539812b71d6890ba3fe4b06334
parent6e313eb1107d4f5d7b0ada0a67c810ce90e79bf5

stage2: make `@Vector` ABI size agree with LLVM


1 files changed, 24 insertions(+), 2 deletions(-)

src/type.zig+24-2
......@@ -3260,8 +3260,8 @@ pub const Type = extern union {
32603260
32613261 .array_u8 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8).?.data },
32623262 .array_u8_sentinel_0 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8_sentinel_0).?.data + 1 },
3263 .array, .vector => {
3264 const payload = ty.cast(Payload.Array).?.data;
3263 .array => {
3264 const payload = ty.castTag(.array).?.data;
32653265 switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {
32663266 .scalar => |elem_size| return AbiSizeAdvanced{ .scalar = payload.len * elem_size },
32673267 .val => switch (strat) {
......@@ -3283,6 +3283,28 @@ pub const Type = extern union {
32833283 }
32843284 },
32853285
3286 .vector => {
3287 const payload = ty.castTag(.vector).?.data;
3288 const sema_kit = switch (strat) {
3289 .sema_kit => |sk| sk,
3290 .eager => null,
3291 .lazy => |arena| return AbiSizeAdvanced{
3292 .val = try Value.Tag.lazy_size.create(arena, ty),
3293 },
3294 };
3295 const elem_bits = try payload.elem_type.bitSizeAdvanced(target, sema_kit);
3296 const total_bits = elem_bits * payload.len;
3297 const total_bytes = (total_bits + 7) / 8;
3298 const alignment = switch (try ty.abiAlignmentAdvanced(target, strat)) {
3299 .scalar => |x| x,
3300 .val => return AbiSizeAdvanced{
3301 .val = try Value.Tag.lazy_size.create(strat.lazy, ty),
3302 },
3303 };
3304 const result = std.mem.alignForwardGeneric(u64, total_bytes, alignment);
3305 return AbiSizeAdvanced{ .scalar = result };
3306 },
3307
32863308 .isize,
32873309 .usize,
32883310 .@"anyframe",