Bits rotations

Adam D. Ruppe destructionator at gmail.com
Wed Oct 17 19:55:38 PDT 2012


On Thursday, 18 October 2012 at 02:36:59 UTC, bearophile wrote:
> uint foo(in uint x) pure nothrow {
>     return (x << 11) | (x >> (32 - 11));
> }

Why would you write that instead of using rol(x, 11) today?

uint rol(in uint x, in uint y) pure nothrow {
     return (x << y) | (x >> (32 - y));
}

uint foo(in uint x) pure nothrow {
         return rol(x, 11);
}

the rest is the same. Compile it and see a rol instruction, 
inlined, in the main function.

Though there is a bit of extra spam around it, some movs that 
don't seem necessary to me.

Here's the top function so you can see the movs:

00000000 <_D5test43rolFNaNbxkxkZk>:
    0:   55                      push   ebp
    1:   8b ec                   mov    ebp,esp
    3:   50                      push   eax
    4:   8b 45 08                mov    eax,DWORD PTR [ebp+0x8]
    7:   8b 4d fc                mov    ecx,DWORD PTR [ebp-0x4]
    a:   8b e5                   mov    esp,ebp
    c:   d3 c0                   rol    eax,cl
    e:   5d                      pop    ebp
    f:   c2 04 00                ret    0x4
   12:   90                      nop
   13:   90                      nop



Perhaps we should add that rol function to the stdlib to save 
people from quickly doing it themselves, but there's no need to 
do anything beyond this simple function.


More information about the Digitalmars-d mailing list