Skip to content

Commit 3056641

Browse files
committed
stage2: fix @sizeof() for vector types.
1 parent 1653a9b commit 3056641

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/type.zig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3251,7 +3251,7 @@ 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 => {
3254+
.array => {
32553255
const payload = ty.cast(Payload.Array).?.data;
32563256
switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {
32573257
.scalar => |elem_size| return AbiSizeAdvanced{ .scalar = payload.len * elem_size },
@@ -3262,6 +3262,7 @@ pub const Type = extern union {
32623262
},
32633263
}
32643264
},
3265+
.vector => return AbiSizeAdvanced{ .scalar = abiAlignment(ty, target) },
32653266
.array_sentinel => {
32663267
const payload = ty.castTag(.array_sentinel).?.data;
32673268
switch (try payload.elem_type.abiSizeAdvanced(target, strat)) {

test/behavior/vector.zig

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,55 @@ 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+
try expect(@alignOf(@Vector(16, i8)) == 16);
1084+
try expect(@alignOf(@Vector(31, i8)) == 32);
1085+
try expect(@alignOf(@Vector(32, i8)) == 32);
1086+
try expect(@alignOf(@Vector(33, i8)) == 64);
1087+
1088+
try expect(@alignOf(@Vector(3, u16)) == 8);
1089+
try expect(@alignOf(@Vector(3, f32)) == 16);
1090+
try expect(@alignOf(@Vector(3, u64)) == 32);
1091+
try expect(@alignOf(@Vector(1, *u8)) == @sizeOf(*u8) * 1);
1092+
try expect(@alignOf(@Vector(2, *u8)) == @sizeOf(*u8) * 2);
1093+
try expect(@alignOf(@Vector(3, *u8)) == @sizeOf(*u8) * 4);
1094+
1095+
try expect(@alignOf(@Vector(8, bool)) == 1);
1096+
try expect(@alignOf(@Vector(8, u1)) == 1);
1097+
try expect(@alignOf(@Vector(9, u1)) == 2);
1098+
try expect(@alignOf(@Vector(32, u1)) == 4);
1099+
try expect(@alignOf(@Vector(33, u1)) == 8);
1100+
}
1101+
1102+
test "size of vectors" {
1103+
try expect(@sizeOf(@Vector(2, u8)) == 2);
1104+
try expect(@sizeOf(@Vector(2, u1)) == 1);
1105+
try expect(@sizeOf(@Vector(1, u1)) == 1);
1106+
try expect(@sizeOf(@Vector(2, u16)) == 4);
1107+
1108+
try expect(@sizeOf(@Vector(7, i8)) == 8);
1109+
try expect(@sizeOf(@Vector(8, i8)) == 8);
1110+
try expect(@sizeOf(@Vector(9, i8)) == 16);
1111+
try expect(@sizeOf(@Vector(16, i8)) == 16);
1112+
try expect(@sizeOf(@Vector(31, i8)) == 32);
1113+
try expect(@sizeOf(@Vector(32, i8)) == 32);
1114+
try expect(@sizeOf(@Vector(33, i8)) == 64);
1115+
1116+
try expect(@sizeOf(@Vector(3, u16)) == 8);
1117+
try expect(@sizeOf(@Vector(3, f32)) == 16);
1118+
try expect(@sizeOf(@Vector(3, u64)) == 32);
1119+
try expect(@sizeOf(@Vector(1, *u8)) == @sizeOf(*u8) * 1);
1120+
try expect(@sizeOf(@Vector(2, *u8)) == @sizeOf(*u8) * 2);
1121+
try expect(@sizeOf(@Vector(3, *u8)) == @sizeOf(*u8) * 4);
1122+
1123+
try expect(@sizeOf(@Vector(8, bool)) == 1);
1124+
try expect(@sizeOf(@Vector(8, u1)) == 1);
1125+
try expect(@sizeOf(@Vector(9, u1)) == 2);
1126+
try expect(@sizeOf(@Vector(32, u1)) == 4);
1127+
try expect(@sizeOf(@Vector(33, u1)) == 8);
10791128
}
10801129

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

0 commit comments

Comments
 (0)