ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_freestanding_mem.c
Go to the documentation of this file.
1
18
19#if defined(__GNUC__) && !defined(__clang__)
20#pragma GCC optimize("no-tree-loop-distribute-patterns")
21#endif
22
23#include <stddef.h>
24#include <stdint.h>
25
26#include "ra8_freestanding.h"
27
28#if !defined(RA8_OFF_TARGET) || defined(RA8_TEST_FREESTANDING)
29
45void* memset(void* dst, int value, size_t n)
46{
47 uint8_t* d = (uint8_t*)dst;
48 const uint8_t v = (uint8_t)value;
49 for (size_t i = 0U; i < n; ++i) {
50 d[i] = v;
51 }
52 return dst;
53}
54
70void* memcpy(void* dst, const void* src, size_t n)
71{
72 uint8_t* d = (uint8_t*)dst;
73 const uint8_t* s = (const uint8_t*)src;
74 for (size_t i = 0U; i < n; ++i) {
75 d[i] = s[i];
76 }
77 return dst;
78}
79
95void* memmove(void* dst, const void* src, size_t n)
96{
97 if (dst == src) {
98 return dst;
99 }
100 if (n == 0U) {
101 return dst;
102 }
103 uint8_t* d = (uint8_t*)dst;
104 const uint8_t* s = (const uint8_t*)src;
105 if (d < s) {
106 for (size_t i = 0U; i < n; ++i) {
107 d[i] = s[i];
108 }
109 } else {
110 size_t i = n;
111 while (i > 0U) {
112 --i;
113 d[i] = s[i];
114 }
115 }
116 return dst;
117}
118
136int memcmp(const void* a, const void* b, size_t n)
137{
138 const uint8_t* p1 = (const uint8_t*)a;
139 const uint8_t* p2 = (const uint8_t*)b;
140 for (size_t i = 0U; i < n; ++i) {
141 if (p1[i] != p2[i]) {
142 return (p1[i] < p2[i]) ? -1 : 1;
143 }
144 }
145 return 0;
146}
147
164void* memchr(const void* s, int c, size_t n)
165{
166 const uint8_t* p = (const uint8_t*)s;
167 const uint8_t target = (uint8_t)c;
168 for (size_t i = 0U; i < n; ++i) {
169 if (p[i] == target) {
170 const uint8_t* result_source = &p[i];
171 void* result = nullptr;
172 (void)__builtin_memcpy((void*)&result, (const void*)&result_source, sizeof(result));
173 return result;
174 }
175 }
176 return nullptr;
177}
178#endif /* !RA8_OFF_TARGET || RA8_TEST_FREESTANDING */
Project-owned freestanding C runtime ABI primitives.
void * memchr(const void *s, int c, size_t n)
Locate a byte in a memory area.
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
int memcmp(const void *a, const void *b, size_t n)
Compare bytes in two memory areas.
void * memmove(void *dst, const void *src, size_t n)
Copy memory area between potentially overlapping regions.
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.