added peephole conditional labelJTInRange. For now you need to set the environment...
authorfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 28 Nov 2004 14:16:20 +0000 (14:16 +0000)
committerfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 28 Nov 2004 14:16:20 +0000 (14:16 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3589 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCCpeeph.c
src/mcs51/peeph.def

index e2e5f454bfc3dd82f4edac9aea065ef8d3388b8d..c5534bc2ed69466b94901c1971551695d90bb7bd 100644 (file)
@@ -178,6 +178,51 @@ FBYNAME (labelInRange)
   return TRUE;
 }
 
+
+/*-----------------------------------------------------------------*/
+/* labelJTInRange - will check to see if label %5 and up are       */
+/* within range.                                                   */
+/* Specifically meant to optimize long (3-byte) jumps to short     */
+/* (2-byte) jumps in jumptables                                    */
+/*-----------------------------------------------------------------*/
+FBYNAME (labelJTInRange)
+{
+  char *lbl;
+  int dist, count, i;
+
+  if (!getenv("SDCC_SJMP_JUMPTABLE"))
+    return FALSE;
+  
+  /* Only optimize within a jump table */
+  if (currPl->ic && currPl->ic->op != JUMPTABLE)
+    return FALSE;
+  
+  count = elementsInSet( IC_JTLABELS (currPl->ic) );
+  
+  /* check all labels (this is needed if the case statements are unsorted) */
+  for (i=0; i<count; i++)
+    {
+      /* assumes that the %5 pattern variable has the first ljmp label */
+      lbl = hTabItemWithKey (vars, 5+i);
+      if (!lbl)
+        return FALSE;
+    
+      dist = pcDistance (currPl, lbl, FALSE);
+
+      /* three terms used to calculate allowable distance */
+// printf("\nlabel %s %i dist %i cdist 0x%02x 0x%02x\n", lbl, i, dist, dist -(count-i-1)-(7+3*i), 127+(count-i-1)+(7+3*i) - dist);
+      if (!dist ||
+          dist > 127+           /* range of sjmp */
+                 (7+3*i)+       /* offset between this jump and currPl, 
+                                   should use pcDistance instead? */
+                 (count-i-1)    /* if peephole applies distance is shortened */
+         )
+        return FALSE;
+    }
+  return TRUE;
+}
+
+
 /*-----------------------------------------------------------------*/
 /* labelIsReturnOnly - Check if label %5 is followed by RET        */
 /*-----------------------------------------------------------------*/
@@ -735,6 +780,10 @@ callFuncByName (char *fname,
       "labelInRange", labelInRange
     }
     ,
+    {
+      "labelJTInRange", labelJTInRange
+    }
+    ,
     {
       "operandsNotSame", operandsNotSame
     }
index fb786d95a93b6a39025a45d08f85af0db5c973dd..1e44366c20c7f75dd96424cf29843fe492465ee6 100644 (file)
@@ -3675,3 +3675,476 @@ replace {
 //     ;       Peephole 259.b  removed redundant label %2 and ret
 //     ;
 //} if labelRefCount %2 0
+
+// optimizing jumptables
+// Please note: to enable peephole 260.x you currently have to set 
+// the environment variable SDCC_SJMP_JUMPTABLE
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+%3:
+} by {
+       ;       Peephole 260.a  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+%3:
+} by {
+       ;       Peephole 260.b  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+%3:
+} by {
+       ;       Peephole 260.c  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+%3:
+} by {
+       ;       Peephole 260.d  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+%3:
+} by {
+       ;       Peephole 260.e  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+%3:
+} by {
+       ;       Peephole 260.f  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+%3:
+} by {
+       ;       Peephole 260.g  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+       ljmp    %15
+%3:
+} by {
+       ;       Peephole 260.h  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+       sjmp    %15
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+       ljmp    %15
+       ljmp    %16
+%3:
+} by {
+       ;       Peephole 260.i  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+       sjmp    %15
+       sjmp    %16
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+       ljmp    %15
+       ljmp    %16
+       ljmp    %17
+%3:
+} by {
+       ;       Peephole 260.j  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+       sjmp    %15
+       sjmp    %16
+       sjmp    %17
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+       ljmp    %15
+       ljmp    %16
+       ljmp    %17
+       ljmp    %18
+%3:
+} by {
+       ;       Peephole 260.k  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+       sjmp    %15
+       sjmp    %16
+       sjmp    %17
+       sjmp    %18
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+       ljmp    %15
+       ljmp    %16
+       ljmp    %17
+       ljmp    %18
+       ljmp    %19
+%3:
+} by {
+       ;       Peephole 260.l  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+       sjmp    %15
+       sjmp    %16
+       sjmp    %17
+       sjmp    %18
+       sjmp    %19
+%3:
+} if labelJTInRange
+
+// optimizing jumptables
+replace {
+       add     a,%1
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       ljmp    %5
+       ljmp    %6
+       ljmp    %7
+       ljmp    %8
+       ljmp    %9
+       ljmp    %10
+       ljmp    %11
+       ljmp    %12
+
+       ljmp    %13
+       ljmp    %14
+       ljmp    %15
+       ljmp    %16
+       ljmp    %17
+       ljmp    %18
+       ljmp    %19
+       ljmp    %20
+%3:
+} by {
+       ;       Peephole 260.m  used sjmp in jumptable
+       mov     dptr,#%2
+       jmp     @a+dptr
+%2:
+       sjmp    %5
+       sjmp    %6
+       sjmp    %7
+       sjmp    %8
+       sjmp    %9
+       sjmp    %10
+       sjmp    %11
+       sjmp    %12
+
+       sjmp    %13
+       sjmp    %14
+       sjmp    %15
+       sjmp    %16
+       sjmp    %17
+       sjmp    %18
+       sjmp    %19
+       sjmp    %20
+%3:
+} if labelJTInRange