// 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); }); }
// 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)); }