[Issue 6829] Unsigned rotate standard function in Phobos

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Jul 10 03:28:21 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=6829



--- Comment #8 from bearophile_hugs at eml.cc 2013-07-10 03:28:19 PDT ---
(In reply to comment #6)
> (In reply to comment #5)
> > I think this should be a recognizable rotate left function:
> > 
> >     private static uint rol(in uint x, in uint y) pure nothrow {
> >         return (x << y) | (x >> (32 - y));
> >     }
> 
> It is (in gdc with -O :)
> 
> _D3rol3rolFNaNbxkxkZk:
>         mov x, %eax
>         mov y, %ecx
>         rol %cl, %eax
>         ret


Both dmd and ldc2 recognize the patterns:


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

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

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

void main() {}


/*
dmd -O

_D5temp23rolFNaNbxkxkZk:
        push    EAX
        mov EAX,8[ESP]
        mov ECX,[ESP]
        rol EAX,CL
        pop ECX
        ret 4

_D5temp23rorFNaNbxkxkZk:
        push    EAX
        mov EAX,8[ESP]
        mov ECX,[ESP]
        ror EAX,CL
        pop ECX
        ret 4

_rol2 :
        mov EAX,4[ESP]
        mov ECX,8[ESP]
        rol EAX,CL
        ret

----------------

ldmd2 -O -output-s

__D5temp23rolFNaNbxkxkZk:
    movl    4(%esp), %edx
    movb    %al, %cl
    roll    %cl, %edx
    movl    %edx, %eax
    ret $4

__D5temp23rorFNaNbxkxkZk:
    movl    4(%esp), %edx
    movb    %al, %cl
    rorl    %cl, %edx
    movl    %edx, %eax
    ret $4

_rol2:
    movb    8(%esp), %cl
    movl    4(%esp), %eax
    roll    %cl, %eax
    ret

*/

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list