authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-17 02:06:54-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-18 20:42:38-04:00
log60e69fdaa15a304f374df3e067e08aeaa622d412
tree97334e532a0841adb9aab41b7b79c8273a1b674f
parent35da95fe8765874a1ccffb0d7bfd523b14f44a4a

codegen: emit global vector padding


2 files changed, 22 insertions(+), 6 deletions(-)

src/codegen.zig+22-5
...@@ -747,15 +747,23 @@ pub fn generateSymbol(...@@ -747,15 +747,23 @@ pub fn generateSymbol(
747 .Vector => switch (typed_value.val.tag()) {747 .Vector => switch (typed_value.val.tag()) {
748 .bytes => {748 .bytes => {
749 const bytes = typed_value.val.castTag(.bytes).?.data;749 const bytes = typed_value.val.castTag(.bytes).?.data;
750 const len = @intCast(usize, typed_value.ty.arrayLen());750 const len = math.cast(usize, typed_value.ty.arrayLen()) orelse return error.Overflow;
751 try code.ensureUnusedCapacity(len);751 const padding = math.cast(usize, typed_value.ty.abiSize(target) - len) orelse
752 return error.Overflow;
753 try code.ensureUnusedCapacity(len + padding);
752 code.appendSliceAssumeCapacity(bytes[0..len]);754 code.appendSliceAssumeCapacity(bytes[0..len]);
755 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
753 return Result.ok;756 return Result.ok;
754 },757 },
755 .aggregate => {758 .aggregate => {
756 const elem_vals = typed_value.val.castTag(.aggregate).?.data;759 const elem_vals = typed_value.val.castTag(.aggregate).?.data;
757 const elem_ty = typed_value.ty.elemType();760 const elem_ty = typed_value.ty.elemType();
758 const len = @intCast(usize, typed_value.ty.arrayLen());761 const len = math.cast(usize, typed_value.ty.arrayLen()) orelse return error.Overflow;
762 const padding = math.cast(usize, typed_value.ty.abiSize(target) -
763 (math.divCeil(u64, elem_ty.bitSize(target) * len, 8) catch |err| switch (err) {
764 error.DivisionByZero => unreachable,
765 else => |e| return e,
766 })) orelse return error.Overflow;
759 for (elem_vals[0..len]) |elem_val| {767 for (elem_vals[0..len]) |elem_val| {
760 switch (try generateSymbol(bin_file, src_loc, .{768 switch (try generateSymbol(bin_file, src_loc, .{
761 .ty = elem_ty,769 .ty = elem_ty,
...@@ -765,13 +773,18 @@ pub fn generateSymbol(...@@ -765,13 +773,18 @@ pub fn generateSymbol(
765 .fail => |em| return Result{ .fail = em },773 .fail => |em| return Result{ .fail = em },
766 }774 }
767 }775 }
776 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
768 return Result.ok;777 return Result.ok;
769 },778 },
770 .repeated => {779 .repeated => {
771 const array = typed_value.val.castTag(.repeated).?.data;780 const array = typed_value.val.castTag(.repeated).?.data;
772 const elem_ty = typed_value.ty.childType();781 const elem_ty = typed_value.ty.childType();
773 const len = typed_value.ty.arrayLen();782 const len = typed_value.ty.arrayLen();
774783 const padding = math.cast(usize, typed_value.ty.abiSize(target) -
784 (math.divCeil(u64, elem_ty.bitSize(target) * len, 8) catch |err| switch (err) {
785 error.DivisionByZero => unreachable,
786 else => |e| return e,
787 })) orelse return error.Overflow;
775 var index: u64 = 0;788 var index: u64 = 0;
776 while (index < len) : (index += 1) {789 while (index < len) : (index += 1) {
777 switch (try generateSymbol(bin_file, src_loc, .{790 switch (try generateSymbol(bin_file, src_loc, .{
...@@ -782,13 +795,17 @@ pub fn generateSymbol(...@@ -782,13 +795,17 @@ pub fn generateSymbol(
782 .fail => |em| return Result{ .fail = em },795 .fail => |em| return Result{ .fail = em },
783 }796 }
784 }797 }
798 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
785 return Result.ok;799 return Result.ok;
786 },800 },
787 .str_lit => {801 .str_lit => {
788 const str_lit = typed_value.val.castTag(.str_lit).?.data;802 const str_lit = typed_value.val.castTag(.str_lit).?.data;
789 const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];803 const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
790 try code.ensureUnusedCapacity(str_lit.len);804 const padding = math.cast(usize, typed_value.ty.abiSize(target) - str_lit.len) orelse
805 return error.Overflow;
806 try code.ensureUnusedCapacity(str_lit.len + padding);
791 code.appendSliceAssumeCapacity(bytes);807 code.appendSliceAssumeCapacity(bytes);
808 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
792 return Result.ok;809 return Result.ok;
793 },810 },
794 else => unreachable,811 else => unreachable,
test/behavior/vector.zig-1
...@@ -1142,7 +1142,6 @@ test "loading the second vector from a slice of vectors" {...@@ -1142,7 +1142,6 @@ test "loading the second vector from a slice of vectors" {
11421142
1143test "array of vectors is copied" {1143test "array of vectors is copied" {
1144 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1144 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1145 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1146 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1145 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1147 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1146 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1148 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1147 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO