000
19.04.2009, 16:45 Uhr
buchkogler
|
Hallo!
Ich muss eine Methode schreiben, die den Assembler Befehl FMUL implementiert. Mein Code funktioniert solange wie das Ergebnis nicht gerundet werden muss (max 23 Bit). Ich brauche einen kleinen Denkanstoß, wie man das machen kann (Exponenten erhöhen, Mantisse runden...)?? Hab im Moment leider keine Idee!!
void Fpu::fmul_stack(unsigned int reg_num) { check_underflow();
unsigned int x_sign = read_sign(getRegister(reg_num)); unsigned int y_sign = read_sign(st_[getTOP()]);
unsigned int x_exponent = read_exponent(getRegister(reg_num)); unsigned int y_exponent = read_exponent(st_[getTOP()]);
unsigned int x_mantissa = read_mantissa(getRegister(reg_num)); unsigned int y_mantissa = read_mantissa(st_[getTOP()]);
//Berechnung Exponenten und Normieren der reduzierten Mantissen:
unsigned int mask_norm_mantissa = 0x800000; unsigned int x_norm_mantissa = (x_mantissa | mask_norm_mantissa); unsigned int y_norm_mantissa = (y_mantissa | mask_norm_mantissa);
unsigned int exponent_dez_x = x_exponent - 127; unsigned int exponent_dez_y = y_exponent - 127;
//Bestimmung des vorläufigen Exponenten e~z: //e~z = ex + ey
unsigned int z_exponent = exponent_dez_x + exponent_dez_y;
//Multiplikation der Mantissen: //m~z = mx * my
unsigned long long z_mantissa = 0;
if((x_mantissa == 0) && (x_exponent == 0x7f)) //wenn x-operand = 1 { z_mantissa = y_mantissa; }
else if((y_mantissa == 0) && (y_exponent == 0x7f)) //wenn y-operand = 1 { z_mantissa = x_mantissa; }
else { z_mantissa = x_norm_mantissa * y_norm_mantissa;
// z_exponent++; } /* Normierung der Mantisse und Anpassung des Exponenten: Die normierte Mantisse mz erhalten wir, indem wir die Kommastelle von m~z um nach links verrücken. Somit ergibt sich der resultierende Exponenten ez, indem wir e~z erhöhen. ?? */
/*Bestimmung des Vorzeichens: XOR */
unsigned int z_sign = (x_sign ^ y_sign);
/*Kodierung des Ergebnisses: Mantisse runden wenn z_mantisse größer als 23 Bit*/
//BIAS z_exponent += 127; unsigned int result = 0x0;
//Werte einlesen result = (z_exponent << 23) | z_mantissa; if(z_sign) result |= 0x80000000;
st_[getTOP()] = result;
} Dieser Post wurde am 19.04.2009 um 16:48 Uhr von buchkogler editiert. |