diff --git a/sources/zweic/Generator.scala b/sources/zweic/Generator.scala index cffe82b..cacb257 100644 --- a/sources/zweic/Generator.scala +++ b/sources/zweic/Generator.scala @@ -108,26 +108,29 @@ case method @ MethodDef(name, params, _, body) => val oldFrameSize = code.getFrameSize(); - code.decFrameSize(oldFrameSize); - code.incFrameSize(params.length*4+4); + code.decFrameSize(oldFrameSize); // fs = 0 + code.incFrameSize(params.length*4+4); // fs = params + this code.emit(PSH, LNK, SP, 4); - code.incFrameSize(4); + code.incFrameSize(4); // fs = params + this + lnk name.sym.asInstanceOf[MethodSymbol].address = code.pc(); - gen(body); + code.getRegister(RES); + genLoad(body, RES); // fs = params + this + lnk + ... + code.freeRegister(RES); - code.emit(SUBI, SP, SP, code.getFrameSize() - 4+4+4*params.length ); - code.decFrameSize(code.getFrameSize() - 4+4+4*params.length); + + code.emit(SUBI, SP, SP, code.getFrameSize() - (4+4+4*params.length) ); + code.decFrameSize(code.getFrameSize()); // fs = 0 + code.incFrameSize(4+4+4*params.length); // fs = params + this + lnk code.emit(POP, LNK, SP, 4); - code.decFrameSize(4); + code.decFrameSize(4); // fs = params + this code.emit(SUBI, SP, SP, params.length*4+4); - code.decFrameSize(code.getFrameSize()); - code.incFrameSize(oldFrameSize); - code.decFrameSize(params.length*4+4); + code.decFrameSize(code.getFrameSize()); // fs = 0 + code.incFrameSize(oldFrameSize); // fs = oldframesize code.emit(RET, LNK); @@ -148,9 +151,9 @@ case Var(varname, _, init) => genTmp { tmpReg => genLoad(init, tmpReg); - code.incFrameSize(4); varname.sym.offset = code.getFrameSize(); code.emit(PSH, tmpReg, SP, 4); + code.incFrameSize(4); } case Set(name, expr) => @@ -262,7 +265,8 @@ genLoad(main, targetReg); code.emit(SUBI, SP, SP, code.getFrameSize()-fs); - code.decFrameSize(code.getFrameSize()-fs); + code.decFrameSize(code.getFrameSize()); + code.incFrameSize(fs); case Ident(name) => if ( name.name == "this" ) { @@ -299,10 +303,22 @@ genTmp { thisReg => - genLoad(receiver, thisReg); - code.emit(PSH, thisReg, SP, 4); // this TODO - code.incFrameSize(4); + // put all registers on stack + val used = code.usedRegisters(); + for ( val i <- Iterator.range(0, used.length)) { + if ( used(i) && i != targetReg ) { + code.emit(PSH, i, SP, 4); + code.incFrameSize(4); + } + } + + // get 'this' and put it on stack + genLoad(receiver, thisReg); + code.emit(PSH, thisReg, SP, 4); + code.incFrameSize(4); + + // put args on stack genTmp { tmpReg => for ( val a <- args ) { genLoad(a, tmpReg); @@ -314,10 +330,24 @@ //TODO check thisReg != null code.emit(LDW, thisReg, thisReg, method.sym.offset); //TODO check thisReg != null + code.emit(RET, thisReg); + + + code.emit(ADD, targetReg, ZERO, RES); + + code.decFrameSize(args.length*4+4); // fs = oldframesize - params - this + + // retrieve all registers from stack + for ( val j <- Iterator.range(0, used.length)) { + if ( used(j) && j != targetReg ) { + code.emit(POP, j, SP, 4); + code.decFrameSize(4); + } + } } - code.emit(ADDI, SP, SP, args.length*4); + //code.emit(ADDI, SP, SP, args.length*4); // ... � compl�ter ...