From: Paul Eggert Date: Fri, 19 May 2017 20:43:03 +0000 (-0700) Subject: Check that signed right shift is arithmetic X-Git-Tag: emacs-26.0.90~521^2~351 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c1c8b67246c4314b302cca2ac43f13a0baba4c16;p=emacs.git Check that signed right shift is arithmetic * src/data.c (ash_lsh_impl): Verify that signed right shift is arithmetic; if we run across a compiler that uses a logical shift we’ll need to complicate the code before removing this compile-time check. Help the compiler do common subexpression elimination better. --- diff --git a/src/data.c b/src/data.c index 3ff2a809744..4242b90e628 100644 --- a/src/data.c +++ b/src/data.c @@ -3066,9 +3066,12 @@ usage: (logxor &rest INTS-OR-MARKERS) */) } static Lisp_Object -ash_lsh_impl (register Lisp_Object value, Lisp_Object count, bool lsh) +ash_lsh_impl (Lisp_Object value, Lisp_Object count, bool lsh) { - register Lisp_Object val; + /* This code assumes that signed right shifts are arithmetic. */ + verify ((EMACS_INT) -1 >> 1 == -1); + + Lisp_Object val; CHECK_NUMBER (value); CHECK_NUMBER (count); @@ -3076,12 +3079,12 @@ ash_lsh_impl (register Lisp_Object value, Lisp_Object count, bool lsh) if (XINT (count) >= EMACS_INT_WIDTH) XSETINT (val, 0); else if (XINT (count) > 0) - XSETINT (val, XUINT (value) << XFASTINT (count)); + XSETINT (val, XUINT (value) << XINT (count)); else if (XINT (count) <= -EMACS_INT_WIDTH) XSETINT (val, lsh ? 0 : XINT (value) < 0 ? -1 : 0); else - XSETINT (val, lsh ? XUINT (value) >> -XINT (count) : \ - XINT (value) >> -XINT (count)); + XSETINT (val, (lsh ? XUINT (value) >> -XINT (count) + : XINT (value) >> -XINT (count))); return val; }