]> granicus.if.org Git - libjpeg-turbo/commitdiff
Improve performance of IFAST iDCT by changing the order of transpose and descale...
authorDRC <dcommander@users.sourceforge.net>
Tue, 6 Sep 2011 18:57:53 +0000 (18:57 +0000)
committerDRC <dcommander@users.sourceforge.net>
Tue, 6 Sep 2011 18:57:53 +0000 (18:57 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@693 632fc199-4ca6-4c93-a231-07263d6284db

simd/jsimd_arm_neon.S

index b1c716643a4b60b260fa774ecabe5fc187daf3f8..6412639b431060aa0491e1263fac3bb9e50790d6 100644 (file)
@@ -837,56 +837,48 @@ asm_function jsimd_idct_ifast_neon
     vsub.s16        q13, q10, q2
     vpop            {d8-d13}        /* restore NEON registers */
     vadd.s16        q10, q10, q2
-      /* Transpose */
-      vtrn.16         q8,  q9
     vsub.s16        q11, q12, q1
-      vtrn.16         q14, q15
     vadd.s16        q12, q12, q1
-      vtrn.16         q10, q11
-      vtrn.16         q12, q13
-    /* Descale and range limit */
-    vmov.s16        q0,  #(0x80 << 5)
-      vtrn.32         q9,  q11
-      vtrn.32         q12, q14
-      vtrn.32         q8,  q10
-      vtrn.32         q13, q15
-      vswp            d24, d17
-      vswp            d26, d19
-    vqadd.s16       q8,  q8,  q0
-      vswp            d28, d21
-    vqadd.s16       q9,  q9,  q0
-      vswp            d30, d23
-    vqadd.s16       q10, q10, q0
-    vqadd.s16       q11, q11, q0
+    /* Descale to 8-bit and range limit */
+    vmov.u8         q0,  #0x80
+    vqshrn.s16      d16, q8,  #5
+    vqshrn.s16      d17, q9,  #5
+    vqshrn.s16      d18, q10, #5
+    vqshrn.s16      d19, q11, #5
+    vqshrn.s16      d20, q12, #5
+    vqshrn.s16      d21, q13, #5
+    vqshrn.s16      d22, q14, #5
+    vqshrn.s16      d23, q15, #5
+    vadd.u8         q8,  q8,  q0
+    vadd.u8         q9,  q9,  q0
+    vadd.u8         q10, q10, q0
+    vadd.u8         q11, q11, q0
+    /* Transpose the final 8-bit samples */
+    vtrn.16         q8,  q9
+    vtrn.16         q10, q11
+    vtrn.32         q8,  q10
+    vtrn.32         q9,  q11
+    vtrn.8          d16, d17
+    vtrn.8          d18, d19
       /* Store results to the output buffer */
       ldmia           OUTPUT_BUF!, {TMP1, TMP2}
       add             TMP1, TMP1, OUTPUT_COL
       add             TMP2, TMP2, OUTPUT_COL
-    vqshrun.s16     d16, q8,  #5
-    vqshrun.s16     d17, q9,  #5
-    vqshrun.s16     d18, q10, #5
-    vqshrun.s16     d19, q11, #5
       vst1.8          {d16}, [TMP1]
-    vqadd.s16       q12, q12, q0
-    vqadd.s16       q13, q13, q0
       vst1.8          {d17}, [TMP2]
-    vqadd.s16       q14, q14, q0
-    vqadd.s16       q15, q15, q0
       ldmia           OUTPUT_BUF!, {TMP1, TMP2}
       add             TMP1, TMP1, OUTPUT_COL
       add             TMP2, TMP2, OUTPUT_COL
       vst1.8          {d18}, [TMP1]
-    vqshrun.s16     d20, q12, #5
-    vqshrun.s16     d21, q13, #5
+    vtrn.8          d20, d21
       vst1.8          {d19}, [TMP2]
-    vqshrun.s16     d22, q14, #5
       ldmia           OUTPUT_BUF, {TMP1, TMP2, TMP3, TMP4}
       add             TMP1, TMP1, OUTPUT_COL
       add             TMP2, TMP2, OUTPUT_COL
       add             TMP3, TMP3, OUTPUT_COL
       add             TMP4, TMP4, OUTPUT_COL
       vst1.8          {d20}, [TMP1]
-    vqshrun.s16     d23, q15, #5
+    vtrn.8          d22, d23
       vst1.8          {d21}, [TMP2]
       vst1.8          {d22}, [TMP3]
       vst1.8          {d23}, [TMP4]