From 0359c8584610a40e000d1cb5571f127b232a2503 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 31 May 2020 08:09:15 +0200 Subject: [PATCH] More void-pointer synthesis. Fragment test is showing some performance issues. #449 --- pom.xml | 3 +++ .../_deref_pptc1=_deref_pptc1_minus_vwuc2.asm | 7 +++++++ .../_deref_pptc1=_deref_pptc1_minus_vwum1.asm | 7 +++++++ ...=> _deref_pptc1=_deref_pptc1_plus__deref_pwuc2.asm} | 6 +++--- .../_deref_pptc1=_deref_pptc1_plus_vwuc2.asm | 7 +++++++ .../_deref_pptc1=_deref_pptc1_plus_vwum1.asm | 7 +++++++ .../mos6502-common/_deref_pptc1=_deref_pptz1.asm | 6 ++++++ .../_deref_pptc1_eq__deref_pptc2_then_la1.asm | 7 +++++++ .../_deref_pptz1=pptz2_derefidx_vbuyy.asm | 9 +++++++++ .../mos6502-common/_deref_pptz1_neq_0_then_la1.asm | 6 ++++++ .../mos6502-common/_deref_pptz1_neq_pvom2_then_la1.asm | 8 ++++++++ .../pptz1_derefidx_vbuc1=_deref_pptz2.asm | 10 ++++++++++ .../pptz1_derefidx_vbuyy=_deref_pptc2.asm | 5 +++++ .../mos6502-common/pvom1=_deref_pptc1_minus_vbuc2.asm | 7 +++++++ .../mos6502-common/pvom1_ge__deref_pptc1_then_la1.asm | 8 ++++++++ .../fragment/AsmFragmentTemplateSynthesisRule.java | 4 ++-- 16 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwuc2.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwum1.asm rename src/main/fragment/mos6502-common/{_deref_pptc1=_deref_pptc1_plus_vbuc2.asm => _deref_pptc1=_deref_pptc1_plus__deref_pwuc2.asm} (68%) create mode 100644 src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwuc2.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwum1.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptz1.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptc1_eq__deref_pptc2_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptz1=pptz2_derefidx_vbuyy.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptz1_neq_0_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/_deref_pptz1_neq_pvom2_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/pptz1_derefidx_vbuc1=_deref_pptz2.asm create mode 100644 src/main/fragment/mos6502-common/pptz1_derefidx_vbuyy=_deref_pptc2.asm create mode 100644 src/main/fragment/mos6502-common/pvom1=_deref_pptc1_minus_vbuc2.asm create mode 100644 src/main/fragment/mos6502-common/pvom1_ge__deref_pptc1_then_la1.asm diff --git a/pom.xml b/pom.xml index 986311804..b9c3f5cbd 100644 --- a/pom.xml +++ b/pom.xml @@ -95,6 +95,9 @@ maven-surefire-plugin 2.12.4 + + **/TestFragments.java + false all 5 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwuc2.asm b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwuc2.asm new file mode 100644 index 000000000..e15cfa3b4 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwuc2.asm @@ -0,0 +1,7 @@ +sec +lda {c1} +sbc #<{c2} +sta {c1} +lda {c1}+1 +sbc #>{c2} +sta {c1}+1 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwum1.asm b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwum1.asm new file mode 100644 index 000000000..a7fcd84ec --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_minus_vwum1.asm @@ -0,0 +1,7 @@ +sec +lda {c1} +sbc {m1} +sta {c1} +lda {c1}+1 +sbc {m1}+1 +sta {c1}+1 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vbuc2.asm b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus__deref_pwuc2.asm similarity index 68% rename from src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vbuc2.asm rename to src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus__deref_pwuc2.asm index c40cde162..ddffa4f5d 100644 --- a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vbuc2.asm +++ b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus__deref_pwuc2.asm @@ -1,7 +1,7 @@ -lda {c1} clc -adc #{c2} +lda {c1} +adc {c2} sta {c1} lda {c1}+1 -adc #0 +adc {c2}+1 sta {c1}+1 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwuc2.asm b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwuc2.asm new file mode 100644 index 000000000..2482acbd5 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwuc2.asm @@ -0,0 +1,7 @@ +clc +lda {c1} +adc #<{c2} +sta {c1} +lda {c1}+1 +adc #>{c2} +sta {c1}+1 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwum1.asm b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwum1.asm new file mode 100644 index 000000000..162c54aa6 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptc1_plus_vwum1.asm @@ -0,0 +1,7 @@ +clc +lda {c1} +adc {m1} +sta {c1} +lda {c1}+1 +adc {m1}+1 +sta {c1}+1 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptz1.asm b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptz1.asm new file mode 100644 index 000000000..28987eb32 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptc1=_deref_pptz1.asm @@ -0,0 +1,6 @@ +ldy #0 +lda ({z1}),y +sta {c1} +iny +lda ({z1}),y +sta {c1}+1 diff --git a/src/main/fragment/mos6502-common/_deref_pptc1_eq__deref_pptc2_then_la1.asm b/src/main/fragment/mos6502-common/_deref_pptc1_eq__deref_pptc2_then_la1.asm new file mode 100644 index 000000000..eba859500 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptc1_eq__deref_pptc2_then_la1.asm @@ -0,0 +1,7 @@ +lda {c1} +cmp {c2} +bne !+ +lda {c1}+1 +cmp {c2}+1 +beq {la1} +!: diff --git a/src/main/fragment/mos6502-common/_deref_pptz1=pptz2_derefidx_vbuyy.asm b/src/main/fragment/mos6502-common/_deref_pptz1=pptz2_derefidx_vbuyy.asm new file mode 100644 index 000000000..c0b7c9269 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptz1=pptz2_derefidx_vbuyy.asm @@ -0,0 +1,9 @@ +lda ({z2}),y +pha +iny +lda ({z2}),y +ldy #1 +sta ({z1}),y +dey +pla +sta ({z1}),y \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/_deref_pptz1_neq_0_then_la1.asm b/src/main/fragment/mos6502-common/_deref_pptz1_neq_0_then_la1.asm new file mode 100644 index 000000000..82ac9a42e --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptz1_neq_0_then_la1.asm @@ -0,0 +1,6 @@ +ldy #0 +lda ({z1}),y +bne {la1} +iny +lda ({z1}),y +bne {la1} \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/_deref_pptz1_neq_pvom2_then_la1.asm b/src/main/fragment/mos6502-common/_deref_pptz1_neq_pvom2_then_la1.asm new file mode 100644 index 000000000..a1f2852b3 --- /dev/null +++ b/src/main/fragment/mos6502-common/_deref_pptz1_neq_pvom2_then_la1.asm @@ -0,0 +1,8 @@ +ldy #0 +lda ({z1}),y +cmp {m2} +bne {la1} +iny +lda ({z1}),y +cmp {m2}+1 +bne {la1} \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/pptz1_derefidx_vbuc1=_deref_pptz2.asm b/src/main/fragment/mos6502-common/pptz1_derefidx_vbuc1=_deref_pptz2.asm new file mode 100644 index 000000000..c6496c9c1 --- /dev/null +++ b/src/main/fragment/mos6502-common/pptz1_derefidx_vbuc1=_deref_pptz2.asm @@ -0,0 +1,10 @@ +ldy #1 +lda ({z2}),y +pha +dey +lda ({z2}),y +ldy #{c1} +sta ({z1}),y +iny +pla +sta ({z1}),y diff --git a/src/main/fragment/mos6502-common/pptz1_derefidx_vbuyy=_deref_pptc2.asm b/src/main/fragment/mos6502-common/pptz1_derefidx_vbuyy=_deref_pptc2.asm new file mode 100644 index 000000000..46ac5872f --- /dev/null +++ b/src/main/fragment/mos6502-common/pptz1_derefidx_vbuyy=_deref_pptc2.asm @@ -0,0 +1,5 @@ +lda {c2} +sta ({z1}),y +iny +lda {c2}+1 +sta ({z1}),y diff --git a/src/main/fragment/mos6502-common/pvom1=_deref_pptc1_minus_vbuc2.asm b/src/main/fragment/mos6502-common/pvom1=_deref_pptc1_minus_vbuc2.asm new file mode 100644 index 000000000..f23c16374 --- /dev/null +++ b/src/main/fragment/mos6502-common/pvom1=_deref_pptc1_minus_vbuc2.asm @@ -0,0 +1,7 @@ +sec +lda {c1} +sbc #{c2} +sta {m1} +lda {c1}+1 +sbc #0 +sta {m1}+1 diff --git a/src/main/fragment/mos6502-common/pvom1_ge__deref_pptc1_then_la1.asm b/src/main/fragment/mos6502-common/pvom1_ge__deref_pptc1_then_la1.asm new file mode 100644 index 000000000..29491641d --- /dev/null +++ b/src/main/fragment/mos6502-common/pvom1_ge__deref_pptc1_then_la1.asm @@ -0,0 +1,8 @@ +lda {m1}+1 +cmp {c1}+1 +bcc !+ +bne {la1} +lda {m1} +cmp {c1} +bcs {la1} +!: diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java index 715e6b197..ade9fd9fe 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java @@ -711,8 +711,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)z1_derefidx_vbuaa=(.*)", twoZM1, "sta $ff" , "vb$1aa=$2", "ldy $ff\nsta ({z1}),y", mapZM1)); // Synthesize typed pointer math using void pointers - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)p..([czm][1-9])(.*)", null, null, "$1pvo$2$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)p..([czm][1-9])(.*p.*)", null, null, "$1pvo$2$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)p[^v][^o]([czm][1-9])(.*)", null, null, "$1pvo$2$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)p[^v][^o]([czm][1-9])(.*p.*)", null, null, "$1pvo$2$3", null, null)); // Synthesize some constant pointers as constant words (remove when the above section can be included) synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_(lt|gt|le|ge|eq|neq)_p..([czm].)_then_(.*)", null, null, "$1_$2_vwu$3_then_$4", null, null));