std.math API rework

Ilya Yaroshenko via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 6 13:55:55 PDT 2016


On Thursday, 6 October 2016 at 20:45:24 UTC, Iain Buclaw wrote:
> On 6 October 2016 at 22:31, Ilya Yaroshenko via Digitalmars-d 
> <digitalmars-d at puremagic.com> wrote:
>> On Thursday, 6 October 2016 at 20:07:19 UTC, Iain Buclaw wrote:
>>>
>>> On 6 October 2016 at 18:53, Ilya Yaroshenko via Digitalmars-d 
>>> <digitalmars-d at puremagic.com> wrote:
>>>>
>>>> [...]
>>>
>>>
>>> If you can prove that llvm intrinsics are pure (gcc math 
>>> intrinsics are not) and that llvm intrinsics pass the 
>>> unittest (gcc math intrinsics aren't guaranteed to due to the 
>>> vagary of libm implementations and quirky cpu support that 
>>> trades correctness for efficiency).
>>>
>>> [...]
>>
>>
>> LLVM math functions are pure :P 
>> http://llvm.org/docs/LangRef.html
>>
>
> I picked a random example.
>
> http://llvm.org/docs/LangRef.html#llvm-sin-intrinsic
>
> """
>
> Semantics:
>
> This function returns the sine of the specified operand, 
> returning the same values as the libm sin functions would, and 
> handles error conditions in the same way.
>
> """
>
> This would have me believe that they are infact not pure. ;-)
>
> But, I've never looked under the hood of LLVM, so I can only 
> believe those who have.  In any case, IMO, you should focus on 
> getting this into core.math.  That's where compiler intrinsics 
> should go.  The intrinsics of std.math are historical baggage 
> and are probably due a deprecation - that is, in the sense that 
> their symbols be converted into aliases.
>
> Iain.

Current code is (please look in LDC's fork):

version(LDC)
{
     real   cos(real   x) @safe pure nothrow @nogc { return 
llvm_cos(x); }
     ///ditto
     double cos(double x) @safe pure nothrow @nogc { return 
llvm_cos(x); }
     ///ditto
     float  cos(float  x) @safe pure nothrow @nogc { return 
llvm_cos(x); }
}
else
{

real cos(real x) @safe pure nothrow @nogc { pragma(inline, true); 
return core.math.cos(x); }
//FIXME
///ditto
double cos(double x) @safe pure nothrow @nogc { return 
cos(cast(real)x); }
//FIXME
///ditto
float cos(float x) @safe pure nothrow @nogc { return 
cos(cast(real)x); }

}

So, I don't see a reason why this change break something, hehe


More information about the Digitalmars-d mailing list