diff --git a/sources/zweic/Generator.scala b/sources/zweic/Generator.scala index 8c7e5a9..c061372 100644 --- a/sources/zweic/Generator.scala +++ b/sources/zweic/Generator.scala @@ -20,8 +20,13 @@ } def emitLoadConstant(r: Int, value: Int) = { - code.emit(ADDI, r, ZERO, value, value.toString()); - //TODO: immediats bigger than 2^16 have to be shifted + if (value > (Math.pow(2,16) - 1)) { + code.emit(ADDI, r, ZERO, value >> 16, value.toString()); + //TODO: SHIFT + code.emit(ADDI, r, r, value << 16 >> 16); + } else { + code.emit(ADDI, r, ZERO, value, value.toString()); + } } def gen(tree: Tree): Unit = tree match { @@ -91,10 +96,6 @@ // ... � compl�ter ... case Do(expr) => - Console.println("DO"); - genTmp { tempReg => - genLoad(tree.asInstanceOf[Expr], tempReg) - } case PrintInt(expr) => genTmp { tmpReg => @@ -170,6 +171,9 @@ code.emit(DIV, targetReg, tmpLeft, tmpRight, "/"); case Operators.MOD => code.emit(MOD, targetReg, tmpLeft, tmpRight, "%"); + case _ => + Console.println("unsupported BinOp: "+op); + //TODO: does AND fit in here? what about other logic operations? } } } @@ -177,9 +181,6 @@ case Block(stats, main) => // ... � compl�ter ... - case If(cond, thenp, elsep) => - // ... � compl�ter ... - case Ident(name) => // ... � compl�ter ... @@ -192,6 +193,18 @@ case Call(receiver, method, args) => // ... � compl�ter ... + case If(cond, thenp, elsep) => + //TODO: this is absolutely wrong + val thenpos = code.getLabel(); + val elsepos = code.getLabel(); + genCond(cond, thenpos, true); + + genTmp { leftret => + genTmp { rightret => + genLoad(thenp, leftret); + genLoad(elsep, rightret); + } + } case _ => Console.println("LoadGen________________"); // ... � compl�ter ... @@ -206,8 +219,12 @@ */ private def genCond(tree: Expr, targetLabel: code.Label, when: Boolean): Unit = { // ... � compl�ter ... - tree match { - case Binop(op, left, right) => ()//op match { + + //genTmp { tmpLeft => + + tree match { + case Binop(op, left, right) => + //op match { // ... � compl�ter ... case Unop(op, expr) => () diff --git a/tests/5/arith.zwei b/tests/5/arith.zwei new file mode 100644 index 0000000..fbf741f --- /dev/null +++ b/tests/5/arith.zwei @@ -0,0 +1 @@ +-(3*5)+2-(-1)/(6%2) \ No newline at end of file diff --git a/tests/5/empty.zwei b/tests/5/empty.zwei new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/5/empty.zwei @@ -0,0 +1 @@ +0 diff --git a/tests/5/start.zwei b/tests/5/start.zwei new file mode 100644 index 0000000..c95789e --- /dev/null +++ b/tests/5/start.zwei @@ -0,0 +1 @@ +readChar \ No newline at end of file