-3

问候大家。由于某些特殊原因,我们必须重新实现 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 内部函数。通过谷歌搜索后,我发现了一些类似的东西,比如连接一些基本类型,比如,int输入寄存器。但是,我仍然没有找到连接输入参数和输入寄存器以及用于 asm代码的方法。floatlongs1s2ymm1ymm2vpand

所以这里的任何人都愿意帮助我使上述示例工作吗?非常感谢你!

4

1 回答 1

4

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;
}
于 2015-09-19T12:02:56.900 回答