Ejemplo n.º 1
0
Archivo: Call.cs Proyecto: claassen/CmC
        public void Emit(CompilationContext context)
        {
            ImmediateValue value = ((ImmediateValueToken)Tokens[1]).GetValue(context);

            context.EmitInstruction(new IRCallImmediate()
            {
                Address = value
            });
        }
Ejemplo n.º 2
0
        public override string ToString()
        {
            switch (Kind)
            {
            case IMOperandKind.Local:
                return("%" + Name);

            case IMOperandKind.Parameter:
                return(ParameterPrefix + Name);

            case IMOperandKind.Immediate:
                if (DataType.Kind == DataTypeKind.STRING8)
                {
                    return(DataType.Name + "(\"" + StringUtils.Escape(ImmediateValue.ToString()) + "\")");
                }
                else if (DataType.Kind == DataTypeKind.CHAR8)
                {
                    var strValue = (string)ImmediateValue;
                    return(DataType.Name + "('" + StringUtils.CharToPrintableStr(strValue[0]) + "')");
                }
                else
                {
                    return(DataType.Name + "(" + ImmediateValue.ToString() + ")");
                }

            case IMOperandKind.Global:
                return("@" + Name);

            case IMOperandKind.Identifier:
                return("'" + Name + "'");

            case IMOperandKind.Reference:
                return("[" + ChildValue + "]");

            default:
                throw new Exception();
            }
        }
Ejemplo n.º 3
0
        public void Emit(CompilationContext context)
        {
            string destRegister = ((RegisterToken)Tokens[1]).Name;

            if (Tokens[3] is ImmediateValueToken)
            {
                ImmediateValue value = ((ImmediateValueToken)Tokens[3]).GetValue(context);

                context.EmitInstruction(new IRMoveImmediate()
                {
                    To = destRegister, Value = value
                });
            }
            else
            {
                string srcRegister = ((RegisterToken)Tokens[3]).Name;

                context.EmitInstruction(new IRMoveRegister()
                {
                    To = destRegister, From = srcRegister
                });
            }
        }
Ejemplo n.º 4
0
        public void Emit(CompilationContext context)
        {
            if (Tokens[1] is RegisterToken)
            {
                if (((JmpOp)Tokens[0]).Condition == JmpOp.JmpCond.NONE)
                {
                    context.EmitInstruction(new IRJumpRegister()
                    {
                        Address = ((RegisterToken)Tokens[1]).Name
                    });
                }
                else
                {
                    throw new Exception("Only unconditional jump supports register operand");
                }
            }
            else
            {
                ImmediateValue address = null;

                //if (Tokens[1] is ImmediateValueToken)
                //{
                address = ((ImmediateValueToken)Tokens[1]).GetValue(context);
                //}
                //else if (Tokens[1] is LabelAddressToken)
                //{
                //    address = ((LabelAddressToken)Tokens[1]).GetValue(context);
                //}

                switch (((JmpOp)Tokens[0]).Condition)
                {
                case JmpOp.JmpCond.EQ:
                    context.EmitInstruction(new IRJumpEQ()
                    {
                        Address = address
                    });
                    break;

                case JmpOp.JmpCond.GE:
                    context.EmitInstruction(new IRJumpGE()
                    {
                        Address = address
                    });
                    break;

                case JmpOp.JmpCond.GT:
                    context.EmitInstruction(new IRJumpGT()
                    {
                        Address = address
                    });
                    break;

                case JmpOp.JmpCond.LE:
                    context.EmitInstruction(new IRJumpLE()
                    {
                        Address = address
                    });
                    break;

                case JmpOp.JmpCond.LT:
                    context.EmitInstruction(new IRJumpLT()
                    {
                        Address = address
                    });
                    break;

                case JmpOp.JmpCond.NE:
                    context.EmitInstruction(new IRJumpNE()
                    {
                        Address = address
                    });
                    break;

                case JmpOp.JmpCond.NONE:
                    context.EmitInstruction(new IRJumpImmediate()
                    {
                        Address = address
                    });
                    break;
                }
            }
        }