2016-05-28 5 views
0

У меня есть внешняя функция:Преобразовать INT удвоится в AVX x86

extern "C" void calculateAreaUnderCurve_(double startPoint, double endPoint, int numberOfTrapezes, double* coefficients, double* result); 

Я хотел бы преобразовать numberOfTrapezes в double в моем файле .asm.

Я пробовал: vcvtsi2sd и cvtsi2sd, но это не работает.

Edit:

Вот мой .asm файл

.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 

И мой вызов функции:

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

В результате я получаю странный номер 1.0761e+09

+0

Вы сбою сбивание EBX. Просто используйте 'vcvtsi2sd' с операндом памяти, если вы пишете код для коварного соглашения о вызове, такого как 32-разрядный x86, который передает args в стек. –

+0

Какой процессор вы используете? 'vcvtsi2sd' - это AVX-512, а не AVX. –

+1

@PaulR Я бы еще раз посмотрел ссылку на инструкцию, если бы я был вами. – EOF

ответ

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 

Вы получаете numberOfTrapezez с неправильного адреса! ENDPOINT занимает 8 байт, поэтому изменить смещение от 20 до 24.

mov ebx, [ebp+24] 

, а также

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

 Смежные вопросы

  • Нет связанных вопросов^_^