public void div() { MipsMethodEmiter.ILGenerator.Emit(OpCodes.Ldarg_0); MipsMethodEmiter.LoadGPR_Signed(RS); MipsMethodEmiter.LoadGPR_Signed(RT); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Call, typeof(CpuEmiter).GetMethod("_div_impl")); }
///////////////////////////////////////////////////////////////////////////////////////////////// // MULTiply (Unsigned). ///////////////////////////////////////////////////////////////////////////////////////////////// public void _mult_common_op(OpCode ConvOp) { MipsMethodEmiter.LoadGPR_Signed(RS); MipsMethodEmiter.ILGenerator.Emit(ConvOp); MipsMethodEmiter.LoadGPR_Signed(RT); MipsMethodEmiter.ILGenerator.Emit(ConvOp); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Mul); }
public void mtc1() { MipsMethodEmiter.SaveFPR(FS, () => { MipsMethodEmiter.LoadGPR_Signed(RT); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Call, typeof(MathFloat).GetMethod("ReinterpretIntAsFloat")); }); }
private void __branch_pre_v0(bool Link, params OpCode[] OpCodeList) { MipsMethodEmiter.StoreBranchFlag(() => { MipsMethodEmiter.LoadGPR_Signed(RS); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Ldc_I4_0); foreach (var OpCode in OpCodeList) { MipsMethodEmiter.ILGenerator.Emit(OpCode); } }); }
private void _branch_pre_vv(params OpCode[] OpCodeList) { MipsMethodEmiter.StoreBranchFlag(() => { MipsMethodEmiter.LoadGPR_Signed(RS); MipsMethodEmiter.LoadGPR_Signed(RT); foreach (var OpCode in OpCodeList) { MipsMethodEmiter.ILGenerator.Emit(OpCode); } }); }
/// <summary> /// ID("mtv", VM("010010:00:111:rt:0:0000000:0:vd"), "%t, %zs", ADDR_TYPE_NONE, INSTR_TYPE_PSP), /// </summary> public void mtv() { /* * Console.Error.WriteLine("MTV:{0}", Instruction.VD); * _VfpuLoadVectorWithIndexPointer(Instruction.VD, 0, 1); * MipsMethodEmiter.LoadGPR_Signed(Instruction.RT); * MipsMethodEmiter.CallMethod(typeof(MathFloat), "ReinterpretIntAsFloat"); * MipsMethodEmiter.ILGenerator.Emit(OpCodes.Stind_R4); */ VectorOperationSaveVd(1, (Index, Load) => { MipsMethodEmiter.LoadGPR_Signed(RT); MipsMethodEmiter.CallMethod(typeof(MathFloat), "ReinterpretIntAsFloat"); }); }
// Load/Store Vfpu (Left/Right)_ public void lv_s() { uint vt = Instruction.VT5 | (Instruction.VT2 << 5); uint s = (vt >> 5) & 3; uint m = (vt >> 2) & 7; uint i = (vt >> 0) & 3; uint offset = Instruction.IMM14 * 4; MipsMethodEmiter._getmemptr(() => { MipsMethodEmiter.LoadGPR_Signed(RS); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Ldc_I4, offset); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Add); }); //MipsMethodEmiter.LoadVFPR(m * 16 + s * 4 + i); //VfpuLoad_Register( //setVprInt(m, i, s, memory.read32(gpr[rs] + simm14_a16)); throw (new NotImplementedException("lv_s")); }
///////////////////////////////////////////////////////////////////////////////////////////////// // MAXimum/MINimum. ///////////////////////////////////////////////////////////////////////////////////////////////// private void _max_min(OpCode BranchOpCode) { var LabelIf = MipsMethodEmiter.ILGenerator.DefineLabel(); var LabelElse = MipsMethodEmiter.ILGenerator.DefineLabel(); var LabelEnd = MipsMethodEmiter.ILGenerator.DefineLabel(); MipsMethodEmiter.LoadGPR_Signed(RS); MipsMethodEmiter.LoadGPR_Signed(RT); MipsMethodEmiter.ILGenerator.Emit(BranchOpCode, LabelElse); // IF MipsMethodEmiter.ILGenerator.MarkLabel(LabelIf); MipsMethodEmiter.SET_REG(RD, RS); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Br, LabelEnd); // ELSE MipsMethodEmiter.ILGenerator.MarkLabel(LabelElse); MipsMethodEmiter.SET_REG(RD, RT); MipsMethodEmiter.ILGenerator.Emit(OpCodes.Br, LabelEnd); // END MipsMethodEmiter.ILGenerator.MarkLabel(LabelEnd); }