Index: /trunk/ccl/lisp-kernel/spentry.s
===================================================================
--- /trunk/ccl/lisp-kernel/spentry.s	(revision 249)
+++ /trunk/ccl/lisp-kernel/spentry.s	(revision 250)
@@ -3341,8 +3341,7 @@
         
 _spentry(builtin_length)
-	__(cmpri(cr1,arg_z,nil_value))
 	__(extract_typecode(imm0,arg_z))
 	__(cmpri(cr0,imm0,min_vector_subtag))
-	__(beq cr1,1f)
+	__(cmpri(cr2,imm0,tag_list))
 	__(beq- cr0,2f)
 	__(blt- cr0,3f)
@@ -3353,8 +3352,34 @@
 	__(ldr(arg_z,vectorH.logsize(arg_z)))
 	__(blr)
-1:
-	__(li arg_z,0)
-	__(blr)
-3:
+3:	__(bne cr2,9f)
+	__(li temp2,0)
+	__(mr temp0,arg_z)
+	__(mr temp1,arg_z)
+4:	__(cmpri(cr7,temp0,nil_value))
+	__(extract_lisptag(imm0,temp0))
+	__(extract_lisptag(imm1,temp1))
+	__(cmpri(cr0,imm0,tag_list))
+	__(cmpri(cr1,imm1,tag_list))
+	__(beq cr7,8f)
+	__(bne cr0,9f)
+	__(_cdr(temp3,temp0))
+	__(bne cr1,9f)
+	__(cmpri(cr4,temp2,0))
+	__(cmpri(cr3,temp3,nil_value))
+	__(extract_lisptag(imm0,temp3))
+	__(cmpr(cr5,temp0,temp1))
+	__(bne cr3,5f)
+	__(addi arg_z,temp2,fixnumone)
+	__(blr)
+5:	__(bne cr5,6f)
+	__(bne cr4,9f)
+6:	__(_cdr(temp0,temp3))	
+	__(_cdr(temp1,temp1))
+	__(addi temp2,temp2,2<<fixnumshift)
+	__(b 4b)
+8:	
+	__(mr arg_z,temp2)
+	__(blr)
+9:	
 	__(jump_builtin(_builtin_length,1))
 
