]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/36793 (x86-64 does not get __sync_synchronize right)
authorUros Bizjak <ubizjak@gmail.com>
Mon, 24 Nov 2008 16:55:49 +0000 (17:55 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 24 Nov 2008 16:55:49 +0000 (17:55 +0100)
* config/i386/i386.md (UNSPECV_CMPXCHG): Rename from
UNSPECV_CMPXCHG_[12].
* config/i386/sync.md: Use UNSPECV_CMPXCHG instead of
UNSPECV_CMPXCHG_[12].

PR target/36793
* config/i386/sync.md (memory_barrier): New expander.

From-SVN: r142160

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/config/i386/sync.md

index ecb4f628a50b229689efa2bcab84894c6a1b2643..5423742b661b3cf8939bf0891267d9878d890ea7 100644 (file)
@@ -1,3 +1,13 @@
+2008-11-24  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.md (UNSPECV_CMPXCHG): Rename from
+       UNSPECV_CMPXCHG_[12].
+       * config/i386/sync.md: Use UNSPECV_CMPXCHG instead of
+       UNSPECV_CMPXCHG_[12].
+
+       PR target/36793
+       * config/i386/sync.md (memory_barrier): New expander.
+
 2008-11-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/37135
index cca7c89427d0fc3cc1022a847c84621e6d844381..068738d22965302ce0fb566b433370fcac4552df 100644 (file)
    (UNSPECV_ALIGN              7)
    (UNSPECV_MONITOR            8)
    (UNSPECV_MWAIT              9)
-   (UNSPECV_CMPXCHG_1          10)
-   (UNSPECV_CMPXCHG_2          11)
+   (UNSPECV_CMPXCHG            10)
    (UNSPECV_XCHG               12)
    (UNSPECV_LOCK               13)
    (UNSPECV_PROLOGUE_USE       14)
index a4f6d38456c91e64454c1ad2bd4f69bc50ae65cb..e090ea74da17c3846b62e84976b522860cb58cf4 100644 (file)
 (define_mode_attr doublemodesuffix [(DI "8") (TI "16")])
 (define_mode_attr DCASHMODE [(DI "SI") (TI "DI")])
 
+(define_expand "memory_barrier"
+  [(set (match_dup 0)
+       (unspec:BLK [(match_dup 0)] UNSPEC_MFENCE))]
+  ""
+{
+  if (!TARGET_SSE2)
+    {
+      /* Emit a locked no-operation when SSE2 is not available.  */
+      int slot = virtuals_instantiated ? SLOT_TEMP : SLOT_VIRTUAL;
+      rtx temp = assign_386_stack_local (QImode, slot);
+      emit_insn (gen_sync_iorqi (temp, CONST0_RTX (QImode)));
+      DONE;
+    }
+
+  operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
+  MEM_VOLATILE_P (operands[0]) = 1;
+})
+
 ;; ??? It would be possible to use cmpxchg8b on pentium for DImode
 ;; changes.  It's complicated because the insn uses ecx:ebx as the
 ;; new value; note that the registers are reversed from the order
@@ -46,7 +64,7 @@
            [(match_dup 1)
             (match_operand:CASMODE 2 "register_operand" "")
             (match_operand:CASMODE 3 "register_operand" "")]
-           UNSPECV_CMPXCHG_1))
+           UNSPECV_CMPXCHG))
      (clobber (reg:CC FLAGS_REG))])]
   "TARGET_CMPXCHG"
 {
          [(match_dup 1)
           (match_operand:IMODE 2 "register_operand" "a")
           (match_operand:IMODE 3 "register_operand" "<modeconstraint>")]
-         UNSPECV_CMPXCHG_1))
+         UNSPECV_CMPXCHG))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_CMPXCHG"
-  "lock{%;| } cmpxchg{<modesuffix>}\t{%3, %1|%1, %3}")
+  "lock{%;| }cmpxchg{<modesuffix>}\t{%3, %1|%1, %3}")
 
 (define_insn "sync_double_compare_and_swap<mode>"
   [(set (match_operand:DCASMODE 0 "register_operand" "=A")
           (match_operand:DCASMODE 2 "register_operand" "A")
           (match_operand:<DCASHMODE> 3 "register_operand" "b")
           (match_operand:<DCASHMODE> 4 "register_operand" "c")]
-         UNSPECV_CMPXCHG_1))
+         UNSPECV_CMPXCHG))
    (clobber (reg:CC FLAGS_REG))]
   ""
   "lock{%;| }cmpxchg<doublemodesuffix>b\t%1")
           (match_operand:DI 2 "register_operand" "A")
           (match_operand:SI 3 "register_operand" "SD")
           (match_operand:SI 4 "register_operand" "c")]
