浏览代码

* added FillQWord, IndexQWord, but CompareQWord is still missing

git-svn-id: trunk@13282 -
ivost 16 年之前
父节点
当前提交
02d177c885
共有 2 个文件被更改,包括 64 次插入2 次删除
  1. 62 2
      rtl/inc/generic.inc
  2. 2 0
      rtl/inc/systemh.inc

+ 62 - 2
rtl/inc/generic.inc

@@ -124,8 +124,9 @@ begin
     begin
       v:=(value shl 8) or value;
       v:=(v shl 16) or v;
-      if sizeof(ptruint)=8 then
-        v:=(v shl 32) or v;
+{$ifdef CPU64}
+      v:=(v shl 32) or v;
+{$endif CPU64}
       { Align on native pointer size }
       pend:=pbyte(align(pdest,sizeof(PtrUInt)));
       dec(count,pend-pdest);
@@ -241,6 +242,24 @@ end;
 {$endif FPC_SYSTEM_HAS_FILLDWORD}
 
 
+{$ifndef FPC_SYSTEM_HAS_FILLQWORD}
+procedure fillqword(var x;count : SizeInt;value : qword);
+var
+  pdest,pend : pqword;
+begin
+  if count <= 0 then
+    exit;
+  pdest:=@x;
+  pend:=pdest+count;
+  while pdest<pend do
+    begin
+      pdest^:=value;
+      inc(pdest);
+    end;
+end;
+{$endif FPC_SYSTEM_HAS_FILLQWORD}
+
+
 {$ifndef FPC_SYSTEM_HAS_INDEXBYTE}
 function IndexByte(Const buf;len:SizeInt;b:byte):SizeInt;
 var
@@ -351,6 +370,47 @@ end;
 {$endif not FPC_SYSTEM_HAS_INDEXDWORD}
 
 
+{$ifndef FPC_SYSTEM_HAS_INDEXQWORD}
+function IndexQWord(Const buf;len:SizeInt;b:QWord):SizeInt;
+var
+  psrc,pend : pqword;
+begin
+  psrc:=@buf;
+  { simulate assembler implementations behaviour, which is expected }
+  { fpc_pchar_to_ansistr in astrings.inc                            }
+  if (len < 0) or
+     (len > high(PtrInt) div 4) or
+     (psrc+len < psrc) then
+    pend:=pqword(high(PtrUInt)-sizeof(qword))
+  else
+    pend:=psrc+len;
+{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+  if (ptruint(psrc) mod 8)<>0 then
+    while psrc<pend do
+      begin
+        if unaligned(psrc^)=b then
+          begin
+            result:=psrc-pqword(@buf);
+            exit;
+          end;
+        inc(psrc);
+      end
+  else
+{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
+    while psrc<pend do
+      begin
+        if psrc^=b then
+          begin
+            result:=psrc-pqword(@buf);
+            exit;
+          end;
+        inc(psrc);
+      end;
+  result:=-1;
+end;
+{$endif not FPC_SYSTEM_HAS_INDEXQWORD}
+
+
 {$ifndef FPC_SYSTEM_HAS_COMPAREBYTE}
 function CompareByte(Const buf1,buf2;len:SizeInt):SizeInt;
 var

+ 2 - 0
rtl/inc/systemh.inc

@@ -517,10 +517,12 @@ Procedure FillChar(var x;count:SizeInt;Value:Char);
 procedure FillByte(var x;count:SizeInt;value:byte);
 Procedure FillWord(var x;count:SizeInt;Value:Word);
 procedure FillDWord(var x;count:SizeInt;value:DWord);
+procedure FillQWord(var x;count:SizeInt;value:QWord);
 function  IndexChar(const buf;len:SizeInt;b:char):SizeInt;
 function  IndexByte(const buf;len:SizeInt;b:byte):SizeInt;
 function  Indexword(const buf;len:SizeInt;b:word):SizeInt;
 function  IndexDWord(const buf;len:SizeInt;b:DWord):SizeInt;
+function  IndexQWord(const buf;len:SizeInt;b:QWord):SizeInt;
 function  CompareChar(const buf1,buf2;len:SizeInt):SizeInt;
 function  CompareByte(const buf1,buf2;len:SizeInt):SizeInt;
 function  CompareWord(const buf1,buf2;len:SizeInt):SizeInt;