OSDN Git Service

libitm: Avoid non-portable x86 branch prediction mnemonic.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2011 19:51:49 +0000 (19:51 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2011 19:51:49 +0000 (19:51 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181233 138bc75d-0d04-0410-961f-82ee72b054a4

libitm/ChangeLog
libitm/config/x86/cacheline.h

index e78716d..0501d16 100644 (file)
@@ -1,5 +1,8 @@
 2011-11-09  Richard Henderson  <rth@redhat.com>
 
 2011-11-09  Richard Henderson  <rth@redhat.com>
 
+       * config/x86/cacheline.h (gtm_cacheline::store_mask): Use .byte
+       to emit branch prediction hint.
+
        * config/x86/sjlj.S: Protect elf directives with __ELF__.
        Protect .note.GNU-stack with __linux__.
 
        * config/x86/sjlj.S: Protect elf directives with __ELF__.
        Protect .note.GNU-stack with __linux__.
 
index 15a95b0..f91d7cc 100644 (file)
@@ -144,7 +144,7 @@ gtm_cacheline::operator= (const gtm_cacheline & __restrict s)
 }
 #endif
 
 }
 #endif
 
-// ??? Support masked integer stores more efficiently with an unlocked cmpxchg
+// Support masked integer stores more efficiently with an unlocked cmpxchg
 // insn.  My reasoning is that while we write to locations that we do not wish
 // to modify, we do it in an uninterruptable insn, and so we either truely
 // write back the original data or the insn fails -- unlike with a
 // insn.  My reasoning is that while we write to locations that we do not wish
 // to modify, we do it in an uninterruptable insn, and so we either truely
 // write back the original data or the insn fails -- unlike with a
@@ -171,7 +171,8 @@ gtm_cacheline::store_mask (uint32_t *d, uint32_t s, uint8_t m)
                "and    %[m], %[n]\n\t"
                "or     %[s], %[n]\n\t"
                "cmpxchg %[n], %[d]\n\t"
                "and    %[m], %[n]\n\t"
                "or     %[s], %[n]\n\t"
                "cmpxchg %[n], %[d]\n\t"
-               "jnz,pn 0b"
+               ".byte  0x2e\n\t"       // predict not-taken, aka jnz,pn
+               "jnz    0b"
                : [d] "+m"(*d), [n] "=&r" (n), [o] "+a"(o)
                : [s] "r" (s & bm), [m] "r" (~bm));
        }
                : [d] "+m"(*d), [n] "=&r" (n), [o] "+a"(o)
                : [s] "r" (s & bm), [m] "r" (~bm));
        }
@@ -198,7 +199,8 @@ gtm_cacheline::store_mask (uint64_t *d, uint64_t s, uint8_t m)
                "and    %[m], %[n]\n\t"
                "or     %[s], %[n]\n\t"
                "cmpxchg %[n], %[d]\n\t"
                "and    %[m], %[n]\n\t"
                "or     %[s], %[n]\n\t"
                "cmpxchg %[n], %[d]\n\t"
-               "jnz,pn 0b"
+               ".byte  0x2e\n\t"       // predict not-taken, aka jnz,pn
+               "jnz    0b"
                : [d] "+m"(*d), [n] "=&r" (n), [o] "+a"(o)
                : [s] "r" (s & bm), [m] "r" (~bm));
 #else
                : [d] "+m"(*d), [n] "=&r" (n), [o] "+a"(o)
                : [s] "r" (s & bm), [m] "r" (~bm));
 #else