Funktion für 32 Bit optimieren
-
Hallo, Ich nun wieder :p
Diese Funktionu8_t uip_acc32[4]; void uip_add32(u8_t *op32, u16_t op16) { uip_acc32[3] = op32[3] + (op16 & 0xff); uip_acc32[2] = op32[2] + (op16 >> 8); uip_acc32[1] = op32[1]; uip_acc32[0] = op32[0]; if(uip_acc32[2] < (op16 >> 8)) { ++uip_acc32[1]; if(uip_acc32[1] == 0) { ++uip_acc32[0]; } } if(uip_acc32[3] < (op16 & 0xff)) { ++uip_acc32[2]; if(uip_acc32[2] == 0) { ++uip_acc32[1]; if(uip_acc32[1] == 0) { ++uip_acc32[0]; } } } }
addiert zwei Werte wobei Ergebnis und 32 bit Operand im Big Endian Format sein müssen. Die Funktion ist für 8 Bit Prozessoren optimiert. Ich würde gern daraus eine 32 Bit Funktion machen. Soweit bin ich:
void uip_add32_2 (u8_t *op32, u16_t op16) { unsigned long p = htonl(*(unsigned long*)op32) + op16; *(unsigned long*)uip_acc32 = htonl(p); }
Dieses zweifache Aufrufen von htonl kommt mir so vor, als wenn man irgendwas besser machen könnte. Geht es einfacher?
DANKE im voraus!!!
-
welchen 32 bitter haste denn? einige (der ARM z.b. ab ARM6) haben 'rev' instructions, mit denen man den endian-dreher machen kann. wenn deiner sowas hat, dann mach daraus eine asm-funktion, dann kriegste die berechnung vielleicht mit 3 befehlen hin.
apropos ARM: den kannste übrigens komplett im big-endian mode betreiben, dann entfallen die dreher ganz. wär' vielleicht 'ne überlegung wert (falls du einen hast meine ich).