]> git.sur5r.net Git - cc65/commitdiff
Added special multiplication routines
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 4 Oct 2001 21:34:14 +0000 (21:34 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 4 Oct 2001 21:34:14 +0000 (21:34 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1012 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/runtime/Makefile
libsrc/runtime/mulax10.s [new file with mode: 0644]
libsrc/runtime/mulax3.s [new file with mode: 0644]
libsrc/runtime/mulax5.s [new file with mode: 0644]
src/cc65/codegen.c
src/cc65/codeopt.c

index cbb14f6992a45126dc40e693e6ef4a103e5ff4d0..7b2f4732d5b9d72642f49a5e2f50c2c68b8549df 100644 (file)
@@ -130,6 +130,9 @@ OBJS =      add.o           \
                makebool.o      \
                mod.o           \
                mul.o           \
+       mulax3.o        \
+       mulax5.o        \
+       mulax10.o       \
                ne.o            \
                neg.o           \
                or.o            \
diff --git a/libsrc/runtime/mulax10.s b/libsrc/runtime/mulax10.s
new file mode 100644 (file)
index 0000000..18a17a4
--- /dev/null
@@ -0,0 +1,32 @@
+;
+; Ullrich von Bassewitz, 04.10.2001
+;
+; CC65 runtime: Multiply the primary register
+;
+
+       .export         mulax10
+       .importzp       ptr1
+
+.proc  mulax10
+
+       sta     ptr1
+       stx     ptr1+1
+       asl     a
+       rol     ptr1+1
+       asl     a
+       rol     ptr1+1
+       clc
+       adc     ptr1
+       pha
+       txa
+       adc     ptr1+1
+       sta     ptr1+1
+       pla
+       asl     a
+       rol     ptr1+1
+       ldx     ptr1+1
+       rts
+
+.endproc
+
+
diff --git a/libsrc/runtime/mulax3.s b/libsrc/runtime/mulax3.s
new file mode 100644 (file)
index 0000000..07625f8
--- /dev/null
@@ -0,0 +1,27 @@
+;
+; Ullrich von Bassewitz, 04.10.2001
+;
+; CC65 runtime: Multiply the primary register
+;
+
+       .export         mulax3
+       .importzp       ptr1
+               
+.proc  mulax3
+
+       sta     ptr1
+       stx     ptr1+1
+       asl     a
+       rol     ptr1+1
+       clc
+       adc     ptr1
+       pha
+       txa
+       adc     ptr1+1
+       tax
+       pla
+       rts
+
+.endproc
+
+
diff --git a/libsrc/runtime/mulax5.s b/libsrc/runtime/mulax5.s
new file mode 100644 (file)
index 0000000..dbfa9fc
--- /dev/null
@@ -0,0 +1,29 @@
+;
+; Ullrich von Bassewitz, 04.10.2001
+;
+; CC65 runtime: Multiply the primary register
+;
+
+       .export         mulax5
+       .importzp       ptr1
+
+.proc  mulax5
+
+       sta     ptr1
+       stx     ptr1+1
+       asl     a
+       rol     ptr1+1
+       asl     a
+       rol     ptr1+1
+       clc
+       adc     ptr1
+       pha
+       txa
+       adc     ptr1+1
+       tax
+       pla
+       rts
+
+.endproc
+
+
index 2e1ebc63b9ef480bce8169504d9a4bcfbf918e67..b79b533048b7d238d159c486efc2422b158b29cf 100644 (file)
@@ -2526,7 +2526,7 @@ void g_mul (unsigned flags, unsigned long val)
     if (flags & CF_CONST && (p2 = powerof2 (val)) >= 0) {
        /* Generate a shift instead */
        g_asl (flags, p2);
-       return;
+       return;
     }
 
     /* If the right hand side is const, the lhs is not on stack but still
@@ -2538,50 +2538,61 @@ void g_mul (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   /* Handle some special cases */
-                   switch (val) {
-
-                       case 3:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
-                           AddCodeLine ("adc tmp1");
-                           return;
-
-                       case 5:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
+                   /* Handle some special cases */
+                   switch (val) {
+
+                       case 3:
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("clc");
                            AddCodeLine ("adc tmp1");
-                           return;
-
-                       case 10:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
-                           AddCodeLine ("adc tmp1");
-                           AddCodeLine ("asl a");
-                           return;
-                   }
+                           return;
+
+                       case 5:
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("clc");
+                           AddCodeLine ("adc tmp1");
+                           return;
+
+                       case 10:
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("clc");
+                           AddCodeLine ("adc tmp1");
+                           AddCodeLine ("asl a");
+                           return;
+                   }
                }
                /* FALLTHROUGH */
 
-           case CF_INT:
-               break;
+           case CF_INT:
+               switch (val) {
+                   case 3:
+                       AddCodeLine ("jsr mulax3");
+                       return;
+                   case 5:
+                       AddCodeLine ("jsr mulax5");
+                       return;
+                   case 10:
+                       AddCodeLine ("jsr mulax10");
+                       return;
+               }
+               break;
 
-           case CF_LONG:
-               break;
+           case CF_LONG:
+               break;
 
-           default:
-               typeerror (flags);
-       }
+           default:
+               typeerror (flags);
+       }
 
