public AstNodeStm Vrot()
        {
            var imm5      = _instruction.Imm5;
            var cosIndex  = BitUtils.Extract(imm5, 0, 2);
            var sinIndex  = BitUtils.Extract(imm5, 2, 2);
            var negateSin = BitUtils.ExtractBool(imm5, 4);

            var dest = VecVd;
            var src  = CelVs;

            AstNodeExpr sine   = _ast.CallStatic((Func <float, float>)MathFloat.SinV1, src.Get());
            AstNodeExpr cosine = _ast.CallStatic((Func <float, float>)MathFloat.CosV1, src.Get());

            if (negateSin)
            {
                sine = -sine;
            }

            //Console.WriteLine("{0},{1},{2}", CosIndex, SinIndex, NegateSin);

            return(dest.SetVector(index =>
            {
                if (index == cosIndex)
                {
                    return cosine;
                }
                if (index == sinIndex)
                {
                    return sine;
                }
                return (sinIndex == cosIndex) ? sine : 0f;
            }, _pc));
        }
 public AstNodeStmIfElse(AstNodeExpr condition, AstNodeStm @true, AstNodeStm @false = null)
 {
     //if (False == null) False = new AstNodeStmEmpty();
     Condition = condition;
     True      = @true;
     False     = @false;
 }
Exemple #3
0
 private AstNodeStm CallDynamicAddress(AstNodeExpr address)
 {
     return(_ast.StatementsInline(
                _link(),
                _ast.MethodCacheInfoCallDynamicPc(address, tailCall: false)
                ));
 }
Exemple #4
0
            protected AstNodeExpr GetRegApplyPrefix(int[] indices, int regIndex, int prefixIndex)
            {
                var prefix = VReg.VfpuPrefix;

                prefix.CheckPrefixUsage(Pc);

                //Console.WriteLine("[Get] {0:X8}:: {1}", PC, Prefix.Enabled);
                //Console.WriteLine("GetRegApplyPrefix: {0}, {1}", Indices.Length, RegIndex);

                AstNodeExpr astNodeExpr = _GetVRegRef(indices[regIndex]);

                if (prefix.Enabled && prefix.IsValidIndex(prefixIndex))
                {
                    // Constant.
                    if (prefix.SourceConstant(prefixIndex))
                    {
                        float value       = 0.0f;
                        var   sourceIndex = prefix.SourceIndex(prefixIndex);
                        switch (sourceIndex)
                        {
                        case 0:
                            value = prefix.SourceAbsolute(prefixIndex) ? (3.0f) : (0.0f);
                            break;

                        case 1:
                            value = prefix.SourceAbsolute(prefixIndex) ? (1.0f / 3.0f) : (1.0f);
                            break;

                        case 2:
                            value = prefix.SourceAbsolute(prefixIndex) ? (1.0f / 4.0f) : (2.0f);
                            break;

                        case 3:
                            value = prefix.SourceAbsolute(prefixIndex) ? (1.0f / 6.0f) : (0.5f);
                            break;

                        default: throw (new InvalidOperationException("Invalid SourceIndex : " + sourceIndex));
                        }

                        astNodeExpr = Ast.Cast(GetVTypeType(), value);
                    }
                    // Value.
                    else
                    {
                        astNodeExpr = _GetVRegRef(indices[(int)prefix.SourceIndex(prefixIndex)]);
                        if (prefix.SourceAbsolute(prefixIndex))
                        {
                            astNodeExpr = Ast.CallStatic((Func <float, float>)MathFloat.Abs, astNodeExpr);
                        }
                    }

                    if (prefix.SourceNegate(prefixIndex))
                    {
                        astNodeExpr = Ast.Unary("-", astNodeExpr);
                    }
                }

                return(astNodeExpr);
            }
Exemple #5
0
 public AstNodeStm AssignGPR_F(int index, AstNodeExpr expr)
 {
     if (index == 0)
     {
         return(new AstNodeStmEmpty());
     }
     return(Ast.Assign(GPR_F(index), Ast.Cast <float>(expr, false)));
 }
Exemple #6
0
        //static public void DumpStackTrace()
        //{
        //	Console.WriteLine(Environment.StackTrace);
        //}

        private AstNodeStm ReturnFromFunction(AstNodeExpr astNodeExpr)
        {
            return(_ast.StatementsInline(
                       _ast.AssignPc(_ast.Gpr(31)),
                       _ast.GetTickCall(BranchCount > 0),
                       _ast.Return()
                       ));
        }
        private AstNodeStm _bvtf(bool True)
        {
            var         register   = (int)_instruction.Imm3;
            AstNodeExpr branchExpr = _ast.Vcc(register);

            if (!True)
            {
                branchExpr = _ast.Unary("!", branchExpr);
            }
            return(AssignBranchFlag(branchExpr));
        }
 public AstNodeExprLValue FieldPropertyAccess(AstNodeExpr Instance, string FieldPropertyName)
 {
     if (Instance.Type.GetField(FieldPropertyName) != null)
     {
         return(FieldAccess(Instance, FieldPropertyName));
     }
     if (Instance.Type.GetProperty(FieldPropertyName) != null)
     {
         return(PropertyAccess(Instance, FieldPropertyName));
     }
     throw (new InvalidOperationException(String.Format("Can't find Field/Property '{0}' for type '{1}'", FieldPropertyName, Instance.Type)));
 }
