我正在优化我的代码,并且来到这个
#include <math.h>
typedef double vector __attribute__((vector_size(16)));
double norm_vector(vector u) {
vector w = u*u;
return sqrt(w[0]+w[1]);
}
我发现用
进行编译gcc -xc -std=gnu11 -O3 -Wall -Wextra -fno-verbose-asm -march=haswell
在调用sqrt
之前执行vucomisd
指令
norm_vector:
vmulpd xmm0, xmm0, xmm0
vhaddpd xmm1, xmm0, xmm0
vsqrtsd xmm0, xmm0, xmm1
vucomisd xmm0, xmm0
jp .L13
ret
.L13:
sub rsp, 8
vmovapd xmm0, xmm1
call sqrt
add rsp, 8
ret
是否注意sqrt
的论证是非负面的?在我想避免这个调用的情况下(因为根据定义,参数将为正),如何做到这一点?