ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – _MM_TRANSPOSE4_PS导致GCC编译错误?

2019-08-30 15:06:31  阅读:232  来源: 互联网

标签:c gcc visual-c sse intrinsics


我是第一次在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有