/* */
/* */
/* */
-/* (C) 2002-2006 Ullrich von Bassewitz */
-/* Römerstraße 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2002-2010, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
#include <string.h>
/* common */
+#include "fp.h"
#include "inline.h"
/* cc65 */
+#include "asmcode.h"
#include "datatype.h"
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
E_RTYPE_RVAL = 0x0000,
E_RTYPE_LVAL = 0x0100,
+ /* Bit-field? */
+ E_BITFIELD = 0x0200,
+
/* Test */
- E_NEED_TEST = 0x0200, /* Expression needs a test to set cc */
- E_CC_SET = 0x0400 /* Condition codes are set */
+ E_NEED_TEST = 0x0400, /* Expression needs a test to set cc */
+ E_CC_SET = 0x0800, /* Condition codes are set */
+
+ E_HAVE_MARKS = 0x1000, /* Code marks are valid */
+
};
+/* Forward */
+struct Literal;
+
/* Describe the result of an expression */
typedef struct ExprDesc ExprDesc;
struct ExprDesc {
- struct SymEntry* Sym; /* Symbol table entry if known */
- Type* Type; /* Type array of expression */
+ struct SymEntry* Sym; /* Symbol table entry if known */
+ Type* Type; /* Type array of expression */
unsigned Flags;
- unsigned long Name; /* Name or label number */
- long IVal; /* Integer value if expression constant */
- float FVal; /* Floating point value */
+ unsigned long Name; /* Name or label number */
+ long IVal; /* Integer value if expression constant */
+ Double FVal; /* Floating point value */
+ struct Literal* LVal; /* Literal value */
+
+ /* Bit field stuff */
+ unsigned BitOffs; /* Bit offset for bit fields */
+ unsigned BitWidth; /* Bit width for bit fields */
+
+ /* Start and end of generated code */
+ CodeMark Start;
+ CodeMark End;
};
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
#if defined(HAVE_INLINE)
INLINE int ED_IsLocLiteral (const ExprDesc* Expr)
/* Return true if the expression is a string from the literal pool */
-{
+{
return (Expr->Flags & E_MASK_LOC) == E_LOC_LITERAL;
}
#else
# define ED_MakeRVal(Expr) do { (Expr)->Flags &= ~E_RTYPE_LVAL; } while (0)
#endif
+#if defined(HAVE_INLINE)
+INLINE int ED_IsBitField (const ExprDesc* Expr)
+/* Return true if the expression is a bit field */
+{
+ return (Expr->Flags & E_BITFIELD) != 0;
+}
+#else
+# define ED_IsBitField(Expr) (((Expr)->Flags & E_BITFIELD) != 0)
+#endif
+
+void ED_MakeBitField (ExprDesc* Expr, unsigned BitOffs, unsigned BitWidth);
+/* Make this expression a bit field expression */
+
#if defined(HAVE_INLINE)
INLINE void ED_MarkForTest (ExprDesc* Expr)
/* Mark the expression for a test. */
# define ED_MarkAsUntested(Expr) do { (Expr)->Flags &= ~E_CC_SET; } while (0)
#endif
+void ED_SetCodeRange (ExprDesc* Expr, const CodeMark* Start, const CodeMark* End);
+/* Set the code range for this expression */
+
+int ED_CodeRangeIsEmpty (const ExprDesc* Expr);
+/* Return true if no code was output for this expression */
+
const char* ED_GetLabelName (const ExprDesc* Expr, long Offs);
/* Return the assembler label name of the given expression. Beware: This
- * function may use a static buffer, so the name may get "lost" on the second
- * call to the function.
- */
+** function may use a static buffer, so the name may get "lost" on the second
+** call to the function.
+*/
int ED_GetStackOffs (const ExprDesc* Expr, int Offs);
/* Get the stack offset of an address on the stack in Expr taking into account
- * an additional offset in Offs.
- */
+** an additional offset in Offs.
+*/
ExprDesc* ED_MakeConstAbs (ExprDesc* Expr, long Value, Type* Type);
/* Make Expr an absolute const with the given value and type. */
ExprDesc* ED_MakeRValExpr (ExprDesc* Expr);
/* Convert Expr into a rvalue which is in the primary register without an
- * offset.
- */
+** offset.
+*/
ExprDesc* ED_MakeLValExpr (ExprDesc* Expr);
/* Convert Expr into a lvalue which is in the primary register without an
- * offset.
- */
+** offset.
+*/
int ED_IsConst (const ExprDesc* Expr);
/* Return true if the expression denotes a constant of some sort. This can be a
- * numeric constant, the address of a global variable (maybe with offset) or
- * similar.
- */
+** numeric constant, the address of a global variable (maybe with offset) or
+** similar.
+*/
#if defined(HAVE_INLINE)
INLINE int ED_IsConstAbs (const ExprDesc* Expr)
/* Return true if the expression denotes a constant absolute value. This can be
- * a numeric constant, cast to any type.
- */
+** a numeric constant, cast to any type.
+*/
{
return (Expr->Flags & (E_MASK_LOC|E_MASK_RTYPE)) == (E_LOC_ABS|E_RTYPE_RVAL);
}
int ED_IsBool (const ExprDesc* Expr);
/* Return true of the expression can be treated as a boolean, that is, it can
- * be an operand to a compare operation.
- */
+** be an operand to a compare operation.
+*/
void PrintExprDesc (FILE* F, ExprDesc* Expr);
/* Print an ExprDesc */
/* End of exprdesc.h */
-#endif
-
-
+#endif