我正在寻找一种有效的方法从AMD Piledriver上的__m128i中提取低64位整数。像这样:
static inline int64_t extractlo_64(__m128i x)
{
int64_t result;
// extract into result
return result;
}
Instruction tables说使用_mm_extract_epi64()的常用方法在此处理器上无效。它生成PEXTRQ指令,其延迟为10个周期(与英特尔处理器中的2-3个周期相比)。 有没有更好的方法呢?
答案 0 :(得分:4)
在x86-64上,您可以使用_mm_cvtsi128_si64
,转换为单MOVQ r64, xmm
条指令
答案 1 :(得分:1)
一种可能性是使用MOVDQ2Q
,其在Piledriver上有2个指令的延迟:
static inline int64_t extractlo_64(const __m128i v)
{
return _m_to_int64(_mm_movepi64_pi64(v)); // MOVDQ2Q + MOVQ
}