Optimize CHAR-EQUAL on constant and base-char args.
[sbcl.git] / src / code / target-char.lisp
index 0994977..265a09f 100644 (file)
@@ -519,7 +519,24 @@ is either numeric or alphabetic."
 
 (defun two-arg-char-equal (c1 c2)
   (or (eq c1 c2)
-      (= (equal-char-code c1) (equal-char-code c2))))
+      (typecase c1
+        (base-char
+         (and (base-char-p c2)
+              (let* ((code1 (char-code c1))
+                     (code2 (char-code c2))
+                     (sum (logxor code1 code2)))
+                (when (eql sum #x20)
+                  (let ((sum (+ code1 code2)))
+                    (or (and (> sum 161) (< sum 213))
+                        (and (> sum 415) (< sum 461))
+                        (and (> sum 463) (< sum 477))))))))
+        (t
+         (= (equal-char-code c1) (equal-char-code c2))))))
+
+(defun char-equal-constant (x char reverse-case-char)
+  (declare (type character x))
+  (or (eq char x)
+      (eq reverse-case-char x)))
 
 (defun char-equal (character &rest more-characters)
   #!+sb-doc