mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-01 02:42:17 +00:00
add musl memcpy and avx2 dispatching
This commit is contained in:
parent
ca9938bf7c
commit
159f95aad1
5 changed files with 292 additions and 2 deletions
|
@ -1,6 +1,8 @@
|
|||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const arch = builtin.cpu.arch;
|
||||
const musl_memcpy = @import("libc/musl/memcpy.zig");
|
||||
const cpuid = @import("libc/cpuid.zig");
|
||||
|
||||
comptime {
|
||||
@export(memcpy, .{ .name = "roc_memcpy", .linkage = .Weak });
|
||||
|
@ -10,14 +12,15 @@ comptime {
|
|||
const Memcpy = fn (noalias [*]u8, noalias [*]const u8, len: usize) callconv(.C) [*]u8;
|
||||
|
||||
pub var memcpy_target: Memcpy = switch (arch) {
|
||||
.x86_64 => memcpy,
|
||||
// TODO(): Switch to dispatch_memcpy once the surgical linker can support it.
|
||||
// .x86_64 => dispatch_memcpy,
|
||||
.x86_64 => musl_memcpy.musl_memcpy,
|
||||
else => unreachable,
|
||||
};
|
||||
|
||||
pub fn memcpy(noalias dest: [*]u8, noalias src: [*]const u8, len: usize) callconv(.C) [*]u8 {
|
||||
switch (arch) {
|
||||
.x86_64 => {
|
||||
@memcpy(dest, src, len);
|
||||
return memcpy_target(dest, src, len);
|
||||
},
|
||||
.i386 => {
|
||||
|
@ -39,3 +42,17 @@ pub fn memcpy(noalias dest: [*]u8, noalias src: [*]const u8, len: usize) callcon
|
|||
else => @compileError("Unsupported architecture for memcpy"),
|
||||
}
|
||||
}
|
||||
|
||||
fn dispatch_memcpy(noalias dest: [*]u8, noalias src: [*]const u8, len: usize) callconv(.C) [*]u8 {
|
||||
switch (arch) {
|
||||
.x86_64 => {
|
||||
if (cpuid.supports_avx2()) {
|
||||
memcpy_target = musl_memcpy.musl_memcpy;
|
||||
} else {
|
||||
memcpy_target = musl_memcpy.musl_memcpy;
|
||||
}
|
||||
},
|
||||
else => unreachable,
|
||||
}
|
||||
return memcpy_target(dest, src, len);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue