Index: /branches/ia32/lisp-kernel/x86-spentry32.s
===================================================================
--- /branches/ia32/lisp-kernel/x86-spentry32.s	(revision 8252)
+++ /branches/ia32/lisp-kernel/x86-spentry32.s	(revision 8253)
@@ -42,10 +42,381 @@
 _endsubp(misc_ref)
 
+/* %imm0 = subtag, %arg_y = uvector, %arg_z = index. */
+/* Bounds/type-checking done in caller. */
 _startfn(C(misc_ref_common))
-	__(int $3)
+	__(shll $word_shift,%imm0)
+	__(addl $local_label(misc_ref_jmp),%imm0)
+	__(jmp (%imm0))
+	.p2align 2
+local_label(misc_ref_jmp):
+	/* 00-0f */
+        .long local_label(misc_ref_invalid) /* 00 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 01 cons  */
+        .long local_label(misc_ref_invalid) /* 02 nodeheader  */
+        .long local_label(misc_ref_invalid) /* 03 imm  */
+        .long local_label(misc_ref_invalid) /* 04 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 05 tra  */
+        .long local_label(misc_ref_invalid) /* 06 misc  */
+        .long local_label(misc_ref_u32) /* 07 bignum  */
+        .long local_label(misc_ref_invalid) /* 08 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 09 cons  */
+        .long local_label(misc_ref_node) /* 0a ratio  */
+        .long local_label(misc_ref_invalid) /* 0b imm  */
+        .long local_label(misc_ref_invalid) /* 0c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 0d tra  */
+        .long local_label(misc_ref_invalid) /* 0e misc  */
+        .long local_label(misc_ref_u32) /* 0f single_float  */
+        /* 10-1f  */
+        .long local_label(misc_ref_invalid) /* 10 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 11 cons  */
+        .long local_label(misc_ref_invalid) /* 12 nodeheader  */
+        .long local_label(misc_ref_invalid) /* 13 imm  */
+        .long local_label(misc_ref_invalid) /* 14 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 15 tra  */
+        .long local_label(misc_ref_invalid) /* 16 misc  */
+        .long local_label(misc_ref_u32) /* 17 double_float  */
+        .long local_label(misc_ref_invalid) /* 18 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 19 cons  */
+        .long local_label(misc_ref_node) /* 1a complex  */
+        .long local_label(misc_ref_invalid) /* 1b imm  */
+        .long local_label(misc_ref_invalid) /* 1c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 1d tra  */
+        .long local_label(misc_ref_invalid) /* 1e misc  */
+        .long local_label(misc_ref_u32) /* 1f macptr  */
+        /* 20-2f  */
+        .long local_label(misc_ref_invalid) /* 20 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 21 cons  */
+        .long local_label(misc_ref_invalid) /* 22 catch_frame  */
+        .long local_label(misc_ref_invalid) /* 23 imm  */
+        .long local_label(misc_ref_invalid) /* 24 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 25 tra  */
+        .long local_label(misc_ref_invalid) /* 26 misc  */
+        .long local_label(misc_ref_u32) /* 27 dead_macptr  */
+        .long local_label(misc_ref_invalid) /* 28 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 29 cons  */
+        .long local_label(misc_ref_function) /* 2a function  */
+        .long local_label(misc_ref_invalid) /* 2b imm  */
+        .long local_label(misc_ref_invalid) /* 2c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 2d tra  */
+        .long local_label(misc_ref_invalid) /* 2e misc  */
+        .long local_label(misc_ref_invalid) /* 2f immheader  */
+        /* 30-3f  */
+        .long local_label(misc_ref_invalid) /* 30 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 31 cons  */
+        .long local_label(misc_ref_invalid) /* 32 nodeheader  */
+        .long local_label(misc_ref_invalid) /* 33 imm  */
+        .long local_label(misc_ref_invalid) /* 34 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 35 tra  */
+        .long local_label(misc_ref_invalid) /* 36 misc  */
+        .long local_label(misc_ref_invalid) /* 37 immheader  */
+        .long local_label(misc_ref_invalid) /* 38 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 39 cons  */
+        .long local_label(misc_ref_node) /* 3a symbol  */
+        .long local_label(misc_ref_invalid) /* 3b imm  */
+        .long local_label(misc_ref_invalid) /* 3c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 3d tra  */
+        .long local_label(misc_ref_invalid) /* 3e misc  */
+        .long local_label(misc_ref_u32) /* 3f xcode_vector  */
+        /* 40-4f  */
+        .long local_label(misc_ref_invalid) /* 40 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 41 cons  */
+        .long local_label(misc_ref_node) /* 42 lock  */
+        .long local_label(misc_ref_invalid) /* 43 imm  */
+        .long local_label(misc_ref_invalid) /* 44 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 45 tra  */
+        .long local_label(misc_ref_invalid) /* 46 misc  */
+        .long local_label(misc_ref_invalid) /* 47 immheader  */
+        .long local_label(misc_ref_invalid) /* 48 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 49 cons  */
+        .long local_label(misc_ref_node) /* 4a hash_vector  */
+        .long local_label(misc_ref_invalid) /* 4b imm  */
+        .long local_label(misc_ref_invalid) /* 4c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 4d tra  */
+        .long local_label(misc_ref_invalid) /* 4e misc  */
+        .long local_label(misc_ref_invalid) /* 4f immheader  */
+        /* 50-5f  */
+        .long local_label(misc_ref_invalid) /* 50 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 51 cons  */
+        .long local_label(misc_ref_node) /* 52 pool  */
+        .long local_label(misc_ref_invalid) /* 53 imm  */
+        .long local_label(misc_ref_invalid) /* 54 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 55 tra  */
+        .long local_label(misc_ref_invalid) /* 56 misc  */
+        .long local_label(misc_ref_invalid) /* 57 immheader  */
+        .long local_label(misc_ref_invalid) /* 58 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 59 cons  */
+        .long local_label(misc_ref_node) /* 5a weak  */
+        .long local_label(misc_ref_invalid) /* 5b imm  */
+        .long local_label(misc_ref_invalid) /* 5c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 5d tra  */
+        .long local_label(misc_ref_invalid) /* 5e misc  */
+        .long local_label(misc_ref_invalid) /* 5f immheader  */
+        /* 60-6f  */
+        .long local_label(misc_ref_invalid) /* 60 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 61 cons  */
+        .long local_label(misc_ref_node) /* 62 package  */
+        .long local_label(misc_ref_invalid) /* 63 imm  */
+        .long local_label(misc_ref_invalid) /* 64 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 65 tra  */
+        .long local_label(misc_ref_invalid) /* 66 misc  */
+        .long local_label(misc_ref_invalid) /* 67 immheader  */
+        .long local_label(misc_ref_invalid) /* 68 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 69 cons  */
+        .long local_label(misc_ref_node) /* 6a slot_vector  */
+        .long local_label(misc_ref_invalid) /* 6b imm  */
+        .long local_label(misc_ref_invalid) /* 6c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 6d tra  */
+        .long local_label(misc_ref_invalid) /* 6e misc  */
+        .long local_label(misc_ref_invalid) /* 6f immheader  */
+        /* 70-7f  */
+        .long local_label(misc_ref_invalid) /* 70 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 71 cons  */
+        .long local_label(misc_ref_node) /* 72 instance  */
+        .long local_label(misc_ref_invalid) /* 73 imm  */
+        .long local_label(misc_ref_invalid) /* 74 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 75 tra  */
+        .long local_label(misc_ref_invalid) /* 76 misc  */
+        .long local_label(misc_ref_invalid) /* 77 immheader  */
+        .long local_label(misc_ref_invalid) /* 78 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 79 cons  */
+        .long local_label(misc_ref_node) /* 7a struct  */
+        .long local_label(misc_ref_invalid) /* 7b imm  */
+        .long local_label(misc_ref_invalid) /* 7c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 7d tra  */
+        .long local_label(misc_ref_invalid) /* 7e misc  */
+        .long local_label(misc_ref_invalid) /* 7f immheader  */
+        /* 80-8f  */
+        .long local_label(misc_ref_invalid) /* 80 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 81 cons  */
+        .long local_label(misc_ref_node) /* 82 istruct  */
+        .long local_label(misc_ref_invalid) /* 83 imm  */
+        .long local_label(misc_ref_invalid) /* 84 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 85 tra  */
+        .long local_label(misc_ref_invalid) /* 86 misc  */
+        .long local_label(misc_ref_invalid) /* 87 immheader  */
+        .long local_label(misc_ref_invalid) /* 88 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 89 cons  */
+        .long local_label(misc_ref_node) /* 8a value_cell  */
+        .long local_label(misc_ref_invalid) /* 8b imm  */
+        .long local_label(misc_ref_invalid) /* 8c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 8d tra  */
+        .long local_label(misc_ref_invalid) /* 8e misc  */
+        .long local_label(misc_ref_invalid) /* 8f immheader  */
+        /* 90-9f  */
+        .long local_label(misc_ref_invalid) /* 90 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 91 cons  */
+        .long local_label(misc_ref_node) /* 92 xfunction  */
+        .long local_label(misc_ref_invalid) /* 93 imm  */
+        .long local_label(misc_ref_invalid) /* 94 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 95 tra  */
+        .long local_label(misc_ref_invalid) /* 96 misc  */
+        .long local_label(misc_ref_invalid) /* 97 immheader  */
+        .long local_label(misc_ref_invalid) /* 98 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* 99 cons  */
+        .long local_label(misc_ref_node) /* 9a arrayN  */
+        .long local_label(misc_ref_invalid) /* 9b imm  */
+        .long local_label(misc_ref_invalid) /* 9c odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* 9d tra  */
+        .long local_label(misc_ref_invalid) /* 9e misc  */
+        .long local_label(misc_ref_invalid) /* 9f immheader  */
+        /* a0-af  */
+        .long local_label(misc_ref_invalid) /* a0 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* a1 cons  */
+        .long local_label(misc_ref_node) /* a2 vectorH  */
+        .long local_label(misc_ref_invalid) /* a3 imm  */
+        .long local_label(misc_ref_invalid) /* a4 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* a5 tra  */
+        .long local_label(misc_ref_invalid) /* a6 misc  */
+        .long local_label(misc_ref_single_float_vector) /* a7 sf_vector  */
+        .long local_label(misc_ref_invalid) /* a8 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* a9 cons  */
+        .long local_label(misc_ref_node) /* aa simple_vector  */
+        .long local_label(misc_ref_invalid) /* ab imm  */
+        .long local_label(misc_ref_invalid) /* ac odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* ad tra  */
+        .long local_label(misc_ref_invalid) /* ae misc  */
+        .long local_label(misc_ref_u32) /* af u32  */
+        /* b0-bf  */
+        .long local_label(misc_ref_invalid) /* b0 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* b1 cons  */
+        .long local_label(misc_ref_invalid) /* b2 nodeheader  */
+        .long local_label(misc_ref_invalid) /* b3 imm  */
+        .long local_label(misc_ref_invalid) /* b4 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* b5 tra  */
+        .long local_label(misc_ref_invalid) /* b6 misc  */
+        .long local_label(misc_ref_s32) /* b7 s32  */
+        .long local_label(misc_ref_invalid) /* b8 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* b9 cons  */
+        .long local_label(misc_ref_invalid) /* ba nodeheader  */
+        .long local_label(misc_ref_invalid) /* bb imm  */
+        .long local_label(misc_ref_invalid) /* bc odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* bd tra  */
+        .long local_label(misc_ref_invalid) /* be misc  */
+        .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector  */
+        /* c0-cf  */
+        .long local_label(misc_ref_invalid) /* c0 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* c1 cons  */
+        .long local_label(misc_ref_invalid) /* c2 nodeheader  */
+        .long local_label(misc_ref_invalid) /* c3 imm  */
+        .long local_label(misc_ref_invalid) /* c4 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* c5 tra  */
+        .long local_label(misc_ref_invalid) /* c6 misc  */
+        .long local_label(misc_ref_string) /* c7 simple_base_string  */
+        .long local_label(misc_ref_invalid) /* c8 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* c9 cons  */
+        .long local_label(misc_ref_invalid) /* ca nodeheader  */
+        .long local_label(misc_ref_invalid) /* cb imm  */
+        .long local_label(misc_ref_invalid) /* cc odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* cd tra  */
+        .long local_label(misc_ref_invalid) /* ce misc  */
+        .long local_label(misc_ref_u8) /* cf u8  */
+        /* d0-df  */
+        .long local_label(misc_ref_invalid) /* d0 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* d1 cons  */
+        .long local_label(misc_ref_invalid) /* d2 nodeheader  */
+        .long local_label(misc_ref_invalid) /* d3 imm  */
+        .long local_label(misc_ref_invalid) /* d4 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* d5 tra  */
+        .long local_label(misc_ref_invalid) /* d6 misc  */
+        .long local_label(misc_ref_s8)      /* d7 s8  */
+        .long local_label(misc_ref_invalid) /* d8 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* d9 cons  */
+        .long local_label(misc_ref_invalid) /* da nodeheader  */
+        .long local_label(misc_ref_invalid) /* db imm  */
+        .long local_label(misc_ref_invalid) /* dc odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* dd tra  */
+        .long local_label(misc_ref_invalid) /* de misc  */
+        .long local_label(misc_ref_invalid) /* df immheader  */
+        /* e0-ef  */
+        .long local_label(misc_ref_invalid) /* e0 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* e1 cons  */
+        .long local_label(misc_ref_invalid) /* e2 nodeheader  */
+        .long local_label(misc_ref_invalid) /* e3 imm  */
+        .long local_label(misc_ref_invalid) /* e4 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* e5 tra  */
+        .long local_label(misc_ref_invalid) /* e6 misc  */
+        .long local_label(misc_ref_u16) /* e7 u16  */
+        .long local_label(misc_ref_invalid) /* e8 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* e9 cons  */
+        .long local_label(misc_ref_invalid) /* ea nodeheader  */
+        .long local_label(misc_ref_invalid) /* eb imm  */
+        .long local_label(misc_ref_invalid) /* ec odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* ed tra  */
+        .long local_label(misc_ref_invalid) /* ee misc  */
+        .long local_label(misc_ref_s16) /* ef s16  */
+        /* f0-ff  */
+        .long local_label(misc_ref_invalid) /* f0 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* f1 cons  */
+        .long local_label(misc_ref_invalid) /* f2 nodeheader  */
+        .long local_label(misc_ref_invalid) /* f3 imm  */
+        .long local_label(misc_ref_invalid) /* f4 odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* f5 tra  */
+        .long local_label(misc_ref_invalid) /* f6 misc  */
+        .long local_label(misc_ref_double_float_vector) /* f7 df vector  */
+        .long local_label(misc_ref_invalid) /* f8 even_fixnum  */
+        .long local_label(misc_ref_invalid) /* f9 cons  */
+        .long local_label(misc_ref_invalid) /* fa nodeheader  */
+        .long local_label(misc_ref_invalid) /* fb imm  */
+        .long local_label(misc_ref_invalid) /* fc odd_fixnum  */
+        .long local_label(misc_ref_invalid) /* fd tra  */
+        .long local_label(misc_ref_invalid) /* fe misc  */
+        .long local_label(misc_ref_bit_vector) /* ff bit_vector  */
+
+/* Functions are funny.  The first N words are treated as */
+/* (UNSIGNED-BYTE 32), where N is the low 16 bits of the first word. */
+
+local_label(misc_ref_function):
+	__(movzwl misc_data_offset(%arg_y), %imm0)
+	__(shl $fixnumshift,%imm0)
+	__(rcmpl(%arg_z,%imm0))
+	__(jb local_label(misc_ref_u32))
+local_label(misc_ref_node):
+	__(movl misc_data_offset(%arg_y,%arg_z),%arg_z)
+	__(ret)
+local_label(misc_ref_u32):
+	__(movl misc_data_offset(%arg_y,%arg_z),%imm0)
+	__(jmp _SPmakeu32)
+local_label(misc_ref_s32):
+	__(movl misc_data_offset(%arg_y,%arg_z),%imm0)
+	__(jmp _SPmakes32)
+local_label(misc_ref_single_float_vector):
+	__(movss misc_data_offset(%arg_y,%arg_z),%fp1)
+	__(movl $single_float_header,%imm0)
+	__(movd %imm0,%mm0)
+	__(Misc_Alloc_Fixed(%arg_z,single_float.size))
+	__(movss %fp1,single_float.value(%arg_z))
+	__(ret)
+local_label(misc_ref_double_float_vector):
+	__(movsd misc_dfloat_offset(%arg_y,%arg_z),%fp1)
+	__(movl $double_float_header,%imm0)
+	__(movd %imm0,%mm0)
+	__(Misc_Alloc_Fixed(%arg_z,double_float.size))
+	__(movsd %fp1,double_float.value(%arg_z))
+	__(ret)
+local_label(misc_ref_fixnum_vector):
+	__(movl misc_data_offset(%arg_y,%arg_z),%imm0)
+	__(box_fixnum(%imm0,%arg_z))
+	__(ret)
+local_label(misc_ref_u8):
+	__(movl %arg_z,%imm0)
+	__(shr $2,%imm0)
+	__(movzbl misc_data_offset(%arg_y,%imm0),%imm0)
+	__(box_fixnum(%imm0,%arg_z))
+	__(ret)
+local_label(misc_ref_s8):
+	__(movl %arg_z,%imm0)
+	__(shr $2,%imm0)
+	__(movsbl misc_data_offset(%arg_y,%imm0),%imm0)
+	__(box_fixnum(%imm0,%arg_z))
+	__(ret)
+local_label(misc_ref_string):
+	__(movl %arg_z,%imm0)
+	__(movl misc_data_offset(%arg_y,%imm0),%imm0)
+	__(shll $charcode_shift,%imm0)
+	__(leal subtag_character(%imm0),%arg_z)
+	__(ret)
+local_label(misc_ref_u16):
+	__(movl %arg_z,%imm0)
+	__(shrl $1,%imm0)
+	__(movzwl misc_data_offset(%arg_y,%imm0),%imm0)
+	__(box_fixnum(%imm0,%arg_z))
+	__(ret)
+local_label(misc_ref_s16):
+	__(movl %arg_z,%imm0)
+	__(shrl $1,%imm0)
+	__(movswl misc_data_offset(%arg_y,%imm0),%imm0)
+	__(box_fixnum(%imm0,%arg_z))
+	__(ret)
+local_label(misc_ref_bit_vector):
+	__(unbox_fixnum(%arg_z,%imm0))
+	__(btl %imm0,misc_data_offset(%arg_y))
+	__(setc %imm0_b)
+	__(movzbl %imm0_b,%imm0)
+	__(box_fixnum(%imm0,%arg_z))
+	__(ret)
+local_label(misc_ref_invalid):
+	__(push $XBADVEC)
+	__(set_nargs(3))
+	__(jmp _SPksignalerr)
 _endfn(C(misc_ref_common))
 
