aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiarhei Siamashka <siarhei.siamashka@nokia.com>2010-01-21 05:31:06 +0200
committerSiarhei Siamashka <siarhei.siamashka@nokia.com>2010-11-10 06:32:48 +0200
commit90a4196134aac33af8a5b2c33fdeb3e916fc2cc1 (patch)
tree8204e087cbbf7d05a2e22427e2211dfdad2fcedd
parent6f625a0844943d365ba13c5b00c0285c5139b49b (diff)
A minor ARM NEON optimization for 'convsamp'
-rw-r--r--jcdctmgr.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/jcdctmgr.c b/jcdctmgr.c
index 156957a..060c58a 100644
--- a/jcdctmgr.c
+++ b/jcdctmgr.c
@@ -334,6 +334,16 @@ convsamp (JSAMPARRAY sample_data, JDIMENSION start_col, DCTELEM * workspace)
elemptr = sample_data[elemr] + start_col;
#if DCTSIZE == 8 /* unroll the inner loop */
+#if defined(WITH_SIMD) && defined(__ARM_NEON__)
+ asm volatile (
+ "vmov.s16 q0, #128\n"
+ "vld1.8 {d2}, [%[elemptr]]!\n"
+ "vmovl.u8 q1, d2\n"
+ "vsub.s16 q1, q1, q0\n"
+ "vst1.s16 {d2, d3}, [%[workspaceptr]]!\n"
+ : [workspaceptr] "+&r" (workspaceptr), [elemptr] "+&r" (elemptr)
+ : : "memory", "d0", "d1", "d2", "d3");
+#else
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
@@ -342,6 +352,7 @@ convsamp (JSAMPARRAY sample_data, JDIMENSION start_col, DCTELEM * workspace)
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+#endif
#else
{
register int elemc;