* Fixed va_args for the z80
authormichaelh <michaelh@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 16 Jul 2001 15:14:10 +0000 (15:14 +0000)
committermichaelh <michaelh@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 16 Jul 2001 15:14:10 +0000 (15:14 +0000)
* Fixed a long standing parameter bug in the mul/div/mod support function call
generating code.
* Fixed device library generation for z80 and gbz80
* Fixed printf for the z80
* Added a --no-reg-params flag which currently does nothing
* Added support to mangle support function names based on the calling
convention (reentrant, calle/caller, reg params)
* Mangled the mul/div/mod/putchar support routines to reflect mangaling
* Changed the z80 port to callee saves
* Changed the z80 port to not use reg params
* Updated support/tests/dhrystone to work again on the z80

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1074 4a8a32a2-be11-0410-ad9d-d568d2c75423

27 files changed:
device/include/stdarg.h
device/lib/gbz80/Makefile
device/lib/gbz80/printf.c
device/lib/z80/Makefile
device/lib/z80/div.s
device/lib/z80/mul.s
device/lib/z80/printf.c
device/lib/z80/putchar.s
src/SDCCglobl.h
src/SDCCmain.c
src/SDCCopt.c
src/SDCCsymt.c
src/avr/main.c
src/avr/peeph.rul
src/ds390/main.c
src/izt/i186.c
src/izt/tlcs900h.c
src/mcs51/main.c
src/pic/main.c
src/port.h
src/z80/gen.c
src/z80/main.c
src/z80/mappings.i
src/z80/ralloc.c
src/z80/ralloc.h
support/tests/dhrystone/Makefile
support/tests/dhrystone/dhry.c

index c65176943fe605a6da60227f96f040dc94ae8435..f4ba9da49a57f92a5a53ce13ae1c259396bb7e2a 100644 (file)
@@ -5,7 +5,13 @@
 #ifndef __SDC51_STDARG_H
 #define __SDC51_STDARG_H 1
 
-#if defined(__ds390) || defined(__z80) || defined(__gbz80)
+#if defined(__z80) || defined(__gbz80)
+
+typedef unsigned char * va_list;
+#define va_start(list, last)   list = (unsigned char *)&last + sizeof(last)
+#define va_arg(list, type)     *((type *)((list += sizeof(type)) - sizeof(type)))
+
+#elif defined(__ds390)
 
 typedef        unsigned char * va_list ;
 #define va_arg(marker,type) *((type *)(marker -= sizeof(type)))
index 33cabdc86d869cb60a464faf69080bb0be0be7de..41dc95e72ddca55877c208393cc37795350ae863 100644 (file)
@@ -18,7 +18,7 @@ $(LIB): $(OBJ) Makefile _dummy
        for i in $(OBJ); do echo $$i >> $(LIB); done
 
 .c.o:
-       $(CC) $(CFLAGS) -c $@
+       $(CC) $(CFLAGS) -c $<
 
 _dummy:
 
index 33d7050ea4a996c7d7144e526e57cf5b4bb4f62d..346eb3f1ad3ed600a49b36356c30785684b63bbd 100644 (file)
@@ -2,27 +2,13 @@
     Again a stub - will use the std one later...
 */
 
+#include <stdarg.h>
 #include <stdio.h>
 
-#define NULL 0
+/* PENDING */
+#define NULL   0
 
