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