authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-12 01:03:10-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:28-05:00
log351025dc0522f5ad170091c0040e9532e2938d79
treef36437ad670ed26973586274451e1706b3e49f75
parent00b54a5fe565f404e0d7d8cdbc05a465d573fc32

cbe: msvc compatible int casting inside renderValue .Packed branch

- Handle non-abiInt source types (like packed union) as sources in renderIntCast

1 files changed, 9 insertions(+), 13 deletions(-)

src/codegen/c.zig+9-13
...@@ -1294,26 +1294,20 @@ pub const DeclGen = struct {...@@ -1294,26 +1294,20 @@ pub const DeclGen = struct {
1294 const field_ty = ty.structFieldType(index);1294 const field_ty = ty.structFieldType(index);
1295 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;1295 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
12961296
1297 //const cast_context = IntCastContext{ .value = .{ .value = field_val } };1297 const cast_context = IntCastContext{ .value = .{ .value = field_val } };
1298 if (bit_offset_val_pl.data != 0) {1298 if (bit_offset_val_pl.data != 0) {
1299 try writer.writeAll("zig_shl_");1299 try writer.writeAll("zig_shl_");
1300 try dg.renderTypeForBuiltinFnName(writer, ty);1300 try dg.renderTypeForBuiltinFnName(writer, ty);
1301 try writer.writeByte('(');1301 try writer.writeByte('(');
13021302 try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument);
1303 //try dg.renderIntCast(writer, ty,_context, field_ty, .FunctionArgument);
1304 try dg.renderValue(writer, field_ty, field_val, .FunctionArgument);
1305
1306 try writer.writeAll(", ");1303 try writer.writeAll(", ");
1307 try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);1304 try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);
1308 try writer.writeByte(')');1305 try writer.writeByte(')');
1309 } else {1306 } else {
13101307 try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument);
1311 try dg.renderValue(writer, field_ty, field_val, .FunctionArgument);
1312 //try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument);
1313
1314 }1308 }
13151309
1316 if (needs_closing_paren) try writer.writeByte(')');1310 if (needs_closing_paren) try writer.writeByte(')') ;
1317 if (eff_index != eff_num_fields - 1) try writer.writeAll(", ");1311 if (eff_index != eff_num_fields - 1) try writer.writeAll(", ");
13181312
1319 bit_offset_val_pl.data += field_ty.bitSize(target);1313 bit_offset_val_pl.data += field_ty.bitSize(target);
...@@ -2213,10 +2207,12 @@ pub const DeclGen = struct {...@@ -2213,10 +2207,12 @@ pub const DeclGen = struct {
2213 } else src_ty;2207 } else src_ty;
22142208
2215 const src_bits = src_eff_ty.bitSize(target);2209 const src_bits = src_eff_ty.bitSize(target);
2216 const src_int_info = src_eff_ty.intInfo(target);2210 const src_int_info = if (src_eff_ty.isAbiInt()) src_eff_ty.intInfo(target) else null;
2217 if (dest_bits <= 64 and src_bits <= 64) {2211 if (dest_bits <= 64 and src_bits <= 64) {
2218 const needs_cast = toCIntBits(dest_int_info.bits) != toCIntBits(src_int_info.bits) or2212 const needs_cast = src_int_info == null or
2219 dest_int_info.signedness != src_int_info.signedness;2213 (toCIntBits(dest_int_info.bits) != toCIntBits(src_int_info.?.bits) or
2214 dest_int_info.signedness != src_int_info.?.signedness);
2215
2220 if (needs_cast) {2216 if (needs_cast) {
2221 try w.writeByte('(');2217 try w.writeByte('(');
2222 try dg.renderTypecast(w, dest_ty);2218 try dg.renderTypecast(w, dest_ty);