diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt index 4568e4c5c..e865a599b 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt @@ -552,16 +552,16 @@ class IRCodeGen( addInstr(result, IRInstruction(Opcode.STOREM, loopvarDtIr, reg1=fromTr.resultReg, labelSymbol=loopvarSymbol), null) result += labelFirstChunk(translateNode(forLoop.statements), loopLabel) - addInstr(result, IRInstruction(Opcode.LOADM, loopvarDtIr, reg1 = fromTr.resultReg, labelSymbol = loopvarSymbol), null) if(step==1 || step==-1) { - // if endvalue == index, stop loop, else iterate + // if endvalue == loopvar, stop loop, else iterate + addInstr(result, IRInstruction(Opcode.LOADM, loopvarDtIr, reg1 = fromTr.resultReg, labelSymbol = loopvarSymbol), null) addInstr(result, IRInstruction(Opcode.BEQR, loopvarDtIr, reg1=toTr.resultReg, reg2=fromTr.resultReg, labelSymbol = labelAfterFor), null) result += addConstMem(loopvarDtIr, null, loopvarSymbol, step) addInstr(result, IRInstruction(Opcode.JUMP, labelSymbol = loopLabel), null) } else { // ind/dec index, then: - // ascending: if endvalue >= index, iterate - // descending: if index >= endvalue, iterate + // ascending: if endvalue >= loopvar, iterate + // descending: if loopvar >= endvalue, iterate result += addConstMem(loopvarDtIr, null, loopvarSymbol, step) addInstr(result, IRInstruction(Opcode.LOADM, loopvarDtIr, reg1=fromTr.resultReg, labelSymbol = loopvarSymbol), null) if(step > 0) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index b156ff607..522f4fb6a 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,11 +1,7 @@ TODO ==== -- investigate if the hiscores issue on the forum is a compiler bug or not. - - IR: instructions that do type conversion (SZ etc, CONCAT, SGN) should put the result in a DIFFERENT register. -- IR: optimize forloop codegen to use a reg as loop variable instead of a memory variable, just store it in the mem var before entering the loop body - check repeat loop as well it shouldn't be using a tempvar just a register to count. ... diff --git a/examples/test.p8 b/examples/test.p8 index 538293f83..deef4bd23 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,56 +1,32 @@ -%import string %import textio -%import conv - %zeropage basicsafe +; (127 instructions in 15 chunks, 47 registers) +; 679 steps + + main { -str[10] names = ["1??","2??","3??","4??","5??","6??","7??","8??","9??","a??"] -str[10] scores = ["9000","8000","7000","6000","5000","4000","3000","2000","1000","50"] -str p_str = "winner" -uword top_score - sub start() { - print_hiscores() - ubyte r = check_score(7500) - print_hiscores() -} + uword i + uword n -sub check_score(uword score) -> ubyte { - ubyte n - ubyte i - str tmp = "?????" + repeat 10 { + txt.chrout('.') + } + txt.nl() + + n=10 + for i in 0 to n step 3 { + txt.print_uw(i) + txt.nl() + } + txt.nl() - if score < top_score { - return(10) } - else { - for n in 0 to 9 { - if score > conv.str2uword(scores[n]) { - for i in 8 to n step -1 { - names[i+1] = names[i] - scores[i+1] = scores[i] - } - ;string.copy(p_str,names[n]) - ;conv.str_uw0(score) - ;string.copy(conv.string_out,scores[n]) - return(n) - } - } - } + n=0 + for i in 10 downto n step -3 { + txt.print_uw(i) + txt.nl() + } } - -sub print_hiscores() { - ubyte n - for n in 0 to 9 { - txt.print_ub(n) - txt.spc() - txt.print(names[n]) - txt.spc() - txt.print(scores[n]) - txt.nl() - } - txt.nl() -} - }