A. K. wrote:
> 10 Takte, gcc 4.3.3:
> b = ((unsigned)(a >> 16) << 2) >> 8;
>
> Varianten über Speicher haben Nachteile. Der übrige Code, der auf die
> Variablen zugreift, wird aufwendiger weil nicht in Register. Und es
> erwingt oft einen teuren Stackframe.
Das braucht bei mir 19 Takte (a ist eine globale Variable im ram -> 4
mal LDS...), also einen Takt weniger als die "Pointer- Version", aber
immerhin!
Jetzt habe ich noch etwas probiert:
1 | b = (*((uint16_t*)&a + 1) << 2) >> 8;
|
17 Takte!
Diese Version profitiert wohl einmal davon, dass hier wirklich nur das
"high word" aus dem Speicher geholt wird (a ist global) und dann von dem
einen "2er shift", der "8er shift" wird ja zu einer "Kopieraktion".
Danke!