Removed -w flag, added +o[n], ~o[n] switches to control individual optimisations...
authorggn <ggn.dbug@gmail.com>
Wed, 7 Sep 2016 10:00:55 +0000 (13:00 +0300)
committerShamus Hammons <jlhamm@acm.org>
Tue, 13 Sep 2016 02:25:48 +0000 (21:25 -0500)
Signed-off-by: Shamus Hammons <jlhamm@acm.org>
eagen0.c
mach.c
parmode.h
rmac.c
rmac.h

index 8ac72ed3824ff3e2cd7055805d3ff276439aa590..7ec6ccb0fcf28cdbca6156b8982e802bd0cc1f41 100644 (file)
--- a/eagen0.c
+++ b/eagen0.c
@@ -39,7 +39,7 @@ int eaNgen(WORD siz)
                        if (tdb)
                                rmark(cursect, sloc, tdb, MWORD, NULL);
 
                        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
                        {
                                // 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 be17c79568aece50da2505c7f5ee65307c625e09..7c91979c0a351f97fcc2b46835465fc1fc1abcff 100644 (file)
--- 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
        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);
                && (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)
                {
                // 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;
                        {
                                // Fits in .B 
                                inst |= v & 0xFF;
index 521f787e9fe39897b4bfe5d7797fc79b3aabd7cd..c003523f322f9aa49c6e0f3858b1c37b833ffe55 100644 (file)
--- a/parmode.h
+++ b/parmode.h
@@ -257,7 +257,7 @@ CHK_FOR_DISPn:
 
                        // Defined, absolute values from $FFFF8000..$00007FFF get optimized
                        // to absolute short
 
                        // 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;
 
                        {
                                AMn = ABSW;
 
diff --git a/rmac.c b/rmac.c
index ee8d9ee3a70b6a9273f6ac6e0df8544585886579..280b5979e34c2b8580eeca8f3eb20d204f30929b 100644 (file)
--- 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
 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.
 
 //
 // 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"
                "  -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"
                "  -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"
                "  -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"
                "  -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
        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
 
        // Initialise modules
        InitSymbolTable();                              // Symbol table
@@ -361,10 +363,6 @@ int Process(int argc, char ** argv)
                                        DisplayVersion();
 
                                break;
                                        DisplayVersion();
 
                                break;
-                       case 'w':
-                       case 'W':
-                               optim_flag=0;
-                               break;
                        case 'x':                               // Turn on debugging
                        case 'X':
                                debug = 1;
                        case 'x':                               // Turn on debugging
                        case 'X':
                                debug = 1;
@@ -409,6 +407,38 @@ int Process(int argc, char ** argv)
                                break;
                        }
                }
                                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<OPT_COUNT)
+                                       optim_flags[opt_no]=onoff;
+                               else
+                               {
+                                   DisplayVersion();
+                                       printf("Unknown switch: %s\n\n", argv[argno]);
+                                       DisplayHelp();
+                                       errcnt++;
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               DisplayVersion();
+                               printf("Unknown switch: %s\n\n", argv[argno]);
+                               DisplayHelp();
+                               errcnt++;
+                               break;
+                       }
+               }
                else
                {
                        // Record first filename.
                else
                {
                        // Record first filename.
@@ -534,6 +564,14 @@ int main(int argc, char ** argv)
 {
        perm_verb_flag = 0;                             // Clobber "permanent" verbose flag
        legacy_flag = 1;                                // Default is legacy mode on (:-P)
 {
        perm_verb_flag = 0;                             // Clobber "permanent" verbose flag
        legacy_flag = 1;                                // Default is legacy mode on (:-P)
+
+       // Set legacy optimisation flags to on
+       // and everything else to off
+       memset(optim_flags, 0, OPT_COUNT * sizeof(int));
+       optim_flags[OPT_ABS_SHORT] = 
+               optim_flags[OPT_MOVEL_MOVEQ] =
+               optim_flags[OPT_BSR_BCC_S] = 1;  
+
        cmdlnexec = argv[0];                    // Obtain executable name
 
        endian = GetEndianess();                // Get processor endianess
        cmdlnexec = argv[0];                    // Obtain executable name
 
        endian = GetEndianess();                // Get processor endianess
diff --git a/rmac.h b/rmac.h
index fdc36ea72a38bddf7a8fb483a42a4a4b02d2facb..39b8ae67a5dcca8d240f3b81816e475e6b7f8a6d 100644 (file)
--- a/rmac.h
+++ b/rmac.h
@@ -184,6 +184,16 @@ PTR
 
 //#define RISCSYM      0x00010000
 
 
 //#define RISCSYM      0x00010000
 
+// Optimisation defines
+enum
+{
+       OPT_ABS_SHORT       = 0,
+       OPT_MOVEL_MOVEQ     = 1,
+       OPT_BSR_BCC_S       = 2,
+       OPT_INDIRECT_DISP   = 3,
+       OPT_COUNT   // Dummy, used to count number of optimisation switches
+};
+
 // Globals, externals, etc.
 extern int verb_flag;
 extern int debug;
 // Globals, externals, etc.
 extern int verb_flag;
 extern int debug;
@@ -201,7 +211,7 @@ extern int sbra_flag;
 extern int obj_format;
 extern int legacy_flag;
 extern LONG PRGFLAGS;
 extern int obj_format;
 extern int legacy_flag;
 extern LONG PRGFLAGS;
-extern int optim_flag;
+extern int optim_flags[OPT_COUNT];
 
 // Exported functions
 char * fext(char *, char *, int);
 
 // Exported functions
 char * fext(char *, char *, int);