From: michaelh Date: Mon, 16 Jul 2001 15:14:10 +0000 (+0000) Subject: * Fixed va_args for the z80 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=fc4727437bf580144b7373bc377ad7734509929d;p=fw%2Fsdcc * Fixed va_args for the z80 * 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 --- diff --git a/device/include/stdarg.h b/device/include/stdarg.h index c6517694..f4ba9da4 100644 --- a/device/include/stdarg.h +++ b/device/include/stdarg.h @@ -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))) diff --git a/device/lib/gbz80/Makefile b/device/lib/gbz80/Makefile index 33cabdc8..41dc95e7 100644 --- a/device/lib/gbz80/Makefile +++ b/device/lib/gbz80/Makefile @@ -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: diff --git a/device/lib/gbz80/printf.c b/device/lib/gbz80/printf.c index 33d7050e..346eb3f1 100644 --- a/device/lib/gbz80/printf.c +++ b/device/lib/gbz80/printf.c @@ -2,27 +2,13 @@ Again a stub - will use the std one later... */ +#include #include -#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; } diff --git a/device/lib/z80/Makefile b/device/lib/z80/Makefile index fc041ce4..065e39f8 100644 --- a/device/lib/z80/Makefile +++ b/device/lib/z80/Makefile @@ -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: diff --git a/device/lib/z80/div.s b/device/lib/z80/div.s index 126b6f25..92d2ee2f 100644 --- a/device/lib/z80/div.s +++ b/device/lib/z80/div.s @@ -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:: diff --git a/device/lib/z80/mul.s b/device/lib/z80/mul.s index 9c33ac30..92e0ceba 100644 --- a/device/lib/z80/mul.s +++ b/device/lib/z80/mul.s @@ -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 diff --git a/device/lib/z80/printf.c b/device/lib/z80/printf.c index 1ee76cbc..d584bdb8 100644 --- a/device/lib/z80/printf.c +++ b/device/lib/z80/printf.c @@ -2,25 +2,15 @@ Again a stub - will use the std one later... */ -#define NULL 0 +#include +#include -/* 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; } diff --git a/device/lib/z80/putchar.s b/device/lib/z80/putchar.s index df1954b7..91e166d9 100644 --- a/device/lib/z80/putchar.s +++ b/device/lib/z80/putchar.s @@ -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 diff --git a/src/SDCCglobl.h b/src/SDCCglobl.h index b83b5282..a12cea74 100644 --- a/src/SDCCglobl.h +++ b/src/SDCCglobl.h @@ -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 *); diff --git a/src/SDCCmain.c b/src/SDCCmain.c index e7f76a53..aff6322f 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -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') diff --git a/src/SDCCopt.c b/src/SDCCopt.c index c6160ccf..8ed9c597 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -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; diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 9ff910f0..9db4cf03 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -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]); diff --git a/src/avr/main.c b/src/avr/main.c index 6685a116..5ddc571e 100644 --- a/src/avr/main.c +++ b/src/avr/main.c @@ -203,6 +203,7 @@ PORT avr_port = { _avr_genIVT, _avr_reset_regparm, _avr_regparm, + NULL, NULL, FALSE, 0, /* leave lt */ diff --git a/src/avr/peeph.rul b/src/avr/peeph.rul index e69de29b..c40a8781 100644 --- a/src/avr/peeph.rul +++ b/src/avr/peeph.rul @@ -0,0 +1,1676 @@ +/* Generated file, DO NOT Edit! */ +/* To Make changes to rules edit */ +/* /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" diff --git a/src/ds390/main.c b/src/ds390/main.c index fb90dbb4..1301e603 100644 --- a/src/ds390/main.c +++ b/src/ds390/main.c @@ -263,6 +263,7 @@ PORT ds390_port = _ds390_reset_regparm, _ds390_regparm, NULL, + NULL, FALSE, 0, /* leave lt */ 0, /* leave gt */ diff --git a/src/izt/i186.c b/src/izt/i186.c index 8da5f082..231a7aeb 100644 --- a/src/izt/i186.c +++ b/src/izt/i186.c @@ -197,6 +197,7 @@ PORT i186_port = { _i186_reset_regparm, _i186_regparm, NULL, + NULL, FALSE, 0, /* leave lt */ 0, /* leave gt */ diff --git a/src/izt/tlcs900h.c b/src/izt/tlcs900h.c index fc259061..addb8597 100644 --- a/src/izt/tlcs900h.c +++ b/src/izt/tlcs900h.c @@ -196,6 +196,7 @@ PORT tlcs900h_port = _tlcs900h_reset_regparm, _tlcs900h_regparm, NULL, + NULL, FALSE, 0, /* leave lt */ 0, /* leave gt */ diff --git a/src/mcs51/main.c b/src/mcs51/main.c index f2ced3e2..f7af7756 100644 --- a/src/mcs51/main.c +++ b/src/mcs51/main.c @@ -203,6 +203,7 @@ PORT mcs51_port = _mcs51_reset_regparm, _mcs51_regparm, NULL, + NULL, FALSE, 0, /* leave lt */ 0, /* leave gt */ diff --git a/src/pic/main.c b/src/pic/main.c index 2e41a00e..d2222421 100644 --- a/src/pic/main.c +++ b/src/pic/main.c @@ -287,6 +287,7 @@ PORT pic_port = _pic14_reset_regparm, _pic14_regparm, NULL, + NULL, FALSE, 0, /* leave lt */ 0, /* leave gt */ diff --git a/src/port.h b/src/port.h index 0e6459b7..9bf97e49 100644 --- a/src/port.h +++ b/src/port.h @@ -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; diff --git a/src/z80/gen.c b/src/z80/gen.c index 424ee710..ea69f7c1 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -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; -} */ diff --git a/src/z80/main.c b/src/z80/main.c index b7319446..aa8d569c 100644 --- a/src/z80/main.c +++ b/src/z80/main.c @@ -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 */ diff --git a/src/z80/mappings.i b/src/z80/mappings.i index 87277641..e61aaada 100644 --- a/src/z80/mappings.i +++ b/src/z80/mappings.i @@ -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" diff --git a/src/z80/ralloc.c b/src/z80/ralloc.c index 76ef1194..3d964752 100644 --- a/src/z80/ralloc.c +++ b/src/z80/ralloc.c @@ -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 * diff --git a/src/z80/ralloc.h b/src/z80/ralloc.h index 23b7551b..21806142 100644 --- a/src/z80/ralloc.h +++ b/src/z80/ralloc.h @@ -70,5 +70,6 @@ void assignRegisters (eBBlock **, int); regs *regWithIdx (int); void z80_assignRegisters (eBBlock ** ebbs, int count); +bitVect *z80_rUmaskForOp (operand * op); #endif diff --git a/support/tests/dhrystone/Makefile b/support/tests/dhrystone/Makefile index bdb070da..934de057 100644 --- a/support/tests/dhrystone/Makefile +++ b/support/tests/dhrystone/Makefile @@ -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 diff --git a/support/tests/dhrystone/dhry.c b/support/tests/dhrystone/dhry.c index 35f44672..0180c661 100644 --- a/support/tests/dhrystone/dhry.c +++ b/support/tests/dhrystone/dhry.c @@ -48,12 +48,18 @@ /** For printf */ #include -#ifdef SDCC_ds390 +#if defined(SDCC_ds390) #include #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 @@ -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();