* src/SDCC.lex (doPragma, process_pragma),
authorepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 10 Sep 2004 06:38:16 +0000 (06:38 +0000)
committerepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 10 Sep 2004 06:38:16 +0000 (06:38 +0000)
* 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
doc/sdccman.lyx
src/SDCC.lex
src/SDCCglobl.h
src/SDCCmain.c
src/hc08/gen.c

index c8c59d5bc173dc82107c9e53b8c5f3e0188c027d..7feea4892a7f4ec5e3327adbc6f185a4983a27e0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2004-09-10 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
+
+       * 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 <sourceforge.brock AT dse.nl>
 
        * src/SDCCicode.c (geniCodePostInc, geniCodePreInc, geniCodePostDec,
index 9a61f476daeade4175b3daf6106e57f34517e045..362c3e5bd18bcf67d2e4992a27012817df02b919 100644 (file)
@@ -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 '<target>/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:
index 5f05a2a8ce6ce42257ba2f0e8141eb7bc9c7139b..3564dd7936beac2a4f0b74340f2275da8ffd9b30 100644 (file)
@@ -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,
index 3643e5f4b063423fe97673dcee93862d9f09d47b..93a85f33a8226b05e6058a53d78a4339496750ce 100644 (file)
@@ -155,6 +155,8 @@ struct optimize
     unsigned loopInduction;
     unsigned noJTabBoundary;
     unsigned noLoopReverse;
+    unsigned codeSpeed;
+    unsigned codeSize;
   };
 
 /** Build model.
index 784f2913ced4504c09b9e25911367bb08c9a8df5..7503d9f9c971ccb9e833d595db069f0cab2a1f11 100644 (file)
@@ -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, "<nnnn> 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, "<nnnn> External Ram start location" },
-    { 0,    OPTION_XRAM_SIZE,       NULL, "<nnnn> External Ram size" },
-    { 0,    OPTION_IRAM_SIZE,       NULL, "<nnnn> Internal Ram size" },
-    { 0,    OPTION_XSTACK_LOC,      NULL, "<nnnn> External Ram start location" },
-    { 0,    OPTION_CODE_LOC,        NULL, "<nnnn> Code Segment Location" },
-    { 0,    OPTION_CODE_SIZE,       NULL, "<nnnn> Code Segment size" },
-    { 0,    OPTION_STACK_LOC,       NULL, "<nnnn> Stack pointer initial value" },
-    { 0,    OPTION_DATA_LOC,        NULL, "<nnnn> Direct data start location" },
-    { 0,    OPTION_IDATA_LOC,       NULL, NULL },
-    { 0,    OPTION_PEEP_FILE,       NULL, "<file> use this extra peep-hole file" },
-    { 0,    OPTION_LIB_PATH,        NULL, "<path> 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, "<func[,func,...]> 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, "<nnnn> 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, "<file> 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, "<path> 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, "<nnnn> External Ram start location" },
+    { 0,    OPTION_XRAM_SIZE,       NULL, "<nnnn> External Ram size" },
+    { 0,    OPTION_IRAM_SIZE,       NULL, "<nnnn> Internal Ram size" },
+    { 0,    OPTION_XSTACK_LOC,      NULL, "<nnnn> External Ram start location" },
+    { 0,    OPTION_CODE_LOC,        NULL, "<nnnn> Code Segment Location" },
+    { 0,    OPTION_CODE_SIZE,       NULL, "<nnnn> Code Segment size" },
+    { 0,    OPTION_STACK_LOC,       NULL, "<nnnn> Stack pointer initial value" },
+    { 0,    OPTION_DATA_LOC,        NULL, "<nnnn> 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;
index f799360b5a302291ffa2ed501ab45a6a361427ea..2938ece657accb5c4290d2ededf6a9332d1394ac 100644 (file)
@@ -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", "");