1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <stdint.h>
6 #include <string.h>
7
memcpy(void * restrict dest,const void * restrict src,size_t len)8 void* memcpy(void* restrict dest, const void* restrict src, size_t len) {
9 void* dest_end;
10 void* src_end;
11 __asm__ volatile("rep movsb" :
12 "=D"(dest_end), "=S"(src_end), "=c"(len) :
13 "0"(dest), "1"(src), "2"(len) :
14 "memory");
15 return dest;
16 }
17
memmove(void * restrict dest,const void * restrict src,size_t len)18 void* memmove(void* restrict dest, const void* restrict src, size_t len) {
19 if ((uintptr_t)dest < (uintptr_t)src) {
20 void* dest_end;
21 void* src_end;
22 __asm__ volatile("rep movsb" :
23 "=D"(dest_end), "=S"(src_end), "=c"(len) :
24 "0"(dest), "1"(src), "2"(len) :
25 "memory");
26 } else {
27 __asm__ volatile("std\n\t"
28 "rep movsb\n\t"
29 "cld" :
30 "=D"(dest), "=S"(src), "=c"(len) :
31 "0"((uint8_t*)dest + len - 1),
32 "1"((uint8_t*)src + len - 1),
33 "2"(len) :
34 "memory");
35 dest = (void*)((uint8_t*)dest + 1);
36 }
37 return dest;
38 }
39
memset(void * dest,int val,size_t len)40 void* memset(void* dest, int val, size_t len) {
41 void* dest_end;
42 __asm__ volatile("rep stosb" :
43 "=D"(dest_end), "=c"(len) :
44 "0"(dest), "1"(len), "a"((unsigned char)val) :
45 "memory");
46 return dest;
47 }
48
strlen(const char * s)49 size_t strlen(const char* s) {
50 size_t len = 0;
51 while (*s++ != '\0') {
52 ++len;
53 }
54 return len;
55 }
56