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


Log in to reply