-       /* If we go here, we didn't emit code. Push the lhs on stack and fall
-        * into the normal, non-optimized stuff.
-        */
-       flags &= ~CF_FORCECHAR; /* Handle chars as ints */
+       /* If we go here, we didn't emit code. Push the lhs on stack and fall
+        * into the normal, non-optimized stuff.
+        */
+       flags &= ~CF_FORCECHAR; /* Handle chars as ints */
        g_push (flags & ~CF_CONST, 0);
 
     }
index 9ba4be02fffad13c4eac9e37787cde74f4cdd643..288a069b7799b5cc75b3a1e0172bf9a09cce8ccb 100644 (file)
@@ -115,6 +115,53 @@ static unsigned OptShift1 (CodeSeg* S)
 
 
 
+static unsigned OptShift2 (CodeSeg* S)
+/* A call to the shraxN routine may get replaced by one or more lsr insns
+ * if the value of X is not used later.
+ */
+{
+    unsigned Changes = 0;
+
+    /* Walk over the entries */
+    unsigned I = 0;
+    while (I < CS_GetEntryCount (S)) {
+
+       /* Get next entry */
+               CodeEntry* E = CS_GetEntry (S, I);
+
+       /* Check for the sequence */
+       if (E->OPC == OP65_JSR                       &&
+                   strncmp (E->Arg, "shrax", 5) == 0        &&
+           strlen (E->Arg) == 6                     &&
+           IsDigit (E->Arg[5])                      &&
+           !RegXUsed (S, I+1)) {
+
+           /* Insert shift insns */
+           unsigned Count = E->Arg[5] - '0';
+           while (Count--) {
+               CodeEntry* X = NewCodeEntry (OP65_LSR, AM65_ACC, "a", 0, E->LI);
+               CS_InsertEntry (S, X, I+1);
+           }
+
+           /* Delete the call to shlax */
+           CS_DelEntry (S, I);
+
+           /* Remember, we had changes */
+           ++Changes;
+
+       }
+
+       /* Next entry */
+       ++I;
+
+    }
+
+    /* Return the number of changes made */
+    return Changes;
+}
+
+
+
 /*****************************************************************************/
 /*                    Optimize stores through pointers                      */
 /*****************************************************************************/
@@ -1299,6 +1346,7 @@ static OptFunc DOptPtrLoad6       = { OptPtrLoad6,     "OptPtrLoad6",     0, 0, 0, 0
 static OptFunc DOptPtrStore1           = { OptPtrStore1,    "OptPtrStore1",    0, 0, 0, 0, 0 };
 static OptFunc DOptPtrStore2           = { OptPtrStore2,    "OptPtrStore2",    0, 0, 0, 0, 0 };
 static OptFunc DOptShift1              = { OptShift1,       "OptShift1",       0, 0, 0, 0, 0 };
+static OptFunc DOptShift2              = { OptShift2,       "OptShift2",       0, 0, 0, 0, 0 };
 static OptFunc DOptSize1        = { OptSize1,        "OptSize1",        0, 0, 0, 0, 0 };
 static OptFunc DOptSize2        = { OptSize2,        "OptSize2",        0, 0, 0, 0, 0 };
 static OptFunc DOptStackOps            = { OptStackOps,     "OptStackOps",     0, 0, 0, 0, 0 };
@@ -1349,6 +1397,7 @@ static OptFunc* OptFuncs[] = {
     &DOptRTS,
     &DOptRTSJumps,
     &DOptShift1,
+    &DOptShift2,
     &DOptSize1,
     &DOptSize2,
     &DOptStackOps,
@@ -1596,6 +1645,7 @@ static void RunOptGroup1 (CodeSeg* S)
     RunOptFunc (S, &DOptAdd1, 1);
     RunOptFunc (S, &DOptAdd2, 1);
     RunOptFunc (S, &DOptShift1, 1);
+    RunOptFunc (S, &DOptShift2, 1);
 }