硬件平方根gcc

时间:2014-04-07 14:51:44

标签: c gcc assembly

我试图使用硬件指令来计算一些数学函数。例如,平方根(sqrtpd指令)。我正在用GCC编译我的C代码。

有人知道强制使用硬件指令编译而不使用libc的gcc选项是什么?或者,如果我需要在源代码上做一些特别的事情? (无需编写asm代码)。

4 个答案:

答案 0 :(得分:3)

在gcc上你应该使用__builtin_ia32_sqrtpd

答案 1 :(得分:3)

最简单的方法是使用优化标志。 -O1生成

sqrtsd %xmm1, %xmm0

汇编代码中的

。尝试在gcc中使用-S标志来生成程序集,并查看优化标志的工作原理。

答案 2 :(得分:0)

即使您不想编写'asm code',它也是GCC内联汇编的单线程,如果您想强制使用指令,也值得考虑。对于某些double(u)

double sqrt_val;
__asm__ ("sqrtsd %1, %0" : "=x" (sqrt_val) : "x" (u));

内存源操作数也是合法的选择:

__asm__ ("sqrtsd %1, %0" : "=x" (sqrt_val) : "xm" (u));

这适用于GCC,它会(通常)在更有效的情况下使用寄存器,但可以从内存加载值。对于clang来说并不是那么好,当给出替代"m"约束时,它总是!将寄存器溢出到内存中。我会选择第一个表格。

如果您实际在__m128d类型(u)中找到压缩平方根:

__m128d sqrt_val;
__asm__ ("sqrtpd %1, %0" : "=x" (sqrt_val) : "x" (u));

答案 3 :(得分:-2)

为什么不直接在汇编代码中编写所需的硬件指令。

据我所知,可以直接在c代码中编写汇编代码。它被称为内联汇编。 [见这里:http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html]