1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-15 09:23:47 +00:00

Working on optimal synthesis

This commit is contained in:
jespergravgaard 2018-01-06 14:01:40 +01:00
parent 30d77c1450
commit 40153fc6d6
50 changed files with 420 additions and 425 deletions

View File

@ -11,16 +11,16 @@ class AsmFragmentTemplateSynthesisRule {
/** Regular expression that matches the signature of fragments that the synthesis rule can handle. /** 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. */ * 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. */ /** 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. */ /** ASM code prefixed to the sub-fragment when synthesizing. */
final private String asmPrefix; final private String asmPrefix;
/** Signature of the sub-fragment to use for synthesizing the fragment. References the matching groups from sigMatch (via $1, $2, ...). */ /** 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. */ /** ASM code postfixed to the sub-fragment when synthesizing. */
final private String asmPostfix; final private String asmPostfix;
@ -123,7 +123,9 @@ class AsmFragmentTemplateSynthesisRule {
} }
newFragment.append(subFragment); newFragment.append(subFragment);
if(asmPostfix != null) { if(asmPostfix != null) {
newFragment.append("\n"); if(newFragment.length()>0 && !newFragment.substring(newFragment.length()-1).equals("\n")) {
newFragment.append("\n");
}
newFragment.append(asmPostfix); newFragment.append(asmPostfix);
} }
return new AsmFragmentTemplate(signature, newFragment.toString(), this, subTemplate); return new AsmFragmentTemplate(signature, newFragment.toString(), this, subTemplate);
@ -185,6 +187,8 @@ class AsmFragmentTemplateSynthesisRule {
mapZ2.put("z3", "z1"); mapZ2.put("z3", "z1");
Map<String, String> mapZ3 = new LinkedHashMap<>(); Map<String, String> mapZ3 = new LinkedHashMap<>();
mapZ3.put("z3", "z2"); mapZ3.put("z3", "z2");
Map<String, String> mapZ4 = new LinkedHashMap<>();
mapZ3.put("z4", "z3");
Map<String, String> mapC = new LinkedHashMap<>(); Map<String, String> mapC = new LinkedHashMap<>();
mapC.put("c2", "c1"); mapC.put("c2", "c1");
mapC.put("c3", "c2"); 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)); synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z1(.*vb.)z1(.*)", "...z1=.*|.*aa.*", "lda {z1}", "$1z1$2aa$3", null, null));
// Replace non-assigned Z1 with AA // Replace non-assigned Z1 with AA
synths.add(new AsmFragmentTemplateSynthesisRule("(...aa)=(.*vb.)z1(.*)", ".*z1.*z1.*|.*=.*aa.*", "lda {z1}", "$1=$2aa$3", null, mapZ)); 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) // Replace Z1 with YY (only one)
synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z1(.*)", "...z1=.*|.*z1.*z1.*|.*yy.*", "ldy {z1}", "$1yy$2", null, mapZ)); 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)); synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z1(.*vb.)z1(.*)", "...z1=.*|.*yy.*", "ldy {z1}", "$1z1$2yy$3", null, null));
// Replace non-assigned Z1 with YY // Replace non-assigned Z1 with YY
synths.add(new AsmFragmentTemplateSynthesisRule("(...yy)=(.*vb.)z1(.*)", ".*z1.*z1.*|.*=.*yy.*", "ldy {z1}", "$1=$2yy$3", null, mapZ)); 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) // Replace Z1 with XX (only one)
synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z1(.*)", "...z1=.*|.*z1.*z1.*|.*xx.*", "ldx {z1}", "$1xx$2", null, mapZ)); 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)); synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z1(.*vb.)z1(.*)", "...z1=.*|.*xx.*", "ldx {z1}", "$1z1$2xx$3", null, null));
// Replace non-assigned Z1 with XX // Replace non-assigned Z1 with XX
synths.add(new AsmFragmentTemplateSynthesisRule("(...xx)=(.*vb.)z1(.*)", ".*z1.*z1.*|.*=.*xx.*", "ldx {z1}", "$1=$2xx$3", null, mapZ)); 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) // Replace Z2 with AA (only one)
synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)z2(.*)", "...z2=.*|.*z2.*z2.*|.*aa.*", "lda {z2}", "$1aa$2", null, mapZ3)); 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 // Replace second (of 2) Z2 with XX
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)z2(.*vb.)z2(.*)", "...z2=.*|.*xx.*", "ldx {z2}", "$1z2$2xx$3", null, null)); 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 > // Rewrite comparisons < to >
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(.*)_then_(.*)", null, null, "$2_lt_$1_then_$3", null, null)); synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_gt_(.*)_then_(.*)", null, null, "$2_lt_$1_then_$3", null, null));
// Rewrite comparisons > to < // 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)); synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_(eq|neq)_(.*)_then_(.*)", null, null, "$3_$2_$1_then_$4", null, null));
// Rewrite Assignments to X from A // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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.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("(.*)=(.*)_(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("vb(.)xx=(.*)", null, null, "vb$1aa=$2", "tax\n", null));
//synths.add(new AsmFragmentTemplateSynthesisRule("vbuyy=(.*)", null, null, "vbuaa=$1", "tay\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("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("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_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\n", mapC, "yy")); 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\n", mapC, "xx")); 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\n", mapZ2)); 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(.)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\n", "$1=vb$2aa$3", null, mapZ)); 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... ) // 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(.*)", ".*xx.*", "tax", "$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(.*)", ".*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... ) // 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(.*)", ".*xx.*|.*z1.*z1.*", "ldx {z1}", "$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_vbuz1(.*)", ".*yy.*|.*z1.*z1.*", "ldy {z1}", "$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(.*)", ".*xx.*|.*z2.*z2.*", "ldx {z2}", "$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_vbuz2(.*)", ".*yy.*|.*z2.*z2.*", "ldy {z2}", "$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(.*)", ".*yy.*", "ldy {z3}", "$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_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... ) // 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.*|.*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\n", 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}\n", mapZ)); 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}\n", 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}\n", 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}\n", 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\n", 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\n", mapC)); 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... ) // 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("(.*)=(.*)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\n", "$1=$2vb$3aa$4", null, null)); 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\n", "$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\n", "$1=$2vb$3aa$4", null, mapC)); 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\n", "$1=$2vb$3aa$4", null, null)); 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\n", "$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\n", "$1=$2vb$3aa$4", null, mapC3)); 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\n", "$1=$2vb$3aa$4", null, null)); 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\n", "$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\n", "$1=$2vb$3aa$4", null, mapC3)); 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\n", "$1=$2vb$3aa$4", null, null)); 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\n", "$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 // 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("(.*)=(.*)vbuz1(.*)", ".*z1.*=.*|.*=.*aa.*|.*z1.*z1.*", "lda {z1}", "$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("(.*)=(.*)vbsz1(.*)", ".*z1.*=.*|.*=.*aa.*|.*z1.*z1.*", "lda {z1}", "$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("(.*)=(.*)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}\n", "$1=$2vbsaa$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}\n", "$1=$2vbuaa$3", null, mapZ3)); //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}\n", "$1=$2vbsaa$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("(.*)=(.*)_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\n", "$1=$2_vbsaa", 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\n", "$1=$2_vbuaa", 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\n", "$1=$2_vbsaa", 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}\n", "$1=$2_vbuaa", null, mapZ)); //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}\n", "$1=$2_vbsaa", 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}\n", "$1=$2_vbuaa", null, null)); //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}\n", "$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("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}\n", "vbsaa=vbsaa$1", "sta {z1}\n", 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("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}\n", "vbsaa_$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}\n", "vb$1aa_$2_$3", null, mapC)); 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\n", "vb$1aa_$2_$3", null, mapZ)); 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("(.*)_ge_(vb.aa)_then_(.*)", ".*vb.aa.*_ge.*", null, "$2_le_$1_then_$3", null, null));
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("(.*)_ge_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_ge.*", null, "$2_le_$1_then_$3", null, null));
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("(.*)_ge_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_ge.*", null, "$2_le_$1_then_$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("(.*)_lt_(vb.aa)_then_(.*)", ".*vb.aa.*_lt.*", null, "$2_gt_$1_then_$3", null, null));
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("(.*)_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("(.*)_ge_(vb.aa)_then_(.*)", ".*vb.aa.*_ge.*", null, "$2_le_$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("(.*)_ge_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_ge.*", null, "$2_le_$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("(.*)_ge_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_ge.*", null, "$2_le_$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("(.*)_lt_(vb.aa)_then_(.*)", ".*vb.aa.*_lt.*", null, "$2_gt_$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("(.*)_lt_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_lt.*", null, "$2_gt_$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("(.*)_lt_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_lt.*", null, "$2_gt_$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("(.*)_gt_(vb.aa)_then_(.*)", ".*vb.aa.*_gt.*", null, "$2_lt_$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("(.*)_gt_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_gt.*", null, "$2_lt_$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("(.*)_gt_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_gt.*", null, "$2_lt_$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("(.*)_le_(vb.aa)_then_(.*)", ".*vb.aa.*_le.*", null, "$2_ge_$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("(.*)_le_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_le.*", null, "$2_ge_$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("(.*)_le_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_le.*", null, "$2_ge_$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("(.*)_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... ) // 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)); 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)); 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... ) // 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("(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("(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... ) // 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)); 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)); synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)aa=_dec_(.*)", null, null, "vb$1aa=$2_minus_1", null, null));
// Synthesize XX/YY using AA // 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("(.*)=(.*)vbuxx(.*)", ".*=.*aa.*|.*derefidx_vb.xx.*", "txa", "$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("(.*)=(.*)vbsxx(.*)", ".*=.*aa.*|.*derefidx_vb.xx.*", "txa", "$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("(.*)=(.*)vbuyy(.*)", ".*=.*aa.*|.*derefidx_vb.yy.*", "tya", "$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("(.*)=(.*)vbsyy(.*)", ".*=.*aa.*|.*derefidx_vb.yy.*", "tya", "$1=$2vbsaa$3", null, null));
// Synthesize constants using AA // 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("(.*)=(.*)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}\n", "$1=$2vbsaa$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 // 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)); synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_(lt|gt|le|ge|eq|neq)_p..([cz].)_then_(.*)", null, null, "$1_$2_vwu$3_then_$4", null, null));

View File

@ -55,6 +55,16 @@ public class AsmFragmentTemplateSynthesizer {
instanceSpec.getBindings()); 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<AsmFragmentTemplate> getFragmentTemplates(String signature, CompileLog log) {
return SYNTHESIZER.getBestTemplates(signature, log);
}
public AsmFragmentTemplate getFragmentTemplate(String signature, CompileLog log) { public AsmFragmentTemplate getFragmentTemplate(String signature, CompileLog log) {
AsmFragmentTemplate bestTemplate = bestFragmentCache.get(signature); AsmFragmentTemplate bestTemplate = bestFragmentCache.get(signature);
if(bestTemplate == UNKNOWN) { if(bestTemplate == UNKNOWN) {
@ -459,8 +469,13 @@ public class AsmFragmentTemplateSynthesizer {
URL fragmentUrl = classLoader.getResource(FRAGMENT_RESOURCE_FOLDER + signature + ".asm"); URL fragmentUrl = classLoader.getResource(FRAGMENT_RESOURCE_FOLDER + signature + ".asm");
if(fragmentUrl == null) return null; if(fragmentUrl == null) return null;
InputStream fragmentStream = fragmentUrl.openStream(); InputStream fragmentStream = fragmentUrl.openStream();
CharStream fragmentCharStream = CharStreams.fromStream(fragmentStream); String body;
String body = fragmentCharStream.toString(); if(fragmentStream.available()==0) {
body = "";
} else {
CharStream fragmentCharStream = CharStreams.fromStream(fragmentStream);
body = fragmentCharStream.toString();
}
return new AsmFragmentTemplate(signature, body); return new AsmFragmentTemplate(signature, body);
} catch(IOException e) { } catch(IOException e) {
throw new RuntimeException("Error loading fragment file " + signature, e); throw new RuntimeException("Error loading fragment file " + signature, e);

View File

@ -33,7 +33,7 @@ public class AsmFragmentTemplateUsages {
* *
* @param log The compile log to add the output to * @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<String, AsmFragmentTemplateSynthesizer.AsmFragmentSynthesis> synthesisGraph = Map<String, AsmFragmentTemplateSynthesizer.AsmFragmentSynthesis> synthesisGraph =
AsmFragmentTemplateSynthesizer.SYNTHESIZER.getSynthesisGraph(); AsmFragmentTemplateSynthesizer.SYNTHESIZER.getSynthesisGraph();
@ -42,50 +42,36 @@ public class AsmFragmentTemplateUsages {
File[] files = AsmFragmentTemplateSynthesizer.SYNTHESIZER.allFragmentFiles(); File[] files = AsmFragmentTemplateSynthesizer.SYNTHESIZER.allFragmentFiles();
if(logRedundantFiles) { 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<AsmFragmentTemplate> 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<String> redundantSignatures = new LinkedHashSet<>(); Set<String> redundantSignatures = new LinkedHashSet<>();
for(File file : files) { for(File file : files) {
String fileName = file.getName(); String fileName = file.getName();
String signature = fileName.substring(0, fileName.length() - 4); String signature = fileName.substring(0, fileName.length() - 4);
// Synthesize the fragment - and check if the synthesis is as good as the file body // Synthesize the fragment - and check if the synthesis is as good as the file body
AsmFragmentTemplate template = Collection<AsmFragmentTemplate> templates = AsmFragmentTemplateSynthesizer.getFragmentTemplates(signature, log);
AsmFragmentTemplateSynthesizer.SYNTHESIZER.getFragmentTemplate(signature, log); boolean isFile = false;
if(!template.isFile()) { for(AsmFragmentTemplate template : templates) {
// Check if the synthesis uses a file marked as redundant isFile |= template.isFile();
AsmFragmentTemplate sourceFileTemplate = template; }
while(!sourceFileTemplate.isFile()) { if(!isFile) {
sourceFileTemplate = sourceFileTemplate.getSubFragment(); 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())) { log.append("rm " + signature + ".asm #synthesized better ASM by " + templateNames);
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());
redundantSignatures.add(signature); 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<AsmFragmentTemplateSynthesisRule> rules =
new LinkedHashSet<>(AsmFragmentTemplateSynthesisRule.getSynthesisRules());
for(String signature : signatures) {
Collection<AsmFragmentTemplate> 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) { if(logFileDetails) {
log.append("\nDETAILED ASM FILE USAGES"); log.append("\nDETAILED ASM FILE USAGES");
// Find all file templates // Find all file templates
@ -168,10 +173,15 @@ public class AsmFragmentTemplateUsages {
for(AsmFragmentTemplate template : templates) { for(AsmFragmentTemplate template : templates) {
Integer usage = fragmentTemplateUsage.get(template); Integer usage = fragmentTemplateUsage.get(template);
if(usage == null) usage = 0; 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<AsmFragmentTemplate> bestTemplates = synthesis.getBestTemplates();
log.append(String.format("%8d", usage) + " " + template.getSignature()+" - templates: " + bestTemplates.size());
if(logBody) { if(logBody) {
log.append(" clobber:"+template.getClobber().toString()+" cycles:"+template.getCycles()); for(AsmFragmentTemplate bestTemplate : bestTemplates) {
log.append(" "+template.getBody().replace("\n", "\n ")); log.append(" " + (bestTemplate.isFile() ? "*" : "") + bestTemplate.getName() + " - clobber:" + bestTemplate.getClobber().toString() + " cycles:" + bestTemplate.getCycles());
log.append(" " + bestTemplate.getBody().replace("\n", "\n "));
}
} }
} }
} }

View File

@ -1 +0,0 @@
// casting - do nothing

View File

@ -1 +0,0 @@
// casting - do nothing

View File

@ -1 +0,0 @@
// casting byte to sbyte - do nothing

View File

@ -1 +0,0 @@
// Do nothing: casting signed byte to byte

View File

@ -1 +0,0 @@
// do nothing

View File

@ -1 +0,0 @@
// Do nothing: casting signed byte to byte

View File

@ -1 +0,0 @@
// do nothing

View File

@ -1 +0,0 @@
// Do nothing: casting signed byte to byte

View File

@ -1 +0,0 @@
// do nothing

View File

@ -1,2 +1,2 @@
sta {z1}+1 sta {z1}+1
stx {z1} stx {z1}

View File

@ -1,2 +1,2 @@
sta {z1}+1 sta {z1}+1
sty {z1} sty {z1}

View File

@ -32,7 +32,7 @@ public class TestPrograms {
public static void tearDown() throws Exception { public static void tearDown() throws Exception {
CompileLog log = new CompileLog(); CompileLog log = new CompileLog();
log.setSysOut(true); log.setSysOut(true);
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false); AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
} }
@Test @Test

View File

@ -4752,10 +4752,9 @@ line_ydxi: {
//SEG192 line_ydxi::@2 //SEG192 line_ydxi::@2
b2: 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 //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 ldy y1
clc iny
adc #1 sty _6
sta _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 //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 lda y
cmp _6 cmp _6
@ -4883,10 +4882,9 @@ line_xdyi: {
//SEG229 line_xdyi::@2 //SEG229 line_xdyi::@2
b2: 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 //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 ldy x1
clc iny
adc #1 sty _6
sta _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 //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 lda x
cmp _6 cmp _6
@ -4964,10 +4962,9 @@ line_ydxd: {
//SEG257 line_ydxd::@2 //SEG257 line_ydxd::@2
b2: 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 //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 ldy y1
clc iny
adc #1 sty _6
sta _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 //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 lda y
cmp _6 cmp _6
@ -5045,10 +5042,9 @@ line_xdyd: {
//SEG285 line_xdyd::@2 //SEG285 line_xdyd::@2
b2: 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 //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 ldy x1
clc iny
adc #1 sty _6
sta _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 //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 lda x
cmp _6 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 [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 [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 ] 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 [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 [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 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 [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 [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 [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 [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 [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 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 [main]
Uplift Scope [] 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) 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. 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 [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 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_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 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_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 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 [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 [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 ] 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) Uplift attempts [line] 10000/186624 (limiting to 10000)

View File

@ -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 [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 [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 ] 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 [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 [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 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 [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 [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 [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 [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 [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 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

View File

@ -25,8 +25,8 @@ main: {
sta bits sta bits
ldx #0 ldx #0
b2: b2:
lda #$80 lda bits
and bits and #$80
cmp #0 cmp #0
beq b4 beq b4
lda #'*' lda #'*'

View File

@ -867,8 +867,8 @@ main: {
//SEG27 main::@2 //SEG27 main::@2
b2: 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 //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 lda bits
and 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 //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 cmp #0
beq b3_from_b2 beq b3_from_b2
@ -1078,8 +1078,8 @@ main: {
//SEG27 main::@2 //SEG27 main::@2
b2: 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 //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 lda bits
and 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 //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 cmp #0
beq b4 beq b4

View File

@ -10,9 +10,9 @@ main: {
sta fibs+1 sta fibs+1
ldx #0 ldx #0
b1: b1:
lda fibs+1,x lda fibs,x
clc clc
adc fibs,x adc fibs+1,x
sta fibs+2,x sta fibs+2,x
inx inx
cpx #$f cpx #$f

View File

@ -356,9 +356,9 @@ main: {
//SEG15 main::@1 //SEG15 main::@1
b1: 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 //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 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 //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 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 //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 //SEG15 main::@1
b1: 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 //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 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 //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 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 //SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx

View File

@ -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 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 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 ] 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 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 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 ] 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 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 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 ] 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 [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 [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 ] 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 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 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 ] 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 [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 [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 ] 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 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 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 ] 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 [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 [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 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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 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

View File

@ -585,10 +585,9 @@ main: {
lda _0 lda _0
sta SCREEN+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 //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 ldy cnt_12
clc iny
adc #1 sty cnt
sta cnt
//SEG20 [10] call inccnt param-assignment [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] ) //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] //SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
inccnt_from_b1: inccnt_from_b1:
@ -620,10 +619,9 @@ inccnt: {
.label return_1 = 7 .label return_1 = 7
.label return_2 = $a .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 //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 ldy cnt
clc iny
adc #1 sty cnt_12
sta 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 //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 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 //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

View File

@ -348,10 +348,9 @@ main: {
lda cnt_13 lda cnt_13
sta SCREEN+0 sta SCREEN+0
//SEG15 [7] (byte) cnt#2 ← ++ (byte) cnt#13 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuz1=_inc_vbuz2 //SEG15 [7] (byte) cnt#2 ← ++ (byte) cnt#13 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuz1=_inc_vbuz2
lda cnt_13 ldy cnt_13
clc iny
adc #1 sty cnt
sta cnt
//SEG16 [8] call inccnt param-assignment [ cnt#13 ] ( main:2 [ cnt#13 ] ) //SEG16 [8] call inccnt param-assignment [ cnt#13 ] ( main:2 [ cnt#13 ] )
//SEG17 [12] phi from main::@1 to inccnt [phi:main::@1->inccnt] //SEG17 [12] phi from main::@1 to inccnt [phi:main::@1->inccnt]
inccnt_from_b1: inccnt_from_b1:
@ -361,10 +360,9 @@ main: {
//SEG19 main::@2 //SEG19 main::@2
b2: b2:
//SEG20 [9] (byte) cnt#11 ← ++ (byte) cnt#13 [ cnt#11 ] ( main:2 [ cnt#11 ] ) -- vbuz1=_inc_vbuz2 //SEG20 [9] (byte) cnt#11 ← ++ (byte) cnt#13 [ cnt#11 ] ( main:2 [ cnt#11 ] ) -- vbuz1=_inc_vbuz2
lda cnt_13 ldy cnt_13
clc iny
adc #1 sty cnt_11
sta cnt_11
//SEG21 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 1) ← (byte) cnt#11 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1 //SEG21 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 1) ← (byte) cnt#11 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1
lda cnt_11 lda cnt_11
sta SCREEN+1 sta SCREEN+1
@ -377,10 +375,9 @@ main: {
//SEG24 inccnt //SEG24 inccnt
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 //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 ldy cnt
clc iny
adc #1 sty cnt_13
sta cnt_13
jmp breturn jmp breturn
//SEG26 inccnt::@return //SEG26 inccnt::@return
breturn: breturn:

View File

@ -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 ] 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 [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 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 [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$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 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 [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 [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 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 [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$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 Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte y

View File

@ -466,8 +466,8 @@ gen_chargen_sprite: {
tay tay
sta s_gen sta s_gen
b2: b2:
lda #$80 lda bits
and bits and #$80
cmp #0 cmp #0
beq b6 beq b6
lda #1 lda #1

File diff suppressed because one or more lines are too long

View File

@ -454,8 +454,8 @@ print_byte: {
tay tay
lda hextab,y lda hextab,y
jsr print_char jsr print_char
lda #$f lda b
and b and #$f
tay tay
lda hextab,y lda hextab,y
jsr print_char jsr print_char

File diff suppressed because one or more lines are too long

View File

@ -239,6 +239,7 @@ print_sbyte: {
rts rts
} }
signed_multiply: { signed_multiply: {
.label _13 = $e
.label m = 6 .label m = 6
.label return = 6 .label return = 6
.label b = 3 .label b = 3
@ -258,9 +259,9 @@ signed_multiply: {
cmp #0 cmp #0
bpl b2 bpl b2
lda m+1 lda m+1
sty $ff sty _13
sec sec
sbc $ff sbc _13
sta m+1 sta m+1
b2: b2:
rts rts

View File

@ -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 [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 ] 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) 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. 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 [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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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 ] 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: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: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_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 ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -9060,6 +9063,7 @@ print_sbyte: {
} }
//SEG233 signed_multiply //SEG233 signed_multiply
signed_multiply: { signed_multiply: {
.label _13 = $e
.label m = 6 .label m = 6
.label return = 6 .label return = 6
.label b = 3 .label b = 3
@ -9112,11 +9116,11 @@ signed_multiply: {
b4: 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 //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 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 //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
//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 _13
sty $ff //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 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 //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 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] //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 (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) (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::$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::$16 reg byte a 4.0
(byte/signed byte/word/signed word~) signed_multiply::$17 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 (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 x [ signed_multiply::$7 ]
reg byte a [ signed_multiply::$16 ] reg byte a [ signed_multiply::$16 ]
reg byte a [ signed_multiply::$12 ] 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 a [ signed_multiply::$17 ]
reg byte x [ slow_multiply::b#0 ] reg byte x [ slow_multiply::b#0 ]
reg byte x [ multiply_error::a#0 ] reg byte x [ multiply_error::a#0 ]
@ -11322,6 +11326,7 @@ print_sbyte: {
} }
//SEG233 signed_multiply //SEG233 signed_multiply
signed_multiply: { signed_multiply: {
.label _13 = $e
.label m = 6 .label m = 6
.label return = 6 .label return = 6
.label b = 3 .label b = 3
@ -11364,11 +11369,11 @@ signed_multiply: {
//SEG253 signed_multiply::@4 //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 //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 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 //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
//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 _13
sty $ff //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 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 //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 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] //SEG258 [129] phi from signed_multiply::@1 signed_multiply::@4 to signed_multiply::@2 [phi:signed_multiply::@1/signed_multiply::@4->signed_multiply::@2]

View File

@ -244,7 +244,7 @@
(word) print_word::w#5 w zp ZP_WORD:6 4.666666666666666 (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) (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::$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::$16 reg byte a 4.0
(byte/signed byte/word/signed word~) signed_multiply::$17 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 (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 x [ signed_multiply::$7 ]
reg byte a [ signed_multiply::$16 ] reg byte a [ signed_multiply::$16 ]
reg byte a [ signed_multiply::$12 ] 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 a [ signed_multiply::$17 ]
reg byte x [ slow_multiply::b#0 ] reg byte x [ slow_multiply::b#0 ]
reg byte x [ multiply_error::a#0 ] reg byte x [ multiply_error::a#0 ]

View File

@ -5,48 +5,50 @@
.const SCREEN2 = $400+$28 .const SCREEN2 = $400+$28
jsr main jsr main
main: { main: {
ldx #0 .label i = 2
lda #0
sta i
b1: b1:
txa ldy i
tay
iny iny
txa lda #2
clc clc
adc #2 adc i
sta sum.c tax
lda i
jsr sum jsr sum
sta SCREEN,x ldy i
txa sta SCREEN,y
tay
iny iny
txa lda #2
clc clc
adc #2 adc i
sta sum2.c tax
lda i
jsr sum2 jsr sum2
sta SCREEN2,x ldy i
inx sta SCREEN2,y
cpx #$b inc i
lda i
cmp #$b
bne b1 bne b1
rts rts
} }
sum2: { sum2: {
.label c = 2 sty $ff
tya clc
adc $ff
stx $ff stx $ff
clc clc
adc $ff adc $ff
clc
adc c
rts rts
} }
sum: { sum: {
.label c = 2 sty $ff
tya clc
adc $ff
stx $ff stx $ff
clc clc
adc $ff adc $ff
clc
adc c
rts rts
} }

View File

@ -654,10 +654,9 @@ main: {
//SEG14 main::@1 //SEG14 main::@1
b1: 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 //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 ldy i
clc iny
adc #1 sty sum.b
sta 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 //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 lda i
clc clc
@ -682,10 +681,9 @@ main: {
lda _2 lda _2
sta SCREEN,y 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 //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 ldy i
clc iny
adc #1 sty sum2.b
sta 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 //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 lda i
clc 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 [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 [] 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 [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 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 [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 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 [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 821 combination Uplifting [] best 1013 combination
Attempting to uplift remaining variables inzp ZP_BYTE:4 [ sum::c#0 ] Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplifting [sum] best 821 combination zp ZP_BYTE:4 [ sum::c#0 ] Uplifting [main] best 1013 combination zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
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 ]
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -847,10 +841,12 @@ bend_from_b3:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
ldx #0 lda #0
sta i
jmp b1 jmp b1
//SEG12 [5] phi from main::@4 to main::@1 [phi:main::@4->main::@1] //SEG12 [5] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
b1_from_b4: b1_from_b4:
@ -858,17 +854,16 @@ main: {
jmp b1 jmp b1
//SEG14 main::@1 //SEG14 main::@1
b1: 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 //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
txa ldy i
tay
iny 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 //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
txa lda #2
clc clc
adc #2 adc i
sta sum.c 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 ] ) //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
// (byte) sum::a#0 = (byte) main::i#2 // register copy reg byte x lda i
//SEG18 [9] call sum param-assignment [ main::i#2 sum::return#1 ] ( main:2 [ main::i#2 sum::return#1 ] ) //SEG18 [9] call sum param-assignment [ main::i#2 sum::return#1 ] ( main:2 [ main::i#2 sum::return#1 ] )
jsr sum 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 ] ) //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: b3:
//SEG21 [11] (byte~) main::$2 ← (byte) sum::return#0 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) //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 // (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 //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
sta SCREEN,x ldy i
//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 sta SCREEN,y
txa //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
tay ldy i
iny 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 //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
txa lda #2
clc clc
adc #2 adc i
sta sum2.c 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 ] ) //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
// (byte) sum2::a#0 = (byte) main::i#2 // register copy reg byte x lda i
//SEG26 [16] call sum2 param-assignment [ main::i#2 sum2::return#1 ] ( main:2 [ main::i#2 sum2::return#1 ] ) //SEG26 [16] call sum2 param-assignment [ main::i#2 sum2::return#1 ] ( main:2 [ main::i#2 sum2::return#1 ] )
jsr sum2 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 ] ) //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: b4:
//SEG29 [18] (byte~) main::$5 ← (byte) sum2::return#0 [ main::i#2 main::$5 ] ( main:2 [ main::i#2 main::$5 ] ) //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 // (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 //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
sta SCREEN2,x ldy i
//SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx sta SCREEN2,y
inx //SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
//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 inc i
cpx #$b //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 bne b1_from_b4
jmp breturn jmp breturn
//SEG33 main::@return //SEG33 main::@return
@ -915,15 +912,14 @@ main: {
} }
//SEG35 sum2 //SEG35 sum2
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=vbuaa_plus_vbuyy
//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 sty $ff
tya 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 stx $ff
clc clc
adc $ff 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 jmp breturn
//SEG38 sum2::@return //SEG38 sum2::@return
breturn: breturn:
@ -932,15 +928,14 @@ sum2: {
} }
//SEG40 sum //SEG40 sum
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=vbuaa_plus_vbuyy
//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 sty $ff
tya 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 stx $ff
clc clc
adc $ff 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 jmp breturn
//SEG43 sum::@return //SEG43 sum::@return
breturn: breturn:
@ -958,6 +953,8 @@ Removing instruction jmp breturn
Removing instruction jmp breturn Removing instruction jmp breturn
Removing instruction jmp breturn Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Removing instruction ldy i
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1_from_b4 with b1 Replacing label b1_from_b4 with b1
Removing instruction bbegin: Removing instruction bbegin:
Removing instruction b3_from_bbegin: Removing instruction b3_from_bbegin:
@ -993,17 +990,17 @@ FINAL SYMBOL TABLE
(label) main::@4 (label) main::@4
(label) main::@return (label) main::@return
(byte) main::i (byte) main::i
(byte) main::i#1 reg byte x 16.5 (byte) main::i#1 i zp ZP_BYTE:2 16.5
(byte) main::i#2 reg byte x 7.333333333333333 (byte) main::i#2 i zp ZP_BYTE:2 7.333333333333333
(byte()) sum((byte) sum::a , (byte) sum::b , (byte) sum::c) (byte()) sum((byte) sum::a , (byte) sum::b , (byte) sum::c)
(byte/word~) sum::$0 reg byte a 4.0 (byte/word~) sum::$0 reg byte a 4.0
(label) sum::@return (label) sum::@return
(byte) sum::a (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
(byte) sum::b#0 reg byte y 4.333333333333333 (byte) sum::b#0 reg byte y 4.333333333333333
(byte) sum::c (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
(byte) sum::return#0 reg byte a 22.0 (byte) sum::return#0 reg byte a 22.0
(byte) sum::return#1 reg byte a 4.333333333333333 (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 (byte/word~) sum2::$0 reg byte a 4.0
(label) sum2::@return (label) sum2::@return
(byte) sum2::a (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
(byte) sum2::b#0 reg byte y 4.333333333333333 (byte) sum2::b#0 reg byte y 4.333333333333333
(byte) sum2::c (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
(byte) sum2::return#0 reg byte a 22.0 (byte) sum2::return#0 reg byte a 22.0
(byte) sum2::return#1 reg byte a 4.333333333333333 (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 ] reg byte y [ sum::b#0 ]
zp ZP_BYTE:2 [ sum::c#0 sum2::c#0 ] reg byte x [ sum::c#0 ]
reg byte x [ sum::a#0 ] reg byte a [ sum::a#0 ]
reg byte a [ sum::return#0 ] reg byte a [ sum::return#0 ]
reg byte a [ main::$2 ] reg byte a [ main::$2 ]
reg byte y [ sum2::b#0 ] 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 [ sum2::return#0 ]
reg byte a [ main::$5 ] reg byte a [ main::$5 ]
reg byte a [ sum2::$0 ] reg byte a [ sum2::$0 ]
@ -1037,7 +1035,7 @@ reg byte a [ sum::return#1 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 659 Score: 821
//SEG0 Basic Upstart //SEG0 Basic Upstart
.pc = $801 "Basic" .pc = $801 "Basic"
@ -1056,24 +1054,25 @@ Score: 659
//SEG8 @end //SEG8 @end
//SEG9 main //SEG9 main
main: { main: {
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //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 //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
ldx #0 lda #0
sta i
//SEG12 [5] phi from main::@4 to main::@1 [phi:main::@4->main::@1] //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 //SEG13 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4->main::@1#0] -- register_copy
//SEG14 main::@1 //SEG14 main::@1
b1: 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 //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
txa ldy i
tay
iny 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 //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
txa lda #2
clc clc
adc #2 adc i
sta sum.c 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 ] ) //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
// (byte) sum::a#0 = (byte) main::i#2 // register copy reg byte x lda i
//SEG18 [9] call sum param-assignment [ main::i#2 sum::return#1 ] ( main:2 [ main::i#2 sum::return#1 ] ) //SEG18 [9] call sum param-assignment [ main::i#2 sum::return#1 ] ( main:2 [ main::i#2 sum::return#1 ] )
jsr sum 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 ] ) //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 //SEG20 main::@3
//SEG21 [11] (byte~) main::$2 ← (byte) sum::return#0 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) //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 // (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 //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
sta SCREEN,x ldy i
//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 sta SCREEN,y
txa //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
tay
iny 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 //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
txa lda #2
clc clc
adc #2 adc i
sta sum2.c 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 ] ) //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
// (byte) sum2::a#0 = (byte) main::i#2 // register copy reg byte x lda i
//SEG26 [16] call sum2 param-assignment [ main::i#2 sum2::return#1 ] ( main:2 [ main::i#2 sum2::return#1 ] ) //SEG26 [16] call sum2 param-assignment [ main::i#2 sum2::return#1 ] ( main:2 [ main::i#2 sum2::return#1 ] )
jsr sum2 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 ] ) //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 //SEG28 main::@4
//SEG29 [18] (byte~) main::$5 ← (byte) sum2::return#0 [ main::i#2 main::$5 ] ( main:2 [ main::i#2 main::$5 ] ) //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 // (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 //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
sta SCREEN2,x ldy i
//SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx sta SCREEN2,y
inx //SEG31 [20] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
//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 inc i
cpx #$b //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 bne b1
//SEG33 main::@return //SEG33 main::@return
//SEG34 [22] return [ ] ( main:2 [ ] ) //SEG34 [22] return [ ] ( main:2 [ ] )
@ -1114,30 +1114,28 @@ main: {
} }
//SEG35 sum2 //SEG35 sum2
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=vbuaa_plus_vbuyy
//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 sty $ff
tya 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 stx $ff
clc clc
adc $ff 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 //SEG38 sum2::@return
//SEG39 [25] return [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] ) //SEG39 [25] return [ sum2::return#1 ] ( main:2::sum2:16 [ main::i#2 sum2::return#1 ] )
rts rts
} }
//SEG40 sum //SEG40 sum
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=vbuaa_plus_vbuyy
//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 sty $ff
tya 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 stx $ff
clc clc
adc $ff 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 //SEG43 sum::@return
//SEG44 [28] return [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] ) //SEG44 [28] return [ sum::return#1 ] ( main:2::sum:9 [ main::i#2 sum::return#1 ] )
rts rts

View File

@ -13,17 +13,17 @@
(label) main::@4 (label) main::@4
(label) main::@return (label) main::@return
(byte) main::i (byte) main::i
(byte) main::i#1 reg byte x 16.5 (byte) main::i#1 i zp ZP_BYTE:2 16.5
(byte) main::i#2 reg byte x 7.333333333333333 (byte) main::i#2 i zp ZP_BYTE:2 7.333333333333333
(byte()) sum((byte) sum::a , (byte) sum::b , (byte) sum::c) (byte()) sum((byte) sum::a , (byte) sum::b , (byte) sum::c)
(byte/word~) sum::$0 reg byte a 4.0 (byte/word~) sum::$0 reg byte a 4.0
(label) sum::@return (label) sum::@return
(byte) sum::a (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
(byte) sum::b#0 reg byte y 4.333333333333333 (byte) sum::b#0 reg byte y 4.333333333333333
(byte) sum::c (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
(byte) sum::return#0 reg byte a 22.0 (byte) sum::return#0 reg byte a 22.0
(byte) sum::return#1 reg byte a 4.333333333333333 (byte) sum::return#1 reg byte a 4.333333333333333
@ -31,23 +31,24 @@
(byte/word~) sum2::$0 reg byte a 4.0 (byte/word~) sum2::$0 reg byte a 4.0
(label) sum2::@return (label) sum2::@return
(byte) sum2::a (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
(byte) sum2::b#0 reg byte y 4.333333333333333 (byte) sum2::b#0 reg byte y 4.333333333333333
(byte) sum2::c (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
(byte) sum2::return#0 reg byte a 22.0 (byte) sum2::return#0 reg byte a 22.0
(byte) sum2::return#1 reg byte a 4.333333333333333 (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 ] reg byte y [ sum::b#0 ]
zp ZP_BYTE:2 [ sum::c#0 sum2::c#0 ] reg byte x [ sum::c#0 ]
reg byte x [ sum::a#0 ] reg byte a [ sum::a#0 ]
reg byte a [ sum::return#0 ] reg byte a [ sum::return#0 ]
reg byte a [ main::$2 ] reg byte a [ main::$2 ]
reg byte y [ sum2::b#0 ] 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 [ sum2::return#0 ]
reg byte a [ main::$5 ] reg byte a [ main::$5 ]
reg byte a [ sum2::$0 ] reg byte a [ sum2::$0 ]