[ros-dev] RtlUlonglongByteSwap (Thomas Faber)

Love Nystrom love.nystrom at gmail.com
Mon Oct 20 17:15:35 UTC 2014


On 2014-10-17 19.00, ros-dev-request at reactos.org wrote:
> Fastcall passes 64 bit arguments on the stack.

Aaagh.. I didn't know that.. Thanks for pointing it out.
IMO that's incredibly stupid, as a 32-bit CPU (or x64 running 32bit)
uses the register combination EAX:EDX for 64 bit integers, and
EAX:EDX is used for 64 bit return values (again in 32bit mode).
The compiler designers need to smarten up!

Best Regards
   Love
> And yes, this is about an ntdll/ntoskrnl export, so we must be binary
> compatible with what Windows does.
> But the implementation that is normally used is an inline/intrinsic
> function anyway. This is just about the export (or rather, importing
> it).
>
> On 2014-10-17 00:24, Love Nystrom wrote:
>> >@Timo, @Thomas, @Ged
>> >
>> >Byte order swappers should always be fastcall for perfomance reasons.
>> >They have no need for the benefits of the cdecl call convention.
>> >Using cdecl in this case would make the binary code pitifully slow.
>> >
>> >Think about it for a bit.. Some pseudocode show what I mean:
>> >
>> >..CDECL...
>> >
>> >      push hi
>> >      push lo
>> >      call Swapper
>> >      mov  dsthi, edx
>> >      mov  dstlo, eax
>> >      add  esp, 4
>> >      ...
>> >
>> >// UINT64 __cdecl
>> >Swapper:
>> >      push  ebp
>> >      mov   ebp, esp
>> >      mov   eax, ebp+8  // lo
>> >      mov   eax, ebp+12 // hi
>> >      bswap
>> >      xchg  eax, edx
>> >      bswap
>> >      pop   ebp
>> >      ret
>> >
>> >..FASTCALL...
>> >
>> >      mov  edx, hi
>> >      mov  eax, lo
>> >      call Swapper
>> >      mov  dsthi, edx
>> >      mov  dstlo, eax
>> >      ...
>> >
>> >// UINT64 __declspec(naked) __fastcall
>> >Swapper:
>> >      bswap
>> >      xchg eax, edx
>> >      bswap
>> >      ret
>> >
>> >Sadly the compiler designers were not (yet) clever enough
>> >to make the fastcall regs EAX, EDX, ECX, in that exact order,
>> >but even as it stands today..
>> >
>> >Swapper:
>> >      mov   eax, ecx
>> >      bswap
>> >      xchg  eax, edx
>> >      bswap
>> >      ret
>> >
>> >
>> >(If you actually link against a binary swapper compiled out of your
>> >control with
>> >cdecl convention, the argument falls of course, as you must comply with
>> >the binary.)
>> >
>> >Keep up the good work..
>> >Best Regards
>> >// Love
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20141021/3b7da472/attachment.html>


More information about the Ros-dev mailing list