Exemple #9
0
 public AstNodeExprLValue FieldPropertyAccess(AstNodeExpr instance, string fieldPropertyName)
 {
     if (instance.Type.GetField(fieldPropertyName) != null)
     {
         return(FieldAccess(instance, fieldPropertyName));
     }
     if (instance.Type.GetProperty(fieldPropertyName) != null)
     {
         return(PropertyAccess(instance, fieldPropertyName));
     }
     throw new InvalidOperationException(
               $"Can't find Field/Property '{fieldPropertyName}' for type '{instance.Type}'");
 }
Exemple #10
0
 private AstNodeStm JumpDynamicToAddress(AstNodeExpr address)
 {
     if (DynarecConfig.EnableTailCalling)
     {
         return(_ast.MethodCacheInfoCallDynamicPc(address, tailCall: true));
     }
     else
     {
         return(_ast.Statements(
                    _ast.AssignPc(address),
                    _ast.Return()
                    ));
     }
 }
Exemple #11
0
 public AstNodeExpr MemoryGetPointer(PspMemory memory, AstNodeExpr address, bool safe,
                                     string errorDescription = "ERROR", InvalidAddressAsEnum invalidAddress = InvalidAddressAsEnum.Exception)
 {
     if (safe)
     {
         return(Ast.CallInstance(
                    Ast.CpuThreadStateExpr,
                    (AddressToPointerWithErrorFunc)CpuThreadState.Methods.GetMemoryPtrSafeWithError,
                    Ast.Cast <uint>(address),
                    errorDescription,
                    true,
                    Ast.Immediate(invalidAddress)
                    ));
     }
     else
     {
         if (DynarecConfig.AllowFastMemory && memory.HasFixedGlobalAddress)
         {
             if (DynarecConfig.EnableFastPspMemoryUtilsGetFastMemoryReader)
             {
                 return(Ast.CallStatic(FastPspMemoryUtils.GetFastMemoryReader(memory.FixedGlobalAddress),
                                       address));
             }
             else
             {
                 var addressMasked = Ast.Binary(address, "&", Ast.Immediate(FastPspMemory.FastMemoryMask));
                 return(Ast.Immediate(memory.FixedGlobalAddress) + addressMasked);
             }
         }
         else
         {
             return(Ast.CallInstance(
                        Ast.CpuThreadStateExpr,
                        (AddressToPointerFunc)CpuThreadState.Methods.GetMemoryPtr,
                        address
                        ));
         }
     }
 }
        public AstNodeStm _vcmovtf(bool True)
        {
            var register = (int)_instruction.Imm3;

            Func <int, AstNodeExpr> vcc = index =>
            {
                AstNodeExpr ret = _ast.Vcc(index);
                if (!True)
                {
                    ret = _ast.Unary("!", ret);
                }
                return(ret);
            };

            if (register < 6)
            {
                // TODO: CHECK THIS!
                return(_ast.IfElse(
                           vcc(register),
                           VecVd.SetVector(index => VecVs[index], _pc),
                           _ast.Statements(
                               _ast.Assign(_ast.PrefixSourceEnabled(), false),
                               //ast.If(ast.PrefixDestinationEnabled(), VEC_VD.SetVector(Index => VEC_VD[Index], PC))
                               _ast.If(_ast.PrefixDestinationEnabled(), VecVd.SetVector(index => VecVd[index], _pc))
                               )
                           ));
            }

            if (register == 6)
            {
                return(VecVd.SetVector(index => _ast.Ternary(vcc(index), VecVs[index], VecVd[index]), _pc));
            }

            // Register == 7

            // Never copy (checked on a PSP)
            return(_ast.Statement());
        }
