copt: improvements and new rules work
authorAlan Cox <alan@linux.intel.com>
Thu, 30 Jun 2016 17:00:07 +0000 (18:00 +0100)
committerAlan Cox <alan@linux.intel.com>
Thu, 30 Jun 2016 17:00:07 +0000 (18:00 +0100)
Applications/SmallC/copt.c
Applications/SmallC/rules.6809

index b899c64..b3c4546 100644 (file)
@@ -583,6 +583,19 @@ static char *subst(char *pat)
                }
                i += sprintf(&buf[i], "%s$%lx", num < 0 ? "-" : "", labs(num));
                pat++;
+       } else if (pat[0] == '%' && pat[1] == '{') {
+               /* Substitute with expression decimal */
+               cp = pat + 2;
+               if ((pat = strchr(cp, '}')) == NULL || pat - cp <= 0)
+                       num = 0;
+               else
+                       num = eval(cp, pat - cp);
+               if (i >= MAXLINE - 20) {
+                       fprintf(stderr, "%s: line too long\n", progname);
+                       exit(1);
+               }
+               i += sprintf(&buf[i], "%d", num);
+               pat++;
        } else if (pat[0] == '%' && pat[1] == '=') {
                /* Substitute with converted variable */
                /* First seperate all parts of the pattern string */
index c9cc849..2f543e9 100644 (file)
@@ -1,8 +1,14 @@
+#
+#      Eliminate pointless branches
+#
 lbra %1
 %1:
 =
 %1:
 
+#
+#      Reverse branches to optimize
+#
 lbeq %1
 lbra %2
 %1:
@@ -10,54 +16,145 @@ lbra %2
 lbne %2
 %1:
 
-tfr u,d
-pshs d
-tfr d,u
-ldd %1
+lbne %1
+lbra %2
+%1:
 =
-pshs u
-ldd %1
+lbeq %2
+%1:
 
-tfr u,d
+#
+#      Fix up the stack based add and subtraction
+#      generated by scc
+#
+ldd %1
 pshs d
-ldd #%1
-puls x
-std ,x
+ldd %2
+addd ,s++
 =
-tfr u,x
-ldd #%1
-std ,x
-
-leau %1,s
-pshs u
-ldd ,u
+ldd %1
 addd %2
-puls x
-std ,x
-subd %2
+
+ldd %1
+pshs d
+ldd %2
+subd ,s++
+coma
+comb
+addd #1
 =
-leax %1,s
-ldd ,x
-addd %2
-std ,x
+ldd %1
 subd %2
 
-tfr u,d
+#
+#      Post increment load into d or b via u. Relies on the fact that
+#      the base compiler won't generate an std ,u in this pattern
+#
+ldd %1
+addd #2
+std %1
+subd #2
 tfr d,u
 ldd ,u
 =
-ldd ,u
+ldu %1
+ldd ,u++
+stu %1
 
-tfr u,d
+ldd %1
+addd #1
+std %1
+subd #1
 tfr d,u
+ldb ,u
 =
-tfr u,d
+ldu %1
+ldb ,u++
+stu %1
 
-leau %d,s
-tfr u,x
-ldd %1
-std ,x
+#
+#      FIXME: make sure the assembler can cope with a+b+c,s
+#
+ldd %1,s
+addd #1
+std %1,s
+subd #1
+pshs d
 =
-leax %d,s
-ldd %1
-std ,x
+ldd %1,s
+pshs d
+addd #1
+std %{%1+2},s
+
+#
+#      Commonly occuring string case
+#      Could do for all values in -128 to +127 but not nice way
+#      I can see to specify that in copt until I hack copt 8)
+#      Should do ne cases FIXME
+#
+
+ldb %1
+sex
+cmpd #0
+lbeq %2
+ldd %3
+=
+ldb %1
+cmpb #0
+lbeq %2
+ldd %3
+
+
+#
+#      Commonly occuring string case
+#      Could do for all values in 0 to 255 but not nice way
+#      I can see to specify that in copt until I hack copt 8)
+#
+
+ldb %1
+clr a
+cmpd #0
+lbeq %2
+ldd %3
+=
+ldb %1
+cmpb #0
+lbeq %2
+ldd %3
+
+#
+#      Ditto but after the ,u++ optimization
+#
+
+ldb %1
+stu %2
+sex
+cmpd #0
+lbeq %3
+ldd %4
+=
+ldb %1
+stu %2
+cmpb #0
+lbeq %3
+ldd %4
+
+
+#
+#      Commonly occuring string case
+#      Could do for all values in 0 to 255 but not nice way
+#      I can see to specify that in copt until I hack copt 8)
+#
+
+ldb %1
+stu %2
+clr a
+cmpd #0
+lbeq %3
+ldd %4
+=
+ldb %1
+stu %2
+cmpb #0
+lbeq %3
+ldd %4