[fpc-devel] no exceptions from arithmetical operations on AArch64

Jonas Maebe jonas.maebe at elis.ugent.be
Fri May 29 11:10:46 CEST 2015


Edmund Grimley Evans wrote on Fri, 29 May 2015:

> How much freedom do you have in the choice of which exceptions you
> detect and when?

In theory: all the freedom in the world. E.g., when using the x87  
instructions on x86 hardware, floating point exceptions are  
(currently) only thrown when the next x87 instruction starts executing  
following the one that caused the exception. This can be in a  
completely different part of the program, if you're unlucky, and is  
due to the origins of the x87 as an independent/off-chip co-processor.  
For a long time, I've had the idea of adding a compiler switch that  
optionally emits an "fwait" instruction after every x87 instruction  
that might cause an exception, but never got around it.

In practice, I think that throwing the exception at the point where it  
occurs is best. It's true that it's not ideal from a performance  
perspective, but in that case you can just disable the generation of  
exception-generating code. We already have an architecture-independent  
way to raise an exception if the FPU detected an error while its  
exceptions were masked (using the Math unit as described in my  
previously referenced post). Therefore you can perform manual checking  
only at the points you care about in that case (with the caveat that's  
also mentioned in that previous post, namely that currently this kind  
of checking is only implemented on AArch64).

> Just for a check list, the AArch64 cumulative exception bits are:
>
> IXC : Inexact
> UFC : Underflow
> OFC : Overflow
> DZC : Division by Zero
> IOC : Invalid Operation

These are more or less the same on all architectures. The reason is  
probably that they're mandated by the IEEE 754 standard:  
http://en.wikipedia.org/wiki/IEEE_floating_point#Exception_handling


Jonas



More information about the fpc-devel mailing list