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