Skip to content

Instantly share code, notes, and snippets.

@synopse
Created April 29, 2020 08:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save synopse/f76a6d202d7d428abf14c153e5e3ddd1 to your computer and use it in GitHub Desktop.
Save synopse/f76a6d202d7d428abf14c153e5e3ddd1 to your computer and use it in GitHub Desktop.
{$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