+/* Convert from a lispobj with type bits to a native (ordinary
+ * C/assembly) pointer to the beginning of the object. */
+static inline lispobj *
+native_pointer(lispobj obj)
+{
+ return (lispobj *) ((pointer_sized_uint_t) (obj & ~LOWTAG_MASK));
+}
+
+/* inverse operation: create a suitably tagged lispobj from a native
+ * pointer or integer.*/
+static inline lispobj
+make_lispobj(void *o, int low_tag)
+{
+ return LOW_WORD(o) | low_tag;
+}
+
+static inline lispobj
+make_fixnum(long n)
+{
+ return n << N_FIXNUM_TAG_BITS;
+}
+
+static inline long
+fixnum_value(lispobj n)
+{
+ return n >> N_FIXNUM_TAG_BITS;
+}
+
+#if defined(LISP_FEATURE_WIN32)
+/* KLUDGE: Avoid double definition of boolean by rpcndr.h included via
+ * shlobj.h.
+ *
+ * FIXME: We should probably arrange to use the rpcndr.h boolean on Windows,
+ * or get rid of our own boolean type. If the boolean type is only used in
+ * the runtime, and never passed to Lisp, then it doesn't matter which one
+ * we use.
+ */
+#define boolean rpcndr_boolean
+#include <shlobj.h>
+#undef boolean
+#endif