使用 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 之后,我发现了一些类似的东西,例如将 int
、float
和 long
等基本类型连接到输入寄存器。
但是,我仍然没有找到将输入参数 s1
和 s2
连接到用于 asm [=19] 的输入寄存器 ymm1
和 ymm2
的方法=] 代码。
所以这里有人愿意帮助我使上面的例子工作吗?
非常感谢您!!
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;
}
大家好。 由于某些特殊原因,我们不得不像下面这样重新实现 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 之后,我发现了一些类似的东西,例如将 int
、float
和 long
等基本类型连接到输入寄存器。
但是,我仍然没有找到将输入参数 s1
和 s2
连接到用于 asm [=19] 的输入寄存器 ymm1
和 ymm2
的方法=] 代码。
所以这里有人愿意帮助我使上面的例子工作吗? 非常感谢您!!
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;
}