Wer kam eigentlich auf die gloriose Idee, dass
bsr/
BitScanReverse nichts mehr taugt um man jetzt Nullen zählt? In 99% der Fälle, in dem ich diesen Befehl brauche, will ich genau das machen was Schrompf auch machen will: Den Index des höchsten Bits. Nichts anderes. Niemand will 0en zählen. Warum sollte man auch
von oben die Anzahl Nullen zählen wollen? Der Index des höchsten Bits hat zudem eine einfache mathematische Interpretation: Es ist die Abrundung von
log2.
log2 von 0 gibts halt nicht, tja. Das zu 64, 0 oder sonst was zu setzen, macht es nicht unbedingt sinnvoller, denn eine Verzweigung braucht man in fast allen Anwendungsfällen ohnehin. Wenn
1/0 bereits
Undefined Behaviour ist, dann halt auch
bsr(0).
Der Effekt des ganzen Müll ist, dass Clang intern nur 0en zählen kann. Dabei kommt dann unter anderem raus, dass
Code: Alles auswählen
char Func(unsigned DataOffset)
{
return 31 ^ __builtin_clz(DataOffset);
}
zu
Code: Alles auswählen
Func(unsigned int):
bsr eax, edi
xor eax, 31
xor al, 31
ret
kompiliert. Super Ergebnis, gratuliere.
Ein entsprechender Bug Report von mir dazu, existiert seit einem halben Jahr:
https://bugs.llvm.org/show_bug.cgi?id=47603.