digitalmars.D - A new calling convention in VS2013
- bearophile (100/100) Jul 13 2013 Through Reddit I've found an article about
- Iain Buclaw (7/13) Jul 13 2013 I'd vote for not adding more fluff which makes ABI differences
- Benjamin Thaut (10/22) Jul 14 2013 I think it would be more important if dmd would actually use the XMM
- bearophile (13/16) Jul 14 2013 I don't agree, because:
- Kagamin (5/5) Jul 14 2013 Calling convention optimizations can probably be done during
- bearophile (6/11) Jul 14 2013 In D you can tag a free function as "private", to make them
- Benjamin Thaut (9/24) Jul 14 2013 I just wanted to say that there are currently bigger fish to fry then
- bearophile (15/21) Jul 14 2013 I understand and I agree. On the other hand I think there are
- bearophile (4/6) Jul 16 2013 Why?
Through Reddit I've found an article about
vector-calling-convention added to VS2013:
http://blogs.msdn.com/b/vcblog/archive/2013/07/12/introducing-vector-calling-convention.aspx
So I have written what I think is a similar D program:
import core.stdc.stdio, core.simd;
struct Particle { float4 x, y; }
Particle addParticles(in Particle p1, in Particle p2) pure
nothrow {
return Particle(p1.x + p2.x, p1.y + p2.y);
}
// BUG 10627 and 10523
//alias Particle2 = float4[2];
//Particle2 addParticles(in Particle2 p1, in Particle2 p2) {
// return p1[] + p2[];
//}
void main() {
auto p1 = Particle([1, 2, 3, 4], [10, 20, 30, 40]);
printf("%f %f %f %f %f %f %f %f\n",
p1.x.array[0], p1.x.array[1], p1.x.array[2],
p1.x.array[3],
p1.y.array[0], p1.y.array[1], p1.y.array[2],
p1.y.array[3]);
auto p2 = Particle([100, 200, 300, 400], [1000, 2000, 3000,
4000]);
printf("%f %f %f %f %f %f %f %f\n",
p2.x.array[0], p2.x.array[1], p2.x.array[2],
p2.x.array[3],
p2.y.array[0], p2.y.array[1], p2.y.array[2],
p2.y.array[3]);
auto p3 = addParticles(p1, p2);
printf("%f %f %f %f %f %f %f %f\n",
p3.x.array[0], p3.x.array[1], p3.x.array[2],
p3.x.array[3],
p3.y.array[0], p3.y.array[1], p3.y.array[2],
p3.y.array[3]);
}
I have compiled with the latest ldc2 (Windows32):
ldc2 -O5 -disable-inlining -release -vectorize-slp
-vectorize-slp-aggressive -output-s test.d
The resulting X86 asm:
__D4test12addParticlesFNaNbxS4test8ParticlexS4test8ParticleZS4test8Particle:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movaps 40(%ebp), %xmm0
movaps 56(%ebp), %xmm1
addps 8(%ebp), %xmm0
addps 24(%ebp), %xmm1
movups %xmm1, 16(%eax)
movups %xmm0, (%eax)
movl %ebp, %esp
popl %ebp
ret $64
__Dmain:
...
movaps 160(%esp), %xmm0
movaps 176(%esp), %xmm1
movaps %xmm1, 48(%esp)
movaps %xmm0, 32(%esp)
movaps 128(%esp), %xmm0
movaps 144(%esp), %xmm1
movaps %xmm1, 16(%esp)
movaps %xmm0, (%esp)
leal 96(%esp), %eax
calll __D4test12addParticlesFNaNbxS4test8ParticlexS4test8ParticleZS4test8Particle
subl $64, %esp
movss 96(%esp), %xmm0
movss 100(%esp), %xmm1
movss 104(%esp), %xmm2
movss 108(%esp), %xmm3
movss 112(%esp), %xmm4
movss 116(%esp), %xmm5
movss 120(%esp), %xmm6
movss 124(%esp), %xmm7
cvtss2sd %xmm7, %xmm7
movsd %xmm7, 60(%esp)
cvtss2sd %xmm6, %xmm6
movsd %xmm6, 52(%esp)
cvtss2sd %xmm5, %xmm5
movsd %xmm5, 44(%esp)
cvtss2sd %xmm4, %xmm4
movsd %xmm4, 36(%esp)
cvtss2sd %xmm3, %xmm3
movsd %xmm3, 28(%esp)
cvtss2sd %xmm2, %xmm2
movsd %xmm2, 20(%esp)
cvtss2sd %xmm1, %xmm1
movsd %xmm1, 12(%esp)
cvtss2sd %xmm0, %xmm0
movsd %xmm0, 4(%esp)
movl $_.str3, (%esp)
calll ___mingw_printf
xorl %eax, %eax
movl %ebp, %esp
popl %ebp
ret
Are those vector calling conventions useful for D too?
Bye,
bearophile
Jul 13 2013
On Saturday, 13 July 2013 at 10:36:01 UTC, bearophile wrote:Through Reddit I've found an article about vector-calling-convention added to VS2013: http://blogs.msdn.com/b/vcblog/archive/2013/07/12/introducing-vector-calling-convention.aspx-- snip --Are those vector calling conventions useful for D too? Bye, bearophileI'd vote for not adding more fluff which makes ABI differences between compilers greater. But it certainly looks like if would be useful if you wish to save the time taken to copy the vector from XMM registers onto the stack and back again when passing values around.
Jul 13 2013
Am 13.07.2013 12:35, schrieb bearophile:
The resulting X86 asm:
__D4test12addParticlesFNaNbxS4test8ParticlexS4test8ParticleZS4test8Particle:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movaps 40(%ebp), %xmm0
movaps 56(%ebp), %xmm1
addps 8(%ebp), %xmm0
addps 24(%ebp), %xmm1
movups %xmm1, 16(%eax)
movups %xmm0, (%eax)
I think it would be more important if dmd would actually use the XMM
registers correctly for computations. As you can see from the
disassembly dmd generates code that always adds/moves from/to memory and
does not stay within the registers at all.
http://d.puremagic.com/issues/show_bug.cgi?id=10226
Until dmd uses the XMM registers correctly it doesn't make much sense to
add a special calling convetion for this purpose.
Kind Regards
Benjamin Thaut
Jul 14 2013
Benjamin Thaut:http://d.puremagic.com/issues/show_bug.cgi?id=10226I see there are codegen inefficiencies.Until dmd uses the XMM registers correctly it doesn't make much sense to add a special calling convetion for this purpose.I don't agree, because: - Even if DMD codegen is far from not perfect, it's a good idea to improve all things in parallel. Generally improving things (or fixing bugs) gives a better result if you adopt a pipelined development approach. - A vector calling convention is meant to be usable on other compilers too, like LDC2, that have better codegen. (The asm I have shown in this thread comes from LDC2 because dmd doesn't even use SIMD registers on Windows 32 bit). Bye, bearophile
Jul 14 2013
Calling convention optimizations can probably be done during whole program optimization, which 1) usable for computation-intensive applications anyway, 2) guarantees invisibility of those fastcall functions to external code so there's no incompatibility.
Jul 14 2013
Kagamin:Calling convention optimizations can probably be done during whole program optimization, which 1) usable for computation-intensive applications anyway, 2) guarantees invisibility of those fastcall functions to external code so there's no incompatibility.In D you can tag a free function as "private", to make them module-private. Maybe in this case the D compiler is free to use any kind of calling convention for them. Bye, bearophile
Jul 14 2013
Am 14.07.2013 14:11, schrieb bearophile:Benjamin Thaut:I just wanted to say that there are currently bigger fish to fry then micro optimization through calling convetions. (GC, allocators, all the bugs...) Did you compile the shown code with optimization enabled or is that a debug build? If it is optimized I'M going to be disappointed by LDCs codegen. Kind Regards Benjamin Thauthttp://d.puremagic.com/issues/show_bug.cgi?id=10226I see there are codegen inefficiencies.Until dmd uses the XMM registers correctly it doesn't make much sense to add a special calling convetion for this purpose.I don't agree, because: - Even if DMD codegen is far from not perfect, it's a good idea to improve all things in parallel. Generally improving things (or fixing bugs) gives a better result if you adopt a pipelined development approach. - A vector calling convention is meant to be usable on other compilers too, like LDC2, that have better codegen. (The asm I have shown in this thread comes from LDC2 because dmd doesn't even use SIMD registers on Windows 32 bit). Bye, bearophile
Jul 14 2013
Benjamin Thaut:I just wanted to say that there are currently bigger fish to fry then micro optimization through calling convetions. (GC, allocators, all the bugs...)I understand and I agree. On the other hand I think there are things that (if desired) it's better to introduce sooner, despite some important bugs are not fixed, because they shape the future of D a bit.Did you compile the shown code with optimization enabled or is that a debug build? If it is optimized I'M going to be disappointed by LDCs codegen.If you take a look at the original post I have used: ldc2 -O5 -disable-inlining -release -vectorize-slp -vectorize-slp-aggressive -output-s test.d I think that's about the max optimization, I have also added some aggressive optimization switches introduced only the latest LLVM version (if you remove them the resulting asm of addParticles is about the same, but it reorders less better some of the instructions inside the dmain). Bye, bearophile
Jul 14 2013
Benjamin Thaut:If it is optimized I'M going to be disappointed by LDCs codegen.<Why? Bye, bearophile
Jul 16 2013









"Iain Buclaw" <ibuclaw ubuntu.com> 