skip optimized memcpy/memset for small builds

This saves 100 bytes on trinket_m0 at the price of making many memset &
memcpy calls slower.
This commit is contained in:
Jeff Epler 2022-05-14 07:34:38 -05:00
parent 016242aa26
commit cb331309c9
No known key found for this signature in database
GPG Key ID: D5BF15AB975AB4DE
1 changed files with 10 additions and 2 deletions

View File

@ -28,6 +28,8 @@
#include <stddef.h>
#include <string.h>
#include "py/mpconfig.h"
#ifndef likely
#define likely(x) __builtin_expect((x), 1)
#endif
@ -35,6 +37,7 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-align"
void *memcpy(void *dst, const void *src, size_t n) {
#if CIRCUITPY_FULL_BUILD
if (likely(!(((uintptr_t)dst) & 3) && !(((uintptr_t)src) & 3))) {
// pointers aligned
uint32_t *d = dst;
@ -56,7 +59,9 @@ void *memcpy(void *dst, const void *src, size_t n) {
// copy byte
*((uint8_t*)d) = *((const uint8_t*)s);
}
} else {
} else
#endif
{
// unaligned access, copy bytes
uint8_t *d = dst;
const uint8_t *s = src;
@ -93,6 +98,7 @@ void *memmove(void *dest, const void *src, size_t n) {
}
void *memset(void *s, int c, size_t n) {
#if CIRCUITPY_FULL_BUILD
if (c == 0 && ((uintptr_t)s & 3) == 0) {
// aligned store of 0
uint32_t *s32 = s;
@ -106,7 +112,9 @@ void *memset(void *s, int c, size_t n) {
if (n & 1) {
*((uint8_t*)s32) = 0;
}
} else {
} else
#endif
{
uint8_t *s2 = s;
for (; n > 0; n--) {
*s2++ = c;