VirtualBox

Changeset 59055 in vbox


Ignore:
Timestamp:
Dec 8, 2015 12:42:24 PM (9 years ago)
Author:
vboxsync
Message:

IPRT: Provided ASMAtomicCmpXchgU16 and ASMAtomicXchgU16 external assembly implementations.

Location:
trunk/src/VBox/Runtime
Files:
2 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r59047 r59055  
    180180        win/amd64/ASMGetDR7.asm \
    181181        common/asm/ASMAtomicCmpXchgU8.asm \
     182        common/asm/ASMAtomicCmpXchgU16.asm \
     183        common/asm/ASMAtomicXchgU16.asm \
    182184        common/asm/ASMBitFirstClear.asm \
    183185        common/asm/ASMBitFirstSet.asm \
  • trunk/src/VBox/Runtime/VBox/VBoxRTImp.def

    r59053 r59055  
    4444    ; code
    4545    ASMAtomicCmpXchgU8      ; not-some-systems...
     46    ASMAtomicCmpXchgU16     ; not-some-systems...
    4647    ASMAtomicCmpXchgExU64   ; not-some-systems...
    4748    ASMAtomicCmpXchgU64     ; not-some-systems...
    4849    ASMAtomicReadU64        ; not-some-systems...
    4950    ASMAtomicUoReadU64      ; not-some-systems...
     51    ASMAtomicXchgU16        ; not-some-systems...
    5052    ASMAtomicXchgU64        ; not-some-systems...
    5153
  • trunk/src/VBox/Runtime/common/asm/ASMAtomicCmpXchgU16.asm

    r59052 r59055  
    11; $Id$
    22;; @file
    3 ; IPRT - ASMAtomicCmpXchgU8().
     3; IPRT - ASMAtomicCmpXchgU16().
    44;
    55
     
    3535; Atomically compares and exchanges an unsigned 8-bit int.
    3636;
    37 ; @param    pu8     x86:esp+4  msc:rcx  gcc:rdi
    38 ; @param    u8New   x86:esp+8  msc:dl   gcc:sil
    39 ; @param    u8Old   x86:esp+c  msc:r8l  gcc:dl
     37; @param    pu16     x86:esp+4  msc:rcx  gcc:rdi
     38; @param    u16New   x86:esp+8  msc:dx   gcc:si
     39; @param    u16Old   x86:esp+c  msc:r8l  gcc:dl
    4040;
    4141; @returns  bool result: true if successfully exchanged, false if not.
    4242;           x86:al
    4343;
    44 BEGINPROC_EXPORTED ASMAtomicCmpXchgU8
     44BEGINPROC_EXPORTED ASMAtomicCmpXchgU16
    4545%ifdef RT_ARCH_AMD64
    4646 %ifdef ASM_CALL64_MSC
    47         mov     al, r8b
    48         lock cmpxchg [rcx], dl
     47        mov     ax, r8w
     48        lock cmpxchg [rcx], dx
    4949 %else
    50         mov     al, dl
    51         lock cmpxchg [rdi], sil
     50        mov     ax, dx
     51        lock cmpxchg [rdi], si
    5252 %endif
    5353%else
    5454        mov     ecx, [esp + 04h]
    55         mov     dl,  [esp + 08h]
    56         mov     al,  [esp + 0ch]
    57         lock cmpxchg [ecx], dl
     55        mov     dx,  [esp + 08h]
     56        mov     ax,  [esp + 0ch]
     57        lock cmpxchg [ecx], dx
    5858%endif
    5959        setz    al
    6060        movzx   eax, al
    6161        ret
    62 ENDPROC ASMAtomicCmpXchgU8
     62ENDPROC ASMAtomicCmpXchgU16
    6363
  • trunk/src/VBox/Runtime/common/asm/ASMAtomicXchgU16.asm

    r59052 r59055  
    11; $Id$
    22;; @file
    3 ; IPRT - ASMAtomicXchgU64().
     3; IPRT - ASMAtomicXchgU16().
    44;
    55
     
    3333
    3434;;
    35 ; Atomically Exchange an unsigned 64-bit value, ordered.
     35; Atomically Exchange an unsigned 16-bit value, ordered.
    3636;
    37 ; @param    pu64     x86:ebp+8   gcc:rdi  msc:rcx
    38 ; @param    u64New   x86:ebp+c   gcc:rsi  msc:rdx
     37; @param    pu16     x86:ebp+8   gcc:rdi  msc:rcx
     38; @param    u16New   x86:ebp+c   gcc:si   msc:dx
    3939;
    40 ; @returns  bool result: true if successfully exchanged, false if not.
    41 ;           x86:al
     40; @returns Current (i.e. old) *pu16 value (AX).
    4241;
    43 BEGINPROC_EXPORTED ASMAtomicXchgU64
     42BEGINPROC_EXPORTED ASMAtomicXchgU16
    4443%ifdef RT_ARCH_AMD64
    4544 %ifdef ASM_CALL64_MSC
    46         mov     rax, r8
    47 .try_again:
    48         lock cmpxchg [rcx], rdx
     45        mov     ax, dx
     46        xchg    [rcx], ax
    4947 %else
    50 .try_again:
    51         mov     rax, rcx
    52         lock cmpxchg [rdi], rsi
     48        mov     ax, si
     49        xchg    [rdi], ax
    5350 %endif
    54         jnz     .try_again
     51%elifdef RT_ARCH_X86
     52        mov     ecx, [esp+04h]
     53        mov     ax, [esp+08h]
     54        xchg    [ecx], ax
     55%else
     56 %error "Unsupport arch."
     57%endif
    5558        ret
    56 %endif
    57 %ifdef RT_ARCH_X86
    58         push    ebp
    59         mov     ebp, esp
    60         push    ebx
    61         push    edi
     59ENDPROC ASMAtomicXchgU16
    6260
    63 .try_again:
    64         mov     ebx, dword [ebp+0ch]
    65         mov     ecx, dword [ebp+0ch + 4]
    66         mov     edi, [ebp+08h]
    67         lock cmpxchg8b [edi]
    68         jnz     .try_again
    69 
    70         pop     edi
    71         pop     ebx
    72         leave
    73         ret
    74 %endif
    75 ENDPROC ASMAtomicXchgU64
    76 
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