From 8be234973ca7d93a78ba20d398dc6e865a1239c9 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 21 Nov 2020 19:09:02 +0100 Subject: [PATCH] rollback failed optimization of memory expressions (code size got too large) --- compiler/res/prog8lib/prog8_lib.asm | 26 +++++++++++++++++++ .../assignment/AugmentableAssignmentAsmGen.kt | 22 ++++------------ examples/charset.p8 | 1 - 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/compiler/res/prog8lib/prog8_lib.asm b/compiler/res/prog8lib/prog8_lib.asm index c2ba2fb11..a4493536e 100644 --- a/compiler/res/prog8lib/prog8_lib.asm +++ b/compiler/res/prog8lib/prog8_lib.asm @@ -5,6 +5,32 @@ ; ; indent format: TABS, size=8 + +read_byte_from_address_on_stack .proc + ; -- read the byte from the memory address on the top of the stack, return in A (stack remains unchanged) + lda P8ESTACK_LO+1,x + ldy P8ESTACK_HI+1,x + sta P8ZP_SCRATCH_W2 + sty P8ZP_SCRATCH_W2+1 + ldy #0 + lda (P8ZP_SCRATCH_W2),y + rts + .pend + + +write_byte_to_address_on_stack .proc + ; -- write the byte in A to the memory address on the top of the stack (stack remains unchanged) + ldy P8ESTACK_LO+1,x + sty P8ZP_SCRATCH_W2 + ldy P8ESTACK_HI+1,x + sty P8ZP_SCRATCH_W2+1 + ldy #0 + sta (P8ZP_SCRATCH_W2),y + rts + .pend + + + neg_b .proc lda #0 sec diff --git a/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt index 05f9b4ca1..a3ae457a6 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt @@ -182,15 +182,10 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, } } else -> { - asmgen.assignExpressionToVariable(memory.addressExpression, asmgen.asmVariableName("P8ZP_SCRATCH_W2"), DataType.UWORD, target.scope) - asmgen.out(""" - lda P8ZP_SCRATCH_W2 - pha - lda P8ZP_SCRATCH_W2+1 - pha - ldy #0 - lda (P8ZP_SCRATCH_W2),y - sta P8ZP_SCRATCH_B1""") + if(asmgen.options.slowCodegenWarnings) + println("warning: slow stack evaluation used (1): ${memory.addressExpression::class.simpleName} at ${memory.addressExpression.position}") // TODO optimize... + asmgen.translateExpression(memory.addressExpression) // TODO directly into P8ZP_SCRATCH_W2 + asmgen.out(" jsr prog8_lib.read_byte_from_address_on_stack | sta P8ZP_SCRATCH_B1") val zp = CompilationTarget.instance.machine.zeropage when { valueLv != null -> inplaceModification_byte_litval_to_variable(zp.SCRATCH_B1.toHex(), DataType.UBYTE, operator, valueLv.toInt()) @@ -202,14 +197,7 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, } else -> inplaceModification_byte_value_to_variable(zp.SCRATCH_B1.toHex(), DataType.UBYTE, operator, value) } - asmgen.out(""" - pla - sta P8ZP_SCRATCH_W2+1 - pla - sta P8ZP_SCRATCH_W2 - ldy #0 - lda P8ZP_SCRATCH_B1 - sta (P8ZP_SCRATCH_W2),y""") + asmgen.out(" lda P8ZP_SCRATCH_B1 | jsr prog8_lib.write_byte_to_address_on_stack | inx") } } } diff --git a/examples/charset.p8 b/examples/charset.p8 index 69926cc67..c0a0d7365 100644 --- a/examples/charset.p8 +++ b/examples/charset.p8 @@ -5,7 +5,6 @@ %option no_sysinit ; Create a custom character set on the C64. -; TODO why is this one significantly larger than with older compiler? main {