|
@@ -1,5 +1,7 @@
|
|
|
package mem
|
|
|
|
|
|
+import "core:runtime"
|
|
|
+
|
|
|
foreign _ {
|
|
|
@(link_name = "llvm.bswap.i16") swap16 :: proc(b: u16) -> u16 ---;
|
|
|
@(link_name = "llvm.bswap.i32") swap32 :: proc(b: u32) -> u32 ---;
|
|
@@ -38,34 +40,10 @@ zero_slice :: proc "contextless" (data: $T/[]$E) {
|
|
|
|
|
|
|
|
|
copy :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr {
|
|
|
- if src == nil do return dst;
|
|
|
- // NOTE(bill): This _must_ be implemented like C's memmove
|
|
|
- foreign _ {
|
|
|
- when size_of(rawptr) == 8 {
|
|
|
- @(link_name="llvm.memmove.p0i8.p0i8.i64")
|
|
|
- llvm_memmove :: proc(dst, src: rawptr, len: int, align: i32, is_volatile: bool) ---;
|
|
|
- } else {
|
|
|
- @(link_name="llvm.memmove.p0i8.p0i8.i32")
|
|
|
- llvm_memmove :: proc(dst, src: rawptr, len: int, align: i32, is_volatile: bool) ---;
|
|
|
- }
|
|
|
- }
|
|
|
- llvm_memmove(dst, src, len, 1, false);
|
|
|
- return dst;
|
|
|
+ return runtime.mem_copy(dst, src, len);
|
|
|
}
|
|
|
copy_non_overlapping :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr {
|
|
|
- if src == nil do return dst;
|
|
|
- // NOTE(bill): This _must_ be implemented like C's memcpy
|
|
|
- foreign _ {
|
|
|
- when size_of(rawptr) == 8 {
|
|
|
- @(link_name="llvm.memcpy.p0i8.p0i8.i64")
|
|
|
- llvm_memcpy :: proc(dst, src: rawptr, len: int, align: i32, is_volatile: bool) ---;
|
|
|
- } else {
|
|
|
- @(link_name="llvm.memcpy.p0i8.p0i8.i32")
|
|
|
- llvm_memcpy :: proc(dst, src: rawptr, len: int, align: i32, is_volatile: bool) ---;
|
|
|
- }
|
|
|
- }
|
|
|
- llvm_memcpy(dst, src, len, 1, false);
|
|
|
- return dst;
|
|
|
+ return runtime.mem_copy_non_overlapping(dst, src, len);
|
|
|
}
|
|
|
compare :: inline proc "contextless" (a, b: []byte) -> int {
|
|
|
return compare_byte_ptrs(&a[0], &b[0], min(len(a), len(b)));
|