>From 24a58620cb8ce4aa11e2428d86e58911e7975aeb Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 30 May 2019 14:57:21 -0700 Subject: [PATCH] Improve eq1/memql performance * src/fns.c (Fmemql, Feql): Inline to tweak performance. --- src/fns.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/fns.c b/src/fns.c index da830a9000..cb47b818f1 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1521,7 +1521,7 @@ DEFUN ("elt", Felt, Selt, 2, 2, 0, EMACS_UINT word[WORDS_PER_DOUBLE]; }; -/* Return true if X and Y are the same floating-point value. +/* Return true if the floats X and Y have the same value. This looks at X's and Y's representation, since (unlike '==') it returns true if X and Y are the same NaN. */ static bool @@ -1567,32 +1567,32 @@ DEFUN ("memql", Fmemql, Smemql, 2, 2, 0, The value is actually the tail of LIST whose car is ELT. */) (Lisp_Object elt, Lisp_Object list) { + Lisp_Object tail = list; + if (FLOATP (elt)) { - Lisp_Object tail = list; FOR_EACH_TAIL (tail) { Lisp_Object tem = XCAR (tail); if (FLOATP (tem) && same_float (elt, tem)) return tail; } - CHECK_LIST_END (tail, list); - return Qnil; } else if (BIGNUMP (elt)) { - Lisp_Object tail = list; FOR_EACH_TAIL (tail) { Lisp_Object tem = XCAR (tail); - if (equal_no_quit (elt, tem)) + if (BIGNUMP (tem) + && mpz_cmp (XBIGNUM (elt)->value, XBIGNUM (tem)->value) == 0) return tail; } - CHECK_LIST_END (tail, list); - return Qnil; } else return Fmemq (elt, list); + + CHECK_LIST_END (tail, list); + return Qnil; } DEFUN ("assq", Fassq, Sassq, 2, 2, 0, @@ -2301,7 +2301,9 @@ DEFUN ("eql", Feql, Seql, 2, 2, 0, if (FLOATP (obj1)) return FLOATP (obj2) && same_float (obj1, obj2) ? Qt : Qnil; else if (BIGNUMP (obj1)) - return equal_no_quit (obj1, obj2) ? Qt : Qnil; + return ((BIGNUMP (obj2) + && mpz_cmp (XBIGNUM (obj1)->value, XBIGNUM (obj2)->value) == 0) + ? Qt : Qnil); else return EQ (obj1, obj2) ? Qt : Qnil; } -- 2.21.0