#include "mach.h"
#include "riscasm.h"
#include "sect.h"
+#include "token.h"
#define eaNgen ea0gen
#define amN am0
if (tdb)
MarkRelocatable(cursect, sloc, tdb, MWORD, NULL);
- if ((v == 0) && optim_flags[OPT_INDIRECT_DISP] && !movep)
+ if ((v == 0) && CHECK_OPTS(OPT_INDIRECT_DISP) && !movep)
{
// If expr is 0, size optimise the opcode. Generally the lower
// 6 bits of the opcode for expr(ax) are 101rrr where rrr=the
#include "error.h"
#include "procln.h"
#include "riscasm.h"
-//#include "rmac.h"
#include "sect.h"
#include "token.h"
//
int m_lea(WORD inst, WORD siz)
{
- if (optim_flags[OPT_LEA_ADDQ]
+ if (CHECK_OPTS(OPT_LEA_ADDQ)
&& ((am0 == ADISP) && (a0reg == a1reg) && (a0exattr & DEFINED))
&& ((a0exval > 0) && (a0exval <= 8)))
{
int siz = (int)size;
// Try to optimize to MOVEQ
- if (optim_flags[OPT_MOVEL_MOVEQ]
+ if (CHECK_OPTS(OPT_MOVEL_MOVEQ)
&& (siz == SIZL) && (am0 == IMMED) && (am1 == DREG)
&& ((a0exattr & (TDB | DEFINED)) == DEFINED)
&& (a0exval + 0x80 < 0x100))
// Optimize branch instr. size
if (siz == SIZN)
{
- if (optim_flags[OPT_BSR_BCC_S] && (v != 0) && ((v + 0x80) < 0x100))
+ if (CHECK_OPTS(OPT_BSR_BCC_S) && (v != 0) && ((v + 0x80) < 0x100))
{
// Fits in .B
inst |= v & 0xFF;
else
{
expr(AnBEXPR, &AnBEXVAL, &AnBEXATTR, &AnESYM);
- if (optim_flags[OPT_BASE_DISP] && AnBEXVAL==0 && AnEXATTR!=0)
+ if (CHECK_OPTS(OPT_BASE_DISP) && AnBEXVAL==0 && AnEXATTR!=0)
{
// bd=0 so let's optimise it out
AnEXTEN|=EXT_BDSIZE0;
{
// Defined, absolute values from $FFFF8000..$00007FFF get optimized
// to absolute short
- if (optim_flags[OPT_ABS_SHORT]
+ if (CHECK_OPTS(OPT_ABS_SHORT)
&& ((AnBEXATTR & (TDB | DEFINED)) == DEFINED)
&& ((AnBEXVAL + 0x8000) < 0x10000))
{
if (expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
goto badmode;
- if (optim_flags[OPT_BASE_DISP] && (AnEXVAL == 0))
+ if (CHECK_OPTS(OPT_BASE_DISP) && (AnEXVAL == 0))
{
// od=0 so optimise it out
AMn = MEMPOST; // let's say it's ([bd,An],Xn,od) with od=0 then
// Defined, absolute values from $FFFF8000..$00007FFF get
// optimized to absolute short
- if (optim_flags[OPT_ABS_SHORT]
+ if (CHECK_OPTS(OPT_ABS_SHORT)
&& ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
&& ((AnEXVAL + 0x8000) < 0x10000))
{
expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM);
- if (optim_flags[OPT_BASE_DISP] && (AnEXVAL == 0))
+ if (CHECK_OPTS(OPT_BASE_DISP) && (AnEXVAL == 0))
{
// od=0 so optimise it out
AMn = MEMPOST; // let's say it's ([bd,An],Xn,od) with od=0 then
// Defined, absolute values from $FFFF8000..$00007FFF get
// optimized to absolute short
- else if (optim_flags[OPT_BASE_DISP]
+ else if (CHECK_OPTS(OPT_BASE_DISP)
&& ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
&& ((AnEXVAL + 0x8000) < 0x10000))
{
if (expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
goto badmode;
- if (optim_flags[OPT_BASE_DISP] && (AnEXVAL == 0))
+ if (CHECK_OPTS(OPT_BASE_DISP) && (AnEXVAL == 0))
{
// od=0 so optimise it out
AMn = MEMPRE; // let's say it's ([bd,An],Xn,od) with od=0 then
// Defined, absolute values from $FFFF8000..$00007FFF get optimized
// to absolute short
- else if (optim_flags[OPT_BASE_DISP]
+ else if (CHECK_OPTS(OPT_BASE_DISP)
&& ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
&& ((AnEXVAL + 0x8000) < 0x10000))
{
// Defined, absolute values from $FFFF8000..$00007FFF get optimized
// to absolute short
- if (optim_flags[OPT_ABS_SHORT]
+ if (CHECK_OPTS(OPT_ABS_SHORT)
&& ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
&& ((AnEXVAL + 0x8000) < 0x10000))
{
TOKEN * etok; // Ptr past last token in tokbuf[]
TOKEN tokeol[1] = {EOL}; // Bailout end-of-line token
char * string[TOKBUFSIZE*2]; // Token buffer string pointer storage
+int optimizeOff; // Optimization override flag
// File record, used to maintain a list of every include file ever visited
#define FILEREC struct _filerec
FILEREC * filerec;
FILEREC * last_fr;
-INOBJ * cur_inobj; // Ptr current input obj (IFILE/IMACRO)
-static INOBJ * f_inobj; // Ptr list of free INOBJs
-static IFILE * f_ifile; // Ptr list of free IFILEs
-static IMACRO * f_imacro; // Ptr list of free IMACROs
+INOBJ * cur_inobj; // Ptr current input obj (IFILE/IMACRO)
+static INOBJ * f_inobj; // Ptr list of free INOBJs
+static IFILE * f_ifile; // Ptr list of free IFILEs
+static IMACRO * f_imacro; // Ptr list of free IMACROs
-static TOKEN tokbuf[TOKBUFSIZE]; // Token buffer (stack-like, all files)
+static TOKEN tokbuf[TOKBUFSIZE]; // Token buffer (stack-like, all files)
uint8_t chrtab[0x100] = {
ILLEG, ILLEG, ILLEG, ILLEG, // NUL SOH STX ETX
case SRC_IREPT: // Pop and release an IREPT
{
DEBUG { printf("dealloc IREPT\n"); }
-// LONG * p = inobj->inobj.irept->ir_firstln;
LLIST * p = inobj->inobj.irept->ir_firstln;
// Deallocate repeat lines
while (p != NULL)
{
-// Shamus: ggn confirmed that this will cause a segfault on 64-bit versions of
-// RMAC. This is just stupid and wrong anyway, so we need to fix crapola
-// like this...
-// LONG * p1 = (LONG *)*p;
-// p = p1;
free(p->line);
p = p->next;
}
case SRC_IREPT:
if ((ln = GetNextRepeatLine()) == NULL)
{
-DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); }
+ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); }
fpop();
goto retry;
}
if (*ln == '*' || *ln == ';' || ((*ln == '/') && (*(ln + 1) == '/')))
goto goteol;
+ // And here we have a very ugly hack for signalling a single line 'turn off
+ // optimization'. There's really no nice way to do this, so hack it is!
+ optimizeOff = 0; // Default is to take optimizations as they come
+
+ if (*ln == '!')
+ {
+ optimizeOff = 1; // Signal that we don't want to optimize this line
+ ln++; // & skip over the darned thing
+ }
+
// Main tokenization loop;
// o skip whitespace;
// o handle end-of-line;
#define MULTX 64 // Multiple-character tokens
#define DOT 128 // [bwlsBWSL] for what follows a '.'
+// Macro to check for specific optimizations or override
+#define CHECK_OPTS(x) (optim_flags[x] && !optimizeOff)
+
// Conditional assembly structures
IFENT {
IFENT * if_prev; // Ptr prev .if state block (or NULL)
extern INOBJ * cur_inobj;
extern int mjump_align;
extern char * string[];
+int optimizeOff;
// Exported functions
int include(int, char *);