VirtualBox

Changeset 25665 in vbox for trunk/include


Ignore:
Timestamp:
Jan 6, 2010 4:19:49 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
56380
Message:

iprt/asm.h,ASMAtomic*.asm: the darwin x86 gcc also has trouble with our cmpxchg8b usage, do like we did for gcc 4.3.x/x86 a while back. Did it for *all* cmpxchg8b users (we missed(?) 3 last time).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/asm.h

    r25645 r25665  
    117117#endif
    118118
    119 /** @def RT_INLINE_ASM_GCC_4_3_X_X86
    120  * Used to work around some 4.3.x register allocation issues in this version of
    121  * the compiler. */
    122 #ifdef __GNUC__
    123 # define RT_INLINE_ASM_GCC_4_3_X_X86 (__GNUC__ == 4 && __GNUC_MINOR__ == 3 && defined(__i386__))
    124 #endif
    125 #ifndef RT_INLINE_ASM_GCC_4_3_X_X86
    126 # define RT_INLINE_ASM_GCC_4_3_X_X86 0
    127 #endif
    128 
    129 
    130119
    131120/** @defgroup grp_asm       ASM - Assembly Routines
     
    167156 * @{
    168157 */
     158
     159/** @def RT_INLINE_ASM_GCC_4_3_X_X86
     160 * Used to work around some 4.3.x register allocation issues in this version of
     161 * the compiler. */
     162#ifdef __GNUC__
     163# define RT_INLINE_ASM_GCC_4_3_X_X86 (__GNUC__ == 4 && __GNUC_MINOR__ == 3 && defined(__i386__))
     164#endif
     165#ifndef RT_INLINE_ASM_GCC_4_3_X_X86
     166# define RT_INLINE_ASM_GCC_4_3_X_X86 0
     167#endif
     168
     169/** @def RT_INLINE_DONT_USE_CMPXCHG8B
     170 * i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5493) screws up
     171 * RTSemRWRequestWrite semsemrw-lockless-generic.cpp in release builds. PIC
     172 * mode, x86.
     173 *
     174 * Some gcc 4.3.x versions may have register allocation issues with cmpxchg8b
     175 * when in PIC mode on x86.
     176 */
     177#ifndef RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
     178# define RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC \
     179    (   (defined(PIC) || defined(__PIC__)) \
     180     && defined(RT_ARCH_X86) \
     181     && (   RT_INLINE_ASM_GCC_4_3_X_X86 \
     182         || defined(RT_OS_DARWIN)) )
     183#endif
    169184
    170185/** @def RT_INLINE_ASM_EXTERNAL
     
    28082823 * @param   u64     The 64-bit value to assign to *pu64.
    28092824 */
    2810 #if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
     2825#if (RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN) \
     2826 || RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
    28112827DECLASM(uint64_t) ASMAtomicXchgU64(volatile uint64_t *pu64, uint64_t u64);
    28122828#else
     
    31753191 */
    31763192#if (RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN) \
    3177  || (RT_INLINE_ASM_GCC_4_3_X_X86 && defined(IN_RING3) && defined(__PIC__))
     3193 || RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
    31783194DECLASM(bool) ASMAtomicCmpXchgU64(volatile uint64_t *pu64, const uint64_t u64New, const uint64_t u64Old);
    31793195#else
    3180 DECLINLINE(bool) ASMAtomicCmpXchgU64(volatile uint64_t *pu64, const uint64_t u64New, uint64_t u64Old)
     3196DECLINLINE(bool) ASMAtomicCmpXchgU64(volatile uint64_t *pu64, uint64_t u64New, uint64_t u64Old)
    31813197{
    31823198# if RT_INLINE_ASM_USES_INTRIN
     
    34433459 * @param   pu64Old     Pointer store the old value at.
    34443460 */
    3445 #if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
     3461#if (RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN) \
     3462 || RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
    34463463DECLASM(bool) ASMAtomicCmpXchgExU64(volatile uint64_t *pu64, const uint64_t u64New, const uint64_t u64Old, uint64_t *pu64Old);
    34473464#else
     
    42224239 */
    42234240#if (RT_INLINE_ASM_EXTERNAL && !defined(RT_ARCH_AMD64)) \
    4224  || (RT_INLINE_ASM_GCC_4_3_X_X86 && defined(IN_RING3) && defined(__PIC__))
     4241 || RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
    42254242DECLASM(uint64_t) ASMAtomicReadU64(volatile uint64_t *pu64);
    42264243#else
     
    43004317 * @remark  This will fault if the memory is read-only!
    43014318 */
    4302 #if RT_INLINE_ASM_EXTERNAL && !defined(RT_ARCH_AMD64)
     4319#if #if (RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN) \
     4320 || RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
    43034321DECLASM(uint64_t) ASMAtomicUoReadU64(volatile uint64_t *pu64);
    43044322#else
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette