- Код: Выделить всё
- procedure Swap1(Len: ptrUInt; P1, P2: Pointer); nostackframe; inline;
 assembler;
 asm
 DEC RCX
 @L:
 MOV AL,[RDX+RCX]
 MOV BL,[R8+RCX]
 MOV [RDX+RCX],BL
 MOV [R8+RCX],AL
 LOOP @L
 end ['RCX', 'RDX', 'R8', 'AX'];
- Код: Выделить всё
- procedure Swap2 (Len: ptrUInt; P1, P2: Pointer); inline;
 var
 j: byte;
 i: ptrUInt;
 begin
 Dec(Len);
 for i := Len downto 0 do
 begin
 j := byte(P1^);
 byte(P1^) := byte(P2^);
 byte(P2^) := j;
 Inc(P1);
 Inc(P2);
 end;
 end;
Результаты 5000000 прогонов на sizeof(shortstring) байт
1. 2218 мс
2. 907 мс
ИМХО по моему что-то не так с ассемблером в FPC...
 
   
  




 
  
  )
 )