Performance
bearophile via Digitalmars-d
digitalmars-d at puremagic.com
Fri May 30 07:30:27 PDT 2014
> double plus(in uint nSteps) pure nothrow @safe /*@nogc*/ {
> enum double p0 = 0.0045;
> enum double p1 = 1.00045452-p0;
>
> double tot = 1.346346;
> auto b = true;
>
> foreach (immutable i; 0 .. nSteps) {
> final switch (b) {
> case true:
> tot += p0;
> break;
> case false:
> tot += p1;
> break;
> }
>
> b = !b;
> }
>
> return tot;
> }
And this is the 32 bit X86 asm generated by ldc2 for the plus
function:
__D4test4plusFNaNbNfxkZd:
pushl %ebp
movl %esp, %ebp
pushl %esi
andl $-8, %esp
subl $24, %esp
movsd LCPI0_0, %xmm0
testl %eax, %eax
je LBB0_8
xorl %ecx, %ecx
movb $1, %dl
movsd LCPI0_1, %xmm1
movsd LCPI0_2, %xmm2
.align 16, 0x90
LBB0_2:
testb $1, %dl
jne LBB0_3
addsd %xmm1, %xmm0
jmp LBB0_7
.align 16, 0x90
LBB0_3:
movzbl %dl, %esi
andl $1, %esi
je LBB0_5
addsd %xmm2, %xmm0
LBB0_7:
xorb $1, %dl
incl %ecx
cmpl %eax, %ecx
jb LBB0_2
LBB0_8:
movsd %xmm0, 8(%esp)
fldl 8(%esp)
leal -4(%ebp), %esp
popl %esi
popl %ebp
ret
LBB0_5:
movl $11, 4(%esp)
movl $__D4test12__ModuleInfoZ, (%esp)
calll __d_switch_error
Bye,
bearophile
More information about the Digitalmars-d
mailing list