Skip to content

Commit 4552ccb

Browse files
committed
stage2: make @Vector ABI size agree with LLVM
1 parent 6e313eb commit 4552ccb

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/type.zig

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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",

0 commit comments

Comments
 (0)