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 {...@@ -3262,11 +3262,20 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {
3262 try f.object.dg.renderTypeForBuiltinFnName(writer, field_ty);3262 try f.object.dg.renderTypeForBuiltinFnName(writer, field_ty);
3263 try writer.writeAll("((");3263 try writer.writeAll("((");
3264 try f.renderTypecast(writer, field_ty);3264 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_");
3266 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);3274 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);
3267 try writer.writeByte('(');3275 try writer.writeByte('(');
3268 try f.writeCValueDeref(writer, operand);3276 try f.writeCValueDeref(writer, operand);
3269 try writer.print(", {})", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)});3277 try writer.print(", {})", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)});
3278 if (cant_cast) try writer.writeByte(')');
3270 try f.object.dg.renderBuiltinInfo(writer, field_ty, .Bits);3279 try f.object.dg.renderBuiltinInfo(writer, field_ty, .Bits);
3271 try writer.writeByte(')');3280 try writer.writeByte(')');
3272 } else {3281 } else {
...@@ -3539,15 +3548,26 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -3539,15 +3548,26 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue {
3539 try f.writeCValueDeref(writer, ptr_val);3548 try f.writeCValueDeref(writer, ptr_val);
3540 try writer.print(", {x}), zig_shl_", .{try f.fmtIntLiteral(host_ty, mask_val)});3549 try writer.print(", {x}), zig_shl_", .{try f.fmtIntLiteral(host_ty, mask_val)});
3541 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);3550 try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty);
3542 try writer.writeAll("((");3551 try writer.writeByte('(');
3543 try f.renderTypecast(writer, host_ty);3552 const cant_cast = host_ty.isInt() and host_ty.bitSize(target) > 64;
3544 try writer.writeByte(')');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
3545 if (src_ty.isPtrAtRuntime()) {3564 if (src_ty.isPtrAtRuntime()) {
3546 try writer.writeByte('(');3565 try writer.writeByte('(');
3547 try f.renderTypecast(writer, Type.usize);3566 try f.renderTypecast(writer, Type.usize);
3548 try writer.writeByte(')');3567 try writer.writeByte(')');
3549 }3568 }
3550 try f.writeCValue(writer, src_val, .Other);3569 try f.writeCValue(writer, src_val, .Other);
3570 if (cant_cast) try writer.writeByte(')');
3551 try writer.print(", {}))", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)});3571 try writer.print(", {}))", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)});
3552 } else {3572 } else {
3553 try f.writeCValueDeref(writer, ptr_val);3573 try f.writeCValueDeref(writer, ptr_val);
...@@ -5236,13 +5256,22 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5236,13 +5256,22 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue {
5236 try f.object.dg.renderTypeForBuiltinFnName(writer, field_int_ty);5256 try f.object.dg.renderTypeForBuiltinFnName(writer, field_int_ty);
5237 try writer.writeAll("((");5257 try writer.writeAll("((");
5238 try f.renderTypecast(writer, field_int_ty);5258 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_");
5240 try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);5268 try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty);
5241 try writer.writeByte('(');5269 try writer.writeByte('(');
5242 try f.writeCValue(writer, struct_byval, .Other);5270 try f.writeCValue(writer, struct_byval, .Other);
5243 try writer.writeAll(", ");5271 try writer.writeAll(", ");
5244 try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);5272 try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument);
5245 try writer.writeByte(')');5273 try writer.writeByte(')');
5274 if (cant_cast) try writer.writeByte(')');
5246 try f.object.dg.renderBuiltinInfo(writer, field_int_ty, .Bits);5275 try f.object.dg.renderBuiltinInfo(writer, field_int_ty, .Bits);
5247 try writer.writeAll(");\n");5276 try writer.writeAll(");\n");
5248 if (inst_ty.eql(field_int_ty, f.object.dg.module)) return temp_local;5277 if (inst_ty.eql(field_int_ty, f.object.dg.module)) return temp_local;