+/* Like misc_ref, only the boxed subtag is in temp0. */
 _spentry(subtag_misc_ref)
-	__(int $3)
+	__(mov %arg_y,%imm0)
+	__(and $tagmask,%imm0)
+	__(cmp $tag_misc,%imm0)
+	__(je,pt 0f)
+	__(uuo_error_reg_not_tag(Rarg_y,tag_misc))
+0:	__(testb $fixnummask,%arg_z_b)
+	__(je,pt 1f)
+	__(uuo_error_reg_not_fixnum(Rarg_z))
+1:	__(movl misc_header_offset(%arg_y),%imm0)
+	__(xorb %imm0_b,%imm0_b)
+	__(shrl $num_subtag_bits-fixnumshift,%imm0)
+	__(cmp %imm0,%arg_z)
+	__(jb 2f)
+	__(uuo_error_vector_bounds(Rarg_z,Rarg_y))
+2:	__(unbox_fixnum(%temp0,%imm0))
+	__(jmp C(misc_ref_common))
 _endsubp(subtag_misc_ref)
 
@@ -92,16 +463,8 @@
 
 /* Make a lisp integer (fixnum or one-digit bignum) from the value in %imm0 */
-/* This is slightly icky because we have only 1 immediate register */
 _spentry(makes32)
