Activation des interruptions de point flottant sur Mac OS X Intel

sur Linux, feenableexcept et fedisableexcept peuvent être utilisés pour contrôler la génération D'interruptions SIGFPE sur les exceptions à virgule flottante. Comment puis-je faire ça sur Mac OS X Intel?

l'assemblage en ligne pour activer les interrupteurs à virgule flottante est fourni en http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, pp. 7-15, but only for PowerPC assembly.

17
demandé sur Geoffrey Irving 2008-10-29 17:41:33

2 réponses

les Exceptions pour sse peuvent être activées en utilisant _MM_SET_EXCEPTION_MASKxmmintrin.h. Par exemple, pour activer les exceptions invalides (nan), faites

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
23
répondu Geoffrey Irving 2008-12-04 14:06:35

sur Mac OS X, c'est assez compliqué. OS X utilise L'unité SSE pour toutes les mathématiques FP par défaut,pas l'unité X87 FP. L'unité SSE n'honore pas les options d'interruption, ce qui signifie qu'en plus d'activer les interruptions, vous devez vous assurer de compiler tout votre code pour ne pas utiliser les mathématiques SSE.

Vous pouvez désactiver les maths en ajoutant "-mno-sse-mno-sse2-mno-sse3" à vos CFLAGS. Une fois que vous avez fait cela, vous pouvez utiliser un certain assemblage en ligne pour configurer vos exceptions FP, avec essentiellement les mêmes options que Linux.

short fpflags = 0x1332 // Default FP flags, change this however you want. 
asm("fnclex");
asm("fldcw _fpflags");

le seul hic que vous pouvez trouver est que depuis OS X est construit entièrement en utilisant sse il peut y avoir des bogues non capturés. Je sais qu'il y avait un gros problème avec le gestionnaire de signal qui ne transmettait pas les codes appropriés, mais c'était il y a quelques années, j'espère que c'est réparé maintenant.

6
répondu Louis Gerbarg 2008-10-31 04:46:38