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
Вы сбою сбивание EBX. Просто используйте 'vcvtsi2sd' с операндом памяти, если вы пишете код для коварного соглашения о вызове, такого как 32-разрядный x86, который передает args в стек. –
Какой процессор вы используете? 'vcvtsi2sd' - это AVX-512, а не AVX. –
@PaulR Я бы еще раз посмотрел ссылку на инструкцию, если бы я был вами. – EOF