Hi,
Ich programmier gerade einen Code, der sowohl auf einem STM32F4 als auch
F0 und vermutlich später ein paar mehr laufen soll. Zum optimieren des
ganzen würde ich gerne ein paar inline Assembler Befehle nutzen,
allerdings wären das je nach Coretex andere Befehle.
Zum Beispiel ein Bitswap:
Also bit0 -> bit31 bit1 -> bit30 , ... , bit31 -> bit0
Verwendet habe ich dazu den Code von hier:
http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious
1 | // swap odd and even bits
|
2 | a = ((a >> 1) & 0x55555555) | ((a & 0x55555555) << 1);
|
3 | // swap consecutiae pairs
|
4 | a = ((a >> 2) & 0x33333333) | ((a & 0x33333333) << 2);
|
5 | // swap nibbles ...
|
6 | a = ((a >> 4) & 0x0F0F0F0F) | ((a & 0x0F0F0F0F) << 4);
|
7 | // swap bytes
|
8 | a = ((a >> 8) & 0x00FF00FF) | ((a & 0x00FF00FF) << 8);
|
9 | // swap 2-byte long pairs
|
10 | a = ( a >> 16 ) | ( a << 16);
|
GCC weiß allerdings nicht, dass es sich dabei um einen Bitswap handelt,
also wird auf einem Cortex M4 nicht RBIT und bei einem M0 zumindest die
Hälfte mit einem REV "abgekürzt"
(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489h/Cihjgdid.html)
Habe noch ein paar andere Fälle, in denen ich die DIV Operation anders
behandeln könnte, wenn es diese (beim M0) nicht gibt.
Also jetzt zu meiner Frage, Gibt es die Möglichkeit in GCC schon über
Preprozessor-Anweisungen nach den unterstützen Befehlen zu Fragen?
Ich könnte natürlich auch Fragen, ob es sich um einen Cortex M0 oder M4
handelt, dann müsste ich das aber für jeden Prozessor machen, der später
dazu kommt. Oder wäre das die allgemeine Vorgehensweise.