+	__(imull $fixnumone,%imm0,%arg_z)	/* result is fixnum-tagged */
+	__(jno 0f)				/* but may have overflowed */
 	__(movd %imm0,%mm1)
-	__(shll $fixnumshift, %imm0)
-	__(movl %imm0,%arg_z)
-	__(movd %mm1,%imm0)
-	__(sarl $24,%imm0)
-	__(movb %al,%ah)
-	__(shlb $fixnumshift,%al)
-	__(sarb $fixnumshift,%al)
-	__(cmpb %al,%ah)		/* high bits just sign? */
-	__(je,pt 0f)			/* yes, value fits in a fixnum */
 	__(movl $one_digit_bignum_header,%imm0)
 	__(movd %imm0,%mm0)
@@ -182,5 +545,16 @@
 /*   double binding of *interrupt-level* out-of-line */
 _spentry(nmkunwind)
-	__(int $3)
+	__(movl %rcontext:tcr.tlb_pointer,%arg_z)
+        __(movl INTERRUPT_LEVEL_BINDING_INDEX(%arg_z),%arg_y)
+	__(push %arg_y)
+	__(push $INTERRUPT_LEVEL_BINDING_INDEX)
+	__(push %rcontext:tcr.db_link)
+	__(movl %esp,%rcontext:tcr.db_link)
+	__(movl $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_z))
+	__(movl $undefined,%arg_z)
+	/* %arg_z = tag, %xfn (%temp1) = pc */
+	__(Make_Catch(fixnumone))
+	__(movl %arg_y,%arg_z)
+        __(jmp _SPbind_interrupt_level)
 _endsubp(nmkunwind)
 
