From e72820f5e2c96a9218be21986e3e22d26adb6cd8 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Tue, 8 Aug 2006 23:15:17 +0000 Subject: Slightly optimised range_limit() for arm targets. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10494 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/jpeg.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c index 5ecd394d26..9a32a8c6ca 100644 --- a/apps/plugins/jpeg.c +++ b/apps/plugins/jpeg.c @@ -200,12 +200,11 @@ INLINE unsigned range_limit(int value) ); return value; #elif defined(CPU_ARM) - asm ( - "adds %[v], %[v], #128\n" /* value += 128 */ - "movmi %[v], #0 \n" /* clip to 0 if negative result */ - "cmp %[v], #255 \n" /* did we exceed 255? */ - "movgt %[v], #255 \n" /* yes, clip to limit */ - : + asm ( /* Note: Uses knowledge that only the low byte of the result is used */ + "add %[v], %[v], #128 \n" /* value += 128 */ + "cmp %[v], #255 \n" /* out of range 0..255? */ + "mvnhi %[v], %[v], asr #31 \n" /* yes: set all bits to ~(sign_bit) */ + : /* outputs */ [v]"+r"(value) ); return value; -- cgit v1.2.3