[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