[Issue 6829] Unsigned rotate standard function in Phobos
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Jul 10 04:15:18 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=6829
--- Comment #10 from bearophile_hugs at eml.cc 2013-07-10 04:15:16 PDT ---
(In reply to comment #9)
> Excellent, so could put these as templates then. :)
I have improved your code a little. Follows the 32 bit asm for ldc2 and dmd:
import std.traits: isIntegral, isUnsigned;
T rol(T)(in T x, in uint y) @safe pure nothrow
if (isIntegral!T && isUnsigned!T)
{
return cast(T)((x << y) | (x >> ((T.sizeof * 8) - y)));
}
T ror(T)(in T x, in uint y) @safe pure nothrow
if (isIntegral!T && isUnsigned!T)
{
return cast(T)((x >> y) | (x << ((T.sizeof * 8) - y)));
}
void main() {
// Tests to check for assembly output.
{
__gshared static ubyte xb;
__gshared static ushort xs;
__gshared static uint xi;
__gshared static ulong xl;
__gshared static uint yi;
rol(xb, yi); // rolb
ror(xb, yi); // rorb
rol(xs, yi); // rolw
ror(xs, yi); // rorw
rol(xi, yi); // roll
ror(xi, yi); // rorl
rol(xl, yi); // version(X86_64) rolq
ror(xl, yi); // version(X86_64) rorq
}
}
/*
ldmd2 -O -output-s
__D5temp210__T3rolThZ3rolFNaNbNfxhxkZh:
pushl %esi
movzbl 8(%esp), %edx
movb %al, %cl
movl %edx, %esi
shll %cl, %esi
movl $8, %ecx
subl %eax, %ecx
shrl %cl, %edx
orl %esi, %edx
movzbl %dl, %eax
popl %esi
ret $4
__D5temp210__T3rorThZ3rorFNaNbNfxhxkZh:
pushl %esi
movzbl 8(%esp), %edx
movb %al, %cl
movl %edx, %esi
shrl %cl, %esi
movl $8, %ecx
subl %eax, %ecx
shll %cl, %edx
orl %esi, %edx
movzbl %dl, %eax
popl %esi
ret $4
__D5temp210__T3rolTtZ3rolFNaNbNfxtxkZt:
pushl %esi
movzwl 8(%esp), %edx
movb %al, %cl
movl %edx, %esi
shll %cl, %esi
movl $16, %ecx
subl %eax, %ecx
shrl %cl, %edx
orl %esi, %edx
movzwl %dx, %eax
popl %esi
ret $4
__D5temp210__T3rorTtZ3rorFNaNbNfxtxkZt:
pushl %esi
movzwl 8(%esp), %edx
movb %al, %cl
movl %edx, %esi
shrl %cl, %esi
movl $16, %ecx
subl %eax, %ecx
shll %cl, %edx
orl %esi, %edx
movzwl %dx, %eax
popl %esi
ret $4
__D5temp210__T3rolTkZ3rolFNaNbNfxkxkZk:
movl 4(%esp), %edx
movb %al, %cl
roll %cl, %edx
movl %edx, %eax
ret $4
__D5temp210__T3rorTkZ3rorFNaNbNfxkxkZk:
movl 4(%esp), %edx
movb %al, %cl
rorl %cl, %edx
movl %edx, %eax
ret $4
__D5temp210__T3rolTmZ3rolFNaNbNfxmxkZm:
pushl %ebp
pushl %ebx
pushl %edi
pushl %esi
movl %eax, %ebx
movl $64, %ecx
subl %ebx, %ecx
movl 24(%esp), %edx
movl 20(%esp), %eax
movl %eax, %esi
shrdl %cl, %edx, %esi
movl %edx, %edi
shrl %cl, %edi
xorl %ebp, %ebp
testb $32, %cl
cmovnel %edi, %esi
cmovnel %ebp, %edi
movb %bl, %cl
shldl %cl, %eax, %edx
movb %bl, %cl
shll %cl, %eax
testb $32, %bl
cmovnel %eax, %edx
cmovnel %ebp, %eax
orl %esi, %eax
orl %edi, %edx
popl %esi
popl %edi
popl %ebx
popl %ebp
ret $8
__D5temp210__T3rorTmZ3rorFNaNbNfxmxkZm:
pushl %ebp
pushl %ebx
pushl %edi
pushl %esi
movl %eax, %ecx
movl 24(%esp), %edx
movl 20(%esp), %eax
movl %eax, %esi
shrdl %cl, %edx, %esi
movl %edx, %edi
shrl %cl, %edi
xorl %ebp, %ebp
testb $32, %cl
cmovnel %edi, %esi
cmovnel %ebp, %edi
movl $64, %ebx
subl %ecx, %ebx
movb %bl, %cl
shldl %cl, %eax, %edx
movb %bl, %cl
shll %cl, %eax
testb $32, %bl
cmovnel %eax, %edx
cmovnel %ebp, %eax
orl %esi, %eax
orl %edi, %edx
popl %esi
popl %edi
popl %ebx
popl %ebp
ret $8
--------------------------------
dmd -O
_D5temp210__T3rolThZ3rolFNaNbNfxhxkZh:
push EAX
push EAX
movzx ECX,byte ptr 0Ch[ESP]
mov EAX,ECX
mov 0[ESP],ECX
mov CL,4[ESP]
mov EDX,0[ESP]
shl AL,CL
mov ECX,8
sub ECX,4[ESP]
sar EDX,CL
add ESP,8
or AL,DL
ret 4
_D5temp210__T3rorThZ3rorFNaNbNfxhxkZh:
push EAX
push EAX
movzx ECX,byte ptr 0Ch[ESP]
mov EAX,ECX
mov 0[ESP],ECX
mov ECX,8
sub CL,4[ESP]
mov EDX,0[ESP]
shl AL,CL
mov ECX,4[ESP]
sar EDX,CL
add ESP,8
or AL,DL
ret 4
_D5temp210__T3rolTtZ3rolFNaNbNfxtxkZt:
push EAX
mov AX,8[ESP]
mov CX,[ESP]
mov DX,8[ESP]
shl EAX,CL
mov ECX,010h
sub ECX,[ESP]
and EDX,0FFFFh
sar EDX,CL
pop ECX
or EAX,EDX
ret 4
_D5temp210__T3rorTtZ3rorFNaNbNfxtxkZt:
push EAX
mov ECX,010h
mov AX,8[ESP]
sub ECX,[ESP]
mov DX,8[ESP]
shl EAX,CL
mov ECX,[ESP]
and EDX,0FFFFh
sar EDX,CL
or EAX,EDX
pop ECX
ret 4
_D5temp210__T3rolTkZ3rolFNaNbNfxkxkZk:
push EAX
mov EAX,8[ESP]
mov ECX,[ESP]
rol EAX,CL
pop ECX
ret 4
_D5temp210__T3rorTkZ3rorFNaNbNfxkxkZk:
push EAX
mov EAX,8[ESP]
mov ECX,[ESP]
ror EAX,CL
pop ECX
ret 4
_D5temp210__T3rolTmZ3rolFNaNbNfxmxkZm:
push EAX
mov ECX,0[ESP]
mov EDX,0Ch[ESP]
push EBX
mov EAX,0Ch[ESP]
test CL,020h
jne L1A
shld EDX,EAX,CL
shl EAX,CL
jmp short L20
L1A: shl EAX,CL
mov EDX,EAX
xor EAX,EAX
L20: mov ECX,040h
mov EBX,0Ch[ESP]
push EDX
mov EDX,014h[ESP]
sub ECX,8[ESP]
test CL,020h
jne L3E
shrd EBX,EDX,CL
shr EDX,CL
jmp short L44
L3E: shr EDX,CL
mov EBX,EDX
xor EDX,EDX
L44: mov ECX,EDX
or EAX,EBX
pop EDX
or EDX,ECX
pop EBX
pop ECX
ret 8
_D5temp210__T3rorTmZ3rorFNaNbNfxmxkZm:
push EAX
mov ECX,0[ESP]
mov EDX,0Ch[ESP]
push EBX
mov EAX,0Ch[ESP]
test CL,020h
jne L1A
shrd EAX,EDX,CL
shr EDX,CL
jmp short L20
L1A: shr EDX,CL
mov EAX,EDX
xor EDX,EDX
L20: mov ECX,040h
mov EBX,0Ch[ESP]
push EDX
mov EDX,014h[ESP]
sub ECX,8[ESP]
test CL,020h
jne L3E
shld EDX,EBX,CL
shl EBX,CL
jmp short L44
L3E: shl EBX,CL
mov EDX,EBX
xor EBX,EBX
L44: mov ECX,EDX
or EAX,EBX
pop EDX
or EDX,ECX
pop EBX
pop ECX
ret 8
*/
--
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