/// <summary> /// Floating-Point Convert to Single from Double命令 /// 浮動小数点レジスタrs1の倍精度浮動小数を単精度浮動小数に変換して、浮動小数点レジスタrdに書き込む /// </summary> /// <param name="rd">結果を格納するレジスタ番号</param> /// <param name="rs1">レジスタ番号</param> /// <returns>処理の成否</returns> public bool FcvtSD(FPRegister rd, FPRegister rs1, FloatRoundingMode frm, UInt32 insLength = 4U) { Binary64 binary1 = reg.GetValue(rs1); Binary32 result; FloatCSR fcsr = 0; Binary32 sign = (Binary32)((binary1 & SignMask) >> 32); if (IsInfinity(binary1)) { // +-∞の場合 result = sign | RV32_SingleFpu.Infinity; } else if (IsZero(binary1)) { // +-0の場合 result = sign | RV32_SingleFpu.Zero; } else if (IsSigNaN(binary1)) { // シグナリングNaNの場合 fcsr.NV = true; result = RV32_SingleFpu.NaN; } else if (IsQuietNaN(binary1)) { result = RV32_SingleFpu.NaN; } else { result = RV32_SingleFpu.ToBinary((Single)ToDouble(binary1)); if (RV32_SingleFpu.ToSingle(result) != ToDouble(binary1)) { // 結果が一致しない場合 fcsr.NX = true; if (ToDouble(binary1) > 0) { fcsr.OF = true; } else { fcsr.UF = true; } } } reg.SetValue(rd, result); reg.SetFflagsCSR(fcsr); reg.IncrementPc(insLength); return(true); }
/// <summary> /// Floating-Point Convert to Double from Single命令 /// 浮動小数点レジスタrs1の単精度浮動小数を倍精度浮動小数に変換して、浮動小数点レジスタrdに書き込む /// </summary> /// <param name="rd">結果を格納するレジスタ番号</param> /// <param name="rs1">レジスタ番号</param> /// <returns>処理の成否</returns> public bool FcvtDS(FPRegister rd, FPRegister rs1, FloatRoundingMode frm, UInt32 insLength = 4U) { Binary32 binary1 = (Binary32)reg.GetValue(rs1); Binary64 result; FloatCSR fcsr = 0; result = ToBinary((Double)RV32_SingleFpu.ToSingle(binary1)); reg.SetValue(rd, result); reg.SetFflagsCSR(fcsr); reg.IncrementPc(insLength); return(true); }