aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2022-11-01 20:43:54 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2022-11-01 20:43:54 -0400
commitd8635af1dcff8dc5fc4874a711d34bd67eeab689 (patch)
treea2bc96b6b70afea089a1def54a3af6e603b809a0
parent771dadc5e08fc27c5cd4aa3483647b70a9f9cb0b (diff)
downloadzig-d8635af1dcff8dc5fc4874a711d34bd67eeab689.tar.gz
zig-d8635af1dcff8dc5fc4874a711d34bd67eeab689.zip
cbe: correctly implement volatile memset
-rw-r--r--src/codegen/c.zig36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index cadedfab9e..2762123b64 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -4930,19 +4930,39 @@ fn airMemset(f: *Function, inst: Air.Inst.Index) !CValue {
const dest_ptr = try f.resolveInst(pl_op.operand);
const value = try f.resolveInst(extra.lhs);
const len = try f.resolveInst(extra.rhs);
- const writer = f.object.writer();
- try writer.writeAll("memset(");
+ const writer = f.object.writer();
if (dest_ty.isVolatilePtr()) {
- // This is wrong, but good enough for now.
- var remove_volatile_pl = dest_ty.ptrInfo();
- remove_volatile_pl.data.@"volatile" = false;
- const remove_volatile_ty = Type.initPayload(&remove_volatile_pl.base);
+ var u8_ptr_pl = dest_ty.ptrInfo();
+ u8_ptr_pl.data.pointee_type = Type.u8;
+ const u8_ptr_ty = Type.initPayload(&u8_ptr_pl.base);
- try writer.writeByte('(');
- try f.renderTypecast(writer, remove_volatile_ty);
+ try writer.writeAll("for (");
+ const index = try f.allocLocal(Type.usize, .Mut);
+ try writer.writeAll(" = ");
+ try f.object.dg.renderValue(writer, Type.usize, Value.zero, .Initializer);
+ try writer.writeAll("; ");
+ try f.writeCValue(writer, index, .Other);
+ try writer.writeAll(" != ");
+ try f.writeCValue(writer, len, .Other);
+ try writer.writeAll("; ");
+ try f.writeCValue(writer, index, .Other);
+ try writer.writeAll(" += ");
+ try f.object.dg.renderValue(writer, Type.usize, Value.one, .Other);
+ try writer.writeAll(") ((");
+ try f.renderTypecast(writer, u8_ptr_ty);
try writer.writeByte(')');
+ try f.writeCValue(writer, dest_ptr, .FunctionArgument);
+ try writer.writeAll(")[");
+ try f.writeCValue(writer, index, .Other);
+ try writer.writeAll("] = ");
+ try f.writeCValue(writer, value, .FunctionArgument);
+ try writer.writeAll(";\n");
+
+ return CValue.none;
}
+
+ try writer.writeAll("memset(");
try f.writeCValue(writer, dest_ptr, .FunctionArgument);
try writer.writeAll(", ");
try f.writeCValue(writer, value, .FunctionArgument);