我在一个使用非常旧版本的gcc的组织工作,该组织不支持sse4内在函数。
是否可以编写_mm_blendv_pd的内联asm等效版本?
当然,我使用的gcc版本不知道相应的操作码。我想知道是否有办法直接指定操作码的十六进制代码而不是使用其助记符。
任何帮助或参考都会受到很大的影响。感谢
问候
答案 0 :(得分:2)
在GCC inline asm中,您可以通过
添加操作码.byte 0xfe, 0x09, 0x12
答案 1 :(得分:1)
GCC的<smmintrin.h>
确实:
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_blendv_pd (__m128d __X, __m128d __Y, __m128d __M)
{
return (__m128d) __builtin_ia32_blendvpd ((__v2df)__X,
(__v2df)__Y,
(__v2df)__M);
}
所以它需要编译器内置的支持。
但是,您可以在较旧的gcc版本上重新定义它:
typedef double __m128d __attribute__ ((vector_size(16)));
__inline__ __m128d _mm_blendv_pd(__m128d __X, __m128d __Y, __m128d __M)
{
register __m128d m asm("%xmm0") = __M;
register __m128d x asm("%xmm1") = __X;
register __m128d y asm("%xmm2") = __Y;
__asm__ __volatile__ (".byte 0x66, 0xf, 0x38, 0x15, 0xca" : "+x"(x) : "x"(m), "x"(y));
return x;
}
字节序列为BLENDVPD %xmm0,
加上%xmm2, %xmm1
(0b11.001.010
又名0xca
)的Mod R / M字节,以便本地变量的显式寄存器绑定执行其余部分。
通过对这些寄存器进行硬编码,您会失去优化潜力,因为编译器不再可以自由选择任何SSE寄存器。但它会使代码使用它编译一个非常古老的GCC(我尝试过3.4.5并且很好)。
编辑:如果您被gcc 2.x诅咒,不知道矢量数据类型和SSE寄存器(内联的"x"
约束,那么应该说你有怜悯部件)。在这种情况下,不可能“模仿”内在本身。您仍然可以使用带有“手动编码操作码”的内联汇编,但必须通过内存传递参数/返回值。更好......不是。