Created
April 29, 2020 08:04
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{$ifdef CPUX64} | |
function bswap32(a: cardinal): cardinal; | |
{$ifdef FPC}nostackframe; assembler; asm {$else} asm .noframe {$endif FPC} | |
mov eax, a | |
bswap eax | |
end; | |
function bswap64(const a: QWord): QWord; {$ifdef FPC}nostackframe; assembler; asm {$else} | |
asm .noframe // rcx=a (Linux: rdi) | |
{$endif FPC} | |
mov rax, a | |
bswap rax | |
end; | |
{$else} | |
{$ifdef CPUX86} | |
function bswap32(a: cardinal): cardinal; | |
asm | |
bswap eax | |
end; | |
function bswap64({$ifdef FPC_X86}constref{$else}const{$endif} a: QWord): QWord; | |
asm | |
{$ifdef FPC_X86} | |
mov edx, dword ptr[eax] | |
mov eax, dword ptr[eax + 4] | |
{$else} | |
mov edx, a.TQWordRec.L | |
mov eax, a.TQWordRec.H | |
{$endif FPC_X86} | |
bswap edx | |
bswap eax | |
end; | |
{$else} | |
{$ifdef FPC} | |
function bswap32(a: cardinal): cardinal; | |
begin | |
result := SwapEndian(a); // use fast platform-specific function | |
end; | |
function bswap64(const a: QWord): QWord; | |
begin | |
result := SwapEndian(a); // use fast platform-specific function | |
end; | |
{$else} | |
function bswap32(a: cardinal): cardinal; | |
begin | |
result := ((a and $ff)shl 24)or((a and $ff00)shl 8)or | |
((a and $ff0000)shr 8)or((a and $ff000000)shr 24); | |
end; | |
function bswap64(const a: QWord): QWord; | |
begin | |
TQWordRec(result).L := bswap32(TQWordRec(a).H); | |
TQWordRec(result).H := bswap32(TQWordRec(a).L); | |
end; | |
{$endif FPC} | |
{$endif CPUX86} | |
{$endif CPUX64} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment