Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
Delphi 10.2 Tokyo Professional
|
Re: Assembler: Reihenfolge eines Bitfelds umdrehen
25. Jun 2005, 11: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
|