diff options
| author | Paul Eggert | 2017-05-19 13:43:03 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-05-19 13:43:37 -0700 |
| commit | c1c8b67246c4314b302cca2ac43f13a0baba4c16 (patch) | |
| tree | 6bceb3cec3447a8c69a177d2469450f2ab48cd90 /src/data.c | |
| parent | 7ff8c5cae02afa511d11b4b32d1a56f7070bfb97 (diff) | |
| download | emacs-c1c8b67246c4314b302cca2ac43f13a0baba4c16.tar.gz emacs-c1c8b67246c4314b302cca2ac43f13a0baba4c16.zip | |
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) */) | |||
| 3066 | } | 3066 | } |
| 3067 | 3067 | ||
| 3068 | static Lisp_Object | 3068 | static Lisp_Object |
| 3069 | ash_lsh_impl (register Lisp_Object value, Lisp_Object count, bool lsh) | 3069 | ash_lsh_impl (Lisp_Object value, Lisp_Object count, bool lsh) |
| 3070 | { | 3070 | { |
| 3071 | register Lisp_Object val; | 3071 | /* This code assumes that signed right shifts are arithmetic. */ |
| 3072 | verify ((EMACS_INT) -1 >> 1 == -1); | ||
| 3073 | |||
| 3074 | Lisp_Object val; | ||
| 3072 | 3075 | ||
| 3073 | CHECK_NUMBER (value); | 3076 | CHECK_NUMBER (value); |
| 3074 | CHECK_NUMBER (count); | 3077 | CHECK_NUMBER (count); |
| @@ -3076,12 +3079,12 @@ ash_lsh_impl (register Lisp_Object value, Lisp_Object count, bool lsh) | |||
| 3076 | if (XINT (count) >= EMACS_INT_WIDTH) | 3079 | if (XINT (count) >= EMACS_INT_WIDTH) |
| 3077 | XSETINT (val, 0); | 3080 | XSETINT (val, 0); |
| 3078 | else if (XINT (count) > 0) | 3081 | else if (XINT (count) > 0) |
| 3079 | XSETINT (val, XUINT (value) << XFASTINT (count)); | 3082 | XSETINT (val, XUINT (value) << XINT (count)); |
| 3080 | else if (XINT (count) <= -EMACS_INT_WIDTH) | 3083 | else if (XINT (count) <= -EMACS_INT_WIDTH) |
| 3081 | XSETINT (val, lsh ? 0 : XINT (value) < 0 ? -1 : 0); | 3084 | XSETINT (val, lsh ? 0 : XINT (value) < 0 ? -1 : 0); |
| 3082 | else | 3085 | else |
| 3083 | XSETINT (val, lsh ? XUINT (value) >> -XINT (count) : \ | 3086 | XSETINT (val, (lsh ? XUINT (value) >> -XINT (count) |
| 3084 | XINT (value) >> -XINT (count)); | 3087 | : XINT (value) >> -XINT (count))); |
| 3085 | return val; | 3088 | return val; |
| 3086 | } | 3089 | } |
| 3087 | 3090 | ||