Browse Source

+ a bunch of fillchar implementations for different kinds of arrays

git-svn-id: branches/jvmbackend@18830 -
Jonas Maebe 14 năm trước cách đây
mục cha
commit
77e913f60f
2 tập tin đã thay đổi với 166 bổ sung0 xóa
  1. 57 0
      rtl/java/jsystemh.inc
  2. 109 0
      rtl/jvm/jvm.inc

+ 57 - 0
rtl/java/jsystemh.inc

@@ -51,6 +51,63 @@ procedure ReadWriteBarrier;
 procedure WriteBarrier;
 *)
 
+procedure fillchar(var arr: array of jbyte; len: sizeint; val: byte);
+{ boolean maps to a different signature }
+procedure fillchar(var arr: array of jbyte; len: sizeint; val: boolean);
+{ don't define since the signature would be the same as the one above (well,
+  we could cheat by changing the case since the JVM is case-sensitive, but
+  this way we also save on code size) -> map it to the byte version via
+  "external" }
+procedure fillchar(var arr: array of jbyte; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of jbyte; len: sizeint; val: jbyte); external;
+procedure fillchar(var arr: array of byte; len: sizeint; val: byte); external;
+procedure fillchar(var arr: array of byte; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of byte; len: sizeint; val: jbyte); external;
+procedure fillchar(var arr: array of ansichar; len: sizeint; val: byte); external;
+procedure fillchar(var arr: array of ansichar; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of ansichar; len: sizeint; val: jbyte); external;
+procedure fillchar(var arr: array of ansichar; len: sizeint; val: boolean); external;
+
+
+procedure fillchar(var arr: array of boolean; len: sizeint; val: byte);
+procedure fillchar(var arr: array of boolean; len: sizeint; val: boolean);
+procedure fillchar(var arr: array of boolean; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of boolean; len: sizeint; val: jbyte); external;
+
+
+procedure fillchar(var arr: array of jshort; len: sizeint; val: byte);
+procedure fillchar(var arr: array of jshort; len: sizeint; val: boolean);
+procedure fillchar(var arr: array of jshort; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of jshort; len: sizeint; val: jbyte); external;
+procedure fillchar(var arr: array of word; len: sizeint; val: byte);  external;
+procedure fillchar(var arr: array of word; len: sizeint; val: boolean);  external;
+procedure fillchar(var arr: array of word; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of word; len: sizeint; val: jbyte); external;
+
+{ widechar maps to a different signature }
+procedure fillchar(var arr: array of widechar; len: sizeint; val: byte);
+procedure fillchar(var arr: array of widechar; len: sizeint; val: boolean);
+procedure fillchar(var arr: array of widechar; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of widechar; len: sizeint; val: jbyte); external;
+
+procedure fillchar(var arr: array of jint; len: sizeint; val: byte);
+procedure fillchar(var arr: array of jint; len: sizeint; val: boolean);
+procedure fillchar(var arr: array of jint; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of jint; len: sizeint; val: jbyte); external;
+procedure fillchar(var arr: array of dword; len: sizeint; val: byte); external;
+procedure fillchar(var arr: array of dword; len: sizeint; val: boolean); external;
+procedure fillchar(var arr: array of dword; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of dword; len: sizeint; val: jbyte); external;
+
+procedure fillchar(var arr: array of jlong; len: sizeint; val: byte);
+procedure fillchar(var arr: array of jlong; len: sizeint; val: boolean);
+procedure fillchar(var arr: array of jlong; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of jlong; len: sizeint; val: jbyte); external;
+procedure fillchar(var arr: array of qword; len: sizeint; val: byte); external;
+procedure fillchar(var arr: array of qword; len: sizeint; val: boolean); external;
+procedure fillchar(var arr: array of qword; len: sizeint; val: ansichar); external;
+procedure fillchar(var arr: array of qword; len: sizeint; val: jbyte); external;
+
 {****************************************************************************
                           Math Routines
 ****************************************************************************}

+ 109 - 0
rtl/jvm/jvm.inc