-/* A hack because I dont understand how va_arg works...
-   sdcc pushes right to left with the real sizes, not cast up
-   to an int.
-   so printf(int, char, long)
-   results in push long, push char, push int
-   On the z80 the stack grows down, so the things seem to be in
-   the correct order.
- */
-
-typedef char * va_list;
-#define va_start(list, last)   list = (char *)&last + sizeof(last)
-#define va_arg(list, type)     *(type *)list; list += sizeof(type);
-
-typedef void EMIT(char c, void *pData);
-
-
-static void _printn(unsigned u, unsigned base, char issigned, EMIT *emitter, void *pData)
+static void _printn(unsigned u, unsigned base, char issigned, void (*emitter)(), void *pData)
 {
     const char *_hex = "0123456789ABCDEF";
     if (issigned && ((int)u < 0)) {
@@ -34,7 +20,7 @@ static void _printn(unsigned u, unsigned base, char issigned, EMIT *emitter, voi
     (*emitter)(_hex[u%base], pData);
 }
 
-static void _printf(const char *format, EMIT *emitter, void *pData, va_list va)
+static void _printf(const char *format, void (*emitter)(), void *pData, va_list va)
 {
     while (*format) {
        if (*format == '%') {
@@ -57,7 +43,7 @@ static void _printf(const char *format, EMIT *emitter, void *pData, va_list va)
                    break;
                }
            case 'x':
-               {
+               {
                    unsigned u = va_arg(va, unsigned);
                    _printn(u, 16, 0, emitter, pData);
                    break;
@@ -79,15 +65,24 @@ static void _printf(const char *format, EMIT *emitter, void *pData, va_list va)
     }
 }
 
+void putchar(char c);
+
 static void _char_emitter(char c, void *pData)
 {
+    /* PENDING: Make the compiler happy. */
+    pData = 0;
+
     putchar(c);
 }
 
-void printf(const char *format, ...)
+int printf(const char *format, ...)
 {
     va_list va;
     va_start(va, format);
 
     _printf(format, _char_emitter, NULL, va);
+    _printf(format, _char_emitter, NULL, va);
+
+    /* PENDING: What to return? */
+    return 0;
 }
index fc041ce4400024e1b6d7dd60c0560343058d14f1..065e39f85f86d9dffdfcbd25721fddd0829640a4 100644 (file)
@@ -5,7 +5,7 @@ TOPDIR = ../../..
 SCC = $(TOPDIR)/bin/sdcc -mz80
 SAS = $(TOPDIR)/bin/as-z80
 
-OBJ = div.o mul.o putchar.o string.o printf.o # asm_strings.o
+OBJ = div.o mul.o putchar.o printf.o # asm_strings.o string.s
 LIB = z80.lib
 CC = $(SCC)
 AS = $(SAS)
@@ -18,7 +18,7 @@ $(LIB): $(OBJ) Makefile _dummy
        for i in $(OBJ); do echo $$i >> $(LIB); done
 
 .c.o:
-       $(CC) $(CFLAGS) -c $@
+       $(CC) $(CFLAGS) -c $<
 
 _dummy:
 
index 126b6f25466fecec8a3a62404819464747f05462..92d2ee2f81df742ff962ee4453d2b43ec5622a5b 100644 (file)
@@ -1,8 +1,16 @@
        ;; Originally from GBDK by Pascal Felber.
        .area   _CODE
 
-__divschar::
-        push    bc
+__divschar_rr_s::       
+        ld      hl,#2+1
+        add     hl,sp
+        
+        ld      e,(hl)
+        dec     hl
+        ld      l,(hl)
+        
+        ;; Fall through
+__divschar_rr_hds::
         ld      c,l
         
         call    .div8
@@ -10,11 +18,18 @@ __divschar::
        ld      l,c
         ld      h,b
                
-       pop     bc
        ret
        
-__modschar::
-        push    bc
+__modschar_rr_s::       
+        ld      hl,#2+1
+        add     hl,sp
+        
+        ld      e,(hl)
+        dec     hl
+        ld      l,(hl)
+        
+        ;; Fall through
+__modschar_rr_hds::
         ld      c,l
 
                call    .div8
@@ -22,11 +37,23 @@ __modschar::
        ld      l,e
         ld      h,d
                
-       pop     bc
        ret
 
-__divsint::
-       push    bc
+__divsint_rr_s::        
+        ld      hl,#2+3
+        add     hl,sp
+        
+        ld      d,(hl)
+        dec     hl
+        ld      e,(hl)
+        dec     hl
+        ld      a,(hl)
+        dec     hl
+        ld      l,(hl)
+        ld      h,a
+        
+        ;; Fall through
+__divsint_rr_hds::
        ld      b,h
        ld      c,l
 
@@ -35,11 +62,23 @@ __divsint::
        ld      l,c
        ld      h,b
        
-       pop     bc
        ret
        
-__modsint::
-       push    bc
+__modsint_rr_s::
+        ld      hl,#2+3
+        add     hl,sp
+        
+        ld      d,(hl)
+        dec     hl
+        ld      e,(hl)
+        dec     hl
+        ld      a,(hl)
+        dec     hl
+        ld      l,(hl)
+        ld      h,a
+
+        ;; Fall through
+__modsint_rr_hds::
        ld      b,h
        ld      c,l
 
@@ -48,13 +87,19 @@ __modsint::
        ld      l,e
        ld      h,d
        
-       pop     bc
        ret
 
        ;; Unsigned
-__divuchar::   
-       push    de
-       push    bc
+__divuchar_rr_s::       
+        ld      hl,#2+1
+        add     hl,sp
+        
+        ld      e,(hl)
+        dec     hl
+        ld      l,(hl)
+        
+        ;; Fall through
+__divuchar_rr_hds::    
        push    ix
        ld      ix,#0
        add     ix,sp
@@ -67,13 +112,18 @@ __divuchar::
         ld      h,b
                
        pop     ix
-       pop     bc
-       pop     de
        ret
        
-__moduchar::
-       push    de
-       push    bc
+__moduchar_rr_s::       
+        ld      hl,#2+1
+        add     hl,sp
+        
+        ld      e,(hl)
+        dec     hl
+        ld      l,(hl)
+        
+        ;; Fall through
+__moduchar_rr_hds::
        push    ix
        ld      ix,#0
        add     ix,sp
@@ -86,12 +136,23 @@ __moduchar::
         ld      h,d
                
        pop     ix
-       pop     bc
-       pop     de
        ret
 
-__divuint::
-       push    bc
+__divuint_rr_s::                
+        ld      hl,#2+3
+        add     hl,sp
+        
+        ld      d,(hl)
+        dec     hl
+        ld      e,(hl)
+        dec     hl
+        ld      a,(hl)
+        dec     hl
+        ld      l,(hl)
+        ld      h,a
+
+        ;; Fall through
+__divuint_rr_hds::
        ld      b,h
        ld      c,l
        call    .divu16
@@ -99,11 +160,23 @@ __divuint::
        ld      l,c
        ld      h,b
        
-       pop     bc
        ret
        
-__moduint::
-       push    bc
+__moduint_rr_s::                
+        ld      hl,#2+3
+        add     hl,sp
+        
+        ld      d,(hl)
+        dec     hl
+        ld      e,(hl)
+        dec     hl
+        ld      a,(hl)
+        dec     hl
+        ld      l,(hl)
+        ld      h,a
+        ;; Fall through
+        
+__moduint_rr_hds::
        ld      b,h
        ld      c,l
 
@@ -112,7 +185,6 @@ __moduint::
        ld      l,e
        ld      h,d
        
-       pop     bc
        ret
        
 .div8::
index 9c33ac30aa4054d95e9c6db7958b1a43198630fb..92e0ceba34f13775946193b327f8f1ef5d7a4a5d 100644 (file)
@@ -1,10 +1,18 @@
        ;; Originally from GBDK by Pascal Felber.
        
        .area   _CODE
-       
-__mulschar::
+
+__mulschar_rr_s::
+        ld      hl,#2
+        add     hl,sp
+
+        ld      e,(hl)
+        inc     hl
+        ld      l,(hl)                
+
+        ;; Fall through
+__mulschar_rr_hds::
         ;; Need to sign extend before going in.
-        push    bc
         ld      c,l
         
         ld      a,l
@@ -19,13 +27,29 @@ __mulschar::
 
         jp      .mul16
 
-__muluchar::
-__mulsint::
-__muluint::
+__muluchar_rr_s::
+__mulsint_rr_s::
+__muluint_rr_s::
+        ld      hl,#2
+        add     hl,sp
+        
+        ld      e,(hl)
+        inc     hl
+        ld      d,(hl)
+        inc     hl
+        ld      a,(hl)
+        inc     hl
+        ld      h,(hl)
+        ld      l,a
+
+        ;; Fall through
+        
+__muluchar_rr_hds::
+__mulsint_rr_hds::
+__muluint_rr_hds::
        ;; Parameters:
        ;;      HL, DE (left, right irrelivent)
        ;; Must preserve BC
-       push    bc
        ld      b,h
        ld      c,l
        
@@ -61,6 +85,5 @@ __muluint::
        ADD     HL,BC           ; Add multiplicand to product
 .mend:
                                ; HL = result
-       pop     bc
        ret
 
index 1ee76cbc6230787accddc817d3f618ede7278f6f..d584bdb8c201db7d8eb643f75ab261d1120b237c 100644 (file)
@@ -2,25 +2,15 @@
     Again a stub - will use the std one later...
 */
 
-#define NULL 0
+#include <stdarg.h>
+#include <stdio.h>
 
-/* A hack because I dont understand how va_arg works...
-   sdcc pushes right to left with the real sizes, not cast up
-   to an int.
-   so printf(int, char, long)
-   results in push long, push char, push int
-   On the z80 the stack grows down, so the things seem to be in
-   the correct order.
- */
+#define STATIC
 
-typedef char * va_list;
-#define va_start(list, last)   list = (char *)&last + sizeof(last)
-#define va_arg(list, type)     *(type *)list; list += sizeof(type);
+/* PENDING */
+#define NULL   0
 
-typedef void EMIT(char c, void *pData);
-
-
-static void _printn(unsigned u, unsigned base, char issigned, EMIT *emitter, void *pData)
+STATIC void _printn(unsigned u, unsigned base, char issigned, void (*emitter)(char, void *), void *pData)
 {
     const char *_hex = "0123456789ABCDEF";
     if (issigned && ((int)u < 0)) {
@@ -32,13 +22,13 @@ static void _printn(unsigned u, unsigned base, char issigned, EMIT *emitter, voi
     (*emitter)(_hex[u%base], pData);
 }
 
-static void _printf(const char *format, EMIT *emitter, void *pData, va_list va)
+STATIC void _printf(const char *format, void (*emitter)(char, void *), void *pData, va_list va)
 {
     while (*format) {
        if (*format == '%') {
            switch (*++format) {
            case 'c': {
-               char c = va_arg(va, char);
+               char c = (char)va_arg(va, int);
                (*emitter)(c, pData);
                break;
            }
@@ -79,16 +69,21 @@ static void _printf(const char *format, EMIT *emitter, void *pData, va_list va)
 
 void putchar(char c);
 
-static void _char_emitter(char c, void *pData)
+STATIC void _char_emitter(char c, void *pData)
 {
+    /* PENDING: Make the compiler happy. */
+    pData = 0;
+
     putchar(c);
 }
 
-void printf(const char *format, ...)
+int printf(const char *format, ...)
 {
     va_list va;
     va_start(va, format);
 
     _printf(format, _char_emitter, NULL, va);
-    _printf(format, _char_emitter, NULL, va);
+
+    /* PENDING: What to return? */
+    return 0;
 }
index df1954b77ab81991a19b78dc866c37870e32a6ed..91e166d998b2df40ce319b4d9481a9342b1ca831 100644 (file)
@@ -1,5 +1,17 @@
        .area _CODE
-_putchar::
+_putchar::       
+_putchar_rr_s:: 
+        ld      hl,#2
+        add     hl,sp
+        
+        ld      l,(hl)
+        ld      a,#1
+        rst     0x08
+        
+        ret
+           
+_putchar_rr_dbs::
+        ld      l,e
        ld      a,#1
         rst     0x08
 
index b83b5282fa4d90f7dfa15d47672889ffd8e17b01..a12cea74c59b87dc35c1184d317a01be73b8a3c2 100644 (file)
@@ -214,6 +214,7 @@ struct options
     char *out_name;            /* Asm output name for c1 mode */
     int nostdlib;              /* Don't use standard lib files */
     int nostdinc;              /* Don't use standard include files */
+    int noRegParams;            /* Disable passing some parameters in registers */
     int verbose;               /* Show what the compiler is doing */
     int shortis8bits;           /* treat short like int or char */
 
@@ -259,8 +260,9 @@ extern int nrelFiles;
 extern char *relFiles[128];
 extern char *libFiles[128];
 extern int nlibFiles;
-extern int nlibPaths;
 extern char *libPaths[128];
+extern int nlibPaths;
+
 extern bool verboseExec ;
 
 void parseWithComma (char **, char *);
index e7f76a53091c2f6300a2592de89241a20dd6b48c..aff6322f673eb4cd3c62a1d3d5a1ae2fccd8f350 100644 (file)
@@ -134,6 +134,7 @@ optionsTable[] = {
     { 'S',  NULL,                   &noAssemble, "Assemble only" },
     { 'W',  NULL,                   NULL, "Pass through options to the assembler (a) or linker (l)" },
     { 'L',  NULL,                   NULL, "Add the next field to the library search path" },
+    { 'l',  NULL,                   NULL, "Include the given library in the link" },
     { 0,    OPTION_LARGE_MODEL,     NULL, "Far functions, far data" },
     { 0,    OPTION_MEDIUM_MODEL,    NULL, "Far functions, near data" },
     { 0,    OPTION_SMALL_MODEL,     NULL, "Small model (default)" },
@@ -174,6 +175,7 @@ optionsTable[] = {
     { 0,    "--nooverlay",          &options.noOverlay, NULL },
     { 0,    "--main-return",        &options.mainreturn, "Issue a return after main()" },
     { 0,    "--no-peep",            &options.nopeep, "Disable the peephole assembly file optimisation" },
+    { 0,    "--no-reg-params",      &options.noRegParams, "On some ports, disable passing some parameters in registers" },
     { 0,    "--peep-asm",           &options.asmpeep, NULL },
     { 0,    "--debug",              &options.debug, "Enable debugging symbol output" },
     { 'v',  OPTION_VERSION,         NULL, "Display sdcc's version" },
@@ -288,8 +290,7 @@ _validatePorts (void)
     {
       if (_ports[i]->magic != PORT_MAGIC)
        {
-         printf ("Error: port %s is incomplete.\n", _ports[i]->target);
-         wassert (0);
+         wassertl (0, "Port definition structure is incomplete");
        }
     }
 }
@@ -888,6 +889,10 @@ parseCmdLine (int argc, char **argv)
                 libPaths[nlibPaths++] = getStringArg("-L", argv, &i);
                 break;
 
+            case 'l':
+                libFiles[nlibFiles++] = getStringArg("-l", argv, &i);
+                break;
+
            case 'W':
              /* linker options */
              if (argv[i][2] == 'l')
index c6160ccf28c5bd10d48b2a5f93556b96041f1f23..8ed9c5979396b7cc4f29439cc08f03f1e93bf32d 100644 (file)
@@ -386,7 +386,7 @@ found:
        {
          newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
          newic->parmPush = 1;
-         bytesPushed=getSize(type);
+         bytesPushed += getSize(type);
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
@@ -398,7 +398,7 @@ found:
        {
          newic = newiCode (IPUSH, IC_LEFT (ic), NULL);
          newic->parmPush = 1;
-         bytesPushed=getSize(type);
+         bytesPushed += getSize(type);
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
index 9ff910f0c10790d4279b79d872100bab8d166377..9db4cf03c2c64186e415998c4e6bb5a9c0cce988 100644 (file)
@@ -2254,6 +2254,19 @@ _makeRegParam (symbol * sym)
     }
 }
 
+static char *
+_mangleFunctionName(char *in)
+{
+  if (port->getMangledFunctionName) 
+    {
+      return port->getMangledFunctionName(in);
+    }
+  else
+    {
+      return in;
+    }
+}
+
 /*-----------------------------------------------------------------*/
 /* initCSupport - create functions for C support routines          */
 /*-----------------------------------------------------------------*/
@@ -2319,12 +2332,12 @@ initCSupport ()
              if (tofrom)
                {
                  sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]);
-                 __conv[tofrom][bwd][su] = funcOfType (buffer, __multypes[bwd][su], floatType, 1, options.float_rent);
+                 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], floatType, 1, options.float_rent);
                }
              else
                {
                  sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]);
-                 __conv[tofrom][bwd][su] = funcOfType (buffer, floatType, __multypes[bwd][su], 1, options.float_rent);
+                 __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), floatType, __multypes[bwd][su], 1, options.float_rent);
                }
            }
        }
@@ -2340,7 +2353,7 @@ initCSupport ()
                       smuldivmod[muldivmod],
                       ssu[su],
                       sbwd[bwd]);
