Skip to content

Commit a37cd0b

Browse files
committed
stage2: make @Vector ABI size agree with LLVM
1 parent 8724096 commit a37cd0b

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
@@ -3251,8 +3251,8 @@ pub const Type = extern union {
32513251

32523252
.array_u8 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8).?.data },
32533253
.array_u8_sentinel_0 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8_sentinel_0).?.data + 1 },
3254-
.array, .vector => {
3255-
const payload = ty.cast(Payload.Array).?.data;
3254+
.array => {
3255+
const payload = ty.castTag(.array).?.data;
32563256
switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {
32573257
.scalar => |elem_size| return AbiSizeAdvanced{ .scalar = payload.len * elem_size },
32583258
.val => switch (strat) {
@@ -3274,6 +3274,28 @@ pub const Type = extern union {
32743274
}
32753275
},
32763276

3277+
.vector => {
3278+
const payload = ty.castTag(.vector).?.data;
3279+
const sema_kit = switch (strat) {
3280+
.sema_kit => |sk| sk,
3281+
.eager => null,
3282+
.lazy => |arena| return AbiSizeAdvanced{
3283+
.val = try Value.Tag.lazy_size.create(arena, ty),
3284+
},
3285+
};
3286+
const elem_bits = try payload.elem_type.bitSizeAdvanced(target, sema_kit);
3287+
const total_bits = elem_bits * payload.len;
3288+
const total_bytes = (total_bits + 7) / 8;
3289+
const alignment = switch (try ty.abiAlignmentAdvanced(target, strat)) {
3290+
.scalar => |x| x,
3291+
.val => return AbiSizeAdvanced{
3292+
.val = try Value.Tag.lazy_size.create(strat.lazy, ty),
3293+
},
3294+
};
3295+
const result = std.mem.alignForwardGeneric(u64, total_bytes, alignment);
3296+
return AbiSizeAdvanced{ .scalar = result };
3297+
},
3298+
32773299
.isize,
32783300
.usize,
32793301
.@"anyframe",

0 commit comments

Comments
 (0)