From c740b9f4876eb582203dd3617a2953ff44a3e001 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Fri, 2 Jul 2021 21:56:23 +0200 Subject: [PATCH] Added MAKELONG4() constant identification and removed need for declaration in source. Closes #675 --- .../cache/fragment-cache-csg65ce02.asm | 2 +- .../cache/fragment-cache-mega45gs02.asm | 2 +- .../fragment/cache/fragment-cache-mos6502.asm | 2 +- .../cache/fragment-cache-mos6502x.asm | 1425 ++++++++++++++++- .../cache/fragment-cache-rom6502x.asm | 2 +- .../cache/fragment-cache-wdc65c02.asm | 2 +- ...elong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuc1).asm | 5 + .../java/dk/camelot64/kickc/Compiler.java | 1 + .../kickc/passes/Pass1Procedures.java | 28 + .../kickc/passes/Pass2ConstantIntrinsics.java | 75 + .../kickc/test/TestProgramsFast.java | 5 + src/test/kc/makelong4-0.c | 3 - src/test/kc/makelong4-1.c | 6 + src/test/ref/makelong4-0.log | 3 - src/test/ref/makelong4-0.sym | 1 - src/test/ref/makelong4-1.asm | 24 + src/test/ref/makelong4-1.cfg | 8 + src/test/ref/makelong4-1.log | 184 +++ src/test/ref/makelong4-1.sym | 8 + 19 files changed, 1736 insertions(+), 50 deletions(-) create mode 100644 src/main/fragment/mos6502-common/vdum1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuc1).asm create mode 100644 src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIntrinsics.java create mode 100644 src/test/kc/makelong4-1.c create mode 100644 src/test/ref/makelong4-1.asm create mode 100644 src/test/ref/makelong4-1.cfg create mode 100644 src/test/ref/makelong4-1.log create mode 100644 src/test/ref/makelong4-1.sym diff --git a/src/main/fragment/cache/fragment-cache-csg65ce02.asm b/src/main/fragment/cache/fragment-cache-csg65ce02.asm index e32b32b84..1adc0ed93 100644 --- a/src/main/fragment/cache/fragment-cache-csg65ce02.asm +++ b/src/main/fragment/cache/fragment-cache-csg65ce02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE a95ddb03f a95ddcfb1 +//KICKC FRAGMENT CACHE aafa246f3 aafa2666a //FRAGMENT vbuzz=vbuc1 ldz #{c1} //FRAGMENT vbuzz_lt_vbuc1_then_la1 diff --git a/src/main/fragment/cache/fragment-cache-mega45gs02.asm b/src/main/fragment/cache/fragment-cache-mega45gs02.asm index e5ec4ab86..47c9a51cb 100644 --- a/src/main/fragment/cache/fragment-cache-mega45gs02.asm +++ b/src/main/fragment/cache/fragment-cache-mega45gs02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE a95ddb03f a95ddcfb1 +//KICKC FRAGMENT CACHE aafa246f3 aafa2666a //FRAGMENT _deref_pbuc1=vbuc2 lda #{c2} sta {c1} diff --git a/src/main/fragment/cache/fragment-cache-mos6502.asm b/src/main/fragment/cache/fragment-cache-mos6502.asm index a9dd92433..b1d18b974 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE a95ddb03f a95ddcfb1 +//KICKC FRAGMENT CACHE aafa246f3 aafa2666a //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} diff --git a/src/main/fragment/cache/fragment-cache-mos6502x.asm b/src/main/fragment/cache/fragment-cache-mos6502x.asm index a447eb2d7..1f0278ec8 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502x.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502x.asm @@ -1,4 +1,13 @@ -//KICKC FRAGMENT CACHE a95ddb03f a95ddcfb1 +//KICKC FRAGMENT CACHE aafa246f3 aafa2666a +//FRAGMENT _deref_pduc1=vduc2 +lda #<{c2} +sta {c1} +lda #>{c2} +sta {c1}+1 +lda #<{c2}>>$10 +sta {c1}+2 +lda #>{c2}>>$10 +sta {c1}+3 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} @@ -6,6 +15,1383 @@ sta {z1} lda {z1} cmp #{c1} bcc {la1} +//FRAGMENT vbuz1=_inc_vbuz1 +inc {z1} +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuz4)_(vbuz5) +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +lda {z4} +sta {z1}+2 +lda {z5} +sta {z1}+3 +//FRAGMENT _deref_pduc1=vduz1 +lda {z1} +sta {c1} +lda {z1}+1 +sta {c1}+1 +lda {z1}+2 +sta {c1}+2 +lda {z1}+3 +sta {c1}+3 +//FRAGMENT vbuaa_lt_vbuc1_then_la1 +cmp #{c1} +bcc {la1} +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuz3)_(vbuz4) +sta {z1}+1 +lda {z2} +sta {z1} +lda {z3} +sta {z1}+2 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuz3)_(vbuz4) +lda {z2} +sta {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuz3)_(vbuz4) +lda {z2} +ldx {z3} +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuz3)_(vbuz4) +sta {z1} +lda {z2} +sta {z1}+1 +lda {z3} +sta {z1}+2 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuz2)_(vbuz3) +tax +sta {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuz2)_(vbuz3) +sta {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuz2)_(vbuz3) +ldx {z2} +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuz3)_(vbuz4) +lda {z2} +ldy {z4} +stx {z1} +sta {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuz2)_(vbuz3) +ldy {z3} +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuz2)_(vbuz3) +ldy {z3} +txa +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuz2)_(vbuz3) +lda {z2} +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuz3)_(vbuz4) +lda {z2} +ldx {z3} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuz2)_(vbuz3) +ldx {z2} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuz2)_(vbuz3) +lda {z3} +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuz2)_(vbuz3) +ldx {z2} +tya +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuz4)_(vbuaa) +sta {z1}+3 +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuz3)_(vbuaa) +ldx {z2} +tay +stx {z1} +sta {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuz3)_(vbuaa) +ldy {z2} +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuz3)_(vbuaa) +ldx {z2} +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuz3)_(vbuaa) +ldx {z2} +tay +sta {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuz2)_(vbuaa) +tax +tay +sta {z1} +sty {z1}+1 +lda {z2} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuz2)_(vbuaa) +tay +sta {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuz2)_(vbuaa) +tax +sta {z1} +sty {z1}+1 +lda {z2} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuz3)_(vbuaa) +ldy {z2} +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuz2)_(vbuaa) +tay +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuz2)_(vbuaa) +tay +txa +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuz2)_(vbuaa) +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuz3)_(vbuaa) +ldx {z2} +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuz2)_(vbuaa) +tax +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuz2)_(vbuaa) +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuz2)_(vbuaa) +tax +tya +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuz4)_(vbuxx) +lda {z2} +ldy {z3} +sta {z1} +sty {z1}+1 +lda {z4} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuz3)_(vbuxx) +ldy {z2} +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuz3)_(vbuxx) +ldy {z2} +txa +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuz3)_(vbuxx) +lda {z2} +sta {z1} +sty {z1}+1 +lda {z3} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuz3)_(vbuxx) +ldy {z2} +sta {z1} +sty {z1}+1 +lda {z3} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuz2)_(vbuxx) +tay +sta {z1} +sty {z1}+1 +lda {z2} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuz2)_(vbuxx) +tay +txa +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuz2)_(vbuxx) +sta {z1} +sty {z1}+1 +lda {z2} +sta {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuz3)_(vbuxx) +ldy {z2} +txa +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuz2)_(vbuxx) +tay +txa +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuz2)_(vbuxx) +txa +tay +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuz2)_(vbuxx) +txa +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuz3)_(vbuxx) +lda {z2} +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuz2)_(vbuxx) +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuz2)_(vbuxx) +txa +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuz2)_(vbuxx) +tya +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuz4)_(vbuyy) +lda {z2} +ldx {z3} +sta {z1} +stx {z1}+1 +lda {z4} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuz3)_(vbuyy) +ldx {z2} +stx {z1} +sta {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuz3)_(vbuyy) +lda {z2} +sta {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuz3)_(vbuyy) +ldx {z2} +tya +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuz3)_(vbuyy) +ldx {z2} +sta {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuz2)_(vbuyy) +tax +sta {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuz2)_(vbuyy) +sta {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuz2)_(vbuyy) +tax +tya +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuz3)_(vbuyy) +lda {z2} +stx {z1} +sta {z1}+1 +lda {z3} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuz2)_(vbuyy) +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuz2)_(vbuyy) +txa +stx {z1} +sta {z1}+1 +lda {z2} +sta {z1}+2 +sty {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuz2)_(vbuyy) +tya +stx {z1} +sty {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuz3)_(vbuyy) +ldx {z2} +tya +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z3} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuz2)_(vbuyy) +tax +tya +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuz2)_(vbuyy) +tya +sty {z1} +stx {z1}+1 +sta {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuz2)_(vbuyy) +tya +tax +sty {z1} +sta {z1}+1 +stx {z1}+3 +lda {z2} +sta {z1}+2 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuaa)_(vbuz4) +sta {z1}+2 +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuaa)_(vbuz3) +ldy {z2} +tax +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuaa)_(vbuz3) +ldy {z2} +sty {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuaa)_(vbuz3) +ldx {z2} +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuaa)_(vbuz3) +ldx {z3} +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuaa)_(vbuz2) +tax +tay +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuaa)_(vbuz2) +tay +tya +sty {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuaa)_(vbuz2) +tax +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuaa)_(vbuz3) +ldy {z2} +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuaa)_(vbuz2) +tay +tya +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuaa)_(vbuz2) +stx $ff +ldy $ff +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuz2) +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuaa)_(vbuz3) +tax +lda {z2} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuaa)_(vbuz2) +tax +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuaa)_(vbuz2) +sty {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuaa)_(vbuz2) +tax +tya +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuaa)_(vbuaa) +tax +tay +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuaa)_(vbuaa) +tax +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuaa)_(vbuaa) +tay +txa +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuaa)_(vbuaa) +sty $ff +ldx $ff +tay +txa +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuaa)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuaa)_(vbuxx) +tay +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuaa)_(vbuxx) +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuaa)_(vbuxx) +tay +txa +tax +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuaa)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuaa)_(vbuyy) +sty $ff +ldx $ff +tay +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuaa)_(vbuyy) +sty $ff +ldx $ff +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuaa)_(vbuyy) +tax +tya +stx $ff +ldy $ff +tax +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuaa)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuxx)_(vbuz4) +lda {z2} +ldy {z3} +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z4} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuxx)_(vbuz3) +ldy {z2} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuxx)_(vbuz3) +ldy {z2} +txa +sty {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuxx)_(vbuz3) +lda {z2} +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuxx)_(vbuz3) +ldy {z2} +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuxx)_(vbuz2) +tay +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuxx)_(vbuz2) +tay +txa +sty {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuxx)_(vbuz2) +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuxx)_(vbuz3) +ldy {z2} +txa +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuxx)_(vbuz2) +tay +txa +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuxx)_(vbuz2) +txa +tay +tya +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuxx)_(vbuz2) +txa +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuxx)_(vbuz3) +lda {z2} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuxx)_(vbuz2) +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuxx)_(vbuz2) +txa +sty {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuxx)_(vbuz2) +tya +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuxx)_(vbuaa) +stx $ff +ldy $ff +tax +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuxx)_(vbuaa) +stx $ff +ldy $ff +tax +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuxx)_(vbuaa) +tay +txa +sty $ff +ldx $ff +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuxx)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuxx)_(vbuxx) +txa +tax +tay +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuxx)_(vbuxx) +tay +txa +sty $ff +ldx $ff +tay +txa +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuxx)_(vbuxx) +txa +tay +txa +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuxx)_(vbuxx) +txa +sty $ff +ldx $ff +tay +txa +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuxx)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuxx)_(vbuyy) +txa +sty $ff +ldx $ff +tay +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuxx)_(vbuyy) +txa +sty $ff +ldx $ff +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuxx)_(vbuyy) +tya +stx $ff +ldy $ff +tax +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuxx)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuyy)_(vbuz4) +lda {z2} +ldx {z4} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuyy)_(vbuz3) +sty $ff +ldx $ff +ldy {z2} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuyy)_(vbuz3) +tya +ldy {z2} +sty {z1} +stx {z1}+1 +lda {z3} +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuyy)_(vbuz3) +ldx {z2} +tya +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuyy)_(vbuz3) +ldx {z3} +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuyy)_(vbuz2) +sty $ff +ldx $ff +tay +sta {z1} +sty {z1}+1 +stx {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuyy)_(vbuz2) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuyy)_(vbuz2) +tax +tya +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuyy)_(vbuz3) +tya +ldy {z2} +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuyy)_(vbuz2) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuyy)_(vbuz2) +tya +stx $ff +ldy $ff +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuyy)_(vbuz2) +tya +stx {z1} +sty {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuyy)_(vbuz3) +tya +tax +lda {z2} +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z3} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuyy)_(vbuz2) +sty $ff +ldx $ff +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuyy)_(vbuz2) +tya +sty {z1} +stx {z1}+1 +lda {z2} +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuyy)_(vbuz2) +tya +tax +sty {z1} +stx {z1}+1 +sta {z1}+2 +lda {z2} +sta {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuyy)_(vbuaa) +tax +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuyy)_(vbuaa) +tax +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuyy)_(vbuaa) +tax +tya +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuyy)_(vbuaa) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuyy)_(vbuxx) +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuyy)_(vbuxx) +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuyy)_(vbuxx) +txa +tax +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuyy)_(vbuxx) +tya +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuyy)_(vbuxx) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuz3)_(vbuyy)_(vbuyy) +tya +tax +lda {z2} +sta {z1} +lda {z3} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuaa)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuxx)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuz2)_(vbuyy)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuz2)_(vbuyy)_(vbuyy) +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuaa)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuxx)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuaa)_(vbuyy)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuz2)_(vbuyy)_(vbuyy) +txa +sty $ff +ldx $ff +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuaa)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuxx)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuxx)_(vbuyy)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuz2)_(vbuyy)_(vbuyy) +tya +tax +tya +tay +sta {z1} +lda {z2} +sta {z1}+1 +sty {z1}+2 +stx {z1}+3 +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuaa)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuxx)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vduz1=_makelong4_(vbuyy)_(vbuyy)_(vbuyy)_(vbuyy) +NO_SYNTHESIS +//FRAGMENT vbuxx_lt_vbuc1_then_la1 +cpx #{c1} +bcc {la1} +//FRAGMENT vbuxx=vbuc1 +ldx #{c1} +//FRAGMENT vbuxx=_inc_vbuxx +inx +//FRAGMENT vbuyy=vbuc1 +ldy #{c1} +//FRAGMENT vbuyy_lt_vbuc1_then_la1 +cpy #{c1} +bcc {la1} +//FRAGMENT vbuyy=_inc_vbuyy +iny //FRAGMENT pbuc1_derefidx_vbuz1=vbuc2 lda #{c2} ldy {z1} @@ -18,9 +1404,6 @@ lda {z1} clc adc #2 sta {z1} -//FRAGMENT vbuaa_lt_vbuc1_then_la1 -cmp #{c1} -bcc {la1} //FRAGMENT pbuc1_derefidx_vbuaa=vbuc2 tay lda #{c2} @@ -34,16 +1417,6 @@ sta {c1},y //FRAGMENT vbuxx=vbuxx_plus_2 inx inx -//FRAGMENT vbuxx_lt_vbuc1_then_la1 -cpx #{c1} -bcc {la1} -//FRAGMENT vbuxx=vbuc1 -ldx #{c1} -//FRAGMENT vbuyy=vbuc1 -ldy #{c1} -//FRAGMENT vbuyy_lt_vbuc1_then_la1 -cpy #{c1} -bcc {la1} //FRAGMENT vbuyy=vbuyy_plus_2 iny iny @@ -55,8 +1428,6 @@ beq {la1} lda {z2} ldy {z1} sta {c1},y -//FRAGMENT vbuz1=_inc_vbuz1 -inc {z1} //FRAGMENT vbuz1_eq_vbuaa_then_la1 cmp {z1} beq {la1} @@ -86,10 +1457,6 @@ sta {c1},y //FRAGMENT pbuc1_derefidx_vbuyy=vbuyy tya sta {c1},y -//FRAGMENT vbuxx=_inc_vbuxx -inx -//FRAGMENT vbuyy=_inc_vbuyy -iny //FRAGMENT vbuaa=vbuc1 lda #{c1} //FRAGMENT vbuz1_eq_vbuyy_then_la1 @@ -8926,15 +10293,6 @@ cpy #0 bne {la1} //FRAGMENT vbsyy=vbsz1 ldy {z1} -//FRAGMENT _deref_pduc1=vduz1 -lda {z1} -sta {c1} -lda {z1}+1 -sta {c1}+1 -lda {z1}+2 -sta {c1}+2 -lda {z1}+3 -sta {c1}+3 //FRAGMENT vduz1=_dec_vduz2 lda {z2} sec @@ -10517,15 +11875,6 @@ iny lda #{c1} sty {z1}+1 sta {z1} -//FRAGMENT _deref_pduc1=vduc2 -lda #<{c2} -sta {c1} -lda #>{c2} -sta {c1}+1 -lda #<{c2}>>$10 -sta {c1}+2 -lda #>{c2}>>$10 -sta {c1}+3 //FRAGMENT vduz1=vduc1_minus__deref_pduc2 lda #<{c1} sec diff --git a/src/main/fragment/cache/fragment-cache-rom6502x.asm b/src/main/fragment/cache/fragment-cache-rom6502x.asm index 7bf6e7c9e..04bec85af 100644 --- a/src/main/fragment/cache/fragment-cache-rom6502x.asm +++ b/src/main/fragment/cache/fragment-cache-rom6502x.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE a95ddb03f a95ddcfb1 +//KICKC FRAGMENT CACHE aafa246f3 aafa2666a //FRAGMENT _deref_pbuc1=_inc__deref_pbuc1 inc {c1} //FRAGMENT isr_hardware_all_entry diff --git a/src/main/fragment/cache/fragment-cache-wdc65c02.asm b/src/main/fragment/cache/fragment-cache-wdc65c02.asm index f6673a4ad..b106c539b 100644 --- a/src/main/fragment/cache/fragment-cache-wdc65c02.asm +++ b/src/main/fragment/cache/fragment-cache-wdc65c02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE a95ddb03f a95ddcfb1 +//KICKC FRAGMENT CACHE aafa246f3 aafa2666a //FRAGMENT vbuz1=_deref_pbuc1 lda {c1} sta {z1} diff --git a/src/main/fragment/mos6502-common/vdum1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuc1).asm b/src/main/fragment/mos6502-common/vdum1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuc1).asm new file mode 100644 index 000000000..779f6f2ff --- /dev/null +++ b/src/main/fragment/mos6502-common/vdum1=_makelong4_(vbuxx)_(vbuyy)_(vbuaa)_(vbuc1).asm @@ -0,0 +1,5 @@ +stx {m1} +sty {m1}+1 +sta {m1}+2 +lda #{c1} +sta {m1}+3 diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index 55afa4f88..ddf2aca05 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -378,6 +378,7 @@ public class Compiler { optimizations.add(new PassNArrayElementAddressOfRewriting(program)); optimizations.add(new Pass2ConditionalJumpSequenceImprovement(program)); optimizations.add(new Pass2ConstantRValueConsolidation(program)); + optimizations.add(new Pass2ConstantIntrinsics(program)); optimizations.add(new Pass2ConstantIdentification(program)); optimizations.add(new Pass2ConstantValues(program)); optimizations.add(new Pass2ConstantCallPointerIdentification(program)); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1Procedures.java b/src/main/java/dk/camelot64/kickc/passes/Pass1Procedures.java index 63bd13316..4bdd5dd52 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1Procedures.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1Procedures.java @@ -8,6 +8,11 @@ import dk.camelot64.kickc.model.statements.StatementCall; import dk.camelot64.kickc.model.symbols.Procedure; import dk.camelot64.kickc.model.symbols.Scope; import dk.camelot64.kickc.model.symbols.Symbol; +import dk.camelot64.kickc.model.symbols.Variable; +import dk.camelot64.kickc.model.types.SymbolType; +import dk.camelot64.kickc.model.types.SymbolTypeProcedure; + +import java.util.Arrays; /** * Updates procedure calls to point to the actual procedure called. @@ -25,6 +30,29 @@ public class Pass1Procedures extends Pass2SsaOptimization { if(statement instanceof StatementCall) { StatementCall call = (StatementCall) statement; String procedureName = call.getProcedureName(); + if(procedureName.equals(Pass1ByteXIntrinsicRewrite.INTRINSIC_MAKELONG4)) { + if(getScope().getGlobalSymbol(Pass1ByteXIntrinsicRewrite.INTRINSIC_MAKELONG4) == null) { + // Add the intrinsic MAKEWORD4() + final Procedure makeword4 = new Procedure( + Pass1ByteXIntrinsicRewrite.INTRINSIC_MAKELONG4, + new SymbolTypeProcedure(SymbolType.DWORD, Arrays.asList(new SymbolType[]{ SymbolType.BYTE, SymbolType.BYTE, SymbolType.BYTE, SymbolType.BYTE})), + getScope(), + Scope.SEGMENT_CODE_DEFAULT, Scope.SEGMENT_DATA_DEFAULT, + Procedure.CallingConvention.INTRINSIC_CALL); + makeword4.setDeclaredIntrinsic(true); + final Variable hihi = new Variable("hihi", Variable.Kind.PHI_MASTER, SymbolType.BYTE, makeword4, Variable.MemoryArea.ZEROPAGE_MEMORY, Scope.SEGMENT_DATA_DEFAULT, null); + makeword4.add(hihi); + final Variable hilo = new Variable("hilo", Variable.Kind.PHI_MASTER, SymbolType.BYTE, makeword4, Variable.MemoryArea.ZEROPAGE_MEMORY, Scope.SEGMENT_DATA_DEFAULT, null); + makeword4.add(hilo); + final Variable lohi = new Variable("lohi", Variable.Kind.PHI_MASTER, SymbolType.BYTE, makeword4, Variable.MemoryArea.ZEROPAGE_MEMORY, Scope.SEGMENT_DATA_DEFAULT, null); + makeword4.add(lohi); + final Variable lolo = new Variable("lolo", Variable.Kind.PHI_MASTER, SymbolType.BYTE, makeword4, Variable.MemoryArea.ZEROPAGE_MEMORY, Scope.SEGMENT_DATA_DEFAULT, null); + makeword4.add(lolo); + makeword4.setParameters(Arrays.asList(hihi, hilo, lohi, lolo)); + getScope().add(makeword4); + } + } + Scope localScope = (Scope) getScope().getSymbol(block.getScope()); final Symbol procedureSymbol = localScope.findSymbol(procedureName); if(procedureSymbol == null) diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIntrinsics.java b/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIntrinsics.java new file mode 100644 index 000000000..66aaa7c22 --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIntrinsics.java @@ -0,0 +1,75 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.model.ControlFlowBlock; +import dk.camelot64.kickc.model.Program; +import dk.camelot64.kickc.model.operators.Operators; +import dk.camelot64.kickc.model.statements.Statement; +import dk.camelot64.kickc.model.statements.StatementAssignment; +import dk.camelot64.kickc.model.statements.StatementCall; +import dk.camelot64.kickc.model.symbols.Procedure; +import dk.camelot64.kickc.model.types.SymbolType; +import dk.camelot64.kickc.model.values.ConstantBinary; +import dk.camelot64.kickc.model.values.ConstantInteger; +import dk.camelot64.kickc.model.values.ConstantValue; +import dk.camelot64.kickc.model.values.RValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; + +/** + * Compiler Pass propagating identifying (intrinsic) calls that return a constant value + */ +public class Pass2ConstantIntrinsics extends Pass2SsaOptimization { + + public Pass2ConstantIntrinsics(Program program) { + super(program); + } + + @Override + public boolean step() { + for(ControlFlowBlock block : getGraph().getAllBlocks()) { + final ListIterator stmtIt = block.getStatements().listIterator(); + while(stmtIt.hasNext()) { + Statement statement = stmtIt.next(); + if(statement instanceof StatementCall) { + final StatementCall call = (StatementCall) statement; + final Procedure procedure = getScope().getProcedure(call.getProcedure()); + if(procedure.isDeclaredIntrinsic()) { + if(procedure.getFullName().equals(Pass1ByteXIntrinsicRewrite.INTRINSIC_MAKELONG4)) { + List constParams = new ArrayList<>(); + for(RValue parameter : call.getParameters()) { + final ConstantValue constParam = Pass2ConstantIdentification.getConstant(parameter); + if(constParam == null) break; + constParams.add(constParam); + } + if(constParams.size() == 4) { + // All parameters are constant - dword is constant + final ConstantBinary constValue = new ConstantBinary( + new ConstantBinary(constParams.get(0), Operators.MULTIPLY, new ConstantInteger(0x1000000l, SymbolType.DWORD)), + Operators.PLUS, + new ConstantBinary( + new ConstantBinary(constParams.get(1), Operators.MULTIPLY, new ConstantInteger(0x10000l, SymbolType.DWORD)), + Operators.PLUS, + new ConstantBinary( + new ConstantBinary(constParams.get(2), Operators.MULTIPLY, new ConstantInteger(0x100l, SymbolType.DWORD)), + Operators.PLUS, + constParams.get(3) + ) + ) + ); + // Remove the intrinsic call + stmtIt.remove(); + // Add the constant assignment + stmtIt.add(new StatementAssignment(call.getlValue(), constValue, call.isInitialAssignment(), call.getSource(), call.getComments())); + getLog().append("Identified constant dword "+call.toString(getProgram(), false)); + } + } + } + } + + } + } + return false; + } +} diff --git a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java index c42530f7d..ad3dbdf7a 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java +++ b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java @@ -9,6 +9,11 @@ import java.io.IOException; */ public class TestProgramsFast extends TestPrograms { + @Test + public void testMakeLong41() throws IOException { + compileAndCompare("makelong4-1.c"); + } + @Test public void testMakeLong40() throws IOException { compileAndCompare("makelong4-0.c"); diff --git a/src/test/kc/makelong4-0.c b/src/test/kc/makelong4-0.c index 3463983f1..3ca0a0cf4 100644 --- a/src/test/kc/makelong4-0.c +++ b/src/test/kc/makelong4-0.c @@ -1,8 +1,5 @@ // Test MAKELONG4() - -__intrinsic __intrinsiccall unsigned long MAKELONG4(char hihi,char hilo,char lohi,char lolo); - void main() { unsigned long* const SCREEN = (unsigned int*)0x0400; for(char lolo=0;lolo<100;lolo++) diff --git a/src/test/kc/makelong4-1.c b/src/test/kc/makelong4-1.c new file mode 100644 index 000000000..a201af32d --- /dev/null +++ b/src/test/kc/makelong4-1.c @@ -0,0 +1,6 @@ +// Test MAKELONG4() with constants + +void main() { + unsigned long* const SCREEN = (unsigned int*)0x0400; + *SCREEN = MAKELONG4(1, 2, 3, 4); +} \ No newline at end of file diff --git a/src/test/ref/makelong4-0.log b/src/test/ref/makelong4-0.log index afe9ef539..2cfe3161e 100644 --- a/src/test/ref/makelong4-0.log +++ b/src/test/ref/makelong4-0.log @@ -90,7 +90,6 @@ byte MAKELONG4::hihi byte MAKELONG4::hilo byte MAKELONG4::lohi byte MAKELONG4::lolo -dword MAKELONG4::return void __start() void main() bool~ main::$0 @@ -273,7 +272,6 @@ byte MAKELONG4::hihi byte MAKELONG4::hilo byte MAKELONG4::lohi byte MAKELONG4::lolo -dword MAKELONG4::return void main() dword~ main::$4 10001.0 byte main::hihi @@ -776,7 +774,6 @@ byte MAKELONG4::hihi byte MAKELONG4::hilo byte MAKELONG4::lohi byte MAKELONG4::lolo -dword MAKELONG4::return void main() dword~ main::$4 zp[4]:4 10001.0 constant dword* const main::SCREEN = (word*) 1024 diff --git a/src/test/ref/makelong4-0.sym b/src/test/ref/makelong4-0.sym index 0bd983c0f..7644bc5a0 100644 --- a/src/test/ref/makelong4-0.sym +++ b/src/test/ref/makelong4-0.sym @@ -3,7 +3,6 @@ byte MAKELONG4::hihi byte MAKELONG4::hilo byte MAKELONG4::lohi byte MAKELONG4::lolo -dword MAKELONG4::return void main() dword~ main::$4 zp[4]:4 10001.0 constant dword* const main::SCREEN = (word*) 1024 diff --git a/src/test/ref/makelong4-1.asm b/src/test/ref/makelong4-1.asm new file mode 100644 index 000000000..c4731d5d9 --- /dev/null +++ b/src/test/ref/makelong4-1.asm @@ -0,0 +1,24 @@ +// Test MAKELONG4() with constants + // Commodore 64 PRG executable file +.file [name="makelong4-1.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$0801] +.segmentdef Code [start=$80d] +.segmentdef Data [startAfter="Code"] +.segment Basic +:BasicUpstart(main) +.segment Code +main: { + .label SCREEN = $400 + // *SCREEN = MAKELONG4(1, 2, 3, 4) + lda #<1*$1000000+2*$10000+3*$100+4 + sta SCREEN + lda #>1*$1000000+2*$10000+3*$100+4 + sta SCREEN+1 + lda #<1*$1000000+2*$10000+3*$100+4>>$10 + sta SCREEN+2 + lda #>1*$1000000+2*$10000+3*$100+4>>$10 + sta SCREEN+3 + // } + rts +} diff --git a/src/test/ref/makelong4-1.cfg b/src/test/ref/makelong4-1.cfg new file mode 100644 index 000000000..a3241ecf5 --- /dev/null +++ b/src/test/ref/makelong4-1.cfg @@ -0,0 +1,8 @@ + +void main() +main: scope:[main] from + [0] *main::SCREEN = 1*$1000000+2*$10000+3*$100+4 + to:main::@return +main::@return: scope:[main] from main + [1] return + to:@return diff --git a/src/test/ref/makelong4-1.log b/src/test/ref/makelong4-1.log new file mode 100644 index 000000000..c668cb835 --- /dev/null +++ b/src/test/ref/makelong4-1.log @@ -0,0 +1,184 @@ + +CONTROL FLOW GRAPH SSA + +void main() +main: scope:[main] from __start + main::$0 = call MAKELONG4 1 2 3 4 + *main::SCREEN = main::$0 + to:main::@return +main::@return: scope:[main] from main + return + to:@return + +void __start() +__start: scope:[__start] from + call main + to:__start::@1 +__start::@1: scope:[__start] from __start + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + return + to:@return + +SYMBOL TABLE SSA +__intrinsic __intrinsiccall dword MAKELONG4(byte MAKELONG4::hihi , byte MAKELONG4::hilo , byte MAKELONG4::lohi , byte MAKELONG4::lolo) +byte MAKELONG4::hihi +byte MAKELONG4::hilo +byte MAKELONG4::lohi +byte MAKELONG4::lolo +void __start() +void main() +dword~ main::$0 +constant dword* const main::SCREEN = (word*)$400 + +Adding number conversion cast (unumber) 1 in main::$0 = call MAKELONG4 1 2 3 4 +Adding number conversion cast (unumber) 2 in main::$0 = call MAKELONG4 (unumber)1 2 3 4 +Adding number conversion cast (unumber) 3 in main::$0 = call MAKELONG4 (unumber)1 (unumber)2 3 4 +Adding number conversion cast (unumber) 4 in main::$0 = call MAKELONG4 (unumber)1 (unumber)2 (unumber)3 4 +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant pointer cast (word*) 1024 +Simplifying constant integer cast 1 +Simplifying constant integer cast 2 +Simplifying constant integer cast 3 +Simplifying constant integer cast 4 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 2 +Finalized unsigned number type (byte) 3 +Finalized unsigned number type (byte) 4 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Identified constant dword [0] main::$0 = call MAKELONG4 1 2 3 4 +Constant main::$0 = 1*$1000000+2*$10000+3*$100+4 +Successful SSA optimization Pass2ConstantIdentification +Removing unused procedure __start +Removing unused procedure block __start +Removing unused procedure block __start::@1 +Removing unused procedure block __start::@return +Successful SSA optimization PassNEliminateEmptyStart +Constant inlined main::$0 = 1*$1000000+2*$10000+3*$100+4 +Successful SSA optimization Pass2ConstantInlining +CALL GRAPH + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes + +FINAL CONTROL FLOW GRAPH + +void main() +main: scope:[main] from + [0] *main::SCREEN = 1*$1000000+2*$10000+3*$100+4 + to:main::@return +main::@return: scope:[main] from main + [1] return + to:@return + + +VARIABLE REGISTER WEIGHTS +__intrinsic __intrinsiccall dword MAKELONG4(byte MAKELONG4::hihi , byte MAKELONG4::hilo , byte MAKELONG4::lohi , byte MAKELONG4::lolo) +byte MAKELONG4::hihi +byte MAKELONG4::hilo +byte MAKELONG4::lohi +byte MAKELONG4::lolo +void main() + +Initial phi equivalence classes +Complete equivalence classes +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [0] *main::SCREEN = 1*$1000000+2*$10000+3*$100+4 [ ] ( [ ] { } ) always clobbers reg byte a + +REGISTER UPLIFT SCOPES +Uplift Scope [main] +Uplift Scope [MAKELONG4] +Uplift Scope [] + +Uplifting [main] best 33 combination +Uplifting [MAKELONG4] best 33 combination +Uplifting [] best 33 combination + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +// Test MAKELONG4() with constants + // Upstart + // Commodore 64 PRG executable file +.file [name="makelong4-1.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$0801] +.segmentdef Code [start=$80d] +.segmentdef Data [startAfter="Code"] +.segment Basic +:BasicUpstart(main) + // Global Constants & labels +.segment Code + // main +main: { + .label SCREEN = $400 + // [0] *main::SCREEN = 1*$1000000+2*$10000+3*$100+4 -- _deref_pduc1=vduc2 + lda #<1*$1000000+2*$10000+3*$100+4 + sta SCREEN + lda #>1*$1000000+2*$10000+3*$100+4 + sta SCREEN+1 + lda #<1*$1000000+2*$10000+3*$100+4>>$10 + sta SCREEN+2 + lda #>1*$1000000+2*$10000+3*$100+4>>$10 + sta SCREEN+3 + jmp __breturn + // main::@return + __breturn: + // [1] return + rts +} + // File Data + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +__intrinsic __intrinsiccall dword MAKELONG4(byte MAKELONG4::hihi , byte MAKELONG4::hilo , byte MAKELONG4::lohi , byte MAKELONG4::lolo) +byte MAKELONG4::hihi +byte MAKELONG4::hilo +byte MAKELONG4::lohi +byte MAKELONG4::lolo +void main() +constant dword* const main::SCREEN = (word*) 1024 + + + +FINAL ASSEMBLER +Score: 30 + + // File Comments +// Test MAKELONG4() with constants + // Upstart + // Commodore 64 PRG executable file +.file [name="makelong4-1.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$0801] +.segmentdef Code [start=$80d] +.segmentdef Data [startAfter="Code"] +.segment Basic +:BasicUpstart(main) + // Global Constants & labels +.segment Code + // main +main: { + .label SCREEN = $400 + // *SCREEN = MAKELONG4(1, 2, 3, 4) + // [0] *main::SCREEN = 1*$1000000+2*$10000+3*$100+4 -- _deref_pduc1=vduc2 + lda #<1*$1000000+2*$10000+3*$100+4 + sta SCREEN + lda #>1*$1000000+2*$10000+3*$100+4 + sta SCREEN+1 + lda #<1*$1000000+2*$10000+3*$100+4>>$10 + sta SCREEN+2 + lda #>1*$1000000+2*$10000+3*$100+4>>$10 + sta SCREEN+3 + // main::@return + // } + // [1] return + rts +} + // File Data + diff --git a/src/test/ref/makelong4-1.sym b/src/test/ref/makelong4-1.sym new file mode 100644 index 000000000..ef1f1223d --- /dev/null +++ b/src/test/ref/makelong4-1.sym @@ -0,0 +1,8 @@ +__intrinsic __intrinsiccall dword MAKELONG4(byte MAKELONG4::hihi , byte MAKELONG4::hilo , byte MAKELONG4::lohi , byte MAKELONG4::lolo) +byte MAKELONG4::hihi +byte MAKELONG4::hilo +byte MAKELONG4::lohi +byte MAKELONG4::lolo +void main() +constant dword* const main::SCREEN = (word*) 1024 +