FP magic in std.math.pow

Seb via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jul 31 15:38:59 PDT 2016


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 at PC32
		cvtss2sd	XMM0,XMM0
		mov	EDI,offset FLAT:.rodata at 32
		mov	AL,1
		call	  printf at PC32
		xor	EAX,EAX
		leave
		ret
		0f1f
		add	0[RCX],AL
.text._Dmain	ends
```


More information about the Digitalmars-d-learn mailing list