summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2017-02-19 15:07:08 +0000
committerSalvatore Sanfilippo <antirez@gmail.com>2017-02-19 15:07:08 +0000
commit7329cc39818a05c168e7d1e791afb03c089f1933 (patch)
treed09a72acfa403dc024f58ae33a2def7f260138f8
parent4e9cf4cc7ed4b732fc4bb592f19ceb41d132954e (diff)
downloadredis-arm.tar.gz
ARM: Avoid fast path for BITOP.arm
GCC will produce certain unaligned multi load-store instructions that will be trapped by the Linux kernel since ARM v6 cannot handle them with unaligned addresses. Better to use the slower but safer implementation instead of generating the exception which should be anyway very slow.
-rw-r--r--src/bitops.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/bitops.c b/src/bitops.c
index 46eee22c3..7ab72633c 100644
--- a/src/bitops.c
+++ b/src/bitops.c
@@ -654,8 +654,11 @@ void bitopCommand(client *c) {
/* Fast path: as far as we have data for all the input bitmaps we
* can take a fast path that performs much better than the
- * vanilla algorithm. */
+ * vanilla algorithm. On ARM we skip the fast path since it will
+ * result in GCC compiling the code using multiple-words load/store
+ * operations that are not supported even in ARM >= v6. */
j = 0;
+ #ifndef __arm__
if (minlen >= sizeof(unsigned long)*4 && numkeys <= 16) {
unsigned long *lp[16];
unsigned long *lres = (unsigned long*) res;
@@ -716,6 +719,7 @@ void bitopCommand(client *c) {
}
}
}
+ #endif
/* j is set to the next byte to process by the previous loop. */
for (; j < maxlen; j++) {