我试图使用硬件指令来计算一些数学函数。例如,平方根(sqrtpd指令)。我正在用GCC编译我的C代码。
有人知道强制使用硬件指令编译而不使用libc的gcc选项是什么?或者,如果我需要在源代码上做一些特别的事情? (无需编写asm代码)。
答案 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]