[Oberon] FP
Peter De Wachter
pdewacht at gmail.com
Tue Apr 15 14:49:22 CEST 2014
No, that wouldn't work. Every architecture does floating point
differently. And RISC FP in particular doesn't implement the full IEEE
standard, for example it doesn't support infinities and denormal
numbers. The current code in the emulator isn't pretty or fast but at
least it's accurate.
> float *a = (float *)(&x);
And don't do that, that invokes undefined behavior. To emulate C++'s
reinterpret_cast, use an union:
union { uint32_t x; float f; } float_hack;
float_hack.x = x;
return float_hack.f;
On 15-04-14 13:17, Jörg wrote:
> Hi all
>
> Indeed. The FP code in the emulator is an example of "backporting assembler
> to C". PdW could have taken the "normal" FP arithmetic offered by C and let
> the C compiler decide to generate the code.
> The FP format NW uses is the same as C, namely IEEE single precision.
>
> So, PdW could have written something like:
> uint32_t fp_add(uint32_t x, uint32_t y, bool u, bool v);
> {
> float *a = (float *)(&x); /* aka reinterpret_cast in C++ */
> float *b = (float *)(&y);
>
> /* do whatever you want to do with the FP numbers a and b */
> float sum, prod;
> sum = *a + *b;
> prod = *a * *b;
> ...
> }
>
> Jörg
More information about the Oberon
mailing list