From 07bb5c36bdd8e7083cc50a48e7ce6012c4310396 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 11 Oct 2025 01:08:15 +0200 Subject: [PATCH] avoid fallback JSR peek for common case pointer+offset --- benchmark-c/result-sieve.png | Bin 83155 -> 83585 bytes .../codegen/cpu6502/BuiltinFunctionsAsmGen.kt | 35 +++++++++++++ compiler/res/prog8lib/prog8_funcs.asm | 3 ++ .../compiler/astprocessing/CodeDesugarer.kt | 11 ++++ docs/source/todo.rst | 7 ++- examples/c64/simplemultiplexer.p8 | 9 ++-- examples/test.p8 | 48 ++++-------------- 7 files changed, 71 insertions(+), 42 deletions(-) diff --git a/benchmark-c/result-sieve.png b/benchmark-c/result-sieve.png index 97aa8a0939320d912bb3cccc48f16e6f0500a6c8..80dce3f433bf4f89308310dde0f1925c2cb1c04a 100644 GIT binary patch delta 48523 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 DS<4}x delta 48041 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

! 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 RAOY_WZB6}KrRsK}{|BPx?nD3p diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt index 0a7cac613..98d7c3e15 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt @@ -1067,6 +1067,8 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, val varname = asmgen.asmVariableName(pointer) asmgen.assignExpressionToRegister(result.second, RegisterOrPair.Y) asmgen.out(" lda ($varname),y") + } else if(addrExpr.operator in arrayOf("+", "-") && addrExpr.left is PtIdentifier) { + readValueFromPointerPlusOrMinOffset(addrExpr.left as PtIdentifier, addrExpr.operator, addrExpr.right, BaseDataType.BOOL) } else fallback() } else -> fallback() @@ -1112,6 +1114,8 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, lda ($varname),y tay txa""") + } else if(addrExpr.operator in arrayOf("+", "-") && addrExpr.left is PtIdentifier) { + readValueFromPointerPlusOrMinOffset(addrExpr.left as PtIdentifier, addrExpr.operator, addrExpr.right, BaseDataType.UWORD) } else fallback() } else -> fallback() @@ -1129,6 +1133,37 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, } } + private fun readValueFromPointerPlusOrMinOffset(ptr: PtIdentifier, operator: String, offset: PtExpression, dt: BaseDataType) { + val varname = asmgen.asmVariableName(ptr) + asmgen.assignExpressionToRegister(offset, RegisterOrPair.AY) + if(operator=="+") + asmgen.out(""" + clc + adc $varname + sta P8ZP_SCRATCH_W1 + tya + adc $varname+1 + sta P8ZP_SCRATCH_W1+1""") + else + asmgen.out(""" + sec + sbc $varname + sta P8ZP_SCRATCH_W1 + tya + sbc $varname+1 + sta P8ZP_SCRATCH_W1+1""") + + if (dt.isByteOrBool) { + if(asmgen.isTargetCpu(CpuType.CPU65C02)) { + asmgen.out(" lda (P8ZP_SCRATCH_W1)") + } else { + asmgen.out(" ldy #0 | lda (P8ZP_SCRATCH_W1),y") + } + } else if(dt.isWord) { + asmgen.out(" jsr prog8_lib.func_peekw.from_scratchW1") + } else throw AssemblyError("unsupported type for peek $dt") + } + private fun funcPeekL(fcall: PtBuiltinFunctionCall, resultRegister: RegisterOrPair?) { // TODO optimize for the simple cases asmgen.assignExpressionToRegister(fcall.args[0], RegisterOrPair.AY) diff --git a/compiler/res/prog8lib/prog8_funcs.asm b/compiler/res/prog8lib/prog8_funcs.asm index 909a1e875..6cc4e60e6 100644 --- a/compiler/res/prog8lib/prog8_funcs.asm +++ b/compiler/res/prog8lib/prog8_funcs.asm @@ -435,6 +435,7 @@ func_peek .proc ; -- read the byte value on the address in AY, into A sta P8ZP_SCRATCH_W1 sty P8ZP_SCRATCH_W1+1 +from_scratchW1 ldy #0 lda (P8ZP_SCRATCH_W1),y rts @@ -444,6 +445,7 @@ func_peekw .proc ; -- read the word value on the address in AY, into AY sta P8ZP_SCRATCH_W1 sty P8ZP_SCRATCH_W1+1 +from_scratchW1 ldy #0 lda (P8ZP_SCRATCH_W1),y pha @@ -458,6 +460,7 @@ func_peekl .proc ; -- read the ;pmg value on the address in AY, into R0:R1 sta P8ZP_SCRATCH_W1 sty P8ZP_SCRATCH_W1+1 +from_scratchW1 ldy #0 lda (P8ZP_SCRATCH_W1),y sta cx16.r0 diff --git a/compiler/src/prog8/compiler/astprocessing/CodeDesugarer.kt b/compiler/src/prog8/compiler/astprocessing/CodeDesugarer.kt index a26bc8fa8..5a480366c 100644 --- a/compiler/src/prog8/compiler/astprocessing/CodeDesugarer.kt +++ b/compiler/src/prog8/compiler/astprocessing/CodeDesugarer.kt @@ -297,6 +297,17 @@ _after: val peek = FunctionCallExpression(IdentifierReference(listOf("peekbool"), arrayIndexedExpression.position), mutableListOf(address), arrayIndexedExpression.position) return listOf(IAstModification.ReplaceNode(arrayIndexedExpression, peek, parent)) } + } else if(arrayVar.datatype.sub==BaseDataType.LONG) { + // use peekl/pokel + if(parent is AssignTarget) { + val assignment = parent.parent as Assignment + val args = mutableListOf(address, assignment.value) + val poke = FunctionCallStatement(IdentifierReference(listOf("pokel"), arrayIndexedExpression.position), args, false, arrayIndexedExpression.position) + return listOf(IAstModification.ReplaceNode(assignment, poke, assignment.parent)) + } else { + val peek = FunctionCallExpression(IdentifierReference(listOf("peekl"), arrayIndexedExpression.position), mutableListOf(address), arrayIndexedExpression.position) + return listOf(IAstModification.ReplaceNode(arrayIndexedExpression, peek, parent)) + } } else if(arrayVar.datatype.sub==BaseDataType.FLOAT) { // use peekf/pokef if(parent is AssignTarget) { diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 359f89172..ea3e1de2e 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,12 +1,15 @@ TODO ==== +- optimized translation for pokeX and peekX if address = pointer + uwordoffset. + + STRUCTS and TYPED POINTERS -------------------------- - implement the remaining TODO's in PointerAssignmentsGen. - optimize deref in PointerAssignmentsGen: optimize 'forceTemporary' to only use a temporary when the offset is >0 -- optimize the float copying in assignIndexedPointer() (also word?) +- optimize the float copying in assignIndexedPointer() (also word and long?) - optimize augmented assignments to indexed pointer targets like sprptr[2]^^.y++ (these are now not performend in-place but as a regular assignment) - implement even more struct instance assignments (via memcopy) in CodeDesugarer (see the TODO) (add to documentation as well, paragraph 'Structs') - support @nosplit pointer arrays? @@ -24,6 +27,8 @@ Future Things and Ideas This will break some existing programs that depend on value wrap arounds, but gives more intuitive constant number handling. Can give descriptive error message for old syntax that still includes the type name? - improve ANTLR grammar with better error handling (as suggested by Qwen AI) +- add documentation for more library modules instead of just linking to the source code +- add an Index to the documentation - allow memory() to occur in array initializer - when a complete block is removed because unused, suppress all info messages about everything in the block being removed - fix the line, cols in Position, sometimes they count from 0 sometimes from 1 diff --git a/examples/c64/simplemultiplexer.p8 b/examples/c64/simplemultiplexer.p8 index 61a905b1e..968b059e2 100644 --- a/examples/c64/simplemultiplexer.p8 +++ b/examples/c64/simplemultiplexer.p8 @@ -36,7 +36,7 @@ irq { ; Here is the actual multiplexing routine. ; it's a raster irq just after the start of the sprite, ; that updates the Y position of all the sprits, - ; and registers a new rater irq for that next row of sprites. + ; and registers a new raster irq for that next row of sprites. ; If the bottom of the screen is reached, it resets the X position of the sprites as well, ; and moves the sprites back to the top of the screen. sub multiplexer() -> bool { @@ -48,15 +48,18 @@ irq { sprites_Y = sprites.sprites_Y_start first_sprite_X++ if first_sprite_X >= 340 - first_sprite_X =0 + first_sprite_X = 0 sprites.set_sprites_Y(sprites_Y) while c64.RASTER != cx16.r2 { - ; wait until raster line after sprite has been fully drawn (at least 24 lines down) + ; wait until raster line after sprites have been fully drawn (at least 24 lines down) } sprites.set_sprites_X(first_sprite_X) ; we can now update the X positions without risk of sprite tearing system_irq = true } else { + ; only set the new Y positions. But it's possible to change other attributes as well ofcourse (colors, x-position, data) + ; but raster timing is critical for that if you want to avoid tearing and glitches. Can probably not be done here at this raster position... sprites.set_sprites_Y(sprites_Y) + c64.SPXY[0]++ } sys.set_rasterline(sprites_Y+1) diff --git a/examples/test.p8 b/examples/test.p8 index 2d10ff380..4fc4c20e1 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -3,45 +3,17 @@ main { sub start() { - long @shared lv1 = -9999 -; txt.print_uw(lsw(lv1)) -; txt.spc() -; txt.print_w(lv1 as word) -; txt.spc() -; txt.print_uw(lv1 as uword) -; txt.spc() -; txt.print_b(lv1 as byte) -; txt.spc() -; txt.print_ub(lv1 as ubyte) -; txt.spc() -; txt.print_w(msw(lv1 << 8) as word) -; txt.spc() -; txt.print_w(lsw(lv1 >> 8) as word) + ^^bool flags + ^^word words + ^^long longs - txt.nl() - txt.nl() - lv1 = -9876543 - conv.str_ub0(123) - txt.print(conv.str_l(lv1)) - txt.spc() - txt.print(conv.string_out) - txt.nl() - lv1 = 123456 - txt.print(conv.str_l(lv1)) - txt.spc() - txt.print(conv.string_out) - txt.nl() - lv1 = -2147483647 - txt.print(conv.str_l(lv1)) - txt.spc() - txt.print(conv.string_out) - txt.nl() - lv1 = 2147483647 - txt.print(conv.str_l(lv1)) - txt.spc() - txt.print(conv.string_out) - txt.nl() - + ; TODO optimized translation of the peekX and pokeX calls: + if flags[cx16.r0] + flags[cx16.r0] = true + if words[cx16.r0]!=0 + words[cx16.r0] = 9990 + if longs[cx16.r0]!=0 + longs[cx16.r0] = 999999 } }