Replace bcopy() to update ether_addr

Mitya mitya at cabletv.dp.ua
Tue Aug 21 06:35:57 UTC 2012


20.08.2012 22:20, Warner Losh написал:
> On Aug 20, 2012, at 1:17 PM, Wojciech Puchar wrote:
>
>>>> or use ++.
>>>>
>>>> i think it is always aligned to 2 bytes and this should produce usable code on any CPU? should be 6 instructions on MIPS and PPC IMHO.
>>> We should tag it as __aligned(2) then, no?  If so, then the compiler should generate the code you posted.
>> should is the most important word in Your post. what it actually do - i don't know.
> If we are requiring this to be __aligned(2), we should tag it as such to enforce this.
>
> Even without this tagging, the code to do a structure level copy of 6 bytes is going to be tiny...
>
> Warner
>
I try some times different algorithms. This is one of thees:
*(u_int32_t *)(dst) = *(u_int32_t *)(src);
*(u_int16_t *)&(dst->octet[4]) = *(u_int16_t *)&(src->octet[4]);

But, internal gcc and clang optimisations are much better, than my attempt.
For aligned platforms (2 bytes aligned) best choice is *dst = *src;


More information about the freebsd-hackers mailing list