VirtualBox

Changeset 7090 in vbox


Ignore:
Timestamp:
Feb 22, 2008 9:12:31 AM (17 years ago)
Author:
vboxsync
Message:

fixed ASMAtomicXchgU64 for 32-bit hosts

File:
1 edited

Legend:

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

    r6782 r7090  
    20282028    uint32_t u32 = (uint32_t)u64;
    20292029    __asm__ __volatile__(/*"xchgl %%esi, %5\n\t"*/
    2030                          "xchgl %%ebx, %3\n\t"
     2030                         "xchgl %%ebx, %2\n\t"
    20312031                         "1:\n\t"
    2032                          "lock; cmpxchg8b (%5)\n\t"
     2032                         "movl  (%4), %%eax\n\t"
     2033                         "movl 4(%4), %%edx\n\t"
     2034                         "lock; cmpxchg8b (%4)\n\t"
    20332035                         "jnz 1b\n\t"
    2034                          "xchgl %%ebx, %3\n\t"
     2036                         "xchgl %%ebx, %2\n\t"
    20352037                         /*"xchgl %%esi, %5\n\t"*/
    20362038                         : "=A" (u64),
    20372039                           "=m" (*pu64)
    2038                          : "0" (*pu64),
    2039                            "m" ( u32 ),
     2040                         : "m" ( u32 ),
    20402041                           "c" ( (uint32_t)(u64 >> 32) ),
    20412042                           "S" (pu64) );
    20422043#   else /* !PIC */
    20432044    __asm__ __volatile__("1:\n\t"
    2044                          "lock; cmpxchg8b %1\n\t"
     2045                         "movl  (%4), %%eax\n\t"
     2046                         "movl 4(%4), %%edx\n\t"
     2047                         "lock; cmpxchg8b (%4)\n\t"
    20452048                         "jnz 1b\n\t"
    20462049                         : "=A" (u64),
    20472050                           "=m" (*pu64)
    2048                          : "0" (*pu64),
    2049                            "b" ( (uint32_t)u64 ),
    2050                            "c" ( (uint32_t)(u64 >> 32) ));
     2051                         : "b" ( (uint32_t)u64 ),
     2052                           "c" ( (uint32_t)(u64 >> 32) ),
     2053                           "S" (pu64) );
    20512054#   endif
    20522055#  else
     
    20562059        mov     ecx, dword ptr [u64 + 4]
    20572060        mov     edi, pu64
     2061    retry:
    20582062        mov     eax, dword ptr [edi]
    20592063        mov     edx, dword ptr [edi + 4]
    2060     retry:
    20612064        lock cmpxchg8b [edi]
    20622065        jnz retry
     
    21262129        {
    21272130            mov     rbx, dword ptr [u128]
    2128             mov     rcx, dword ptr [u128 + 4]
     2131            mov     rcx, dword ptr [u128 + 8]
    21292132            mov     rdi, pu128
     2133        retry:
    21302134            mov     rax, dword ptr [rdi]
    2131             mov     rdx, dword ptr [rdi + 4]
    2132         retry:
     2135            mov     rdx, dword ptr [rdi + 8]
    21332136            lock cmpxchg16b [rdi]
    21342137            jnz retry
    21352138            mov     dword ptr [u128], rax
    2136             mov     dword ptr [u128 + 4], rdx
     2139            mov     dword ptr [u128 + 8], rdx
    21372140        }
    21382141#  endif
Note: See TracChangeset for help on using the changeset viewer.

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