summaryrefslogtreecommitdiff
path: root/draw
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-05-08 15:10:00 +0100
committerRobin Watts <robin.watts@artifex.com>2012-05-08 15:14:56 +0100
commit6c5d7cb79054f2bea8c109b143e9d453fb2ca1bc (patch)
tree726dd12cd67c6ff00ca16bb43e2ebf9b16fd24d9 /draw
parentfb1663c8181639f49387234f8f4abd5df3d7cc5a (diff)
downloadmupdf-6c5d7cb79054f2bea8c109b143e9d453fb2ca1bc.tar.xz
Fix bug in ARM code in draw_simple_scale
The scale_row_from_temp code was broken. Firstly the rounding was wrong in the 'bulk' case (not a big deal), but more importantly on configurations where unaligned loads were not allowed (such as the nook), we could still crash due to an incorrect test to avoid that code. Thanks to Kammerer for the report, and testing of fixed version.
Diffstat (limited to 'draw')
-rw-r--r--draw/draw_simple_scale.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/draw/draw_simple_scale.c b/draw/draw_simple_scale.c
index 8143b6fd..6f123ce3 100644
--- a/draw/draw_simple_scale.c
+++ b/draw/draw_simple_scale.c
@@ -807,17 +807,18 @@ scale_row_from_temp(unsigned char *dst, unsigned char *src, fz_weights *weights,
" @ r14= len = *contrib \n"
"blt 4f @ while (x >= 0) { \n"
#ifndef ARCH_ARM_CAN_LOAD_UNALIGNED
- "tst r3, #3 @ if (r3 & 3) \n"
- "blt 4f @ can't do fast code \n"
+ "tst r3, #3 @ if ((r3 & 3) \n"
+ "tsteq r1, #3 @ || (r1 & 3)) \n"
+ "bne 4f @ can't do fast code \n"
#endif
"ldr r9, =0x00FF00FF @ r9 = 0x00FF00FF \n"
"1: \n"
- "ldr r5, =0x00800080 @ r5 = val0 = round \n"
- "stmfd r13!,{r1,r2} @ stash r1,r2,r14 \n"
+ "ldr r7, =0x00800080 @ r5 = val0 = round \n"
+ "stmfd r13!,{r1,r2,r7} @ stash r1,r2,r5 \n"
" @ r1 = min = src \n"
" @ r2 = contrib2-4 \n"
"movs r8, r14 @ r8 = len2 = len \n"
- "mov r7, r5 @ r7 = val1 = round \n"
+ "mov r5, r7 @ r7 = val1 = round \n"
"ble 3f @ while (len2-- > 0) { \n"
"2: \n"
"ldr r12,[r1], r3 @ r12 = *min r5 = min += width\n"
@@ -828,11 +829,11 @@ scale_row_from_temp(unsigned char *dst, unsigned char *src, fz_weights *weights,
"mla r5, r10,r11,r5 @ r5 = val0 += r11 * r10\n"
"mla r7, r10,r12,r7 @ r7 = val1 += r12 * r10\n"
"bgt 2b @ } \n"
- "3: \n"
- "ldmfd r13!,{r1,r2} @ restore r1,r2,r14 \n"
"and r5, r9, r5, LSR #8 @ r5 = __22__00 \n"
"and r7, r7, r9, LSL #8 @ r7 = 33__11__ \n"
"orr r5, r5, r7 @ r5 = 33221100 \n"
+ "3: \n"
+ "ldmfd r13!,{r1,r2,r7} @ restore r1,r2,r7 \n"
"subs r6, r6, #4 @ x-- \n"
"add r1, r1, #4 @ src++ \n"
"str r5, [r0], #4 @ *dst++ = val \n"