commit cb9e8b0d01dcfb67c0f60af843aa85df31a13c8c (tree)
parent 42973d73e6b045f242cc67015fba023ff46e9929
Author: Andrew Kelley <andrew@ziglang.org>
Date: Thu, 27 Apr 2023 15:44:22 -0700
C backend: take advantage of Assignment abstraction in airMemset
Diffstat:
1 file changed, 12 insertions(+), 20 deletions(-)
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
@@ -6335,26 +6335,18 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
try writer.writeAll("; ++");
try f.writeCValue(writer, index, .Other);
try writer.writeAll(") ");
- if (lowersToArray(elem_ty, target)) {
- // Arrays are not assignable, so we use memcpy here.
- try writer.writeAll("memcpy(");
- try writeSliceOrPtr(f, writer, dest_slice, dest_ty);
- try writer.writeAll("[");
- try f.writeCValue(writer, index, .Other);
- try writer.writeAll("], ");
- try f.writeCValue(writer, value, .FunctionArgument);
- try writer.print(", {d});\n", .{elem_abi_size});
- } else {
- try writer.writeAll("((");
- try f.renderType(writer, elem_ptr_ty);
- try writer.writeByte(')');
- try writeSliceOrPtr(f, writer, dest_slice, dest_ty);
- try writer.writeAll(")[");
- try f.writeCValue(writer, index, .Other);
- try writer.writeAll("] = ");
- try f.writeCValue(writer, value, .FunctionArgument);
- try writer.writeAll(";\n");
- }
+
+ const a = try Assignment.start(f, writer, elem_ty);
+ try writer.writeAll("((");
+ try f.renderType(writer, elem_ptr_ty);
+ try writer.writeByte(')');
+ try writeSliceOrPtr(f, writer, dest_slice, dest_ty);
+ try writer.writeAll(")[");
+ try f.writeCValue(writer, index, .Other);
+ try writer.writeByte(']');
+ try a.assign(f, writer);
+ try f.writeCValue(writer, value, .Other);
+ try a.end(f, writer);
try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs });
try freeLocal(f, inst, index.new_local, 0);