使用 asm 代码重新实现 AVX2 内部函数

Re-implement the AVX2 intrincs using asm code

大家好。 由于某些特殊原因,我们不得不像下面这样重新实现 AVX2 intrics:

static __inline __m256i __attribute__((__always_inline__, __nodebug__))
    _xmm256_and_si256(__m256i s1, __m256i s2){

    __m256i result;

    __asm__ ("vpand %2, %1, %0": "=r"(result): "rm" "s1", "rm" "s2" ) ;
    // sorry, this statement does not work

    return result; 
}

对应的函数是_mm256_and_si256(__m256i s1, __m256i s2),是一个AVX2 intrincs。 在搜索 google 之后,我发现了一些类似的东西,例如将 intfloatlong 等基本类型连接到输入寄存器。 但是,我仍然没有找到将输入参数 s1s2 连接到用于 asm [=19] 的输入寄存器 ymm1ymm2 的方法=] 代码。

所以这里有人愿意帮助我使上面的例子工作吗? 非常感谢您!!

r 约束是针对通用寄存器的,无论如何,您的 asm 块语法错误。 avx 的适当约束是 x,并且还要注意内存中只能有一个操作数(尽管这可能是其中之一,此模板不处理)。此外 nodebug 属性似乎不存在。

因此,像这样的东西会更好:

__attribute__((always_inline)) inline __m256i
_xmm256_and_si256(__m256i s1, __m256i s2)
{
    __m256i result;
    __asm__ ("vpand %2, %1, %0" : "=x"(result) : "x"(s1), "xm"(s2) );
    return result;
}