-              __muldiv[muldivmod][bwd][su] = funcOfType (buffer, __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
+              __muldiv[muldivmod][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], __multypes[bwd][su], 2, options.intlong_rent);
              SPEC_NONBANKED (__muldiv[muldivmod][bwd][su]->etype) = 1;
              if (bwd < port->muldiv.force_reg_param_below)
                _makeRegParam (__muldiv[muldivmod][bwd][su]);
index 6685a116bafbcfe76777bc83e8337f99f5d4ba98..5ddc571edb913f02886b5e2474415998c047fe6a 100644 (file)
@@ -203,6 +203,7 @@ PORT avr_port = {
        _avr_genIVT,
        _avr_reset_regparm,
        _avr_regparm,
+        NULL,
        NULL,
        FALSE,
        0,                      /* leave lt */
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c40a8781a575408b5f5543ab6881143227d6726c 100644 (file)
+/* Generated file, DO NOT Edit!  */
+/* To Make changes to rules edit */
+/* <port>/peeph.def instead.     */
+"\n"
+"\n"
+"replace restart {\n"
+"        xch  a,%1\n"
+"        xch  a,%1\n"
+"} by {\n"
+"        ; Peephole 2.a   removed redundant xch xch\n"
+"}\n"
+"\n"
+"replace restart {\n"
+"        mov  %1,#0x00\n"
+"        mov  a,#0x00\n"
+"} by {\n"
+"        ; Peephole 3.a   changed mov to clr\n"
+"        clr  a\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace restart {\n"
+"        mov  %1,#0x00\n"
+"        clr  a\n"
+"} by {\n"
+"        ; Peephole 3.b   changed mov to clr\n"
+"        clr  a\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace restart {\n"
+"        mov  %1,#0x00\n"
+"        mov  %2,#0x00\n"
+"        mov  a,%3\n"
+"} by {\n"
+"        ; Peephole 3.c   changed mov to clr\n"
+"        clr  a\n"
+"        mov  %1,a\n"
+"        mov  %2,a\n"
+"        mov  a,%3\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        mov  dptr,#%2\n"
+"        mov  a,%1\n"
+"        movx @dptr,a\n"
+"} by {\n"
+"        ; Peephole 100   removed redundant mov\n"
+"        mov  %1,a\n"
+"        mov  dptr,#%2\n"
+"        movx @dptr,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"      mov  a,acc\n"
+"} by {\n"
+"      ;  Peephole 100.a   removed redundant mov\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,%1\n"
+"        movx @dptr,a\n"
+"        inc  dptr\n"
+"        mov  a,%1\n"
+"        movx @dptr,a\n"
+"} by {\n"
+"        ; Peephole 101   removed redundant mov\n"
+"        mov  a,%1\n"
+"        movx @dptr,a\n"
+"        inc  dptr\n"
+"        movx @dptr,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,%2\n"
+"        ljmp %3\n"
+"%4:\n"
+"        mov  %1,%5\n"
+"%3:\n"
+"        mov  dpl,%1\n"
+"%7:\n"
+"        mov  sp,bp\n"
+"        pop  bp\n"
+"} by {\n"
+"        ; Peephole 102   removed redundant mov\n"
+"        mov  dpl,%2\n"
+"        ljmp %3\n"
+"%4:\n"
+"        mov  dpl,%5\n"
+"%3:\n"
+"%7:\n"
+"        mov  sp,bp\n"
+"        pop  bp\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,%2\n"
+"        ljmp %3\n"
+"%4:\n"
+"        mov  a%1,%5\n"
+"%3:\n"
+"        mov  dpl,%1\n"
+"%7:\n"
+"        mov  sp,bp\n"
+"        pop  bp\n"
+"} by {\n"
+"        ; Peephole 103   removed redundant mov\n"
+"        mov  dpl,%2\n"
+"        ljmp %3\n"
+"%4:\n"
+"        mov  dpl,%5\n"
+"%3:\n"
+"%7:\n"
+"        mov  sp,bp\n"
+"        pop  bp\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,bp\n"
+"        clr  c\n"
+"        add  a,#0x01\n"
+"        mov  r%1,a\n"
+"} by {\n"
+"        ; Peephole 104   optimized increment (acc not set to r%1, flags undefined)\n"
+"        mov  r%1,bp\n"
+"        inc  r%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        mov  a,%1\n"
+"} by {\n"
+"        ; Peephole 105   removed redundant mov\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        clr  c\n"
+"        mov  a,%1\n"
+"} by {\n"
+"        ; Peephole 106   removed redundant mov \n"
+"        mov  %1,a\n"
+"        clr  c\n"
+"}\n"
+"\n"
+"replace {\n"
+"        ljmp %1\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 107   removed redundant ljmp\n"
+"%1:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        jc   %1\n"
+"        ljmp %5\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 108   removed ljmp by inverse jump logic\n"
+"        jnc  %5\n"
+"%1:\n"
+"} if labelInRange\n"
+"\n"
+"replace {\n"
+"        jz   %1\n"
+"        ljmp %5\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 109   removed ljmp by inverse jump logic\n"
+"        jnz  %5\n"
+"%1:\n"
+"} if labelInRange\n"
+"\n"
+"replace {\n"
+"        jnz  %1\n"
+"        ljmp %5\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 110   removed ljmp by inverse jump logic\n"
+"        jz  %5\n"
+"%1:\n"
+"} if labelInRange\n"
+"\n"
+"replace {\n"
+"        jb   %1,%2\n"
+"        ljmp %5\n"
+"%2:\n"
+"} by {\n"
+"        ; Peephole 111   removed ljmp by inverse jump logic\n"
+"        jnb  %1,%5\n"
+"%2:\n"
+"} if labelInRange\n"
+"\n"
+"replace {\n"
+"        jnb  %1,%2\n"
+"        ljmp %5\n"
+"%2:\n"
+"} by {\n"
+"       ; Peephole 112   removed ljmp by inverse jump logic\n"
+"        jb   %1,%5\n"
+"%2:\n"
+"} if labelInRange\n"
+"\n"
+"replace {\n"
+"        ljmp %5\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 132   changed ljmp to sjmp\n"
+"        sjmp %5\n"
+"%1:\n"
+"} if labelInRange\n"
+"\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        rrc  a\n"
+"        mov  %4,c\n"
+"} by {\n"
+"        ; Peephole 113   optimized misc sequence\n"
+"        clr  %4\n"
+"        cjne %1,%2,%3\n"
+"        setb %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        rrc  a\n"
+"        mov  %4,c\n"
+"} by {\n"
+"        ; Peephole 114   optimized misc sequence\n"
+"        clr  %4\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        setb %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jnz  %4\n"
+"} by {\n"
+"        ; Peephole 115   jump optimization \n"
+"        cjne %1,%2,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jnz  %4\n"
+"} by {\n"
+"        ; Peephole 116   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cjne %11,%12,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jnz %4\n"
+"} by {\n"
+"        ; Peephole 117   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cjne %11,%12,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cjne %11,%12,%3\n"
+"        cjne %13,%14,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jnz %4\n"
+"} by {\n"
+"        ; Peephole 118   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cjne %11,%12,%3\n"
+"        cjne %13,%14,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jnz  %4\n"
+"} by {\n"
+"        ; Peephole 119   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jnz  %4\n"
+"} by {\n"
+"        ; Peephole 120   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"        cjne %10,%11,%4\n"
+"%3:\n"
+"}\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %12,%13,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jnz  %4\n"
+"} by {\n"
+"        ; Peephole 121   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"        cjne %10,%11,%4\n"
+"        cjne %12,%13,%4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %12,%13,%3\n"
+"        cjne %14,%15,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jnz  %4\n"
+"} by {\n"
+"        ; Peephole 122   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"        cjne %10,%11,%4\n"
+"        cjne %12,%13,%4\n"
+"        cjne %14,%15,%4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 123   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        smp  %4\n"
+"%3:\n"
+"}\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 124   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        smp  %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %12,%13,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 125   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %12,%13,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,#0x01\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %12,%13,%3\n"
+"        cjne %14,%15,%3\n"
+"        clr  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 126   jump optimization\n"
+"        cjne %1,%2,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %12,%13,%3\n"
+"        cjne %14,%15,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        push psw\n"
+"        mov  psw,%1\n"
+"        push bp\n"
+"        mov  bp,%2\n"
+"%3:\n"
+"        mov  %2,bp\n"
+"        pop  bp\n"
+"        pop  psw\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 127   removed misc sequence\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        rlc  a\n"
+"        jz   %1\n"
+"} by {\n"
+"        ; Peephole 128   jump optimization\n"
+"        jnc  %1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        rlc  a\n"
+"        jnz  %1\n"
+"} by {\n"
+"        ; Peephole 129   jump optimization\n"
+"        jc   %1\n"
+"}\n"
+"\n"
+"replace { \n"
+"        mov  r%1,@r%2\n"
+"} by {\n"
+"        ; Peephole 130   changed target address mode r%1 to ar%1\n"
+"        mov  ar%1,@r%2\n"
+"}\n"
+"\n"
+"replace { \n"
+"        mov  a,%1\n"
+"        subb a,#0x01\n"
+"        mov  %2,a\n"
+"        mov  %1,%2\n"
+"} by {\n"
+"        ; Peephole 131   optimized decrement (not caring for c)\n"
+"        dec  %1         \n"
+"        mov  %2,%1      \n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,%2\n"
+"        mov  ar%3,@r%1\n"
+"        inc  r%3\n"
+"        mov  r%4,%2\n"
+"        mov  @r%4,ar%3\n"
+"} by {\n"
+"        ; Peephole 133   removed redundant moves\n"
+"        mov  r%1,%2\n"
+"        inc  @r%1\n"
+"        mov  ar%3,@r%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,%2\n"
+"        mov  ar%3,@r%1\n"
+"        dec  r%3\n"
+"        mov  r%4,%2\n"
+"        mov  @r%4,ar%3\n"
+"} by {\n"
+"        ; Peephole 134   removed redundant moves\n"
+"        mov  r%1,%2\n"
+"        dec  @r%1\n"
+"        mov  ar%3,@r%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,a\n"
+"        mov  a,r%2\n"
+"        orl  a,r%1\n"
+"} by {\n"
+"        ; Peephole 135   removed redundant mov\n"
+"        mov  r%1,a\n"
+"        orl  a,r%2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        mov  dpl,%2\n"
+"        mov  dph,%3\n"
+"      mov  dpx,%4\n"
+"        mov  a,%1\n"
+"} by {\n"
+"        ; Peephole 136a   removed redundant moves\n"
+"        mov  %1,a\n"
+"        mov  dpl,%2\n"
+"        mov  dph,%3\n"
+"      mov  dpx,%4\n"
+"} if 24bitMode\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        mov  dpl,%2\n"
+"        mov  dph,%3\n"
+"        mov  a,%1\n"
+"} by {\n"
+"        ; Peephole 136   removed redundant moves\n"
+"        mov  %1,a\n"
+"        mov  dpl,%2\n"
+"        mov  dph,%3\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  b,#0x00\n"
+"        mov  a,%1\n"
+"        cjne %2,%3,%4\n"
+"        mov  b,#0x01\n"
+"%4:\n"
+"        mov  a,b\n"
+"        jz   %5\n"
+"} by {\n"
+"        ; Peephole 137   optimized misc jump sequence\n"
+"        mov  a,%1\n"
+"        cjne %2,%3,%5\n"
+"%4:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  b,#0x00\n"
+"        mov  a,%1\n"
+"        cjne %2,%3,%4\n"
+"        mov  b,#0x01\n"
+"%4:\n"
+"        mov  a,b\n"
+"        jnz  %5\n"
+"} by {\n"
+"        ; Peephole 138   optimized misc jump sequence\n"
+"        mov  a,%1\n"
+"        cjne %2,%3,%4\n"
+"        sjmp %5\n"
+"%4:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,a\n"
+"        anl  ar%1,%2\n"
+"        mov  a,r%1\n"
+"} by {\n"
+"        ; Peephole 139   removed redundant mov\n"
+"        anl  a,%2\n"
+"        mov  r%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,a\n"
+"        orl  ar%1,%2\n"
+"        mov  a,r%1\n"
+"} by {\n"
+"        ; Peephole 140   removed redundant mov\n"
+"        orl  a,%2\n"
+"        mov  r%1,a }\n"
+"\n"
+"replace {\n"
+"        mov  r%1,a\n"
+"        xrl  ar%1,%2\n"
+"        mov  a,r%1\n"
+"} by {\n"
+"        ; Peephole 141   removed redundant mov\n"
+"        xrl  a,%2\n"
+"        mov  r%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,a\n"
+"        mov  r%2,ar%1\n"
+"        mov  ar%1,@r%2\n"
+"} by {\n"
+"        ; Peephole 142   removed redundant moves\n"
+"        mov  r%2,a\n"
+"        mov  ar%1,@r%2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        rlc  a\n"
+"        mov  acc.0,c\n"
+"} by {\n"
+"        ; Peephole 143   converted rlc to rl\n"
+"        rl   a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        rrc  a\n"
+"        mov  acc.7,c\n"
+"} by {\n"
+"        ; Peephole 144   converted rrc to rc\n"
+"        rr   a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  c\n"
+"        addc a,%1\n"
+"} by {\n"
+"        ; Peephole 145   changed to add without carry  \n"
+"        add  a,%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        clr  c\n"
+"        mov  a,%1\n"
+"        addc a,%2\n"
+"} by {\n"
+"        ; Peephole 146   changed to add without carry\n"
+"        mov  a,%1\n"
+"        add  a,%2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        orl  r%1,a\n"
+"} by {\n"
+"        ; Peephole 147   changed target address mode r%1 to ar%1\n"
+"        orl  ar%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        anl  r%1,a\n"
+"} by {\n"
+"        ; Peephole 148   changed target address mode r%1 to ar%1\n"
+"        anl  ar%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        xrl  r%1,a\n"
+"} by {\n"
+"        ; Peephole 149   changed target address mode r%1 to ar%1\n"
+"        xrl  ar%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  dpl,%1\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 150   removed misc moves via dpl before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  dpl,%1\n"
+"        mov  dph,%2\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 151   removed misc moves via dph, dpl before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  dpl,%1\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 152   removed misc moves via dph, dpl before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  %3,b\n"
+"        mov  dpl,%1\n"
+"        mov  dph,%2\n"
+"        mov  b,%3\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 153   removed misc moves via dph, dpl, b before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  %3,b\n"
+"        mov  dpl,%1\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 154   removed misc moves via dph, dpl, b before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  %3,b\n"
+"        mov  dpl,%1\n"
+"        mov  dph,%2\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 155   removed misc moves via dph, dpl, b before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  %3,b\n"
+"        mov  %4,a\n"
+"        mov  dpl,%1\n"
+"        mov  dph,%2\n"
+"        mov  b,%3\n"
+"        mov  a,%4\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 156   removed misc moves via dph, dpl, b, a before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  %3,b\n"
+"        mov  %4,a\n"
+"        mov  dpl,%1\n"
+"        mov  dph,%2\n"
+"%9:\n"
+"        ret\n"
+"} by {\n"
+"        ; Peephole 157   removed misc moves via dph, dpl, b, a before return\n"
+"%9:\n"
+"        ret\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,dpl\n"
+"        mov  %2,dph\n"
+"        mov  %3,b\n"
+"        mov  %4,a\n"
+"        mov  dpl,%1\n"
+"%9:\n"
+"        ret } by {\n"
+"        ; Peephole 158   removed misc moves via dph, dpl, b, a before return\n"
+"%9:\n"
+"        ret }\n"
+"\n"
+"replace {\n"
+"        mov  %1,#%2\n"
+"        xrl  %1,#0x80\n"
+"} by {\n"
+"        ; Peephole 159   avoided xrl during execution\n"
+"        mov  %1,#(%2 ^ 0x80)\n"
+"}\n"
+"\n"
+"replace {\n"
+"        jnc  %1\n"
+"        sjmp %2\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 160   removed sjmp by inverse jump logic\n"
+"        jc   %2\n"
+"%1:}\n"
+"\n"
+"replace {\n"
+"        jc   %1\n"
+"        sjmp %2\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 161   removed sjmp by inverse jump logic\n"
+"        jnc  %2\n"
+"%1:}\n"
+"\n"
+"replace {\n"
+"        jnz  %1\n"
+"        sjmp %2\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 162   removed sjmp by inverse jump logic\n"
+"        jz   %2\n"
+"%1:}\n"
+"\n"
+"replace {\n"
+"        jz   %1\n"
+"        sjmp %2\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 163   removed sjmp by inverse jump logic\n"
+"        jnz  %2\n"
+"%1:}\n"
+"\n"
+"replace {\n"
+"        jnb  %3,%1\n"
+"        sjmp %2\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 164   removed sjmp by inverse jump logic\n"
+"        jb   %3,%2\n"
+"%1:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        jb   %3,%1\n"
+"        sjmp %2\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 165   removed sjmp by inverse jump logic\n"
+"        jnb  %3,%2\n"
+"%1:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,%2\n"
+"        mov  %3,%1\n"
+"        mov  %2,%1\n"
+"} by {\n"
+"        ; Peephole 166   removed redundant mov\n"
+"        mov  %1,%2\n"
+"        mov  %3,%1 }\n"
+"\n"
+"replace {\n"
+"        mov  c,%1\n"
+"        cpl  c\n"
+"        mov  %1,c\n"
+"} by {\n"
+"        ; Peephole 167   removed redundant bit moves (c not set to %1)\n"
+"        cpl  %1 }\n"
+"\n"
+"replace {\n"
+"        jnb  %1,%2\n"
+"        sjmp %3\n"
+"%2:} by {\n"
+"        ; Peephole 168   jump optimization\n"
+"        jb   %1,%3\n"
+"%2:}\n"
+"\n"
+"replace {\n"
+"        jb   %1,%2\n"
+"        sjmp %3\n"
+"%2:} by {\n"
+"        ; Peephole 169   jump optimization\n"
+"        jnb  %1,%3\n"
+"%2:}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 170   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"%3:}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 171   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"        cjne %9,%10,%4\n"
+"%3:}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cjne %11,%12,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 172   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"        cjne %9,%10,%4\n"
+"        cjne %11,%12,%4\n"
+"%3:}\n"
+"\n"
+"replace {\n"
+"        clr  a\n"
+"        cjne %1,%2,%3\n"
+"        cjne %9,%10,%3\n"
+"        cjne %11,%12,%3\n"
+"        cjne %13,%14,%3\n"
+"        cpl  a\n"
+"%3:\n"
+"        jz   %4\n"
+"} by {\n"
+"        ; Peephole 173   jump optimization\n"
+"        cjne %1,%2,%4\n"
+"        cjne %9,%10,%4\n"
+"        cjne %11,%12,%4\n"
+"        cjne %13,%14,%4\n"
+"%3:}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,%2\n"
+"        clr  c\n"
+"        mov  a,r%1\n"
+"        subb a,#0x01\n"
+"        mov  %2,a\n"
+"} by {\n"
+"        ; Peephole 174   optimized decrement (acc not set to %2, flags undefined)\n"
+"        mov  r%1,%2\n"
+"        dec  %2\n"
+"}\n"
+"\n"
+"\n"
+"replace {\n"
+"        mov  r%1,%2\n"
+"        mov  a,r%1\n"
+"        add  a,#0x01\n"
+"        mov  %2,a\n"
+"} by {\n"
+"        ; Peephole 175   optimized increment (acc not set to %2, flags undefined)\n"
+"        mov  r%1,%2\n"
+"        inc  %2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,@r%2\n"
+"        inc  %1\n"
+"        mov  @r%2,%1\n"
+"} by {\n"
+"        ; Peephole 176   optimized increment, removed redundant mov\n"
+"        inc  @r%2\n"
+"        mov  %1,@r%2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,%2\n"
+"        mov  %2,%1\n"
+"} by {\n"
+"        ; Peephole 177   removed redundant mov\n"
+"        mov  %1,%2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,%1\n"
+"        mov  b,a\n"
+"        mov  a,%2\n"
+"} by {\n"
+"        ; Peephole 178   removed redundant mov\n"
+"        mov  b,%1\n"
+"        mov  a,%2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  b,#0x00\n"
+"        mov  a,#0x00\n"
+"} by {\n"
+"        ; Peephole 179   changed mov to clr\n"
+"        clr  a\n"
+"        mov  b,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,#0x00\n"
+"} by {\n"
+"        ; Peephole 180   changed mov to clr\n"
+"        clr  a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  dpl,#0x00\n"
+"        mov  dph,#0x00\n"
+"      mov  dpx,#0x00\n"
+"} by {\n"
+"        ; Peephole 181a   used 24 bit load of dptr\n"
+"        mov  dptr,#0x0000\n"
+"} if 24bitMode\n"
+"\n"
+"replace {\n"
+"        mov  dpl,#0x00\n"
+"        mov  dph,#0x00\n"
+"} by {\n"
+"        ; Peephole 181   used 16 bit load of dptr\n"
+"        mov  dptr,#0x0000\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  dpl,#%1\n"
+"        mov  dph,#(%1 >> 8)\n"
+"      mov  dpx,#(%1 >> 16)\n"
+"} by {\n"
+"        ; Peephole 182a   used 24 bit load of dptr\n"
+"        mov  dptr,#%1\n"
+"} if 24bitMode\n"
+"\n"
+"replace {\n"
+"        mov  dpl,#%1\n"
+"        mov  dph,#%2\n"
+"} by {\n"
+"        ; Peephole 182   used 16 bit load of dptr\n"
+"        mov  dptr,#(((%2)<<8) + %1)\n"
+"}\n"
+"\n"
+"replace {\n"
+"        anl  %1,#%2\n"
+"        anl  %1,#%3\n"
+"} by {\n"
+"        ; Peephole 183   avoided anl during execution\n"
+"        anl  %1,#(%2 & %3)\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        cpl  a\n"
+"        mov  %1,a\n"
+"} by {\n"
+"        ; Peephole 184   removed redundant mov\n"
+"        cpl  a\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        inc  %1\n"
+"} by {\n"
+"        ; Peephole 185   changed order of increment (acc incremented also!)\n"
+"        inc  a\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        add  a,#%1\n"
+"        mov  dpl,a\n"
+"        clr  a\n"
+"        addc a,#(%1 >> 8)\n"
+"        mov  dph,a\n"
+"        clr  a\n"
+"        movc a,@a+dptr\n"
+"      mov  %2,a\n"
+"      inc  dptr\n"
+"      clr  a\n"
+"      movc a,@a+dptr\n"
+"      mov  %3,a\n"
+"      inc  dptr\n"
+"      clr  a\n"
+"      movc a,@a+dptr\n"
+"      mov  %4,a\n"
+"      inc  dptr\n"
+"      clr  a  \n"
+"} by {\n"
+"        ; Peephole 186.a   optimized movc sequence\n"
+"        mov  dptr,#%1\n"
+"      mov  b,acc\n"
+"        movc a,@a+dptr\n"
+"      mov  %2,a\n"
+"      mov  acc,b\n"
+"      inc  dptr       \n"
+"      movc a,@a+dptr\n"
+"      mov  %3,a\n"
+"      mov  acc,b\n"
+"      inc  dptr\n"
+"      mov  %4,a\n"
+"      mov  acc,b\n"
+"      inc  dptr\n"
+"}\n"
+"\n"
+"replace {\n"
+"        add  a,#%1\n"
+"        mov  dpl,a\n"
+"        clr  a\n"
+"        addc a,#(%1 >> 8)\n"
+"        mov  dph,a\n"
+"        clr  a\n"
+"        movc a,@a+dptr\n"
+"      mov  %2,a\n"
+"      inc  dptr\n"
+"      clr  a\n"
+"      movc a,@a+dptr\n"
+"      mov  %3,a\n"
+"      inc  dptr\n"
+"      clr  a\n"
+"} by {\n"
+"        ; Peephole 186.b   optimized movc sequence\n"
+"        mov  dptr,#%1\n"
+"      mov  b,acc\n"
+"        movc a,@a+dptr\n"
+"      mov  %2,a\n"
+"      mov  acc,b\n"
+"      inc  dptr       \n"
+"      movc a,@a+dptr\n"
+"      mov  %3,a\n"
+"      mov  acc,b\n"
+"      inc  dptr       \n"
+"}\n"
+"\n"
+"replace {\n"
+"        add  a,#%1\n"
+"        mov  dpl,a\n"
+"        clr  a\n"
+"        addc a,#(%1 >> 8)\n"
+"        mov  dph,a\n"
+"        clr  a\n"
+"        movc a,@a+dptr\n"
+"      mov  %2,a\n"
+"      inc  dptr\n"
+"      clr  a\n"
+"} by {\n"
+"        ; Peephole 186.c   optimized movc sequence\n"
+"        mov  dptr,#%1\n"
+"      mov  b,acc\n"
+"        movc a,@a+dptr\n"
+"      mov  %2,a\n"
+"      mov  acc,b\n"
+"      inc  dptr\n"
+"}\n"
+"\n"
+"replace {\n"
+"        add  a,#%1\n"
+"        mov  dpl,a\n"
+"        clr  a\n"
+"        addc a,#(%1 >> 8)\n"
+"        mov  dph,a\n"
+"        clr  a\n"
+"        movc a,@a+dptr\n"
+"} by {\n"
+"        ; Peephole 186   optimized movc sequence\n"
+"        mov  dptr,#%1\n"
+"        movc a,@a+dptr\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,%2\n"
+"        anl  ar%1,#%3\n"
+"        mov  a,r%1\n"
+"} by {\n"
+"        ; Peephole 187   used a instead of ar%1 for anl\n"
+"        mov  a,%2\n"
+"        anl  a,#%3\n"
+"        mov  r%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        mov  dptr,%2\n"
+"        movc a,@a+dptr\n"
+"        mov  %1,a\n"
+"} by {\n"
+"        ; Peephole 188   removed redundant mov\n"
+"        mov  dptr,%2\n"
+"        movc a,@a+dptr\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        anl  a,#0x0f\n"
+"        mov  %1,a\n"
+"        mov  a,#0x0f\n"
+"        anl  a,%1\n"
+"} by {\n"
+"        ; Peephole 189   removed redundant mov and anl\n"
+"        anl  a,#0x0f\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,%1\n"
+"        lcall __gptrput\n"
+"        mov  a,%1\n"
+"} by {\n"
+"        ; Peephole 190   removed redundant mov\n"
+"        mov  a,%1\n"
+"        lcall __gptrput\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        mov  dpl,%2\n"
+"        mov  dph,%3\n"
+"        mov  b,%4\n"
+"        mov  a,%1\n"
+"} by {\n"
+"        ; Peephole 191   removed redundant mov\n"
+"        mov  %1,a\n"
+"        mov  dpl,%2\n"
+"        mov  dph,%3\n"
+"        mov  b,%4\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,a\n"
+"        mov  @r%2,ar%1\n"
+"} by {\n"
+"        ; Peephole 192   used a instead of ar%1 as source\n"
+"        mov  r%1,a\n"
+"        mov  @r%2,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        jnz  %3\n"
+"        mov  a,%4\n"
+"        jnz  %3\n"
+"        mov  a,%9\n"
+"        jnz  %3\n"
+"        mov  a,%12\n"
+"        cjne %13,%14,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 193.a optimized misc jump sequence\n"
+"        jnz  %8\n"
+"        mov  a,%4\n"
+"        jnz  %8\n"
+"        mov  a,%9\n"
+"        jnz  %8\n"
+"        mov  a,%12\n"
+"        cjne %13,%14,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%3\n"
+"        mov  a,%9\n"
+"        cjne %10,%11,%3\n"
+"        mov  a,%12\n"
+"        cjne %13,%14,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 193   optimized misc jump sequence\n"
+"        cjne %1,%2,%8\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%8\n"
+"        mov  a,%9\n"
+"        cjne %10,%11,%8\n"
+"        mov  a,%12\n"
+"        cjne %13,%14,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        cjne %5,%6,%3\n"
+"        cjne %10,%11,%3\n"
+"        cjne %13,%14,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 194   optimized misc jump sequence\n"
+"        cjne %1,%2,%8\n"
+"        cjne %5,%6,%8\n"
+"        cjne %10,%11,%8\n"
+"        cjne %13,%14,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        jnz  %3\n"
+"        mov  a,%4\n"
+"        jnz  %3\n"
+"        mov  a,%9\n"
+"        cjne %10,%11,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 195.a optimized misc jump sequence\n"
+"        jnz  %8\n"
+"        mov  a,%4\n"
+"        jnz  %8\n"
+"        mov  a,%9\n"
+"        cjne %10,%11,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%3\n"
+"        mov  a,%9\n"
+"        cjne %10,%11,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 195   optimized misc jump sequence\n"
+"        cjne %1,%2,%8\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%8\n"
+"        mov  a,%9\n"
+"        cjne %10,%11,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        cjne %5,%6,%3\n"
+"        cjne %10,%11,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 196   optimized misc jump sequence\n"
+"        cjne %1,%2,%8\n"
+"        cjne %5,%6,%8\n"
+"        cjne %10,%11,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        jnz  %3\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8 \n"
+"} by {\n"
+"        ; Peephole 197.a optimized misc jump sequence\n"
+"        jnz  %8\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%8\n"
+"        sjmp %7\n"
+"%3:     \n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 197   optimized misc jump sequence\n"
+"        cjne %1,%2,%8\n"
+"        mov  a,%4\n"
+"        cjne %5,%6,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        cjne %5,%6,%3\n"
+"        sjmp %7\n"
+"%3:\n"
+"        sjmp %8\n"
+"} by {\n"
+"        ; Peephole 198   optimized misc jump sequence\n"
+"        cjne %1,%2,%8\n"
+"        cjne %5,%6,%8\n"
+"        sjmp %7\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        cjne %1,%2,%3\n"
+"        sjmp %4\n"
+"%3:\n"
+"        sjmp %5\n"
+"} by {\n"
+"        ; Peephole 199   optimized misc jump sequence\n"
+"        cjne %1,%2,%5\n"
+"        sjmp %4\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        sjmp %1\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 200   removed redundant sjmp\n"
+"%1:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        sjmp %1\n"
+"%2:\n"
+"%1:\n"
+"} by {\n"
+"        ; Peephole 201   removed redundant sjmp\n"
+"%2:\n"
+"%1:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        push  acc\n"
+"        mov   dptr,%1\n"
+"        pop   acc\n"
+"} by {\n"
+"        ; Peephole 202   removed redundant push pop\n"
+"        mov   dptr,%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  r%1,_spx\n"
+"        lcall %2\n"
+"        mov  r%1,_spx\n"
+"} by {\n"
+"        ; Peephole 203   removed mov  r%1,_spx\n"
+"        lcall %2\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,a\n"
+"        add  a,acc\n"
+"        mov  %1,a\n"
+"} by {\n"
+"        ; Peephole 204   removed redundant mov\n"
+"        add  a,acc\n"
+"        mov  %1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"        djnz %1,%2\n"
+"        sjmp  %3\n"
+"%2:\n"
+"        sjmp  %4\n"
+"%3:\n"
+"} by {\n"
+"        ; Peephole 205   optimized misc jump sequence\n"
+"        djnz %1,%4\n"
+"%2:\n"
+"%3:\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  %1,%1\n"
+"} by {\n"
+"        ; Peephole 206   removed redundant mov %1,%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,_bp\n"
+"        add  a,#0x00\n"
+"        mov  %1,a\n"
+"} by {\n"
+"        ; Peephole 207   removed zero add (acc not set to %1, flags undefined)\n"
+"        mov  %1,_bp\n"
+"}\n"
+"\n"
+"replace {\n"
+"        push  acc\n"
+"        mov   r%1,_bp\n"
+"        pop   acc\n"
+"} by {\n"
+"        ; Peephole 208   removed redundant push pop\n"
+"        mov   r%1,_bp\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  a,_bp\n"
+"        add  a,#0x00\n"
+"        inc  a\n"
+"        mov  %1,a\n"
+"} by {\n"
+"        ; Peephole 209   optimized increment (acc not set to %1, flags undefined)\n"
+"        mov  %1,_bp\n"
+"        inc  %1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        mov  dptr,#((((%1 >> 16)) <<16) + (((%1 >> 8)) <<8) + %1)\n"
+"} by {\n"
+"        ; Peephole 210a   simplified expression\n"
+"        mov  dptr,#%1\n"
+"} if 24bitMode\n"
+"\n"
+"replace {\n"
+"        mov  dptr,#((((%1 >> 8)) <<8) + %1)\n"
+"} by {\n"
+"        ; Peephole 210   simplified expression\n"
+"        mov  dptr,#%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"        push %1\n"
+"        pop  %1\n"
+"} by {\n"
+"        ; Peephole 211   removed redundant push %1 pop %1  \n"
+"} \n"
+"\n"
+"replace {\n"
+"      mov  a,_bp\n"
+"      add  a,#0x01\n"
+"      mov  r%1,a\n"
+"} by {\n"
+"      ; Peephole 212  reduced add sequence to inc\n"
+"      mov  r%1,_bp\n"
+"      inc  r%1\n"
+"}\n"
+"\n"
+"replace {\n"
+"      mov  %1,#(( %2 >> 8 ) ^ 0x80)\n"
+"} by {        \n"
+"      mov  %1,#(%2 >> 8)\n"
+"      xrl  %1,#0x80\n"
+"}\n"
+"\n"
+"replace {\n"
+"      mov  %1,#(( %2 + %3 >> 8 ) ^ 0x80)\n"
+"} by {        \n"
+"      mov  %1,#((%2 + %3) >> 8)\n"
+"      xrl  %1,#0x80\n"
+"}\n"
+"\n"
+"replace  {\n"
+"      mov  %1,a\n"
+"      mov  a,%2\n"
+"      add  a,%1\n"
+"} by {\n"
+"      ; Peephole 214 reduced some extra movs\n"
+"      mov  %1,a\n"
+"      add  a,%2       \n"
+"} if operandsNotSame\n"
+"\n"
+"replace {\n"
+"      mov  %1,a\n"
+"      add  a,%2\n"
+"      mov  %1,a\n"
+"} by {\n"
+"      ; Peephole 215 removed some movs\n"
+"      add  a,%2\n"
+"      mov  %1,a\n"
+"} if operandsNotSame\n"
+"\n"
+"replace {\n"
+"      mov   r%1,%2\n"
+"      clr   a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"      dec   r%1\n"
+"      mov   @r%1,a\n"
+"} by {\n"
+"      ; Peephole 216 simplified clear (2bytes)\n"
+"      mov   r%1,%2\n"
+"      clr   a\n"
+"      mov   @r%1,a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"      mov   r%1,%2\n"
+"      clr   a\n"
+"      inc   r%1\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"      dec   r%1\n"
+"      mov   @r%1,a\n"
+"      dec   r%1\n"
+"      mov   @r%1,a\n"
+"} by {\n"
+"      ; Peephole 217 simplified clear (3bytes)\n"
+"      mov   r%1,%2\n"
+"      clr   a\n"
+"      mov   @r%1,a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"      mov   r%1,%2\n"
+"      clr   a\n"
+"      inc   r%1\n"
+"      inc   r%1\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"      dec   r%1\n"
+"      mov   @r%1,a\n"
+"      dec   r%1\n"
+"      mov   @r%1,a\n"
+"      dec   r%1\n"
+"      mov   @r%1,a\n"
+"} by {\n"
+"      ; Peephole 218 simplified clear (4bytes)\n"
+"      mov   r%1,%2\n"
+"      clr   a\n"
+"      mov   @r%1,a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"      inc   r%1\n"
+"      mov   @r%1,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"      clr   a\n"
+"      movx  @dptr,a\n"
+"      mov   dptr,%1\n"
+"      clr   a\n"
+"      movx  @dptr,a\n"
+"} by {\n"
+"      ; Peephole 219 removed redundant clear\n"
+"      clr   a\n"
+"      movx  @dptr,a\n"
+"      mov   dptr,%1\n"
+"      movx  @dptr,a\n"
+"}\n"
+"\n"
+"replace {\n"
+"      clr   a\n"
+"      movx  @dptr,a\n"
+"      mov   dptr,%1\n"
+"      movx  @dptr,a\n"
+"      mov   dptr,%2\n"
+"      clr   a\n"
+"      movx  @dptr,a\n"
+"} by {\n"
+"      ; Peephole 219a removed redundant clear\n"
+"      clr   a\n"
+"      movx  @dptr,a\n"
+"      mov   dptr,%1\n"
+"      movx  @dptr,a\n"
+"      mov   dptr,%2\n"
+"      movx  @dptr,a\n"
+"}\n"
index fb90dbb44f7395ed78dfacf3444ee1516552ee2a..1301e60396426f34f23ecb1b5f884cb7828eb961 100644 (file)
@@ -263,6 +263,7 @@ PORT ds390_port =
   _ds390_reset_regparm,
   _ds390_regparm,
   NULL,
