From 2fd38e5c496a2351a25e95df37a7900f6f80f22f Mon Sep 17 00:00:00 2001 From: Mattias EngdegÄrd Date: Sat, 20 Jul 2024 13:12:19 +0200 Subject: Simplify and speed up numeric comparisons This makes comparison functions (=, /=, <, <=, >, >=, min, max) quite a bit faster (10-20 %). Bytecode ops on fixnums are not affected, nor is `value<`. * src/data.c (arithcompare): Simplify the code to reduce the number of branches. Remove the comparison code argument; instead, return the relation encoded as bits, which can be tested cheaply. All callers adapted. * src/lisp.h (enum Arith_Comparison): Remove. (Cmp_Bit_*, cmp_bits_t): New. --- src/bytecode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/bytecode.c') diff --git a/src/bytecode.c b/src/bytecode.c index 75f9f1d0ac7..ce075c86afd 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1242,7 +1242,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, if (FIXNUMP (v1) && FIXNUMP (v2)) TOP = BASE_EQ (v1, v2) ? Qt : Qnil; else - TOP = arithcompare (v1, v2, ARITH_EQUAL); + TOP = arithcompare (v1, v2) & Cmp_EQ ? Qt : Qnil; NEXT; } @@ -1253,7 +1253,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, if (FIXNUMP (v1) && FIXNUMP (v2)) TOP = XFIXNUM (v1) > XFIXNUM (v2) ? Qt : Qnil; else - TOP = arithcompare (v1, v2, ARITH_GRTR); + TOP = arithcompare (v1, v2) & Cmp_GT ? Qt : Qnil; NEXT; } @@ -1264,7 +1264,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, if (FIXNUMP (v1) && FIXNUMP (v2)) TOP = XFIXNUM (v1) < XFIXNUM (v2) ? Qt : Qnil; else - TOP = arithcompare (v1, v2, ARITH_LESS); + TOP = arithcompare (v1, v2) & Cmp_LT ? Qt : Qnil; NEXT; } @@ -1275,7 +1275,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, if (FIXNUMP (v1) && FIXNUMP (v2)) TOP = XFIXNUM (v1) <= XFIXNUM (v2) ? Qt : Qnil; else - TOP = arithcompare (v1, v2, ARITH_LESS_OR_EQUAL); + TOP = arithcompare (v1, v2) & (Cmp_LT | Cmp_EQ) ? Qt : Qnil; NEXT; } @@ -1286,7 +1286,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, if (FIXNUMP (v1) && FIXNUMP (v2)) TOP = XFIXNUM (v1) >= XFIXNUM (v2) ? Qt : Qnil; else - TOP = arithcompare (v1, v2, ARITH_GRTR_OR_EQUAL); + TOP = arithcompare (v1, v2) & (Cmp_GT | Cmp_EQ) ? Qt : Qnil; NEXT; } -- cgit v1.2.1