public void Emit(CompilationContext context) { ImmediateValue value = ((ImmediateValueToken)Tokens[1]).GetValue(context); context.EmitInstruction(new IRCallImmediate() { Address = value }); }
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(); } }
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 }); } }
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; } } }