authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-19 12:18:55+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-19 12:19:52+02:00
log2926d95e6a7c4d83eb197f78de40718e97bc1f1b
treeb3ad8e54eb60e5b4f8eb0e63308a987102369786
parent0eddf0cbc0a88121a67239d5899dca8a39c39cd8

llvm: handle vectors in packed structs

Closes #13201

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

src/codegen/llvm.zig+3-3
......@@ -5966,7 +5966,7 @@ pub const FuncGen = struct {
59665966 const shift_amt = containing_int.typeOf().constInt(bit_offset, .False);
59675967 const shifted_value = self.builder.buildLShr(containing_int, shift_amt, "");
59685968 const elem_llvm_ty = try self.dg.lowerType(field_ty);
5969 if (field_ty.zigTypeTag() == .Float) {
5969 if (field_ty.zigTypeTag() == .Float or field_ty.zigTypeTag() == .Vector) {
59705970 const elem_bits = @intCast(c_uint, field_ty.bitSize(target));
59715971 const same_size_int = self.context.intType(elem_bits);
59725972 const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, "");
......@@ -5989,7 +5989,7 @@ pub const FuncGen = struct {
59895989 assert(struct_ty.containerLayout() == .Packed);
59905990 const containing_int = struct_llvm_val;
59915991 const elem_llvm_ty = try self.dg.lowerType(field_ty);
5992 if (field_ty.zigTypeTag() == .Float) {
5992 if (field_ty.zigTypeTag() == .Float or field_ty.zigTypeTag() == .Vector) {
59935993 const elem_bits = @intCast(c_uint, field_ty.bitSize(target));
59945994 const same_size_int = self.context.intType(elem_bits);
59955995 const truncated_int = self.builder.buildTrunc(containing_int, same_size_int, "");
......@@ -9889,7 +9889,7 @@ pub const FuncGen = struct {
98899889 return result_ptr;
98909890 }
98919891
9892 if (info.pointee_type.zigTypeTag() == .Float) {
9892 if (info.pointee_type.zigTypeTag() == .Float or info.pointee_type.zigTypeTag() == .Vector) {
98939893 const same_size_int = self.context.intType(elem_bits);
98949894 const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, "");
98959895 return self.builder.buildBitCast(truncated_int, elem_llvm_ty, "");
test/behavior/bitcast.zig-3
......@@ -358,9 +358,6 @@ test "comptime @bitCast packed struct to int and back" {
358358 const rt_cast = @bitCast(S, i);
359359 const ct_cast = comptime @bitCast(S, @as(Int, 0));
360360 inline for (@typeInfo(S).Struct.fields) |field| {
361 if (@typeInfo(field.type) == .Vector)
362 continue; //TODO: https://github.com/ziglang/zig/issues/13201
363
364361 try expectEqual(@field(rt_cast, field.name), @field(ct_cast, field.name));
365362 }
366363}