Skip to content

Commit dac6725

Browse files
committed
stage2: fix @sizeof() for vector types.
TODO: #12137
1 parent e867127 commit dac6725

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

src/type.zig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3254,7 +3254,7 @@ pub const Type = extern union {
32543254

32553255
.array_u8 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8).?.data },
32563256
.array_u8_sentinel_0 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8_sentinel_0).?.data + 1 },
3257-
.array, .vector => {
3257+
.array => {
32583258
const payload = ty.cast(Payload.Array).?.data;
32593259
switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {
32603260
.scalar => |elem_size| return AbiSizeAdvanced{ .scalar = payload.len * elem_size },
@@ -3265,6 +3265,7 @@ pub const Type = extern union {
32653265
},
32663266
}
32673267
},
3268+
.vector => return AbiSizeAdvanced{ .scalar = abiAlignment(ty, target) },
32683269
.array_sentinel => {
32693270
const payload = ty.castTag(.array_sentinel).?.data;
32703271
switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {

test/behavior/vector.zig

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,90 @@ test "alignment of vectors" {
10761076
try expect(@alignOf(@Vector(2, u1)) == 1);
10771077
try expect(@alignOf(@Vector(1, u1)) == 1);
10781078
try expect(@alignOf(@Vector(2, u16)) == 4);
1079+
1080+
try expect(@alignOf(@Vector(7, i8)) == 8);
1081+
try expect(@alignOf(@Vector(8, i8)) == 8);
1082+
try expect(@alignOf(@Vector(9, i8)) == 16);
1083+
1084+
const specialcase_16_bytes = switch (builtin.target.cpu.arch) {
1085+
.arm, .armeb, .thumb, .thumbeb => true,
1086+
else => false,
1087+
};
1088+
1089+
try expect(@alignOf(@Vector(15, i8)) == 16);
1090+
if (specialcase_16_bytes) {
1091+
if (builtin.zig_backend == .stage1) {
1092+
try expect(@alignOf(@Vector(16, i8)) == 8);
1093+
} else {
1094+
// TODO
1095+
// https://github.com/ziglang/zig/issues/12137
1096+
}
1097+
} else {
1098+
try expect(@alignOf(@Vector(16, i8)) == 16);
1099+
}
1100+
try expect(@alignOf(@Vector(17, i8)) == 32);
1101+
1102+
try expect(@alignOf(@Vector(31, i8)) == 32);
1103+
try expect(@alignOf(@Vector(32, i8)) == 32);
1104+
try expect(@alignOf(@Vector(33, i8)) == 64);
1105+
1106+
try expect(@alignOf(@Vector(3, u16)) == 8);
1107+
try expect(@alignOf(@Vector(3, u64)) == 32);
1108+
try expect(@alignOf(@Vector(1, *u8)) == @sizeOf(*u8) * 1);
1109+
try expect(@alignOf(@Vector(2, *u8)) == @sizeOf(*u8) * 2);
1110+
try expect(@alignOf(@Vector(3, *u8)) == @sizeOf(*u8) * 4);
1111+
1112+
try expect(@alignOf(@Vector(3, f32)) == 16);
1113+
if (specialcase_16_bytes) {
1114+
if (builtin.zig_backend == .stage1) {
1115+
try expect(@alignOf(@Vector(4, f32)) == 8);
1116+
} else {
1117+
// TODO
1118+
// https://github.com/ziglang/zig/issues/12137
1119+
}
1120+
} else {
1121+
try expect(@alignOf(@Vector(4, f32)) == 16);
1122+
}
1123+
try expect(@alignOf(@Vector(5, f32)) == 32);
1124+
1125+
try expect(@alignOf(@Vector(8, bool)) == 1);
1126+
try expect(@alignOf(@Vector(8, u1)) == 1);
1127+
try expect(@alignOf(@Vector(9, u1)) == 2);
1128+
try expect(@alignOf(@Vector(32, u1)) == 4);
1129+
try expect(@alignOf(@Vector(33, u1)) == 8);
1130+
}
1131+
1132+
test "size of vectors" {
1133+
try expect(@sizeOf(@Vector(2, u8)) == 2);
1134+
try expect(@sizeOf(@Vector(2, u1)) == 1);
1135+
try expect(@sizeOf(@Vector(1, u1)) == 1);
1136+
try expect(@sizeOf(@Vector(2, u16)) == 4);
1137+
1138+
try expect(@sizeOf(@Vector(7, i8)) == 8);
1139+
try expect(@sizeOf(@Vector(8, i8)) == 8);
1140+
try expect(@sizeOf(@Vector(9, i8)) == 16);
1141+
try expect(@sizeOf(@Vector(15, i8)) == 16);
1142+
try expect(@sizeOf(@Vector(16, i8)) == 16);
1143+
try expect(@sizeOf(@Vector(17, i8)) == 32);
1144+
try expect(@sizeOf(@Vector(31, i8)) == 32);
1145+
try expect(@sizeOf(@Vector(32, i8)) == 32);
1146+
try expect(@sizeOf(@Vector(33, i8)) == 64);
1147+
1148+
try expect(@sizeOf(@Vector(3, u16)) == 8);
1149+
try expect(@sizeOf(@Vector(3, u64)) == 32);
1150+
try expect(@sizeOf(@Vector(1, *u8)) == @sizeOf(*u8) * 1);
1151+
try expect(@sizeOf(@Vector(2, *u8)) == @sizeOf(*u8) * 2);
1152+
try expect(@sizeOf(@Vector(3, *u8)) == @sizeOf(*u8) * 4);
1153+
1154+
try expect(@sizeOf(@Vector(3, f32)) == 16);
1155+
try expect(@sizeOf(@Vector(4, f32)) == 16);
1156+
try expect(@sizeOf(@Vector(5, f32)) == 32);
1157+
1158+
try expect(@sizeOf(@Vector(8, bool)) == 1);
1159+
try expect(@sizeOf(@Vector(8, u1)) == 1);
1160+
try expect(@sizeOf(@Vector(9, u1)) == 2);
1161+
try expect(@sizeOf(@Vector(32, u1)) == 4);
1162+
try expect(@sizeOf(@Vector(33, u1)) == 8);
10791163
}
10801164

10811165
test "loading the second vector from a slice of vectors" {

0 commit comments

Comments
 (0)