From 6c233c6a0a28a89da2f68230ba3a6fb5dd1eaae9 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 8 May 2023 02:41:34 +0200 Subject: [PATCH] optimize add/sub expr --- .../cpu6502/assignment/AssignmentAsmGen.kt | 38 ++++++++++++++++++- examples/test.p8 | 28 +++----------- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt index 9ce248775..859d671b2 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt @@ -529,7 +529,18 @@ internal class AssignmentAsmGen(private val program: PtProgram, assignRegisterByte(assign.target, CpuRegister.A, dt in SignedDatatypes) return true } - else -> return false + else -> { + assignExpressionToRegister(left, RegisterOrPair.A, left.type==DataType.BYTE) + asmgen.out(" pha") + assignExpressionToVariable(right, "P8ZP_SCRATCH_B1", right.type) + asmgen.out(" pla") + if(expr.operator=="+") + asmgen.out(" clc | adc P8ZP_SCRATCH_B1") + else + asmgen.out(" sec | sbc P8ZP_SCRATCH_B1") + assignRegisterByte(assign.target, CpuRegister.A, dt in SignedDatatypes) + return true + } } } else if(dt in WordDatatypes) { when (right) { @@ -630,7 +641,30 @@ internal class AssignmentAsmGen(private val program: PtProgram, } } } - else -> return false + else -> { + assignExpressionToVariable(right, "P8ZP_SCRATCH_W2", right.type) + assignExpressionToRegister(left, RegisterOrPair.AY, left.type==DataType.WORD) + if(expr.operator=="+") + asmgen.out(""" + clc + adc P8ZP_SCRATCH_W2 + pha + tya + adc P8ZP_SCRATCH_W2+1 + tay + pla""") + else + asmgen.out(""" + sec + sbc P8ZP_SCRATCH_W2 + pha + tya + sbc P8ZP_SCRATCH_W2+1 + tay + pla""") + assignRegisterpairWord(assign.target, RegisterOrPair.AY) + return true + } } } } diff --git a/examples/test.p8 b/examples/test.p8 index 9b89dc426..53b2be513 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -3,31 +3,13 @@ main { - uword vv = 60 - - sub print_time(uword seconds) { - ubyte remainder = seconds % $0003 ==0 - txt.print_uw(remainder) - txt.nl() - } - - sub print_time2(ubyte seconds) { - ubyte remainder = seconds % 3 ==0 - txt.print_uw(remainder) - txt.nl() - } - + word[5] dx = [111,222,333,444,555] sub start() { - print_time(9870) - print_time(9871) - print_time(9872) - print_time(9873) - txt.nl() - print_time2(50) - print_time2(51) - print_time2(52) - print_time2(53) + uword hit_x = 999 + cx16.r0=2 + uword new_head_x = hit_x + dx[cx16.r0L] as uword + txt.print_uw(new_head_x) } }