:: limine / common / lib / memory.s2.c 1.2 KB raw

1
#if !defined (__x86_64__) && !defined (__i386__)
2
3
#include <stdint.h>
4
#include <stddef.h>
5
6
void *memcpy(void *restrict dest, const void *restrict src, size_t n) {
7
    uint8_t *restrict pdest = (uint8_t *restrict)dest;
8
    const uint8_t *restrict psrc = (const uint8_t *restrict)src;
9
10
    for (size_t i = 0; i < n; i++) {
11
        pdest[i] = psrc[i];
12
    }
13
14
    return dest;
15
}
16
17
void *memset(void *s, int c, size_t n) {
18
    uint8_t *p = (uint8_t *)s;
19
20
    for (size_t i = 0; i < n; i++) {
21
        p[i] = (uint8_t)c;
22
    }
23
24
    return s;
25
}
26
27
void *memmove(void *dest, const void *src, size_t n) {
28
    uint8_t *pdest = (uint8_t *)dest;
29
    const uint8_t *psrc = (const uint8_t *)src;
30
31
    if ((uintptr_t)src > (uintptr_t)dest) {
32
        for (size_t i = 0; i < n; i++) {
33
            pdest[i] = psrc[i];
34
        }
35
    } else if ((uintptr_t)src < (uintptr_t)dest) {
36
        for (size_t i = n; i > 0; i--) {
37
            pdest[i-1] = psrc[i-1];
38
        }
39
    }
40
41
    return dest;
42
}
43
44
int memcmp(const void *s1, const void *s2, size_t n) {
45
    const uint8_t *p1 = (const uint8_t *)s1;
46
    const uint8_t *p2 = (const uint8_t *)s2;
47
48
    for (size_t i = 0; i < n; i++) {
49
        if (p1[i] != p2[i]) {
50
            return p1[i] < p2[i] ? -1 : 1;
51
        }
52
    }
53
54
    return 0;
55
}
56
57
#endif
tab: 248 wrap: offon