Funktion für 32 Bit optimieren



  • Hallo, Ich nun wieder :p
    Diese Funktion

    u8_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).

    🙂


Anmelden zum Antworten