Another interesting difference
bearophile
bearophileHUGS at lycos.com
Thu Dec 12 01:00:03 PST 2013
I am trying the following program with both the latest dmd
2.065alpha and ldc2 2.063.2, with no optimizations:
int fun(int[3] a) {
return a[0]+ a[1] + a[2];
}
int main() {
int total = 0;
foreach (immutable _; 0 .. 100_000_000)
total += fun([1, 2, 3]);
return total;
}
The results, both in run-time and x86 asm:
-------------------------
dmd test2.d
runtime: 0.81
_D5test23funFG3iZi comdat
mov EAX,4[ESP]
add EAX,8[ESP]
add EAX,0Ch[ESP]
ret 0Ch
__Dmain comdat
L0: enter 014h,0
push EBX
xor EAX,EAX
mov -014h[EBP],EAX
mov -010h[EBP],EAX
LD: cmp dword ptr -010h[EBP],05F5E100h
jge L47
mov ECX,-010h[EBP]
mov EDX,1
mov -0Ch[EBP],EDX
mov dword ptr -8[EBP],2
mov dword ptr -4[EBP],3
lea EBX,-0Ch[EBP]
push dword ptr 8[EBX]
push dword ptr 4[EBX]
push dword ptr [EBX]
call near ptr _D5test23funFG3iZi
add -014h[EBP],EAX
inc dword ptr -010h[EBP]
jmp short LD
L47: mov EAX,-014h[EBP]
pop EBX
leave
ret
-------------------------
ldmd2 test2.d
runtime: 1.94
ldmd2 -output-s test2.d
__D5test23funFG3iZi:
subl $28, %esp
leal 32(%esp), %eax
movb $1, %cl
testb $1, %cl
movl %eax, 24(%esp)
jne LBB0_2
jmp LBB0_1
LBB0_1:
leal __D5test212__ModuleInfoZ, %eax
movl $2, %ecx
movl %eax, (%esp)
movl $2, 4(%esp)
movl %ecx, 20(%esp)
calll __d_array_bounds
LBB0_2:
movb $1, %al
testb $1, %al
jne LBB0_4
leal __D5test212__ModuleInfoZ, %eax
movl $2, %ecx
movl %eax, (%esp)
movl $2, 4(%esp)
movl %ecx, 16(%esp)
calll __d_array_bounds
LBB0_4:
movb $1, %al
movl 24(%esp), %ecx
movl (%ecx), %edx
addl 4(%ecx), %edx
testb $1, %al
movl %edx, 12(%esp)
jne LBB0_6
leal __D5test212__ModuleInfoZ, %eax
movl $2, %ecx
movl %eax, (%esp)
movl $2, 4(%esp)
movl %ecx, 8(%esp)
calll __d_array_bounds
LBB0_6:
movl 24(%esp), %eax
movl 8(%eax), %ecx
movl 12(%esp), %edx
addl %ecx, %edx
movl %edx, %eax
addl $28, %esp
ret $12
__Dmain:
subl $40, %esp
movl $0, 36(%esp)
movl $0, 32(%esp)
movl $100000000, 28(%esp)
LBB1_1:
cmpl $100000000, 32(%esp)
jge LBB1_4
movl 32(%esp), %eax
movl %eax, 24(%esp)
movl $3, 20(%esp)
movl $2, 16(%esp)
movl $1, 12(%esp)
movl 20(%esp), %eax
movl %esp, %ecx
movl %eax, 8(%ecx)
movsd 12(%esp), %xmm0
movsd %xmm0, (%ecx)
calll __D5test23funFG3iZi
subl $12, %esp
movl 36(%esp), %ecx
addl %eax, %ecx
movl %ecx, 36(%esp)
movl 32(%esp), %eax
addl $1, %eax
movl %eax, 32(%esp)
jmp LBB1_1
LBB1_4:
movl 36(%esp), %eax
addl $40, %esp
ret
-------------------------
Do you know why ldc2 puts array bound tests inside fun()? The
array 'a' inside fun() is a fixed size array, so there is no need
to verify at run-time that 0 1 2 are within the array bounds.
Bye,
bearophile
More information about the digitalmars-d-ldc
mailing list