From 26d0a174db71e84e6837b1f71a4da77a73262512 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 9 Dec 2024 03:21:11 +0100 Subject: [PATCH] optimize codegen for while loops with empty body --- compiler/res/prog8lib/cx16/syslib.p8 | 4 - .../astprocessing/StatementReorderer.kt | 11 ++ docs/source/todo.rst | 11 ++ examples/test.p8 | 123 +++++++++++------- 4 files changed, 101 insertions(+), 48 deletions(-) diff --git a/compiler/res/prog8lib/cx16/syslib.p8 b/compiler/res/prog8lib/cx16/syslib.p8 index 7ab986580..a7def5016 100644 --- a/compiler/res/prog8lib/cx16/syslib.p8 +++ b/compiler/res/prog8lib/cx16/syslib.p8 @@ -1172,7 +1172,6 @@ _default_aflow_handler asmsub set_vsync_irq_handler(uword address @AY) clobbers(A) { ; Sets the VSYNC irq handler to use with enable_irq_handlers(). Also enables VSYNC irqs. - ; NOTE: unless a proper irq handler is already running, you should enclose this call in set_irqd() / clear_irqd() to avoid system crashes. %asm {{ php sei @@ -1188,7 +1187,6 @@ asmsub set_vsync_irq_handler(uword address @AY) clobbers(A) { asmsub set_line_irq_handler(uword rasterline @R0, uword address @AY) clobbers(A,Y) { ; Sets the LINE irq handler to use with enable_irq_handlers(), for the given rasterline. Also enables LINE irqs. ; You can use sys.set_rasterline() later to adjust the rasterline on which to trigger. - ; NOTE: unless a proper irq handler is already running, you should enclose this call in set_irqd() / clear_irqd() to avoid system crashes. %asm {{ php sei @@ -1206,7 +1204,6 @@ asmsub set_line_irq_handler(uword rasterline @R0, uword address @AY) clobbers(A, asmsub set_sprcol_irq_handler(uword address @AY) clobbers(A) { ; Sets the SPRCOL irq handler to use with enable_irq_handlers(). Also enables SPRCOL irqs. - ; NOTE: unless a proper irq handler is already running, you should enclose this call in set_irqd() / clear_irqd() to avoid system crashes. %asm {{ php sei @@ -1221,7 +1218,6 @@ asmsub set_sprcol_irq_handler(uword address @AY) clobbers(A) { asmsub set_aflow_irq_handler(uword address @AY) clobbers(A) { ; Sets the AFLOW irq handler to use with enable_irq_handlers(). Also enables AFLOW irqs. - ; NOTE: unless a proper irq handler is already running, you should enclose this call in set_irqd() / clear_irqd() to avoid system crashes. ; NOTE: the handler itself must fill the audio fifo buffer to at least 25% full again (1 KB) or the aflow irq will keep triggering! %asm {{ php diff --git a/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt b/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt index 0782d36fb..7bae13b02 100644 --- a/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt +++ b/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt @@ -301,6 +301,17 @@ internal class StatementReorderer( return noModifications } + override fun after(whileLoop: WhileLoop, parent: Node): Iterable { + if(whileLoop.body.isEmpty()) { + // convert while C {} to do {} until not C (because codegen of the latter is more optimized) + val invertedCondition = invertCondition(whileLoop.condition, program) + val until = UntilLoop(whileLoop.body, invertedCondition, whileLoop.position) + return listOf(IAstModification.ReplaceNode(whileLoop, until, parent)) + } + + return noModifications + } + private fun checkCopyArrayValue(assign: Assignment) { val identifier = assign.target.identifier!! val targetVar = identifier.targetVarDecl(program)!! diff --git a/docs/source/todo.rst b/docs/source/todo.rst index e293ae5a6..bfc8fa256 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,6 +1,17 @@ TODO ==== +Halloween is stuck on a black screen + + +Optimize bitwise operations on word values where only the msb or lsb is touched: (already done for simple expressions!) + cx16.r0 = (cx16.r0 & $a000) | $0055 + cx16.r0 = (cx16.r0 | $a000) ^ $0055 + cx16.r0 = (cx16.r0 ^ $a000) & $0055 + +Optimize (x & y) == y expressions especially in loop conditions + + update zsmkit to newest version that includes the on_deck routines when stabilized diff --git a/examples/test.p8 b/examples/test.p8 index 6d7493a42..858091579 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,51 +1,86 @@ -%import textio -%import palette %zeropage basicsafe %option no_sysinit main { - uword[] @shared colors = [ - $000, ; 0 = black - $fff, ; 1 = white - $800, ; 2 = red - $afe, ; 3 = cyan - $c4c, ; 4 = purple - $0c5, ; 5 = green - $00a, ; 6 = blue - $ee7, ; 7 = yellow - $d85, ; 8 = orange - $640, ; 9 = brown - $f77, ; 10 = light red - $333, ; 11 = dark grey - $777, ; 12 = medium grey - $af6, ; 13 = light green - $08f, ; 14 = light blue - $bbb ; 15 = light grey - ] - - ubyte[] @shared colors_b = [ - $00, $00, ; 0 = black - $0f, $ff, ; 1 = white - $08, $00, ; 2 = red - $0a, $fe, ; 3 = cyan - $0c, $4c, ; 4 = purple - $00, $c5, ; 5 = green - $00, $0a, ; 6 = blue - $0e, $e7, ; 7 = yellow - $0d, $85, ; 8 = orange - $06, $40, ; 9 = brown - $0f, $77, ; 10 = light red - $03, $33, ; 11 = dark grey - $07, $77, ; 12 = medium grey - $0a, $f6, ; 13 = light green - $00, $8f, ; 14 = light blue - $0b, $bb ; 15 = light grey - ] - - sub start() { - palette.set_grayscale(0) - sys.wait(60) - palette.set_rgb_be(colors_b, 16, 0) + + while cx16.r0L & 1 == 0 { + } + + while cx16.r0L & 1 == 1 { + } + + while cx16.r0L & 64 == 0 { + } + + while cx16.r0L & 64 == 64 { + } + + do { } + until cx16.r0L & 1 == 0 + + do { } + until cx16.r0L & 1 == 1 + + do { } + until cx16.r0L & 64 == 0 + + do { } + until cx16.r0L & 64 == 64 + + while cx16.r0L & 1 == 0 { + cx16.r0L++ + } + + while cx16.r0L & 1 == 1 { + cx16.r0L++ + } + + while cx16.r0L & 64 == 0 { + cx16.r0L++ + } + + while cx16.r0L & 64 == 64 { + cx16.r0L++ + } + + do { + cx16.r0L++ + } + until cx16.r0L & 1 == 0 + + do { + cx16.r0L++ + } + until cx16.r0L & 1 == 1 + + do { + cx16.r0L++ + } + until cx16.r0L & 64 == 0 + + do { + cx16.r0L++ + } + until cx16.r0L & 64 == 64 + +/* + sys.set_irqd() + cx16.VERA_IEN = 1 ; only vsync irqs + + repeat { + while (cx16.VERA_ISR & 1)==0 { + ; wait for vsync + } + cx16.VERA_ISR = 1 ; clear vsync irq status + + palette.set_color(6, $ff0) + repeat 2000 { + cx16.r0++ + } + palette.set_color(6, $00f) + + } +*/ } }