digitalmars.D.learn - FP magic in std.math.pow
- Seb (54/54) Jul 31 2016 Consider this short program:
- Stefan Koch (5/12) Jul 31 2016 It's an anoying feature.
- Seb (4/19) Aug 01 2016 It's about 1000 instructions with std.math.pow.
Consider this short program: void main() { alias S = float; S s1 = 0x1.24c92ep+5; S s2 = -0x1.1c71c8p+0; import std.math : std_pow = pow; import core.stdc.stdio : printf; import core.stdc.math: powf; printf("std: %a\n", std_pow(s1, s2)); printf("pow: %a\n", s1 ^^ s2); printf("pow: %a\n", powf(s1, s2)); version(LDC) { import ldc.intrinsics : llvm_pow; printf("ldc: %a\n", llvm_pow(s1, s2)); } } std: 0x1.2c155ap-6 pow: 0x1.2c155ap-6 powf: 0x1.2c1558p-6 As you can see below the C powf compiles to the assembly powf and LDC compiles to powf too. The output of std.math.pow is rather large, hence not listed. 1) Is this a bug in Phobos or just a very annoying "feature"? 2) I thought that DMD was decoupled from Phobos? So I was very astonished to see that it's not (see [1]) [1] https://github.com/dlang/dmd/blob/master/src/expression.d#L14781 ``` .text._Dmain segment assume CS:.text._Dmain _Dmain: push RBP mov RBP,RSP sub RSP,010h movss XMM0,FLAT:.rodata[00h][RIP] movss -8[RBP],XMM0 movss XMM1,FLAT:.rodata[00h][RIP] movss -4[RBP],XMM1 movss XMM1,-4[RBP] movss XMM0,-8[RBP] call powf PC32 cvtss2sd XMM0,XMM0 mov EDI,offset FLAT:.rodata 32 mov AL,1 call printf PC32 xor EAX,EAX leave ret 0f1f add 0[RCX],AL .text._Dmain ends ```
Jul 31 2016
On Sunday, 31 July 2016 at 22:38:59 UTC, Seb wrote:Consider this short program: void main() { alias S = float; S s1 = 0x1.24c92ep+5; S s2 = -0x1.1c71c8p+0; [...]It's an anoying feature. The reason this is not implemented in dmd is that pow does not map to a simple cpu instruction on x86. I will have another shot at fixing this once the CTFE stuff is in.
Jul 31 2016
On Sunday, 31 July 2016 at 22:45:16 UTC, Stefan Koch wrote:On Sunday, 31 July 2016 at 22:38:59 UTC, Seb wrote:It's about 1000 instructions with std.math.pow. Yeah any improvement of the FP magic in DMD would be highly appreciated ;-)Consider this short program: void main() { alias S = float; S s1 = 0x1.24c92ep+5; S s2 = -0x1.1c71c8p+0; [...]It's an anoying feature. The reason this is not implemented in dmd is that pow does not map to a simple cpu instruction on x86. I will have another shot at fixing this once the CTFE stuff is in.
Aug 01 2016