Op 24 mei 2023 19:39:38 schreef Tuxracer:
Denk je ?
De compiler moet dan een heel stuk code analyseren en concluderen dat het een bit reversal is. Compilers zijn wel slim, maar ik vraag mij af of ze zo slim zijn.
In gcc heet het de peephole optimizer.
Die kijkt steeds met een pattern-matcher naar de tot dan toe gegenereerde code en vervangt die door wat nieuws, korters. Dus als "bit reversal" een instructie in je CPU is, dan zouden ze dat er in kunnen zetten, dat de instructie-sequence om een byte om te draaien door de bit-reversal instructie vervangen wordt.
Het enige is: Ik ken geen CPUs die de bit reversal in de instructie set hebben. Even ge-googled, en... ARM (waar de originele code op moet draaien) heeft hem wel.
Maar ik heb naar de geproduceerde code gekeken en daar werd ie niet in gebruikt.
Even de "oneliner" door gcc-amd64 en gcc-arm gehaald. CISC: 16 instructies, RISC: 12 instructies.
Ik heb de bswap routine herschreven tot:
c code:
int bswap8 (int c)
{
asm ("rbit %0, %0" : "+r" (c));
return c >> 24;
}
(merk op dat ik dit doe om er van te leren, niet omdat het sneller moet!!!!)
Dit compileert naar 3 instructies:
code:
rbit r0, r0
asr r0, r0, #24
bx lr
maar de compiler weet meer dan ik:
code:
/tmp/cc7oCHXj.s:27: Error: selected processor does not support `rbit r0,r0' in ARM mode
Dus mijn processor heeft die instructie TOCH niet. (ook niet in thumb mode wat de uiteindelijke target doet).
Dus... Toch is mijn "ik weet geen processor die een bitvolgorde kan omdraaien" WEER correct. 
Voor de lol tuxracer z'n code door de arm compiler gehaald: 1) Hij heeft gelijk: Identieke code. 2) RISC is weer korter dan x86!