__FILE__, __LINE__)
#define CEILING(x,y) (((x) + ((y) - 1)) & (~((y) - 1)))
-#define NWORDS(x,y) (CEILING((x),(y)) / (y))
+
+static inline unsigned int
+NWORDS(unsigned int x, unsigned int n_bits)
+{
+ /* A good compiler should be able to constant-fold this whole thing,
+ even with the conditional. */
+ if(n_bits <= N_WORD_BITS) {
+ unsigned int elements_per_word = N_WORD_BITS/n_bits;
+
+ return CEILING(x, elements_per_word)/elements_per_word;
+ }
+ else {
+ /* FIXME: should have some sort of assertion that N_WORD_BITS
+ evenly divides n_bits */
+ return x * (n_bits/N_WORD_BITS);
+ }
+}
/* FIXME: Shouldn't this be defined in sbcl.h? */
#define FUN_RAW_ADDR_OFFSET (6*sizeof(lispobj) - FUN_POINTER_LOWTAG)
lispobj *search_static_space(void *pointer);
lispobj *search_dynamic_space(void *pointer);
+#include "fixnump.h"
+
/* Scan an area looking for an object which encloses the given pointer.
* Return the object start on success or NULL on failure. */
static lispobj *
/* If thing is an immediate then this is a cons. */
if (is_lisp_pointer(thing)
- || ((thing & 3) == 0) /* fixnum */
- || (widetag_of(thing) == BASE_CHAR_WIDETAG)
+ || (fixnump(thing))
+ || (widetag_of(thing) == CHARACTER_WIDETAG)
|| (widetag_of(thing) == UNBOUND_MARKER_WIDETAG))
count = 2;
else