Improve performance of IFAST iDCT by changing the order of transpose and descale steps
This commit is contained in:
@@ -837,56 +837,48 @@ asm_function jsimd_idct_ifast_neon
|
|||||||
vsub.s16 q13, q10, q2
|
vsub.s16 q13, q10, q2
|
||||||
vpop {d8-d13} /* restore NEON registers */
|
vpop {d8-d13} /* restore NEON registers */
|
||||||
vadd.s16 q10, q10, q2
|
vadd.s16 q10, q10, q2
|
||||||
/* Transpose */
|
|
||||||
vtrn.16 q8, q9
|
|
||||||
vsub.s16 q11, q12, q1
|
vsub.s16 q11, q12, q1
|
||||||
vtrn.16 q14, q15
|
|
||||||
vadd.s16 q12, q12, q1
|
vadd.s16 q12, q12, q1
|
||||||
|
/* 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.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 q8, q10
|
||||||
vtrn.32 q13, q15
|
vtrn.32 q9, q11
|
||||||
vswp d24, d17
|
vtrn.8 d16, d17
|
||||||
vswp d26, d19
|
vtrn.8 d18, 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
|
|
||||||
/* Store results to the output buffer */
|
/* Store results to the output buffer */
|
||||||
ldmia OUTPUT_BUF!, {TMP1, TMP2}
|
ldmia OUTPUT_BUF!, {TMP1, TMP2}
|
||||||
add TMP1, TMP1, OUTPUT_COL
|
add TMP1, TMP1, OUTPUT_COL
|
||||||
add TMP2, TMP2, 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]
|
vst1.8 {d16}, [TMP1]
|
||||||
vqadd.s16 q12, q12, q0
|
|
||||||
vqadd.s16 q13, q13, q0
|
|
||||||
vst1.8 {d17}, [TMP2]
|
vst1.8 {d17}, [TMP2]
|
||||||
vqadd.s16 q14, q14, q0
|
|
||||||
vqadd.s16 q15, q15, q0
|
|
||||||
ldmia OUTPUT_BUF!, {TMP1, TMP2}
|
ldmia OUTPUT_BUF!, {TMP1, TMP2}
|
||||||
add TMP1, TMP1, OUTPUT_COL
|
add TMP1, TMP1, OUTPUT_COL
|
||||||
add TMP2, TMP2, OUTPUT_COL
|
add TMP2, TMP2, OUTPUT_COL
|
||||||
vst1.8 {d18}, [TMP1]
|
vst1.8 {d18}, [TMP1]
|
||||||
vqshrun.s16 d20, q12, #5
|
vtrn.8 d20, d21
|
||||||
vqshrun.s16 d21, q13, #5
|
|
||||||
vst1.8 {d19}, [TMP2]
|
vst1.8 {d19}, [TMP2]
|
||||||
vqshrun.s16 d22, q14, #5
|
|
||||||
ldmia OUTPUT_BUF, {TMP1, TMP2, TMP3, TMP4}
|
ldmia OUTPUT_BUF, {TMP1, TMP2, TMP3, TMP4}
|
||||||
add TMP1, TMP1, OUTPUT_COL
|
add TMP1, TMP1, OUTPUT_COL
|
||||||
add TMP2, TMP2, OUTPUT_COL
|
add TMP2, TMP2, OUTPUT_COL
|
||||||
add TMP3, TMP3, OUTPUT_COL
|
add TMP3, TMP3, OUTPUT_COL
|
||||||
add TMP4, TMP4, OUTPUT_COL
|
add TMP4, TMP4, OUTPUT_COL
|
||||||
vst1.8 {d20}, [TMP1]
|
vst1.8 {d20}, [TMP1]
|
||||||
vqshrun.s16 d23, q15, #5
|
vtrn.8 d22, d23
|
||||||
vst1.8 {d21}, [TMP2]
|
vst1.8 {d21}, [TMP2]
|
||||||
vst1.8 {d22}, [TMP3]
|
vst1.8 {d22}, [TMP3]
|
||||||
vst1.8 {d23}, [TMP4]
|
vst1.8 {d23}, [TMP4]
|
||||||
|
|||||||
Reference in New Issue
Block a user