diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java index 4eae24de8..e3dd98de1 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java @@ -11,16 +11,16 @@ class AsmFragmentTemplateSynthesisRule { /** Regular expression that matches the signature of fragments that the synthesis rule can handle. * Contains matching groups (parenthesis) that are used in sigReplace to build the signature of the sub-fragment to synthesize from. */ - final private String sigMatch; + final String sigMatch; /** Regular expression that limits which fragments the synthesize rule can handle. */ - final private String sigAvoid; + final String sigAvoid; /** ASM code prefixed to the sub-fragment when synthesizing. */ final private String asmPrefix; /** Signature of the sub-fragment to use for synthesizing the fragment. References the matching groups from sigMatch (via $1, $2, ...). */ - final private String sigReplace; + final String sigReplace; /** ASM code postfixed to the sub-fragment when synthesizing. */ final private String asmPostfix; @@ -123,7 +123,9 @@ class AsmFragmentTemplateSynthesisRule { } newFragment.append(subFragment); if(asmPostfix != null) { - newFragment.append("\n"); + if(newFragment.length()>0 && !newFragment.substring(newFragment.length()-1).equals("\n")) { + newFragment.append("\n"); + } newFragment.append(asmPostfix); } return new AsmFragmentTemplate(signature, newFragment.toString(), this, subTemplate); @@ -185,6 +187,8 @@ class AsmFragmentTemplateSynthesisRule { mapZ2.put("z3", "z1"); Map mapZ3 = new LinkedHashMap<>(); mapZ3.put("z3", "z2"); + Map mapZ4 = new LinkedHashMap<>(); + mapZ3.put("z4", "z3"); Map mapC = new LinkedHashMap<>(); mapC.put("c2", "c1"); mapC.put("c3", "c2"); @@ -260,6 +264,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z1(.*vb.)z1(.*)", "...z1=.*|.*aa.*", "lda {z1}", "$1z1$2aa$3", null, null)); // Replace non-assigned Z1 with AA synths.add(new AsmFragmentTemplateSynthesisRule("(...aa)=(.*vb.)z1(.*)", ".*z1.*z1.*|.*=.*aa.*", "lda {z1}", "$1=$2aa$3", null, mapZ)); + // Replace assigned Z1 with AA + synths.add(new AsmFragmentTemplateSynthesisRule("(vb.)z1=(.*)", ".*z1.*z1.*", null, "$1aa=$2", "sta {z1}", mapZ)); // Replace Z1 with YY (only one) synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z1(.*)", "...z1=.*|.*z1.*z1.*|.*yy.*", "ldy {z1}", "$1yy$2", null, mapZ)); @@ -271,6 +277,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z1(.*vb.)z1(.*)", "...z1=.*|.*yy.*", "ldy {z1}", "$1z1$2yy$3", null, null)); // Replace non-assigned Z1 with YY synths.add(new AsmFragmentTemplateSynthesisRule("(...yy)=(.*vb.)z1(.*)", ".*z1.*z1.*|.*=.*yy.*", "ldy {z1}", "$1=$2yy$3", null, mapZ)); + // Replace assigned Z1 with YY + synths.add(new AsmFragmentTemplateSynthesisRule("(vb.)z1=(.*)", ".*z1.*z1.*", null, "$1yy=$2", "sty {z1}", mapZ)); // Replace Z1 with XX (only one) synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z1(.*)", "...z1=.*|.*z1.*z1.*|.*xx.*", "ldx {z1}", "$1xx$2", null, mapZ)); @@ -282,6 +290,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z1(.*vb.)z1(.*)", "...z1=.*|.*xx.*", "ldx {z1}", "$1z1$2xx$3", null, null)); // Replace non-assigned Z1 with XX synths.add(new AsmFragmentTemplateSynthesisRule("(...xx)=(.*vb.)z1(.*)", ".*z1.*z1.*|.*=.*xx.*", "ldx {z1}", "$1=$2xx$3", null, mapZ)); + // Replace assigned Z1 with XX + synths.add(new AsmFragmentTemplateSynthesisRule("(vb.)z1=(.*)", ".*z1.*z1.*", null, "$1xx=$2", "stx {z1}", mapZ)); // Replace Z2 with AA (only one) synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z2(.*)", "...z2=.*|.*z2.*z2.*|.*aa.*", "lda {z2}", "$1aa$2", null, mapZ3)); @@ -310,6 +320,14 @@ class AsmFragmentTemplateSynthesisRule { // Replace second (of 2) Z2 with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z2(.*vb.)z2(.*)", "...z2=.*|.*xx.*", "ldx {z2}", "$1z2$2xx$3", null, null)); + // Replace Z3 with AA (only one) + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z3(.*)", "...z3=.*|.*z3.*z3.*|.*aa.*", "lda {z3}", "$1aa$2", null, mapZ4)); + // Replace Z3 with YY (only one) + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z3(.*)", "...z3=.*|.*z3.*z3.*|.*yy.*", "ldy {z3}", "$1yy$2", null, mapZ4)); + // Replace Z3 with XX (only one) + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z3(.*)", "...z3=.*|.*z3.*z3.*|.*xx.*", "ldx {z3}", "$1xx$2", null, mapZ4)); + + // Rewrite comparisons < to > synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(.*)_then_(.*)", null, null, "$2_lt_$1_then_$3", null, null)); // Rewrite comparisons > to < @@ -329,21 +347,21 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_(eq|neq)_(.*)_then_(.*)", null, null, "$3_$2_$1_then_$4", null, null)); // Rewrite Assignments to X from A - synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)xx=(.*)", null, null, "vb$1aa=$2", "tax\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)xx=(.*)", null, null, "vb$1aa=$2", "tax", null)); // Rewrite Assignments to Y from A - synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)yy=(.*)", null, null, "vb$1aa=$2", "tay\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)yy=(.*)", null, null, "vb$1aa=$2", "tay", null)); // Rewrite Assignments to Z1 from A - synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)z1=(.*)", ".*z1.*z1.*", null, "vb$1aa=$2", "sta {z1}\n", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)z1=(.*)", ".*z1.*z1.*", null, "vb$1aa=$2", "sta {z1}", mapZ)); // Rewrite Assignments to Z1 from A - synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)z1=(.*z1.*)", null, null, "vb$1aa=$2", "sta {z1}\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)z1=(.*z1.*)", null, null, "vb$1aa=$2", "sta {z1}", null)); // Rewrite Assignments to *C1 from A - synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)c1=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1}\n", mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)c1=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1}", mapC)); // Rewrite Assignments to *C1 from A - synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)c1=(.*c1.*)", null, null, "vb$1aa=$2", "sta {c1}\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)c1=(.*c1.*)", null, null, "vb$1aa=$2", "sta {c1}", null)); // Rewrite Assignments to *Z1 from A - synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pbuz1=(.*)", ".*z1.*z1.*", null, "vbuaa=$1", "ldy #0\n" + "sta ({z1}),y\n", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pbuz1=(.*)", ".*z1.*z1.*", null, "vbuaa=$1", "ldy #0\n" + "sta ({z1}),y", mapZ)); // Rewrite Assignments to *Z1 from A - synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pbuz1=(.*z1.*)", null, null, "vbuaa=$1", "ldy #0\n" + "sta ({z1}),y\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pbuz1=(.*z1.*)", null, null, "vbuaa=$1", "ldy #0\n" + "sta ({z1}),y", null)); // OLD STYLE REWRITES - written when only one rule could be taken @@ -351,105 +369,104 @@ class AsmFragmentTemplateSynthesisRule { //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_(band|bor|bxor|plus)_(vb.xx)", ".*=vb.[ax][ax]_.*", null, "$1=$4_$3_$2", null, null)); //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_(band|bor|bxor|plus)_(vb.yy)", ".*=vb.[axy][axy]_.*", null, "$1=$4_$3_$2", null, null)); - //synths.add(new AsmFragmentTemplateSynthesisRule("vbsxx=(.*)", null, null, "vbsaa=$1", "tax\n", null)); - //synths.add(new AsmFragmentTemplateSynthesisRule("vbuyy=(.*)", null, null, "vbuaa=$1", "tay\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)xx=(.*)", null, null, "vb$1aa=$2", "tax\n", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)yy=(.*)", null, null, "vb$1aa=$2", "tay\n", null)); //synths.add(new AsmFragmentTemplateSynthesisRule("vbsyy=(.*)", null, null, "vbsaa=$1", "tay\n", null)); //synths.add(new AsmFragmentTemplateSynthesisRule("vbsz1=(.*)", ".*=.*vb.z1.*", null, "vbsaa=$1", "sta {z1}\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuz1=(.*)", ".*z1.*z1.*|.*c1.*c1.*", null, "vb$1aa=$2", "ldx {z1}\n" + "sta {c1},x\n", mapZC)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuyy=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1},y\n", mapC, "yy")); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuxx=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1},x\n", mapC, "xx")); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)z1_derefidx_vbuz2=(.*)", ".*z1.*z1.*|.*z2.*z2.*", null, "vb$1aa=$2", "ldy {z2}\n" + "sta ({z1}),y\n", mapZ2)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuz1=(.*)", ".*z1.*z1.*|.*c1.*c1.*", null, "vb$1aa=$2", "ldx {z1}\n" + "sta {c1},x", mapZC)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuyy=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1},y", mapC, "yy")); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuxx=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1},x", mapC, "xx")); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)z1_derefidx_vbuz2=(.*)", ".*z1.*z1.*|.*z2.*z2.*", null, "vb$1aa=$2", "ldy {z2}\n" + "sta ({z1}),y", mapZ2)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=_deref_pb(.)c1(.*)", ".*=.*aa.*", "lda {c1}\n", "$1=vb$2aa$3", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=_deref_pb(.)z1(.*)", ".*z1.*z1.*|.*=.*aa.*|.*yy.*", "ldy #0\n" + "lda ({z1}),y\n", "$1=vb$2aa$3", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=_deref_pb(.)c1(.*)", ".*=.*aa.*", "lda {c1}", "$1=vb$2aa$3", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=_deref_pb(.)z1(.*)", ".*z1.*z1.*|.*=.*aa.*|.*yy.*", "ldy #0\n" + "lda ({z1}),y", "$1=vb$2aa$3", null, mapZ)); // Convert array indexing with A register to X/Y register by prefixing tax/tay (..._derefidx_vbuaa... -> ..._derefidx_vbuxx... /... _derefidx_vbuyy... ) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuaa(.*)", ".*xx.*", "tax\n", "$1=$2_derefidx_vbuxx$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuaa(.*)", ".*yy.*", "tay\n", "$1=$2_derefidx_vbuyy$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuaa(.*)", ".*xx.*", "tax", "$1=$2_derefidx_vbuxx$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuaa(.*)", ".*yy.*", "tay", "$1=$2_derefidx_vbuyy$3", null, null)); // Convert array indexing with zero page to x/y register by prefixing ldx z1 / ldy z1 ( ..._derefidx_vbuzn... -> ..._derefidx_vbuxx... / ..._derefidx_vbuyy... ) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz1(.*)", ".*xx.*|.*z1.*z1.*", "ldx {z1}\n", "$1=$2_derefidx_vbuxx$3", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz1(.*)", ".*yy.*|.*z1.*z1.*", "ldy {z1}\n", "$1=$2_derefidx_vbuyy$3", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz2(.*)", ".*xx.*|.*z2.*z2.*", "ldx {z2}\n", "$1=$2_derefidx_vbuxx$3", null, mapZ3)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz2(.*)", ".*yy.*|.*z2.*z2.*", "ldy {z2}\n", "$1=$2_derefidx_vbuyy$3", null, mapZ3)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz3(.*)", ".*yy.*", "ldy {z3}\n", "$1=$2_derefidx_vbuyy$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz3(.*)", ".*xx.*", "ldx {z3}\n", "$1=$2_derefidx_vbuxx$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz1(.*)", ".*xx.*|.*z1.*z1.*", "ldx {z1}", "$1=$2_derefidx_vbuxx$3", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz1(.*)", ".*yy.*|.*z1.*z1.*", "ldy {z1}", "$1=$2_derefidx_vbuyy$3", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz2(.*)", ".*xx.*|.*z2.*z2.*", "ldx {z2}", "$1=$2_derefidx_vbuxx$3", null, mapZ3)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz2(.*)", ".*yy.*|.*z2.*z2.*", "ldy {z2}", "$1=$2_derefidx_vbuyy$3", null, mapZ3)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz3(.*)", ".*yy.*", "ldy {z3}", "$1=$2_derefidx_vbuyy$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_derefidx_vbuz3(.*)", ".*xx.*", "ldx {z3}", "$1=$2_derefidx_vbuxx$3", null, null)); // Convert array indexing twice with A/zp1/zp2 to X/Y register with a ldx/ldy prefix ( ..._derefidx_vbunn..._derefidx_vbunn... -> ..._derefidx_vbuxx..._derefidx_vbuxx... ) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuaa(.*)_derefidx_vbuaa(.*)", ".*aa.*aa.*aa.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "tax\n", null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuaa(.*)_derefidx_vbuaa(.*)", ".*aa.*aa.*aa.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "tay\n", null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1(.*)_derefidx_vbuz1(.*)", ".*z1.*z1.*z1.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "ldx {z1}\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1(.*)_derefidx_vbuz1(.*)", ".*z1.*z1.*z1.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "ldy {z1}\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz2(.*)_derefidx_vbuz2(.*)", ".*z2.*z2.*z2.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "ldx {z2}\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz2(.*)_derefidx_vbuz2(.*)", ".*z2.*z2.*z2.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "ldy {z2}\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuz1=(.*c1.*)", ".*z1.*z1.*", null, "vb$1aa=$2", "ldx {z1}\n" + "sta {c1},x\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuz1=(.*z1.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "ldx {z1}\n" + "sta {c1},x\n", mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuaa(.*)_derefidx_vbuaa(.*)", ".*aa.*aa.*aa.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "tax", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuaa(.*)_derefidx_vbuaa(.*)", ".*aa.*aa.*aa.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "tay", null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1(.*)_derefidx_vbuz1(.*)", ".*z1.*z1.*z1.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "ldx {z1}", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1(.*)_derefidx_vbuz1(.*)", ".*z1.*z1.*z1.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "ldy {z1}", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz2(.*)_derefidx_vbuz2(.*)", ".*z2.*z2.*z2.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "ldx {z2}", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz2(.*)_derefidx_vbuz2(.*)", ".*z2.*z2.*z2.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "ldy {z2}", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuz1=(.*c1.*)", ".*z1.*z1.*", null, "vb$1aa=$2", "ldx {z1}\n" + "sta {c1},x", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuz1=(.*z1.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "ldx {z1}\n" + "sta {c1},x", mapC)); // Convert X/Y-based array indexing of a constant pointer into A-register by prefixing lda cn,x / lda cn,y ( ...pb.c1_derefidx_vbuxx... / ...pb.c1_derefidx_vbuyy... -> ...vb.aa... ) - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuxx(.*)", ".*=.*aa.*|.*c1.*c1.*", "lda {c1},x\n", "$1=$2vb$3aa$4", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c1.*)pb(.)c1_derefidx_vbuxx(.*)", ".*=.*aa.*", "lda {c1},x\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuxx(.*c1.*)", ".*=.*aa.*", "lda {c1},x\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuyy(.*)", ".*=.*aa.*|.*c1.*c1.*", "lda {c1},y\n", "$1=$2vb$3aa$4", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c1.*)pb(.)c1_derefidx_vbuyy(.*)", ".*=.*aa.*", "lda {c1},y\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuyy(.*c1.*)", ".*=.*aa.*", "lda {c1},y\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuxx(.*)", ".*=.*aa.*|.*c2.*c2.*", "lda {c2},x\n", "$1=$2vb$3aa$4", null, mapC3)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c2.*)pb(.)c2_derefidx_vbuxx(.*)", ".*=.*aa.*", "lda {c2},x\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuxx(.*c2.*)", ".*=.*aa.*", "lda {c2},x\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuyy(.*)", ".*=.*aa.*|.*c2.*c2.*", "lda {c2},y\n", "$1=$2vb$3aa$4", null, mapC3)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c2.*)pb(.)c2_derefidx_vbuyy(.*)", ".*=.*aa.*", "lda {c2},y\n", "$1=$2vb$3aa$4", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuyy(.*c2.*)", ".*=.*aa.*", "lda {c2},y\n", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuxx(.*)", ".*=.*aa.*|.*c1.*c1.*", "lda {c1},x", "$1=$2vb$3aa$4", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c1.*)pb(.)c1_derefidx_vbuxx(.*)", ".*=.*aa.*", "lda {c1},x", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuxx(.*c1.*)", ".*=.*aa.*", "lda {c1},x", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuyy(.*)", ".*=.*aa.*|.*c1.*c1.*", "lda {c1},y", "$1=$2vb$3aa$4", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c1.*)pb(.)c1_derefidx_vbuyy(.*)", ".*=.*aa.*", "lda {c1},y", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c1_derefidx_vbuyy(.*c1.*)", ".*=.*aa.*", "lda {c1},y", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuxx(.*)", ".*=.*aa.*|.*c2.*c2.*", "lda {c2},x", "$1=$2vb$3aa$4", null, mapC3)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c2.*)pb(.)c2_derefidx_vbuxx(.*)", ".*=.*aa.*", "lda {c2},x", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuxx(.*c2.*)", ".*=.*aa.*", "lda {c2},x", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuyy(.*)", ".*=.*aa.*|.*c2.*c2.*", "lda {c2},y", "$1=$2vb$3aa$4", null, mapC3)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*c2.*)pb(.)c2_derefidx_vbuyy(.*)", ".*=.*aa.*", "lda {c2},y", "$1=$2vb$3aa$4", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)pb(.)c2_derefidx_vbuyy(.*c2.*)", ".*=.*aa.*", "lda {c2},y", "$1=$2vb$3aa$4", null, null)); // Convert zeropage/constants/X/Y in assignments to A-register using LDA/TXA/TYA prefix - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuz1(.*)", ".*z1.*=.*|.*=.*aa.*|.*z1.*z1.*", "lda {z1}\n", "$1=$2vbuaa$3", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsz1(.*)", ".*z1.*=.*|.*=.*aa.*|.*z1.*z1.*", "lda {z1}\n", "$1=$2vbsaa$3", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuz2(.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}\n", "$1=$2vbuaa$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsz2(.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}\n", "$1=$2vbsaa$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuz2(.*z3.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}\n", "$1=$2vbuaa$3", null, mapZ3)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsz2(.*z3.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}\n", "$1=$2vbsaa$3", null, mapZ3)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuz1(.*)", ".*z1.*=.*|.*=.*aa.*|.*z1.*z1.*", "lda {z1}", "$1=$2vbuaa$3", null, mapZ)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsz1(.*)", ".*z1.*=.*|.*=.*aa.*|.*z1.*z1.*", "lda {z1}", "$1=$2vbsaa$3", null, mapZ)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuz2(.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}", "$1=$2vbuaa$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsz2(.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}", "$1=$2vbsaa$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuz2(.*z3.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}", "$1=$2vbuaa$3", null, mapZ3)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsz2(.*z3.*)", ".*z2.*=.*|.*=.*aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}", "$1=$2vbsaa$3", null, mapZ3)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuxx", ".*=.*[ax][ax].*xx|.*derefidx_vb.xx", "txa\n", "$1=$2_vbuaa", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbsxx", ".*=.*[ax][ax].*xx|.*derefidx_vb.xx", "txa\n", "$1=$2_vbsaa", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuyy", ".*=.*[ay][ay].*yy|.*derefidx_vb.yy", "tya\n", "$1=$2_vbuaa", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbsyy", ".*=-*[ay][ay].*yy|.*derefidx_vb.yy", "tya\n", "$1=$2_vbsaa", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuz1", ".*=.*aa.*|.*z1.*z1.*", "lda {z1}\n", "$1=$2_vbuaa", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbsz1", ".*=.*aa.*|.*z1.*z1.*", "lda {z1}\n", "$1=$2_vbsaa", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuz2", ".*=.*aa.*|.*z2.*z2.*", "lda {z2}\n", "$1=$2_vbuaa", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuz3", ".*=.*aa.*|.*z3.*z3.*", "lda {z3}\n", "$1=$2_vbuaa", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuxx", ".*=.*[ax][ax].*xx|.*derefidx_vb.xx", "txa", "$1=$2_vbuaa", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbsxx", ".*=.*[ax][ax].*xx|.*derefidx_vb.xx", "txa", "$1=$2_vbsaa", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuyy", ".*=.*[ay][ay].*yy|.*derefidx_vb.yy", "tya", "$1=$2_vbuaa", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbsyy", ".*=-*[ay][ay].*yy|.*derefidx_vb.yy", "tya", "$1=$2_vbsaa", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuz1", ".*=.*aa.*|.*z1.*z1.*", "lda {z1}", "$1=$2_vbuaa", null, mapZ)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbsz1", ".*=.*aa.*|.*z1.*z1.*", "lda {z1}", "$1=$2_vbsaa", null, mapZ)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuz2", ".*=.*aa.*|.*z2.*z2.*", "lda {z2}", "$1=$2_vbuaa", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)_vbuz3", ".*=.*aa.*|.*z3.*z3.*", "lda {z3}", "$1=$2_vbuaa", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("vbuz1=vbuz1(.*)", ".*=.*vb.aa.*|.*z1.*z1.*z1.*", "lda {z1}\n", "vbuaa=vbuaa$1", "sta {z1}\n", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("vbsz1=vbsz1(.*)", ".*=.*vb.aa.*|.*z1.*z1.*z1.*", "lda {z1}\n", "vbsaa=vbsaa$1", "sta {z1}\n", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("vbuz1=vbuz1(.*)", ".*=.*vb.aa.*|.*z1.*z1.*z1.*", "lda {z1}", "vbuaa=vbuaa$1", "sta {z1}", mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("vbsz1=vbsz1(.*)", ".*=.*vb.aa.*|.*z1.*z1.*z1.*", "lda {z1}", "vbsaa=vbsaa$1", "sta {z1}", mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*z1.*z1.*", "lda {z1}\n", "vbuaa_$1_$2", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("vbsz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*z1.*z1.*", "lda {z1}\n", "vbsaa_$1_$2", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)c1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*", "lda {c1}\n", "vb$1aa_$2_$3", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)z1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*vb.yy.*|.*z1.*z1.*", "ldy #0\n" + "lda ({z1}),y\n", "vb$1aa_$2_$3", null, mapZ)); + //synths.add(new AsmFragmentTemplateSynthesisRule("vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*z1.*z1.*", "lda {z1}", "vbuaa_$1_$2", null, mapZ)); + //synths.add(new AsmFragmentTemplateSynthesisRule("vbsz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*z1.*z1.*", "lda {z1}", "vbsaa_$1_$2", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)c1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*", "lda {c1}", "vb$1aa_$2_$3", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("_deref_pb(.)z1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*vb.yy.*|.*z1.*z1.*", "ldy #0\n" + "lda ({z1}),y", "vb$1aa_$2_$3", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1_(.*)", ".*z1.*z1.*|.*.yy.*", "ldy {z1}\n", "$1_derefidx_vbuyy_$2", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1_(.*)", ".*z1.*z1.*|.*.yy.*", "ldy {z1}", "$1_derefidx_vbuyy_$2", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*z1.*z1.*|.*vb.xx.*", "ldx {z1}", "$1_derefidx_vbuxx_$2_$3", null, mapZ)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuyy_(lt|gt|le|ge|eq|neq)_(.*)", ".*c1.*c1.*|.*aa.*", "lda {c1},y", "vb$1aa_$2_$3", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuyy_(lt|gt|le|ge|eq|neq)_(.*c1.*)", ".*aa.*", "lda {c1},y", "vb$1aa_$2_$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuxx_(lt|gt|le|ge|eq|neq)_(.*)", ".*c1.*c1.*|.*aa.*", "lda {c1},x", "vb$1aa_$2_$3", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuxx_(lt|gt|le|ge|eq|neq)_(.*c1.*)", ".*aa.*", "lda {c1},x", "vb$1aa_$2_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_derefidx_vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*z1.*z1.*|.*vb.xx.*", "ldx {z1}\n", "$1_derefidx_vbuxx_$2_$3", null, mapZ)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuyy_(lt|gt|le|ge|eq|neq)_(.*)", ".*c1.*c1.*|.*aa.*", "lda {c1},y\n", "vb$1aa_$2_$3", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuyy_(lt|gt|le|ge|eq|neq)_(.*c1.*)", ".*aa.*", "lda {c1},y\n", "vb$1aa_$2_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuxx_(lt|gt|le|ge|eq|neq)_(.*)", ".*c1.*c1.*|.*aa.*", "lda {c1},x\n", "vb$1aa_$2_$3", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("pb(.)c1_derefidx_vbuxx_(lt|gt|le|ge|eq|neq)_(.*c1.*)", ".*aa.*", "lda {c1},x\n", "vb$1aa_$2_$3", null, null)); - - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_ge_(vb.aa)_then_(.*)", ".*vb.aa.*_ge.*", null, "$2_le_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_ge_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_ge.*", null, "$2_le_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_ge_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_ge.*", null, "$2_le_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_lt_(vb.aa)_then_(.*)", ".*vb.aa.*_lt.*", null, "$2_gt_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_lt_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_lt.*", null, "$2_gt_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_lt_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_lt.*", null, "$2_gt_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(vb.aa)_then_(.*)", ".*vb.aa.*_gt.*", null, "$2_lt_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_gt.*", null, "$2_lt_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_gt.*", null, "$2_lt_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_le_(vb.aa)_then_(.*)", ".*vb.aa.*_le.*", null, "$2_ge_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_le_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_le.*", null, "$2_ge_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_le_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_le.*", null, "$2_ge_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_neq_(vb.aa)_then_(.*)", ".*vb.aa.*_neq.*", null, "$2_neq_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_neq_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_neq.*", null, "$2_neq_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_neq_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_neq.*", null, "$2_neq_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_eq_(vb.aa)_then_(.*)", ".*vb.aa.*_eq.*", null, "$2_eq_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_eq_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_eq.*", null, "$2_eq_$1_then_$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_eq_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_eq.*", null, "$2_eq_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_ge_(vb.aa)_then_(.*)", ".*vb.aa.*_ge.*", null, "$2_le_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_ge_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_ge.*", null, "$2_le_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_ge_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_ge.*", null, "$2_le_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_lt_(vb.aa)_then_(.*)", ".*vb.aa.*_lt.*", null, "$2_gt_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_lt_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_lt.*", null, "$2_gt_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_lt_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_lt.*", null, "$2_gt_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(vb.aa)_then_(.*)", ".*vb.aa.*_gt.*", null, "$2_lt_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_gt.*", null, "$2_lt_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_gt.*", null, "$2_lt_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_le_(vb.aa)_then_(.*)", ".*vb.aa.*_le.*", null, "$2_ge_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_le_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_le.*", null, "$2_ge_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_le_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_le.*", null, "$2_ge_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_neq_(vb.aa)_then_(.*)", ".*vb.aa.*_neq.*", null, "$2_neq_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_neq_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_neq.*", null, "$2_neq_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_neq_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_neq.*", null, "$2_neq_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_eq_(vb.aa)_then_(.*)", ".*vb.aa.*_eq.*", null, "$2_eq_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_eq_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_eq.*", null, "$2_eq_$1_then_$3", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_eq_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_eq.*", null, "$2_eq_$1_then_$3", null, null)); // Use unsigned ASM to synthesize signed ASM ( ...vbs... -> ...vbu... ) synths.add(new AsmFragmentTemplateSynthesisRule("(vbsz.|vbsc.|vbsaa|vbsxx|vbsyy)_(eq|neq)_(vbsz.|vbsc.|vbsaa|vbsxx|vbsyy)_then_(.*)", null, null, "$1_$2_$3_then_$4", null, mapSToU)); @@ -468,8 +485,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(vwsz.)=vb.c(.)_(plus|minus|band|bxor|bor)_(vwsz.)", null, null, "$1=vwsc$2_$3_$4", null, null)); // Move constant words to the end of the ASM signature for symmetric operators ( ...vw.c...vw.z... -> ...vw.z...vw.c... ) - synths.add(new AsmFragmentTemplateSynthesisRule("(vwuz.)=(vwuc.)_(plus|band|bxor|bor)_(vwuz.)", null, null, "$1=$4_$3_$2", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(vwsz.)=(vwsc.)_(plus|band|bxor|bor)_(vwsz.)", null, null, "$1=$4_$3_$2", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(vwuz.)=(vwuc.)_(plus|band|bxor|bor)_(vwuz.)", null, null, "$1=$4_$3_$2", null, null)); + //synths.add(new AsmFragmentTemplateSynthesisRule("(vwsz.)=(vwsc.)_(plus|band|bxor|bor)_(vwsz.)", null, null, "$1=$4_$3_$2", null, null)); // Use Z1/Z2 ASM to synthesize Z1-only code ( ...z1...z1... -> ...z1...z2... ) synths.add(new AsmFragmentTemplateSynthesisRule("(v..)z1=(v..)z1_(plus|minus|band|bxor|bor)_(.*)", ".*z2.*", null, "$1z1=$2z2_$3_$4", null, mapZ, false)); @@ -481,13 +498,14 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)aa=_dec_(.*)", null, null, "vb$1aa=$2_minus_1", null, null)); // Synthesize XX/YY using AA - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuxx(.*)", ".*=.*aa.*|.*derefidx_vb.xx.*", "txa\n", "$1=$2vbuaa$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsxx(.*)", ".*=.*aa.*|.*derefidx_vb.xx.*", "txa\n", "$1=$2vbsaa$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuyy(.*)", ".*=.*aa.*|.*derefidx_vb.yy.*", "tya\n", "$1=$2vbuaa$3", null, null)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsyy(.*)", ".*=.*aa.*|.*derefidx_vb.yy.*", "tya\n", "$1=$2vbsaa$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuxx(.*)", ".*=.*aa.*|.*derefidx_vb.xx.*", "txa", "$1=$2vbuaa$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsxx(.*)", ".*=.*aa.*|.*derefidx_vb.xx.*", "txa", "$1=$2vbsaa$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuyy(.*)", ".*=.*aa.*|.*derefidx_vb.yy.*", "tya", "$1=$2vbuaa$3", null, null)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsyy(.*)", ".*=.*aa.*|.*derefidx_vb.yy.*", "tya", "$1=$2vbsaa$3", null, null)); + // Synthesize constants using AA - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuc1(.*)", ".*=.*aa.*|.*c1.*c1.*|.*c1_deref.*", "lda #{c1}\n", "$1=$2vbuaa$3", null, mapC)); - synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsc1(.*)", ".*=.*aa.*|.*c1.*c1.*|.*c1_deref.*", "lda #{c1}\n", "$1=$2vbsaa$3", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuc1(.*)", ".*=.*aa.*|.*c1.*c1.*|.*c1_deref.*", "lda #{c1}", "$1=$2vbuaa$3", null, mapC)); + synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsc1(.*)", ".*=.*aa.*|.*c1.*c1.*|.*c1_deref.*", "lda #{c1}", "$1=$2vbsaa$3", null, mapC)); // Synthesize some constant pointers as constant words synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_(lt|gt|le|ge|eq|neq)_p..([cz].)_then_(.*)", null, null, "$1_$2_vwu$3_then_$4", null, null)); diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesizer.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesizer.java index 3d67e96d8..f74acf6ca 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesizer.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesizer.java @@ -55,6 +55,16 @@ public class AsmFragmentTemplateSynthesizer { instanceSpec.getBindings()); } + /** + * Get the best fragment templates for a signature + * @param signature The signature + * @param log The log + * @return The best templates (with different clobber profiles) for the signature + */ + public static Collection getFragmentTemplates(String signature, CompileLog log) { + return SYNTHESIZER.getBestTemplates(signature, log); + } + public AsmFragmentTemplate getFragmentTemplate(String signature, CompileLog log) { AsmFragmentTemplate bestTemplate = bestFragmentCache.get(signature); if(bestTemplate == UNKNOWN) { @@ -459,8 +469,13 @@ public class AsmFragmentTemplateSynthesizer { URL fragmentUrl = classLoader.getResource(FRAGMENT_RESOURCE_FOLDER + signature + ".asm"); if(fragmentUrl == null) return null; InputStream fragmentStream = fragmentUrl.openStream(); - CharStream fragmentCharStream = CharStreams.fromStream(fragmentStream); - String body = fragmentCharStream.toString(); + String body; + if(fragmentStream.available()==0) { + body = ""; + } else { + CharStream fragmentCharStream = CharStreams.fromStream(fragmentStream); + body = fragmentCharStream.toString(); + } return new AsmFragmentTemplate(signature, body); } catch(IOException e) { throw new RuntimeException("Error loading fragment file " + signature, e); diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateUsages.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateUsages.java index 778e3aeff..9d7b238bc 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateUsages.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateUsages.java @@ -33,7 +33,7 @@ public class AsmFragmentTemplateUsages { * * @param log The compile log to add the output to */ - public static void logUsages(CompileLog log, boolean logRedundantFiles, boolean logUnusedFiles, boolean logFileDetails, boolean logAllDetails, boolean logDetailsBody) { + public static void logUsages(CompileLog log, boolean logRedundantFiles, boolean logUnusedFiles, boolean logUnusedRules, boolean logFileDetails, boolean logAllDetails, boolean logDetailsBody) { Map synthesisGraph = AsmFragmentTemplateSynthesizer.SYNTHESIZER.getSynthesisGraph(); @@ -42,50 +42,36 @@ public class AsmFragmentTemplateUsages { File[] files = AsmFragmentTemplateSynthesizer.SYNTHESIZER.allFragmentFiles(); if(logRedundantFiles) { - /* - // Find all file fragments that were bested by a synthesized fragment - log.append("\nREDUNDANT ASM FRAGMENT FILE ANALYSIS (if found remove them from disk)"); - for(String signature : signatures) { - List templates = fragmentTemplateCache.get(signature); - AsmFragmentTemplate fileTemplate = null; - int fileUsage = 0; - AsmFragmentTemplate maxTemplate = null; - int maxUsage = 0; - for(AsmFragmentTemplate template : templates) { - Integer usage = fragmentTemplateUsage.get(template); - if(usage == null) usage = 0; - if(template.isFile()) { - fileTemplate = template; - fileUsage = usage; - } - if(usage > maxUsage) { - maxUsage = usage; - maxTemplate = template; - } - } - if(fileTemplate != null && fileUsage == 0 && maxUsage > 0) { - log.append("rm " + fileTemplate.getName() + ".asm #synthesized by " + maxTemplate.getName() + " - usages: " + maxUsage); - } - } - */ - Set redundantSignatures = new LinkedHashSet<>(); for(File file : files) { String fileName = file.getName(); String signature = fileName.substring(0, fileName.length() - 4); // Synthesize the fragment - and check if the synthesis is as good as the file body - AsmFragmentTemplate template = - AsmFragmentTemplateSynthesizer.SYNTHESIZER.getFragmentTemplate(signature, log); - if(!template.isFile()) { - // Check if the synthesis uses a file marked as redundant - AsmFragmentTemplate sourceFileTemplate = template; - while(!sourceFileTemplate.isFile()) { - sourceFileTemplate = sourceFileTemplate.getSubFragment(); + Collection templates = AsmFragmentTemplateSynthesizer.getFragmentTemplates(signature, log); + boolean isFile = false; + for(AsmFragmentTemplate template : templates) { + isFile |= template.isFile(); + } + if(!isFile) { + StringBuilder templateNames = new StringBuilder(); + boolean first = true; + for(AsmFragmentTemplate template : templates) { + templateNames.append(template.getName()); + if(first) { + first = false; + } else { + templateNames.append(" / "); + } + // Check if the synthesis uses a file marked as redundant + AsmFragmentTemplate sourceFileTemplate = template; + while(!sourceFileTemplate.isFile()) { + sourceFileTemplate = sourceFileTemplate.getSubFragment(); + } + if(redundantSignatures.contains(sourceFileTemplate.getSignature())) { + throw new RuntimeException("Problem in redundancy analysis! " + sourceFileTemplate.getSignature() + ".asm seems redundant but is needed for synthesis of " + signature); + } } - if(redundantSignatures.contains(sourceFileTemplate.getSignature())) { - throw new RuntimeException("Problem in redundancy analysis! " + sourceFileTemplate.getSignature() + ".asm seems redundant but is needed for synthesis of " + signature); - } - log.append("rm " + template.getName() + ".asm #synthesized better ASM by " + template.getName()); + log.append("rm " + signature + ".asm #synthesized better ASM by " + templateNames); redundantSignatures.add(signature); } } @@ -125,6 +111,25 @@ public class AsmFragmentTemplateUsages { } } + if(logUnusedRules) { + log.append("\nUNUSED ASM FRAGMENT SYNTHESIS RULE ANALYSIS (if found consider removing them)"); + Set rules = + new LinkedHashSet<>(AsmFragmentTemplateSynthesisRule.getSynthesisRules()); + for(String signature : signatures) { + Collection templates = + AsmFragmentTemplateSynthesizer.getFragmentTemplates(signature, log); + for(AsmFragmentTemplate template : templates) { + while(template.getSynthesis()!=null) { + rules.remove(template.getSynthesis()); + template = template.getSubFragment(); + } + } + } + for(AsmFragmentTemplateSynthesisRule rule : rules) { + log.append("Synthesis Rule Unused: - match:" + rule.sigMatch+ " avoid:"+rule.sigAvoid+" replace:"+rule.sigReplace); + } + } + if(logFileDetails) { log.append("\nDETAILED ASM FILE USAGES"); // Find all file templates @@ -168,10 +173,15 @@ public class AsmFragmentTemplateUsages { for(AsmFragmentTemplate template : templates) { Integer usage = fragmentTemplateUsage.get(template); if(usage == null) usage = 0; - log.append(String.format("%8d", usage) + " " + (template.isFile() ? "*" : "") + template.getName()); + AsmFragmentTemplateSynthesizer.AsmFragmentSynthesis synthesis = AsmFragmentTemplateSynthesizer.SYNTHESIZER.getOrCreateSynthesis(template.getSignature(), log); + Collection bestTemplates = synthesis.getBestTemplates(); + log.append(String.format("%8d", usage) + " " + template.getSignature()+" - templates: " + bestTemplates.size()); if(logBody) { - log.append(" clobber:"+template.getClobber().toString()+" cycles:"+template.getCycles()); - log.append(" "+template.getBody().replace("\n", "\n ")); + for(AsmFragmentTemplate bestTemplate : bestTemplates) { + log.append(" " + (bestTemplate.isFile() ? "*" : "") + bestTemplate.getName() + " - clobber:" + bestTemplate.getClobber().toString() + " cycles:" + bestTemplate.getCycles()); + log.append(" " + bestTemplate.getBody().replace("\n", "\n ")); + } + } } } diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/pbuz1=_ptrby_vwuz1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/pbuz1=_ptrby_vwuz1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/pbuz1=_ptrby_vwuz1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/pbuz1=_ptrby_vwuz1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbsxx=_sbyte_vbuxx.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbsxx=_sbyte_vbuxx.asm deleted file mode 100644 index 8b66f4c38..000000000 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbsxx=_sbyte_vbuxx.asm +++ /dev/null @@ -1 +0,0 @@ -// casting - do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbsyy=_sbyte_vbuyy.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbsyy=_sbyte_vbuyy.asm deleted file mode 100644 index 8b66f4c38..000000000 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbsyy=_sbyte_vbuyy.asm +++ /dev/null @@ -1 +0,0 @@ -// casting - do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa=vbuaa_plus_0.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa=vbuaa_plus_0.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa=vbuaa_plus_0.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa=vbuaa_plus_0.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_lt_vbuaa_then_la1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_lt_vbuaa_then_la1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_lt_vbuaa_then_la1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_lt_vbuaa_then_la1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_neq_vbuaa_then_la1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_neq_vbuaa_then_la1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_neq_vbuaa_then_la1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuaa_neq_vbuaa_then_la1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuxx_lt_vbuxx_then_la1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuxx_lt_vbuxx_then_la1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuxx_lt_vbuxx_then_la1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuxx_lt_vbuxx_then_la1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuyy_lt_vbuyy_then_la1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuyy_lt_vbuyy_then_la1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuyy_lt_vbuyy_then_la1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuyy_lt_vbuyy_then_la1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuz1_lt_vbuz1_then_la1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuz1_lt_vbuz1_then_la1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuz1_lt_vbuz1_then_la1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vbuz1_lt_vbuz1_then_la1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vwuz1=_word_pbuz1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vwuz1=_word_pbuz1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vwuz1=_word_pbuz1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/unused/vwuz1=_word_pbuz1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbsaa=_sbyte_vbuaa.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbsaa=_sbyte_vbuaa.asm index 93c22cd75..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbsaa=_sbyte_vbuaa.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbsaa=_sbyte_vbuaa.asm @@ -1 +0,0 @@ -// casting byte to sbyte - do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbsxx=_sbyte_vbuxx.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbsxx=_sbyte_vbuxx.asm new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbsyy=_sbyte_vbuyy.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbsyy=_sbyte_vbuyy.asm new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=_byte_vbsaa.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=_byte_vbsaa.asm index 505d4e29a..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=_byte_vbsaa.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=_byte_vbsaa.asm @@ -1 +0,0 @@ -// Do nothing: casting signed byte to byte \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa_bor_vbuaa.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa_bor_vbuaa.asm index ff535e78c..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa_bor_vbuaa.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa=vbuaa_bor_vbuaa.asm @@ -1 +0,0 @@ -// A is A or A \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=_byte_vbsxx.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=_byte_vbsxx.asm index 505d4e29a..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=_byte_vbsxx.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=_byte_vbsxx.asm @@ -1 +0,0 @@ -// Do nothing: casting signed byte to byte \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx_bor_vbuxx.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx_bor_vbuxx.asm index ecf52587a..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx_bor_vbuxx.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuxx=vbuxx_bor_vbuxx.asm @@ -1 +0,0 @@ -// X is X or X \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=_byte_vbsyy.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=_byte_vbsyy.asm index 505d4e29a..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=_byte_vbsyy.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=_byte_vbsyy.asm @@ -1 +0,0 @@ -// Do nothing: casting signed byte to byte \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy_bor_vbuyy.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy_bor_vbuyy.asm index 9ec1cd265..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy_bor_vbuyy.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuyy=vbuyy_bor_vbuyy.asm @@ -1 +0,0 @@ -// Y is Y or Y \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vwsz1=_sword_vwuz1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vwsz1=_sword_vwuz1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vwsz1=_sword_vwuz1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vwsz1=_sword_vwuz1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=_word_vwsz1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=_word_vwsz1.asm index 2f6b2d60f..e69de29bb 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=_word_vwsz1.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=_word_vwsz1.asm @@ -1 +0,0 @@ -// do nothing \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuxx.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuxx.asm index a32aaa993..61dae784f 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuxx.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuxx.asm @@ -1,2 +1,2 @@ sta {z1}+1 -stx {z1} \ No newline at end of file +stx {z1} diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuyy.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuyy.asm index 60a2ff59c..d3fe7da9e 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuyy.asm +++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vwuz1=vbuaa_word_vbuyy.asm @@ -1,2 +1,2 @@ sta {z1}+1 -sty {z1} \ No newline at end of file +sty {z1} diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 3e5800c28..364ae347c 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -32,7 +32,7 @@ public class TestPrograms { public static void tearDown() throws Exception { CompileLog log = new CompileLog(); log.setSysOut(true); - AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false); + AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false); } @Test diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log index 92d87d207..b264fbc27 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log @@ -4752,10 +4752,9 @@ line_ydxi: { //SEG192 line_ydxi::@2 b2: //SEG193 [99] (byte/word~) line_ydxi::$6 ← (byte) line_ydxi::y1#6 + (byte/signed byte/word/signed word) 1 [ line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#6 line_ydxi::y#2 line_ydxi::e#6 line_ydxi::$6 ] ( main:2::lines:12::line:21::line_ydxi:42 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#6 line_ydxi::y#2 line_ydxi::e#6 line_ydxi::$6 ] main:2::lines:12::line:21::line_ydxi:86 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#6 line_ydxi::y#2 line_ydxi::e#6 line_ydxi::$6 ] ) -- vbuz1=vbuz2_plus_1 - lda y1 - clc - adc #1 - sta _6 + ldy y1 + iny + sty _6 //SEG194 [100] if((byte) line_ydxi::y#2!=(byte/word~) line_ydxi::$6) goto line_ydxi::@1 [ line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#6 line_ydxi::y#2 line_ydxi::e#6 ] ( main:2::lines:12::line:21::line_ydxi:42 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#6 line_ydxi::y#2 line_ydxi::e#6 ] main:2::lines:12::line:21::line_ydxi:86 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#6 line_ydxi::y#2 line_ydxi::e#6 ] ) -- vbuz1_neq_vbuz2_then_la1 lda y cmp _6 @@ -4883,10 +4882,9 @@ line_xdyi: { //SEG229 line_xdyi::@2 b2: //SEG230 [122] (byte/word~) line_xdyi::$6 ← (byte) line_xdyi::x1#6 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$6 ] ) -- vbuz1=vbuz2_plus_1 - lda x1 - clc - adc #1 - sta _6 + ldy x1 + iny + sty _6 //SEG231 [123] if((byte) line_xdyi::x#2!=(byte/word~) line_xdyi::$6) goto line_xdyi::@1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ) -- vbuz1_neq_vbuz2_then_la1 lda x cmp _6 @@ -4964,10 +4962,9 @@ line_ydxd: { //SEG257 line_ydxd::@2 b2: //SEG258 [137] (byte/word~) line_ydxd::$6 ← (byte) line_ydxd::y1#6 + (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#3 line_ydxd::e#6 line_ydxd::$6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#3 line_ydxd::e#6 line_ydxd::$6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#3 line_ydxd::e#6 line_ydxd::$6 ] ) -- vbuz1=vbuz2_plus_1 - lda y1 - clc - adc #1 - sta _6 + ldy y1 + iny + sty _6 //SEG259 [138] if((byte) line_ydxd::y#3!=(byte/word~) line_ydxd::$6) goto line_ydxd::@1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#3 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#3 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#3 line_ydxd::e#6 ] ) -- vbuz1_neq_vbuz2_then_la1 lda y cmp _6 @@ -5045,10 +5042,9 @@ line_xdyd: { //SEG285 line_xdyd::@2 b2: //SEG286 [152] (byte/word~) line_xdyd::$6 ← (byte) line_xdyd::x1#6 + (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$6 ] ) -- vbuz1=vbuz2_plus_1 - lda x1 - clc - adc #1 - sta _6 + ldy x1 + iny + sty _6 //SEG287 [153] if((byte) line_xdyd::x#2!=(byte/word~) line_xdyd::$6) goto line_xdyd::@1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ) -- vbuz1_neq_vbuz2_then_la1 lda x cmp _6 @@ -5378,7 +5374,6 @@ Statement [159] *((const byte[256]) plot_xhi#0 + (byte) init_plot_tables::x#2) Statement [160] *((const byte[256]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ) always clobbers reg byte a Statement [167] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:31 [ init_plot_tables::y#2 init_plot_tables::y#1 ] -Statement [171] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ) always clobbers reg byte a Statement [173] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ) always clobbers reg byte a Statement [175] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ) always clobbers reg byte a Statement [183] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] ) always clobbers reg byte a reg byte y @@ -5417,7 +5412,6 @@ Statement [157] (byte~) init_plot_tables::$0 ← (byte) init_plot_tables::x#2 & Statement [159] *((const byte[256]) plot_xhi#0 + (byte) init_plot_tables::x#2) ← >(const byte*) BITMAP#0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ) always clobbers reg byte a Statement [160] *((const byte[256]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ) always clobbers reg byte a Statement [167] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ) always clobbers reg byte a -Statement [171] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ) always clobbers reg byte a Statement [173] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ) always clobbers reg byte a Statement [175] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ) always clobbers reg byte a Statement [183] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] ) always clobbers reg byte a reg byte y @@ -5496,14 +5490,14 @@ Uplift Scope [line] 6.25: zp ZP_BYTE:41 [ line::y1#0 ] 5.95: zp ZP_BYTE:40 [ lin Uplift Scope [main] Uplift Scope [] -Uplifting [lines] best 13063 combination reg byte x [ lines::l#2 lines::l#1 ] +Uplifting [lines] best 12983 combination reg byte x [ lines::l#2 lines::l#1 ] Uplift attempts [init_plot_tables] 10000/138240 (limiting to 10000) -Uplifting [init_plot_tables] best 12433 combination zp ZP_WORD:32 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ] reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ] reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ] reg byte a [ init_plot_tables::$0 ] reg byte a [ init_plot_tables::$7 ] reg byte a [ init_plot_tables::$8 ] reg byte a [ init_plot_tables::$9 ] zp ZP_BYTE:66 [ init_plot_tables::$10 ] zp ZP_BYTE:62 [ init_plot_tables::$6 ] +Uplifting [init_plot_tables] best 12353 combination zp ZP_WORD:32 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 ] reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ] reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ] reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ] reg byte a [ init_plot_tables::$0 ] reg byte a [ init_plot_tables::$7 ] reg byte a [ init_plot_tables::$8 ] reg byte a [ init_plot_tables::$9 ] zp ZP_BYTE:66 [ init_plot_tables::$10 ] zp ZP_BYTE:62 [ init_plot_tables::$6 ] Limited combination testing to 10000 combinations of 138240 possible. -Uplifting [plot] best 12427 combination zp ZP_BYTE:10 [ plot::y#4 plot::y#1 plot::y#0 plot::y#3 plot::y#2 ] zp ZP_BYTE:9 [ plot::x#4 plot::x#1 plot::x#0 plot::x#3 plot::x#2 ] zp ZP_WORD:51 [ plot::plotter_y#0 ] zp ZP_WORD:53 [ plot::$0 ] reg byte a [ plot::$1 ] zp ZP_WORD:55 [ plot::plotter#0 ] zp ZP_WORD:49 [ plot::plotter_x#0 ] -Uplifting [line_xdyi] best 12347 combination zp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ] zp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ] reg byte y [ line_xdyi::$6 ] zp ZP_BYTE:14 [ line_xdyi::x#3 line_xdyi::x#6 line_xdyi::x#0 line_xdyi::x#1 line_xdyi::x#2 ] zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] zp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ] zp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ] -Uplifting [line_xdyd] best 12267 combination zp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ] zp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ] reg byte y [ line_xdyd::$6 ] zp ZP_BYTE:26 [ line_xdyd::x#3 line_xdyd::x#6 line_xdyd::x#0 line_xdyd::x#1 line_xdyd::x#2 ] zp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ] zp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ] zp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ] -Uplifting [line_ydxi] best 12187 combination zp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ] zp ZP_BYTE:6 [ line_ydxi::x#3 line_ydxi::x#5 line_ydxi::x#1 line_ydxi::x#0 line_ydxi::x#6 line_ydxi::x#2 ] reg byte y [ line_ydxi::$6 ] zp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ] zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] zp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ] zp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ] +Uplifting [plot] best 12347 combination zp ZP_BYTE:10 [ plot::y#4 plot::y#1 plot::y#0 plot::y#3 plot::y#2 ] zp ZP_BYTE:9 [ plot::x#4 plot::x#1 plot::x#0 plot::x#3 plot::x#2 ] zp ZP_WORD:51 [ plot::plotter_y#0 ] zp ZP_WORD:53 [ plot::$0 ] reg byte a [ plot::$1 ] zp ZP_WORD:55 [ plot::plotter#0 ] zp ZP_WORD:49 [ plot::plotter_x#0 ] +Uplifting [line_xdyi] best 12287 combination zp ZP_BYTE:16 [ line_xdyi::e#3 line_xdyi::e#0 line_xdyi::e#6 line_xdyi::e#2 line_xdyi::e#1 ] zp ZP_BYTE:15 [ line_xdyi::y#3 line_xdyi::y#5 line_xdyi::y#0 line_xdyi::y#1 line_xdyi::y#6 line_xdyi::y#2 ] reg byte y [ line_xdyi::$6 ] zp ZP_BYTE:14 [ line_xdyi::x#3 line_xdyi::x#6 line_xdyi::x#0 line_xdyi::x#1 line_xdyi::x#2 ] zp ZP_BYTE:11 [ line_xdyi::yd#2 line_xdyi::yd#0 line_xdyi::yd#1 ] zp ZP_BYTE:12 [ line_xdyi::xd#5 line_xdyi::xd#0 line_xdyi::xd#1 ] zp ZP_BYTE:13 [ line_xdyi::x1#6 line_xdyi::x1#0 line_xdyi::x1#1 ] +Uplifting [line_xdyd] best 12227 combination zp ZP_BYTE:28 [ line_xdyd::e#3 line_xdyd::e#0 line_xdyd::e#6 line_xdyd::e#2 line_xdyd::e#1 ] zp ZP_BYTE:27 [ line_xdyd::y#3 line_xdyd::y#5 line_xdyd::y#0 line_xdyd::y#1 line_xdyd::y#6 line_xdyd::y#2 ] reg byte y [ line_xdyd::$6 ] zp ZP_BYTE:26 [ line_xdyd::x#3 line_xdyd::x#6 line_xdyd::x#0 line_xdyd::x#1 line_xdyd::x#2 ] zp ZP_BYTE:23 [ line_xdyd::yd#2 line_xdyd::yd#0 line_xdyd::yd#1 ] zp ZP_BYTE:24 [ line_xdyd::xd#5 line_xdyd::xd#0 line_xdyd::xd#1 ] zp ZP_BYTE:25 [ line_xdyd::x1#6 line_xdyd::x1#0 line_xdyd::x1#1 ] +Uplifting [line_ydxi] best 12167 combination zp ZP_BYTE:8 [ line_ydxi::e#3 line_ydxi::e#0 line_ydxi::e#6 line_ydxi::e#2 line_ydxi::e#1 ] zp ZP_BYTE:6 [ line_ydxi::x#3 line_ydxi::x#5 line_ydxi::x#1 line_ydxi::x#0 line_ydxi::x#6 line_ydxi::x#2 ] reg byte y [ line_ydxi::$6 ] zp ZP_BYTE:7 [ line_ydxi::y#3 line_ydxi::y#6 line_ydxi::y#1 line_ydxi::y#0 line_ydxi::y#2 ] zp ZP_BYTE:3 [ line_ydxi::xd#2 line_ydxi::xd#1 line_ydxi::xd#0 ] zp ZP_BYTE:4 [ line_ydxi::yd#5 line_ydxi::yd#1 line_ydxi::yd#0 ] zp ZP_BYTE:5 [ line_ydxi::y1#6 line_ydxi::y1#1 line_ydxi::y1#0 ] Uplifting [line_ydxd] best 12107 combination zp ZP_BYTE:22 [ line_ydxd::e#3 line_ydxd::e#0 line_ydxd::e#6 line_ydxd::e#2 line_ydxd::e#1 ] zp ZP_BYTE:20 [ line_ydxd::x#3 line_ydxd::x#5 line_ydxd::x#1 line_ydxd::x#0 line_ydxd::x#6 line_ydxd::x#2 ] reg byte y [ line_ydxd::$6 ] zp ZP_BYTE:21 [ line_ydxd::y#2 line_ydxd::y#7 line_ydxd::y#1 line_ydxd::y#0 line_ydxd::y#3 ] zp ZP_BYTE:17 [ line_ydxd::xd#2 line_ydxd::xd#1 line_ydxd::xd#0 ] zp ZP_BYTE:18 [ line_ydxd::yd#5 line_ydxd::yd#1 line_ydxd::yd#0 ] zp ZP_BYTE:19 [ line_ydxd::y1#6 line_ydxd::y1#1 line_ydxd::y1#0 ] Uplifting [init_screen] best 12107 combination zp ZP_WORD:34 [ init_screen::b#2 init_screen::b#1 ] zp ZP_WORD:36 [ init_screen::c#2 init_screen::c#1 ] Uplift attempts [line] 10000/186624 (limiting to 10000) diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log index beaffe899..84591b209 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log @@ -2190,7 +2190,6 @@ Statement [41] *((const byte[256]) plot_xhi#0 + (byte) init_plot_tables::x#2) Statement [42] *((const byte[256]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ) always clobbers reg byte a Statement [49] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ init_plot_tables::y#2 init_plot_tables::y#1 ] -Statement [53] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ) always clobbers reg byte a Statement [55] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ) always clobbers reg byte a Statement [57] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ) always clobbers reg byte a Statement [65] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] ) always clobbers reg byte a reg byte y @@ -2211,7 +2210,6 @@ Statement [39] (byte~) init_plot_tables::$0 ← (byte) init_plot_tables::x#2 & ( Statement [41] *((const byte[256]) plot_xhi#0 + (byte) init_plot_tables::x#2) ← >(const byte*) BITMAP#0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ) always clobbers reg byte a Statement [42] *((const byte[256]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ) always clobbers reg byte a Statement [49] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ) always clobbers reg byte a -Statement [53] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ) always clobbers reg byte a Statement [55] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ) always clobbers reg byte a Statement [57] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ) always clobbers reg byte a Statement [65] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] ) always clobbers reg byte a reg byte y diff --git a/src/test/java/dk/camelot64/kickc/test/ref/chargen.asm b/src/test/java/dk/camelot64/kickc/test/ref/chargen.asm index d6ed2bfdd..dae605000 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/chargen.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/chargen.asm @@ -25,8 +25,8 @@ main: { sta bits ldx #0 b2: - lda #$80 - and bits + lda bits + and #$80 cmp #0 beq b4 lda #'*' diff --git a/src/test/java/dk/camelot64/kickc/test/ref/chargen.log b/src/test/java/dk/camelot64/kickc/test/ref/chargen.log index f25b20df0..42f957f82 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/chargen.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/chargen.log @@ -867,8 +867,8 @@ main: { //SEG27 main::@2 b2: //SEG28 [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) -- vbuaa=vbuz1_band_vbuc1 - lda #$80 - and bits + lda bits + and #$80 //SEG29 [10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuaa_eq_0_then_la1 cmp #0 beq b3_from_b2 @@ -1078,8 +1078,8 @@ main: { //SEG27 main::@2 b2: //SEG28 [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) -- vbuaa=vbuz1_band_vbuc1 - lda #$80 - and bits + lda bits + and #$80 //SEG29 [10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuaa_eq_0_then_la1 cmp #0 beq b4 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/fibmem.asm b/src/test/java/dk/camelot64/kickc/test/ref/fibmem.asm index 6391d1099..d51eebfa6 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/fibmem.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/fibmem.asm @@ -10,9 +10,9 @@ main: { sta fibs+1 ldx #0 b1: - lda fibs+1,x + lda fibs,x clc - adc fibs,x + adc fibs+1,x sta fibs+2,x inx cpx #$f diff --git a/src/test/java/dk/camelot64/kickc/test/ref/fibmem.log b/src/test/java/dk/camelot64/kickc/test/ref/fibmem.log index 85350a4bb..67ef93299 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/fibmem.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/fibmem.log @@ -356,9 +356,9 @@ main: { //SEG15 main::@1 b1: //SEG16 [7] (byte/word~) main::$2 ← *((const byte*) fibs#0 + (byte) main::i#2) + *((const byte*) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx_plus_pbuc2_derefidx_vbuxx - lda fibs+1,x + lda fibs,x clc - adc fibs,x + adc fibs+1,x //SEG17 [8] *((const byte*) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte/word~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa sta fibs+2,x //SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx @@ -443,9 +443,9 @@ main: { //SEG15 main::@1 b1: //SEG16 [7] (byte/word~) main::$2 ← *((const byte*) fibs#0 + (byte) main::i#2) + *((const byte*) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx_plus_pbuc2_derefidx_vbuxx - lda fibs+1,x + lda fibs,x clc - adc fibs,x + adc fibs+1,x //SEG17 [8] *((const byte*) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte/word~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa sta fibs+2,x //SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx diff --git a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log index 35578a5c8..eb7294b68 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log @@ -1677,14 +1677,12 @@ Statement [8] (byte~) main::$1 ← *((byte*) main::chargen#10) & (byte/signed by Statement [9] (byte~) main::$2 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 96 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$1 main::$2 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$1 main::$2 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:13 [ main::$1 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:13 [ main::$1 ] -Statement [11] (byte~) main::$4 ← (byte~) main::$1 | (byte~) main::$3 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$4 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$4 ] ) always clobbers reg byte a Statement [19] (byte~) main::$11 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:7 [ main::bits_gen#11 main::bits_gen#1 main::bits_gen#4 ] Statement [20] (byte~) main::$12 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$12 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$12 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:20 [ main::$11 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:20 [ main::$11 ] -Statement [22] (byte~) main::$14 ← (byte~) main::$11 | (byte~) main::$13 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$14 ] ) always clobbers reg byte a Statement [28] (byte) main::bits_gen#14 ← (byte) main::bits_gen#11 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] ) always clobbers reg byte a Statement [29] (byte~) main::$20 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$20 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$20 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:8 [ main::bits_gen#13 main::bits_gen#14 main::bits_gen#6 ] @@ -1692,7 +1690,6 @@ Removing always clobbered register reg byte y as potential for zp ZP_BYTE:8 [ ma Statement [31] (byte~) main::$22 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$22 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$22 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:27 [ main::$21 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:27 [ main::$21 ] -Statement [33] (byte~) main::$24 ← (byte~) main::$21 | (byte~) main::$23 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$24 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$24 ] ) always clobbers reg byte a Statement [38] (byte) main::bits_gen#16 ← (byte) main::bits_gen#13 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 ] ) always clobbers reg byte a Statement [39] (byte~) main::$29 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$29 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$29 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:9 [ main::bits_gen#15 main::bits_gen#8 main::bits_gen#16 ] @@ -1700,7 +1697,6 @@ Removing always clobbered register reg byte y as potential for zp ZP_BYTE:9 [ ma Statement [41] (byte~) main::$31 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$30 main::$31 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$30 main::$31 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:33 [ main::$30 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:33 [ main::$30 ] -Statement [42] (byte~) main::$32 ← (byte~) main::$30 | (byte~) main::$31 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$32 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$32 ] ) always clobbers reg byte a Statement [47] (byte) main::bits_gen#7 ← (byte) main::bits_gen#15 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::bits_gen#7 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#7 ] ) always clobbers reg byte a Statement [48] *((byte*) main::charset4#10) ← (byte) main::bits_gen#7 [ main::chargen#10 main::charset4#10 ] ( main:2 [ main::chargen#10 main::charset4#10 ] ) always clobbers reg byte y Statement [50] (byte*) main::chargen#1 ← (byte*) main::chargen#10 + (byte/signed byte/word/signed word) 2 [ main::chargen#1 main::charset4#1 ] ( main:2 [ main::chargen#1 main::charset4#1 ] ) always clobbers reg byte a @@ -1711,18 +1707,14 @@ Statement [5] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word Statement [7] (byte*) main::chargen1#0 ← (byte*) main::chargen#10 + (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 ] ) always clobbers reg byte a Statement [8] (byte~) main::$1 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 96 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$1 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$1 ] ) always clobbers reg byte a reg byte y Statement [9] (byte~) main::$2 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 96 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$1 main::$2 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$1 main::$2 ] ) always clobbers reg byte a reg byte y -Statement [11] (byte~) main::$4 ← (byte~) main::$1 | (byte~) main::$3 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$4 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$4 ] ) always clobbers reg byte a Statement [19] (byte~) main::$11 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 ] ) always clobbers reg byte a reg byte y Statement [20] (byte~) main::$12 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$12 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$12 ] ) always clobbers reg byte a reg byte y -Statement [22] (byte~) main::$14 ← (byte~) main::$11 | (byte~) main::$13 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$14 ] ) always clobbers reg byte a Statement [28] (byte) main::bits_gen#14 ← (byte) main::bits_gen#11 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] ) always clobbers reg byte a Statement [29] (byte~) main::$20 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$20 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$20 ] ) always clobbers reg byte a reg byte y Statement [31] (byte~) main::$22 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$22 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$22 ] ) always clobbers reg byte a reg byte y -Statement [33] (byte~) main::$24 ← (byte~) main::$21 | (byte~) main::$23 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$24 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$24 ] ) always clobbers reg byte a Statement [38] (byte) main::bits_gen#16 ← (byte) main::bits_gen#13 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 ] ) always clobbers reg byte a Statement [39] (byte~) main::$29 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$29 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$29 ] ) always clobbers reg byte a reg byte y Statement [41] (byte~) main::$31 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$30 main::$31 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$30 main::$31 ] ) always clobbers reg byte a reg byte y -Statement [42] (byte~) main::$32 ← (byte~) main::$30 | (byte~) main::$31 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$32 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$32 ] ) always clobbers reg byte a Statement [47] (byte) main::bits_gen#7 ← (byte) main::bits_gen#15 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::bits_gen#7 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#7 ] ) always clobbers reg byte a Statement [48] *((byte*) main::charset4#10) ← (byte) main::bits_gen#7 [ main::chargen#10 main::charset4#10 ] ( main:2 [ main::chargen#10 main::charset4#10 ] ) always clobbers reg byte y Statement [50] (byte*) main::chargen#1 ← (byte*) main::chargen#10 + (byte/signed byte/word/signed word) 2 [ main::chargen#1 main::charset4#1 ] ( main:2 [ main::chargen#1 main::charset4#1 ] ) always clobbers reg byte a diff --git a/src/test/java/dk/camelot64/kickc/test/ref/modglobal.log b/src/test/java/dk/camelot64/kickc/test/ref/modglobal.log index 9fb48a448..e027a4c7a 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/modglobal.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/modglobal.log @@ -585,10 +585,9 @@ main: { lda _0 sta SCREEN+0 //SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuz1=_inc_vbuz2 - lda cnt_12 - clc - adc #1 - sta cnt + ldy cnt_12 + iny + sty cnt //SEG20 [10] call inccnt param-assignment [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] ) //SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt] inccnt_from_b1: @@ -620,10 +619,9 @@ inccnt: { .label return_1 = 7 .label return_2 = $a //SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuz2 - lda cnt - clc - adc #1 - sta cnt_12 + ldy cnt + iny + sty cnt_12 //SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuz1=_inc_vbuz1 inc cnt2 //SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=_inc_vbuz1 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/modglobalmin.log b/src/test/java/dk/camelot64/kickc/test/ref/modglobalmin.log index 37f69b62e..64c28b190 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/modglobalmin.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/modglobalmin.log @@ -348,10 +348,9 @@ main: { lda cnt_13 sta SCREEN+0 //SEG15 [7] (byte) cnt#2 ← ++ (byte) cnt#13 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuz1=_inc_vbuz2 - lda cnt_13 - clc - adc #1 - sta cnt + ldy cnt_13 + iny + sty cnt //SEG16 [8] call inccnt param-assignment [ cnt#13 ] ( main:2 [ cnt#13 ] ) //SEG17 [12] phi from main::@1 to inccnt [phi:main::@1->inccnt] inccnt_from_b1: @@ -361,10 +360,9 @@ main: { //SEG19 main::@2 b2: //SEG20 [9] (byte) cnt#11 ← ++ (byte) cnt#13 [ cnt#11 ] ( main:2 [ cnt#11 ] ) -- vbuz1=_inc_vbuz2 - lda cnt_13 - clc - adc #1 - sta cnt_11 + ldy cnt_13 + iny + sty cnt_11 //SEG21 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 1) ← (byte) cnt#11 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1 lda cnt_11 sta SCREEN+1 @@ -377,10 +375,9 @@ main: { //SEG24 inccnt inccnt: { //SEG25 [13] (byte) cnt#13 ← ++ (byte) cnt#12 [ cnt#13 ] ( main:2::inccnt:5 [ cnt#13 ] main:2::inccnt:8 [ cnt#13 ] ) -- vbuz1=_inc_vbuz2 - lda cnt - clc - adc #1 - sta cnt_13 + ldy cnt + iny + sty cnt_13 jmp breturn //SEG26 inccnt::@return breturn: diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log b/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log index 0f109f351..fe9121431 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-basic.log @@ -3193,8 +3193,6 @@ Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ ma Removing always clobbered register reg byte y as potential for zp ZP_BYTE:5 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] Statement [61] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::getFAC:28 [ main::i#10 char_cursor#32 line_cursor#13 getFAC::return#0 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte y -Statement [68] (byte~) prepareMEM::$0 ← < (byte*) prepareMEM::mem#5 [ prepareMEM::mem#5 prepareMEM::$0 ] ( main:2::addMEMtoFAC:26::prepareMEM:64 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::mulFACbyMEM:14::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::mulFACbyMEM:24::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::divMEMbyFAC:20::prepareMEM:81 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::setFAC:5::prepareMEM:86 [ prepareMEM::mem#5 prepareMEM::$0 ] main:2::setFAC:12::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::setFAC:18::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::setMEMtoFAC:9::prepareMEM:91 [ prepareMEM::mem#5 prepareMEM::$0 ] main:2::setMEMtoFAC:16::prepareMEM:91 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] ) always clobbers reg byte a -Statement [70] (byte~) prepareMEM::$1 ← > (byte*) prepareMEM::mem#5 [ prepareMEM::$1 ] ( main:2::addMEMtoFAC:26::prepareMEM:64 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::mulFACbyMEM:14::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::mulFACbyMEM:24::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::divMEMbyFAC:20::prepareMEM:81 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::setFAC:5::prepareMEM:86 [ prepareMEM::$1 ] main:2::setFAC:12::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::setFAC:18::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::setMEMtoFAC:9::prepareMEM:91 [ prepareMEM::$1 ] main:2::setMEMtoFAC:16::prepareMEM:91 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] ) always clobbers reg byte a Statement [74] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::mulFACbyMEM:14 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#4 ] main:2::mulFACbyMEM:24 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#4 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte y Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte y @@ -3216,8 +3214,6 @@ Statement [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed Statement [57] *((byte*) char_cursor#23) ← (byte) print_char::ch#2 [ char_cursor#23 ] ( main:2::print_word:31::print_byte:44::print_char:51 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:51 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#23 ] main:2::print_word:31::print_byte:44::print_char:54 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:54 [ main::i#10 line_cursor#13 char_cursor#23 ] ) always clobbers reg byte y Statement [61] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::getFAC:28 [ main::i#10 char_cursor#32 line_cursor#13 getFAC::return#0 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte y -Statement [68] (byte~) prepareMEM::$0 ← < (byte*) prepareMEM::mem#5 [ prepareMEM::mem#5 prepareMEM::$0 ] ( main:2::addMEMtoFAC:26::prepareMEM:64 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::mulFACbyMEM:14::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::mulFACbyMEM:24::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::divMEMbyFAC:20::prepareMEM:81 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::setFAC:5::prepareMEM:86 [ prepareMEM::mem#5 prepareMEM::$0 ] main:2::setFAC:12::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::setFAC:18::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] main:2::setMEMtoFAC:9::prepareMEM:91 [ prepareMEM::mem#5 prepareMEM::$0 ] main:2::setMEMtoFAC:16::prepareMEM:91 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#5 prepareMEM::$0 ] ) always clobbers reg byte a -Statement [70] (byte~) prepareMEM::$1 ← > (byte*) prepareMEM::mem#5 [ prepareMEM::$1 ] ( main:2::addMEMtoFAC:26::prepareMEM:64 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::mulFACbyMEM:14::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::mulFACbyMEM:24::prepareMEM:75 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::divMEMbyFAC:20::prepareMEM:81 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::setFAC:5::prepareMEM:86 [ prepareMEM::$1 ] main:2::setFAC:12::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::setFAC:18::prepareMEM:86 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] main:2::setMEMtoFAC:9::prepareMEM:91 [ prepareMEM::$1 ] main:2::setMEMtoFAC:16::prepareMEM:91 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::$1 ] ) always clobbers reg byte a Statement [74] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::mulFACbyMEM:14 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#4 ] main:2::mulFACbyMEM:24 [ main::i#10 char_cursor#32 line_cursor#13 prepareMEM::mem#4 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte y Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte y diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm index ed36ccd7c..39e0f2a7a 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm @@ -466,8 +466,8 @@ gen_chargen_sprite: { tay sta s_gen b2: - lda #$80 - and bits + lda bits + and #$80 cmp #0 beq b6 lda #1 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log index b8c6fc116..0a0037538 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log @@ -7595,15 +7595,13 @@ place_sprites: { eor #7^5 sta col //SEG475 [226] (byte) place_sprites::j2#1 ← ++ (byte) place_sprites::j2#3 [ place_sprites::j#2 place_sprites::spr_id#1 place_sprites::spr_x#1 place_sprites::col#1 place_sprites::j2#1 ] ( main:2::init:5::place_sprites:53 [ place_sprites::j#2 place_sprites::spr_id#1 place_sprites::spr_x#1 place_sprites::col#1 place_sprites::j2#1 ] ) -- vbuz1=_inc_vbuz2 - lda j2_3 - clc - adc #1 - sta j2 + ldy j2_3 + iny + sty j2 //SEG476 [227] (byte) place_sprites::j2#2 ← ++ (byte) place_sprites::j2#1 [ place_sprites::j#2 place_sprites::spr_id#1 place_sprites::spr_x#1 place_sprites::j2#2 place_sprites::col#1 ] ( main:2::init:5::place_sprites:53 [ place_sprites::j#2 place_sprites::spr_id#1 place_sprites::spr_x#1 place_sprites::j2#2 place_sprites::col#1 ] ) -- vbuz1=_inc_vbuz2 - lda j2 - clc - adc #1 - sta j2_2 + ldy j2 + iny + sty j2_2 //SEG477 [228] (byte) place_sprites::j#1 ← ++ (byte) place_sprites::j#2 [ place_sprites::spr_id#1 place_sprites::j#1 place_sprites::spr_x#1 place_sprites::j2#2 place_sprites::col#1 ] ( main:2::init:5::place_sprites:53 [ place_sprites::spr_id#1 place_sprites::j#1 place_sprites::spr_x#1 place_sprites::j2#2 place_sprites::col#1 ] ) -- vbuz1=_inc_vbuz1 inc j //SEG478 [229] if((byte) place_sprites::j#1!=(byte/signed byte/word/signed word) 7) goto place_sprites::@1 [ place_sprites::spr_id#1 place_sprites::j#1 place_sprites::spr_x#1 place_sprites::j2#2 place_sprites::col#1 ] ( main:2::init:5::place_sprites:53 [ place_sprites::spr_id#1 place_sprites::j#1 place_sprites::spr_x#1 place_sprites::j2#2 place_sprites::col#1 ] ) -- vbuz1_neq_vbuc1_then_la1 @@ -7666,8 +7664,6 @@ Removing always clobbered register reg byte y as potential for zp ZP_BYTE:18 [ p Statement [132] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::init:5::gen_sintab:59::getFAC:115 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 getFAC::return#0 ] main:2::init:5::gen_sintab:63::getFAC:115 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 getFAC::return#0 ] ) always clobbers reg byte a Statement [135] (byte*) prepareMEM::mem#2 ← (byte*) addMEMtoFAC::mem#2 [ prepareMEM::mem#2 ] ( main:2::init:5::gen_sintab:59::addMEMtoFAC:94 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#2 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:94 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#2 ] main:2::init:5::gen_sintab:59::addMEMtoFAC:113 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#2 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:113 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#2 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte y -Statement [140] (byte~) prepareMEM::$0 ← < (byte*) prepareMEM::mem#5 [ prepareMEM::mem#5 prepareMEM::$0 ] ( main:2::init:5::gen_sintab:59::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] ) always clobbers reg byte a -Statement [142] (byte~) prepareMEM::$1 ← > (byte*) prepareMEM::mem#5 [ prepareMEM::$1 ] ( main:2::init:5::gen_sintab:59::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] ) always clobbers reg byte a Statement [146] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::init:5::gen_sintab:59::mulFACbyMEM:101 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:101 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:111 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:111 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte y Statement [153] (byte*) prepareMEM::mem#3 ← (byte*) divMEMbyFAC::mem#2 [ prepareMEM::mem#3 ] ( main:2::init:5::gen_sintab:59::divMEMbyFAC:90 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#3 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:90 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#3 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:107 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#3 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:107 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#3 ] ) always clobbers reg byte a @@ -7696,7 +7692,6 @@ Removing always clobbered register reg byte a as potential for zp ZP_BYTE:38 [ g Statement [195] (byte~) gen_chargen_sprite::$6 ← (byte) gen_chargen_sprite::s_gen#3 << (byte/signed byte/word/signed word) 1 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::$6 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::$6 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:42 [ gen_chargen_sprite::b#2 gen_chargen_sprite::b#1 ] -Statement [196] (byte) gen_chargen_sprite::s_gen#1 ← (byte~) gen_chargen_sprite::$6 | (byte) gen_chargen_sprite::c#3 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ) always clobbers reg byte a Statement [199] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word) 0) ← (byte) gen_chargen_sprite::s_gen#1 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp ZP_BYTE:33 [ gen_sprites::i#2 gen_sprites::i#1 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] @@ -7751,8 +7746,6 @@ Statement [129] *((byte*) progress_cursor#11) ← *((const byte[]) progress_inc: Statement [132] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::init:5::gen_sintab:59::getFAC:115 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 getFAC::return#0 ] main:2::init:5::gen_sintab:63::getFAC:115 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 getFAC::return#0 ] ) always clobbers reg byte a Statement [135] (byte*) prepareMEM::mem#2 ← (byte*) addMEMtoFAC::mem#2 [ prepareMEM::mem#2 ] ( main:2::init:5::gen_sintab:59::addMEMtoFAC:94 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#2 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:94 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#2 ] main:2::init:5::gen_sintab:59::addMEMtoFAC:113 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#2 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:113 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#2 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte y -Statement [140] (byte~) prepareMEM::$0 ← < (byte*) prepareMEM::mem#5 [ prepareMEM::mem#5 prepareMEM::$0 ] ( main:2::init:5::gen_sintab:59::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#5 prepareMEM::$0 ] ) always clobbers reg byte a -Statement [142] (byte~) prepareMEM::$1 ← > (byte*) prepareMEM::mem#5 [ prepareMEM::$1 ] ( main:2::init:5::gen_sintab:59::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:94::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::addMEMtoFAC:113::prepareMEM:136 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:101::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:111::prepareMEM:147 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:90::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:107::prepareMEM:154 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:75::prepareMEM:159 [ gen_sintab::min#2 gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:80::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:88::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:99::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setFAC:105::prepareMEM:159 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:82::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:86::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:92::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:96::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::$1 ] main:2::init:5::gen_sintab:59::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] main:2::init:5::gen_sintab:63::setMEMtoFAC:103::prepareMEM:164 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::$1 ] ) always clobbers reg byte a Statement [146] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::init:5::gen_sintab:59::mulFACbyMEM:101 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:101 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] main:2::init:5::gen_sintab:59::mulFACbyMEM:111 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] main:2::init:5::gen_sintab:63::mulFACbyMEM:111 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#4 ] ) always clobbers reg byte a Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte y Statement [153] (byte*) prepareMEM::mem#3 ← (byte*) divMEMbyFAC::mem#2 [ prepareMEM::mem#3 ] ( main:2::init:5::gen_sintab:59::divMEMbyFAC:90 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#3 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:90 [ gen_sintab::length#10 gen_sintab::sintab#12 progress_init::line#2 prepareMEM::mem#3 ] main:2::init:5::gen_sintab:59::divMEMbyFAC:107 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#3 ] main:2::init:5::gen_sintab:63::divMEMbyFAC:107 [ gen_sintab::length#10 gen_sintab::sintab#12 gen_sintab::i#10 progress_idx#34 progress_cursor#34 prepareMEM::mem#3 ] ) always clobbers reg byte a @@ -7770,7 +7763,6 @@ Statement [186] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed wo Statement [188] (byte) gen_chargen_sprite::bits#0 ← *((byte*) gen_chargen_sprite::chargen#0 + (byte) gen_chargen_sprite::y#2) [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::sprite#11 gen_chargen_sprite::bits#0 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::sprite#11 gen_chargen_sprite::bits#0 ] ) always clobbers reg byte a reg byte y Statement [190] (byte~) gen_chargen_sprite::$3 ← (byte) gen_chargen_sprite::bits#2 & (byte/word/signed word) 128 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 gen_chargen_sprite::$3 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 gen_chargen_sprite::$3 ] ) always clobbers reg byte a Statement [195] (byte~) gen_chargen_sprite::$6 ← (byte) gen_chargen_sprite::s_gen#3 << (byte/signed byte/word/signed word) 1 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::$6 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::$6 ] ) always clobbers reg byte a -Statement [196] (byte) gen_chargen_sprite::s_gen#1 ← (byte~) gen_chargen_sprite::$6 | (byte) gen_chargen_sprite::c#3 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ) always clobbers reg byte a Statement [199] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word) 0) ← (byte) gen_chargen_sprite::s_gen#1 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ) always clobbers reg byte a reg byte y Statement [200] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word) 3) ← (byte) gen_chargen_sprite::s_gen#1 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 gen_chargen_sprite::s_gen#1 ] ) always clobbers reg byte a reg byte y Statement [201] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word) 6) ← (byte) gen_chargen_sprite::s_gen#1 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::x#6 gen_chargen_sprite::c#3 gen_chargen_sprite::b#2 gen_chargen_sprite::sprite#3 ] ) always clobbers reg byte a reg byte y @@ -7863,9 +7855,9 @@ Uplift Scope [main] Uplift Scope [progress_init] Uplift Scope [progress_inc] -Uplifting [gen_chargen_sprite] best 1065251 combination zp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ] zp ZP_WORD:43 [ gen_chargen_sprite::sprite#3 gen_chargen_sprite::sprite#10 gen_chargen_sprite::sprite#11 gen_chargen_sprite::sprite#0 gen_chargen_sprite::sprite#2 gen_chargen_sprite::sprite#4 gen_chargen_sprite::sprite#1 ] reg byte y [ gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::s_gen_cnt#5 gen_chargen_sprite::s_gen_cnt#1 ] reg byte a [ gen_chargen_sprite::$6 ] reg byte x [ gen_chargen_sprite::b#2 gen_chargen_sprite::b#1 ] reg byte a [ gen_chargen_sprite::$3 ] zp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ] zp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ] zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] reg byte y [ gen_chargen_sprite::ch#0 ] zp ZP_WORD:65 [ gen_chargen_sprite::$0 ] zp ZP_WORD:67 [ gen_chargen_sprite::$1 ] zp ZP_WORD:69 [ gen_chargen_sprite::chargen#0 ] +Uplifting [gen_chargen_sprite] best 1065211 combination zp ZP_BYTE:40 [ gen_chargen_sprite::s_gen#3 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen#6 gen_chargen_sprite::s_gen#1 ] zp ZP_WORD:43 [ gen_chargen_sprite::sprite#3 gen_chargen_sprite::sprite#10 gen_chargen_sprite::sprite#11 gen_chargen_sprite::sprite#0 gen_chargen_sprite::sprite#2 gen_chargen_sprite::sprite#4 gen_chargen_sprite::sprite#1 ] reg byte y [ gen_chargen_sprite::s_gen_cnt#3 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::s_gen_cnt#5 gen_chargen_sprite::s_gen_cnt#1 ] reg byte a [ gen_chargen_sprite::$6 ] reg byte x [ gen_chargen_sprite::b#2 gen_chargen_sprite::b#1 ] reg byte a [ gen_chargen_sprite::$3 ] zp ZP_BYTE:38 [ gen_chargen_sprite::x#6 gen_chargen_sprite::x#1 ] zp ZP_BYTE:37 [ gen_chargen_sprite::bits#2 gen_chargen_sprite::bits#0 gen_chargen_sprite::bits#1 ] zp ZP_BYTE:39 [ gen_chargen_sprite::c#3 ] zp ZP_BYTE:36 [ gen_chargen_sprite::y#2 gen_chargen_sprite::y#1 ] reg byte y [ gen_chargen_sprite::ch#0 ] zp ZP_WORD:65 [ gen_chargen_sprite::$0 ] zp ZP_WORD:67 [ gen_chargen_sprite::$1 ] zp ZP_WORD:69 [ gen_chargen_sprite::chargen#0 ] Uplift attempts [anim] 10000/19440 (limiting to 10000) -Uplifting [anim] best 1062351 combination zp ZP_BYTE:7 [ anim::yidx#3 anim::yidx#0 anim::yidx#6 anim::yidx#1 anim::yidx#2 ] zp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ] reg byte alu [ anim::$3 ] reg byte a [ anim::$5 ] zp ZP_BYTE:8 [ anim::j#2 anim::j#1 ] zp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ] reg byte a [ anim::$2 ] reg byte x [ anim::j2#2 anim::j2#1 ] zp ZP_WORD:50 [ anim::x#0 ] +Uplifting [anim] best 1062311 combination zp ZP_BYTE:7 [ anim::yidx#3 anim::yidx#0 anim::yidx#6 anim::yidx#1 anim::yidx#2 ] zp ZP_BYTE:4 [ anim::xidx#3 anim::xidx#0 anim::xidx#5 anim::xidx#1 anim::xidx#2 ] reg byte alu [ anim::$3 ] reg byte a [ anim::$5 ] zp ZP_BYTE:8 [ anim::j#2 anim::j#1 ] zp ZP_BYTE:5 [ anim::x_msb#2 anim::x_msb#1 ] reg byte a [ anim::$2 ] reg byte x [ anim::j2#2 anim::j2#1 ] zp ZP_WORD:50 [ anim::x#0 ] Limited combination testing to 10000 combinations of 19440 possible. Uplifting [place_sprites] best 1061951 combination reg byte x [ place_sprites::j2#1 ] reg byte y [ place_sprites::j#2 place_sprites::j#1 ] zp ZP_BYTE:45 [ place_sprites::spr_id#2 place_sprites::spr_id#1 ] reg byte x [ place_sprites::j2#3 place_sprites::j2#2 ] zp ZP_BYTE:47 [ place_sprites::spr_x#2 place_sprites::spr_x#1 ] zp ZP_BYTE:49 [ place_sprites::col#2 place_sprites::col#1 ] Uplifting [setFAC] best 1061951 combination zp ZP_WORD:29 [ setFAC::w#5 setFAC::w#0 setFAC::w#3 setFAC::w#4 setFAC::w#1 ] @@ -9075,8 +9067,8 @@ gen_chargen_sprite: { //SEG397 gen_chargen_sprite::@2 b2: //SEG398 [190] (byte~) gen_chargen_sprite::$3 ← (byte) gen_chargen_sprite::bits#2 & (byte/word/signed word) 128 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 gen_chargen_sprite::$3 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 gen_chargen_sprite::$3 ] ) -- vbuaa=vbuz1_band_vbuc1 - lda #$80 - and bits + lda bits + and #$80 //SEG399 [191] if((byte~) gen_chargen_sprite::$3==(byte/signed byte/word/signed word) 0) goto gen_chargen_sprite::@3 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 ] ) -- vbuaa_eq_0_then_la1 cmp #0 beq b3_from_b2 @@ -10831,8 +10823,8 @@ gen_chargen_sprite: { //SEG397 gen_chargen_sprite::@2 b2: //SEG398 [190] (byte~) gen_chargen_sprite::$3 ← (byte) gen_chargen_sprite::bits#2 & (byte/word/signed word) 128 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 gen_chargen_sprite::$3 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 gen_chargen_sprite::$3 ] ) -- vbuaa=vbuz1_band_vbuc1 - lda #$80 - and bits + lda bits + and #$80 //SEG399 [191] if((byte~) gen_chargen_sprite::$3==(byte/signed byte/word/signed word) 0) goto gen_chargen_sprite::@3 [ gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 ] ( main:2::init:5::gen_sprites:55::gen_chargen_sprite:177 [ gen_sprites::i#2 gen_sprites::spr#2 gen_chargen_sprite::chargen#0 gen_chargen_sprite::y#2 gen_chargen_sprite::bits#2 gen_chargen_sprite::s_gen#5 gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::sprite#10 gen_chargen_sprite::x#6 ] ) -- vbuaa_eq_0_then_la1 cmp #0 beq b6 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.asm b/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.asm index eaad5b82c..4f505658e 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.asm @@ -454,8 +454,8 @@ print_byte: { tay lda hextab,y jsr print_char - lda #$f - and b + lda b + and #$f tay lda hextab,y jsr print_char diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.log b/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.log index 449ec01dd..06986f7a8 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/test-comparisons.log @@ -10076,8 +10076,8 @@ print_byte: { //SEG492 print_byte::@1 b1: //SEG493 [189] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#52 print_byte::$2 ] ( main:2::printu:14::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:20::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:27::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:34::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:44::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:50::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:57::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:64::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:74::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:80::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:87::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:94::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:104::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:110::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:117::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:124::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:134::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:140::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:147::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:154::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:14::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:20::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:27::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:34::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:44::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:50::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:57::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:64::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:74::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:80::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:87::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:94::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:104::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:110::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:117::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:124::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:134::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:140::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:147::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:154::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] ) -- vbuaa=vbuz1_band_vbuc1 - lda #$f - and b + lda b + and #$f //SEG494 [190] (byte) print_char::ch#1 ← *((const string) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#52 print_char::ch#1 ] ( main:2::printu:14::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:20::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:27::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:34::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:44::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:50::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:57::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:64::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:74::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:80::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:87::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:94::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:104::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:110::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:117::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:124::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:134::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:140::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:147::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:154::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:14::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:20::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:27::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:34::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:44::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:50::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:57::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:64::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:74::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:80::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:87::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:94::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:104::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:110::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:117::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:124::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:134::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:140::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:147::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:154::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] ) -- vbuaa=pbuc1_derefidx_vbuaa tay lda hextab,y @@ -11725,8 +11725,8 @@ print_byte: { jsr print_char //SEG492 print_byte::@1 //SEG493 [189] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#52 print_byte::$2 ] ( main:2::printu:14::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:20::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:27::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:34::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:44::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:50::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:57::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:64::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:74::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:80::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:87::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:94::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:104::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:110::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:117::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:124::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:134::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:140::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:147::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:154::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:14::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:20::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:27::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:34::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:44::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:50::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:57::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:64::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:74::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:80::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:87::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:94::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:104::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:110::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:117::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:124::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:134::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:140::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:147::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] main:2::printu:154::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_byte::$2 ] ) -- vbuaa=vbuz1_band_vbuc1 - lda #$f - and b + lda b + and #$f //SEG494 [190] (byte) print_char::ch#1 ← *((const string) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#52 print_char::ch#1 ] ( main:2::printu:14::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:20::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:27::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:34::print_byte:171 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:44::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:50::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:57::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:64::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:74::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:80::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:87::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:94::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:104::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:110::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:117::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:124::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:134::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:140::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:147::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:154::print_byte:171 [ main::a#10 main::i#10 line_cursor#1 printu::op#20 printu::b#20 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:14::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:20::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:27::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:34::print_byte:175 [ main::a#10 main::i#10 line_cursor#21 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:44::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:50::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:57::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:64::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:74::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:80::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:87::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:94::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:104::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:110::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:117::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:124::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 main::b#0 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:134::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:140::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:147::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] main:2::printu:154::print_byte:175 [ main::a#10 main::i#10 line_cursor#1 printu::res#20 char_cursor#52 print_char::ch#1 ] ) -- vbuaa=pbuc1_derefidx_vbuaa tay lda hextab,y diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm index 6342dc44e..838187637 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.asm @@ -239,6 +239,7 @@ print_sbyte: { rts } signed_multiply: { + .label _13 = $e .label m = 6 .label return = 6 .label b = 3 @@ -258,9 +259,9 @@ signed_multiply: { cmp #0 bpl b2 lda m+1 - sty $ff + sty _13 sec - sbc $ff + sbc _13 sta m+1 b2: rts diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log index 1cdece440..597a19d83 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.log @@ -8365,7 +8365,7 @@ Uplifting [slow_signed_multiply] best 214496 combination zp ZP_WORD:22 [ slow_si Uplifting [slow_multiply] best 204196 combination zp ZP_WORD:28 [ slow_multiply::return#0 slow_multiply::m#3 slow_multiply::m#1 ] reg byte y [ slow_multiply::i#2 slow_multiply::i#1 ] zp ZP_WORD:84 [ slow_multiply::return#2 ] reg byte x [ slow_multiply::b#0 ] zp ZP_BYTE:82 [ slow_multiply::a#0 ] Uplifting [multiply] best 203584 combination reg byte x [ multiply::b#2 multiply::b#1 multiply::b#0 ] reg byte a [ multiply::a#2 multiply::a#1 multiply::a#0 ] zp ZP_WORD:88 [ multiply::return#3 ] zp ZP_WORD:80 [ multiply::return#0 ] zp ZP_WORD:70 [ multiply::return#2 ] Uplift attempts [signed_multiply] 10000/16384 (limiting to 10000) -Uplifting [signed_multiply] best 203253 combination zp ZP_WORD:58 [ signed_multiply::return#2 ] zp ZP_WORD:78 [ signed_multiply::return#0 ] zp ZP_WORD:17 [ signed_multiply::m#4 signed_multiply::m#5 signed_multiply::m#1 signed_multiply::m#0 signed_multiply::m#2 ] zp ZP_BYTE:57 [ signed_multiply::b#0 ] reg byte y [ signed_multiply::a#0 ] reg byte x [ signed_multiply::$7 ] reg byte a [ signed_multiply::$16 ] reg byte y [ signed_multiply::$13 ] reg byte a [ signed_multiply::$17 ] reg byte a [ signed_multiply::$6 ] reg byte a [ signed_multiply::$12 ] +Uplifting [signed_multiply] best 203253 combination zp ZP_WORD:58 [ signed_multiply::return#2 ] zp ZP_WORD:78 [ signed_multiply::return#0 ] zp ZP_WORD:17 [ signed_multiply::m#4 signed_multiply::m#5 signed_multiply::m#1 signed_multiply::m#0 signed_multiply::m#2 ] zp ZP_BYTE:57 [ signed_multiply::b#0 ] reg byte y [ signed_multiply::a#0 ] reg byte x [ signed_multiply::$7 ] reg byte a [ signed_multiply::$16 ] zp ZP_BYTE:76 [ signed_multiply::$13 ] reg byte a [ signed_multiply::$17 ] reg byte a [ signed_multiply::$6 ] reg byte a [ signed_multiply::$12 ] Limited combination testing to 10000 combinations of 16384 possible. Uplifting [multiply_results_compare] best 203253 combination zp ZP_BYTE:26 [ multiply_results_compare::b#2 multiply_results_compare::b#1 ] zp ZP_WORD:90 [ multiply_results_compare::ma#0 ] zp ZP_BYTE:25 [ multiply_results_compare::a#6 multiply_results_compare::a#1 ] zp ZP_WORD:86 [ multiply_results_compare::ms#0 ] Uplifting [signed_multiply_results_compare] best 203253 combination zp ZP_BYTE:3 [ signed_multiply_results_compare::b#2 signed_multiply_results_compare::b#1 ] zp ZP_WORD:60 [ signed_multiply_results_compare::ma#0 ] zp ZP_BYTE:2 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::a#1 ] zp ZP_WORD:54 [ signed_multiply_results_compare::ms#0 ] @@ -8402,6 +8402,8 @@ Attempting to uplift remaining variables inzp ZP_BYTE:47 [ init_multiply::dir#2 Uplifting [init_multiply] best 202841 combination zp ZP_BYTE:47 [ init_multiply::dir#2 init_multiply::dir#3 ] Attempting to uplift remaining variables inzp ZP_BYTE:57 [ signed_multiply::b#0 ] Uplifting [signed_multiply] best 202841 combination zp ZP_BYTE:57 [ signed_multiply::b#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:76 [ signed_multiply::$13 ] +Uplifting [signed_multiply] best 202841 combination zp ZP_BYTE:76 [ signed_multiply::$13 ] Attempting to uplift remaining variables inzp ZP_BYTE:63 [ signed_multiply_error::b#0 ] Uplifting [signed_multiply_error] best 202841 combination zp ZP_BYTE:63 [ signed_multiply_error::b#0 ] Attempting to uplift remaining variables inzp ZP_BYTE:93 [ multiply_error::b#0 ] @@ -8444,6 +8446,7 @@ Coalescing zero page register [ zp ZP_WORD:66 [ signed_multiply_error::ma#0 ] ] Allocated (was zp ZP_WORD:14) zp ZP_WORD:8 [ char_cursor#75 char_cursor#124 char_cursor#123 char_cursor#119 char_cursor#135 char_cursor#27 char_cursor#118 char_cursor#17 char_cursor#117 char_cursor#172 char_cursor#176 char_cursor#1 char_cursor#121 char_cursor#197 init_multiply::sqr#3 init_multiply::sqr#4 init_multiply::sqr#1 init_multiply::sqr#2 signed_multiply_results_compare::ms#0 ] Allocated (was zp ZP_WORD:32) zp ZP_WORD:10 [ multiply_tables_compare::asm_sqr#2 multiply_tables_compare::asm_sqr#1 signed_multiply_error::ms#0 multiply_results_compare::ms#0 multiply_error::ms#0 ] Allocated (was zp ZP_WORD:66) zp ZP_WORD:12 [ signed_multiply_error::ma#0 multiply_error::ma#0 ] +Allocated (was zp ZP_BYTE:76) zp ZP_BYTE:14 [ signed_multiply::$13 ] ASSEMBLER BEFORE OPTIMIZATION //SEG0 Basic Upstart @@ -9060,6 +9063,7 @@ print_sbyte: { } //SEG233 signed_multiply signed_multiply: { + .label _13 = $e .label m = 6 .label return = 6 .label b = 3 @@ -9112,11 +9116,11 @@ signed_multiply: { b4: //SEG254 [125] (byte~) signed_multiply::$12 ← > (word) signed_multiply::m#5 [ signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ) -- vbuaa=_hi_vwuz1 lda m+1 - //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuyy=_byte_vbsyy - //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuaa_minus_vbuyy - sty $ff + //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuz1=_byte_vbsyy + sty _13 + //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuaa_minus_vbuz1 sec - sbc $ff + sbc _13 //SEG257 [128] (word) signed_multiply::m#2 ← (word) signed_multiply::m#5 hi= (byte/signed byte/word/signed word~) signed_multiply::$17 [ signed_multiply::m#2 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#2 ] ) -- vwuz1=vwuz1_sethi_vbuaa sta m+1 //SEG258 [129] phi from signed_multiply::@1 signed_multiply::@4 to signed_multiply::@2 [phi:signed_multiply::@1/signed_multiply::@4->signed_multiply::@2] @@ -10693,7 +10697,7 @@ FINAL SYMBOL TABLE (word) print_word::w#5 w zp ZP_WORD:6 4.666666666666666 (signed word()) signed_multiply((signed byte) signed_multiply::a , (signed byte) signed_multiply::b) (byte~) signed_multiply::$12 reg byte a 2.0 -(byte~) signed_multiply::$13 reg byte y 4.0 +(byte~) signed_multiply::$13 $13 zp ZP_BYTE:14 4.0 (byte/signed byte/word/signed word~) signed_multiply::$16 reg byte a 4.0 (byte/signed byte/word/signed word~) signed_multiply::$17 reg byte a 4.0 (byte~) signed_multiply::$6 reg byte a 2.0 @@ -10829,7 +10833,7 @@ reg byte a [ signed_multiply::$6 ] reg byte x [ signed_multiply::$7 ] reg byte a [ signed_multiply::$16 ] reg byte a [ signed_multiply::$12 ] -reg byte y [ signed_multiply::$13 ] +zp ZP_BYTE:14 [ signed_multiply::$13 ] reg byte a [ signed_multiply::$17 ] reg byte x [ slow_multiply::b#0 ] reg byte x [ multiply_error::a#0 ] @@ -11322,6 +11326,7 @@ print_sbyte: { } //SEG233 signed_multiply signed_multiply: { + .label _13 = $e .label m = 6 .label return = 6 .label b = 3 @@ -11364,11 +11369,11 @@ signed_multiply: { //SEG253 signed_multiply::@4 //SEG254 [125] (byte~) signed_multiply::$12 ← > (word) signed_multiply::m#5 [ signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::a#0 signed_multiply::m#5 signed_multiply::$12 ] ) -- vbuaa=_hi_vwuz1 lda m+1 - //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuyy=_byte_vbsyy - //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuaa_minus_vbuyy - sty $ff + //SEG255 [126] (byte~) signed_multiply::$13 ← ((byte)) (signed byte) signed_multiply::a#0 [ signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$12 signed_multiply::$13 ] ) -- vbuz1=_byte_vbsyy + sty _13 + //SEG256 [127] (byte/signed byte/word/signed word~) signed_multiply::$17 ← (byte~) signed_multiply::$12 - (byte~) signed_multiply::$13 [ signed_multiply::m#5 signed_multiply::$17 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#5 signed_multiply::$17 ] ) -- vbuaa=vbuaa_minus_vbuz1 sec - sbc $ff + sbc _13 //SEG257 [128] (word) signed_multiply::m#2 ← (word) signed_multiply::m#5 hi= (byte/signed byte/word/signed word~) signed_multiply::$17 [ signed_multiply::m#2 ] ( main:2::signed_multiply_results_compare:15::signed_multiply:27 [ signed_multiply_results_compare::a#6 signed_multiply_results_compare::b#2 signed_multiply_results_compare::ms#0 line_cursor#1 signed_multiply::m#2 ] ) -- vwuz1=vwuz1_sethi_vbuaa sta m+1 //SEG258 [129] phi from signed_multiply::@1 signed_multiply::@4 to signed_multiply::@2 [phi:signed_multiply::@1/signed_multiply::@4->signed_multiply::@2] diff --git a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym index 837ccd19b..46ae7d5ff 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym +++ b/src/test/java/dk/camelot64/kickc/test/ref/test-multiply.sym @@ -244,7 +244,7 @@ (word) print_word::w#5 w zp ZP_WORD:6 4.666666666666666 (signed word()) signed_multiply((signed byte) signed_multiply::a , (signed byte) signed_multiply::b) (byte~) signed_multiply::$12 reg byte a 2.0 -(byte~) signed_multiply::$13 reg byte y 4.0 +(byte~) signed_multiply::$13 $13 zp ZP_BYTE:14 4.0 (byte/signed byte/word/signed word~) signed_multiply::$16 reg byte a 4.0 (byte/signed byte/word/signed word~) signed_multiply::$17 reg byte a 4.0 (byte~) signed_multiply::$6 reg byte a 2.0 @@ -380,7 +380,7 @@ reg byte a [ signed_multiply::$6 ] reg byte x [ signed_multiply::$7 ] reg byte a [ signed_multiply::$16 ] reg byte a [ signed_multiply::$12 ] -reg byte y [ signed_multiply::$13 ] +zp ZP_BYTE:14 [ signed_multiply::$13 ] reg byte a [ signed_multiply::$17 ] reg byte x [ slow_multiply::b#0 ] reg byte x [ multiply_error::a#0 ] diff --git a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.asm b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.asm index 22e72984d..e52cc347b 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.asm @@ -5,48 +5,50 @@ .const SCREEN2 = $400+$28 jsr main main: { - ldx #0 + .label i = 2 + lda #0 + sta i b1: - txa - tay + ldy i iny - txa + lda #2 clc - adc #2 - sta sum.c + adc i + tax + lda i jsr sum - sta SCREEN,x - txa - tay + ldy i + sta SCREEN,y iny - txa + lda #2 clc - adc #2 - sta sum2.c + adc i + tax + lda i jsr sum2 - sta SCREEN2,x - inx - cpx #$b + ldy i + sta SCREEN2,y + inc i + lda i + cmp #$b bne b1 rts } sum2: { - .label c = 2 - tya + sty $ff + clc + adc $ff stx $ff clc adc $ff - clc - adc c rts } sum: { - .label c = 2 - tya + sty $ff + clc + adc $ff stx $ff clc adc $ff - clc - adc c rts } diff --git a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log index 12b5f7281..126fbb8b8 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.log @@ -654,10 +654,9 @@ main: { //SEG14 main::@1 b1: //SEG15 [6] (byte) sum::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum::b#0 ] ( main:2 [ main::i#2 sum::b#0 ] ) -- vbuz1=vbuz2_plus_1 - lda i - clc - adc #1 - sta sum.b + ldy i + iny + sty sum.b //SEG16 [7] (byte) sum::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum::b#0 sum::c#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 ] ) -- vbuz1=vbuz2_plus_vbuc1 lda i clc @@ -682,10 +681,9 @@ main: { lda _2 sta SCREEN,y //SEG23 [13] (byte) sum2::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum2::b#0 ] ( main:2 [ main::i#2 sum2::b#0 ] ) -- vbuz1=vbuz2_plus_1 - lda i - clc - adc #1 - sta sum2.b + ldy i + iny + sty sum2.b //SEG24 [14] (byte) sum2::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum2::b#0 sum2::c#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 ] ) -- vbuz1=vbuz2_plus_vbuc1 lda i clc @@ -810,16 +808,12 @@ Uplift Scope [sum] 22: zp ZP_BYTE:6 [ sum::return#0 ] 13: zp ZP_BYTE:5 [ sum::a# Uplift Scope [sum2] 22: zp ZP_BYTE:11 [ sum2::return#0 ] 13: zp ZP_BYTE:10 [ sum2::a#0 ] 4.33: zp ZP_BYTE:8 [ sum2::b#0 ] 4.33: zp ZP_BYTE:9 [ sum2::c#0 ] 4.33: zp ZP_BYTE:14 [ sum2::return#1 ] 4: zp ZP_BYTE:13 [ sum2::$0 ] Uplift Scope [] -Uplifting [main] best 1115 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$2 ] reg byte a [ main::$5 ] -Uplifting [sum] best 968 combination reg byte a [ sum::return#0 ] reg byte x [ sum::a#0 ] reg byte y [ sum::b#0 ] zp ZP_BYTE:4 [ sum::c#0 ] reg byte a [ sum::return#1 ] reg byte a [ sum::$0 ] -Uplifting [sum2] best 821 combination reg byte a [ sum2::return#0 ] reg byte x [ sum2::a#0 ] reg byte y [ sum2::b#0 ] zp ZP_BYTE:9 [ sum2::c#0 ] reg byte a [ sum2::return#1 ] reg byte a [ sum2::$0 ] -Uplifting [] best 821 combination -Attempting to uplift remaining variables inzp ZP_BYTE:4 [ sum::c#0 ] -Uplifting [sum] best 821 combination zp ZP_BYTE:4 [ sum::c#0 ] -Attempting to uplift remaining variables inzp ZP_BYTE:9 [ sum2::c#0 ] -Uplifting [sum2] best 821 combination zp ZP_BYTE:9 [ sum2::c#0 ] -Coalescing zero page register [ zp ZP_BYTE:4 [ sum::c#0 ] ] with [ zp ZP_BYTE:9 [ sum2::c#0 ] ] -Allocated (was zp ZP_BYTE:4) zp ZP_BYTE:2 [ sum::c#0 sum2::c#0 ] +Uplifting [main] best 1345 combination zp ZP_BYTE:2 [ main::i#2 main::i#1 ] reg byte a [ main::$2 ] reg byte a [ main::$5 ] +Uplifting [sum] best 1179 combination reg byte a [ sum::return#0 ] reg byte a [ sum::a#0 ] reg byte y [ sum::b#0 ] reg byte x [ sum::c#0 ] reg byte a [ sum::return#1 ] reg byte a [ sum::$0 ] +Uplifting [sum2] best 1013 combination reg byte a [ sum2::return#0 ] reg byte a [ sum2::a#0 ] reg byte y [ sum2::b#0 ] reg byte x [ sum2::c#0 ] reg byte a [ sum2::return#1 ] reg byte a [ sum2::$0 ] +Uplifting [] best 1013 combination +Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::i#2 main::i#1 ] +Uplifting [main] best 1013 combination zp ZP_BYTE:2 [ main::i#2 main::i#1 ] ASSEMBLER BEFORE OPTIMIZATION //SEG0 Basic Upstart @@ -847,10 +841,12 @@ bend_from_b3: bend: //SEG9 main main: { + .label i = 2 //SEG10 [5] phi from main to main::@1 [phi:main->main::@1] b1_from_main: - //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 - ldx #0 + //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i jmp b1 //SEG12 [5] phi from main::@4 to main::@1 [phi:main::@4->main::@1] b1_from_b4: @@ -858,17 +854,16 @@ main: { jmp b1 //SEG14 main::@1 b1: - //SEG15 [6] (byte) sum::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum::b#0 ] ( main:2 [ main::i#2 sum::b#0 ] ) -- vbuyy=vbuxx_plus_1 - txa - tay + //SEG15 [6] (byte) sum::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum::b#0 ] ( main:2 [ main::i#2 sum::b#0 ] ) -- vbuyy=vbuz1_plus_1 + ldy i iny - //SEG16 [7] (byte) sum::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum::b#0 sum::c#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 ] ) -- vbuz1=vbuxx_plus_vbuc1 - txa + //SEG16 [7] (byte) sum::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum::b#0 sum::c#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 ] ) -- vbuxx=vbuz1_plus_vbuc1 + lda #2 clc - adc #2 - sta sum.c - //SEG17 [8] (byte) sum::a#0 ← (byte) main::i#2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ) - // (byte) sum::a#0 = (byte) main::i#2 // register copy reg byte x + adc i + tax + //SEG17 [8] (byte) sum::a#0 ← (byte) main::i#2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ) -- vbuaa=vbuz1 + lda i //SEG18 [9] call sum param-assignment [ main::i#2 sum::return#1 ] ( main:2 [ main::i#2 sum::return#1 ] ) jsr sum //SEG19 [10] (byte) sum::return#0 ← (byte) sum::return#1 [ main::i#2 sum::return#0 ] ( main:2 [ main::i#2 sum::return#0 ] ) @@ -878,19 +873,19 @@ main: { b3: //SEG21 [11] (byte~) main::$2 ← (byte) sum::return#0 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) // (byte~) main::$2 = (byte) sum::return#0 // register copy reg byte a - //SEG22 [12] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa - sta SCREEN,x - //SEG23 [13] (byte) sum2::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum2::b#0 ] ( main:2 [ main::i#2 sum2::b#0 ] ) -- vbuyy=vbuxx_plus_1 - txa - tay + //SEG22 [12] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuaa + ldy i + sta SCREEN,y + //SEG23 [13] (byte) sum2::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum2::b#0 ] ( main:2 [ main::i#2 sum2::b#0 ] ) -- vbuyy=vbuz1_plus_1 + ldy i iny - //SEG24 [14] (byte) sum2::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum2::b#0 sum2::c#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 ] ) -- vbuz1=vbuxx_plus_vbuc1 - txa + //SEG24 [14] (byte) sum2::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum2::b#0 sum2::c#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 ] ) -- vbuxx=vbuz1_plus_vbuc1 + lda #2 clc - adc #2 - sta sum2.c - //SEG25 [15] (byte) sum2::a#0 ← (byte) main::i#2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ) - // (byte) sum2::a#0 = (byte) main::i#2 // register copy reg byte x + adc i + tax + //SEG25 [15] (byte) sum2::a#0 ← (byte) main::i#2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ) -- vbuaa=vbuz1 + lda i //SEG26 [16] call sum2 param-assignment [ main::i#2 sum2::return#1 ] ( main:2 [ main::i#2 sum2::return#1 ] ) jsr sum2 //SEG27 [17] (byte) sum2::return#0 ← (byte) sum2::return#1 [ main::i#2 sum2::return#0 ] ( main:2 [ main::i#2 sum2::return#0 ] ) @@ -900,12 +895,14 @@ main: { b4: //SEG29 [18] (byte~) main::$5 ← (byte) sum2::return#0 [ main::i#2 main::$5 ] ( main:2 [ main::i#2 main::$5 ] ) // (byte~) main::$5 = (byte) sum2::return#0 // register copy reg byte a - //SEG30 [19] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$5 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa - sta SCREEN2,x - //SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx - inx - //SEG32 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1 - cpx #$b + //SEG30 [19] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$5 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuaa + ldy i + sta SCREEN2,y + //SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1 + inc i + //SEG32 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1 + lda i + cmp #$b bne b1_from_b4 jmp breturn //SEG33 main::@return @@ -915,15 +912,14 @@ main: { } //SEG35 sum2 sum2: { - .label c = 2 - //SEG36 [23] (byte/word~) sum2::$0 ← (byte) sum2::a#0 + (byte) sum2::b#0 [ sum2::c#0 sum2::$0 ] ( main:2::sum2:16 [ main::i#2 sum2::c#0 sum2::$0 ] ) -- vbuaa=vbuxx_plus_vbuyy - tya + //SEG36 [23] (byte/word~) sum2::$0 ← (byte) sum2::a#0 + (byte) sum2::b#0 [ sum2::c#0 sum2::$0 ] ( main:2::sum2:16 [ main::i#2 sum2::c#0 sum2::$0 ] ) -- vbuaa=vbuaa_plus_vbuyy + sty $ff + clc + adc $ff + //SEG37 [24] (byte) sum2::return#1 ← (byte/word~) sum2::$0 + (byte) sum2::c#0 [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] ) -- vbuaa=vbuaa_plus_vbuxx stx $ff clc adc $ff - //SEG37 [24] (byte) sum2::return#1 ← (byte/word~) sum2::$0 + (byte) sum2::c#0 [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] ) -- vbuaa=vbuaa_plus_vbuz1 - clc - adc c jmp breturn //SEG38 sum2::@return breturn: @@ -932,15 +928,14 @@ sum2: { } //SEG40 sum sum: { - .label c = 2 - //SEG41 [26] (byte/word~) sum::$0 ← (byte) sum::a#0 + (byte) sum::b#0 [ sum::c#0 sum::$0 ] ( main:2::sum:9 [ main::i#2 sum::c#0 sum::$0 ] ) -- vbuaa=vbuxx_plus_vbuyy - tya + //SEG41 [26] (byte/word~) sum::$0 ← (byte) sum::a#0 + (byte) sum::b#0 [ sum::c#0 sum::$0 ] ( main:2::sum:9 [ main::i#2 sum::c#0 sum::$0 ] ) -- vbuaa=vbuaa_plus_vbuyy + sty $ff + clc + adc $ff + //SEG42 [27] (byte) sum::return#1 ← (byte/word~) sum::$0 + (byte) sum::c#0 [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] ) -- vbuaa=vbuaa_plus_vbuxx stx $ff clc adc $ff - //SEG42 [27] (byte) sum::return#1 ← (byte/word~) sum::$0 + (byte) sum::c#0 [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] ) -- vbuaa=vbuaa_plus_vbuz1 - clc - adc c jmp breturn //SEG43 sum::@return breturn: @@ -958,6 +953,8 @@ Removing instruction jmp breturn Removing instruction jmp breturn Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination +Removing instruction ldy i +Succesful ASM optimization Pass5UnnecesaryLoadElimination Replacing label b1_from_b4 with b1 Removing instruction bbegin: Removing instruction b3_from_bbegin: @@ -993,17 +990,17 @@ FINAL SYMBOL TABLE (label) main::@4 (label) main::@return (byte) main::i -(byte) main::i#1 reg byte x 16.5 -(byte) main::i#2 reg byte x 7.333333333333333 +(byte) main::i#1 i zp ZP_BYTE:2 16.5 +(byte) main::i#2 i zp ZP_BYTE:2 7.333333333333333 (byte()) sum((byte) sum::a , (byte) sum::b , (byte) sum::c) (byte/word~) sum::$0 reg byte a 4.0 (label) sum::@return (byte) sum::a -(byte) sum::a#0 reg byte x 13.0 +(byte) sum::a#0 reg byte a 13.0 (byte) sum::b (byte) sum::b#0 reg byte y 4.333333333333333 (byte) sum::c -(byte) sum::c#0 c zp ZP_BYTE:2 4.333333333333333 +(byte) sum::c#0 reg byte x 4.333333333333333 (byte) sum::return (byte) sum::return#0 reg byte a 22.0 (byte) sum::return#1 reg byte a 4.333333333333333 @@ -1011,23 +1008,24 @@ FINAL SYMBOL TABLE (byte/word~) sum2::$0 reg byte a 4.0 (label) sum2::@return (byte) sum2::a -(byte) sum2::a#0 reg byte x 13.0 +(byte) sum2::a#0 reg byte a 13.0 (byte) sum2::b (byte) sum2::b#0 reg byte y 4.333333333333333 (byte) sum2::c -(byte) sum2::c#0 c zp ZP_BYTE:2 4.333333333333333 +(byte) sum2::c#0 reg byte x 4.333333333333333 (byte) sum2::return (byte) sum2::return#0 reg byte a 22.0 (byte) sum2::return#1 reg byte a 4.333333333333333 -reg byte x [ main::i#2 main::i#1 ] +zp ZP_BYTE:2 [ main::i#2 main::i#1 ] reg byte y [ sum::b#0 ] -zp ZP_BYTE:2 [ sum::c#0 sum2::c#0 ] -reg byte x [ sum::a#0 ] +reg byte x [ sum::c#0 ] +reg byte a [ sum::a#0 ] reg byte a [ sum::return#0 ] reg byte a [ main::$2 ] reg byte y [ sum2::b#0 ] -reg byte x [ sum2::a#0 ] +reg byte x [ sum2::c#0 ] +reg byte a [ sum2::a#0 ] reg byte a [ sum2::return#0 ] reg byte a [ main::$5 ] reg byte a [ sum2::$0 ] @@ -1037,7 +1035,7 @@ reg byte a [ sum::return#1 ] FINAL ASSEMBLER -Score: 659 +Score: 821 //SEG0 Basic Upstart .pc = $801 "Basic" @@ -1056,24 +1054,25 @@ Score: 659 //SEG8 @end //SEG9 main main: { + .label i = 2 //SEG10 [5] phi from main to main::@1 [phi:main->main::@1] - //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 - ldx #0 + //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i //SEG12 [5] phi from main::@4 to main::@1 [phi:main::@4->main::@1] //SEG13 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4->main::@1#0] -- register_copy //SEG14 main::@1 b1: - //SEG15 [6] (byte) sum::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum::b#0 ] ( main:2 [ main::i#2 sum::b#0 ] ) -- vbuyy=vbuxx_plus_1 - txa - tay + //SEG15 [6] (byte) sum::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum::b#0 ] ( main:2 [ main::i#2 sum::b#0 ] ) -- vbuyy=vbuz1_plus_1 + ldy i iny - //SEG16 [7] (byte) sum::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum::b#0 sum::c#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 ] ) -- vbuz1=vbuxx_plus_vbuc1 - txa + //SEG16 [7] (byte) sum::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum::b#0 sum::c#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 ] ) -- vbuxx=vbuz1_plus_vbuc1 + lda #2 clc - adc #2 - sta sum.c - //SEG17 [8] (byte) sum::a#0 ← (byte) main::i#2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ) - // (byte) sum::a#0 = (byte) main::i#2 // register copy reg byte x + adc i + tax + //SEG17 [8] (byte) sum::a#0 ← (byte) main::i#2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ( main:2 [ main::i#2 sum::b#0 sum::c#0 sum::a#0 ] ) -- vbuaa=vbuz1 + lda i //SEG18 [9] call sum param-assignment [ main::i#2 sum::return#1 ] ( main:2 [ main::i#2 sum::return#1 ] ) jsr sum //SEG19 [10] (byte) sum::return#0 ← (byte) sum::return#1 [ main::i#2 sum::return#0 ] ( main:2 [ main::i#2 sum::return#0 ] ) @@ -1081,19 +1080,18 @@ main: { //SEG20 main::@3 //SEG21 [11] (byte~) main::$2 ← (byte) sum::return#0 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) // (byte~) main::$2 = (byte) sum::return#0 // register copy reg byte a - //SEG22 [12] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa - sta SCREEN,x - //SEG23 [13] (byte) sum2::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum2::b#0 ] ( main:2 [ main::i#2 sum2::b#0 ] ) -- vbuyy=vbuxx_plus_1 - txa - tay + //SEG22 [12] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuaa + ldy i + sta SCREEN,y + //SEG23 [13] (byte) sum2::b#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1 [ main::i#2 sum2::b#0 ] ( main:2 [ main::i#2 sum2::b#0 ] ) -- vbuyy=vbuz1_plus_1 iny - //SEG24 [14] (byte) sum2::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum2::b#0 sum2::c#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 ] ) -- vbuz1=vbuxx_plus_vbuc1 - txa + //SEG24 [14] (byte) sum2::c#0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#2 sum2::b#0 sum2::c#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 ] ) -- vbuxx=vbuz1_plus_vbuc1 + lda #2 clc - adc #2 - sta sum2.c - //SEG25 [15] (byte) sum2::a#0 ← (byte) main::i#2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ) - // (byte) sum2::a#0 = (byte) main::i#2 // register copy reg byte x + adc i + tax + //SEG25 [15] (byte) sum2::a#0 ← (byte) main::i#2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ( main:2 [ main::i#2 sum2::b#0 sum2::c#0 sum2::a#0 ] ) -- vbuaa=vbuz1 + lda i //SEG26 [16] call sum2 param-assignment [ main::i#2 sum2::return#1 ] ( main:2 [ main::i#2 sum2::return#1 ] ) jsr sum2 //SEG27 [17] (byte) sum2::return#0 ← (byte) sum2::return#1 [ main::i#2 sum2::return#0 ] ( main:2 [ main::i#2 sum2::return#0 ] ) @@ -1101,12 +1099,14 @@ main: { //SEG28 main::@4 //SEG29 [18] (byte~) main::$5 ← (byte) sum2::return#0 [ main::i#2 main::$5 ] ( main:2 [ main::i#2 main::$5 ] ) // (byte~) main::$5 = (byte) sum2::return#0 // register copy reg byte a - //SEG30 [19] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$5 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa - sta SCREEN2,x - //SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx - inx - //SEG32 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1 - cpx #$b + //SEG30 [19] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$5 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuaa + ldy i + sta SCREEN2,y + //SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1 + inc i + //SEG32 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1 + lda i + cmp #$b bne b1 //SEG33 main::@return //SEG34 [22] return [ ] ( main:2 [ ] ) @@ -1114,30 +1114,28 @@ main: { } //SEG35 sum2 sum2: { - .label c = 2 - //SEG36 [23] (byte/word~) sum2::$0 ← (byte) sum2::a#0 + (byte) sum2::b#0 [ sum2::c#0 sum2::$0 ] ( main:2::sum2:16 [ main::i#2 sum2::c#0 sum2::$0 ] ) -- vbuaa=vbuxx_plus_vbuyy - tya + //SEG36 [23] (byte/word~) sum2::$0 ← (byte) sum2::a#0 + (byte) sum2::b#0 [ sum2::c#0 sum2::$0 ] ( main:2::sum2:16 [ main::i#2 sum2::c#0 sum2::$0 ] ) -- vbuaa=vbuaa_plus_vbuyy + sty $ff + clc + adc $ff + //SEG37 [24] (byte) sum2::return#1 ← (byte/word~) sum2::$0 + (byte) sum2::c#0 [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] ) -- vbuaa=vbuaa_plus_vbuxx stx $ff clc adc $ff - //SEG37 [24] (byte) sum2::return#1 ← (byte/word~) sum2::$0 + (byte) sum2::c#0 [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] ) -- vbuaa=vbuaa_plus_vbuz1 - clc - adc c //SEG38 sum2::@return //SEG39 [25] return [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] ) rts } //SEG40 sum sum: { - .label c = 2 - //SEG41 [26] (byte/word~) sum::$0 ← (byte) sum::a#0 + (byte) sum::b#0 [ sum::c#0 sum::$0 ] ( main:2::sum:9 [ main::i#2 sum::c#0 sum::$0 ] ) -- vbuaa=vbuxx_plus_vbuyy - tya + //SEG41 [26] (byte/word~) sum::$0 ← (byte) sum::a#0 + (byte) sum::b#0 [ sum::c#0 sum::$0 ] ( main:2::sum:9 [ main::i#2 sum::c#0 sum::$0 ] ) -- vbuaa=vbuaa_plus_vbuyy + sty $ff + clc + adc $ff + //SEG42 [27] (byte) sum::return#1 ← (byte/word~) sum::$0 + (byte) sum::c#0 [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] ) -- vbuaa=vbuaa_plus_vbuxx stx $ff clc adc $ff - //SEG42 [27] (byte) sum::return#1 ← (byte/word~) sum::$0 + (byte) sum::c#0 [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] ) -- vbuaa=vbuaa_plus_vbuz1 - clc - adc c //SEG43 sum::@return //SEG44 [28] return [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] ) rts diff --git a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.sym b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.sym index 7c59ad057..f1b55297a 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.sym +++ b/src/test/java/dk/camelot64/kickc/test/ref/zpparammin.sym @@ -13,17 +13,17 @@ (label) main::@4 (label) main::@return (byte) main::i -(byte) main::i#1 reg byte x 16.5 -(byte) main::i#2 reg byte x 7.333333333333333 +(byte) main::i#1 i zp ZP_BYTE:2 16.5 +(byte) main::i#2 i zp ZP_BYTE:2 7.333333333333333 (byte()) sum((byte) sum::a , (byte) sum::b , (byte) sum::c) (byte/word~) sum::$0 reg byte a 4.0 (label) sum::@return (byte) sum::a -(byte) sum::a#0 reg byte x 13.0 +(byte) sum::a#0 reg byte a 13.0 (byte) sum::b (byte) sum::b#0 reg byte y 4.333333333333333 (byte) sum::c -(byte) sum::c#0 c zp ZP_BYTE:2 4.333333333333333 +(byte) sum::c#0 reg byte x 4.333333333333333 (byte) sum::return (byte) sum::return#0 reg byte a 22.0 (byte) sum::return#1 reg byte a 4.333333333333333 @@ -31,23 +31,24 @@ (byte/word~) sum2::$0 reg byte a 4.0 (label) sum2::@return (byte) sum2::a -(byte) sum2::a#0 reg byte x 13.0 +(byte) sum2::a#0 reg byte a 13.0 (byte) sum2::b (byte) sum2::b#0 reg byte y 4.333333333333333 (byte) sum2::c -(byte) sum2::c#0 c zp ZP_BYTE:2 4.333333333333333 +(byte) sum2::c#0 reg byte x 4.333333333333333 (byte) sum2::return (byte) sum2::return#0 reg byte a 22.0 (byte) sum2::return#1 reg byte a 4.333333333333333 -reg byte x [ main::i#2 main::i#1 ] +zp ZP_BYTE:2 [ main::i#2 main::i#1 ] reg byte y [ sum::b#0 ] -zp ZP_BYTE:2 [ sum::c#0 sum2::c#0 ] -reg byte x [ sum::a#0 ] +reg byte x [ sum::c#0 ] +reg byte a [ sum::a#0 ] reg byte a [ sum::return#0 ] reg byte a [ main::$2 ] reg byte y [ sum2::b#0 ] -reg byte x [ sum2::a#0 ] +reg byte x [ sum2::c#0 ] +reg byte a [ sum2::a#0 ] reg byte a [ sum2::return#0 ] reg byte a [ main::$5 ] reg byte a [ sum2::$0 ]