Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Assembler: Reihenfolge eines Bitfelds umdrehen

  Alt 25. Jun 2005, 10:49
[offtopic]

@Hagen: wo ich deinen Assembler-Code gerade so sehe: kann man da an zwei Stellen nicht noch etwas (zugegeben: minimal) optimieren, indem man Zuweisung + links Schieben durch LEA mit Faktor ersetzt? Die beiden Operanden für OR haben ja keine gemeinsamen Bits, also kann man statt dessen auch einfach addieren.

(das Semikolon soll einen Kommentar einleiten. Ich weiß jetzt aus dem Kopf nicht mehr, ob der Delphi-Assembler das unterstützt)

Code:
{reverse the bit order from a integer}
function SwapBits(Value, Bits: LongWord): LongWord; register;
asm
       BSWAP EAX

       LEA   ECX,[2*EAX]   ; <-- x2 schon drin
      ;MOV   ECX,EAX
       AND   EAX,0AAAAAAAAh
       AND   ECX,0AAAAAAAAh ; <--
       SHR   EAX,1
      ;SHL   ECX,1          ; <--
       OR    EAX,ECX

       LEA   ECX,[4*EAX]   ; <-- x4 schon drin
      ;MOV   ECX,EAX
       AND   EAX,0CCCCCCCCh
       AND   ECX,0CCCCCCCCh ; <--
       SHR   EAX,2
      ;SHL   ECX,2          ; <--
       OR    EAX,ECX

       MOV   ECX,EAX
       AND   EAX,0F0F0F0F0h
       AND   ECX,00F0F0F0Fh
       SHR   EAX,4
       SHL   ECX,4
       OR    EAX,ECX
       AND   EDX,01Fh
       JZ    @@1
       MOV   ECX,32
       SUB   ECX,EDX
       SHR   EAX,CL
@@1:
end;
oder (2. Variante)
Code:
{reverse the bit order from a integer}
function SwapBits(Value, Bits: LongWord): LongWord; register;
asm
       BSWAP EAX

       MOV   ECX,EAX
       AND   EAX,0AAAAAAAAh
       AND   ECX,055555555h
       SHR   EAX,1
       LEA   EAX,[EAX+2*ECX] ;<-- Keine gemeinsamen Bits
      ;SHL   ECX,1
      ;OR    EAX,ECX

       MOV   ECX,EAX
       AND   EAX,0CCCCCCCCh
       AND   ECX,033333333h
       SHR   EAX,2
       LEA   EAX,[EAX+4*ECX] ;<-- Keine gemeinsamen Bits
      ;SHL   ECX,2
      ;OR    EAX,ECX

      ;MOV   ECX,EAX
       LEA   ECX,[4*EAX]     ;<-- Erstes x4
       AND   EAX,0F0F0F0F0h
       AND   ECX,03C3C3C3Ch  ;<--
       SHR   EAX,4
       LEA   EAX,[EAX+4*ECX] ;<-- Zweites x4
      ;SHL   ECX,4
      ;OR    EAX,ECX

       AND   EDX,01Fh
       JZ    @@1
       MOV   ECX,32
       SUB   ECX,EDX
       SHR   EAX,CL
@@1:
end;
Ich weiß natürlich nicht, ob das irgendwelche negativen Einflüsse auf den Instruction-Cache hat und die ganze Sache ggf. vielleicht doch langsamer macht.

[/offtopic]
Volker
  Mit Zitat antworten Zitat