VirtualBox

Ignore:
Timestamp:
Nov 18, 2015 8:47:23 PM (9 years ago)
Author:
vboxsync
Message:

IPRT: Morphed ASMBitFirstClear.asm into ASMBitFirstSet.asm, and fixing 16-bit return bug.

File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/asm/ASMBitFirstSet.asm

    r58746 r58753  
    3434
    3535;;
    36 ; Finds the first clear bit in a bitmap.
     36; Finds the first set bit in a bitmap.
    3737;
    3838; @returns (32/64:eax, 16:ax+dx)   Index of the first zero bit.
    39 ; @returns (32/64:eax, 16:ax+dx)  -1 if no clear bit was found.
     39; @returns (32/64:eax, 16:ax+dx)  -1 if no set bit was found.
    4040; @param   msc:rcx gcc:rdi pvBitmap    Pointer to the bitmap.
    4141; @param   msc:edx gcc:rsi cBits       The number of bits in the bitmap. Multiple of 32.
    4242;
    43 BEGINPROC_EXPORTED ASMBitFirstClear
     43BEGINPROC_EXPORTED ASMBitFirstSet
    4444        ;
    4545        ; if (cBits)
     
    8181        shr     ecx, 5                  ; number of dwords to scan.
    8282        mov     xDX, xDI                ; xDX = saved pvBitmap
    83         mov     eax, 0ffffffffh
    84         repe scasd                      ; Scan for the first dword with any clear bit.
     83        xor     eax, eax
     84        repe scasd                      ; Scan for the first dword with any bit set.
    8585        je      .failed_restore
    8686
     
    8989%if ARCH_BITS == 16
    9090        movzx   edi, di
    91         xor     eax, [es:xDI]           ; eax = NOT [rdi]
     91        mov     eax, [es:xDI]           ; eax = NOT [rdi]
    9292%else
    93         xor     eax, [edi]              ; eax = NOT [rdi]
     93        mov     eax, [edi]              ; eax = NOT [rdi]
    9494%endif
    95         jz      .failed_restore         ; race paranoia
    9695        sub     xDI, xDX
    9796        shl     edi, 3                  ; calc bit offset.
    9897
    99         mov     ecx, 0ffffffffh
    10098        bsf     ecx, eax
     99        jz      .failed_restore         ; race paranoia
    101100        add     ecx, edi
    102101        mov     eax, ecx
     
    105104        pop     xDI
    106105%if ARCH_BITS == 16
     106        mov     edx, eax
     107        shr     edx, 16
    107108        leave
    108109%endif
     
    114115.failed_restore:
    115116        pop     xDI
    116 %if ARCH_BITS == 16
    117         mov     edx, eax
    118         shr     edx, 16
    119         leave
    120 %endif
    121         ret
    122 
    123117.failed:
    124118%if ARCH_BITS != 16
     
    130124%endif
    131125        ret
    132 ENDPROC ASMBitFirstClear
     126ENDPROC ASMBitFirstSet
    133127
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