sqrt von unsigned long long
-
Hi
// Berechnet die Quadratwurzel eine Variable des Typs unsigned long long ullong ulsqrt(ullong num){ __asm { // Double word move (64bit) movq mm1,num // Konvertiere two double int (64bit) to double pr. float (128bit) cvtpi2pd xmm0,mm1 // Quadratwurzel ziehen sqrtsd xmm0,xmm0 // Konvertiere double pr. float (128bit) to two double int (64bit) cvtpd2pi eax,xmm0 } }
Ich habe das Equivalent zu return sqrt( (long double) num); programmiert. Leider passt etwas nicht. cvtpd2pi verlangt als Destination ein MMX Register was eax aber nicht ist. Wie bekomme ich das denn trotzdem hin?
MfG Joe
-
Du schreibst den Kram zuerst in ein MMX-Register und das verteilst du dann auf eax (untere 32Bit) und edx (obere 32Bit).
Wie du dabei genau vorgehen musst, kann ich dir nicht sagen - zu wenig Ahnung vom MMX Befehlssatz.
-
Hi
Vielen Dank mit deiner Hilfe habe ich es hinbekommen:
// Berechnet die Quadratwurzel einer Variable des Typs unsigned long long ullong ullsqrt(ullong num){ __asm { // Double word move (64bit) movq mm1,num // Konvertiere two double int (64bit) to double pr. float (128bit) cvtpi2pd xmm0,mm1 // Quadratwurzel ziehen sqrtsd xmm1,xmm0 // Konvertiere double pr. float (128bit) to two double int (64bit) cvtpd2pi mm0,xmm1 // Kopiert lower 32bit nach eax movd eax,mm0 // Rechtsshift um 32bit psrlq mm0,20 // Kopiert lower 32bit nach edx movd edx,mm0 } }
MfG Joe