我正在尝试使用内置函数将一些 ASM 代码移植到 C/C++ 中。ASM 代码具有:
+ # Unpack a-h data from the packed vector to a vector register each
+
+ vsldoi 10, 9, 9, 12
+ vsldoi 11, 9, 9, 8
+ vsldoi 12, 9, 9, 4
我找不到内置的 for vec_vsldoi
。当我搜索 IBM 的网站时,我得到0 hits。我认为 vec_sldw
很接近,但它需要 3 个参数而不是 4 个。
我的第一个问题是,有内置的 forvec_vsldoi
吗?如果没有,我们是用vec_sldw
还是别的?
除了 XL C/C++,我们还支持 GCC 4.8。GCC 似乎缺乏这两个内在函数。我想我有一个替代品,但我有保留。一个测试程序显示汇编器可以汇编vsldoi
。
// GCC 4.8 is missing vec_sldw and vec_vsldoi
#if defined(XLC_VERSION)
# define VEC_VSLDOI(a,b,c) vec_vsldoi(a,b,c)
#elif defined(GCC_VERSION)
# define VEC_VSLDOI(a,b,c) VEC_VSLDOI_TEMPLATE<c>(a,b)
template<unsigned int C>
uint8x16_p8 VEC_VSLDOI_TEMPLATE(uint8x16_p8 a, const uint8x16_p8& b)
{
uint8x16_p8 r;
__asm
(
"vsldoi %0, %1, %2, %3 \t\n"
: "=v" (t) : "v" (a), "v" (b), "I" (C) : "cc"
);
return r;
}
#endif
我的第二个问题是,扩展的 GCC ASM 是否正确,还是我们应该做其他事情?