Thank you Jonas, so back to my original question, is there an asm expert out there who knows if the syntax is invalid, or simply the compiler does not implement bt, bts, btr instructions
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; On Sat, Sep 10, 2016 at 5:17 PM, Jonas Maebe <jonas.ma...@elis.ugent.be> wrote: > On 10/09/16 12:55, Jy V wrote: > >> I am not sure the FreePascal compiler is able to convert the code of the >> procedure BitsetSet(var Bits; Index: UInt32); >> PUInt64Array(@Bits)^[Index shr 6] := PUInt64Array(@Bits)^[Index shr 6] >> or (Int64(1) shl (Index and 63)); >> >> into a single instruction: >> >> bts [eax], edx >> > > It could easily do it with > > type > tbitarray = bitpacked array[0..high(qword)-1] of boolean; > pbitarray = ^tbitarray; > > var > ba: pbitarray; > index: qword; > begin > ... > ba^[index]:=1; > end. > > but only *if* someone would first override > thlcgobj.a_load_regconst_subsetref_intern() > for x86 in the compiler source code and implement the special cases for > setting a single bit to 0 or 1 (which is not the case, currently). The bts > instruction is already used for include(setvar,value), but sets are > obviously limited to 256 elements. > > > Jonas > > _______________________________________________ > fpc-devel maillist - fpc-devel@lists.freepascal.org > http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel >
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel