我将一个双精度数组传递给一个函数,如何将每个元素移动到相应的SSE寄存器中?如何将指定值移动到XMM寄存器中?我正在使用AT& T语法和GNU汇编程序。
_variance:
push %rbp
movq %rsp, %rbp
xorq %r8, %r8
movq %rdi, %r9
movsd $0, %xmm1
movsd $0, %xmm2
cvtsi2sd %r9, %xmm3
decq %r9
jmp 2f
1: movd (%rsi, %r8, 8), %xmm0
addsd %xmm0, %xmm2
mulsd %xmm0, %xmm0
addsd %xmm0, %xmm1
incq %r8
2: cmpq %r8, %r9
jl 1b
divsd %xmm3, %xmm1
divsd %xmm3, %xmm2
mulsd %xmm2, %xmm2
subsd %xmm1, %xmm2
movsd %xmm2, %xmm0
pop %rbp
ret
.size _variance,.-variance
这是C程序:
#include<stdio.h>
variance(int n, double x[]);
int main(void) {
double array[10] = {5.5, 3.4, 7.7, 3.2, 9.1, 113.5, .125, 33.2, 93.2, .00001};
int number = 10;
double answer = variance(number, array);
printf("Variance is: %d\n", answer);
return 0;
}
我正在计算一系列变量的方差。这是功能:
double sum1, sum2;
int i = 0;
while(i < n-1) {
sum1 = sum1 + (x[i] * x[i]);
sum2 = sum2 + x[i];
}
sum1 = sum1 / n;
sum2 = sum2 / n;
sum2 = sum2 * sum2;
return sum1 - sum2;