summaryrefslogtreecommitdiff
path: root/src/data.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-05-19 13:43:03 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2017-05-19 13:43:37 -0700
commitc1c8b67246c4314b302cca2ac43f13a0baba4c16 (patch)
tree6bceb3cec3447a8c69a177d2469450f2ab48cd90 /src/data.c
parent7ff8c5cae02afa511d11b4b32d1a56f7070bfb97 (diff)
downloademacs-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.c13
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;
}