Nutzung der oberen 18 Bit des Ergebisses beim MUL Befehl im SFR_MUL Register beim GCC

Im GCC kann das Produkt der Multiplikation von 18*18 Bit als long mit 36 Bit berechnet werden. Dazu wurde eine spezielle Funktion mit der Bezeichnung mul36 geschaffen.

mul36(faktor1, faktor2);

#include <mul36.h>

	long	prod	= 0;	// Produkt   36 Bit
	int	fa1     = 0;	// Faktor  1 18 Bit
	int	fa2     = 0;	// Faktor  2 18 Bit

	prod	= mul36(fa1, fa2);

Die Funktion wird im GCC als C-Programm mit Inline-Assembler realisiert:
__asm__("\n.include \"const.s\"");
/*
 * Multiplikation mit 36 Bit Produkt aus 18 Bit * 18 Bit bereitstellen.
 */

long mul36(int fa1, int fa2){
		 long	prod;
	unsigned int	prodl;
	prodl	= fa1;
	__asm__("MUL	%0,	%1":"+r"(prodl):"r"(fa2));
	__asm__("MOVS2I	%0,	SFR_MUL":"=r"(prod));
	prod	= prod << 18;	// SFR Inhalt nach HIGH schieben
	prod	= prod | prodl;	// LOW Einblenden
	return	prod;		// 36 Bit Produkt
}


SpartanMC