示例#1
0
 // Move (From/To) IC
 public void mfic()
 {
     //throw (new NotImplementedException());
     MipsMethodEmiter.SaveGPR(RT, () =>
     {
         MipsMethodEmiter.LoadFieldPtr(typeof(CpuThreadState).GetField("IC"));
         MipsMethodEmiter.ILGenerator.Emit(OpCodes.Ldind_I4);
     });
 }
示例#2
0
        // S000 <-- S(Matrix)(Column)(Row)
        private void _VfpuLoadVectorWithIndexPointer(uint Register, uint Index, uint Size, bool Debug = false)
        {
            uint     Line     = BitUtils.Extract(Register, 0, 2);     // 0-3
            uint     Matrix   = BitUtils.Extract(Register, 2, 3);     // 0-7
            LineType LineType = LineType.None;
            uint     Row      = 0;
            uint     Column   = 0;

            if (Size == 1)
            {
                Column = Line;
                Row    = (Register >> 5) & 3;
            }
            else
            {
                uint Offset = (Register & 64) >> (int)(3 + Size);
                LineType = ((Register & 32) == 0) ? LineType.Column : LineType.Row;

                if (LineType == LineType.Row)
                {
                    Column = Offset + Index;
                    Row    = Line;
                }
                else
                {
                    Column = Line;
                    Row    = Offset + Index;
                }
            }

            uint RegisterIndex = Matrix * 16 + Row * 4 + Column;

            if (Debug)
            {
                char C = 'S';
                if (LineType != LineType.None)
                {
                    C = (LineType == LineType.Row) ? 'R' : 'C';
                }
                Console.Error.WriteLine(
                    "_VfpuLoadVectorWithIndexPointer(R={0},I={1},S={2}): " +
                    "{9}{3}{4}{5} Index({1}) :: Matrix={3}, Column={4}, Row={5}, Type={6}, " +
                    "RegisterIndex={7}, Line={8}",
                    Register, Index, Size,
                    Matrix, Column, Row, LineType,
                    RegisterIndex,
                    Line, C
                    );
            }

            //if (Reg == null) throw(new InvalidOperationException("Invalid Vfpu register"));
            MipsMethodEmiter.LoadFieldPtr(typeof(CpuThreadState).GetField("VFR" + RegisterIndex));
        }