Browse Source

Faster genset.inc:fpc_varset_set_range.

Rika Ichinose 2 years ago
parent
commit
2536041230
1 changed files with 27 additions and 6 deletions
  1. 27 6
      rtl/inc/genset.inc

+ 27 - 6
rtl/inc/genset.inc

@@ -120,14 +120,35 @@ procedure fpc_varset_unset(const source;var dest; b,size : ptrint); compilerproc
   adds the range [l..h] to the set orgset
   adds the range [l..h] to the set orgset
 }
 }
 procedure fpc_varset_set_range(const orgset; var dest;l,h,size : ptrint); compilerproc;
 procedure fpc_varset_set_range(const orgset; var dest;l,h,size : ptrint); compilerproc;
-  type
-    tbsetarray = bitpacked array[0..high(sizeint)-1] of 0..1;
   var
   var
-    i : ptrint;
+    bp : pbyte;
+    nbits,partbits,partbytes : sizeint;
   begin
   begin
-    move(orgset,dest,size);
-    for i:=l to h do
-       tbsetarray(dest)[i]:=1;
+    nbits:=h-l+1;
+    if nbits<=0 then
+      exit;
+    if @orgset<>@dest then
+      move(orgset,dest,size);
+    bp:=pbyte(@dest)+l shr 3;
+    partbits:=-l and 7;
+    if partbits<>0 then { Head. }
+      if partbits>=nbits then
+        begin
+          bp^:=bp^ or {$ifdef endian_little} (1 shl nbits-1) shl 8 shr partbits {$else} (1 shl nbits-1) shl partbits shr nbits {$endif};
+          exit;
+        end
+      else
+        begin
+          bp^:=bp^ or {$ifdef endian_little} byte($FF00 shr partbits) {$else} (1 shl partbits-1) {$endif};
+          inc(bp);
+          nbits:=nbits-partbits;
+        end;
+    partbytes:=nbits shr 3;
+    FillChar(bp^,partbytes,$FF); { Full bytes. }
+    bp:=bp+partbytes;
+    nbits:=nbits and 7;
+    if nbits<>0 then { Tail. }
+      bp^:=bp^ or {$ifdef endian_little} (1 shl nbits-1) {$else} byte($FF00 shr nbits) {$endif};
   end;
   end;
 {$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_SET_RANGE}
 {$endif ndef FPC_SYSTEM_HAS_FPC_VARSET_SET_RANGE}