Example #1
0
            protected internal override void VisitBinaryOp(BinaryOp node, object data)
            {
                StackTypes stack = data as StackTypes;
                Verifier.ProcessBinOp(GetOpType(node.Op, node.Unsigned, node.Overflow ),stack);

                AddTask(node.Next,stack);
            }
Example #2
0
 private static Verifier.OpType GetOpType(BinaryOp.ArithOp op, bool un, bool ovf)
 {
     if(op == BinaryOp.ArithOp.SHL || op == BinaryOp.ArithOp.SHR)
         return(Verifier.OpType.Shift);
     if(op == BinaryOp.ArithOp.CEQ || op == BinaryOp.ArithOp.CLT || op == BinaryOp.ArithOp.CGT)
         return(Verifier.OpType.Compare);
     if(Verifier.IsFloatOperation(Converter.CodeFromBinaryOp(op), un, ovf))
         return(Verifier.OpType.FloatOrInt);
     return(Verifier.OpType.Int);
 }
Example #3
0
 protected internal virtual void VisitBinaryOp(BinaryOp node, object data)
 {
     throw new NodeNotSupportedException(node);
 }
Example #4
0
        protected override void VisitBinaryOp(BinaryOp upNode, object o)
        {
            State state = o as State;
            BTValue val2 = state.Stack.Pop() as BTValue;
            BTValue val1 = state.Stack.Pop() as BTValue;

            if (val1.BTType == val2.BTType)
            {
                BTValue val3 = new PrimitiveBTValue(val1.BTType);
                state.Stack.Push(val3);
                Annotation.SetNodeBTType(upNode, val3.BTType);
            }
            else if (val1.BTType == BTType.Static)
                throw new LiftException(val1);
            else if (val2.BTType == BTType.Static)
                throw new LiftException(val2);
            else
                throw new InternalException();
        }
Example #5
0
 protected override void VisitBinaryOp(BinaryOp upNode, object o)
 {
     DepthContainer cnt = o as DepthContainer;
     cnt.Depth += 1;
 }
Example #6
0
 protected internal override void VisitBinaryOp(BinaryOp node, object data)
 {
     switch(node.Op)
     {
         case BinaryOp.ArithOp.ADD:
         {
             if(node.Overflow)
                 if(node.Unsigned)
                     generator.Emit(OpCodes.Add_Ovf_Un);
                 else
                     generator.Emit(OpCodes.Add_Ovf);
             else
                 generator.Emit(OpCodes.Add);
         } break;
         case BinaryOp.ArithOp.AND:
         {
             generator.Emit(OpCodes.And);
         } break;
         case BinaryOp.ArithOp.CEQ:
         {
             if(node.Next is Branch && node.Next.PrevArray.Count == 1)
             {
                 Branch br = node.Next as Branch;
                 generator.Emit(OpCodes.Beq, GetLabel(br.Alt));
                 AddTask(br.Alt,null);
                 AddTask(br.Next,null);
                 return;
             }
             generator.Emit(OpCodes.Ceq);
         } break;
         case BinaryOp.ArithOp.CGT:
         {
             if(node.Next is Branch && node.Next.PrevArray.Count == 1)
             {
                 Branch br = node.Next as Branch;
                 if(node.Unsigned)
                     generator.Emit(OpCodes.Bgt_Un, GetLabel(br.Alt));
                 else
                     generator.Emit(OpCodes.Bgt, GetLabel(br.Alt));
                 AddTask(br.Alt,null);
                 AddTask(br.Next,null);
                 return;
             }
             if(node.Unsigned)
                 generator.Emit(OpCodes.Cgt_Un);
             else
                 generator.Emit(OpCodes.Cgt);
         } break;
         case BinaryOp.ArithOp.CLT:
         {
             if(node.Next is Branch && node.Next.PrevArray.Count == 1)
             {
                 Branch br = node.Next as Branch;
                 if(node.Unsigned)
                     generator.Emit(OpCodes.Blt_Un, GetLabel(br.Alt));
                 else
                     generator.Emit(OpCodes.Blt, GetLabel(br.Alt));
                 AddTask(br.Alt,null);
                 AddTask(br.Next,null);
                 return;
             }
             if(node.Unsigned)
                 generator.Emit(OpCodes.Clt_Un);
             else
                 generator.Emit(OpCodes.Clt);
         } break;
         case BinaryOp.ArithOp.DIV:
         {
             if(node.Unsigned)
                 generator.Emit(OpCodes.Div_Un);
             else
                 generator.Emit(OpCodes.Div);
         } break;
         case BinaryOp.ArithOp.MUL:
         {
             if(node.Overflow)
                 if(node.Unsigned)
                     generator.Emit(OpCodes.Mul_Ovf_Un);
                 else
                     generator.Emit(OpCodes.Mul_Ovf);
             else
                 generator.Emit(OpCodes.Mul);
         } break;
         case BinaryOp.ArithOp.OR:
         {
             generator.Emit(OpCodes.Or);
         } break;
         case BinaryOp.ArithOp.REM:
         {
             if(node.Unsigned)
                 generator.Emit(OpCodes.Rem_Un);
             else
                 generator.Emit(OpCodes.Rem);
         } break;
         case BinaryOp.ArithOp.SHL:
         {
             generator.Emit(OpCodes.Shl);
         } break;
         case BinaryOp.ArithOp.SHR:
         {
             generator.Emit(OpCodes.Shr);
         } break;
         case BinaryOp.ArithOp.SUB:
         {
             if(node.Overflow)
                 if(node.Unsigned)
                     generator.Emit(OpCodes.Sub_Ovf_Un);
                 else
                     generator.Emit(OpCodes.Sub_Ovf);
             else
                 generator.Emit(OpCodes.Sub);
         } break;
         case BinaryOp.ArithOp.XOR:
         {
             generator.Emit(OpCodes.Xor);
         } break;
         default: throw new EmissionException();
     }
     AddTask(node.Next,null);
 }