@Override public void VisitReturnNode(GtReturnNode Node) { if (Node.ValueNode != null) { Node.ValueNode.Accept(this); this.VisitingBuilder.Append( "NMOV " + "REG" + ReturnIndex + ", REG" + this.PopRegister() + "\n"); } this.VisitingBuilder.Append("RET\n"); }
@Override public void VisitSetterNode(GtSetterNode Node) { Node.RecvNode.Accept(this); /*local*/ int TargetReg = this.PopRegister(); /*local*/ ArrayList<GtFieldInfo> FieldList = this.ClassFieldMap.get(Node.RecvNode.Type); /*local*/ int Offset = this.GetFieldOffset(FieldList, Node.NativeName); Node.ValueNode.Accept(this); this.VisitingBuilder.Append( "XNMOV " + "REG" + TargetReg + ", " + Offset + ", REG" + this.PopRegister() + "\n"); }
@Override public void VisitSetLocalNode(GtSetLocalNode Node) { Node.ValueNode.Accept(this); this.VisitingBuilder.Append( "NMOV " + "REG" + this.LocalVarMap.get(Node.NativeName) + ", REG" + this.PopRegister() + "\n"); }
@Override public void VisitSetIndexNode(GtSetIndexNode Node) { /*local*/ int TargetReg = this.ReserveRegister(3 /*ArgumentSize*/ + CallParameters); /*local*/ int CallReg = TargetReg - ReturnIndex + ThisIndex; Node.RecvNode.Accept(this); /// *local*/int ArrayVarReg = this.PopRegister(); // this.VisitingBuilder.Append("NMOV " + "REG" + (CallReg+1) + ", REG" + ArrayVarReg + "\n"); this.VisitingBuilder.Append( "NMOV " + "REG" + (CallReg + 1) + ", REG" + this.PopRegister() + "\n"); Node.IndexNode.Accept(this); this.VisitingBuilder.Append( "NMOV " + "REG" + (CallReg + 2) + ", REG" + this.PopRegister() + "\n"); Node.ValueNode.Accept(this); this.VisitingBuilder.Append( "NMOV " + "REG" + (CallReg + 3) + ", REG" + this.PopRegister() + "\n"); this.VisitingBuilder.Append( "NSET " + "REG" + (CallReg + MethodIndex) + ", METHOD\"SetIndex\"\n"); this.VisitingBuilder.Append("CALL " + "REG" + CallReg + ", " + 3 /*ArgumentSize*/ + "\n"); // this.VisitingBuilder.Append("NMOV " + "REG" + ArrayVarReg + ", REG" + TargetReg + "\n"); this.FreeRegister(TargetReg); }