Index: /trunk/source/lisp-kernel/x86-spentry32.s
===================================================================
--- /trunk/source/lisp-kernel/x86-spentry32.s	(revision 15294)
+++ /trunk/source/lisp-kernel/x86-spentry32.s	(revision 15295)
@@ -3866,6 +3866,6 @@
 
 _spentry(builtin_eql)
-	__(cmpl %arg_y,%arg_z)
-	__(je 1f)
+0:      __(cmpl %arg_y,%arg_z)
+	__(je 8f)
 	/* Not EQ.  Could only possibly be EQL if both are tag-misc  */
 	/* and both have the same subtag. */
@@ -3873,17 +3873,66 @@
 	__(andb $tagmask,%imm0_b)
 	__(cmpb $tag_misc,%imm0_b)
-	__(jne 2f)
+	__(jne 9f)
 	__(movb %arg_z_b,%imm0_bh)
 	__(andb $tagmask,%imm0_bh)
 	__(cmpb %imm0_bh,%imm0_b)
-	__(jne 2f)
+	__(jne 9f)
 	__(extract_subtag(%arg_y,%imm0_b))
 	__(extract_subtag(%arg_z,%imm0_bh))
 	__(cmpb %imm0_b,%imm0_bh)
-	__(jne 2f)
-	__(jump_builtin(_builtin_eql,2))
-1:	__(movl $t_value,%arg_z)
-	__(ret)
-2:	__(movl $nil_value,%arg_z)
+	__(jne 9f)
+        __(cmpb $subtag_macptr,%imm0_b)
+        __(je 1f)
+        __(cmpb $subtag_single_float,%imm0_b)
+        __(jne 2f)
+1:      __(movl misc_data_offset(%arg_y),%imm0)
+        __(cmpl misc_data_offset(%arg_z),%imm0)
+        __(movl $t_value,%arg_z)
+        __(movl $nil_value,%imm0)
+        __(cmovnel %imm0,%arg_z)
+        __(ret)
+2:      __(cmpb $subtag_double_float,%imm0_b)
+        __(jne 3f)
+        __(movl double_float.value(%arg_y),%imm0)
+        __(cmpl double_float.value(%arg_z),%imm0)
+        __(jne 9f)
+        __(movl double_float.value+node_size(%arg_y),%imm0)
+        __(cmpl double_float.value+node_size(%arg_z),%imm0)
+        __(movl $t_value,%arg_z)
+        __(movl $nil_value,%imm0)
+        __(cmovnel %imm0,%arg_z)
+        __(ret)
+3:      __(cmpb $subtag_ratio,%imm0_b)
+        __(je 4f)
+        __(cmpb $subtag_complex,%imm0_b)
+        __(jne 6f)
+4:      __(pushl %ebp)
+        __(pushl ratio.denom(%arg_y))
+        __(pushl ratio.denom(%arg_z))
+        __(movl ratio.numer(%arg_y),%arg_y)                        
+        __(movl ratio.numer(%arg_z),%arg_z)
+        __(pushl $5f)
+        __(jmp 0b)
+__(tra(5))
+        __(compare_reg_to_nil(%arg_z))
+        __(popl %arg_z)
+        __(popl %arg_y)
+        __(popl %ebp)
+        __(je 9f)
+        __(jmp 0b)
+6:      __(cmpb $subtag_bignum,%imm0_b)
+        __(jne 9f)
+        __(getvheader(%arg_y,%imm0))
+        __(cmpl misc_header_offset(%arg_z),%imm0)
+        __(jne 9f)
+        __(header_length(%imm0,%temp0))
+7:      __(movl misc_data_offset-node_size(%arg_y,%temp0),%imm0)
+        __(cmpl misc_data_offset-node_size(%arg_z,%temp0),%imm0)
+        __(jne 9f)
+        __(subl $node_size,%temp0)
+        __(jne 7b)
+8:	__(movl $t_value,%arg_z)
+	__(ret)
+9:	__(movl $nil_value,%arg_z)
 	__(ret)
 _endsubp(builtin_eql)
Index: /trunk/source/lisp-kernel/x86-spentry64.s
===================================================================
--- /trunk/source/lisp-kernel/x86-spentry64.s	(revision 15294)
+++ /trunk/source/lisp-kernel/x86-spentry64.s	(revision 15295)
@@ -3700,6 +3700,6 @@
 
 _spentry(builtin_eql)
-	__(cmpq %arg_y,%arg_z)
-	__(je 1f)
+0:      __(cmpq %arg_y,%arg_z)
+	__(je 8f)
 	/* Not EQ.  Could only possibly be EQL if both are tag-misc  */
 	/* and both have the same subtag   */
@@ -3707,15 +3707,57 @@
 	__(extract_lisptag(%arg_z,%imm1))
 	__(cmpb $tag_misc,%imm0_b)
-	__(jne 2f)
+	__(jne 9f)
 	__(cmpb %imm0_b,%imm1_b)
-	__(jne 2f)
+	__(jne 9f)
 	__(extract_subtag(%arg_y,%imm0))
 	__(extract_subtag(%arg_z,%imm1))
 	__(cmpb %imm0_b,%imm1_b)
-	__(jne 2f)
-	__(jump_builtin(_builtin_eql,2))
-1:	__(movl $t_value,%arg_z_l)
-	__(ret)
-2:	__(movl $nil_value,%arg_z_l)
+	__(jne 9f)
+        __(cmpb $subtag_macptr,%imm0_b)
+        __(je 1f)
+        __(cmpb $subtag_double_float,%imm0_b)
+        __(jne 2f)
+1:      __(movq misc_data_offset(%arg_y),%imm0)
+        __(cmpq misc_data_offset(%arg_z),%imm0)
+        __(movl $t_value,%arg_z_l)
+        __(movl $nil_value,%imm0_l)
+        __(cmovnel %imm0_l,%arg_z_l)
+        __(ret)
+2:      __(cmpb $subtag_ratio,%imm0_b)
+        __(je 3f)
+        __(cmpb $subtag_complex,%imm0_b)
+        __(jne 5f)
+3:      __(pushq %rbp)
+        __(movq %rsp,%rsp)
+        __(pushq ratio.denom(%arg_y))
+        __(pushq ratio.denom(%arg_z))
+        __(movq ratio.numer(%arg_y),%arg_y)
+        __(movq ratio.numer(%arg_z),%arg_z)
+        __(lea 4f(%rip),%ra0)
+        __(pushq %ra0)
+        __(jmp 0b)
+__(tra(4))
+        __(compare_reg_to_nil(%arg_z))
+        __(popq %arg_z)
+        __(popq %arg_y)
+        __(popq %rbp)
+        __(je 9f)
+        __(jmp 0b)
+5:      __(cmpb $subtag_bignum,%imm0_b)
+        __(jne 9f)
+        __(getvheader(%arg_y,%imm2))
+        __(cmpq misc_header_offset(%arg_z),%imm2)
+        __(jne 9f)
+        __(shrq $num_subtag_bits,%imm2)
+        __(xorl %imm1_l,%imm1_l)
+6:      __(movl misc_data_offset(%arg_y,%imm1,4),%imm0_l)
+        __(cmpl misc_data_offset(%arg_z,%imm1,4),%imm0_l)
+        __(jne 9f)
+        __(addq $1,%imm1)
+        __(cmpq %imm1,%imm2)
+        __(jne 6b)
+8:	__(movl $t_value,%arg_z_l)
+	__(ret)
+9:	__(movl $nil_value,%arg_z_l)
 	__(ret)	
 _endsubp(builtin_eql)
