+#if defined(HAVE_INLINE)
+INLINE int ED_IsLocPrimary (const ExprDesc* Expr)
+/* Return true if the expression is an expression in the register pseudo variable */
+{
+ return (Expr->Flags & E_MASK_LOC) == E_LOC_PRIMARY;
+}
+#else
+# define ED_IsLocPrimary(Expr) (((Expr)->Flags & E_MASK_LOC) == E_LOC_PRIMARY)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE int ED_IsLocExpr (const ExprDesc* Expr)
+/* Return true if the expression is an expression in the primary */
+{
+ return (Expr->Flags & E_MASK_LOC) == E_LOC_EXPR;
+}
+#else
+# define ED_IsLocExpr(Expr) (((Expr)->Flags & E_MASK_LOC) == E_LOC_EXPR)
+#endif
+
+#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_IsLocLiteral(Expr) (((Expr)->Flags & E_MASK_LOC) == E_LOC_LITERAL)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE int ED_IsLocConst (const ExprDesc* Expr)
+/* Return true if the expression is a constant location of some sort */
+{
+ return (Expr->Flags & E_LOC_CONST) != 0;
+}
+#else
+# define ED_IsLocConst(Expr) (((Expr)->Flags & E_LOC_CONST) != 0)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE int ED_IsLVal (const ExprDesc* Expr)
+/* Return true if the expression is a reference */
+{
+ return (Expr->Flags & E_MASK_RTYPE) == E_RTYPE_LVAL;
+}
+#else
+# define ED_IsLVal(Expr) (((Expr)->Flags & E_MASK_RTYPE) == E_RTYPE_LVAL)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE int ED_IsRVal (const ExprDesc* Expr)
+/* Return true if the expression is a rvalue */
+{
+ return (Expr->Flags & E_MASK_RTYPE) == E_RTYPE_RVAL;
+}
+#else
+# define ED_IsRVal(Expr) (((Expr)->Flags & E_MASK_RTYPE) == E_RTYPE_RVAL)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE void ED_MakeLVal (ExprDesc* Expr)
+/* Make the expression a lvalue. */
+{
+ Expr->Flags |= E_RTYPE_LVAL;
+}
+#else
+# define ED_MakeLVal(Expr) do { (Expr)->Flags |= E_RTYPE_LVAL; } while (0)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE void ED_MakeRVal (ExprDesc* Expr)
+/* Make the expression a rvalue. */
+{
+ Expr->Flags &= ~E_RTYPE_LVAL;
+}
+#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. */
+{
+ Expr->Flags |= E_NEED_TEST;
+}
+#else
+# define ED_MarkForTest(Expr) do { (Expr)->Flags |= E_NEED_TEST; } while (0)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE int ED_NeedsTest (const ExprDesc* Expr)
+/* Check if the expression needs a test. */
+{
+ return (Expr->Flags & E_NEED_TEST) != 0;
+}
+#else
+# define ED_NeedsTest(Expr) (((Expr)->Flags & E_NEED_TEST) != 0)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE void ED_TestDone (ExprDesc* Expr)
+/* Mark the expression as tested and condition codes set. */
+{
+ Expr->Flags = (Expr->Flags & ~E_NEED_TEST) | E_CC_SET;
+}
+#else
+# define ED_TestDone(Expr) \
+ do { (Expr)->Flags = ((Expr)->Flags & ~E_NEED_TEST) | E_CC_SET; } while (0)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE int ED_IsTested (const ExprDesc* Expr)
+/* Check if the expression has set the condition codes. */
+{
+ return (Expr->Flags & E_CC_SET) != 0;
+}
+#else
+# define ED_IsTested(Expr) (((Expr)->Flags & E_CC_SET) != 0)
+#endif
+
+#if defined(HAVE_INLINE)
+INLINE void ED_MarkAsUntested (ExprDesc* Expr)
+/* Mark the expression as not tested (condition codes not set). */
+{
+ Expr->Flags &= ~E_CC_SET;
+}
+#else
+# 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.
+ */
+
+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.
+ */
+
+ExprDesc* ED_MakeConstAbs (ExprDesc* Expr, long Value, Type* Type);
+/* Make Expr an absolute const with the given value and type. */
+
+ExprDesc* ED_MakeConstAbsInt (ExprDesc* Expr, long Value);