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

Reply via email to