其他分享
首页 > 其他分享> > c – _MM_TRANSPOSE4_PS导致GCC编译错误?

c – _MM_TRANSPOSE4_PS导致GCC编译错误?

作者:互联网

我是第一次在GCC而不是MSVC中编译我的数学库,并且经历了所有的小错误,而且我找到了一个根本没有意义的数学库:

第284行:错误:左值作为赋值的左操作数

第284行是什么?这个:

_MM_TRANSPOSE4_PS(r,u,t,_ mm_setr_ps(0.0f,0.0f,0.0f,1.0f));

(r,u和t都是__m128的实例)

那些熟悉使用xmmintrin.h的人会知道_MM_TRANSPOSE4_PS实际上不是一个函数,而是一个宏,它扩展为:

/* Transpose the 4x4 matrix composed of row[0-3].  */
#define _MM_TRANSPOSE4_PS(row0, row1, row2, row3)           \
do {                                    \
  __v4sf __r0 = (row0), __r1 = (row1), __r2 = (row2), __r3 = (row3);    \
  __v4sf __t0 = __builtin_ia32_unpcklps (__r0, __r1);           \
  __v4sf __t1 = __builtin_ia32_unpcklps (__r2, __r3);           \
  __v4sf __t2 = __builtin_ia32_unpckhps (__r0, __r1);           \
  __v4sf __t3 = __builtin_ia32_unpckhps (__r2, __r3);           \
  (row0) = __builtin_ia32_movlhps (__t0, __t1);             \
  (row1) = __builtin_ia32_movhlps (__t1, __t0);             \
  (row2) = __builtin_ia32_movlhps (__t2, __t3);             \
  (row3) = __builtin_ia32_movhlps (__t3, __t2);             \
} while (0)

那么……是什么导致我的编译错误?我不知道在这里重新定义任何东西.当我使用MSVC时,这个完全相同的代码编译并运行得非常好.

解决方法:

你需要改变:

_MM_TRANSPOSE4_PS(r, u, t, _mm_setr_ps(0.0f, 0.0f, 0.0f, 1.0f));

至:

__m128 v = _mm_setr_ps(0.0f, 0.0f, 0.0f, 1.0f);
_MM_TRANSPOSE4_PS(r, u, t, v);

因为这是一个就地转置,4个输入向量也用于输出.

标签:c,gcc,visual-c,sse,intrinsics
来源: https://codeday.me/bug/20190830/1768997.html