|
From: <sv...@va...> - 2010-09-24 23:51:25
|
Author: sewardj
Date: 2010-09-25 00:51:17 +0100 (Sat, 25 Sep 2010)
New Revision: 11378
Log:
Partially make this work on arm-linux (for 32-bit incs), so as to give
a proper test for LDREX/STREX.
Modified:
trunk/memcheck/tests/atomic_incs.c
Modified: trunk/memcheck/tests/atomic_incs.c
===================================================================
--- trunk/memcheck/tests/atomic_incs.c 2010-09-23 22:05:59 UTC (rev 11377)
+++ trunk/memcheck/tests/atomic_incs.c 2010-09-24 23:51:17 UTC (rev 11378)
@@ -200,7 +200,22 @@
);
} while (success != 1);
#elif defined(VGA_arm)
- *p += n;
+ unsigned int block[3]
+ = { (unsigned int)p, (unsigned int)n, 0xFFFFFFFF };
+ do {
+ __asm__ __volatile__(
+ "mov r5, %0" "\n\t"
+ "ldr r9, [r5, #0]" "\n\t" // p
+ "ldr r10, [r5, #4]" "\n\t" // n
+ "ldrex r8, [r9]" "\n\t"
+ "add r8, r8, r10" "\n\t"
+ "strex r11, r8, [r9]" "\n\t"
+ "str r11, [r5, #8]" "\n\t"
+ : /*out*/
+ : /*in*/ "r"(&block[0])
+ : /*trash*/ "memory", "cc", "r5", "r8", "r9", "r10"
+ );
+ } while (block[2] != 0);
#else
# error "Unsupported arch"
#endif
|