diff options
author | Andrew Mahone <andrew.mahone@gmail.com> | 2009-06-27 10:01:24 +0000 |
---|---|---|
committer | Andrew Mahone <andrew.mahone@gmail.com> | 2009-06-27 10:01:24 +0000 |
commit | 89eb14ea5623a984bc57befc1b8e581871e51699 (patch) | |
tree | 77ca6b006105fadc57ad56237aaffff56c5f4cdc /apps | |
parent | aff3380d99fcb8041bc5964a2958cf832c267b2e (diff) | |
download | rockbox-89eb14ea5623a984bc57befc1b8e581871e51699.tar.gz rockbox-89eb14ea5623a984bc57befc1b8e581871e51699.zip |
Use single-instruction shift-and-saturate in place of range_limit for JPEG on ARMv6. Only affects the 16-point horizontal-pass IDCT.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21528 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/recorder/jpeg_load.c | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/apps/recorder/jpeg_load.c b/apps/recorder/jpeg_load.c index 5ffa4a54a0..65ddd2a9e4 100644 --- a/apps/recorder/jpeg_load.c +++ b/apps/recorder/jpeg_load.c | |||
@@ -183,6 +183,19 @@ INLINE unsigned range_limit(int value) | |||
183 | #endif | 183 | #endif |
184 | } | 184 | } |
185 | 185 | ||
186 | INLINE unsigned scale_output(int value) | ||
187 | { | ||
188 | #if defined(CPU_ARM) && ARM_ARCH >= 6 | ||
189 | asm ( | ||
190 | "usat %[v], #8, %[v], asr #18\n" | ||
191 | : [v] "+r" (value) | ||
192 | ); | ||
193 | return value; | ||
194 | #else | ||
195 | return range_limit(value >> 18); | ||
196 | #endif | ||
197 | } | ||
198 | |||
186 | /* IDCT implementation */ | 199 | /* IDCT implementation */ |
187 | 200 | ||
188 | 201 | ||
@@ -804,38 +817,22 @@ static void jpeg_idct16h(int16_t *ws, unsigned char *out, int16_t *end, int rows | |||
804 | 817 | ||
805 | /* Final output stage */ | 818 | /* Final output stage */ |
806 | 819 | ||
807 | out[JPEG_PIX_SZ*0] = range_limit((int) RIGHT_SHIFT(tmp20 + tmp0, | 820 | out[JPEG_PIX_SZ*0] = scale_output(tmp20 + tmp0); |
808 | DS_OUT)); | 821 | out[JPEG_PIX_SZ*15] = scale_output(tmp20 - tmp0); |
809 | out[JPEG_PIX_SZ*15] = range_limit((int) RIGHT_SHIFT(tmp20 - tmp0, | 822 | out[JPEG_PIX_SZ*1] = scale_output(tmp21 + tmp1); |
810 | DS_OUT)); | 823 | out[JPEG_PIX_SZ*14] = scale_output(tmp21 - tmp1); |
811 | out[JPEG_PIX_SZ*1] = range_limit((int) RIGHT_SHIFT(tmp21 + tmp1, | 824 | out[JPEG_PIX_SZ*2] = scale_output(tmp22 + tmp2); |
812 | DS_OUT)); | 825 | out[JPEG_PIX_SZ*13] = scale_output(tmp22 - tmp2); |
813 | out[JPEG_PIX_SZ*14] = range_limit((int) RIGHT_SHIFT(tmp21 - tmp1, | 826 | out[JPEG_PIX_SZ*3] = scale_output(tmp23 + tmp3); |
814 | DS_OUT)); | 827 | out[JPEG_PIX_SZ*12] = scale_output(tmp23 - tmp3); |
815 | out[JPEG_PIX_SZ*2] = range_limit((int) RIGHT_SHIFT(tmp22 + tmp2, | 828 | out[JPEG_PIX_SZ*4] = scale_output(tmp24 + tmp10); |
816 | DS_OUT)); | 829 | out[JPEG_PIX_SZ*11] = scale_output(tmp24 - tmp10); |
817 | out[JPEG_PIX_SZ*13] = range_limit((int) RIGHT_SHIFT(tmp22 - tmp2, | 830 | out[JPEG_PIX_SZ*5] = scale_output(tmp25 + tmp11); |
818 | DS_OUT)); | 831 | out[JPEG_PIX_SZ*10] = scale_output(tmp25 - tmp11); |
819 | out[JPEG_PIX_SZ*3] = range_limit((int) RIGHT_SHIFT(tmp23 + tmp3, | 832 | out[JPEG_PIX_SZ*6] = scale_output(tmp26 + tmp12); |
820 | DS_OUT)); | 833 | out[JPEG_PIX_SZ*9] = scale_output(tmp26 - tmp12); |
821 | out[JPEG_PIX_SZ*12] = range_limit((int) RIGHT_SHIFT(tmp23 - tmp3, | 834 | out[JPEG_PIX_SZ*7] = scale_output(tmp27 + tmp13); |
822 | DS_OUT)); | 835 | out[JPEG_PIX_SZ*8] = scale_output(tmp27 - tmp13); |
823 | out[JPEG_PIX_SZ*4] = range_limit((int) RIGHT_SHIFT(tmp24 + tmp10, | ||
824 | DS_OUT)); | ||
825 | out[JPEG_PIX_SZ*11] = range_limit((int) RIGHT_SHIFT(tmp24 - tmp10, | ||
826 | DS_OUT)); | ||
827 | out[JPEG_PIX_SZ*5] = range_limit((int) RIGHT_SHIFT(tmp25 + tmp11, | ||
828 | DS_OUT)); | ||
829 | out[JPEG_PIX_SZ*10] = range_limit((int) RIGHT_SHIFT(tmp25 - tmp11, | ||
830 | DS_OUT)); | ||
831 | out[JPEG_PIX_SZ*6] = range_limit((int) RIGHT_SHIFT(tmp26 + tmp12, | ||
832 | DS_OUT)); | ||
833 | out[JPEG_PIX_SZ*9] = range_limit((int) RIGHT_SHIFT(tmp26 - tmp12, | ||
834 | DS_OUT)); | ||
835 | out[JPEG_PIX_SZ*7] = range_limit((int) RIGHT_SHIFT(tmp27 + tmp13, | ||
836 | DS_OUT)); | ||
837 | out[JPEG_PIX_SZ*8] = range_limit((int) RIGHT_SHIFT(tmp27 - tmp13, | ||
838 | DS_OUT)); | ||
839 | } | 836 | } |
840 | } | 837 | } |
841 | #endif | 838 | #endif |