| ... | @@ -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; |