d_nojpad, // 55 .nojpad (deprecated)
d_gpumain, // 56 .gpumain (deprecated)
d_prgflags, // 57 .prgflags
+ d_opt, // 58 .opt
};
return error("What the hell? Do you think we adhere to the Goof standard?");
}
+//
+// .opt - turn a specific (or all) optimisation on or off
+//
+int d_opt(void)
+{
+ char * tmpstr;
+
+ while (*tok != EOL)
+ {
+ if (*tok == STRING)
+ {
+ tok++;
+ tmpstr = string[*tok++];
+
+ if (ParseOptimization(tmpstr) != OK)
+ {
+ char temperr[256];
+ sprintf(temperr, "unknown optimisation flag '%s'.", tmpstr);
+ return error(temperr);
+ }
+ }
+ else
+ return error(".opt directive needs every switch enclosed inside quotation marks.");
+ }
+}
\ No newline at end of file
}
+//
+// Parse optimisation options
+//
+int ParseOptimization(char * optstring)
+{
+ int onoff = 0;
+
+ if (*optstring == '+')
+ onoff = 1;
+ else if (*optstring != '~')
+ return ERROR;
+
+ if ((optstring[2] == 'a' || optstring[2] == 'A') &&
+ (optstring[3] == 'l' || optstring[3] == 'L') &&
+ (optstring[4] == 'l' || optstring[4] == 'L'))
+ {
+ memset(optim_flags, onoff, OPT_COUNT * sizeof(int));
+ return OK;
+ }
+ else if (optstring[1] == 'o' || optstring[1] == 'O') //Turn on specific optimisation
+ {
+ int opt_no = atoi(&optstring[2]);
+ if ((opt_no >= 0) && (opt_no < OPT_COUNT))
+ optim_flags[opt_no] = onoff;
+ else
+ {
+ return ERROR;
+ }
+ }
+ else
+ {
+ return ERROR;
+ }
+}
+
+
//
// Process command line arguments and do an assembly
//
}
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
+ if (ParseOptimization(argv[argno]) != OK)
{
DisplayVersion();
printf("Unknown switch: %s\n\n", argv[argno]);
// Exported functions
char * fext(char *, char *, int);
int nthpath(char *, int, char *);
+int ParseOptimization(char * optstring);
#endif // __RMAC_H__