我正在寻找一个有效的方法,从__m128i上提取64位整数更低的皮拉德河。就像这样:
static inline int64_t extractlo_64(__m128i x)
{
int64_t result;
// extract into result
return result;
}
指令表说,通用方法--使用_mm_extract_epi64() --在这个处理器上是无效的。它生成PEXTRQ指令,其延迟时间为10个周期(与英特尔处理器中的2-3个周期相比)。有什么更好的方法吗?
发布于 2015-06-11 03:05:13
在x86-64上,您可以使用_mm_cvtsi128_si64
,这可以转换成一个MOVQ r64, xmm
指令。
发布于 2015-06-10 10:41:31
一种可能是使用MOVDQ2Q
,它在Piledriver上的延迟为2条指令:
static inline int64_t extractlo_64(const __m128i v)
{
return _m_to_int64(_mm_movepi64_pi64(v)); // MOVDQ2Q + MOVQ
}
https://stackoverflow.com/questions/30737065
复制相似问题