【问题标题】:How to overload +, -, *, /, /=, etc operators for __m128 SSE type using Apple GCC 4.2.1?如何使用 Apple GCC 4.2.1 为 __m128 SSE 类型重载 +、-、*、/、/= 等运算符?
【发布时间】:2011-04-18 13:00:44
【问题描述】:

我正在将游戏移植到 OS X,它使用运算符重载 __m128 类型,例如:

__forceinline __m128 operator - ( __m128 a, __m128 b )
{
    return _mm_sub_ps ( a, b );
}

__forceinline __m128 operator * ( __m128 a, __m128 b )
{
    return _mm_mul_ps ( a, b );
}

Apple GCC v4.2.1 给了我以下错误:

错误:'浮动矢量 运算符-(float vector, float vector)' 必须有一个类或枚举类型的参数

错误:'浮动矢量 operator*(float vector, float vector)' 必须有一个类或枚举类型的参数

我找到了link,将此类错误描述为GCC bug,在v4.0中已解决...

现在我完全迷路了...请帮我解决这个问题...

【问题讨论】:

  • 为什么__m128需要重载运算符?内置的-* 运算符已经生成了subpsmulps 指令。
  • 其实这是一个有趣的问题,KennyTM...你能告诉我,如果 -=、+=、*= 和 /= 运算符也在 GCC 中实现?
  • 我也担心下面的代码: typedef __m128 Vec3sse_t; __forceinline bool 运算符 == ( Vec3sse_t a, Vec3sse_t b ); { __m128 c = _mm_cmpneq_ps (a, b);整数掩码 = _mm_movemask_ps ( c ) & 7;返回掩码 == 0;如果我删除这种逻辑,一切都会正常吗?
  • 对不起,我似乎无法格式化我的 cmets...
  • @I_really:如果还实现了 -=、+=、*= 和 /= 运算符 - 是的。

标签: gcc operators


【解决方案1】:

我正在使用 g++ 4.6.1 并在类似情况下发现相同的错误消息,当两个参数都是内置类型时会发生这种情况:

算法运算符+(const char* a,double b); 算法运算符+(double a,const char* b);

我知道重新定义 +(int,int) 会很棘手,因为编译器依赖它来进行计算,thouse 计算发生在编译时,而不是运行时,所以您提供的代码在编译时不可用并且稍后在运行时,数据已经计算完毕。

太糟糕了,我们不能这样做,它应该被允许用于内置类型,只要类型不同(我的情况就是这样)并且对于这种情况,编译器没有默认答案。

对于 +(int,int) 的情况,我认为由于上述原因,它永远不会被允许。除非编译器接受某种参数以将该计算留给运行时(而且我还没有检查那种参数)。我认为浮动也发生了类似的事情。

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2010-10-21
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多