diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2017-05-19 13:43:03 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2017-05-19 13:43:37 -0700 |
commit | c1c8b67246c4314b302cca2ac43f13a0baba4c16 (patch) | |
tree | 6bceb3cec3447a8c69a177d2469450f2ab48cd90 /src/data.c | |
parent | 7ff8c5cae02afa511d11b4b32d1a56f7070bfb97 (diff) | |
download | emacs-c1c8b67246c4314b302cca2ac43f13a0baba4c16.tar.gz |
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.
Diffstat (limited to 'src/data.c')
-rw-r--r-- | src/data.c | 13 |
1 files changed, 8 insertions, 5 deletions
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; } |