c - memcopy for embedded system
Alignment
unsigned int *dst = destination; fails when destination is not aligned for unsigned.  Same for src. (OP seems be somewhat aware of this given &quot;unaligned address not handled&quot;)
Aliasing
Possible strict aliasing violation.  See What is the strict aliasing rule?
Fails when buffers overlap
Without restrict, buffer may overlap and code does not well handle overlaps in both directions.
Recommend to use restrict like memcpy().
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);

CPU WORD size
&quot;I know int will always be CPU WORD size&quot; discounts 8-bits CPUs (common in embedded code).  On those, an int is at least 16-bit, not 8-bit.
The low-level copy size is typically related to the CPU word size, but much of this is implementation dependent.
Usually unsigned is good or best, but one would need to profile the implementation to know for sure.
Minor: Unneeded code
Test of left not unneeded as later while(left--) does the job.
// if (left)

NULL Testing
Common to not test for null-ness.  memcpy() is not require to do so, nor is it required to not test NULL.  What should be done depends on overall coding goals, so it is up to you.