我在C中有这个函数。当我使用像:movss,movaps,movups这样的函数时,所有工作都是正确的,而当我使用像:movupd,movapd,ecc这样的结构时......它不起作用..并返回奇怪的值
使用movaps,movups,ecc ..
工作的代码C:
extern float test(float* a,float* b, int num, int spuri, float* res);
int main(int argc, char** argv) {
float a[] = { 1.0, 2.0, 3.0, 4.0, 6.0, 9.0 };
float b[] = { 3.0, 4.0, 4.0, 5.0, 5.0, 8.0 };
int d=6;
int num=d/4;
int spuri=d-(num*4);
float res=-1.0;
test(a,b,num,spuri,&res);
printf("res: %f\n",res);
return 1;
}
NASM:
%include "sseutils.nasm"
section .data
section .bss
alignb 16
A: resd 1
T: resd 4
section .text
global test
a equ 8
b equ 12
num equ 16
spuri equ 20
result equ 24
test:
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov esi, [ebp+a]
mov edi, [ebp+b]
mov ebx, 0
mov ecx, [ebp+num]
mov edx, [ebp+spuri]
mov eax,[ebp+result]
xorps xmm1,xmm1
xorps xmm3,xmm3
loop1:
cmp ecx,0
je loop2
movups xmm0, [esi+ebx]
movups xmm6, [edi+ebx]
subps xmm0, xmm6
mulps xmm0, xmm0
sqrtps xmm0, xmm0
addps xmm1, xmm0
add ebx, 16
dec ecx
jnz loop1
loop2:
cmp edx,0
je end
movss xmm2,[esi+ebx]
movss xmm7,[edi+ebx]
subps xmm2, xmm7
mulps xmm2, xmm2
sqrtps xmm2, xmm2
addps xmm3, xmm2
add ebx,4
dec edx
jnz loop2
end:
haddps xmm1,xmm1
haddps xmm1,xmm1
addps xmm1,xmm3
movups [eax],xmm1
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret
这返回正确的值,但我需要更高的精度,因为数字是浮点数,需要使用movupd或类似的结构..
如何修改以前的代码以使用MOVUPD,MOVAPD或类似的指令?