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