Exemple #13
0
        public AstNodeStm MethodCacheInfoCallDynamicPc(AstNodeExpr pc, bool tailCall)
        {
            //if (_DynarecConfig.FunctionCallWithStaticReferences)
            //{
            //	var Call = (AstNodeExpr)ast.CallInstance(GetMethodCacheInfoAtPC(PC), (Action<CpuThreadState>)MethodCacheInfo.Methods.CallDelegate, ast.CpuThreadState);
            //	if (TailCall) Call = ast.TailCall(Call as AstNodeExprCall);
            //	return ast.Statement(Call);
            //}
            //else
            {
                var localCachedPc       = Ast.Local(AstLocal.Create <uint>("CachedPC"));
                var localCachedFunction = Ast.Local(AstLocal.Create <Action <CpuThreadState> >("CachedFunction"));
                var localCalculatePc    = Ast.Local(AstLocal.Create <uint>("CalculatePC"));

                var call    = (AstNodeExpr)Ast.CallDelegate(localCachedFunction, Ast.CpuThreadStateExpr);
                var callStm = (AstNodeStm)Ast.Statement(call);
                if (tailCall)
                {
                    callStm = Ast.Statements(Ast.Statement(Ast.TailCall((AstNodeExprCall)call)), Ast.Return());
                }

                return(Ast.Statements(
                           Ast.Assign(localCalculatePc, pc),
                           Ast.If
                               (Ast.Binary(localCachedPc, "!=", localCalculatePc),
                               Ast.Statements(
                                   Ast.Assign(localCachedPc, localCalculatePc),
                                   Ast.Assign(localCachedFunction,
                                              Ast.CallInstance(Ast.CpuThreadStateExpr,
                                                               (Func <uint, Action <CpuThreadState> >)CpuThreadStateMethods.GetFuncAtPc, pc))
                                   )
                               ),
                           callStm
                           ));
            }
        }
 public AstNodeExprCast Cast <T>(AstNodeExpr Expr, bool Explicit = true)
 {
     return(Cast(typeof(T), Expr, Explicit));
 }
 public AstNodeExprArrayAccess ArrayAccess(AstNodeExpr Instance, AstNodeExpr Index)
 {
     return(new AstNodeExprArrayAccess(Instance, Index));
 }
 public AstNodeExprPropertyAccess PropertyAccess(AstNodeExpr Instance, PropertyInfo PropertyInfo)
 {
     return(new AstNodeExprPropertyAccess(Instance, PropertyInfo));
 }
 public AstNodeExprPropertyAccess PropertyAccess(AstNodeExpr Instance, string PropertyName)
 {
     return(new AstNodeExprPropertyAccess(Instance, PropertyName));
 }
 public AstNodeExprFieldAccess FieldAccess(AstNodeExpr Instance, string FieldName)
 {
     return(new AstNodeExprFieldAccess(Instance, FieldName));
 }
 public AstNodeStmIfElse IfElse(AstNodeExpr Condition, AstNodeStm True, AstNodeStm False)
 {
     return(new AstNodeStmIfElse(Condition, True, False));
 }
 public AstNodeStm Throw(AstNodeExpr Expression)
 {
     return(new AstNodeStmThrow(Expression));
 }
 public AstNodeStmGotoIfFalse GotoIfFalse(AstLabel AstLabel, AstNodeExpr Condition)
 {
     return(new AstNodeStmGotoIfFalse(AstLabel, Condition));
 }
 public AstNodeStmSwitch Switch(AstNodeExpr ValueToCheck, AstNodeCaseDefault Default, params AstNodeCase[] Cases)
 {
     return(new AstNodeStmSwitch(ValueToCheck, Cases, Default));
 }
 public AstNodeExprSetGetLValue SetGetLValue(AstNodeExpr SetExpression, AstNodeExpr GetExpression)
 {
     return(new AstNodeExprSetGetLValue(SetExpression, GetExpression));
 }
 public AstNodeStmSwitch Switch(AstNodeExpr ValueToCheck, params AstNodeCase[] Cases)
 {
     return(new AstNodeStmSwitch(ValueToCheck, Cases));
 }
 public AstNodeStmExpr Statement(AstNodeExpr Expr)
 {
     return(new AstNodeStmExpr(Expr));
 }
 public AstNodeStmReturn Return(AstNodeExpr Expr = null)
 {
     return(new AstNodeStmReturn(Expr));
 }
 public AstNodeExprCast Cast(Type Type, AstNodeExpr Expr, bool Explicit = true)
 {
     return(new AstNodeExprCast(Type, Expr, Explicit));
 }
 public AstNodeStmAssign Assign(AstNodeExprLValue Left, AstNodeExpr Expr)
 {
     return(new AstNodeStmAssign(Left, Expr));
 }
Exemple #29
0
 private AstNodeStm AssignBranchFlag(AstNodeExpr expr, bool andLink = false)
 {
     _andLink  = andLink;
     _branchPc = _pc;
     return(_ast.Assign(BranchFlag(), _ast.Cast <bool>(expr, Explicit: false)));
 }
 public AstNodeExprIndirect Indirect(AstNodeExpr PointerExpr)
 {
     return(new AstNodeExprIndirect(PointerExpr));
 }