| ... | @@ -9,36 +9,12 @@ comptime { | ... | @@ -9,36 +9,12 @@ comptime { |
| 9 | } | 9 | } |
| 10 | } | 10 | } |
| 11 | | 11 | |
| 12 | const llvm_cannot_lower = switch (builtin.cpu.arch) { | | |
| 13 | .arm, .armeb, .thumb, .thumbeb => builtin.zig_backend == .stage2_llvm, | | |
| 14 | else => false, | | |
| 15 | }; | | |
| 16 | | | |
| 17 | fn memcpy(noalias opt_dest: ?[*]u8, noalias opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 { | 12 | fn memcpy(noalias opt_dest: ?[*]u8, noalias opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 { |
| 18 | if (llvm_cannot_lower) { | 13 | return memmove(opt_dest, opt_src, len); |
| 19 | for (0..len) |i| opt_dest.?[i] = opt_src.?[i]; | | |
| 20 | return opt_dest; | | |
| 21 | } else { | | |
| 22 | return memmove(opt_dest, opt_src, len); | | |
| 23 | } | | |
| 24 | } | 14 | } |
| 25 | | 15 | |
| 26 | /// A port of https://github.com/facebook/folly/blob/1c8bc50e88804e2a7361a57cd9b551dd10f6c5fd/folly/memcpy.S | | |
| 27 | fn memmove(opt_dest: ?[*]u8, opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 { | 16 | fn memmove(opt_dest: ?[*]u8, opt_src: ?[*]const u8, len: usize) callconv(.C) ?[*]u8 { |
| 28 | if (llvm_cannot_lower) { | 17 | // a port of https://github.com/facebook/folly/blob/1c8bc50e88804e2a7361a57cd9b551dd10f6c5fd/folly/memcpy.S |
| 29 | if (@intFromPtr(opt_dest) < @intFromPtr(opt_src)) { | | |
| 30 | for (0..len) |i| opt_dest.?[i] = opt_src.?[i]; | | |
| 31 | return opt_dest; | | |
| 32 | } else { | | |
| 33 | var index = len; | | |
| 34 | while (index != 0) { | | |
| 35 | index -= 1; | | |
| 36 | opt_dest.?[index] = opt_src.?[index]; | | |
| 37 | } | | |
| 38 | return opt_dest; | | |
| 39 | } | | |
| 40 | } | | |
| 41 | | | |
| 42 | if (len == 0) { | 18 | if (len == 0) { |
| 43 | @branchHint(.unlikely); | 19 | @branchHint(.unlikely); |
| 44 | return opt_dest; | 20 | return opt_dest; |