Explorar o código

* comitted wrong patch in r20491, fixed with this revision

git-svn-id: trunk@20510 -
florian %!s(int64=13) %!d(string=hai) anos
pai
achega
891d7b9349
Modificáronse 1 ficheiros con 15 adicións e 12 borrados
  1. 15 12
      rtl/arm/arm.inc

+ 15 - 12
rtl/arm/arm.inc

@@ -556,7 +556,7 @@ asm
   mov r0, r1
   bx  lr
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
   stmfd r13!, {lr}
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
@@ -617,7 +617,7 @@ asm
   mov r0, r1
   bx  lr
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
   stmfd r13!, {lr}
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
@@ -695,7 +695,7 @@ asm
   mov  r0, r2
   bx  lr
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
   stmfd r13!, {r4, lr}
   mov r2, r0   // kuser_cmpxchg does not clobber r2 by definition
@@ -716,10 +716,13 @@ asm
 
   add r1, r0, r4 // Add to value
   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}
-  b .Latomic_add_loop // kuser_cmpxchg sets C flag on error
+
+  b .Latomic_add_loop // kuser_cmpxchg failed, loop back
 
 {$else}
 // lock
@@ -759,21 +762,21 @@ asm
   mov      r0, r3
   bx       lr
 {$else}
-{$if defined(linux)}
+{$if defined(LINUX) and defined(CPUARMEL)}
 
-  stmfd r13!, {lr}
+  stmfd r13!, {r4, lr}
 
   mvn   r3, #0x0000f000
   sub   r3, r3, #0x3F
 
-  mov   ip, r2 // Swap parameters around
+  mov   r4, r2 // Swap parameters around
   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
   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}
 // lock