Bitove polia a optimalizacia kody Was: STM32F051K6U7 ma USART2 ?
Jan Waclawek
konfera na efton.sk
Pondělí Březen 16 11:03:46 CET 2015
>No, tak stacilo pozriet do dokumentacie... treti operand je "any
>constant that can be produced by shifting an 8-bit value left by any
>number of bits within a 32-bit word"
Neviem aku dokumentaciu ste pozerali, lebo toto nie je celkom pravda;
presnejsie, tych moznosti je o nieco malo viac, menovite formy:
int main(void) {
__asm(
"orr r3, r3, #0xab00ab00" "\n\t"
"orr r3, r3, #0x00ab00ab" "\n\t"
"orr r3, r3, #0xabababab" "\n\t"
);
}
Konstanty (immediate operandy) su kanonicky problem vsetkych procesorov s
instrukcnym slovom mensim aj rovnym (aj len malo vacsim) nez je datove
slovo. Riesenia su vsetky "plytvajuce": bud natiahnut konstantu do
registra "na viackrat" (to je ciste v rukach programatora), natahovat
konstanty do registra nepriamo (to je vacsinovo pouzite riesenie u RISC),
mat viacslovne instrukcie (to sa prieci principu RISC) a mat instrukcie
ktore vedia robit aritmetiku s nepriamymi operandami (aj toto sa prieci
principu RISC).
U toho Thumbu je to vdaka vyraznemu rozdielu sirky slov (16/32, aj ked cas
instrukcii je dvoj-pol-slovna, ale to tu situaciu aj tak nezachrani) dost
vypukle, takze k dispozicii je len jeden byte dat a par bitov naviac na to
"riadenie" (rotacie atd.), a podla vsetkeho autori robili co mohli. To
pouzitie barrel shiftu a "byte-to-word-expandera" je pomerne prirodzene,
kedze obvody pre toto tam uz z inych dovodov aj tak su (barrel shift je
tam od zaciatku a je nasledok prvotneho rozhodnutia mat nasobicku v jadre).
wek
Další informace o konferenci Hw-list