+  NULL,
   FALSE,
   0,                           /* leave lt */
   0,                           /* leave gt */
index 8da5f08242de94f60a7037bac388097243409489..231a7aeb222e8908818809161b998ce70b246930 100644 (file)
@@ -197,6 +197,7 @@ PORT i186_port = {
     _i186_reset_regparm,
     _i186_regparm,
     NULL,
+    NULL,
     FALSE,
     0,  /* leave lt */
     0,  /* leave gt */
index fc259061df7e246571c6577c516e1fa5c6aaf5b9..addb859799d1cbc4b81db1876b3287e9b67d4610 100644 (file)
@@ -196,6 +196,7 @@ PORT tlcs900h_port =
   _tlcs900h_reset_regparm,
   _tlcs900h_regparm,
   NULL,
+  NULL,
   FALSE,
   0,                           /* leave lt */
   0,                           /* leave gt */
index f2ced3e291068338e2cbc6f0f864309109398178..f7af7756f45fef0e067e5ab1f5ef5fc9249d6eba 100644 (file)
@@ -203,6 +203,7 @@ PORT mcs51_port =
   _mcs51_reset_regparm,
   _mcs51_regparm,
   NULL,
+  NULL,
   FALSE,
   0,                           /* leave lt */
   0,                           /* leave gt */
index 2e41a00e6160e44120b712b043693973a9df8147..d2222421511fc8c49c96355c79d0aaddd3571cbb 100644 (file)
@@ -287,6 +287,7 @@ PORT pic_port =
   _pic14_reset_regparm,
   _pic14_regparm,
   NULL,
+  NULL,
   FALSE,
   0,                           /* leave lt */
   0,                           /* leave gt */
index 0e6459b77aa44c12008ee7b363e6532ebced1c4f..9bf97e4959a0c5cee4144d69ac46274149e7a780 100644 (file)
@@ -201,6 +201,10 @@ typedef struct
     */
     int (*process_pragma) (const char *sz);
 
+    /** Mangles a support function name to reflect the calling model. 
+     */
+    char *(*getMangledFunctionName) (char *szOrginial);
+
     /** If TRUE, then tprintf and !dw will be used for some initalisers
      */
     bool use_dw_for_init;
index 424ee71087fe27cab123d11fca0a6492359996fc..ea69f7c1e37d907cabc035414aa2434f4207911b 100644 (file)
@@ -1743,7 +1743,17 @@ _saveRegsForCall(iCode *ic, int sendSetSize)
     bool deInUse, bcInUse;
     bool deSending;
     bool bcInRet = FALSE, deInRet = FALSE;
-    bitVect *rInUse = bitVectCplAnd (bitVectCopy (ic->rMask), ic->rUsed);
+    bitVect *rInUse;
+
+    if (IC_RESULT(ic))
+      {
+        rInUse = bitVectCplAnd (bitVectCopy (ic->rMask), z80_rUmaskForOp (IC_RESULT(ic)));
+      }
+    else 
+      {
+        /* Has no result, so in use is all of in use */
+        rInUse = ic->rMask;
+      }
 
     deInUse = bitVectBitValue (rInUse, D_IDX) || bitVectBitValue(rInUse, E_IDX);
     bcInUse = bitVectBitValue (rInUse, B_IDX) || bitVectBitValue(rInUse, C_IDX);
@@ -1964,6 +1974,51 @@ isInHome (void)
   return _G.in_home;
 }
 
