Пример #1
0
        public static void Vmsr(ArmEmitterContext context)
        {
            OpCode32SimdSpecial op = (OpCode32SimdSpecial)context.CurrOp;

            Delegate dlg;

            switch (op.Sreg)
            {
            case 0b0000:     // FPSID
                throw new NotImplementedException("Supervisor Only");

            case 0b0001:     // FPSCR
                dlg = new _Void_U32(NativeInterface.SetFpscr); break;

            case 0b0101:     // MVFR2
                throw new NotImplementedException("MVFR2");

            case 0b0110:     // MVFR1
                throw new NotImplementedException("MVFR1");

            case 0b0111:     // MVFR0
                throw new NotImplementedException("MVFR0");

            case 0b1000:     // FPEXC
                throw new NotImplementedException("Supervisor Only");

            default:
                throw new NotImplementedException($"Unknown VMSR 0x{op.RawOpCode:X8} at 0x{op.Address:X16}.");
            }

            context.Call(dlg, GetIntA32(context, op.Rt));
        }
Пример #2
0
        public static void Mcr(ArmEmitterContext context)
        {
            OpCode32System op = (OpCode32System)context.CurrOp;

            if (op.Coproc != 15)
            {
                InstEmit.Und(context);
                return;
            }

            if (op.Opc1 != 0)
            {
                throw new NotImplementedException($"Unknown MRC Opc1 0x{op.Opc1:X16} at 0x{op.Address:X16}.");
            }

            Delegate dlg;

            switch (op.CRn)
            {
            case 13:     // Process and Thread Info.
                if (op.CRm != 0)
                {
                    throw new NotImplementedException($"Unknown MRC CRm 0x{op.CRm:X16} at 0x{op.Address:X16}.");
                }
                switch (op.Opc2)
                {
                case 2:
                    dlg = new _Void_U32(NativeInterface.SetTpidrEl032); break;

                default:
                    throw new NotImplementedException($"Unknown MRC Opc2 0x{op.Opc2:X16} at 0x{op.Address:X16}.");
                }
                break;

            case 7:
                switch (op.CRm)     // Cache and Memory barrier.
                {
                case 10:
                    switch (op.Opc2)
                    {
                    case 5:             // Data Memory Barrier Register.
                        return;         // No-op.

                    default:
                        throw new NotImplementedException($"Unknown MRC Opc2 0x{op.Opc2:X16} at 0x{op.Address:X16}.");
                    }

                default:
                    throw new NotImplementedException($"Unknown MRC CRm 0x{op.CRm:X16} at 0x{op.Address:X16}.");
                }

            default:
                throw new NotImplementedException($"Unknown MRC 0x{op.RawOpCode:X8} at 0x{op.Address:X16}.");
            }

            context.Call(dlg, GetIntA32(context, op.Rt));
        }