@@ -291,9 +665,26 @@
 _endsubp(rplacd)
 
+/* Storing into a gvector can be handles the same way as storing into a CONS. */
 /* args (src, unscaled-idx, val) in temp0, arg_y, arg_z */
 _spentry(gvset)
         .globl C(egc_gvset)
 C(egc_gvset):
-	__(int $3)
+	__(movl %arg_z,misc_data_offset(%temp0,%arg_y))
+	__(rcmpl(%arg_z,%temp0))
+	__(ja 1f)
+0:	__(repret)
+1:	__(lea misc_data_offset(%temp0,%arg_y),%imm0)
+	__(subl lisp_global(heap_start),%imm0)
+	__(shrl $dnode_shift,%imm0)
+	__(cmpl lisp_global(oldspace_dnode_count),%imm0)
+	__(jae 0b)
+	__(andl $~(1<<bitmap_shift-1),%temp0)
+	__(shrl $bitmap_shift-fixnumshift,%temp0)
+	__(andl $31,%imm0)
+	__(addl lisp_global(refbits),%temp0)
+	__(xorb $31,%imm0_b)
+	__(lock)
+	__(btsl %imm0,(%temp0))
+	__(ret)
 _endsubp(gvset)
 
@@ -440,10 +831,10 @@
 
 /* Have to be a little careful here: the caller may or may not have pushed  */
