newCTFE Status November 2018

Joakim dlang at joakim.fea.st
Sat Dec 8 17:19:59 UTC 2018


On Saturday, 8 December 2018 at 07:08:54 UTC, Stefan Koch wrote:
> On Saturday, 8 December 2018 at 04:06:11 UTC, Joakim wrote:
>> On Saturday, 8 December 2018 at 00:32:58 UTC, Stefan Koch 
>> wrote:
>>> Hi All,
>>>
>>> I have short but good news, non-default class-constructors 
>>> work now.
>>> (this was tricky because of my unorthodox vtbl layout).
>>>
>>> And another exciting news item, newCTFE is going to support 
>>> cross-platform floating-point as soon as I got around to 
>>> re-implementing, the qemu fork of softfloat-2.
>>
>> What do you mean by "cross-platform floating-point," using the 
>> same implementation everywhere without calling _any_ libc/arch 
>> intrinsics?
>
> Yes that is what I mean. It has always been the plan, but until 
> recently,
> I saw no way to actually realize it.
>
>>> That'll result in a compile-time testable floating point 
>>> implementation ;) Pretty cool, huh.
>>
>> How does that differ from the current implementation?
>
> Currently it relies on the host fpu.  or rather the hosts float 
> implementation.
> Which I intent to replace with a pure software solution, which 
> operates independently
> from the host float math.
> And can therefore be made to behave like the targets (more or 
> less, it's emulation).

OK, got that from the first question, but I was referring to what 
you called "compile-time testable?" I didn't understand what 
using a fully soft-float implementation added in that regard.

>> Btw, do you know some way to get the current compile-time 
>> real's precision in D code?
>
> this _may_ work:
> static immutable ctRealPerc = () { return real.mant_dig; } ();

No, as kinke says, it doesn't work with ldc.

On Saturday, 8 December 2018 at 15:42:43 UTC, H. S. Teoh wrote:
> On Sat, Dec 08, 2018 at 04:06:11AM +0000, Joakim via 
> Digitalmars-d wrote: [...]
>> Btw, do you know some way to get the current compile-time 
>> real's precision in D code? It would be useful to avoid static 
>> asserts from overflowing when the runtime real's precision 
>> exceeds the compile-time real's precision, which doesn't 
>> happen with dmd but can with ldc:
>> 
>> https://github.com/dlang/phobos/pull/6790#discussion_r238633160
>
> Doesn't real.dig give the (approximate) precision of real? Or 
> is that
> hard-coded in the frontend?

Just so we're clear, the issue is what the precision of reals are 
when running CTFE code to initialize a constant, as opposed to 
the precision of the real at runtime. For dmd, this doesn't 
really matter since it only supports x86/x64 chips, but ldc uses 
the host's real at compile-time, which can obviously vary from 
the target. That's why I mentioned to you in another thread that 
some stdlib math tests assert when cross-compiling from x64 to 
Android/AArch64, because of that mismatch in host->target 
precision for reals.

real.dig has the same problem as real.mant_dig above, it only 
gives the target's precision. Compiling this snippet with ldc, 
`void main() { pragma(msg, "precision is ", real.dig);}`, I get 
18 when compiling natively on linux/x64, but 33 when 
cross-compiling to Android/AArch64, ie it always gives the target 
real's precision.


More information about the Digitalmars-d mailing list