+static int
+_opUsesPair (operand * op, iCode * ic, PAIR_ID pairId)
+{
+  int ret = 0;
+  asmop *aop;
+  symbol *sym = OP_SYMBOL (op);
+
+  if (sym->isspilt || sym->nRegs == 0)
+    return 0;
+
+  aopOp (op, ic, FALSE, FALSE);
+
+  aop = AOP (op);
+  if (aop->type == AOP_REG)
+    {
+      int i;
+      for (i = 0; i < aop->size; i++)
+       {
+         if (pairId == PAIR_DE)
+           {
+             emit2 ("; name %s", aop->aopu.aop_reg[i]->name);
+             if (!strcmp (aop->aopu.aop_reg[i]->name, "e"))
+               ret++;
+             if (!strcmp (aop->aopu.aop_reg[i]->name, "d"))
+               ret++;
+           }
+          else if (pairId == PAIR_BC)
+            {
+             emit2 ("; name %s", aop->aopu.aop_reg[i]->name);
+             if (!strcmp (aop->aopu.aop_reg[i]->name, "c"))
+               ret++;
+             if (!strcmp (aop->aopu.aop_reg[i]->name, "b"))
+               ret++;
+            }
+         else
+           {
+             wassert (0);
+           }
+       }
+    }
+
+  freeAsmop (IC_LEFT (ic), NULL, ic);
+  return ret;
+}
+
 /** Emit the code for a call statement
  */
 static void