-/*   an empty frame, and we may or may not have needed one.  We can't easily  */
-/*   tell whether or not a frame will be needed (if the caller didn't reserve  */
-/*   a frame, whether or not we need one depends on the length of the list  */
-/*   in arg_z.  So, if the caller didn't push a frame, we do so ; once everything's  */
-/*   been spread, we discard the reserved frame (regardless of who pushed it)  */
-/*   if all args fit in registers.   */
+/* an empty frame, and we may or may not have needed one.  We can't easily  */
+/* tell whether or not a frame will be needed (if the caller didn't reserve  */
+/* a frame, whether or not we need one depends on the length of the list  */
+/* in arg_z.  So, if the caller didn't push a frame, we do so; once */
+/* everything's been spread, we discard the reserved frame (regardless of
+/* who pushed it) if all args fit in registers.   */
 _spentry(spreadargz)
 	__(int $3)
@@ -541,6 +932,6 @@
 /* is the same as arg_z's.  If not an integer, error.   */
 _spentry(integer_sign)
+	__(mov %arg_z,%imm0)
 	__(testb $tagmask,%arg_z_b)
-	__(mov %arg_z,%imm0)
 	__(je 8f)
 	__(extract_typecode(%arg_z,%imm0))
@@ -656,8 +1047,8 @@
 	
 _spentry(specrefcheck)
