2016-05-28 24 views
0

Ich habe eine externe Funktion zu verdoppeln.Convert int in AVX x86

Ich versuchte mit: vcvtsi2sd und cvtsi2sd, aber es funktioniert nicht.

Edit:

Hier ist meine .asm Datei

.model flat,c  
.code 

; Function declatation: 
; int calculateAreaUnderCurve_(double startPoint, double endPoint, 
; int numberOfTrapezes, double* coefficients, double* result); 

calculateAreaUnderCurve_ proc 
     push ebp 
     mov ebp,esp 

; Load argument values 
     vmovsd xmm1,real8 ptr [ebp+8]  ;xmm1 = startPoint 
     vmovsd xmm2,real8 ptr [ebp+16]  ;xmm2 = endPoint 
     mov  ebx, [ebp+20]    ;ebx = numberOfTrapezez int value 
     mov  eax, [ebp+28]    ;eax = pointer to coefficients array 
     mov  ecx, [ebp+32]    ;ecx = pointer to result 

     cvtsi2sd xmm3,dword [ebp+20]  ;convert to double 
     movsd real8 ptr [ecx],xmm3   ;save result 
     pop ebp 
     ret 
calculateAreaUnderCurve_ endp 
     end 

Und meine Funktionsaufruf:

int numberOfTrapezes=100; 
//initialize other parameters 
calculateAreaUnderCurve_(startPoint,endPoint,numberOfTrapezes, coefficients, &result); 

Als Ergebnis i seltsame Zahl bekommen 1.0761e+09

+0

Sie wahrscheinlich von clobbering ebx abstürzen. Verwenden Sie einfach 'vcvtsi2sd' mit einem Speicheroperanden, wenn Sie Code für eine beschissene Aufrufkonvention wie 32bit x86 schreiben, die Argumente auf dem Stack übergibt. –

+0

Welche CPU benutzen Sie? 'vcvtsi2sd' ist AVX-512, nicht AVX. –

+1

@PaulR Ich würde noch einmal auf die Instruktionssatz-Referenz schauen, wenn ich Sie wäre. – EOF

Antwort

6
vmovsd xmm1,real8 ptr [ebp+8]  ;xmm1 = startPoint 
vmovsd xmm2,real8 ptr [ebp+16]  ;xmm2 = endPoint 
mov  ebx, [ebp+20]    ;ebx = numberOfTrapezez int value 

Sie rufen die NummerOffTrapezez von der falschen Adresse ab! Die endPoint 8 Bytes belegt, so dass die von 20 bis 24 Offset ändern

mov ebx, [ebp+24] 

und auch

cvtsi2sd xmm3,dword [ebp+24]  ;convert to double