From 02523045dcb28c8f6ad794a84e32beff214be424 Mon Sep 17 00:00:00 2001 From: ggn Date: Wed, 7 Sep 2016 13:00:55 +0300 Subject: [PATCH] Removed -w flag, added +o[n], ~o[n] switches to control individual optimisations on/off, as well as +oall, ~oall for all optimisations. Signed-off-by: Shamus Hammons --- eagen0.c | 2 +- mach.c | 4 ++-- parmode.h | 2 +- rmac.c | 52 +++++++++++++++++++++++++++++++++++++++++++++------- rmac.h | 12 +++++++++++- 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/eagen0.c b/eagen0.c index 8ac72ed..7ec6ccb 100644 --- a/eagen0.c +++ b/eagen0.c @@ -39,7 +39,7 @@ int eaNgen(WORD siz) if (tdb) rmark(cursect, sloc, tdb, MWORD, NULL); - if ((v == 0) && optim_flag) + if ((v == 0) && optim_flags[OPT_INDIRECT_DISP]) { // If expr is 0, size optimise the opcode. // Generally the lower 6 bits of the opcode diff --git a/mach.c b/mach.c index be17c79..7c91979 100644 --- a/mach.c +++ b/mach.c @@ -434,7 +434,7 @@ int m_move(WORD inst, WORD size) int siz = (int)size; // Try to optimize to MOVEQ - if (optim_flag && siz == SIZL && am0 == IMMED && am1 == DREG + if (optim_flags[OPT_MOVEL_MOVEQ] && siz == SIZL && am0 == IMMED && am1 == DREG && (a0exattr & (TDB|DEFINED)) == DEFINED && a0exval + 0x80 < 0x100) { m_moveq((WORD)0x7000, (WORD)0); @@ -553,7 +553,7 @@ int m_br(WORD inst, WORD siz) // Optimize branch instr. size if (siz == SIZN) { - if (optim_flag && v != 0 && v + 0x80 < 0x100) + if (optim_flags[OPT_BSR_BCC_S] && v != 0 && v + 0x80 < 0x100) { // Fits in .B inst |= v & 0xFF; diff --git a/parmode.h b/parmode.h index 521f787..c003523 100644 --- a/parmode.h +++ b/parmode.h @@ -257,7 +257,7 @@ CHK_FOR_DISPn: // Defined, absolute values from $FFFF8000..$00007FFF get optimized // to absolute short - if (optim_flag && (AnEXATTR & (TDB|DEFINED)) == DEFINED && (AnEXVAL + 0x8000) < 0x10000) + if (optim_flags[OPT_ABS_SHORT] && (AnEXATTR & (TDB|DEFINED)) == DEFINED && (AnEXVAL + 0x8000) < 0x10000) { AMn = ABSW; diff --git a/rmac.c b/rmac.c index ee8d9ee..280b597 100644 --- a/rmac.c +++ b/rmac.c @@ -45,7 +45,7 @@ char * firstfname; // First source filename char * cmdlnexec; // Executable name, pointer to ARGV[0] char * searchpath; // Search path for include files char defname[] = "noname.o"; // Default output filename -int optim_flag; // Optimise all the things! +int optim_flags[OPT_COUNT]; // Specific optimisations on/off matrix // // Manipulate file extension. @@ -132,6 +132,10 @@ void DisplayHelp(void) " -l[filename] Create an output listing file\n" " -n Don't do things behind your back in RISC assembler\n" " -o file Output file name\n" + " +o[value] Turn a specific optimisation on\n" + " ~o[value] Turn a specific optimisation off\n" + " +oall Turn all optimisations on\n" + " ~oall Turn all optimisations off\n" " -p Create an ST .prg (without symbols)\n" " -ps Create an ST .prg (with symbols)\n" " Forces -fa\n" @@ -144,7 +148,6 @@ void DisplayHelp(void) " -s Warn about possible short branches\n" " and applied optimisations\n" " -u Force referenced and undefined symbols global\n" - " -w Turn off optimisations done automatically\n" " -v Set verbose mode\n" " -x Turn on debugging mode\n" " -y[pagelen] Set page line length (default: 61)\n" @@ -203,7 +206,6 @@ int Process(int argc, char ** argv) orgactive = 0; // Not in RISC org section orgwarning = 0; // No ORG warning issued segpadsize = 2; // Initialise segment padding size - optim_flag = 1; // Automatically optimise // Initialise modules InitSymbolTable(); // Symbol table @@ -361,10 +363,6 @@ int Process(int argc, char ** argv) DisplayVersion(); break; - case 'w': - case 'W': - optim_flag=0; - break; case 'x': // Turn on debugging case 'X': debug = 1; @@ -409,6 +407,38 @@ int Process(int argc, char ** argv) break; } } + else if (*argv[argno] == '+' || *argv[argno] == '~') + { + int onoff = 0; + if (*argv[argno] == '+') + onoff = 1; + if ((argv[argno][2] == 'a' || argv[argno][2] == 'A') && + (argv[argno][3] == 'l' || argv[argno][3] == 'L') && + (argv[argno][4] == 'l' || argv[argno][4] == 'L')) + memset(optim_flags, onoff, OPT_COUNT * sizeof(int)); + else if (argv[argno][1] == 'o' || argv[argno][1] == 'O') // Turn on specific optimisation + { + int opt_no = atoi(&argv[argno][2]); + if (opt_no>=0 && opt_no