在 AMD 处理器上从 SSE 向量中提取的有效方法

Effective way to extract from SSE vector on AMD processors

我正在寻找一种从 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() - 在此处理器上无效。它生成具有 10 个周期延迟的 PEXTRQ 指令(与 Intel 处理器中的 2-3 个周期相比)。 有没有更好的方法来做到这一点?

一种可能是使用 MOVDQ2Q,它在打桩机上有 2 条指令的延迟:

static inline int64_t extractlo_64(const __m128i v)
{
    return _m_to_int64(_mm_movepi64_pi64(v)); // MOVDQ2Q + MOVQ
}

在 x86-64 上,您可以使用 _mm_cvtsi128_si64,它转换为单个 MOVQ r64, xmm 指令