+	__(movl %rcontext:tcr.tlb_pointer,%temp1)
+	__(mov %arg_z,%arg_y)
 	__(movl symbol.binding_index(%arg_z),%imm0)
 	__(cmp %rcontext:tcr.tlb_limit,%imm0)
-	__(movl %rcontext:tcr.tlb_pointer,%temp1)
-	__(mov %arg_z,%arg_y)
 	__(jae 7f)
 	__(movl (%temp1,%imm0),%arg_z)
@@ -704,5 +1095,16 @@
 
 _spentry(bind_interrupt_level_0)
-	__(int $3)
+	__(movl %rcontext:tcr.tlb_pointer,%arg_y)
+	__(cmpl $0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
+	__(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
+	__(push $INTERRUPT_LEVEL_BINDING_INDEX)
+	__(push %rcontext:tcr.db_link)
+	__(movl %esp,%rcontext:tcr.db_link)
+	__(movl $0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
+	__(js,pn 1f)
+0:	__(jmp *%ra0)
+	/* Interrupt level was negative; interrupt may be pending */
+1:	__(check_pending_enabled_interrupt(2f))
+2:	__(jmp *%ra0)
 _endsubp(bind_interrupt_level_0)
 
@@ -711,6 +1113,16 @@
 _endsubp(bind_interrupt_level_m1)
 
+/* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z.  If that value's 0, */
+/* do what _SPbind_interrupt_level_0 does. */
 _spentry(bind_interrupt_level)
-	__(int $3)
+	__(test %arg_z,%arg_z)
+	__(jz _SPbind_interrupt_level_0)
+	__(movl %rcontext:tcr.tlb_pointer,%arg_y)
+	__(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
+	__(push $INTERRUPT_LEVEL_BINDING_INDEX)
+	__(push %rcontext:tcr.db_link)
+	__(movl %esp,%rcontext:tcr.db_link)
+	__(movl %arg_z,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
+	__(jmp *%ra0)
 _endsubp(bind_interrupt_level)
 
@@ -723,6 +1135,15 @@
 _endsubp(progvrestore)
 
+/* %arg_z <- %arg_y + %arg_z.  Do the fixnum case - including overflow -  */
+/* inline.  Call out otherwise.   */
 _spentry(builtin_plus)
-	__(int $3)
+	__(movl %arg_y,%imm0)
+	__(orl %arg_z,%imm0)
+	__(testb $fixnummask,%imm0_b)
+	__(jne 1f)
+	__(addl %arg_y,%arg_z)
+	__(jo,pn C(fix_one_bit_overflow))
+	__(repret)
+1:	__(jump_builtin(_builtin_plus,2))
 _endsubp(builtin_plus)
 
@@ -815,5 +1236,47 @@
 
 _spentry(builtin_length)
-	__(int $3)
+	__(extract_fulltag(%arg_z,%imm0))
+	__(cmpl $tag_list,%imm0)
+	__(jz 2f)
+	__(andl $tagmask,%imm0)
+	__(cmpl $tag_misc,%imm0)
+	__(jnz 8f)
+	__(extract_subtag(%arg_z,%imm0_b))
+	__(rcmpb(%imm0_b,$min_vector_subtag))
+	__(jb 8f)
+	__(je 1f)
+	/* (simple-array * (*)) */
+	__(movl %arg_z,%arg_y)
+	__(vector_length(%arg_y,%arg_z))
+	__(ret)
+1:	/* vector header */
+	__(movl vectorH.logsize(%arg_z),%arg_z)
+	__(ret)
+2:	/* list.  Maybe null, maybe dotted or circular. */
+	__(movl $-fixnumone,%arg_y)
+	__(movl %arg_z,%temp0)	/* fast pointer */
+	__(movl %arg_z,%temp1)  /* slow pointer */
+3:	__(movb %temp0_b,%al)
+	__(andb $fulltagmask,%al)
+	__(addl $fixnumone,%arg_y)
+	__(compare_reg_to_nil(%temp0))
+	__(je 9f)
+	__(cmpb $fulltag_cons,%al)
+	__(jne 8f)
+	__(movb %temp1_b,%ah)
+	__(andb $fulltagmask,%ah)
+	__(_cdr(%temp0,%temp0))
+	__(testl $fixnumone,%arg_y)
+	__(je 3b)
+	__(cmpb $fulltag_cons,%ah)
+	__(jne 8f)
+	__(_cdr(%temp1,%temp1))
+	__(cmpl %temp0,%temp1)
+	__(jne 3b)
+8:
+	__(jump_builtin(_builtin_length,1))
+9:
+	__(movl %arg_y,%arg_z)
+	__(ret)
 _endsubp(builtin_length)
 
@@ -889,6 +1352,6 @@
 _spentry(builtin_aref1)
 	__(extract_typecode(%arg_y,%imm0))
+	__(box_fixnum_no_flags(%imm0,%temp0))
 	__(cmpb $min_vector_subtag,%imm0_b)
-	__(box_fixnum_no_flags(%imm0,%arg_y))
 	__(ja _SPsubtag_misc_ref)
 	__(jump_builtin(_builtin_aref1,2))
