DMD: slow coping for small static arrays.
Ilya Yaroshenko via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jul 19 01:08:07 PDT 2015
I have found that DMD can not optimise array coping for small
static arrays:
Code:
-----------------------------------
size_t[8] foo(size_t[8] x)
{
size_t[8] ret = void;
ret[0..3] = x[5..8];
ret[3..8] = x[0..5];
return ret;
}
-----------------------------------
DMD (nightly build): http://goo.gl/CAufv8
-----------------------------------
ulong[8] example.foo(ulong[8]):
push rbp
mov rbp,rsp
sub rsp,0x10
mov QWORD PTR [rbp-0x8],rdi
mov edx,0x18
lea rsi,[rbp+0x38]
call 1a <ulong[8] example.foo(ulong[8])+0x1a>
mov edx,0x28
lea rsi,[rbp+0x10]
mov rax,QWORD PTR [rbp-0x8]
lea rdi,[rax+0x18]
call 30 <ulong[8] example.foo(ulong[8])+0x30>
mov rax,QWORD PTR [rbp-0x8]
mov rsp,rbp
pop rbp
ret
add BYTE PTR [rax],al
...
-----------------------------------
GDC 4.2: http://goo.gl/RdcjeV
-----------------------------------
uint[8] example.foo(uint[8]):
movl 4(%esp), %eax
movl 28(%esp), %edx
movl %edx, (%eax)
movl 32(%esp), %edx
movl %edx, 4(%eax)
movl 36(%esp), %edx
movl %edx, 8(%eax)
movl 8(%esp), %ecx
movl %ecx, 12(%eax)
movl 12(%esp), %ecx
movl %ecx, 16(%eax)
movl 16(%esp), %ecx
movl %ecx, 20(%eax)
movl 20(%esp), %ecx
movl %ecx, 24(%eax)
movl 24(%esp), %ecx
movl %ecx, 28(%eax)
ret $4
-----------------------------------
Fast coping is important for new N-demensional ranges
https://github.com/D-Programming-Language/phobos/pull/3397 .
I want to know should I write a work around for DMD OR DMD would
be fixed during this year?
More information about the Digitalmars-d
mailing list