From d8635af1dcff8dc5fc4874a711d34bd67eeab689 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Tue, 1 Nov 2022 20:43:54 -0400 Subject: cbe: correctly implement volatile memset --- src/codegen/c.zig | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'src/codegen') 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); -- cgit v1.2.3