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