Ejemplo n.º 1
0
        private void CauseFPUException(FPUExceptionType exceptionType)
        {
            Boolean causeCP0Exception = false;

            switch (exceptionType)
            {
                default: break;

                case FPUExceptionType.Invalid:
                    {
                        if (MipsState.FCR31.EnableInvalidOperation)
                        {
                            MipsState.FCR31.CauseInvalidOperation = true;
                            causeCP0Exception = true;
                        }
                        else
                        {
                            MipsState.FCR31.FlagInvalidOperation = true;
                        }
                        break;
                    }

                case FPUExceptionType.Inexact:
                    {
                        if (MipsState.FCR31.EnableInexact)
                        {
                            MipsState.FCR31.CauseInexact = true;
                            causeCP0Exception = true;
                        }
                        else
                        {
                            MipsState.FCR31.FlagInexact = true;
                        }
                        break;
                    }

                case FPUExceptionType.DivideByZero:
                    {
                        if (MipsState.FCR31.EnableDivideByZero)
                        {
                            MipsState.FCR31.CauseDivideByZero = true;
                            causeCP0Exception = true;
                        }
                        else
                        {
                            MipsState.FCR31.FlagDivideByZero = true;
                        }
                        break;
                    }

                case FPUExceptionType.Overflow:
                    {
                        if (MipsState.FCR31.EnableOverflow)
                        {
                            MipsState.FCR31.CauseOverflow = true;
                            causeCP0Exception = true;
                        }
                        else
                        {
                            MipsState.FCR31.FlagOverflow = true;
                        }
                        break;
                    }

                case FPUExceptionType.Underflow:
                    {
                        if (MipsState.FCR31.EnableUnderflow)
                        {
                            MipsState.FCR31.CauseUnderflow = true;
                            causeCP0Exception = true;
                        }
                        else
                        {
                            MipsState.FCR31.FlagUnderflow = true;
                        }
                        break;
                    }

                case FPUExceptionType.Unimplemented:
                    {
                        causeCP0Exception = true;
                        break;
                    }
            }

            if (causeCP0Exception)
                CauseException = ExceptionCode.FloatingPoint;
        }
Ejemplo n.º 2
0
        private void CauseFPUException(FPUExceptionType exceptionType)
        {
            Boolean causeCP0Exception = false;

            switch (exceptionType)
            {
            default: break;

            case FPUExceptionType.Invalid:
            {
                if (MipsState.FCR31.EnableInvalidOperation)
                {
                    MipsState.FCR31.CauseInvalidOperation = true;
                    causeCP0Exception = true;
                }
                else
                {
                    MipsState.FCR31.FlagInvalidOperation = true;
                }
                break;
            }

            case FPUExceptionType.Inexact:
            {
                if (MipsState.FCR31.EnableInexact)
                {
                    MipsState.FCR31.CauseInexact = true;
                    causeCP0Exception            = true;
                }
                else
                {
                    MipsState.FCR31.FlagInexact = true;
                }
                break;
            }

            case FPUExceptionType.DivideByZero:
            {
                if (MipsState.FCR31.EnableDivideByZero)
                {
                    MipsState.FCR31.CauseDivideByZero = true;
                    causeCP0Exception = true;
                }
                else
                {
                    MipsState.FCR31.FlagDivideByZero = true;
                }
                break;
            }

            case FPUExceptionType.Overflow:
            {
                if (MipsState.FCR31.EnableOverflow)
                {
                    MipsState.FCR31.CauseOverflow = true;
                    causeCP0Exception             = true;
                }
                else
                {
                    MipsState.FCR31.FlagOverflow = true;
                }
                break;
            }

            case FPUExceptionType.Underflow:
            {
                if (MipsState.FCR31.EnableUnderflow)
                {
                    MipsState.FCR31.CauseUnderflow = true;
                    causeCP0Exception = true;
                }
                else
                {
                    MipsState.FCR31.FlagUnderflow = true;
                }
                break;
            }

            case FPUExceptionType.Unimplemented:
            {
                causeCP0Exception = true;
                break;
            }
            }

            if (causeCP0Exception)
            {
                CauseException = ExceptionCode.FloatingPoint;
            }
        }