[ARM64] GCC generates wrong code with -O2 flag in WTF::weakCompareAndSwap
authorrgabor@webkit.org <rgabor@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Mar 2014 14:13:07 +0000 (14:13 +0000)
committerrgabor@webkit.org <rgabor@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Mar 2014 14:13:07 +0000 (14:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=130500

Reviewed by Filip Pizlo.

Set the first operand to the exact register in the inline assembly with GCC.

* wtf/Atomics.h:
(WTF::weakCompareAndSwap):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@166234 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/Atomics.h

index 8a0d822..ae7bf74 100644 (file)
@@ -1,5 +1,17 @@
 2014-03-25  Gabor Rapcsanyi  <rgabor@webkit.org>
 
+        [ARM64] GCC generates wrong code with -O2 flag in WTF::weakCompareAndSwap
+        https://bugs.webkit.org/show_bug.cgi?id=130500
+
+        Reviewed by Filip Pizlo.
+
+        Set the first operand to the exact register in the inline assembly with GCC.
+
+        * wtf/Atomics.h:
+        (WTF::weakCompareAndSwap):
+
+2014-03-25  Gabor Rapcsanyi  <rgabor@webkit.org>
+
         [EFL] Add ARM64 build support
         https://bugs.webkit.org/show_bug.cgi?id=130506
 
index 18dba15..4e630c2 100644 (file)
@@ -112,6 +112,20 @@ inline bool weakCompareAndSwap(volatile unsigned* location, unsigned expected, u
         : "r"(expected), "r"(newValue)
         : "memory");
     result = !result;
+#elif CPU(ARM64) && COMPILER(GCC)
+    unsigned tmp;
+    unsigned result;
+    asm volatile(
+        "mov %w1, #1\n\t"
+        "ldxr %w2, [%0]\n\t"
+        "cmp %w3, %w2\n\t"
+        "b.ne 0f\n\t"
+        "stxr %w1, %w4, [%0]\n\t"
+        "0:"
+        : "+r"(location), "=&r"(result), "=&r"(tmp)
+        : "r"(expected), "r"(newValue)
+        : "memory");
+    result = !result;
 #elif CPU(ARM64)
     unsigned tmp;
     unsigned result;
@@ -152,6 +166,20 @@ inline bool weakCompareAndSwap(void*volatile* location, void* expected, void* ne
         : "memory"
         );
     return result;
+#elif CPU(ARM64) && COMPILER(GCC)
+    bool result;
+    void* tmp;
+    asm volatile(
+        "mov %w1, #1\n\t"
+        "ldxr %x2, [%0]\n\t"
+        "cmp %x3, %x2\n\t"
+        "b.ne 0f\n\t"
+        "stxr %w1, %x4, [%0]\n\t"
+        "0:"
+        : "+r"(location), "=&r"(result), "=&r"(tmp)
+        : "r"(expected), "r"(newValue)
+        : "memory");
+    return !result;
 #elif CPU(ARM64)
     bool result;
     void* tmp;