FastLED 3.9.15
Loading...
Searching...
No Matches

◆ memcpy()

FL_OPTIMIZE_FUNCTION FL_IRAM FASTLED_FORCE_INLINE void fl::isr::memcpy ( void *FL_RESTRICT_PARAM dst,
const void *FL_RESTRICT_PARAM src,
size_t num_bytes )

ISR-optimized memcpy with alignment detection and switch dispatch.

Parameters
dstDestination pointer
srcSource pointer
num_bytesNumber of bytes to copy
Note
Automatically uses 32-bit, 16-bit, or byte copy based on alignment
Uses switch for dispatch (compiler may optimize to jump table)

Definition at line 75 of file memcpy.h.

77 {
78 uintptr_t dst_addr = fl::ptr_to_int(dst);
79 uintptr_t src_addr = fl::ptr_to_int(src);
80
81 size_t align2 = (((dst_addr | src_addr | num_bytes) & 1) == 0);
82 size_t align4 = (((dst_addr | src_addr | num_bytes) & 3) == 0);
83
84 int index = align2 + align4;
85
86 switch (index) {
87 case 2:
88 memcpy_32(static_cast<u32*>(dst),
89 static_cast<const u32*>(src),
90 num_bytes >> 2);
91 break;
92 case 1:
93 memcpy_16(static_cast<u16*>(dst),
94 static_cast<const u16*>(src),
95 num_bytes >> 1);
96 break;
97 case 0:
98 default:
99 memcpy_byte(static_cast<u8*>(dst),
100 static_cast<const u8*>(src),
101 num_bytes);
102 break;
103 }
104}
FL_OPTIMIZE_FUNCTION FL_IRAM FASTLED_FORCE_INLINE void memcpy_16(u16 *FL_RESTRICT_PARAM dst, const u16 *FL_RESTRICT_PARAM src, size_t count)
ISR-optimized 16-bit block copy for 2-byte aligned memory.
Definition memcpy.h:46
FL_OPTIMIZE_FUNCTION FL_IRAM FASTLED_FORCE_INLINE void memcpy_byte(u8 *FL_RESTRICT_PARAM dst, const u8 *FL_RESTRICT_PARAM src, size_t count)
ISR-optimized byte copy.
Definition memcpy.h:60
FL_OPTIMIZE_FUNCTION FL_IRAM FASTLED_FORCE_INLINE void memcpy_32(u32 *FL_RESTRICT_PARAM dst, const u32 *FL_RESTRICT_PARAM src, size_t count)
ISR-optimized 32-bit block copy for 4-byte aligned memory.
Definition memcpy.h:32
unsigned char u8
Definition stdint.h:131
uptr ptr_to_int(T *ptr) FL_NOEXCEPT
Definition bit_cast.h:71
fl::uptr uintptr_t
Definition s16x16x4.h:224

References FL_RESTRICT_PARAM, memcpy_16(), memcpy_32(), memcpy_byte(), and fl::ptr_to_int().

Referenced by fl::wave3Untranspose_16(), fl::wave3Untranspose_2(), fl::wave3Untranspose_4(), fl::wave3Untranspose_8(), fl::wave8Untranspose_16(), fl::wave8Untranspose_2(), fl::wave8Untranspose_4(), and fl::wave8Untranspose_8().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: