diff --git a/src/fastmem.zig b/src/fastmem.zig index 687c057af..bdea44155 100644 --- a/src/fastmem.zig +++ b/src/fastmem.zig @@ -2,13 +2,20 @@ const std = @import("std"); const builtin = @import("builtin"); const assert = std.debug.assert; -/// Same as std.mem.copyForwards but prefers libc memmove if it is available -/// because it is generally much faster. +/// Same as std.mem.copyForwards/Backwards but prefers libc memmove if it is +/// available because it is generally much faster. pub inline fn move(comptime T: type, dest: []T, source: []const T) void { if (builtin.link_libc) { _ = memmove(dest.ptr, source.ptr, source.len * @sizeOf(T)); } else { - std.mem.copyForwards(T, dest, source); + // Depending on the ordering of the copy, we need to use the + // proper call here. Unfortunately this function call is + // too generic to know this at comptime. + if (@intFromPtr(dest.ptr) <= @intFromPtr(source.ptr)) { + std.mem.copyForwards(T, dest, source); + } else { + std.mem.copyBackwards(T, dest, source); + } } }