| ... | @@ -6799,11 +6799,27 @@ fn airMemcpy(f: *Function, inst: Air.Inst.Index) !CValue { | ... | @@ -6799,11 +6799,27 @@ fn airMemcpy(f: *Function, inst: Air.Inst.Index) !CValue { |
| 6799 | const src_ty = f.typeOf(bin_op.rhs); | 6799 | const src_ty = f.typeOf(bin_op.rhs); |
| 6800 | const writer = f.object.writer(); | 6800 | const writer = f.object.writer(); |
| 6801 | | 6801 | |
| | 6802 | if (dest_ty.ptrSize(zcu) != .One) { |
| | 6803 | try writer.writeAll("if ("); |
| | 6804 | try writeArrayLen(f, writer, dest_ptr, dest_ty); |
| | 6805 | try writer.writeAll(" != 0) "); |
| | 6806 | } |
| 6802 | try writer.writeAll("memcpy("); | 6807 | try writer.writeAll("memcpy("); |
| 6803 | try writeSliceOrPtr(f, writer, dest_ptr, dest_ty); | 6808 | try writeSliceOrPtr(f, writer, dest_ptr, dest_ty); |
| 6804 | try writer.writeAll(", "); | 6809 | try writer.writeAll(", "); |
| 6805 | try writeSliceOrPtr(f, writer, src_ptr, src_ty); | 6810 | try writeSliceOrPtr(f, writer, src_ptr, src_ty); |
| 6806 | try writer.writeAll(", "); | 6811 | try writer.writeAll(", "); |
| | 6812 | try writeArrayLen(f, writer, dest_ptr, dest_ty); |
| | 6813 | try writer.writeAll(" * sizeof("); |
| | 6814 | try f.renderType(writer, dest_ty.elemType2(zcu)); |
| | 6815 | try writer.writeAll("));\n"); |
| | 6816 | |
| | 6817 | try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs }); |
| | 6818 | return .none; |
| | 6819 | } |
| | 6820 | |
| | 6821 | fn writeArrayLen(f: *Function, writer: ArrayListWriter, dest_ptr: CValue, dest_ty: Type) !void { |
| | 6822 | const zcu = f.object.dg.zcu; |
| 6807 | switch (dest_ty.ptrSize(zcu)) { | 6823 | switch (dest_ty.ptrSize(zcu)) { |
| 6808 | .One => try writer.print("{}", .{ | 6824 | .One => try writer.print("{}", .{ |
| 6809 | try f.fmtIntLiteral(try zcu.intValue(Type.usize, dest_ty.childType(zcu).arrayLen(zcu))), | 6825 | try f.fmtIntLiteral(try zcu.intValue(Type.usize, dest_ty.childType(zcu).arrayLen(zcu))), |
| ... | @@ -6811,12 +6827,6 @@ fn airMemcpy(f: *Function, inst: Air.Inst.Index) !CValue { | ... | @@ -6811,12 +6827,6 @@ fn airMemcpy(f: *Function, inst: Air.Inst.Index) !CValue { |
| 6811 | .Many, .C => unreachable, | 6827 | .Many, .C => unreachable, |
| 6812 | .Slice => try f.writeCValueMember(writer, dest_ptr, .{ .identifier = "len" }), | 6828 | .Slice => try f.writeCValueMember(writer, dest_ptr, .{ .identifier = "len" }), |
| 6813 | } | 6829 | } |
| 6814 | try writer.writeAll(" * sizeof("); | | |
| 6815 | try f.renderType(writer, dest_ty.elemType2(zcu)); | | |
| 6816 | try writer.writeAll("));\n"); | | |
| 6817 | | | |
| 6818 | try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs }); | | |
| 6819 | return .none; | | |
| 6820 | } | 6830 | } |
| 6821 | | 6831 | |
| 6822 | fn airSetUnionTag(f: *Function, inst: Air.Inst.Index) !CValue { | 6832 | fn airSetUnionTag(f: *Function, inst: Air.Inst.Index) !CValue { |