@@ -1984,11 +2039,31 @@ emitCall (iCode * ic, bool ispcall)
     {
       iCode *sic;
       int send = 0;
+      int nSend = elementsInSet(_G.sendSet);
+      bool swapped = FALSE;
 
       int _z80_sendOrder[] = {
-        PAIR_BC, PAIR_DE, PAIR_INVALID
+        PAIR_BC, PAIR_DE
       };
 
+      if (nSend > 1) {
+        /* Check if the parameters are swapped.  If so route through hl instead. */
+        wassertl (nSend == 2, "Pedantic check.  Code only checks for the two send items case.");
+
+        sic = setFirstItem(_G.sendSet);
+        sic = setNextItem(_G.sendSet);
+
+        if (_opUsesPair (IC_LEFT(sic), sic, _z80_sendOrder[0])) {
+          /* The second send value is loaded from one the one that holds the first
+             send, i.e. it is overwritten. */
+          /* Cache the first in HL, and load the second from HL instead. */
+          emit2 ("ld h,%s", _pairs[_z80_sendOrder[0]].h);
+          emit2 ("ld l,%s", _pairs[_z80_sendOrder[0]].l);
+
+          swapped = TRUE;
+        }
+      }
+
       for (sic = setFirstItem (_G.sendSet); sic;
            sic = setNextItem (_G.sendSet))
         {
@@ -1998,8 +2073,20 @@ emitCall (iCode * ic, bool ispcall)
           size = AOP_SIZE (IC_LEFT (sic));
           wassertl (size <= 2, "Tried to send a parameter that is bigger than two bytes");
           wassertl (_z80_sendOrder[send] != PAIR_INVALID, "Tried to send more parameters than we have registers for");
-          
-          fetchPair(_z80_sendOrder[send], AOP (IC_LEFT (sic)));
+
+          // PENDING: Mild hack
+          if (swapped == TRUE && send == 1) {
+            if (size > 1) {
+              emit2 ("ld %s,h", _pairs[_z80_sendOrder[send]].h);
+            }
+            else {
+              emit2 ("ld %s,!zero", _pairs[_z80_sendOrder[send]].h);
+            }
+            emit2 ("ld %s,l", _pairs[_z80_sendOrder[send]].l);
+          }
+          else {
+            fetchPair(_z80_sendOrder[send], AOP (IC_LEFT (sic)));
+          }
 
           send++;
           freeAsmop (IC_LEFT (sic), NULL, sic);
@@ -2075,6 +2162,7 @@ emitCall (iCode * ic, bool ispcall)
   if (ic->parmBytes)
     {
       int i = ic->parmBytes;
+
       _G.stack.pushed -= i;
       if (IS_GB)
        {
@@ -5682,40 +5770,4 @@ _isPairUsed (iCode * ic, PAIR_ID pairId)
   return ret;
 }
 
-static int
-_opUsesPair (operand * op, iCode * ic, PAIR_ID pairId)
-{
-  int ret = 0;
-  asmop *aop;
-  symbol *sym = OP_SYMBOL (op);
-
-  if (sym->isspilt || sym->nRegs == 0)
-    return 0;
-
-  aopOp (op, ic, FALSE, FALSE);
-
-  aop = AOP (op);
-  if (aop->type == AOP_REG)
-    {
-      int i;
-      for (i = 0; i < aop->size; i++)
-       {
-         if (pairId == PAIR_DE)
-           {
-             emit2 ("; name %s", aop->aopu.aop_reg[i]->name);
-             if (!strcmp (aop->aopu.aop_reg[i]->name, "e"))
-               ret++;
-             if (!strcmp (aop->aopu.aop_reg[i]->name, "d"))
-               ret++;
-           }
-         else
-           {
-             wassert (0);
-           }
-       }
-    }
-
-  freeAsmop (IC_LEFT (ic), NULL, ic);
-  return ret;
-}
 */
index b73194467e77411bc03e57bf862bcc99681d105f..aa8d569c15f16641d644652b6912a8138f2068db 100644 (file)
@@ -68,11 +68,22 @@ _reset_regparm ()
 static int
 _reg_parm (sym_link * l)
 {
-  if (regParmFlg == 2)
-    return 0;
-
-  regParmFlg++;
-  return 1;
+  if (options.noRegParams) 
+    {
+      return FALSE;
+    }
+  else 
+    {
+      if (regParmFlg == 2)
+        {
+          return FALSE;
+        }
+      else
+        {
+          regParmFlg++;
+          return TRUE;
+        }
+    }
 }
 
 static bool
@@ -262,7 +273,7 @@ _setDefaultOptions (void)
   options.mainreturn = 1;
   /* first the options part */
   options.intlong_rent = 1;
-
+  options.noRegParams = 1;
   /* Default code and data locations. */
   options.code_loc = 0x200;
   options.data_loc = 0x8000;
@@ -276,6 +287,49 @@ _setDefaultOptions (void)
   optimize.loopInduction = 0;
 }
 
+/* Mangaling format:
+    _fun_policy_params
+    where:
+      policy is the function policy
+      params is the parameter format
+
+   policy format:
+    rs
+    where:
+      r is 'r' for reentrant, 's' for static functions
+      s is 'c' for callee saves, 'r' for caller saves
+    examples:
+      rr - reentrant, caller saves
+   params format:
+    A combination of register short names and s to signify stack variables.
+    examples:
+      bds - first two args appear in BC and DE, the rest on the stack
+      s - all arguments are on the stack.
+*/
+static char *
+_mangleSupportFunctionName(char *original)
+{
+  char buffer[128];
+
+  if (TARGET_IS_Z80) 
+    {
+      if (options.noRegParams) 
+        {
+          sprintf(buffer, "%s_rr_s", original);
+        }
+      else 
+        {
+          sprintf(buffer, "%s_rr_bds", original);
+        }
+    }
+  else 
+    {
+      strcpy(buffer, original);
+    }
+
+  return gc_strdup(buffer);
+}
+
 static const char *
 _getRegName (struct regs *reg)
 {
@@ -457,7 +511,7 @@ PORT z80_port =
   },
     /* Z80 has no native mul/div commands */
   {
-    0, 2
+    0, 0
   },
   "_",
   _z80_init,
@@ -472,6 +526,7 @@ PORT z80_port =
   _reset_regparm,
   _reg_parm,
   _process_pragma,
+  _mangleSupportFunctionName,
   TRUE,
   0,                           /* leave lt */
   0,                           /* leave gt */
@@ -549,6 +604,7 @@ PORT gbz80_port =
   _reset_regparm,
   _reg_parm,
   _process_pragma,
+  NULL,
   TRUE,
   0,                           /* leave lt */
   0,                           /* leave gt */
index 8727764106985639ff5f1556466722e2c09747aa..e61aaadab6df19042bc64fbd7d65b6540a99b05a 100644 (file)
@@ -60,13 +60,9 @@ static const ASM_MAPPING _asxxxx_z80_mapping[] = {
                "push\tix\n"
                "\tld\tix,#0\n"
                "\tadd\tix,sp\n"
-                "\tld\tb,h\n"
-                "\tld\tc,l\n"
                "\tld\thl,#-%d\n"
                "\tadd\thl,sp\n"
                "\tld\tsp,hl\n" 
-                "\tld\th,b\n"
-               "\tld\tl,c"
         },
     { "leave", 
                "pop\tix\n"
index 76ef1194fae1a69b104e5f3686aa669de8507f17..3d964752649cfba41717aa4db79d31c2afad6499 100644 (file)
@@ -1187,6 +1187,12 @@ rUmaskForOp (operand * op)
   return rumask;
 }
 
+bitVect *
+z80_rUmaskForOp (operand * op)
+{
+  return rUmaskForOp (op);
+}
+
 /** Returns bit vector of registers used in iCode.
  */
 bitVect *
index 23b7551b12f846df7995843e0c5f6459b782fd7d..2180614276b39131c3c7b92a59b6a010a53eb9d0 100644 (file)
@@ -70,5 +70,6 @@ void assignRegisters (eBBlock **, int);
 regs *regWithIdx (int);
 
 void z80_assignRegisters (eBBlock ** ebbs, int count);
+bitVect *z80_rUmaskForOp (operand * op);
 
 #endif
index bdb070da809fbc588cb7d4222851afb8b90f00d2..934de057e7f48ca142c38407010e5731d1d2a0ff 100644 (file)
@@ -1,32 +1,27 @@
 # Simple Makefile for dhrystone and sdcc
+TOPDIR = ../../..
 
 PROC = z80
-PORT = consolez80
 
-CC = /home/michaelh/projects/gbdk-support/lcc/lcc
+CC = $(TOPDIR)/bin/sdcc
+
 # -DNOENUM is here to make the results more predictable
-CFLAGS = -Wl-m -mz80/consolez80 -Wf--dumpall -v --prefix=/home/michaelh/projects/gbdk-current/
-CFLAGS += -DREG= -DNOSTRUCTASSIGN -DNOENUM
-LIBDIR = /home/michaelh/projects/gbdk-lib/build/
-LD = link-$(PROC)
-LDFLAGS = -v
-AS = as-$(PROC)
+CFLAGS += -DREG= -DNOSTRUCTASSIGN -DNOENUM -V -m$(PROC)
 
 OBJ = dhry.o
 
-all: dhry
+all: dhry.ihx
+
+dhry.ihx: dhry.c
+       $(CC) $(CFLAGS) dhry.c
 
-dhry: dhry.s $(OBJ)
-       -$(CC) $(CFLAGS) -o dhry.gb dhry.o
-       cat dhry.ihx | ../../makebin/makebin  > dhry.rom
+dhry.c: dhry.h
 
-dhry.s: dhry.c
-       $(CC) $(CFLAGS) -S -o dhry.s dhry.c
+dhry.bin: dhry.ihx
+       cat $< | ../../makebin/makebin > $@
 
 native:
        gcc -g -O2 -DREG= -DNOSTRUCTASSIGN -DNOENUM -o dhry dhry.c
 
-dhry.c:
-
 clean:
-       rm -f *~ dhry *.o *.gb
+       rm -f *~ dhry *.o *.gb *.ihx *.rel
index 35f446726c50d3bc3c8a79a9d326106d17fecd0e..0180c661d520043bc19ecb7856e9c4ab8ca638e4 100644 (file)
 /** For printf */
 #include <stdio.h>
 
-#ifdef SDCC_ds390
+#if defined(SDCC_ds390)
 #include <tinibios.h>
 #define clock() ClockTicks()
 #define CLOCKS_PER_SEC 1000
 #undef PRINT_T_STATES
 #define memcpy(d,s,l) memcpyx(d,s,l)
+
+#elif defined(__z80)
+int _clock(void);
+#define clock _clock
+#define CLOCKS_PER_SEC 10
+
 #else
 /** For clock() */
 #include <time.h>
@@ -70,7 +76,7 @@ void _printTStates(void);
 
 /** Set to one to print more messages about expected values etc. 
  */
-#define DEBUG  0
+#define DEBUG  1
 
 #if DEBUG
 #define DPRINTF(_a) printf _a
@@ -282,7 +288,7 @@ int main(void)
     printf ("        should be:   DHRYSTONE PROGRAM, 2'ND STRING\n");
     printf ("\n");
 #endif
-    printf("Dhrystones/s = %lu\n", (unsigned long)Number_Of_Runs / (runTime/CLOCKS_PER_SEC));
+    //    printf("Dhrystones/s = %lu\n", (unsigned long)Number_Of_Runs / (runTime/CLOCKS_PER_SEC));
     printf("MIPS = d/s/1757 = (sigh, need floats...)\n");
 #ifdef PRINT_T_STATES    
     _printTStates();