示例#1
0
 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"));
 }
示例#2
0
 /////////////////////////////////////////////////////////////////////////////////////////////////
 // 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);
 }
示例#3
0
 public void mtc1()
 {
     MipsMethodEmiter.SaveFPR(FS, () =>
     {
         MipsMethodEmiter.LoadGPR_Signed(RT);
         MipsMethodEmiter.ILGenerator.Emit(OpCodes.Call, typeof(MathFloat).GetMethod("ReinterpretIntAsFloat"));
     });
 }
示例#4
0
 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);
         }
     });
 }
示例#5
0
 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);
         }
     });
 }
示例#6
0
        /// <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");
            });
        }
示例#7
0
        // 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"));
        }
示例#8
0
        /////////////////////////////////////////////////////////////////////////////////////////////////
        // 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);
        }