Avertissement du compilateur (niveau 1) C4730
'main' : la combinaison de _m64 et d’expressions à virgule flottante peut entraîner un code incorrect
Une fonction utilise __m64 et float
/double
types. Étant donné que les registres MMX et à virgule flottante partagent le même espace d’enregistrement physique (ne peuvent pas être utilisés simultanément), l’utilisation __m64
et float
/double
les types dans la même fonction peuvent entraîner une altération des données, ce qui peut entraîner une exception.
Pour utiliser __m64
en toute sécurité les types et les types à virgule flottante dans la même fonction, chaque instruction qui utilise l’un des types doit être séparée par l’intrinsèque _m_empty() (pour MMX) ou _m_femms() (pour 3DNow !) intrinsèque.
L’exemple suivant génère l’erreur C4730 :
// C4730.cpp
// compile with: /W1
// processor: x86
#include "mmintrin.h"
void func(double)
{
}
int main(__m64 a, __m64 b)
{
__m64 m;
double f;
f = 1.0;
m = _m_paddb(a, b);
// uncomment the next line to resolve C4730
// _m_empty();
func(f * 3.0); // C4730
}