编译器警告(等级 1)C4730

“main”:混合 _m64 和浮点表达式可能导致不正确的代码

函数使用 __m64float/double 类型。 由于 MMX 和浮点寄存器共享相同的物理寄存器空间(不能同时使用),因此在同一函数中使用 __m64float/double 类型会导致数据损坏,从而可能引发异常。

若要在同一函数中安全使用 __m64 类型和浮点类型,则使用其中一种类型的每个指令应该用内部的 _m_empty()(适用于 MMX)或 _m_femms()(适用于 3DNow!)进行分隔。

下面的示例生成 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
}