Question

Sous Linux, feenableexcept et fedisableexcept peuvent être utilisés pour contrôler la génération des interruptions SIGFPE sur des exceptions en virgule flottante. Comment puis-je faire cela sur Mac OS X Intel?

Un assemblage en ligne permettant d'activer les interruptions en virgule flottante est fourni dans http: // developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf , p. 7-15, mais uniquement pour l'assemblage PowerPC.

Était-ce utile?

La solution

Les exceptions pour sse peuvent être activées à l'aide de _MM_SET_EXCEPTION_MASK à partir de xmmintrin.h . Par exemple, pour activer les exceptions (nan) non valides, effectuez

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);

Autres conseils

Sous Mac OS X, cela est moyennement compliqué. OS X utilise l'unité SSE pour toutes les opérations mathématiques par défaut, pas l'unité x87 FP. L'unité SSE ne respecte 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 SSE math.

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

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

Le problème que vous pouvez rencontrer est que, puisque OS X est entièrement construit en utilisant sse, il peut y avoir des bogues non détectés. Je sais que jadis le système de traitement du signal ne transmettait pas les codes appropriés, mais c’était il ya quelques années et, espérons-le, il est corrigé maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top