[fpc-devel] Bitset assembler

Jy V jyv110 at gmail.com
Thu Sep 8 11:02:39 CEST 2016


Hello to all assembler experts,

I would greatly appreciate if some people could help me prepare some asm
code for FreePascal for Win32, Win64, Linux x86, Linux x64 (and maybe some
ARM32bit + AARCH64)
I am using Lazarus 1.6, FPC 3.0.0 SVN revision 51630
x86_64-win64-win32/win64

function BitsetGet(const Bits; Index: UInt32): Boolean; assembler;
asm
    {$IFDEF WIN64} // Win64 IN: rcx = Bits, edx = Index  OUT: rax = Result
      bt (%rcx), %edx // -> Error asm: [bt reg32,mem32]
//      bt (%rcx), %rdx // -> Error asm: [bt reg64,mem64]
      sbb %eax, %eax
      and %eax, $1
    {$ELSE} // Linux IN: rdi = Bits, esi = Index  OUT: rax = Result
      bt (%rdi), %esi
      sbb %rax, %rax
      and %rax, $1
    {$ENDIF}
end;

for reference the x86 DCC code which is working :

function BitsetGet(const Bits; Index: UInt32): Boolean;
asm
  bt [eax], edx
  sbb eax, eax
  and eax, 1
end;

and the x64 DCC code which should be working :

function BitsetGet(const Bits; Index: UInt32): Boolean;
asm
      bt [rcx], edx
      sbb eax, eax
      and eax, 1
end;

--------------------------------------------------------
procedure BitsetSet(var Bits; Index: UInt32); assembler;
asm
    {$IFDEF WIN64} // Win64 IN: rcx = Bits, edx = Index  OUT: eax = Result
      bts (%rcx), %edx // -> Error asm: [bt reg32,mem32]
      sbb %eax, %eax
      and %eax, $1
    {$ELSE} // Linux IN: rdi = Bits, esi = Index  OUT: eax = Result
      bts (%rdi), %esi
      sbb %eax, %eax
      and %eax, $1
    {$ENDIF}
end;

for reference the x86 DCC code which is working :

procedure BitsetSet(var Bits; Index: UInt32);
asm
  bts [eax], edx
end;

and the x64 DCC code which should be working :

function BitsetGet(const Bits; Index: UInt32): Boolean;
asm
      bt [rcx], edx
      sbb eax, eax
      and eax, 1
end;


--------------------------------------------------------
procedure BitsetReset(var Bits; Index: UInt32); assembler;
asm
    {$IFDEF WIN64} // Win64 IN: rcx = Bits, edx = Index  OUT: eax = Result
      btr (%rcx), %edx // -> Error asm: [bt reg32,mem32]
      sbb %eax, %eax
      and %eax, $1
    {$ELSE} // Linux IN: rdi = Bits, esi = Index  OUT: eax = Result
      btr (%rdi), %esi
      sbb %eax, %eax
      and %eax, $1
    {$ENDIF}
end;

for reference the x86 DCC code which is working :

procedure BitsetReset(var Bits; Index: UInt32);
asm
  btr [eax],edx
end;

and the x64 DCC code which should be working :

procedure BitsetReset(var Bits; Index: UInt32);
asm
      btr [rcx], edx
      sbb eax, eax
      and eax, 1
end;

Thank you for any help.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20160908/49b3e541/attachment.html>


More information about the fpc-devel mailing list