-         UNSPECV_CMPXCHG_1))
+         UNSPECV_CMPXCHG))
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT && TARGET_CMPXCHG8B && flag_pic"
   "xchg{l}\t%%ebx, %3\;lock{%;| }cmpxchg8b\t%1\;xchg{l}\t%%ebx, %3")
            [(match_dup 1)
             (match_operand:CASMODE 2 "register_operand" "")
             (match_operand:CASMODE 3 "register_operand" "")]
-           UNSPECV_CMPXCHG_1))
+           UNSPECV_CMPXCHG))
      (set (match_dup 4)
          (compare:CCZ
            (unspec_volatile:CASMODE
-             [(match_dup 1) (match_dup 2) (match_dup 3)] UNSPECV_CMPXCHG_2)
+             [(match_dup 1) (match_dup 2) (match_dup 3)] UNSPECV_CMPXCHG)
            (match_dup 2)))])]
   "TARGET_CMPXCHG"
 {
          [(match_dup 1)
           (match_operand:IMODE 2 "register_operand" "a")
           (match_operand:IMODE 3 "register_operand" "<modeconstraint>")]
-         UNSPECV_CMPXCHG_1))
+         UNSPECV_CMPXCHG))
    (set (reg:CCZ FLAGS_REG)
        (compare:CCZ
          (unspec_volatile:IMODE
-           [(match_dup 1) (match_dup 2) (match_dup 3)] UNSPECV_CMPXCHG_2)
+           [(match_dup 1) (match_dup 2) (match_dup 3)] UNSPECV_CMPXCHG)
          (match_dup 2)))]
   "TARGET_CMPXCHG"
   "lock{%;| }cmpxchg{<modesuffix>}\t{%3, %1|%1, %3}")
           (match_operand:DCASMODE 2 "register_operand" "A")
           (match_operand:<DCASHMODE> 3 "register_operand" "b")
           (match_operand:<DCASHMODE> 4 "register_operand" "c")]
-         UNSPECV_CMPXCHG_1))
+         UNSPECV_CMPXCHG))
    (set (reg:CCZ FLAGS_REG)
        (compare:CCZ
          (unspec_volatile:DCASMODE
            [(match_dup 1) (match_dup 2) (match_dup 3) (match_dup 4)]
-           UNSPECV_CMPXCHG_2)
+           UNSPECV_CMPXCHG)
          (match_dup 2)))]
   ""
   "lock{%;| }cmpxchg<doublemodesuffix>b\t%1")
           (match_operand:DI 2 "register_operand" "A")
           (match_operand:SI 3 "register_operand" "SD")
           (match_operand:SI 4 "register_operand" "c")]
-         UNSPECV_CMPXCHG_1))
+         UNSPECV_CMPXCHG))
    (set (reg:CCZ FLAGS_REG)
        (compare:CCZ
          (unspec_volatile:DI
            [(match_dup 1) (match_dup 2) (match_dup 3) (match_dup 4)]
-           UNSPECV_CMPXCHG_2)
+           UNSPECV_CMPXCHG)
          (match_dup 2)))]
   "!TARGET_64BIT && TARGET_CMPXCHG8B && flag_pic"
   "xchg{l}\t%%ebx, %3\;lock{%;| }cmpxchg8b\t%1\;xchg{l}\t%%ebx, %3")