<div dir="ltr"><div><div>Thank you Jonas,<br></div>so back to my original question,<br>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<br></div><div><br>function BitsetGet(const Bits; Index: UInt32): Boolean; assembler;<br>asm<br>    {$IFDEF WIN64} // Win64 IN: rcx = Bits, edx = Index  OUT: rax = Result<br>      bt (%rcx), %edx // -> Error asm: [bt reg32,mem32]<br>//      bt (%rcx), %rdx // -> Error asm: [bt reg64,mem64]<br>      sbb %eax, %eax<br>      and %eax, $1<br>    {$ELSE} // Linux IN: rdi = Bits, esi = Index  OUT: rax = Result<br>      bt (%rdi), %esi<br>      sbb %rax, %rax<br>      and %rax, $1<br>    {$ENDIF}<br>end;<br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Sep 10, 2016 at 5:17 PM, Jonas Maebe <span dir="ltr"><<a href="mailto:jonas.maebe@elis.ugent.be" target="_blank">jonas.maebe@elis.ugent.be</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 10/09/16 12:55, Jy V wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I am not sure the FreePascal compiler is able to convert the code of the<br>
procedure BitsetSet(var Bits; Index: UInt32);<br>
  PUInt64Array(@Bits)^[Index shr 6] := PUInt64Array(@Bits)^[Index shr 6]<br>
or (Int64(1) shl (Index and 63));<br>
<br>
into a single instruction:<br>
<br>
 bts [eax], edx<br>
</blockquote>
<br></span>
It could easily do it with<br>
<br>
type<br>
  tbitarray = bitpacked array[0..high(qword)-1] of boolean;<br>
  pbitarray = ^tbitarray;<br>
<br>
var<br>
  ba: pbitarray;<br>
  index: qword;<br>
begin<br>
  ...<br>
  ba^[index]:=1;<br>
end.<br>
<br>
but only *if* someone would first override thlcgobj.a_load_regconst_subse<wbr>tref_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.<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
Jonas</font></span><div class="HOEnZb"><div class="h5"><br>
______________________________<wbr>_________________<br>
fpc-devel maillist  -  <a href="mailto:fpc-devel@lists.freepascal.org" target="_blank">fpc-devel@lists.freepascal.org</a><br>
<a href="http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel" rel="noreferrer" target="_blank">http://lists.freepascal.org/cg<wbr>i-bin/mailman/listinfo/fpc-dev<wbr>el</a><br>
</div></div></blockquote></div><br></div>