瀏覽代碼

+ assembler coded move for arm

git-svn-id: trunk@6412 -
florian 18 年之前
父節點
當前提交
57415a73a7
共有 1 個文件被更改,包括 28 次插入26 次删除
  1. 28 26
      rtl/arm/arm.inc

+ 28 - 26
rtl/arm/arm.inc

@@ -133,21 +133,20 @@ asm
 end;
 
 
-(*
 {$define FPC_SYSTEM_HAS_MOVE}
 procedure Move(const source;var dest;count:longint);[public, alias: 'FPC_MOVE'];assembler;nostackframe;
 asm
-	// count <=0 ?
-	cmp r2,#0
-	movle pc,lr
-	// overlap?
-	cmp r2,r1
-	bls .Lnoverlap
-	add r3,r0,r2
-	cmp r3,r2
-	bls .Lnooverlap
-	// overlap, copy backward
-.Loverlapped
+  // count <=0 ?
+  cmp r2,#0
+  movle pc,lr
+  // overlap?
+  cmp r1,r0
+  bls .Lnooverlap
+  add r3,r0,r2
+  cmp r3,r1
+  bls .Lnooverlap
+  // overlap, copy backward
+.Loverlapped:
   subs r2,r2,#1
   ldrb r3,[r0,r2]
   strb r3,[r1,r2]
@@ -155,16 +154,17 @@ asm
   mov pc,lr
 .Lnooverlap:
   // less then 16 bytes to copy?
-  cmp r2,#16
+  cmp r2,#8
   // yes, the forget about the whole optimizations
   // and do a bytewise copy
   blt .Lbyteloop
 
-  // both uneven aligned?
-  eor r3,r0,r1
-  tst r3,#1
+  // both aligned?
+  orr r3,r0,r1
+  tst r3,#3
 
-  bne .Ldifferentaligned
+  bne .Lbyteloop
+(*
   // yes, then align
   // alignment to 4 byte boundries is enough
   ldrb ip,[r0],#1
@@ -181,21 +181,23 @@ asm
   orrs r3,r0,r1
   tst r3,#7
   bne .Ldwordloop
-.Lqwordloop:
-  sub r2,r2,#8
-  ldmia r0!,{r3,ip}
-  stmia r1!,{r3,ip}
-
-
-
+*)
+.Ldwordloop:
+  sub r2,r2,#4
+  ldr r3,[r0],#4
+  cmp r2,#4
+  str r3,[r1],#4
+  bcs .Ldwordloop
+  cmp r2,#0
+  moveq pc,lr
 .Lbyteloop:
+  subs r2,r2,#1
   ldrb r3,[r0],#1
   strb r3,[r1],#1
-  subs r2,r2,#1
   bne .Lbyteloop
   mov pc,lr
 end;
-*)
+
 
 var
   fpc_system_lock: longint; export name 'fpc_system_lock';