@@ -75,6 +75,115 @@ function Sptr:Pointer;
 { lie so that the non-compilable generic versions will be skipped }
 {$define FPC_SYSTEM_HAS_MOVE}
 {$define FPC_SYSTEM_HAS_FILLCHAR}
+
+{$push}
+{$q-,r-}
+
+procedure fillchar(var arr: array of jbyte; len: sizeint; val: byte);
+  begin
+    JUArrays.fill(arr,0,len,jbyte(val));
+  end;
+
+{ boolean maps to a different signature }
+procedure fillchar(var arr: array of jbyte; len: sizeint; val: jboolean);
+  begin
+    JUArrays.fill(arr,0,len,jbyte(val));
+  end;
+
+{ don't define since the signature would be the same as the one above (well,
+  we could cheat by changing the case since the JVM is case-sensitive, but
+  this way we also save on code size) -> map it to the byte version via
+  "external" }
+
+procedure fillchar(var arr: array of boolean; len: sizeint; val: byte);
+  begin
+    JUArrays.fill(TJBooleanArray(@arr),0,len,jboolean(val));
+  end;
+
+procedure fillchar(var arr: array of boolean; len: sizeint; val: boolean);
+  begin
+    JUArrays.fill(TJBooleanArray(@arr),0,len,val);
+  end;
+
+
+procedure fillchar(var arr: array of jshort; len: sizeint; val: byte);
+  var
+    w: jshort;
+  begin
+    w:=(val shl 8) or val;
+    JUArrays.fill(arr,0,len div 2,w);
+    if (len and 1) <> 0 then
+      arr[len div 2 + 1]:=(arr[len div 2 + 1] and $ff) or (val shl 8);
+  end;
+
+procedure fillchar(var arr: array of jshort; len: sizeint; val: boolean);
+  begin
+    fillchar(arr,len,jbyte(val));
+  end;
+
+{ widechar maps to a different signature }
+procedure fillchar(var arr: array of widechar; len: sizeint; val: byte);
+  var
+    w: widechar;
+  begin
+    w:=widechar((val shl 8) or val);
+    JUArrays.fill(arr,0,len div 2,w);
+    { jvm is big endian -> set top byte of last word }
+    if (len and 1) <> 0 then
+      arr[len shr 1+1]:=widechar((ord(arr[len shr 1+1]) and $ff) or (val shl 8));
+  end;
+
+procedure fillchar(var arr: array of widechar; len: sizeint; val: boolean);
+  begin
+    fillchar(arr,len,byte(val));
+  end;
+
+procedure fillchar(var arr: array of jint; len: sizeint; val: byte);
+  var
+    d, dmask: jint;
+  begin
+    d:=(val shl 8) or val;
+    d:=(d shl 16) or d;
+    JUArrays.fill(arr,0,len div 4,d);
+    len:=len and 3;
+    if len<>0 then
+      begin
+        dmask:=not((1 shl (32-8*len))-1);
+        d:=d and dmask;
+        arr[len shr 2+1]:=(arr[len shr 2+1] and not(dmask)) or d;
+      end;
+  end;
+
+procedure fillchar(var arr: array of jint; len: sizeint; val: boolean);
+  begin
+    fillchar(arr,len,jbyte(val));
+  end;
+
+
+procedure fillchar(var arr: array of jlong; len: sizeint; val: byte);
+  var
+    i, imask: jlong;
+  begin
+    i:=(val shl 8) or val;
+    i:=cardinal(i shl 16) or i;
+    i:=(i shl 32) or i;
+    JUArrays.fill(arr,0,len shr 3,i);
+    len:=len and 7;
+    if len<>0 then
+      begin
+        imask:=not((jlong(1) shl (64-8*len))-1);
+        i:=i and imask;
+        arr[len shr 3+1]:=(arr[len shr 3+1] and not(imask)) or i;
+      end;
+  end;
+
+procedure fillchar(var arr: array of jlong; len: sizeint; val: boolean);
+  begin
+    fillchar(arr,len,jbyte(val));
+  end;
+
+{$pop}
+
 {$define FPC_SYSTEM_HAS_FILLWORD}
 {$define FPC_SYSTEM_HAS_FILLDWORD}
 {$define FPC_SYSTEM_HAS_FILLQWORD}