On 6 October 2016 at 22:55, Ilya Yaroshenko via Digitalmars-d <digitalmars-d@puremagic.com> wrote: > 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@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@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
Well, sure, I could mark all gcc intrinsics as pure so you can use __builtin_print() or malloc() in pure code. Doesn't mean the compiler is honest in allowing it. ;-) Get this in core.math, there's no place for compiler-specific code in phobos. Iain.