Hallo,
das Testumfeld habe ich ja schon geschaffen gehabt.
http://www.delphipraxis.net/1149984-post26.html TestVier.zip
Bei der Assembler Variante müsste man noch die Sprünge vermeiden.
Mit cmovc geht es ja zu Beginn.
Das spart bei randomisierten Daten etwa 9 Takte.
Vielleicht müsste man dan DX,CX zusammenfassen '
DL,DH'+'CH,CL'(<-xchg) und dann um ein byte schieben und in 'DH,CH' + 'CL,
DL' wieder aufteilen.
Delphi-Quellcode:
procedure SelectionsortASMDown2(
var A: ByteArray);
register;
label Weiter3,Weiter4,Weiter5;
asm
// In einer asm-Anweisung muss der Inhalt der Register
// EDI, ESI, ESP, EBP und EBX erhalten bleiben, während die Register
// EAX, ECX und EDX beliebig geändert werden können.
PUSH EAX;
mov CX,[EAX];
mov DX,[EAX+$02];
mov AX,DX
// tauscht DL,DH
Xchg AH,AL
//
// init fertig
// if A[0] > A[1] then begin T:= A[0]; A[0]:= A[1]; A[1]:= T; end;
cmp DH,
DL;
cmovc dx,ax
mov AX,CX
// tauscht CL,CH
Xchg AH,AL
// if A[2] > A[3] then begin T:= A[0]; A[0]:= A[2]; A[2]:= T; end;
cmp CH,CL;
cmovc cx,ax
// if A[0] > A[2] then begin T:= A[0]; A[0]:= A[3]; A[3]:= T; end;
cmp DH,CH;
jnb Weiter3;
xchg DH,CH;
Weiter3:
// if A[1] > A[3] then begin T:= A[1]; A[1]:= A[2]; A[2]:= T; end;
cmp
DL,CL;
jnb Weiter4;
xchg
DL,CL;
Weiter4:
// if A[1] > A[2] then begin T:= A[1]; A[1]:= A[3]; A[3]:= T; end;
cmp
DL,CH;
jnb Weiter5;
xchg
DL,CH;
Weiter5:
POP EAX
mov [EAX],CX;
mov [EAX+$02],DX;
end;
end;
[/DELPHI]