mirror of
https://github.com/ziglang/zig.git
synced 2025-12-27 16:43:07 +00:00
stage2: make @Vector ABI size agree with LLVM
This commit is contained in:
parent
6e313eb110
commit
4552ccb685
26
src/type.zig
26
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",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user