Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }