[ros-dev] [ros-diffs] [greatlrd] 23826: Wrote RtlUshotByteSwap RtlUlongByteSwap and RtlUlonglongByteSwap to asm code. but we need a C api for header to linking it right. Put the asm version to i386

Timo Kreuzer timo.kreuzer at web.de
Sat Sep 2 15:03:27 CEST 2006


If it should be optimized, inlined asm should be used as following:

Reuel ben Yisrael schrieb:
>> +.globl _UlongByteSwap
>> + 
>> +.intel_syntax noprefix
>> +
>> +/* FUNCTIONS ***************************************************************/
>> +
>> +_UlongByteSwap:
>> +                       push  ebp          // save base 
>> +                       mov   ebp,esp      // move stack to base
>> +                       mov   eax,[ebp+8]  // load the ULONG                       
>> +                       bswap eax          // swap the ULONG
>> +                       pop   ebp          // restore the base   
>> +                       ret
>>  
>>
>>     
> this should work:
>
> _UlongByteSwap:
>                        mov   eax,[esp+8]  // load the ULONG                       
>                        bswap eax          // swap the ULONG
>                        ret
>   

static force_inline ULONG UlongByteSwap(ULONG x)
{
    asm volatile(
        "bswap %0;"
        : "=r" (x)
        : "0" (x)
    );
    return x;
}


>> +.globl _UlonglongByteSwap
>> + 
>> +.intel_syntax noprefix
>> +
>> +/* FUNCTIONS ***************************************************************/
>> +
>> +_UlonglongByteSwap:
>> +                       push  ebp          // save base 
>> +                       mov   ebp,esp      // move stack to base
>> +                       mov   edx,[ebp+8]  // load the higher part of ULONGLONG
>> +                       mov   eax,[ebp+12] // load the lower part of ULONGLONG    
>> +                       bswap edx          // swap the higher part
>> +                       bswap eax          // swap the lower part 
>> +                       pop   ebp          // restore the base   
>> +                       ret
>>  
>>
>>     
> _UlonglongByteSwap:
>                        mov   edx,[esp+8]  // load the higher part of ULONGLONG
>                        mov   eax,[esp+12] // load the lower part of ULONGLONG    
>                        bswap edx          // swap the higher part
>                        bswap eax          // swap the lower part 
>                        ret
>   

static force_inline ULONGLONG UlonglongByteSwap(ULONGLONG x)
{
    ULONG h,l;

    asm volatile ("": "=d" (l), "=a" (h): "A" (x));

    asm volatile (
        "bswap %%eax;"
        "bswap %%edx;"
        : "=A" (x)
        : "d" (l), "a" (h)
    );
    return x;
}
>   
>> +_UshortByteSwap:
>> +                       push  ebp          // save base 
>> +                       mov   ebp,esp      // move stack to base
>> +                       mov   eax,[ebp+8]  // load the USHORT                       
>> +                       bswap eax          // swap the USHORT, xchg is slow so we use bswap with rol 
>> +                       rol   eax,16       // make it USHORT
>> +                       pop   ebp          // restore the base   
>> +                       ret
>>  
>>
>>     
>
> _UshortByteSwap:
>                        mov   eax,[esp+8]  // load the USHORT                       
>                        bswap eax          // swap the USHORT, xchg is slow so we use bswap with rol 
>                        rol   eax,16       // make it USHORT
>                        ret
>
>
> or to save a byte...
>
> _UshortByteSwap:
>                        mov   ebx,[esp+8]  // load the USHORT                       
>                        mov   al, bh
>                        mov   ah, bl
>                        ret
>   

static force_inline USHORT UshortByteSwap(USHORT x)
{
    asm volatile(
        "rolw $8, %0;"
        : "=r" (x)
        : "0" (x)
    );
    return x;
}



-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-dev/attachments/20060902/1be08603/attachment.html 


More information about the Ros-dev mailing list