From 40546fbde27601c147f5c64d9c1138a5a40bb3b8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 3 Nov 2019 19:59:41 +0000 Subject: [PATCH] Use `runtime.mem_copy` in `package me` --- core/mem/mem.odin | 30 ++++-------------------------- core/runtime/internal.odin | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index e5b79258c..1c833c4d1 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -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))); diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin index 164610ae6..7f928b580 100644 --- a/core/runtime/internal.odin +++ b/core/runtime/internal.odin @@ -18,6 +18,22 @@ mem_copy :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr { return dst; } +mem_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 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; +} + print_u64 :: proc(fd: os.Handle, x: u64) { digits := "0123456789";