Browse Source

* comitted wrong patch in r20491, fixed with this revision

git-svn-id: trunk@20510 -
florian 13 years ago
parent
commit
891d7b9349
1 changed files with 15 additions and 12 deletions
  1. 15 12
      rtl/arm/arm.inc

+ 15 - 12
rtl/arm/arm.inc

@@ -556,7 +556,7 @@ asm
   mov r0, r1
   mov r0, r1
   bx  lr
   bx  lr
 {$else}
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
 
   stmfd r13!, {lr}
   stmfd r13!, {lr}
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
@@ -617,7 +617,7 @@ asm
   mov r0, r1
   mov r0, r1
   bx  lr
   bx  lr
 {$else}
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
 
   stmfd r13!, {lr}
   stmfd r13!, {lr}
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
@@ -695,7 +695,7 @@ asm
   mov  r0, r2
   mov  r0, r2
   bx  lr
   bx  lr
 {$else}
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
 
   stmfd r13!, {r4, lr}
   stmfd r13!, {r4, lr}
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
@@ -716,10 +716,13 @@ asm
 
 
   add r1, r0, r4 // Add to value
   add r1, r0, r4 // Add to value
   blx r3	 // Call kuser_cmpxchg, sets C-Flag on success
   blx r3	 // Call kuser_cmpxchg, sets C-Flag on success
-
-  movcs r0, r1	 // We expect that to work most of the time so keep it pipeline friendly
+  // r1 does not get clobbered, so just get back the original value
+  // Otherwise we would have to allocate one more register and store the
+  // temporary value
+  subcs   r0, r1, r4
   ldmcsfd r13!, {r4, pc}
   ldmcsfd r13!, {r4, pc}
-  b .Latomic_add_loop // kuser_cmpxchg sets C flag on error
+
+  b .Latomic_add_loop // kuser_cmpxchg failed, loop back
 
 
 {$else}
 {$else}
 // lock
 // lock
@@ -759,21 +762,21 @@ asm
   mov      r0, r3
   mov      r0, r3
   bx       lr
   bx       lr
 {$else}
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
 
-  stmfd r13!, {lr}
+  stmfd r13!, {r4, lr}
 
 
   mvn   r3, #0x0000f000
   mvn   r3, #0x0000f000
   sub   r3, r3, #0x3F
   sub   r3, r3, #0x3F
 
 
-  mov   ip, r2 // Swap parameters around
+  mov   r4, r2 // Swap parameters around
   mov   r2, r0
   mov   r2, r0
-  mov   r0, ip
+  mov   r0, r4 // Use r4 because we'll need the new value for later
 
 
   blx   r3       // Call kuser_cmpxchg sets C-Flag on success
   blx   r3       // Call kuser_cmpxchg sets C-Flag on success
   ldrcc r0, [r2] // Load the currently set value on failure
   ldrcc r0, [r2] // Load the currently set value on failure
-                 // We could use "mov r0, r3" here, but thats undocumented
-  ldmfd r13!, {lr}
+  movcs r0, r4   // Load the previous value on success
+  ldmfd r13!, {r4, pc}
 
 
 {$else}
 {$else}
 // lock
 // lock