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.
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel