From 2c2a3e86240f026f29708ca8118ffa5cd745db08 Mon Sep 17 00:00:00 2001 From: epetrich Date: Fri, 10 Sep 2004 06:38:16 +0000 Subject: [PATCH] * src/SDCC.lex (doPragma, process_pragma), * src/SDCCglobl.h (struct optimize): added pragmas "opt_code_speed", "opt_code_size", and "opt_code_balanced" * src/SDCCmain.c (optionsTable[], printOptions, scanOptionsTable): regrouped options by category, added support for category headers * src/SDCCmain.c (parseCmdLine): added options "--opt-code-speed" and "--opt-code-size" * doc/sdccman.lyx: documented these new options and pragmas * src/hc08/gen.c (AccLsh, AccRsh): take speed/size optimization preference into account git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3487 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 13 ++++ doc/sdccman.lyx | 80 +++++++++++++++++++++- src/SDCC.lex | 24 ++++++- src/SDCCglobl.h | 2 + src/SDCCmain.c | 176 ++++++++++++++++++++++++++++++------------------ src/hc08/gen.c | 8 +++ 6 files changed, 234 insertions(+), 69 deletions(-) diff --git a/ChangeLog b/ChangeLog index c8c59d5b..7feea489 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-09-10 Erik Petrich + + * src/SDCC.lex (doPragma, process_pragma), + * src/SDCCglobl.h (struct optimize): added pragmas "opt_code_speed", + "opt_code_size", and "opt_code_balanced" + * src/SDCCmain.c (optionsTable[], printOptions, scanOptionsTable): + regrouped options by category, added support for category headers + * src/SDCCmain.c (parseCmdLine): added options "--opt-code-speed" + and "--opt-code-size" + * doc/sdccman.lyx: documented these new options and pragmas + * src/hc08/gen.c (AccLsh, AccRsh): take speed/size optimization + preference into account + 2004-09-08 Maarten Brock * src/SDCCicode.c (geniCodePostInc, geniCodePreInc, geniCodePostDec, diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx index 9a61f476..362c3e5b 100644 --- a/doc/sdccman.lyx +++ b/doc/sdccman.lyx @@ -6698,7 +6698,7 @@ status Collapsed \series default - Pass the inline assembler code through the peep hole optimizer. + Pass the inline assembler code through the peep hole optimizer. This can cause unexpected changes to inline assembler code, please go through the peephole optimizer \begin_inset LatexCommand \index{Peephole optimizer} @@ -6707,6 +6707,54 @@ status Collapsed rules defined in the source file tree '/peeph.def' before using this option. +\layout List +\labelwidthstring 00.00.0000 + + +\series bold +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-opt-code-speed +\begin_inset LatexCommand \index{-\/-opt-code-speed} + +\end_inset + + +\series default + The compiler will optimize code generation towards fast code, possibly + at the expense of code size. +\layout List +\labelwidthstring 00.00.0000 + + +\series bold +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-opt-code-size +\begin_inset LatexCommand \index{-\/-opt-code-size} + +\end_inset + + +\series default + The compiler will optimize code generation towards compact code, possibly + at the expense of code speed. \layout Subsection Other Options @@ -6938,7 +6986,7 @@ callee_saves \series bold - \begin_inset ERT -status Open +status Collapsed \layout Standard @@ -14216,6 +14264,34 @@ status Collapsed \end_inset Parameters and Local Variables. +\layout Itemize + +opt_code_speed +\begin_inset LatexCommand \index{\#pragma opt_code_speed} + +\end_inset + +- The compiler will optimize code generation towards fast code, possibly + at the expense of code size. +\layout Itemize + +opt_code_size +\begin_inset LatexCommand \index{\#pragma opt_code_size} + +\end_inset + +- The compiler will optimize code generation towards compact code, possibly + at the expense of code speed. +\layout Itemize + +opt_code_balanced +\begin_inset LatexCommand \index{\#pragma opt_code_balanced} + +\end_inset + +- The compiler will attempt to generate code that is both compact and fast, + as long as meeting one goal is not a detriment to the other. + \layout Standard SDCPP supports the following #pragma directives: diff --git a/src/SDCC.lex b/src/SDCC.lex index 5f05a2a8..3564dd79 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -416,7 +416,10 @@ enum pragma_id { P_LOOPREV, P_OVERLAY_, /* I had a strange conflict with P_OVERLAY while */ /* cross-compiling for MINGW32 with gcc 3.2 */ - P_DISABLEWARN + P_DISABLEWARN, + P_OPTCODESPEED, + P_OPTCODESIZE, + P_OPTCODEBALANCED }; @@ -570,6 +573,22 @@ static void doPragma(int op, char *cp) setWarningDisabled(i); } break; + + case P_OPTCODESPEED: + optimize.codeSpeed = 1; + optimize.codeSize = 0; + break; + + case P_OPTCODESIZE: + optimize.codeSpeed = 0; + optimize.codeSize = 1; + break; + + case P_OPTCODEBALANCED: + optimize.codeSpeed = 0; + optimize.codeSize = 0; + break; + } } @@ -601,6 +620,9 @@ static int process_pragma(char *s) { "overlay", P_OVERLAY_, 0 }, { "less_pedantic", P_LESSPEDANTIC, 0 }, { "disable_warning",P_DISABLEWARN, 0 }, + { "opt_code_speed", P_OPTCODESPEED, 0 }, + { "opt_code_size", P_OPTCODESIZE, 0 }, + { "opt_code_balanced", P_OPTCODEBALANCED, 0 }, /* * The following lines are deprecated pragmas, diff --git a/src/SDCCglobl.h b/src/SDCCglobl.h index 3643e5f4..93a85f33 100644 --- a/src/SDCCglobl.h +++ b/src/SDCCglobl.h @@ -155,6 +155,8 @@ struct optimize unsigned loopInduction; unsigned noJTabBoundary; unsigned noLoopReverse; + unsigned codeSpeed; + unsigned codeSize; }; /** Build model. diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 784f2913..7503d9f9 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -130,11 +130,16 @@ char buffer[PATH_MAX * 2]; #define OPTION_STACK_SIZE "--stack-size" #define OPTION_PACK_IRAM "--pack-iram" #define OPTION_NO_PEEP_COMMENTS "--no-peep-comments" +#define OPTION_OPT_CODE_SPEED "--opt-code-speed" +#define OPTION_OPT_CODE_SIZE "--opt-code-size" static const OPTION optionsTable[] = { - { 'm', NULL, NULL, "Set the port to use e.g. -mz80." }, - { 'p', NULL, NULL, "Select port specific processor e.g. -mpic14 -p16f84" }, + { 0, NULL, NULL, "General options" }, + { 0, "--help", NULL, "Display this help" }, + { 'v', OPTION_VERSION, NULL, "Display sdcc's version" }, + { 0, "--verbose", &options.verbose, "Trace calls to the preprocessor, assembler, and linker" }, + { 'V', NULL, &options.verboseExec, "Execute verbosely. Show sub commands as they are run" }, { 'd', NULL, NULL, NULL }, { 'D', NULL, NULL, "Define macro as in -Dmacro" }, { 'I', NULL, NULL, "Add to the include (*.h) path, as in -Ipath" }, @@ -142,11 +147,25 @@ optionsTable[] = { { 'U', NULL, NULL, NULL }, { 'C', NULL, NULL, "Preprocessor option" }, { 'M', NULL, NULL, "Preprocessor option" }, - { 'V', NULL, &options.verboseExec, "Execute verbosely. Show sub commands as they are run" }, - { 'S', NULL, &noAssemble, "Compile only; do not assemble or link" }, { 'W', NULL, NULL, "Pass through options to the pre-processor (p), 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" }, + { 'S', NULL, &noAssemble, "Compile only; do not assemble or link" }, + { 'c', "--compile-only", &options.cc_only, "Compile and assemble, but do not link" }, + { 'E', "--preprocessonly", &preProcOnly, "Preprocess only, do not compile" }, + { 0, "--c1mode", &options.c1mode, "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." }, + { 'o', NULL, NULL, "Place the output into the given path resp. file" }, + { 0, OPTION_PRINT_SEARCH_DIRS, &options.printSearchDirs, "display the directories in the compiler's search path"}, + { 0, OPTION_MSVC_ERROR_STYLE, &options.vc_err_style, "messages are compatible with Micro$oft visual studio"}, + { 0, OPTION_USE_STDOUT, &options.use_stdout, "send errors to stdout instead of stderr"}, + { 0, "--nostdlib", &options.nostdlib, "Do not include the standard library directory in the search path" }, + { 0, "--nostdinc", &options.nostdinc, "Do not include the standard include directory in the search path" }, + { 0, OPTION_LESS_PEDANTIC, NULL, "Disable some of the more pedantic warnings" }, + { 0, OPTION_DISABLE_WARNING, NULL, " Disable specific warning" }, + { 0, "--debug", &options.debug, "Enable debugging symbol output" }, + { 0, "--cyclomatic", &options.cyclomatic, "Display complexity of compiled functions" }, + + { 0, NULL, NULL, "Code generation options"}, + { 'm', NULL, NULL, "Set the port to use e.g. -mz80." }, + { 'p', NULL, NULL, "Select port specific processor e.g. -mpic14 -p16f84" }, { 0, OPTION_LARGE_MODEL, NULL, "external data space is used" }, { 0, OPTION_MEDIUM_MODEL, NULL, "not supported" }, { 0, OPTION_SMALL_MODEL, NULL, "internal data space is used (default)" }, @@ -159,57 +178,11 @@ optionsTable[] = { { 0, "--stack-10bit", &options.stack10bit, "use the 10bit stack for ds390 (default)" }, #endif { 0, "--xstack", &options.useXstack, "Use external stack" }, - { 0, OPTION_NO_GCSE, NULL, "Disable the GCSE optimisation" }, - { 0, OPTION_NO_LABEL_OPT, NULL, "Disable label optimisation" }, - { 0, OPTION_NO_LOOP_INV, NULL, "Disable optimisation of invariants" }, - { 0, OPTION_NO_LOOP_IND, NULL, NULL }, - { 0, "--nojtbound", &optimize.noJTabBoundary, "Don't generate boundary check for jump tables" }, - { 0, "--noloopreverse", &optimize.noLoopReverse, "Disable the loop reverse optimisation" }, - { 'c', "--compile-only", &options.cc_only, "Compile and assemble, but do not link" }, - { 'o', NULL, NULL, "Place the output into the given path resp. file" }, - { 0, "--dumpraw", &options.dump_raw, "Dump the internal structure after the initial parse" }, - { 0, "--dumpgcse", &options.dump_gcse, NULL }, - { 0, "--dumploop", &options.dump_loop, NULL }, - { 0, "--dumpdeadcode", &options.dump_kill, NULL }, - { 0, "--dumpliverange", &options.dump_range, NULL }, - { 0, "--dumpregpack", &options.dump_pack, NULL }, - { 0, "--dumpregassign", &options.dump_rassgn, NULL }, - { 0, "--dumptree", &options.dump_tree, "dump front-end AST before generating iCode" }, - { 0, OPTION_DUMP_ALL, NULL, "Dump the internal structure at all stages" }, - { 0, OPTION_XRAM_LOC, NULL, " External Ram start location" }, - { 0, OPTION_XRAM_SIZE, NULL, " External Ram size" }, - { 0, OPTION_IRAM_SIZE, NULL, " Internal Ram size" }, - { 0, OPTION_XSTACK_LOC, NULL, " External Ram start location" }, - { 0, OPTION_CODE_LOC, NULL, " Code Segment Location" }, - { 0, OPTION_CODE_SIZE, NULL, " Code Segment size" }, - { 0, OPTION_STACK_LOC, NULL, " Stack pointer initial value" }, - { 0, OPTION_DATA_LOC, NULL, " Direct data start location" }, - { 0, OPTION_IDATA_LOC, NULL, NULL }, - { 0, OPTION_PEEP_FILE, NULL, " use this extra peep-hole file" }, - { 0, OPTION_LIB_PATH, NULL, " use this path to search for libraries" }, { 0, "--int-long-reent", &options.intlong_rent, "Use reenterant calls on the int and long support functions" }, { 0, "--float-reent", &options.float_rent, "Use reenterant calls on the float support functions" }, - { 0, OPTION_OUT_FMT_IHX, NULL, NULL }, - { 0, "--out-fmt-s19", &options.out_fmt, NULL }, - { 0, "--cyclomatic", &options.cyclomatic, NULL }, - { 0, "--nooverlay", &options.noOverlay, NULL }, { 0, "--main-return", &options.mainreturn, "Issue a return after main()" }, { 0, "--xram-movc", &options.xram_movc, "Use movc instead of movx to read xram (xdata)" }, - { 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" }, - { 'E', "--preprocessonly", &preProcOnly, "Preprocess only, do not compile" }, - { 0, "--c1mode", &options.c1mode, "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." }, - { 0, "--help", NULL, "Display this help" }, { 0, OPTION_CALLEE_SAVES, NULL, " Cause the called function to save registers insted of the caller" }, - { 0, "--nostdlib", &options.nostdlib, "Do not include the standard library directory in the search path" }, - { 0, "--nostdinc", &options.nostdinc, "Do not include the standard include directory in the search path" }, - { 0, "--verbose", &options.verbose, "Trace calls to the preprocessor, assembler, and linker" }, - { 0, OPTION_LESS_PEDANTIC, NULL, "Disable some of the more pedantic warnings" }, - { 0, OPTION_DISABLE_WARNING, NULL, " Disable specific warning" }, - { 0, OPTION_SHORT_IS_8BITS, NULL, "Make short 8bits (for old times sake)" }, { 0, "--profile", &options.profile, "On supported ports, generate extra profiling information" }, { 0, "--fommit-frame-pointer", &options.ommitFramePtr, "Leave out the frame pointer." }, { 0, "--all-callee-saves", &options.all_callee_saves, "callee will always save registers used" }, @@ -225,19 +198,62 @@ optionsTable[] = { #endif #if !OPT_DISABLE_DS390 || !OPT_DISABLE_MCS51 { 0, "--parms-in-bank1", &options.parms_in_bank1,"MCS51/DS390 - use Bank1 for parameter passing"}, - { 0, OPTION_STACK_SIZE, NULL,"MCS51/DS390 - Tells the linker to allocate this space for stack"}, - { 0, OPTION_PACK_IRAM, &options.pack_iram,"MCS51/DS390 - Tells the linker to pack variables in internal ram"}, #endif { 0, OPTION_NO_XINIT_OPT, &options.noXinitOpt, "don't memcpy initialized xram from code"}, { 0, OPTION_NO_CCODE_IN_ASM, &options.noCcodeInAsm, "don't include c-code as comments in the asm file"}, - { 0, OPTION_ICODE_IN_ASM, &options.iCodeInAsm, "include i-code as comments in the asm file"}, { 0, OPTION_NO_PEEP_COMMENTS, &options.noPeepComments, "don't include peephole optimizer comments"}, - { 0, OPTION_PRINT_SEARCH_DIRS, &options.printSearchDirs, "display the directories in the compiler's search path"}, - { 0, OPTION_MSVC_ERROR_STYLE, &options.vc_err_style, "messages are compatible with Micro$oft visual studio"}, - { 0, OPTION_USE_STDOUT, &options.use_stdout, "send errors to stdout instead of stderr"}, #if !OPT_DISABLE_Z80 || !OPT_DISABLE_GBZ80 { 0, "--no-std-crt0", &options.no_std_crt0, "For the z80/gbz80 do not link default crt0.o"}, #endif + { 0, OPTION_SHORT_IS_8BITS, NULL, "Make short 8 bits (for old times sake)" }, + + { 0, NULL, NULL, "Optimization options"}, + { 0, "--nooverlay", &options.noOverlay, "Disable overlaying leaf function auto variables" }, + { 0, OPTION_NO_GCSE, NULL, "Disable the GCSE optimisation" }, + { 0, OPTION_NO_LABEL_OPT, NULL, "Disable label optimisation" }, + { 0, OPTION_NO_LOOP_INV, NULL, "Disable optimisation of invariants" }, + { 0, OPTION_NO_LOOP_IND, NULL, "Disable loop variable induction" }, + { 0, "--nojtbound", &optimize.noJTabBoundary, "Don't generate boundary check for jump tables" }, + { 0, "--noloopreverse", &optimize.noLoopReverse, "Disable the loop reverse optimisation" }, + { 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, "Enable peephole optimization on inline assembly" }, + { 0, OPTION_PEEP_FILE, NULL, " use this extra peephole file" }, + { 0, OPTION_OPT_CODE_SPEED, NULL, "Optimize for code speed rather than size" }, + { 0, OPTION_OPT_CODE_SIZE, NULL, "Optimize for code size rather than speed" }, + + { 0, NULL, NULL, "Internal debugging options"}, + { 0, "--dumpraw", &options.dump_raw, "Dump the internal structure after the initial parse" }, + { 0, "--dumpgcse", &options.dump_gcse, NULL }, + { 0, "--dumploop", &options.dump_loop, NULL }, + { 0, "--dumpdeadcode", &options.dump_kill, NULL }, + { 0, "--dumpliverange", &options.dump_range, NULL }, + { 0, "--dumpregpack", &options.dump_pack, NULL }, + { 0, "--dumpregassign", &options.dump_rassgn, NULL }, + { 0, "--dumptree", &options.dump_tree, "dump front-end AST before generating iCode" }, + { 0, OPTION_DUMP_ALL, NULL, "Dump the internal structure at all stages" }, + { 0, OPTION_ICODE_IN_ASM, &options.iCodeInAsm, "include i-code as comments in the asm file"}, + + { 0, NULL, NULL, "Linker options" }, + { 'l', NULL, NULL, "Include the given library in the link" }, + { 'L', NULL, NULL, "Add the next field to the library search path" }, + { 0, OPTION_LIB_PATH, NULL, " use this path to search for libraries" }, + { 0, OPTION_OUT_FMT_IHX, NULL, "Output in Intel hex format" }, + { 0, "--out-fmt-s19", &options.out_fmt, "Output in S19 hex format" }, + { 0, OPTION_XRAM_LOC, NULL, " External Ram start location" }, + { 0, OPTION_XRAM_SIZE, NULL, " External Ram size" }, + { 0, OPTION_IRAM_SIZE, NULL, " Internal Ram size" }, + { 0, OPTION_XSTACK_LOC, NULL, " External Ram start location" }, + { 0, OPTION_CODE_LOC, NULL, " Code Segment Location" }, + { 0, OPTION_CODE_SIZE, NULL, " Code Segment size" }, + { 0, OPTION_STACK_LOC, NULL, " Stack pointer initial value" }, + { 0, OPTION_DATA_LOC, NULL, " Direct data start location" }, + { 0, OPTION_IDATA_LOC, NULL, NULL }, +#if !OPT_DISABLE_DS390 || !OPT_DISABLE_MCS51 + { 0, OPTION_STACK_SIZE, NULL,"MCS51/DS390 - Tells the linker to allocate this space for stack"}, + { 0, OPTION_PACK_IRAM, &options.pack_iram,"MCS51/DS390 - Tells the linker to pack variables in internal ram"}, +#endif + /* End of options */ { 0, NULL } }; @@ -440,14 +456,25 @@ static void printOptions(const OPTION *optionsTable) { int i; - for (i = 0; optionsTable[i].shortOpt != 0 || optionsTable[i].longOpt != NULL; i++) + for (i = 0; + optionsTable[i].shortOpt != 0 || optionsTable[i].longOpt != NULL + || optionsTable[i].help != NULL; + i++) { - fprintf(stdout, " %c%c %-20s %s\n", - optionsTable[i].shortOpt !=0 ? '-' : ' ', - optionsTable[i].shortOpt !=0 ? optionsTable[i].shortOpt : ' ', - optionsTable[i].longOpt != NULL ? optionsTable[i].longOpt : "", - optionsTable[i].help != NULL ? optionsTable[i].help : "" - ); + if (!optionsTable[i].shortOpt && !optionsTable[i].longOpt + && optionsTable[i].help) + { + fprintf (stdout, "\n%s:\n", optionsTable[i].help); + } + else + { + fprintf(stdout, " %c%c %-20s %s\n", + optionsTable[i].shortOpt !=0 ? '-' : ' ', + optionsTable[i].shortOpt !=0 ? optionsTable[i].shortOpt : ' ', + optionsTable[i].longOpt != NULL ? optionsTable[i].longOpt : "", + optionsTable[i].help != NULL ? optionsTable[i].help : "" + ); + } } } @@ -739,7 +766,10 @@ static bool scanOptionsTable(const OPTION *optionsTable, char shortOpt, const char *longOpt, char **argv, int *pi) { int i; - for (i = 0; optionsTable[i].shortOpt != 0 || optionsTable[i].longOpt != NULL; i++) + for (i = 0; + optionsTable[i].shortOpt != 0 || optionsTable[i].longOpt != NULL + || optionsTable[i].help != NULL; + i++) { if (optionsTable[i].shortOpt == shortOpt || (longOpt && optionsTable[i].longOpt && @@ -997,6 +1027,20 @@ parseCmdLine (int argc, char **argv) continue; } + if (strcmp (argv[i], OPTION_OPT_CODE_SPEED) == 0) + { + optimize.codeSpeed = 1; + optimize.codeSize = 0; + continue; + } + + if (strcmp (argv[i], OPTION_OPT_CODE_SIZE) == 0) + { + optimize.codeSpeed = 0; + optimize.codeSize = 1; + continue; + } + if (strcmp (argv[i], OPTION_LESS_PEDANTIC) == 0) { options.lessPedantic = 1; diff --git a/src/hc08/gen.c b/src/hc08/gen.c index f799360b..2938ece6 100644 --- a/src/hc08/gen.c +++ b/src/hc08/gen.c @@ -5640,11 +5640,15 @@ AccLsh (int shCount) switch (shCount) { case 4: + if (optimize.codeSpeed) + break; accopWithMisc ("nsa", ""); accopWithMisc ("and", "#0xf0"); /* total: 5 cycles, 3 bytes */ return; case 5: + if (optimize.codeSpeed) + break; accopWithMisc ("nsa", ""); accopWithMisc ("and", "#0xf0"); accopWithMisc ("lsla", ""); @@ -5717,11 +5721,15 @@ AccRsh (int shCount, bool sign) switch (shCount) { case 4: + if (optimize.codeSpeed) + break; accopWithMisc ("nsa", ""); accopWithMisc ("and", "#0x0f"); /* total: 5 cycles, 3 bytes */ return; case 5: + if (optimize.codeSpeed) + break; accopWithMisc ("nsa", ""); accopWithMisc ("and", "#0x0f"); accopWithMisc ("lsra", ""); -- 2.30.2