public MipsProgram VisitAllocate(ASTCILAllocateNode Allocate) { var label = labelGenerator.GenerateLabelTypeInfo(Allocate.Type.Name); var result = new MipsProgram(); result.SectionCode.Append(MipsGenerationHelper.NewScript() .LoadFromAddress(MipsRegisterSet.t0, label) .LoadFromMemory(MipsRegisterSet.a0, MipsRegisterSet.t0, MipsGenerationHelper.SizeOfOffset) .Add(MipsRegisterSet.a0, 4) .Allocate(MipsRegisterSet.a0, MipsRegisterSet.a0) .SaveToMemory(MipsRegisterSet.t0, MipsRegisterSet.a0) .Add(MipsRegisterSet.a0, 4)); return(result); }
public MipsProgram VisitProgram(ASTCILProgramNode Program) { var bufferlabel = MipsGenerationHelper.BufferLabel; var result = new MipsProgram(); result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript().GlobalSection(bufferlabel)); result.SectionData.Append(MipsGenerationHelper.NewScript() .AddData(bufferlabel, new[] { MipsGenerationHelper.AddDynamycString(MipsGenerationHelper.BufferSize) })); List <string> all = new List <string>(); foreach (var item in RuntimeErrors.GetRuntimeErrorString) { var exception = labelGenerator.GetException(item.Key); all.Add(exception); result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript() .GlobalSection(exception)); result.SectionData.Append(MipsGenerationHelper.NewScript() .AddData(exception, new[] { MipsGenerationHelper.AddStringData(item.Value) })); } var exceptions = MipsGenerationHelper.Exceptions; result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript() .GlobalSection(exceptions)); result.SectionData.Append(MipsGenerationHelper.NewScript() .AddData(exceptions, all.Select(x => MipsGenerationHelper.AddIntData(x)))); CompilationUnit.TypeEnvironment.GetTypeDefinition("Main", null, out var main); var entryPoint = new ASTCILAllocateNode(main).Accept(this).SectionCode .Append(MipsGenerationHelper.NewScript().Push(MipsRegisterSet.a0)) .Append(new ASTCILFuncVirtualCallNode(main, Functions.Init, new ASTCILExpressionNode[] { }).Accept(this).SectionCode) .Append(new ASTCILFuncVirtualCallNode(main, "main", new ASTCILExpressionNode[] { }).Accept(this).SectionCode) .Append(MipsGenerationHelper.NewScript().Add(MipsRegisterSet.sp, 12)) .Append(MipsGenerationHelper.NewScript().Exit()); result.SectionCode.Append(MipsGenerationHelper.NewScript().MainTag()).Append(entryPoint); var voidLabel = labelGenerator.GenerateVoid(); result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript() .GlobalSection(voidLabel).GlobalSection(labelGenerator.GetNewLine())); result.SectionData.Append(MipsGenerationHelper.NewScript() .AddData(voidLabel, new[] { MipsGenerationHelper.AddStringData(String.Empty) }).AddData( labelGenerator.GetNewLine(), new[] { MipsGenerationHelper.AddStringData(Environment.NewLine) })); result.SectionTextGlobals.Append(MipsGenerationHelper.NewScript().GlobalSection(MipsGenerationHelper.StringEqualsLabel)); result.SectionCode.Append(MipsGenerationHelper.NewScript().StringEquals()); foreach (var item in Program.Types) { result += item.Accept(this); } return(result); }