-#ifdef USE_MINIMAL_TAGBITS
-
-# define Lisp_Type_Int_Bit (Lisp_Type_Int_Even & Lisp_Type_Int_Odd)
-# define XUNMARK(x) DO_NOTHING
-# define make_obj(vartype, x) ((Lisp_Object) (x))
-# define make_int(x) ((Lisp_Object) (((x) << INT_GCBITS) | Lisp_Type_Int_Bit))
-# define make_char(x) ((Lisp_Object) (((x) << GCBITS) | Lisp_Type_Char))
-# define VALMASK (((1UL << VALBITS) - 1UL) << GCTYPEBITS)
-# define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) & ~VALMASK))
-# define XPNTRVAL(x) (x) /* This depends on Lisp_Type_Record == 0 */
-# define XCHARVAL(x) ((x) >> GCBITS)
-# define GC_EQ(x,y) EQ (x,y)
-# define XREALINT(x) ((x) >> INT_GCBITS)
-# define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS)
-# define INTP(x) ((EMACS_UINT)(x) & Lisp_Type_Int_Bit)
-
-#else /* !USE_MINIMAL_TAGBITS */
-
-# define MARKBIT (1UL << VALBITS)
-# define XMARKBIT(x) (((x) & MARKBIT) != 0)
-# define XMARK(x) ((void) ((x) |= MARKBIT))
-# define XUNMARK(x) ((void) ((x) &= ~MARKBIT))
-# define make_obj(vartype, value) \
- ((Lisp_Object) (((EMACS_UINT) (vartype) << (VALBITS + GCMARKBITS)) \
- + ((EMACS_UINT) (value) & VALMASK)))
-# define make_int(value) make_obj (Lisp_Type_Int, value)
-# define make_char(value) make_obj (Lisp_Type_Char, value)
-# define VALMASK ((1UL << VALBITS) - 1UL)
-# define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) >> (VALBITS + GCMARKBITS)))
-# define XPNTRVAL(x) ((x) & VALMASK)
-# define XCHARVAL(x) XPNTRVAL(x)
-# define GC_EQ(x,y) (((x) & ~MARKBIT) == ((y) & ~MARKBIT))
-# define XREALINT(x) (((x) << INT_GCBITS) >> INT_GCBITS)
-# define XUINT(x) ((EMACS_UINT) ((x) & VALMASK))
-# define INTP(x) (XTYPE (x) == Lisp_Type_Int)
-
-#endif /* !USE_MINIMAL_TAGBITS */
+#define Lisp_Type_Int_Bit (Lisp_Type_Int_Even & Lisp_Type_Int_Odd)
+#define wrap_object(ptr) ((Lisp_Object) (ptr))
+#define make_int(x) ((Lisp_Object) (((EMACS_INT)(x) << INT_GCBITS) | Lisp_Type_Int_Bit))
+#define make_char(x) ((Lisp_Object) (((EMACS_INT)(x) << GCBITS) | Lisp_Type_Char))
+#define VALMASK (((1UL << VALBITS) - 1UL) << GCTYPEBITS)
+#define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) & ~VALMASK))
+#define XPNTRVAL(x) (x) /* This depends on Lisp_Type_Record == 0 */
+#if defined(UTF2000) && (SIZEOF_EMACS_INT == 4)
+INLINE_HEADER Emchar XCHARVAL (Lisp_Object chr);
+INLINE_HEADER Emchar
+XCHARVAL (Lisp_Object chr)
+{
+ int code = (EMACS_UINT)(chr) >> GCBITS;
+
+ if (code & 0x20000000)
+ return code | 0x40000000;
+ else
+ return code;
+}
+#else
+#define XCHARVAL(x) ((Emchar)((EMACS_UINT)(x) >> GCBITS))
+#endif
+#define XREALINT(x) ((x) >> INT_GCBITS)
+#define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS)
+#define INTP(x) ((EMACS_UINT)(x) & Lisp_Type_Int_Bit)
+#define INT_PLUS(x,y) ((x)+(y)-Lisp_Type_Int_Bit)
+#define INT_MINUS(x,y) ((x)-(y)+Lisp_Type_Int_Bit)
+#define INT_PLUS1(x) INT_PLUS (x, make_int (1))
+#define INT_MINUS1(x) INT_MINUS (x, make_int (1))