authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-09 01:58:04-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:27-05:00
loge6ef57960914aa0e727ccd37ccd3913df3ae6ab4
tree1748b723aa710846f85ba1007f787d44fd32994f
parenta43fdc1620fa24c8c606f748505766bfd53d1049

cbe: fixup casting to/from 128 bit int types, as they may not have compiler support


1 files changed, 34 insertions(+), 5 deletions(-)

src/codegen/c.zig+34-5
......@@ -3262,11 +3262,20 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {
32623262 try f.object.dg.renderTypeForBuiltinFnName(writer, field_ty);
32633263 try writer.writeAll("((");
32643264 try f.renderTypecast(writer, field_ty);
3265 try writer.writeAll(")zig_shr_");
3265 try writer.writeByte(')');
3266 const cant_cast = host_ty.isInt() and host_ty.bitSize(target) > 64;
3267 if (cant_cast) {
3268 if (field_ty.bitSize(target) > 64) return f.fail("TODO: C backend: implement casting between types > 64 bits", .{});
3269 try writer.writeAll("zig_lo_");
3270 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);
3271 try writer.writeByte('(');
3272 }
3273 try writer.writeAll("zig_shr_");
32663274 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);
32673275 try writer.writeByte('(');
32683276 try f.writeCValueDeref(writer, operand);
32693277 try writer.print(", {})", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)});
3278 if (cant_cast) try writer.writeByte(')');
32703279 try f.object.dg.renderBuiltinInfo(writer, field_ty, .Bits);
32713280 try writer.writeByte(')');
32723281 } else {
......@@ -3539,15 +3548,26 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue {
35393548 try f.writeCValueDeref(writer, ptr_val);
35403549 try writer.print(", {x}), zig_shl_", .{try f.fmtIntLiteral(host_ty, mask_val)});
35413550 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);
3542 try writer.writeAll("((");
3543 try f.renderTypecast(writer, host_ty);
3544 try writer.writeByte(')');
3551 try writer.writeByte('(');
3552 const cant_cast = host_ty.isInt() and host_ty.bitSize(target) > 64;
3553 if (cant_cast) {
3554 if (src_ty.bitSize(target) > 64) return f.fail("TODO: C backend: implement casting between types > 64 bits", .{});
3555 try writer.writeAll("zig_as_");
3556 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);
3557 try writer.writeAll("(0, ");
3558 } else {
3559 try writer.writeByte('(');
3560 try f.renderTypecast(writer, host_ty);
3561 try writer.writeByte(')');
3562 }
3563
35453564 if (src_ty.isPtrAtRuntime()) {
35463565 try writer.writeByte('(');
35473566 try f.renderTypecast(writer, Type.usize);
35483567 try writer.writeByte(')');
35493568 }
35503569 try f.writeCValue(writer, src_val, .Other);
3570 if (cant_cast) try writer.writeByte(')');
35513571 try writer.print(", {}))", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)});
35523572 } else {
35533573 try f.writeCValueDeref(writer, ptr_val);
......@@ -5236,13 +5256,22 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue {
52365256 try f.object.dg.renderTypeForBuiltinFnName(writer, field_int_ty);
52375257 try writer.writeAll("((");
52385258 try f.renderTypecast(writer, field_int_ty);
5239 try writer.writeAll(")zig_shr_");
5259 try writer.writeByte(')');
5260 const cant_cast = int_info.bits > 64;
5261 if (cant_cast) {
5262 if (field_int_ty.bitSize(target) > 64) return f.fail("TODO: C backend: implement casting between types > 64 bits", .{});
5263 try writer.writeAll("zig_lo_");
5264 try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
5265 try writer.writeByte('(');
5266 }
5267 try writer.writeAll("zig_shr_");
52405268 try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
52415269 try writer.writeByte('(');
52425270 try f.writeCValue(writer, struct_byval, .Other);
52435271 try writer.writeAll(", ");
52445272 try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);
52455273 try writer.writeByte(')');
5274 if (cant_cast) try writer.writeByte(')');
52465275 try f.object.dg.renderBuiltinInfo(writer, field_int_ty, .Bits);
52475276 try writer.writeAll(");\n");
52485277 if (inst_ty.eql(field_int_ty, f.object.dg.module)) return temp_local;