| Index: simd/jsimd_arm_neon.S
|
| diff --git a/simd/jsimd_arm_neon.S b/simd/jsimd_arm_neon.S
|
| index 7e8e134ce672f639f72b7c96a82c8aa3aaf15bd4..15c5409584039930423cc4ec2231750f86b28dd8 100644
|
| --- a/simd/jsimd_arm_neon.S
|
| +++ b/simd/jsimd_arm_neon.S
|
| @@ -4,7 +4,10 @@
|
| * Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies).
|
| * All rights reserved.
|
| * Author: Siarhei Siamashka <siarhei.siamashka@nokia.com>
|
| + * Copyright (C) 2014 Siarhei Siamashka. All Rights Reserved.
|
| * Copyright (C) 2014 Linaro Limited. All Rights Reserved.
|
| + * Copyright (C) 2015 D. R. Commander. All Rights Reserved.
|
| + * Copyright (C) 2015-2016 Matthieu Darbois. All Rights Reserved.
|
| *
|
| * This software is provided 'as-is', without any express or implied
|
| * warranty. In no event will the authors be held liable for any damages
|
| @@ -24,7 +27,7 @@
|
| */
|
|
|
| #if defined(__linux__) && defined(__ELF__)
|
| -.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
|
| +.section .note.GNU-stack, "", %progbits /* mark stack as non-executable */
|
| #endif
|
|
|
| .text
|
| @@ -56,10 +59,10 @@ _\fname:
|
|
|
| /* Transpose a block of 4x4 coefficients in four 64-bit registers */
|
| .macro transpose_4x4 x0, x1, x2, x3
|
| - vtrn.16 \x0, \x1
|
| - vtrn.16 \x2, \x3
|
| - vtrn.32 \x0, \x2
|
| - vtrn.32 \x1, \x3
|
| + vtrn.16 \x0, \x1
|
| + vtrn.16 \x2, \x3
|
| + vtrn.32 \x0, \x2
|
| + vtrn.32 \x1, \x3
|
| .endm
|
|
|
|
|
| @@ -71,22 +74,22 @@ _\fname:
|
| * Perform dequantization and inverse DCT on one block of coefficients.
|
| *
|
| * GLOBAL(void)
|
| - * jsimd_idct_islow_neon (void * dct_table, JCOEFPTR coef_block,
|
| + * jsimd_idct_islow_neon (void *dct_table, JCOEFPTR coef_block,
|
| * JSAMPARRAY output_buf, JDIMENSION output_col)
|
| */
|
|
|
| -#define FIX_0_298631336 (2446)
|
| -#define FIX_0_390180644 (3196)
|
| -#define FIX_0_541196100 (4433)
|
| -#define FIX_0_765366865 (6270)
|
| -#define FIX_0_899976223 (7373)
|
| -#define FIX_1_175875602 (9633)
|
| -#define FIX_1_501321110 (12299)
|
| -#define FIX_1_847759065 (15137)
|
| -#define FIX_1_961570560 (16069)
|
| -#define FIX_2_053119869 (16819)
|
| -#define FIX_2_562915447 (20995)
|
| -#define FIX_3_072711026 (25172)
|
| +#define FIX_0_298631336 (2446)
|
| +#define FIX_0_390180644 (3196)
|
| +#define FIX_0_541196100 (4433)
|
| +#define FIX_0_765366865 (6270)
|
| +#define FIX_0_899976223 (7373)
|
| +#define FIX_1_175875602 (9633)
|
| +#define FIX_1_501321110 (12299)
|
| +#define FIX_1_847759065 (15137)
|
| +#define FIX_1_961570560 (16069)
|
| +#define FIX_2_053119869 (16819)
|
| +#define FIX_2_562915447 (20995)
|
| +#define FIX_3_072711026 (25172)
|
|
|
| #define FIX_1_175875602_MINUS_1_961570560 (FIX_1_175875602 - FIX_1_961570560)
|
| #define FIX_1_175875602_MINUS_0_390180644 (FIX_1_175875602 - FIX_0_390180644)
|
| @@ -104,8 +107,8 @@ _\fname:
|
| #define REF_1D_IDCT(xrow0, xrow1, xrow2, xrow3, xrow4, xrow5, xrow6, xrow7) \
|
| { \
|
| DCTELEM row0, row1, row2, row3, row4, row5, row6, row7; \
|
| - INT32 q1, q2, q3, q4, q5, q6, q7; \
|
| - INT32 tmp11_plus_tmp2, tmp11_minus_tmp2; \
|
| + JLONG q1, q2, q3, q4, q5, q6, q7; \
|
| + JLONG tmp11_plus_tmp2, tmp11_minus_tmp2; \
|
| \
|
| /* 1-D iDCT input data */ \
|
| row0 = xrow0; \
|
| @@ -126,7 +129,7 @@ _\fname:
|
| q2 = MULTIPLY(row2, FIX_0_541196100) + \
|
| MULTIPLY(row6, FIX_0_541196100_MINUS_1_847759065); \
|
| q4 = q6; \
|
| - q3 = ((INT32) row0 - (INT32) row4) << 13; \
|
| + q3 = ((JLONG) row0 - (JLONG) row4) << 13; \
|
| q6 += MULTIPLY(row5, -FIX_2_562915447) + \
|
| MULTIPLY(row3, FIX_3_072711026_MINUS_2_562915447); \
|
| /* now we can use q1 (reloadable constants have been used up) */ \
|
| @@ -153,7 +156,7 @@ _\fname:
|
| /* (tmp11 - tmp2) has been calculated (out_row6 before descale) */ \
|
| tmp11_minus_tmp2 = q1; \
|
| \
|
| - q1 = ((INT32) row0 + (INT32) row4) << 13; \
|
| + q1 = ((JLONG) row0 + (JLONG) row4) << 13; \
|
| q2 = q1 + q6; \
|
| q1 = q1 - q6; \
|
| \
|
| @@ -168,34 +171,34 @@ _\fname:
|
| tmp13 = q1; \
|
| }
|
|
|
| -#define XFIX_0_899976223 d0[0]
|
| -#define XFIX_0_541196100 d0[1]
|
| -#define XFIX_2_562915447 d0[2]
|
| -#define XFIX_0_298631336_MINUS_0_899976223 d0[3]
|
| -#define XFIX_1_501321110_MINUS_0_899976223 d1[0]
|
| -#define XFIX_2_053119869_MINUS_2_562915447 d1[1]
|
| -#define XFIX_0_541196100_PLUS_0_765366865 d1[2]
|
| -#define XFIX_1_175875602 d1[3]
|
| -#define XFIX_1_175875602_MINUS_0_390180644 d2[0]
|
| -#define XFIX_0_541196100_MINUS_1_847759065 d2[1]
|
| -#define XFIX_3_072711026_MINUS_2_562915447 d2[2]
|
| -#define XFIX_1_175875602_MINUS_1_961570560 d2[3]
|
| +#define XFIX_0_899976223 d0[0]
|
| +#define XFIX_0_541196100 d0[1]
|
| +#define XFIX_2_562915447 d0[2]
|
| +#define XFIX_0_298631336_MINUS_0_899976223 d0[3]
|
| +#define XFIX_1_501321110_MINUS_0_899976223 d1[0]
|
| +#define XFIX_2_053119869_MINUS_2_562915447 d1[1]
|
| +#define XFIX_0_541196100_PLUS_0_765366865 d1[2]
|
| +#define XFIX_1_175875602 d1[3]
|
| +#define XFIX_1_175875602_MINUS_0_390180644 d2[0]
|
| +#define XFIX_0_541196100_MINUS_1_847759065 d2[1]
|
| +#define XFIX_3_072711026_MINUS_2_562915447 d2[2]
|
| +#define XFIX_1_175875602_MINUS_1_961570560 d2[3]
|
|
|
| .balign 16
|
| jsimd_idct_islow_neon_consts:
|
| - .short FIX_0_899976223 /* d0[0] */
|
| - .short FIX_0_541196100 /* d0[1] */
|
| - .short FIX_2_562915447 /* d0[2] */
|
| - .short FIX_0_298631336_MINUS_0_899976223 /* d0[3] */
|
| - .short FIX_1_501321110_MINUS_0_899976223 /* d1[0] */
|
| - .short FIX_2_053119869_MINUS_2_562915447 /* d1[1] */
|
| - .short FIX_0_541196100_PLUS_0_765366865 /* d1[2] */
|
| - .short FIX_1_175875602 /* d1[3] */
|
| - /* reloadable constants */
|
| - .short FIX_1_175875602_MINUS_0_390180644 /* d2[0] */
|
| - .short FIX_0_541196100_MINUS_1_847759065 /* d2[1] */
|
| - .short FIX_3_072711026_MINUS_2_562915447 /* d2[2] */
|
| - .short FIX_1_175875602_MINUS_1_961570560 /* d2[3] */
|
| + .short FIX_0_899976223 /* d0[0] */
|
| + .short FIX_0_541196100 /* d0[1] */
|
| + .short FIX_2_562915447 /* d0[2] */
|
| + .short FIX_0_298631336_MINUS_0_899976223 /* d0[3] */
|
| + .short FIX_1_501321110_MINUS_0_899976223 /* d1[0] */
|
| + .short FIX_2_053119869_MINUS_2_562915447 /* d1[1] */
|
| + .short FIX_0_541196100_PLUS_0_765366865 /* d1[2] */
|
| + .short FIX_1_175875602 /* d1[3] */
|
| + /* reloadable constants */
|
| + .short FIX_1_175875602_MINUS_0_390180644 /* d2[0] */
|
| + .short FIX_0_541196100_MINUS_1_847759065 /* d2[1] */
|
| + .short FIX_3_072711026_MINUS_2_562915447 /* d2[2] */
|
| + .short FIX_1_175875602_MINUS_1_961570560 /* d2[3] */
|
|
|
| asm_function jsimd_idct_islow_neon
|
|
|
| @@ -254,140 +257,141 @@ asm_function jsimd_idct_islow_neon
|
| vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]!
|
| vmul.s16 q14, q14, q2
|
| vmul.s16 q13, q13, q1
|
| - vld1.16 {d0, d1, d2, d3}, [ip, :128] /* load constants */
|
| + vld1.16 {d0, d1, d2, d3}, [ip, :128] /* load constants */
|
| add ip, ip, #16
|
| vmul.s16 q15, q15, q3
|
| - vpush {d8-d15} /* save NEON registers */
|
| + vpush {d8-d15} /* save NEON registers */
|
| /* 1-D IDCT, pass 1, left 4x8 half */
|
| - vadd.s16 d4, ROW7L, ROW3L
|
| - vadd.s16 d5, ROW5L, ROW1L
|
| - vmull.s16 q6, d4, XFIX_1_175875602_MINUS_1_961570560
|
| - vmlal.s16 q6, d5, XFIX_1_175875602
|
| - vmull.s16 q7, d4, XFIX_1_175875602
|
| + vadd.s16 d4, ROW7L, ROW3L
|
| + vadd.s16 d5, ROW5L, ROW1L
|
| + vmull.s16 q6, d4, XFIX_1_175875602_MINUS_1_961570560
|
| + vmlal.s16 q6, d5, XFIX_1_175875602
|
| + vmull.s16 q7, d4, XFIX_1_175875602
|
| /* Check for the zero coefficients in the right 4x8 half */
|
| push {r4, r5}
|
| - vmlal.s16 q7, d5, XFIX_1_175875602_MINUS_0_390180644
|
| - vsubl.s16 q3, ROW0L, ROW4L
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 1 * 8))]
|
| - vmull.s16 q2, ROW2L, XFIX_0_541196100
|
| - vmlal.s16 q2, ROW6L, XFIX_0_541196100_MINUS_1_847759065
|
| - orr r0, r4, r5
|
| - vmov q4, q6
|
| - vmlsl.s16 q6, ROW5L, XFIX_2_562915447
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 2 * 8))]
|
| - vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
|
| - vshl.s32 q3, q3, #13
|
| - orr r0, r0, r4
|
| - vmlsl.s16 q4, ROW1L, XFIX_0_899976223
|
| - orr r0, r0, r5
|
| - vadd.s32 q1, q3, q2
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 3 * 8))]
|
| - vmov q5, q7
|
| - vadd.s32 q1, q1, q6
|
| - orr r0, r0, r4
|
| - vmlsl.s16 q7, ROW7L, XFIX_0_899976223
|
| - orr r0, r0, r5
|
| - vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
|
| - vrshrn.s32 ROW1L, q1, #11
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 4 * 8))]
|
| - vsub.s32 q1, q1, q6
|
| - vmlal.s16 q5, ROW5L, XFIX_2_053119869_MINUS_2_562915447
|
| - orr r0, r0, r4
|
| - vmlsl.s16 q5, ROW3L, XFIX_2_562915447
|
| - orr r0, r0, r5
|
| - vsub.s32 q1, q1, q6
|
| - vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 5 * 8))]
|
| - vmlal.s16 q6, ROW6L, XFIX_0_541196100
|
| - vsub.s32 q3, q3, q2
|
| - orr r0, r0, r4
|
| - vrshrn.s32 ROW6L, q1, #11
|
| - orr r0, r0, r5
|
| - vadd.s32 q1, q3, q5
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 6 * 8))]
|
| - vsub.s32 q3, q3, q5
|
| - vaddl.s16 q5, ROW0L, ROW4L
|
| - orr r0, r0, r4
|
| - vrshrn.s32 ROW2L, q1, #11
|
| - orr r0, r0, r5
|
| - vrshrn.s32 ROW5L, q3, #11
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 7 * 8))]
|
| - vshl.s32 q5, q5, #13
|
| - vmlal.s16 q4, ROW7L, XFIX_0_298631336_MINUS_0_899976223
|
| - orr r0, r0, r4
|
| - vadd.s32 q2, q5, q6
|
| - orrs r0, r0, r5
|
| - vsub.s32 q1, q5, q6
|
| - vadd.s32 q6, q2, q7
|
| - ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 0 * 8))]
|
| - vsub.s32 q2, q2, q7
|
| - vadd.s32 q5, q1, q4
|
| - orr r0, r4, r5
|
| - vsub.s32 q3, q1, q4
|
| + vmlal.s16 q7, d5, XFIX_1_175875602_MINUS_0_390180644
|
| + vsubl.s16 q3, ROW0L, ROW4L
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 1 * 8))]
|
| + vmull.s16 q2, ROW2L, XFIX_0_541196100
|
| + vmlal.s16 q2, ROW6L, XFIX_0_541196100_MINUS_1_847759065
|
| + orr r0, r4, r5
|
| + vmov q4, q6
|
| + vmlsl.s16 q6, ROW5L, XFIX_2_562915447
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 2 * 8))]
|
| + vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
|
| + vshl.s32 q3, q3, #13
|
| + orr r0, r0, r4
|
| + vmlsl.s16 q4, ROW1L, XFIX_0_899976223
|
| + orr r0, r0, r5
|
| + vadd.s32 q1, q3, q2
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 3 * 8))]
|
| + vmov q5, q7
|
| + vadd.s32 q1, q1, q6
|
| + orr r0, r0, r4
|
| + vmlsl.s16 q7, ROW7L, XFIX_0_899976223
|
| + orr r0, r0, r5
|
| + vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
|
| + vrshrn.s32 ROW1L, q1, #11
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 4 * 8))]
|
| + vsub.s32 q1, q1, q6
|
| + vmlal.s16 q5, ROW5L, XFIX_2_053119869_MINUS_2_562915447
|
| + orr r0, r0, r4
|
| + vmlsl.s16 q5, ROW3L, XFIX_2_562915447
|
| + orr r0, r0, r5
|
| + vsub.s32 q1, q1, q6
|
| + vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 5 * 8))]
|
| + vmlal.s16 q6, ROW6L, XFIX_0_541196100
|
| + vsub.s32 q3, q3, q2
|
| + orr r0, r0, r4
|
| + vrshrn.s32 ROW6L, q1, #11
|
| + orr r0, r0, r5
|
| + vadd.s32 q1, q3, q5
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 6 * 8))]
|
| + vsub.s32 q3, q3, q5
|
| + vaddl.s16 q5, ROW0L, ROW4L
|
| + orr r0, r0, r4
|
| + vrshrn.s32 ROW2L, q1, #11
|
| + orr r0, r0, r5
|
| + vrshrn.s32 ROW5L, q3, #11
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 7 * 8))]
|
| + vshl.s32 q5, q5, #13
|
| + vmlal.s16 q4, ROW7L, XFIX_0_298631336_MINUS_0_899976223
|
| + orr r0, r0, r4
|
| + vadd.s32 q2, q5, q6
|
| + orrs r0, r0, r5
|
| + vsub.s32 q1, q5, q6
|
| + vadd.s32 q6, q2, q7
|
| + ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 0 * 8))]
|
| + vsub.s32 q2, q2, q7
|
| + vadd.s32 q5, q1, q4
|
| + orr r0, r4, r5
|
| + vsub.s32 q3, q1, q4
|
| pop {r4, r5}
|
| - vrshrn.s32 ROW7L, q2, #11
|
| - vrshrn.s32 ROW3L, q5, #11
|
| - vrshrn.s32 ROW0L, q6, #11
|
| - vrshrn.s32 ROW4L, q3, #11
|
| + vrshrn.s32 ROW7L, q2, #11
|
| + vrshrn.s32 ROW3L, q5, #11
|
| + vrshrn.s32 ROW0L, q6, #11
|
| + vrshrn.s32 ROW4L, q3, #11
|
|
|
| - beq 3f /* Go to do some special handling for the sparse right 4x8 half */
|
| + beq 3f /* Go to do some special handling for the sparse
|
| + right 4x8 half */
|
|
|
| /* 1-D IDCT, pass 1, right 4x8 half */
|
| - vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| - vadd.s16 d10, ROW7R, ROW3R
|
| - vadd.s16 d8, ROW5R, ROW1R
|
| + vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| + vadd.s16 d10, ROW7R, ROW3R
|
| + vadd.s16 d8, ROW5R, ROW1R
|
| /* Transpose left 4x8 half */
|
| vtrn.16 ROW6L, ROW7L
|
| - vmull.s16 q6, d10, XFIX_1_175875602_MINUS_1_961570560
|
| - vmlal.s16 q6, d8, XFIX_1_175875602
|
| + vmull.s16 q6, d10, XFIX_1_175875602_MINUS_1_961570560
|
| + vmlal.s16 q6, d8, XFIX_1_175875602
|
| vtrn.16 ROW2L, ROW3L
|
| - vmull.s16 q7, d10, XFIX_1_175875602
|
| - vmlal.s16 q7, d8, XFIX_1_175875602_MINUS_0_390180644
|
| + vmull.s16 q7, d10, XFIX_1_175875602
|
| + vmlal.s16 q7, d8, XFIX_1_175875602_MINUS_0_390180644
|
| vtrn.16 ROW0L, ROW1L
|
| - vsubl.s16 q3, ROW0R, ROW4R
|
| - vmull.s16 q2, ROW2R, XFIX_0_541196100
|
| - vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065
|
| + vsubl.s16 q3, ROW0R, ROW4R
|
| + vmull.s16 q2, ROW2R, XFIX_0_541196100
|
| + vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065
|
| vtrn.16 ROW4L, ROW5L
|
| - vmov q4, q6
|
| - vmlsl.s16 q6, ROW5R, XFIX_2_562915447
|
| - vmlal.s16 q6, ROW3R, XFIX_3_072711026_MINUS_2_562915447
|
| + vmov q4, q6
|
| + vmlsl.s16 q6, ROW5R, XFIX_2_562915447
|
| + vmlal.s16 q6, ROW3R, XFIX_3_072711026_MINUS_2_562915447
|
| vtrn.32 ROW1L, ROW3L
|
| - vshl.s32 q3, q3, #13
|
| - vmlsl.s16 q4, ROW1R, XFIX_0_899976223
|
| + vshl.s32 q3, q3, #13
|
| + vmlsl.s16 q4, ROW1R, XFIX_0_899976223
|
| vtrn.32 ROW4L, ROW6L
|
| - vadd.s32 q1, q3, q2
|
| - vmov q5, q7
|
| - vadd.s32 q1, q1, q6
|
| + vadd.s32 q1, q3, q2
|
| + vmov q5, q7
|
| + vadd.s32 q1, q1, q6
|
| vtrn.32 ROW0L, ROW2L
|
| - vmlsl.s16 q7, ROW7R, XFIX_0_899976223
|
| - vmlal.s16 q7, ROW1R, XFIX_1_501321110_MINUS_0_899976223
|
| - vrshrn.s32 ROW1R, q1, #11
|
| + vmlsl.s16 q7, ROW7R, XFIX_0_899976223
|
| + vmlal.s16 q7, ROW1R, XFIX_1_501321110_MINUS_0_899976223
|
| + vrshrn.s32 ROW1R, q1, #11
|
| vtrn.32 ROW5L, ROW7L
|
| - vsub.s32 q1, q1, q6
|
| - vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447
|
| - vmlsl.s16 q5, ROW3R, XFIX_2_562915447
|
| - vsub.s32 q1, q1, q6
|
| - vmull.s16 q6, ROW2R, XFIX_0_541196100_PLUS_0_765366865
|
| - vmlal.s16 q6, ROW6R, XFIX_0_541196100
|
| - vsub.s32 q3, q3, q2
|
| - vrshrn.s32 ROW6R, q1, #11
|
| - vadd.s32 q1, q3, q5
|
| - vsub.s32 q3, q3, q5
|
| - vaddl.s16 q5, ROW0R, ROW4R
|
| - vrshrn.s32 ROW2R, q1, #11
|
| - vrshrn.s32 ROW5R, q3, #11
|
| - vshl.s32 q5, q5, #13
|
| - vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223
|
| - vadd.s32 q2, q5, q6
|
| - vsub.s32 q1, q5, q6
|
| - vadd.s32 q6, q2, q7
|
| - vsub.s32 q2, q2, q7
|
| - vadd.s32 q5, q1, q4
|
| - vsub.s32 q3, q1, q4
|
| - vrshrn.s32 ROW7R, q2, #11
|
| - vrshrn.s32 ROW3R, q5, #11
|
| - vrshrn.s32 ROW0R, q6, #11
|
| - vrshrn.s32 ROW4R, q3, #11
|
| + vsub.s32 q1, q1, q6
|
| + vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447
|
| + vmlsl.s16 q5, ROW3R, XFIX_2_562915447
|
| + vsub.s32 q1, q1, q6
|
| + vmull.s16 q6, ROW2R, XFIX_0_541196100_PLUS_0_765366865
|
| + vmlal.s16 q6, ROW6R, XFIX_0_541196100
|
| + vsub.s32 q3, q3, q2
|
| + vrshrn.s32 ROW6R, q1, #11
|
| + vadd.s32 q1, q3, q5
|
| + vsub.s32 q3, q3, q5
|
| + vaddl.s16 q5, ROW0R, ROW4R
|
| + vrshrn.s32 ROW2R, q1, #11
|
| + vrshrn.s32 ROW5R, q3, #11
|
| + vshl.s32 q5, q5, #13
|
| + vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223
|
| + vadd.s32 q2, q5, q6
|
| + vsub.s32 q1, q5, q6
|
| + vadd.s32 q6, q2, q7
|
| + vsub.s32 q2, q2, q7
|
| + vadd.s32 q5, q1, q4
|
| + vsub.s32 q3, q1, q4
|
| + vrshrn.s32 ROW7R, q2, #11
|
| + vrshrn.s32 ROW3R, q5, #11
|
| + vrshrn.s32 ROW0R, q6, #11
|
| + vrshrn.s32 ROW4R, q3, #11
|
| /* Transpose right 4x8 half */
|
| vtrn.16 ROW6R, ROW7R
|
| vtrn.16 ROW2R, ROW3R
|
| @@ -399,122 +403,122 @@ asm_function jsimd_idct_islow_neon
|
| vtrn.32 ROW5R, ROW7R
|
|
|
| 1: /* 1-D IDCT, pass 2 (normal variant), left 4x8 half */
|
| - vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| - vmull.s16 q6, ROW1R, XFIX_1_175875602 /* ROW5L <-> ROW1R */
|
| - vmlal.s16 q6, ROW1L, XFIX_1_175875602
|
| - vmlal.s16 q6, ROW3R, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <-> ROW3R */
|
| - vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560
|
| - vmull.s16 q7, ROW3R, XFIX_1_175875602 /* ROW7L <-> ROW3R */
|
| - vmlal.s16 q7, ROW3L, XFIX_1_175875602
|
| - vmlal.s16 q7, ROW1R, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <-> ROW1R */
|
| - vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644
|
| - vsubl.s16 q3, ROW0L, ROW0R /* ROW4L <-> ROW0R */
|
| - vmull.s16 q2, ROW2L, XFIX_0_541196100
|
| - vmlal.s16 q2, ROW2R, XFIX_0_541196100_MINUS_1_847759065 /* ROW6L <-> ROW2R */
|
| - vmov q4, q6
|
| - vmlsl.s16 q6, ROW1R, XFIX_2_562915447 /* ROW5L <-> ROW1R */
|
| - vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
|
| - vshl.s32 q3, q3, #13
|
| - vmlsl.s16 q4, ROW1L, XFIX_0_899976223
|
| - vadd.s32 q1, q3, q2
|
| - vmov q5, q7
|
| - vadd.s32 q1, q1, q6
|
| - vmlsl.s16 q7, ROW3R, XFIX_0_899976223 /* ROW7L <-> ROW3R */
|
| - vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
|
| - vshrn.s32 ROW1L, q1, #16
|
| - vsub.s32 q1, q1, q6
|
| - vmlal.s16 q5, ROW1R, XFIX_2_053119869_MINUS_2_562915447 /* ROW5L <-> ROW1R */
|
| - vmlsl.s16 q5, ROW3L, XFIX_2_562915447
|
| - vsub.s32 q1, q1, q6
|
| - vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
|
| - vmlal.s16 q6, ROW2R, XFIX_0_541196100 /* ROW6L <-> ROW2R */
|
| - vsub.s32 q3, q3, q2
|
| - vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */
|
| - vadd.s32 q1, q3, q5
|
| - vsub.s32 q3, q3, q5
|
| - vaddl.s16 q5, ROW0L, ROW0R /* ROW4L <-> ROW0R */
|
| - vshrn.s32 ROW2L, q1, #16
|
| - vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */
|
| - vshl.s32 q5, q5, #13
|
| - vmlal.s16 q4, ROW3R, XFIX_0_298631336_MINUS_0_899976223 /* ROW7L <-> ROW3R */
|
| - vadd.s32 q2, q5, q6
|
| - vsub.s32 q1, q5, q6
|
| - vadd.s32 q6, q2, q7
|
| - vsub.s32 q2, q2, q7
|
| - vadd.s32 q5, q1, q4
|
| - vsub.s32 q3, q1, q4
|
| - vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */
|
| - vshrn.s32 ROW3L, q5, #16
|
| - vshrn.s32 ROW0L, q6, #16
|
| - vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */
|
| + vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| + vmull.s16 q6, ROW1R, XFIX_1_175875602 /* ROW5L <-> ROW1R */
|
| + vmlal.s16 q6, ROW1L, XFIX_1_175875602
|
| + vmlal.s16 q6, ROW3R, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <-> ROW3R */
|
| + vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560
|
| + vmull.s16 q7, ROW3R, XFIX_1_175875602 /* ROW7L <-> ROW3R */
|
| + vmlal.s16 q7, ROW3L, XFIX_1_175875602
|
| + vmlal.s16 q7, ROW1R, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <-> ROW1R */
|
| + vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644
|
| + vsubl.s16 q3, ROW0L, ROW0R /* ROW4L <-> ROW0R */
|
| + vmull.s16 q2, ROW2L, XFIX_0_541196100
|
| + vmlal.s16 q2, ROW2R, XFIX_0_541196100_MINUS_1_847759065 /* ROW6L <-> ROW2R */
|
| + vmov q4, q6
|
| + vmlsl.s16 q6, ROW1R, XFIX_2_562915447 /* ROW5L <-> ROW1R */
|
| + vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
|
| + vshl.s32 q3, q3, #13
|
| + vmlsl.s16 q4, ROW1L, XFIX_0_899976223
|
| + vadd.s32 q1, q3, q2
|
| + vmov q5, q7
|
| + vadd.s32 q1, q1, q6
|
| + vmlsl.s16 q7, ROW3R, XFIX_0_899976223 /* ROW7L <-> ROW3R */
|
| + vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
|
| + vshrn.s32 ROW1L, q1, #16
|
| + vsub.s32 q1, q1, q6
|
| + vmlal.s16 q5, ROW1R, XFIX_2_053119869_MINUS_2_562915447 /* ROW5L <-> ROW1R */
|
| + vmlsl.s16 q5, ROW3L, XFIX_2_562915447
|
| + vsub.s32 q1, q1, q6
|
| + vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
|
| + vmlal.s16 q6, ROW2R, XFIX_0_541196100 /* ROW6L <-> ROW2R */
|
| + vsub.s32 q3, q3, q2
|
| + vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */
|
| + vadd.s32 q1, q3, q5
|
| + vsub.s32 q3, q3, q5
|
| + vaddl.s16 q5, ROW0L, ROW0R /* ROW4L <-> ROW0R */
|
| + vshrn.s32 ROW2L, q1, #16
|
| + vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */
|
| + vshl.s32 q5, q5, #13
|
| + vmlal.s16 q4, ROW3R, XFIX_0_298631336_MINUS_0_899976223 /* ROW7L <-> ROW3R */
|
| + vadd.s32 q2, q5, q6
|
| + vsub.s32 q1, q5, q6
|
| + vadd.s32 q6, q2, q7
|
| + vsub.s32 q2, q2, q7
|
| + vadd.s32 q5, q1, q4
|
| + vsub.s32 q3, q1, q4
|
| + vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */
|
| + vshrn.s32 ROW3L, q5, #16
|
| + vshrn.s32 ROW0L, q6, #16
|
| + vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */
|
| /* 1-D IDCT, pass 2, right 4x8 half */
|
| - vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| - vmull.s16 q6, ROW5R, XFIX_1_175875602
|
| - vmlal.s16 q6, ROW5L, XFIX_1_175875602 /* ROW5L <-> ROW1R */
|
| - vmlal.s16 q6, ROW7R, XFIX_1_175875602_MINUS_1_961570560
|
| - vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <-> ROW3R */
|
| - vmull.s16 q7, ROW7R, XFIX_1_175875602
|
| - vmlal.s16 q7, ROW7L, XFIX_1_175875602 /* ROW7L <-> ROW3R */
|
| - vmlal.s16 q7, ROW5R, XFIX_1_175875602_MINUS_0_390180644
|
| - vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <-> ROW1R */
|
| - vsubl.s16 q3, ROW4L, ROW4R /* ROW4L <-> ROW0R */
|
| - vmull.s16 q2, ROW6L, XFIX_0_541196100 /* ROW6L <-> ROW2R */
|
| - vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065
|
| - vmov q4, q6
|
| - vmlsl.s16 q6, ROW5R, XFIX_2_562915447
|
| - vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447 /* ROW7L <-> ROW3R */
|
| - vshl.s32 q3, q3, #13
|
| - vmlsl.s16 q4, ROW5L, XFIX_0_899976223 /* ROW5L <-> ROW1R */
|
| - vadd.s32 q1, q3, q2
|
| - vmov q5, q7
|
| - vadd.s32 q1, q1, q6
|
| - vmlsl.s16 q7, ROW7R, XFIX_0_899976223
|
| - vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223 /* ROW5L <-> ROW1R */
|
| - vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */
|
| - vsub.s32 q1, q1, q6
|
| - vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447
|
| - vmlsl.s16 q5, ROW7L, XFIX_2_562915447 /* ROW7L <-> ROW3R */
|
| - vsub.s32 q1, q1, q6
|
| - vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865 /* ROW6L <-> ROW2R */
|
| - vmlal.s16 q6, ROW6R, XFIX_0_541196100
|
| - vsub.s32 q3, q3, q2
|
| - vshrn.s32 ROW6R, q1, #16
|
| - vadd.s32 q1, q3, q5
|
| - vsub.s32 q3, q3, q5
|
| - vaddl.s16 q5, ROW4L, ROW4R /* ROW4L <-> ROW0R */
|
| - vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */
|
| - vshrn.s32 ROW5R, q3, #16
|
| - vshl.s32 q5, q5, #13
|
| - vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223
|
| - vadd.s32 q2, q5, q6
|
| - vsub.s32 q1, q5, q6
|
| - vadd.s32 q6, q2, q7
|
| - vsub.s32 q2, q2, q7
|
| - vadd.s32 q5, q1, q4
|
| - vsub.s32 q3, q1, q4
|
| - vshrn.s32 ROW7R, q2, #16
|
| - vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */
|
| - vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */
|
| - vshrn.s32 ROW4R, q3, #16
|
| + vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| + vmull.s16 q6, ROW5R, XFIX_1_175875602
|
| + vmlal.s16 q6, ROW5L, XFIX_1_175875602 /* ROW5L <-> ROW1R */
|
| + vmlal.s16 q6, ROW7R, XFIX_1_175875602_MINUS_1_961570560
|
| + vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <-> ROW3R */
|
| + vmull.s16 q7, ROW7R, XFIX_1_175875602
|
| + vmlal.s16 q7, ROW7L, XFIX_1_175875602 /* ROW7L <-> ROW3R */
|
| + vmlal.s16 q7, ROW5R, XFIX_1_175875602_MINUS_0_390180644
|
| + vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <-> ROW1R */
|
| + vsubl.s16 q3, ROW4L, ROW4R /* ROW4L <-> ROW0R */
|
| + vmull.s16 q2, ROW6L, XFIX_0_541196100 /* ROW6L <-> ROW2R */
|
| + vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065
|
| + vmov q4, q6
|
| + vmlsl.s16 q6, ROW5R, XFIX_2_562915447
|
| + vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447 /* ROW7L <-> ROW3R */
|
| + vshl.s32 q3, q3, #13
|
| + vmlsl.s16 q4, ROW5L, XFIX_0_899976223 /* ROW5L <-> ROW1R */
|
| + vadd.s32 q1, q3, q2
|
| + vmov q5, q7
|
| + vadd.s32 q1, q1, q6
|
| + vmlsl.s16 q7, ROW7R, XFIX_0_899976223
|
| + vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223 /* ROW5L <-> ROW1R */
|
| + vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */
|
| + vsub.s32 q1, q1, q6
|
| + vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447
|
| + vmlsl.s16 q5, ROW7L, XFIX_2_562915447 /* ROW7L <-> ROW3R */
|
| + vsub.s32 q1, q1, q6
|
| + vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865 /* ROW6L <-> ROW2R */
|
| + vmlal.s16 q6, ROW6R, XFIX_0_541196100
|
| + vsub.s32 q3, q3, q2
|
| + vshrn.s32 ROW6R, q1, #16
|
| + vadd.s32 q1, q3, q5
|
| + vsub.s32 q3, q3, q5
|
| + vaddl.s16 q5, ROW4L, ROW4R /* ROW4L <-> ROW0R */
|
| + vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */
|
| + vshrn.s32 ROW5R, q3, #16
|
| + vshl.s32 q5, q5, #13
|
| + vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223
|
| + vadd.s32 q2, q5, q6
|
| + vsub.s32 q1, q5, q6
|
| + vadd.s32 q6, q2, q7
|
| + vsub.s32 q2, q2, q7
|
| + vadd.s32 q5, q1, q4
|
| + vsub.s32 q3, q1, q4
|
| + vshrn.s32 ROW7R, q2, #16
|
| + vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */
|
| + vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */
|
| + vshrn.s32 ROW4R, q3, #16
|
|
|
| 2: /* Descale to 8-bit and range limit */
|
| - vqrshrn.s16 d16, q8, #2
|
| - vqrshrn.s16 d17, q9, #2
|
| - vqrshrn.s16 d18, q10, #2
|
| - vqrshrn.s16 d19, q11, #2
|
| - vpop {d8-d15} /* restore NEON registers */
|
| - vqrshrn.s16 d20, q12, #2
|
| + vqrshrn.s16 d16, q8, #2
|
| + vqrshrn.s16 d17, q9, #2
|
| + vqrshrn.s16 d18, q10, #2
|
| + vqrshrn.s16 d19, q11, #2
|
| + vpop {d8-d15} /* restore NEON registers */
|
| + vqrshrn.s16 d20, q12, #2
|
| /* Transpose the final 8-bit samples and do signed->unsigned conversion */
|
| - vtrn.16 q8, q9
|
| - vqrshrn.s16 d21, q13, #2
|
| - vqrshrn.s16 d22, q14, #2
|
| - vmov.u8 q0, #(CENTERJSAMPLE)
|
| - vqrshrn.s16 d23, q15, #2
|
| - vtrn.8 d16, d17
|
| - vtrn.8 d18, d19
|
| - vadd.u8 q8, q8, q0
|
| - vadd.u8 q9, q9, q0
|
| - vtrn.16 q10, q11
|
| + vtrn.16 q8, q9
|
| + vqrshrn.s16 d21, q13, #2
|
| + vqrshrn.s16 d22, q14, #2
|
| + vmov.u8 q0, #(CENTERJSAMPLE)
|
| + vqrshrn.s16 d23, q15, #2
|
| + vtrn.8 d16, d17
|
| + vtrn.8 d18, d19
|
| + vadd.u8 q8, q8, q0
|
| + vadd.u8 q9, q9, q0
|
| + vtrn.16 q10, q11
|
| /* Store results to the output buffer */
|
| ldmia OUTPUT_BUF!, {TMP1, TMP2}
|
| add TMP1, TMP1, OUTPUT_COL
|
| @@ -526,7 +530,7 @@ asm_function jsimd_idct_islow_neon
|
| add TMP1, TMP1, OUTPUT_COL
|
| add TMP2, TMP2, OUTPUT_COL
|
| vst1.8 {d18}, [TMP1]
|
| - vadd.u8 q10, q10, q0
|
| + vadd.u8 q10, q10, q0
|
| vst1.8 {d19}, [TMP2]
|
| ldmia OUTPUT_BUF, {TMP1, TMP2, TMP3, TMP4}
|
| add TMP1, TMP1, OUTPUT_COL
|
| @@ -535,7 +539,7 @@ asm_function jsimd_idct_islow_neon
|
| add TMP4, TMP4, OUTPUT_COL
|
| vtrn.8 d22, d23
|
| vst1.8 {d20}, [TMP1]
|
| - vadd.u8 q11, q11, q0
|
| + vadd.u8 q11, q11, q0
|
| vst1.8 {d21}, [TMP2]
|
| vst1.8 {d22}, [TMP3]
|
| vst1.8 {d23}, [TMP4]
|
| @@ -548,14 +552,15 @@ asm_function jsimd_idct_islow_neon
|
| vtrn.16 ROW2L, ROW3L
|
| vtrn.16 ROW0L, ROW1L
|
| vtrn.16 ROW4L, ROW5L
|
| - vshl.s16 ROW0R, ROW0R, #2 /* PASS1_BITS */
|
| + vshl.s16 ROW0R, ROW0R, #2 /* PASS1_BITS */
|
| vtrn.32 ROW1L, ROW3L
|
| vtrn.32 ROW4L, ROW6L
|
| vtrn.32 ROW0L, ROW2L
|
| vtrn.32 ROW5L, ROW7L
|
|
|
| cmp r0, #0
|
| - beq 4f /* Right 4x8 half has all zeros, go to 'sparse' second pass */
|
| + beq 4f /* Right 4x8 half has all zeros, go to 'sparse' second
|
| + pass */
|
|
|
| /* Only row 0 is non-zero for the right 4x8 half */
|
| vdup.s16 ROW1R, ROW0R[1]
|
| @@ -566,83 +571,83 @@ asm_function jsimd_idct_islow_neon
|
| vdup.s16 ROW6R, ROW0R[2]
|
| vdup.s16 ROW7R, ROW0R[3]
|
| vdup.s16 ROW0R, ROW0R[0]
|
| - b 1b /* Go to 'normal' second pass */
|
| + b 1b /* Go to 'normal' second pass */
|
|
|
| 4: /* 1-D IDCT, pass 2 (sparse variant with zero rows 4-7), left 4x8 half */
|
| - vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| - vmull.s16 q6, ROW1L, XFIX_1_175875602
|
| - vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560
|
| - vmull.s16 q7, ROW3L, XFIX_1_175875602
|
| - vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644
|
| - vmull.s16 q2, ROW2L, XFIX_0_541196100
|
| - vshll.s16 q3, ROW0L, #13
|
| - vmov q4, q6
|
| - vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
|
| - vmlsl.s16 q4, ROW1L, XFIX_0_899976223
|
| - vadd.s32 q1, q3, q2
|
| - vmov q5, q7
|
| - vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
|
| - vadd.s32 q1, q1, q6
|
| - vadd.s32 q6, q6, q6
|
| - vmlsl.s16 q5, ROW3L, XFIX_2_562915447
|
| - vshrn.s32 ROW1L, q1, #16
|
| - vsub.s32 q1, q1, q6
|
| - vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
|
| - vsub.s32 q3, q3, q2
|
| - vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */
|
| - vadd.s32 q1, q3, q5
|
| - vsub.s32 q3, q3, q5
|
| - vshll.s16 q5, ROW0L, #13
|
| - vshrn.s32 ROW2L, q1, #16
|
| - vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */
|
| - vadd.s32 q2, q5, q6
|
| - vsub.s32 q1, q5, q6
|
| - vadd.s32 q6, q2, q7
|
| - vsub.s32 q2, q2, q7
|
| - vadd.s32 q5, q1, q4
|
| - vsub.s32 q3, q1, q4
|
| - vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */
|
| - vshrn.s32 ROW3L, q5, #16
|
| - vshrn.s32 ROW0L, q6, #16
|
| - vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */
|
| + vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| + vmull.s16 q6, ROW1L, XFIX_1_175875602
|
| + vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560
|
| + vmull.s16 q7, ROW3L, XFIX_1_175875602
|
| + vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644
|
| + vmull.s16 q2, ROW2L, XFIX_0_541196100
|
| + vshll.s16 q3, ROW0L, #13
|
| + vmov q4, q6
|
| + vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
|
| + vmlsl.s16 q4, ROW1L, XFIX_0_899976223
|
| + vadd.s32 q1, q3, q2
|
| + vmov q5, q7
|
| + vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
|
| + vadd.s32 q1, q1, q6
|
| + vadd.s32 q6, q6, q6
|
| + vmlsl.s16 q5, ROW3L, XFIX_2_562915447
|
| + vshrn.s32 ROW1L, q1, #16
|
| + vsub.s32 q1, q1, q6
|
| + vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
|
| + vsub.s32 q3, q3, q2
|
| + vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */
|
| + vadd.s32 q1, q3, q5
|
| + vsub.s32 q3, q3, q5
|
| + vshll.s16 q5, ROW0L, #13
|
| + vshrn.s32 ROW2L, q1, #16
|
| + vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */
|
| + vadd.s32 q2, q5, q6
|
| + vsub.s32 q1, q5, q6
|
| + vadd.s32 q6, q2, q7
|
| + vsub.s32 q2, q2, q7
|
| + vadd.s32 q5, q1, q4
|
| + vsub.s32 q3, q1, q4
|
| + vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */
|
| + vshrn.s32 ROW3L, q5, #16
|
| + vshrn.s32 ROW0L, q6, #16
|
| + vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */
|
| /* 1-D IDCT, pass 2 (sparse variant with zero rows 4-7), right 4x8 half */
|
| - vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| - vmull.s16 q6, ROW5L, XFIX_1_175875602
|
| - vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560
|
| - vmull.s16 q7, ROW7L, XFIX_1_175875602
|
| - vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644
|
| - vmull.s16 q2, ROW6L, XFIX_0_541196100
|
| - vshll.s16 q3, ROW4L, #13
|
| - vmov q4, q6
|
| - vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447
|
| - vmlsl.s16 q4, ROW5L, XFIX_0_899976223
|
| - vadd.s32 q1, q3, q2
|
| - vmov q5, q7
|
| - vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223
|
| - vadd.s32 q1, q1, q6
|
| - vadd.s32 q6, q6, q6
|
| - vmlsl.s16 q5, ROW7L, XFIX_2_562915447
|
| - vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */
|
| - vsub.s32 q1, q1, q6
|
| - vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865
|
| - vsub.s32 q3, q3, q2
|
| - vshrn.s32 ROW6R, q1, #16
|
| - vadd.s32 q1, q3, q5
|
| - vsub.s32 q3, q3, q5
|
| - vshll.s16 q5, ROW4L, #13
|
| - vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */
|
| - vshrn.s32 ROW5R, q3, #16
|
| - vadd.s32 q2, q5, q6
|
| - vsub.s32 q1, q5, q6
|
| - vadd.s32 q6, q2, q7
|
| - vsub.s32 q2, q2, q7
|
| - vadd.s32 q5, q1, q4
|
| - vsub.s32 q3, q1, q4
|
| - vshrn.s32 ROW7R, q2, #16
|
| - vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */
|
| - vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */
|
| - vshrn.s32 ROW4R, q3, #16
|
| - b 2b /* Go to epilogue */
|
| + vld1.s16 {d2}, [ip, :64] /* reload constants */
|
| + vmull.s16 q6, ROW5L, XFIX_1_175875602
|
| + vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560
|
| + vmull.s16 q7, ROW7L, XFIX_1_175875602
|
| + vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644
|
| + vmull.s16 q2, ROW6L, XFIX_0_541196100
|
| + vshll.s16 q3, ROW4L, #13
|
| + vmov q4, q6
|
| + vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447
|
| + vmlsl.s16 q4, ROW5L, XFIX_0_899976223
|
| + vadd.s32 q1, q3, q2
|
| + vmov q5, q7
|
| + vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223
|
| + vadd.s32 q1, q1, q6
|
| + vadd.s32 q6, q6, q6
|
| + vmlsl.s16 q5, ROW7L, XFIX_2_562915447
|
| + vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */
|
| + vsub.s32 q1, q1, q6
|
| + vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865
|
| + vsub.s32 q3, q3, q2
|
| + vshrn.s32 ROW6R, q1, #16
|
| + vadd.s32 q1, q3, q5
|
| + vsub.s32 q3, q3, q5
|
| + vshll.s16 q5, ROW4L, #13
|
| + vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */
|
| + vshrn.s32 ROW5R, q3, #16
|
| + vadd.s32 q2, q5, q6
|
| + vsub.s32 q1, q5, q6
|
| + vadd.s32 q6, q2, q7
|
| + vsub.s32 q2, q2, q7
|
| + vadd.s32 q5, q1, q4
|
| + vsub.s32 q3, q1, q4
|
| + vshrn.s32 ROW7R, q2, #16
|
| + vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */
|
| + vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */
|
| + vshrn.s32 ROW4R, q3, #16
|
| + b 2b /* Go to epilogue */
|
|
|
| .unreq DCT_TABLE
|
| .unreq COEF_BLOCK
|
| @@ -696,10 +701,10 @@ asm_function jsimd_idct_islow_neon
|
|
|
| .balign 16
|
| jsimd_idct_ifast_neon_consts:
|
| - .short (277 * 128 - 256 * 128) /* XFIX_1_082392200 */
|
| - .short (362 * 128 - 256 * 128) /* XFIX_1_414213562 */
|
| - .short (473 * 128 - 256 * 128) /* XFIX_1_847759065 */
|
| - .short (669 * 128 - 512 * 128) /* XFIX_2_613125930 */
|
| + .short (277 * 128 - 256 * 128) /* XFIX_1_082392200 */
|
| + .short (362 * 128 - 256 * 128) /* XFIX_1_414213562 */
|
| + .short (473 * 128 - 256 * 128) /* XFIX_1_847759065 */
|
| + .short (669 * 128 - 512 * 128) /* XFIX_2_613125930 */
|
|
|
| asm_function jsimd_idct_ifast_neon
|
|
|
| @@ -729,9 +734,9 @@ asm_function jsimd_idct_ifast_neon
|
| vld1.16 {d16, d17, d18, d19}, [COEF_BLOCK, :128]!
|
| vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]!
|
| vld1.16 {d20, d21, d22, d23}, [COEF_BLOCK, :128]!
|
| - vmul.s16 q8, q8, q0
|
| + vmul.s16 q8, q8, q0
|
| vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]!
|
| - vmul.s16 q9, q9, q1
|
| + vmul.s16 q9, q9, q1
|
| vld1.16 {d24, d25, d26, d27}, [COEF_BLOCK, :128]!
|
| vmul.s16 q10, q10, q2
|
| vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]!
|
| @@ -741,124 +746,124 @@ asm_function jsimd_idct_ifast_neon
|
| vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]!
|
| vmul.s16 q14, q14, q2
|
| vmul.s16 q13, q13, q1
|
| - vld1.16 {d0}, [ip, :64] /* load constants */
|
| + vld1.16 {d0}, [ip, :64] /* load constants */
|
| vmul.s16 q15, q15, q3
|
| - vpush {d8-d13} /* save NEON registers */
|
| + vpush {d8-d13} /* save NEON registers */
|
| /* 1-D IDCT, pass 1 */
|
| - vsub.s16 q2, q10, q14
|
| + vsub.s16 q2, q10, q14
|
| vadd.s16 q14, q10, q14
|
| - vsub.s16 q1, q11, q13
|
| + vsub.s16 q1, q11, q13
|
| vadd.s16 q13, q11, q13
|
| - vsub.s16 q5, q9, q15
|
| - vadd.s16 q15, q9, q15
|
| - vqdmulh.s16 q4, q2, XFIX_1_414213562
|
| - vqdmulh.s16 q6, q1, XFIX_2_613125930
|
| - vadd.s16 q3, q1, q1
|
| - vsub.s16 q1, q5, q1
|
| - vadd.s16 q10, q2, q4
|
| - vqdmulh.s16 q4, q1, XFIX_1_847759065
|
| - vsub.s16 q2, q15, q13
|
| - vadd.s16 q3, q3, q6
|
| - vqdmulh.s16 q6, q2, XFIX_1_414213562
|
| - vadd.s16 q1, q1, q4
|
| - vqdmulh.s16 q4, q5, XFIX_1_082392200
|
| + vsub.s16 q5, q9, q15
|
| + vadd.s16 q15, q9, q15
|
| + vqdmulh.s16 q4, q2, XFIX_1_414213562
|
| + vqdmulh.s16 q6, q1, XFIX_2_613125930
|
| + vadd.s16 q3, q1, q1
|
| + vsub.s16 q1, q5, q1
|
| + vadd.s16 q10, q2, q4
|
| + vqdmulh.s16 q4, q1, XFIX_1_847759065
|
| + vsub.s16 q2, q15, q13
|
| + vadd.s16 q3, q3, q6
|
| + vqdmulh.s16 q6, q2, XFIX_1_414213562
|
| + vadd.s16 q1, q1, q4
|
| + vqdmulh.s16 q4, q5, XFIX_1_082392200
|
| vsub.s16 q10, q10, q14
|
| - vadd.s16 q2, q2, q6
|
| - vsub.s16 q6, q8, q12
|
| - vadd.s16 q12, q8, q12
|
| - vadd.s16 q9, q5, q4
|
| - vadd.s16 q5, q6, q10
|
| - vsub.s16 q10, q6, q10
|
| - vadd.s16 q6, q15, q13
|
| - vadd.s16 q8, q12, q14
|
| - vsub.s16 q3, q6, q3
|
| + vadd.s16 q2, q2, q6
|
| + vsub.s16 q6, q8, q12
|
| + vadd.s16 q12, q8, q12
|
| + vadd.s16 q9, q5, q4
|
| + vadd.s16 q5, q6, q10
|
| + vsub.s16 q10, q6, q10
|
| + vadd.s16 q6, q15, q13
|
| + vadd.s16 q8, q12, q14
|
| + vsub.s16 q3, q6, q3
|
| vsub.s16 q12, q12, q14
|
| - vsub.s16 q3, q3, q1
|
| - vsub.s16 q1, q9, q1
|
| - vadd.s16 q2, q3, q2
|
| - vsub.s16 q15, q8, q6
|
| - vadd.s16 q1, q1, q2
|
| - vadd.s16 q8, q8, q6
|
| - vadd.s16 q14, q5, q3
|
| - vsub.s16 q9, q5, q3
|
| + vsub.s16 q3, q3, q1
|
| + vsub.s16 q1, q9, q1
|
| + vadd.s16 q2, q3, q2
|
| + vsub.s16 q15, q8, q6
|
| + vadd.s16 q1, q1, q2
|
| + vadd.s16 q8, q8, q6
|
| + vadd.s16 q14, q5, q3
|
| + vsub.s16 q9, q5, q3
|
| vsub.s16 q13, q10, q2
|
| vadd.s16 q10, q10, q2
|
| /* Transpose */
|
| - vtrn.16 q8, q9
|
| + 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
|
| - vtrn.32 q9, q11
|
| + vtrn.32 q9, q11
|
| vtrn.32 q12, q14
|
| - vtrn.32 q8, q10
|
| + vtrn.32 q8, q10
|
| vtrn.32 q13, q15
|
| vswp d28, d21
|
| vswp d26, d19
|
| /* 1-D IDCT, pass 2 */
|
| - vsub.s16 q2, q10, q14
|
| + vsub.s16 q2, q10, q14
|
| vswp d30, d23
|
| vadd.s16 q14, q10, q14
|
| vswp d24, d17
|
| - vsub.s16 q1, q11, q13
|
| + vsub.s16 q1, q11, q13
|
| vadd.s16 q13, q11, q13
|
| - vsub.s16 q5, q9, q15
|
| - vadd.s16 q15, q9, q15
|
| - vqdmulh.s16 q4, q2, XFIX_1_414213562
|
| - vqdmulh.s16 q6, q1, XFIX_2_613125930
|
| - vadd.s16 q3, q1, q1
|
| - vsub.s16 q1, q5, q1
|
| - vadd.s16 q10, q2, q4
|
| - vqdmulh.s16 q4, q1, XFIX_1_847759065
|
| - vsub.s16 q2, q15, q13
|
| - vadd.s16 q3, q3, q6
|
| - vqdmulh.s16 q6, q2, XFIX_1_414213562
|
| - vadd.s16 q1, q1, q4
|
| - vqdmulh.s16 q4, q5, XFIX_1_082392200
|
| + vsub.s16 q5, q9, q15
|
| + vadd.s16 q15, q9, q15
|
| + vqdmulh.s16 q4, q2, XFIX_1_414213562
|
| + vqdmulh.s16 q6, q1, XFIX_2_613125930
|
| + vadd.s16 q3, q1, q1
|
| + vsub.s16 q1, q5, q1
|
| + vadd.s16 q10, q2, q4
|
| + vqdmulh.s16 q4, q1, XFIX_1_847759065
|
| + vsub.s16 q2, q15, q13
|
| + vadd.s16 q3, q3, q6
|
| + vqdmulh.s16 q6, q2, XFIX_1_414213562
|
| + vadd.s16 q1, q1, q4
|
| + vqdmulh.s16 q4, q5, XFIX_1_082392200
|
| vsub.s16 q10, q10, q14
|
| - vadd.s16 q2, q2, q6
|
| - vsub.s16 q6, q8, q12
|
| - vadd.s16 q12, q8, q12
|
| - vadd.s16 q9, q5, q4
|
| - vadd.s16 q5, q6, q10
|
| - vsub.s16 q10, q6, q10
|
| - vadd.s16 q6, q15, q13
|
| - vadd.s16 q8, q12, q14
|
| - vsub.s16 q3, q6, q3
|
| + vadd.s16 q2, q2, q6
|
| + vsub.s16 q6, q8, q12
|
| + vadd.s16 q12, q8, q12
|
| + vadd.s16 q9, q5, q4
|
| + vadd.s16 q5, q6, q10
|
| + vsub.s16 q10, q6, q10
|
| + vadd.s16 q6, q15, q13
|
| + vadd.s16 q8, q12, q14
|
| + vsub.s16 q3, q6, q3
|
| vsub.s16 q12, q12, q14
|
| - vsub.s16 q3, q3, q1
|
| - vsub.s16 q1, q9, q1
|
| - vadd.s16 q2, q3, q2
|
| - vsub.s16 q15, q8, q6
|
| - vadd.s16 q1, q1, q2
|
| - vadd.s16 q8, q8, q6
|
| - vadd.s16 q14, q5, q3
|
| - vsub.s16 q9, q5, q3
|
| + vsub.s16 q3, q3, q1
|
| + vsub.s16 q1, q9, q1
|
| + vadd.s16 q2, q3, q2
|
| + vsub.s16 q15, q8, q6
|
| + vadd.s16 q1, q1, q2
|
| + vadd.s16 q8, q8, q6
|
| + vadd.s16 q14, q5, q3
|
| + vsub.s16 q9, q5, q3
|
| vsub.s16 q13, q10, q2
|
| - vpop {d8-d13} /* restore NEON registers */
|
| + vpop {d8-d13} /* restore NEON registers */
|
| vadd.s16 q10, q10, q2
|
| vsub.s16 q11, 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
|
| + 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 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 q8, q9
|
| vtrn.16 q10, q11
|
| - vtrn.32 q8, q10
|
| - vtrn.32 q9, q11
|
| + vtrn.32 q8, q10
|
| + vtrn.32 q9, q11
|
| vtrn.8 d16, d17
|
| vtrn.8 d18, d19
|
| /* Store results to the output buffer */
|
| @@ -917,81 +922,80 @@ asm_function jsimd_idct_ifast_neon
|
|
|
| #define CONST_BITS 13
|
|
|
| -#define FIX_0_211164243 (1730) /* FIX(0.211164243) */
|
| -#define FIX_0_509795579 (4176) /* FIX(0.509795579) */
|
| -#define FIX_0_601344887 (4926) /* FIX(0.601344887) */
|
| -#define FIX_0_720959822 (5906) /* FIX(0.720959822) */
|
| -#define FIX_0_765366865 (6270) /* FIX(0.765366865) */
|
| -#define FIX_0_850430095 (6967) /* FIX(0.850430095) */
|
| -#define FIX_0_899976223 (7373) /* FIX(0.899976223) */
|
| -#define FIX_1_061594337 (8697) /* FIX(1.061594337) */
|
| -#define FIX_1_272758580 (10426) /* FIX(1.272758580) */
|
| -#define FIX_1_451774981 (11893) /* FIX(1.451774981) */
|
| -#define FIX_1_847759065 (15137) /* FIX(1.847759065) */
|
| -#define FIX_2_172734803 (17799) /* FIX(2.172734803) */
|
| -#define FIX_2_562915447 (20995) /* FIX(2.562915447) */
|
| -#define FIX_3_624509785 (29692) /* FIX(3.624509785) */
|
| +#define FIX_0_211164243 (1730) /* FIX(0.211164243) */
|
| +#define FIX_0_509795579 (4176) /* FIX(0.509795579) */
|
| +#define FIX_0_601344887 (4926) /* FIX(0.601344887) */
|
| +#define FIX_0_720959822 (5906) /* FIX(0.720959822) */
|
| +#define FIX_0_765366865 (6270) /* FIX(0.765366865) */
|
| +#define FIX_0_850430095 (6967) /* FIX(0.850430095) */
|
| +#define FIX_0_899976223 (7373) /* FIX(0.899976223) */
|
| +#define FIX_1_061594337 (8697) /* FIX(1.061594337) */
|
| +#define FIX_1_272758580 (10426) /* FIX(1.272758580) */
|
| +#define FIX_1_451774981 (11893) /* FIX(1.451774981) */
|
| +#define FIX_1_847759065 (15137) /* FIX(1.847759065) */
|
| +#define FIX_2_172734803 (17799) /* FIX(2.172734803) */
|
| +#define FIX_2_562915447 (20995) /* FIX(2.562915447) */
|
| +#define FIX_3_624509785 (29692) /* FIX(3.624509785) */
|
|
|
| .balign 16
|
| jsimd_idct_4x4_neon_consts:
|
| - .short FIX_1_847759065 /* d0[0] */
|
| - .short -FIX_0_765366865 /* d0[1] */
|
| - .short -FIX_0_211164243 /* d0[2] */
|
| - .short FIX_1_451774981 /* d0[3] */
|
| - .short -FIX_2_172734803 /* d1[0] */
|
| - .short FIX_1_061594337 /* d1[1] */
|
| - .short -FIX_0_509795579 /* d1[2] */
|
| - .short -FIX_0_601344887 /* d1[3] */
|
| - .short FIX_0_899976223 /* d2[0] */
|
| - .short FIX_2_562915447 /* d2[1] */
|
| - .short 1 << (CONST_BITS+1) /* d2[2] */
|
| - .short 0 /* d2[3] */
|
| + .short FIX_1_847759065 /* d0[0] */
|
| + .short -FIX_0_765366865 /* d0[1] */
|
| + .short -FIX_0_211164243 /* d0[2] */
|
| + .short FIX_1_451774981 /* d0[3] */
|
| + .short -FIX_2_172734803 /* d1[0] */
|
| + .short FIX_1_061594337 /* d1[1] */
|
| + .short -FIX_0_509795579 /* d1[2] */
|
| + .short -FIX_0_601344887 /* d1[3] */
|
| + .short FIX_0_899976223 /* d2[0] */
|
| + .short FIX_2_562915447 /* d2[1] */
|
| + .short 1 << (CONST_BITS+1) /* d2[2] */
|
| + .short 0 /* d2[3] */
|
|
|
| .macro idct_helper x4, x6, x8, x10, x12, x14, x16, shift, y26, y27, y28, y29
|
| - vmull.s16 q14, \x4, d2[2]
|
| - vmlal.s16 q14, \x8, d0[0]
|
| + vmull.s16 q14, \x4, d2[2]
|
| + vmlal.s16 q14, \x8, d0[0]
|
| vmlal.s16 q14, \x14, d0[1]
|
|
|
| vmull.s16 q13, \x16, d1[2]
|
| vmlal.s16 q13, \x12, d1[3]
|
| vmlal.s16 q13, \x10, d2[0]
|
| - vmlal.s16 q13, \x6, d2[1]
|
| + vmlal.s16 q13, \x6, d2[1]
|
|
|
| - vmull.s16 q15, \x4, d2[2]
|
| - vmlsl.s16 q15, \x8, d0[0]
|
| + vmull.s16 q15, \x4, d2[2]
|
| + vmlsl.s16 q15, \x8, d0[0]
|
| vmlsl.s16 q15, \x14, d0[1]
|
|
|
| vmull.s16 q12, \x16, d0[2]
|
| vmlal.s16 q12, \x12, d0[3]
|
| vmlal.s16 q12, \x10, d1[0]
|
| - vmlal.s16 q12, \x6, d1[1]
|
| + vmlal.s16 q12, \x6, d1[1]
|
|
|
| vadd.s32 q10, q14, q13
|
| vsub.s32 q14, q14, q13
|
|
|
| -.if \shift > 16
|
| - vrshr.s32 q10, q10, #\shift
|
| - vrshr.s32 q14, q14, #\shift
|
| + .if \shift > 16
|
| + vrshr.s32 q10, q10, #\shift
|
| + vrshr.s32 q14, q14, #\shift
|
| vmovn.s32 \y26, q10
|
| vmovn.s32 \y29, q14
|
| -.else
|
| + .else
|
| vrshrn.s32 \y26, q10, #\shift
|
| vrshrn.s32 \y29, q14, #\shift
|
| -.endif
|
| + .endif
|
|
|
| vadd.s32 q10, q15, q12
|
| vsub.s32 q15, q15, q12
|
|
|
| -.if \shift > 16
|
| - vrshr.s32 q10, q10, #\shift
|
| - vrshr.s32 q15, q15, #\shift
|
| + .if \shift > 16
|
| + vrshr.s32 q10, q10, #\shift
|
| + vrshr.s32 q15, q15, #\shift
|
| vmovn.s32 \y27, q10
|
| vmovn.s32 \y28, q15
|
| -.else
|
| + .else
|
| vrshrn.s32 \y27, q10, #\shift
|
| vrshrn.s32 \y28, q15, #\shift
|
| -.endif
|
| -
|
| + .endif
|
| .endm
|
|
|
| asm_function jsimd_idct_4x4_neon
|
| @@ -1127,31 +1131,30 @@ asm_function jsimd_idct_4x4_neon
|
|
|
| .balign 8
|
| jsimd_idct_2x2_neon_consts:
|
| - .short -FIX_0_720959822 /* d0[0] */
|
| - .short FIX_0_850430095 /* d0[1] */
|
| - .short -FIX_1_272758580 /* d0[2] */
|
| - .short FIX_3_624509785 /* d0[3] */
|
| + .short -FIX_0_720959822 /* d0[0] */
|
| + .short FIX_0_850430095 /* d0[1] */
|
| + .short -FIX_1_272758580 /* d0[2] */
|
| + .short FIX_3_624509785 /* d0[3] */
|
|
|
| .macro idct_helper x4, x6, x10, x12, x16, shift, y26, y27
|
| - vshll.s16 q14, \x4, #15
|
| - vmull.s16 q13, \x6, d0[3]
|
| - vmlal.s16 q13, \x10, d0[2]
|
| - vmlal.s16 q13, \x12, d0[1]
|
| - vmlal.s16 q13, \x16, d0[0]
|
| -
|
| - vadd.s32 q10, q14, q13
|
| - vsub.s32 q14, q14, q13
|
| -
|
| -.if \shift > 16
|
| - vrshr.s32 q10, q10, #\shift
|
| - vrshr.s32 q14, q14, #\shift
|
| - vmovn.s32 \y26, q10
|
| - vmovn.s32 \y27, q14
|
| -.else
|
| - vrshrn.s32 \y26, q10, #\shift
|
| - vrshrn.s32 \y27, q14, #\shift
|
| -.endif
|
| + vshll.s16 q14, \x4, #15
|
| + vmull.s16 q13, \x6, d0[3]
|
| + vmlal.s16 q13, \x10, d0[2]
|
| + vmlal.s16 q13, \x12, d0[1]
|
| + vmlal.s16 q13, \x16, d0[0]
|
| +
|
| + vadd.s32 q10, q14, q13
|
| + vsub.s32 q14, q14, q13
|
|
|
| + .if \shift > 16
|
| + vrshr.s32 q10, q10, #\shift
|
| + vrshr.s32 q14, q14, #\shift
|
| + vmovn.s32 \y26, q10
|
| + vmovn.s32 \y27, q14
|
| + .else
|
| + vrshrn.s32 \y26, q10, #\shift
|
| + vrshrn.s32 \y27, q14, #\shift
|
| + .endif
|
| .endm
|
|
|
| asm_function jsimd_idct_2x2_neon
|
| @@ -1205,30 +1208,30 @@ asm_function jsimd_idct_2x2_neon
|
| /* Pass 1 */
|
| #if 0
|
| idct_helper d4, d6, d10, d12, d16, 13, d4, d6
|
| - transpose_4x4 d4, d6, d8, d10
|
| + transpose_4x4 d4, d6, d8, d10
|
| idct_helper d5, d7, d11, d13, d17, 13, d5, d7
|
| - transpose_4x4 d5, d7, d9, d11
|
| + transpose_4x4 d5, d7, d9, d11
|
| #else
|
| - vmull.s16 q13, d6, d0[3]
|
| + vmull.s16 q13, d6, d0[3]
|
| vmlal.s16 q13, d10, d0[2]
|
| vmlal.s16 q13, d12, d0[1]
|
| vmlal.s16 q13, d16, d0[0]
|
| - vmull.s16 q12, d7, d0[3]
|
| + vmull.s16 q12, d7, d0[3]
|
| vmlal.s16 q12, d11, d0[2]
|
| vmlal.s16 q12, d13, d0[1]
|
| vmlal.s16 q12, d17, d0[0]
|
| - vshll.s16 q14, d4, #15
|
| - vshll.s16 q15, d5, #15
|
| + vshll.s16 q14, d4, #15
|
| + vshll.s16 q15, d5, #15
|
| vadd.s32 q10, q14, q13
|
| vsub.s32 q14, q14, q13
|
| - vrshrn.s32 d4, q10, #13
|
| - vrshrn.s32 d6, q14, #13
|
| + vrshrn.s32 d4, q10, #13
|
| + vrshrn.s32 d6, q14, #13
|
| vadd.s32 q10, q15, q12
|
| vsub.s32 q14, q15, q12
|
| - vrshrn.s32 d5, q10, #13
|
| - vrshrn.s32 d7, q14, #13
|
| - vtrn.16 q2, q3
|
| - vtrn.32 q3, q5
|
| + vrshrn.s32 d5, q10, #13
|
| + vrshrn.s32 d7, q14, #13
|
| + vtrn.16 q2, q3
|
| + vtrn.32 q3, q5
|
| #endif
|
|
|
| /* Pass 2 */
|
| @@ -1278,110 +1281,110 @@ asm_function jsimd_idct_2x2_neon
|
|
|
|
|
| .macro do_load size
|
| + .if \size == 8
|
| + vld1.8 {d4}, [U, :64]!
|
| + vld1.8 {d5}, [V, :64]!
|
| + vld1.8 {d0}, [Y, :64]!
|
| + pld [U, #64]
|
| + pld [V, #64]
|
| + pld [Y, #64]
|
| + .elseif \size == 4
|
| + vld1.8 {d4[0]}, [U]!
|
| + vld1.8 {d4[1]}, [U]!
|
| + vld1.8 {d4[2]}, [U]!
|
| + vld1.8 {d4[3]}, [U]!
|
| + vld1.8 {d5[0]}, [V]!
|
| + vld1.8 {d5[1]}, [V]!
|
| + vld1.8 {d5[2]}, [V]!
|
| + vld1.8 {d5[3]}, [V]!
|
| + vld1.8 {d0[0]}, [Y]!
|
| + vld1.8 {d0[1]}, [Y]!
|
| + vld1.8 {d0[2]}, [Y]!
|
| + vld1.8 {d0[3]}, [Y]!
|
| + .elseif \size == 2
|
| + vld1.8 {d4[4]}, [U]!
|
| + vld1.8 {d4[5]}, [U]!
|
| + vld1.8 {d5[4]}, [V]!
|
| + vld1.8 {d5[5]}, [V]!
|
| + vld1.8 {d0[4]}, [Y]!
|
| + vld1.8 {d0[5]}, [Y]!
|
| + .elseif \size == 1
|
| + vld1.8 {d4[6]}, [U]!
|
| + vld1.8 {d5[6]}, [V]!
|
| + vld1.8 {d0[6]}, [Y]!
|
| + .else
|
| + .error unsupported macroblock size
|
| + .endif
|
| +.endm
|
| +
|
| +.macro do_store bpp, size
|
| + .if \bpp == 24
|
| .if \size == 8
|
| - vld1.8 {d4}, [U, :64]!
|
| - vld1.8 {d5}, [V, :64]!
|
| - vld1.8 {d0}, [Y, :64]!
|
| - pld [U, #64]
|
| - pld [V, #64]
|
| - pld [Y, #64]
|
| + vst3.8 {d10, d11, d12}, [RGB]!
|
| .elseif \size == 4
|
| - vld1.8 {d4[0]}, [U]!
|
| - vld1.8 {d4[1]}, [U]!
|
| - vld1.8 {d4[2]}, [U]!
|
| - vld1.8 {d4[3]}, [U]!
|
| - vld1.8 {d5[0]}, [V]!
|
| - vld1.8 {d5[1]}, [V]!
|
| - vld1.8 {d5[2]}, [V]!
|
| - vld1.8 {d5[3]}, [V]!
|
| - vld1.8 {d0[0]}, [Y]!
|
| - vld1.8 {d0[1]}, [Y]!
|
| - vld1.8 {d0[2]}, [Y]!
|
| - vld1.8 {d0[3]}, [Y]!
|
| + vst3.8 {d10[0], d11[0], d12[0]}, [RGB]!
|
| + vst3.8 {d10[1], d11[1], d12[1]}, [RGB]!
|
| + vst3.8 {d10[2], d11[2], d12[2]}, [RGB]!
|
| + vst3.8 {d10[3], d11[3], d12[3]}, [RGB]!
|
| .elseif \size == 2
|
| - vld1.8 {d4[4]}, [U]!
|
| - vld1.8 {d4[5]}, [U]!
|
| - vld1.8 {d5[4]}, [V]!
|
| - vld1.8 {d5[5]}, [V]!
|
| - vld1.8 {d0[4]}, [Y]!
|
| - vld1.8 {d0[5]}, [Y]!
|
| + vst3.8 {d10[4], d11[4], d12[4]}, [RGB]!
|
| + vst3.8 {d10[5], d11[5], d12[5]}, [RGB]!
|
| .elseif \size == 1
|
| - vld1.8 {d4[6]}, [U]!
|
| - vld1.8 {d5[6]}, [V]!
|
| - vld1.8 {d0[6]}, [Y]!
|
| + vst3.8 {d10[6], d11[6], d12[6]}, [RGB]!
|
| .else
|
| - .error unsupported macroblock size
|
| + .error unsupported macroblock size
|
| .endif
|
| -.endm
|
| -
|
| -.macro do_store bpp, size
|
| - .if \bpp == 24
|
| - .if \size == 8
|
| - vst3.8 {d10, d11, d12}, [RGB]!
|
| - .elseif \size == 4
|
| - vst3.8 {d10[0], d11[0], d12[0]}, [RGB]!
|
| - vst3.8 {d10[1], d11[1], d12[1]}, [RGB]!
|
| - vst3.8 {d10[2], d11[2], d12[2]}, [RGB]!
|
| - vst3.8 {d10[3], d11[3], d12[3]}, [RGB]!
|
| - .elseif \size == 2
|
| - vst3.8 {d10[4], d11[4], d12[4]}, [RGB]!
|
| - vst3.8 {d10[5], d11[5], d12[5]}, [RGB]!
|
| - .elseif \size == 1
|
| - vst3.8 {d10[6], d11[6], d12[6]}, [RGB]!
|
| - .else
|
| - .error unsupported macroblock size
|
| - .endif
|
| - .elseif \bpp == 32
|
| - .if \size == 8
|
| - vst4.8 {d10, d11, d12, d13}, [RGB]!
|
| - .elseif \size == 4
|
| - vst4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
|
| - vst4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
|
| - vst4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
|
| - vst4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
|
| - .elseif \size == 2
|
| - vst4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
|
| - vst4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
|
| - .elseif \size == 1
|
| - vst4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
|
| - .else
|
| - .error unsupported macroblock size
|
| - .endif
|
| - .elseif \bpp == 16
|
| - .if \size == 8
|
| - vst1.16 {q15}, [RGB]!
|
| - .elseif \size == 4
|
| - vst1.16 {d30}, [RGB]!
|
| - .elseif \size == 2
|
| - vst1.16 {d31[0]}, [RGB]!
|
| - vst1.16 {d31[1]}, [RGB]!
|
| - .elseif \size == 1
|
| - vst1.16 {d31[2]}, [RGB]!
|
| - .else
|
| - .error unsupported macroblock size
|
| - .endif
|
| + .elseif \bpp == 32
|
| + .if \size == 8
|
| + vst4.8 {d10, d11, d12, d13}, [RGB]!
|
| + .elseif \size == 4
|
| + vst4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
|
| + vst4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
|
| + vst4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
|
| + vst4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
|
| + .elseif \size == 2
|
| + vst4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
|
| + vst4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
|
| + .elseif \size == 1
|
| + vst4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
|
| .else
|
| - .error unsupported bpp
|
| + .error unsupported macroblock size
|
| .endif
|
| + .elseif \bpp == 16
|
| + .if \size == 8
|
| + vst1.16 {q15}, [RGB]!
|
| + .elseif \size == 4
|
| + vst1.16 {d30}, [RGB]!
|
| + .elseif \size == 2
|
| + vst1.16 {d31[0]}, [RGB]!
|
| + vst1.16 {d31[1]}, [RGB]!
|
| + .elseif \size == 1
|
| + vst1.16 {d31[2]}, [RGB]!
|
| + .else
|
| + .error unsupported macroblock size
|
| + .endif
|
| + .else
|
| + .error unsupported bpp
|
| + .endif
|
| .endm
|
|
|
| .macro generate_jsimd_ycc_rgb_convert_neon colorid, bpp, r_offs, g_offs, b_offs
|
|
|
| /*
|
| - * 2 stage pipelined YCbCr->RGB conversion
|
| + * 2-stage pipelined YCbCr->RGB conversion
|
| */
|
|
|
| .macro do_yuv_to_rgb_stage1
|
| - vaddw.u8 q3, q1, d4 /* q3 = u - 128 */
|
| - vaddw.u8 q4, q1, d5 /* q2 = v - 128 */
|
| - vmull.s16 q10, d6, d1[1] /* multiply by -11277 */
|
| - vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */
|
| - vmull.s16 q11, d7, d1[1] /* multiply by -11277 */
|
| - vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */
|
| - vmull.s16 q12, d8, d1[0] /* multiply by 22971 */
|
| - vmull.s16 q13, d9, d1[0] /* multiply by 22971 */
|
| - vmull.s16 q14, d6, d1[3] /* multiply by 29033 */
|
| - vmull.s16 q15, d7, d1[3] /* multiply by 29033 */
|
| + vaddw.u8 q3, q1, d4 /* q3 = u - 128 */
|
| + vaddw.u8 q4, q1, d5 /* q2 = v - 128 */
|
| + vmull.s16 q10, d6, d1[1] /* multiply by -11277 */
|
| + vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */
|
| + vmull.s16 q11, d7, d1[1] /* multiply by -11277 */
|
| + vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */
|
| + vmull.s16 q12, d8, d1[0] /* multiply by 22971 */
|
| + vmull.s16 q13, d9, d1[0] /* multiply by 22971 */
|
| + vmull.s16 q14, d6, d1[3] /* multiply by 29033 */
|
| + vmull.s16 q15, d7, d1[3] /* multiply by 29033 */
|
| .endm
|
|
|
| .macro do_yuv_to_rgb_stage2
|
| @@ -1394,68 +1397,68 @@ asm_function jsimd_idct_2x2_neon
|
| vaddw.u8 q11, q10, d0
|
| vaddw.u8 q12, q12, d0
|
| vaddw.u8 q14, q14, d0
|
| -.if \bpp != 16
|
| + .if \bpp != 16
|
| vqmovun.s16 d1\g_offs, q11
|
| vqmovun.s16 d1\r_offs, q12
|
| vqmovun.s16 d1\b_offs, q14
|
| -.else /* rgb565 */
|
| + .else /* rgb565 */
|
| vqshlu.s16 q13, q11, #8
|
| vqshlu.s16 q15, q12, #8
|
| vqshlu.s16 q14, q14, #8
|
| vsri.u16 q15, q13, #5
|
| vsri.u16 q15, q14, #11
|
| -.endif
|
| + .endif
|
| .endm
|
|
|
| .macro do_yuv_to_rgb_stage2_store_load_stage1
|
| - /* "do_yuv_to_rgb_stage2" and "store" */
|
| - vrshrn.s32 d20, q10, #15
|
| + /* "do_yuv_to_rgb_stage2" and "store" */
|
| + vrshrn.s32 d20, q10, #15
|
| /* "load" and "do_yuv_to_rgb_stage1" */
|
| pld [U, #64]
|
| - vrshrn.s32 d21, q11, #15
|
| + vrshrn.s32 d21, q11, #15
|
| pld [V, #64]
|
| - vrshrn.s32 d24, q12, #14
|
| - vrshrn.s32 d25, q13, #14
|
| + vrshrn.s32 d24, q12, #14
|
| + vrshrn.s32 d25, q13, #14
|
| vld1.8 {d4}, [U, :64]!
|
| - vrshrn.s32 d28, q14, #14
|
| + vrshrn.s32 d28, q14, #14
|
| vld1.8 {d5}, [V, :64]!
|
| - vrshrn.s32 d29, q15, #14
|
| - vaddw.u8 q3, q1, d4 /* q3 = u - 128 */
|
| - vaddw.u8 q4, q1, d5 /* q2 = v - 128 */
|
| - vaddw.u8 q11, q10, d0
|
| - vmull.s16 q10, d6, d1[1] /* multiply by -11277 */
|
| - vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */
|
| - vaddw.u8 q12, q12, d0
|
| - vaddw.u8 q14, q14, d0
|
| -.if \bpp != 16 /**************** rgb24/rgb32 *********************************/
|
| - vqmovun.s16 d1\g_offs, q11
|
| + vrshrn.s32 d29, q15, #14
|
| + vaddw.u8 q3, q1, d4 /* q3 = u - 128 */
|
| + vaddw.u8 q4, q1, d5 /* q2 = v - 128 */
|
| + vaddw.u8 q11, q10, d0
|
| + vmull.s16 q10, d6, d1[1] /* multiply by -11277 */
|
| + vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */
|
| + vaddw.u8 q12, q12, d0
|
| + vaddw.u8 q14, q14, d0
|
| + .if \bpp != 16 /**************** rgb24/rgb32 ******************************/
|
| + vqmovun.s16 d1\g_offs, q11
|
| pld [Y, #64]
|
| - vqmovun.s16 d1\r_offs, q12
|
| + vqmovun.s16 d1\r_offs, q12
|
| vld1.8 {d0}, [Y, :64]!
|
| - vqmovun.s16 d1\b_offs, q14
|
| - vmull.s16 q11, d7, d1[1] /* multiply by -11277 */
|
| - vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */
|
| - do_store \bpp, 8
|
| - vmull.s16 q12, d8, d1[0] /* multiply by 22971 */
|
| - vmull.s16 q13, d9, d1[0] /* multiply by 22971 */
|
| - vmull.s16 q14, d6, d1[3] /* multiply by 29033 */
|
| - vmull.s16 q15, d7, d1[3] /* multiply by 29033 */
|
| -.else /**************************** rgb565 ***********************************/
|
| - vqshlu.s16 q13, q11, #8
|
| + vqmovun.s16 d1\b_offs, q14
|
| + vmull.s16 q11, d7, d1[1] /* multiply by -11277 */
|
| + vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */
|
| + do_store \bpp, 8
|
| + vmull.s16 q12, d8, d1[0] /* multiply by 22971 */
|
| + vmull.s16 q13, d9, d1[0] /* multiply by 22971 */
|
| + vmull.s16 q14, d6, d1[3] /* multiply by 29033 */
|
| + vmull.s16 q15, d7, d1[3] /* multiply by 29033 */
|
| + .else /**************************** rgb565 ********************************/
|
| + vqshlu.s16 q13, q11, #8
|
| pld [Y, #64]
|
| - vqshlu.s16 q15, q12, #8
|
| - vqshlu.s16 q14, q14, #8
|
| + vqshlu.s16 q15, q12, #8
|
| + vqshlu.s16 q14, q14, #8
|
| vld1.8 {d0}, [Y, :64]!
|
| vmull.s16 q11, d7, d1[1]
|
| vmlal.s16 q11, d9, d1[2]
|
| - vsri.u16 q15, q13, #5
|
| + vsri.u16 q15, q13, #5
|
| vmull.s16 q12, d8, d1[0]
|
| - vsri.u16 q15, q14, #11
|
| + vsri.u16 q15, q14, #11
|
| vmull.s16 q13, d9, d1[0]
|
| vmull.s16 q14, d6, d1[3]
|
| - do_store \bpp, 8
|
| + do_store \bpp, 8
|
| vmull.s16 q15, d7, d1[3]
|
| -.endif
|
| + .endif
|
| .endm
|
|
|
| .macro do_yuv_to_rgb
|
| @@ -1469,10 +1472,10 @@ asm_function jsimd_idct_2x2_neon
|
|
|
| .balign 16
|
| jsimd_ycc_\colorid\()_neon_consts:
|
| - .short 0, 0, 0, 0
|
| - .short 22971, -11277, -23401, 29033
|
| - .short -128, -128, -128, -128
|
| - .short -128, -128, -128, -128
|
| + .short 0, 0, 0, 0
|
| + .short 22971, -11277, -23401, 29033
|
| + .short -128, -128, -128, -128
|
| + .short -128, -128, -128, -128
|
|
|
| asm_function jsimd_ycc_\colorid\()_convert_neon
|
| OUTPUT_WIDTH .req r0
|
| @@ -1617,123 +1620,123 @@ generate_jsimd_ycc_rgb_convert_neon rgb565, 16, 0, 0, 0
|
| */
|
|
|
| .macro do_store size
|
| + .if \size == 8
|
| + vst1.8 {d20}, [Y]!
|
| + vst1.8 {d21}, [U]!
|
| + vst1.8 {d22}, [V]!
|
| + .elseif \size == 4
|
| + vst1.8 {d20[0]}, [Y]!
|
| + vst1.8 {d20[1]}, [Y]!
|
| + vst1.8 {d20[2]}, [Y]!
|
| + vst1.8 {d20[3]}, [Y]!
|
| + vst1.8 {d21[0]}, [U]!
|
| + vst1.8 {d21[1]}, [U]!
|
| + vst1.8 {d21[2]}, [U]!
|
| + vst1.8 {d21[3]}, [U]!
|
| + vst1.8 {d22[0]}, [V]!
|
| + vst1.8 {d22[1]}, [V]!
|
| + vst1.8 {d22[2]}, [V]!
|
| + vst1.8 {d22[3]}, [V]!
|
| + .elseif \size == 2
|
| + vst1.8 {d20[4]}, [Y]!
|
| + vst1.8 {d20[5]}, [Y]!
|
| + vst1.8 {d21[4]}, [U]!
|
| + vst1.8 {d21[5]}, [U]!
|
| + vst1.8 {d22[4]}, [V]!
|
| + vst1.8 {d22[5]}, [V]!
|
| + .elseif \size == 1
|
| + vst1.8 {d20[6]}, [Y]!
|
| + vst1.8 {d21[6]}, [U]!
|
| + vst1.8 {d22[6]}, [V]!
|
| + .else
|
| + .error unsupported macroblock size
|
| + .endif
|
| +.endm
|
| +
|
| +.macro do_load bpp, size
|
| + .if \bpp == 24
|
| .if \size == 8
|
| - vst1.8 {d20}, [Y]!
|
| - vst1.8 {d21}, [U]!
|
| - vst1.8 {d22}, [V]!
|
| + vld3.8 {d10, d11, d12}, [RGB]!
|
| + pld [RGB, #128]
|
| .elseif \size == 4
|
| - vst1.8 {d20[0]}, [Y]!
|
| - vst1.8 {d20[1]}, [Y]!
|
| - vst1.8 {d20[2]}, [Y]!
|
| - vst1.8 {d20[3]}, [Y]!
|
| - vst1.8 {d21[0]}, [U]!
|
| - vst1.8 {d21[1]}, [U]!
|
| - vst1.8 {d21[2]}, [U]!
|
| - vst1.8 {d21[3]}, [U]!
|
| - vst1.8 {d22[0]}, [V]!
|
| - vst1.8 {d22[1]}, [V]!
|
| - vst1.8 {d22[2]}, [V]!
|
| - vst1.8 {d22[3]}, [V]!
|
| + vld3.8 {d10[0], d11[0], d12[0]}, [RGB]!
|
| + vld3.8 {d10[1], d11[1], d12[1]}, [RGB]!
|
| + vld3.8 {d10[2], d11[2], d12[2]}, [RGB]!
|
| + vld3.8 {d10[3], d11[3], d12[3]}, [RGB]!
|
| .elseif \size == 2
|
| - vst1.8 {d20[4]}, [Y]!
|
| - vst1.8 {d20[5]}, [Y]!
|
| - vst1.8 {d21[4]}, [U]!
|
| - vst1.8 {d21[5]}, [U]!
|
| - vst1.8 {d22[4]}, [V]!
|
| - vst1.8 {d22[5]}, [V]!
|
| + vld3.8 {d10[4], d11[4], d12[4]}, [RGB]!
|
| + vld3.8 {d10[5], d11[5], d12[5]}, [RGB]!
|
| .elseif \size == 1
|
| - vst1.8 {d20[6]}, [Y]!
|
| - vst1.8 {d21[6]}, [U]!
|
| - vst1.8 {d22[6]}, [V]!
|
| + vld3.8 {d10[6], d11[6], d12[6]}, [RGB]!
|
| .else
|
| - .error unsupported macroblock size
|
| + .error unsupported macroblock size
|
| .endif
|
| -.endm
|
| -
|
| -.macro do_load bpp, size
|
| - .if \bpp == 24
|
| - .if \size == 8
|
| - vld3.8 {d10, d11, d12}, [RGB]!
|
| - pld [RGB, #128]
|
| - .elseif \size == 4
|
| - vld3.8 {d10[0], d11[0], d12[0]}, [RGB]!
|
| - vld3.8 {d10[1], d11[1], d12[1]}, [RGB]!
|
| - vld3.8 {d10[2], d11[2], d12[2]}, [RGB]!
|
| - vld3.8 {d10[3], d11[3], d12[3]}, [RGB]!
|
| - .elseif \size == 2
|
| - vld3.8 {d10[4], d11[4], d12[4]}, [RGB]!
|
| - vld3.8 {d10[5], d11[5], d12[5]}, [RGB]!
|
| - .elseif \size == 1
|
| - vld3.8 {d10[6], d11[6], d12[6]}, [RGB]!
|
| - .else
|
| - .error unsupported macroblock size
|
| - .endif
|
| - .elseif \bpp == 32
|
| - .if \size == 8
|
| - vld4.8 {d10, d11, d12, d13}, [RGB]!
|
| - pld [RGB, #128]
|
| - .elseif \size == 4
|
| - vld4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
|
| - vld4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
|
| - vld4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
|
| - vld4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
|
| - .elseif \size == 2
|
| - vld4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
|
| - vld4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
|
| - .elseif \size == 1
|
| - vld4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
|
| - .else
|
| - .error unsupported macroblock size
|
| - .endif
|
| + .elseif \bpp == 32
|
| + .if \size == 8
|
| + vld4.8 {d10, d11, d12, d13}, [RGB]!
|
| + pld [RGB, #128]
|
| + .elseif \size == 4
|
| + vld4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
|
| + vld4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
|
| + vld4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
|
| + vld4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
|
| + .elseif \size == 2
|
| + vld4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
|
| + vld4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
|
| + .elseif \size == 1
|
| + vld4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
|
| .else
|
| - .error unsupported bpp
|
| + .error unsupported macroblock size
|
| .endif
|
| + .else
|
| + .error unsupported bpp
|
| + .endif
|
| .endm
|
|
|
| .macro generate_jsimd_rgb_ycc_convert_neon colorid, bpp, r_offs, g_offs, b_offs
|
|
|
| /*
|
| - * 2 stage pipelined RGB->YCbCr conversion
|
| + * 2-stage pipelined RGB->YCbCr conversion
|
| */
|
|
|
| .macro do_rgb_to_yuv_stage1
|
| - vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */
|
| - vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */
|
| - vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */
|
| - vmull.u16 q7, d4, d0[0]
|
| - vmlal.u16 q7, d6, d0[1]
|
| - vmlal.u16 q7, d8, d0[2]
|
| - vmull.u16 q8, d5, d0[0]
|
| - vmlal.u16 q8, d7, d0[1]
|
| - vmlal.u16 q8, d9, d0[2]
|
| - vrev64.32 q9, q1
|
| - vrev64.32 q13, q1
|
| - vmlsl.u16 q9, d4, d0[3]
|
| - vmlsl.u16 q9, d6, d1[0]
|
| - vmlal.u16 q9, d8, d1[1]
|
| - vmlsl.u16 q13, d5, d0[3]
|
| - vmlsl.u16 q13, d7, d1[0]
|
| - vmlal.u16 q13, d9, d1[1]
|
| - vrev64.32 q14, q1
|
| - vrev64.32 q15, q1
|
| - vmlal.u16 q14, d4, d1[1]
|
| - vmlsl.u16 q14, d6, d1[2]
|
| - vmlsl.u16 q14, d8, d1[3]
|
| - vmlal.u16 q15, d5, d1[1]
|
| - vmlsl.u16 q15, d7, d1[2]
|
| - vmlsl.u16 q15, d9, d1[3]
|
| + vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */
|
| + vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */
|
| + vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */
|
| + vmull.u16 q7, d4, d0[0]
|
| + vmlal.u16 q7, d6, d0[1]
|
| + vmlal.u16 q7, d8, d0[2]
|
| + vmull.u16 q8, d5, d0[0]
|
| + vmlal.u16 q8, d7, d0[1]
|
| + vmlal.u16 q8, d9, d0[2]
|
| + vrev64.32 q9, q1
|
| + vrev64.32 q13, q1
|
| + vmlsl.u16 q9, d4, d0[3]
|
| + vmlsl.u16 q9, d6, d1[0]
|
| + vmlal.u16 q9, d8, d1[1]
|
| + vmlsl.u16 q13, d5, d0[3]
|
| + vmlsl.u16 q13, d7, d1[0]
|
| + vmlal.u16 q13, d9, d1[1]
|
| + vrev64.32 q14, q1
|
| + vrev64.32 q15, q1
|
| + vmlal.u16 q14, d4, d1[1]
|
| + vmlsl.u16 q14, d6, d1[2]
|
| + vmlsl.u16 q14, d8, d1[3]
|
| + vmlal.u16 q15, d5, d1[1]
|
| + vmlsl.u16 q15, d7, d1[2]
|
| + vmlsl.u16 q15, d9, d1[3]
|
| .endm
|
|
|
| .macro do_rgb_to_yuv_stage2
|
| - vrshrn.u32 d20, q7, #16
|
| - vrshrn.u32 d21, q8, #16
|
| - vshrn.u32 d22, q9, #16
|
| - vshrn.u32 d23, q13, #16
|
| - vshrn.u32 d24, q14, #16
|
| - vshrn.u32 d25, q15, #16
|
| - vmovn.u16 d20, q10 /* d20 = y */
|
| - vmovn.u16 d21, q11 /* d21 = u */
|
| - vmovn.u16 d22, q12 /* d22 = v */
|
| + vrshrn.u32 d20, q7, #16
|
| + vrshrn.u32 d21, q8, #16
|
| + vshrn.u32 d22, q9, #16
|
| + vshrn.u32 d23, q13, #16
|
| + vshrn.u32 d24, q14, #16
|
| + vshrn.u32 d25, q15, #16
|
| + vmovn.u16 d20, q10 /* d20 = y */
|
| + vmovn.u16 d21, q11 /* d21 = u */
|
| + vmovn.u16 d22, q12 /* d22 = v */
|
| .endm
|
|
|
| .macro do_rgb_to_yuv
|
| @@ -1742,52 +1745,52 @@ generate_jsimd_ycc_rgb_convert_neon rgb565, 16, 0, 0, 0
|
| .endm
|
|
|
| .macro do_rgb_to_yuv_stage2_store_load_stage1
|
| - vrshrn.u32 d20, q7, #16
|
| - vrshrn.u32 d21, q8, #16
|
| - vshrn.u32 d22, q9, #16
|
| - vrev64.32 q9, q1
|
| - vshrn.u32 d23, q13, #16
|
| - vrev64.32 q13, q1
|
| - vshrn.u32 d24, q14, #16
|
| - vshrn.u32 d25, q15, #16
|
| - do_load \bpp, 8
|
| - vmovn.u16 d20, q10 /* d20 = y */
|
| - vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */
|
| - vmovn.u16 d21, q11 /* d21 = u */
|
| - vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */
|
| - vmovn.u16 d22, q12 /* d22 = v */
|
| - vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */
|
| - vmull.u16 q7, d4, d0[0]
|
| - vmlal.u16 q7, d6, d0[1]
|
| - vmlal.u16 q7, d8, d0[2]
|
| - vst1.8 {d20}, [Y]!
|
| - vmull.u16 q8, d5, d0[0]
|
| - vmlal.u16 q8, d7, d0[1]
|
| - vmlal.u16 q8, d9, d0[2]
|
| - vmlsl.u16 q9, d4, d0[3]
|
| - vmlsl.u16 q9, d6, d1[0]
|
| - vmlal.u16 q9, d8, d1[1]
|
| - vst1.8 {d21}, [U]!
|
| - vmlsl.u16 q13, d5, d0[3]
|
| - vmlsl.u16 q13, d7, d1[0]
|
| - vmlal.u16 q13, d9, d1[1]
|
| - vrev64.32 q14, q1
|
| - vrev64.32 q15, q1
|
| - vmlal.u16 q14, d4, d1[1]
|
| - vmlsl.u16 q14, d6, d1[2]
|
| - vmlsl.u16 q14, d8, d1[3]
|
| - vst1.8 {d22}, [V]!
|
| - vmlal.u16 q15, d5, d1[1]
|
| - vmlsl.u16 q15, d7, d1[2]
|
| - vmlsl.u16 q15, d9, d1[3]
|
| + vrshrn.u32 d20, q7, #16
|
| + vrshrn.u32 d21, q8, #16
|
| + vshrn.u32 d22, q9, #16
|
| + vrev64.32 q9, q1
|
| + vshrn.u32 d23, q13, #16
|
| + vrev64.32 q13, q1
|
| + vshrn.u32 d24, q14, #16
|
| + vshrn.u32 d25, q15, #16
|
| + do_load \bpp, 8
|
| + vmovn.u16 d20, q10 /* d20 = y */
|
| + vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */
|
| + vmovn.u16 d21, q11 /* d21 = u */
|
| + vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */
|
| + vmovn.u16 d22, q12 /* d22 = v */
|
| + vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */
|
| + vmull.u16 q7, d4, d0[0]
|
| + vmlal.u16 q7, d6, d0[1]
|
| + vmlal.u16 q7, d8, d0[2]
|
| + vst1.8 {d20}, [Y]!
|
| + vmull.u16 q8, d5, d0[0]
|
| + vmlal.u16 q8, d7, d0[1]
|
| + vmlal.u16 q8, d9, d0[2]
|
| + vmlsl.u16 q9, d4, d0[3]
|
| + vmlsl.u16 q9, d6, d1[0]
|
| + vmlal.u16 q9, d8, d1[1]
|
| + vst1.8 {d21}, [U]!
|
| + vmlsl.u16 q13, d5, d0[3]
|
| + vmlsl.u16 q13, d7, d1[0]
|
| + vmlal.u16 q13, d9, d1[1]
|
| + vrev64.32 q14, q1
|
| + vrev64.32 q15, q1
|
| + vmlal.u16 q14, d4, d1[1]
|
| + vmlsl.u16 q14, d6, d1[2]
|
| + vmlsl.u16 q14, d8, d1[3]
|
| + vst1.8 {d22}, [V]!
|
| + vmlal.u16 q15, d5, d1[1]
|
| + vmlsl.u16 q15, d7, d1[2]
|
| + vmlsl.u16 q15, d9, d1[3]
|
| .endm
|
|
|
| .balign 16
|
| jsimd_\colorid\()_ycc_neon_consts:
|
| - .short 19595, 38470, 7471, 11059
|
| - .short 21709, 32768, 27439, 5329
|
| - .short 32767, 128, 32767, 128
|
| - .short 32767, 128, 32767, 128
|
| + .short 19595, 38470, 7471, 11059
|
| + .short 21709, 32768, 27439, 5329
|
| + .short 32767, 128, 32767, 128
|
| + .short 32767, 128, 32767, 128
|
|
|
| asm_function jsimd_\colorid\()_ycc_convert_neon
|
| OUTPUT_WIDTH .req r0
|
| @@ -1997,10 +2000,10 @@ asm_function jsimd_convsamp_neon
|
|
|
| .balign 16
|
| jsimd_fdct_ifast_neon_consts:
|
| - .short (98 * 128) /* XFIX_0_382683433 */
|
| - .short (139 * 128) /* XFIX_0_541196100 */
|
| - .short (181 * 128) /* XFIX_0_707106781 */
|
| - .short (334 * 128 - 256 * 128) /* XFIX_1_306562965 */
|
| + .short (98 * 128) /* XFIX_0_382683433 */
|
| + .short (139 * 128) /* XFIX_0_541196100 */
|
| + .short (181 * 128) /* XFIX_0_707106781 */
|
| + .short (334 * 128 - 256 * 128) /* XFIX_1_306562965 */
|
|
|
| asm_function jsimd_fdct_ifast_neon
|
|
|
| @@ -2037,52 +2040,52 @@ asm_function jsimd_fdct_ifast_neon
|
| /* Transpose */
|
| vtrn.16 q12, q13
|
| vtrn.16 q10, q11
|
| - vtrn.16 q8, q9
|
| + vtrn.16 q8, q9
|
| vtrn.16 q14, q15
|
| - vtrn.32 q9, q11
|
| + vtrn.32 q9, q11
|
| vtrn.32 q13, q15
|
| - vtrn.32 q8, q10
|
| + vtrn.32 q8, q10
|
| vtrn.32 q12, q14
|
| vswp d30, d23
|
| vswp d24, d17
|
| vswp d26, d19
|
| /* 1-D FDCT */
|
| - vadd.s16 q2, q11, q12
|
| + vadd.s16 q2, q11, q12
|
| vswp d28, d21
|
| vsub.s16 q12, q11, q12
|
| - vsub.s16 q6, q10, q13
|
| + vsub.s16 q6, q10, q13
|
| vadd.s16 q10, q10, q13
|
| - vsub.s16 q7, q9, q14
|
| - vadd.s16 q9, q9, q14
|
| - vsub.s16 q1, q8, q15
|
| - vadd.s16 q8, q8, q15
|
| - vsub.s16 q4, q9, q10
|
| - vsub.s16 q5, q8, q2
|
| - vadd.s16 q3, q9, q10
|
| - vadd.s16 q4, q4, q5
|
| - vadd.s16 q2, q8, q2
|
| - vqdmulh.s16 q4, q4, XFIX_0_707106781
|
| + vsub.s16 q7, q9, q14
|
| + vadd.s16 q9, q9, q14
|
| + vsub.s16 q1, q8, q15
|
| + vadd.s16 q8, q8, q15
|
| + vsub.s16 q4, q9, q10
|
| + vsub.s16 q5, q8, q2
|
| + vadd.s16 q3, q9, q10
|
| + vadd.s16 q4, q4, q5
|
| + vadd.s16 q2, q8, q2
|
| + vqdmulh.s16 q4, q4, XFIX_0_707106781
|
| vadd.s16 q11, q12, q6
|
| - vadd.s16 q8, q2, q3
|
| - vsub.s16 q12, q2, q3
|
| - vadd.s16 q3, q6, q7
|
| - vadd.s16 q7, q7, q1
|
| - vqdmulh.s16 q3, q3, XFIX_0_707106781
|
| - vsub.s16 q6, q11, q7
|
| - vadd.s16 q10, q5, q4
|
| - vqdmulh.s16 q6, q6, XFIX_0_382683433
|
| - vsub.s16 q14, q5, q4
|
| + vadd.s16 q8, q2, q3
|
| + vsub.s16 q12, q2, q3
|
| + vadd.s16 q3, q6, q7
|
| + vadd.s16 q7, q7, q1
|
| + vqdmulh.s16 q3, q3, XFIX_0_707106781
|
| + vsub.s16 q6, q11, q7
|
| + vadd.s16 q10, q5, q4
|
| + vqdmulh.s16 q6, q6, XFIX_0_382683433
|
| + vsub.s16 q14, q5, q4
|
| vqdmulh.s16 q11, q11, XFIX_0_541196100
|
| - vqdmulh.s16 q5, q7, XFIX_1_306562965
|
| - vadd.s16 q4, q1, q3
|
| - vsub.s16 q3, q1, q3
|
| - vadd.s16 q7, q7, q6
|
| + vqdmulh.s16 q5, q7, XFIX_1_306562965
|
| + vadd.s16 q4, q1, q3
|
| + vsub.s16 q3, q1, q3
|
| + vadd.s16 q7, q7, q6
|
| vadd.s16 q11, q11, q6
|
| - vadd.s16 q7, q7, q5
|
| - vadd.s16 q13, q3, q11
|
| - vsub.s16 q11, q3, q11
|
| - vadd.s16 q9, q4, q7
|
| - vsub.s16 q15, q4, q7
|
| + vadd.s16 q7, q7, q5
|
| + vadd.s16 q13, q3, q11
|
| + vsub.s16 q11, q3, q11
|
| + vadd.s16 q9, q4, q7
|
| + vsub.s16 q15, q4, q7
|
| subs TMP, TMP, #1
|
| bne 1b
|
|
|
| @@ -2103,8 +2106,8 @@ asm_function jsimd_fdct_ifast_neon
|
|
|
| /*
|
| * GLOBAL(void)
|
| - * jsimd_quantize_neon (JCOEFPTR coef_block, DCTELEM * divisors,
|
| - * DCTELEM * workspace);
|
| + * jsimd_quantize_neon (JCOEFPTR coef_block, DCTELEM *divisors,
|
| + * DCTELEM *workspace);
|
| *
|
| * Note: the code uses 2 stage pipelining in order to improve instructions
|
| * scheduling and eliminate stalls (this provides ~15% better
|
| @@ -2131,22 +2134,22 @@ asm_function jsimd_quantize_neon
|
| vld1.16 {d20, d21, d22, d23}, [CORRECTION, :128]!
|
| vabs.s16 q13, q1
|
| vld1.16 {d16, d17, d18, d19}, [RECIPROCAL, :128]!
|
| - vadd.u16 q12, q12, q10 /* add correction */
|
| + vadd.u16 q12, q12, q10 /* add correction */
|
| vadd.u16 q13, q13, q11
|
| - vmull.u16 q10, d24, d16 /* multiply by reciprocal */
|
| + vmull.u16 q10, d24, d16 /* multiply by reciprocal */
|
| vmull.u16 q11, d25, d17
|
| - vmull.u16 q8, d26, d18
|
| - vmull.u16 q9, d27, d19
|
| + vmull.u16 q8, d26, d18
|
| + vmull.u16 q9, d27, d19
|
| vld1.16 {d24, d25, d26, d27}, [SHIFT, :128]!
|
| vshrn.u32 d20, q10, #16
|
| vshrn.u32 d21, q11, #16
|
| - vshrn.u32 d22, q8, #16
|
| - vshrn.u32 d23, q9, #16
|
| + vshrn.u32 d22, q8, #16
|
| + vshrn.u32 d23, q9, #16
|
| vneg.s16 q12, q12
|
| vneg.s16 q13, q13
|
| - vshr.s16 q2, q0, #15 /* extract sign */
|
| - vshr.s16 q3, q1, #15
|
| - vshl.u16 q14, q10, q12 /* shift */
|
| + vshr.s16 q2, q0, #15 /* extract sign */
|
| + vshr.s16 q3, q1, #15
|
| + vshl.u16 q14, q10, q12 /* shift */
|
| vshl.u16 q15, q11, q13
|
|
|
| push {r4, r5}
|
| @@ -2159,25 +2162,25 @@ asm_function jsimd_quantize_neon
|
| vabs.s16 q13, q1
|
| veor.u16 q15, q15, q3
|
| vld1.16 {d16, d17, d18, d19}, [RECIPROCAL, :128]!
|
| - vadd.u16 q12, q12, q10 /* add correction */
|
| + vadd.u16 q12, q12, q10 /* add correction */
|
| vadd.u16 q13, q13, q11
|
| - vmull.u16 q10, d24, d16 /* multiply by reciprocal */
|
| + vmull.u16 q10, d24, d16 /* multiply by reciprocal */
|
| vmull.u16 q11, d25, d17
|
| - vmull.u16 q8, d26, d18
|
| - vmull.u16 q9, d27, d19
|
| + vmull.u16 q8, d26, d18
|
| + vmull.u16 q9, d27, d19
|
| vsub.u16 q14, q14, q2
|
| vld1.16 {d24, d25, d26, d27}, [SHIFT, :128]!
|
| vsub.u16 q15, q15, q3
|
| vshrn.u32 d20, q10, #16
|
| vshrn.u32 d21, q11, #16
|
| vst1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]!
|
| - vshrn.u32 d22, q8, #16
|
| - vshrn.u32 d23, q9, #16
|
| + vshrn.u32 d22, q8, #16
|
| + vshrn.u32 d23, q9, #16
|
| vneg.s16 q12, q12
|
| vneg.s16 q13, q13
|
| - vshr.s16 q2, q0, #15 /* extract sign */
|
| - vshr.s16 q3, q1, #15
|
| - vshl.u16 q14, q10, q12 /* shift */
|
| + vshr.s16 q2, q0, #15 /* extract sign */
|
| + vshr.s16 q3, q1, #15
|
| + vshl.u16 q14, q10, q12 /* shift */
|
| vshl.u16 q15, q11, q13
|
| subs LOOP_COUNT, LOOP_COUNT, #1
|
| bne 1b
|
| @@ -2189,7 +2192,7 @@ asm_function jsimd_quantize_neon
|
| vsub.u16 q15, q15, q3
|
| vst1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]!
|
|
|
| - bx lr /* return */
|
| + bx lr /* return */
|
|
|
| .unreq COEF_BLOCK
|
| .unreq DIVISORS
|
| @@ -2204,10 +2207,10 @@ asm_function jsimd_quantize_neon
|
|
|
| /*
|
| * GLOBAL(void)
|
| - * jsimd_h2v1_fancy_upsample_neon (int max_v_samp_factor,
|
| - * JDIMENSION downsampled_width,
|
| - * JSAMPARRAY input_data,
|
| - * JSAMPARRAY * output_data_ptr);
|
| + * jsimd_h2v1_fancy_upsample_neon (int max_v_samp_factor,
|
| + * JDIMENSION downsampled_width,
|
| + * JSAMPARRAY input_data,
|
| + * JSAMPARRAY *output_data_ptr);
|
| *
|
| * Note: the use of unaligned writes is the main remaining bottleneck in
|
| * this code, which can be potentially solved to get up to tens
|
| @@ -2221,22 +2224,22 @@ asm_function jsimd_quantize_neon
|
| * Register d28 is used for multiplication by 3. Register q15 is used
|
| * for adding +1 bias.
|
| */
|
| -.macro upsample16 OUTPTR, INPTR
|
| +.macro upsample16 OUTPTR, INPTR
|
| vld1.8 {q0}, [\INPTR]!
|
| - vmovl.u8 q8, d0
|
| - vext.8 q2, q1, q0, #15
|
| - vmovl.u8 q9, d1
|
| + vmovl.u8 q8, d0
|
| + vext.8 q2, q1, q0, #15
|
| + vmovl.u8 q9, d1
|
| vaddw.u8 q10, q15, d4
|
| vaddw.u8 q11, q15, d5
|
| - vmlal.u8 q8, d4, d28
|
| - vmlal.u8 q9, d5, d28
|
| - vmlal.u8 q10, d0, d28
|
| - vmlal.u8 q11, d1, d28
|
| - vmov q1, q0 /* backup source pixels to q1 */
|
| - vrshrn.u16 d6, q8, #2
|
| - vrshrn.u16 d7, q9, #2
|
| - vshrn.u16 d8, q10, #2
|
| - vshrn.u16 d9, q11, #2
|
| + vmlal.u8 q8, d4, d28
|
| + vmlal.u8 q9, d5, d28
|
| + vmlal.u8 q10, d0, d28
|
| + vmlal.u8 q11, d1, d28
|
| + vmov q1, q0 /* backup source pixels to q1 */
|
| + vrshrn.u16 d6, q8, #2
|
| + vrshrn.u16 d7, q9, #2
|
| + vshrn.u16 d8, q10, #2
|
| + vshrn.u16 d9, q11, #2
|
| vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
|
| .endm
|
|
|
| @@ -2247,39 +2250,39 @@ asm_function jsimd_quantize_neon
|
| * Also this unrolling allows to reorder loads and stores to compensate
|
| * multiplication latency and reduce stalls.
|
| */
|
| -.macro upsample32 OUTPTR, INPTR
|
| +.macro upsample32 OUTPTR, INPTR
|
| /* even 16 pixels group */
|
| vld1.8 {q0}, [\INPTR]!
|
| - vmovl.u8 q8, d0
|
| - vext.8 q2, q1, q0, #15
|
| - vmovl.u8 q9, d1
|
| + vmovl.u8 q8, d0
|
| + vext.8 q2, q1, q0, #15
|
| + vmovl.u8 q9, d1
|
| vaddw.u8 q10, q15, d4
|
| vaddw.u8 q11, q15, d5
|
| - vmlal.u8 q8, d4, d28
|
| - vmlal.u8 q9, d5, d28
|
| - vmlal.u8 q10, d0, d28
|
| - vmlal.u8 q11, d1, d28
|
| - /* odd 16 pixels group */
|
| - vld1.8 {q1}, [\INPTR]!
|
| - vrshrn.u16 d6, q8, #2
|
| - vrshrn.u16 d7, q9, #2
|
| - vshrn.u16 d8, q10, #2
|
| - vshrn.u16 d9, q11, #2
|
| - vmovl.u8 q8, d2
|
| - vext.8 q2, q0, q1, #15
|
| - vmovl.u8 q9, d3
|
| - vaddw.u8 q10, q15, d4
|
| - vaddw.u8 q11, q15, d5
|
| - vmlal.u8 q8, d4, d28
|
| - vmlal.u8 q9, d5, d28
|
| - vmlal.u8 q10, d2, d28
|
| - vmlal.u8 q11, d3, d28
|
| + vmlal.u8 q8, d4, d28
|
| + vmlal.u8 q9, d5, d28
|
| + vmlal.u8 q10, d0, d28
|
| + vmlal.u8 q11, d1, d28
|
| + /* odd 16 pixels group */
|
| + vld1.8 {q1}, [\INPTR]!
|
| + vrshrn.u16 d6, q8, #2
|
| + vrshrn.u16 d7, q9, #2
|
| + vshrn.u16 d8, q10, #2
|
| + vshrn.u16 d9, q11, #2
|
| + vmovl.u8 q8, d2
|
| + vext.8 q2, q0, q1, #15
|
| + vmovl.u8 q9, d3
|
| + vaddw.u8 q10, q15, d4
|
| + vaddw.u8 q11, q15, d5
|
| + vmlal.u8 q8, d4, d28
|
| + vmlal.u8 q9, d5, d28
|
| + vmlal.u8 q10, d2, d28
|
| + vmlal.u8 q11, d3, d28
|
| vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
|
| - vrshrn.u16 d6, q8, #2
|
| - vrshrn.u16 d7, q9, #2
|
| - vshrn.u16 d8, q10, #2
|
| - vshrn.u16 d9, q11, #2
|
| - vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
|
| + vrshrn.u16 d6, q8, #2
|
| + vrshrn.u16 d7, q9, #2
|
| + vshrn.u16 d8, q10, #2
|
| + vshrn.u16 d9, q11, #2
|
| + vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
|
| .endm
|
|
|
| /*
|
| @@ -2340,21 +2343,21 @@ asm_function jsimd_quantize_neon
|
| 2:
|
| tst \WIDTH, #8
|
| beq 2f
|
| - vmov d1, d0
|
| + vmov d1, d0
|
| sub \INPTR, \INPTR, #8
|
| vld1.8 {d0}, [\INPTR]
|
| 2: /* upsample the remaining pixels */
|
| - vmovl.u8 q8, d0
|
| - vext.8 q2, q1, q0, #15
|
| - vmovl.u8 q9, d1
|
| + vmovl.u8 q8, d0
|
| + vext.8 q2, q1, q0, #15
|
| + vmovl.u8 q9, d1
|
| vaddw.u8 q10, q15, d4
|
| vaddw.u8 q11, q15, d5
|
| - vmlal.u8 q8, d4, d28
|
| - vmlal.u8 q9, d5, d28
|
| - vmlal.u8 q10, d0, d28
|
| - vmlal.u8 q11, d1, d28
|
| - vrshrn.u16 d10, q8, #2
|
| - vrshrn.u16 d12, q9, #2
|
| + vmlal.u8 q8, d4, d28
|
| + vmlal.u8 q9, d5, d28
|
| + vmlal.u8 q10, d0, d28
|
| + vmlal.u8 q11, d1, d28
|
| + vrshrn.u16 d10, q8, #2
|
| + vrshrn.u16 d12, q9, #2
|
| vshrn.u16 d11, q10, #2
|
| vshrn.u16 d13, q11, #2
|
| vzip.8 d10, d11
|
| @@ -2363,12 +2366,12 @@ asm_function jsimd_quantize_neon
|
| tst \WIDTH, #8
|
| beq 2f
|
| vst1.8 {d10, d11}, [\OUTPTR]!
|
| - vmov q5, q6
|
| + vmov q5, q6
|
| 2:
|
| tst \WIDTH, #4
|
| beq 2f
|
| vst1.8 {d10}, [\OUTPTR]!
|
| - vmov d10, d11
|
| + vmov d10, d11
|
| 2:
|
| tst \WIDTH, #2
|
| beq 2f
|
| @@ -2432,7 +2435,443 @@ asm_function jsimd_h2v1_fancy_upsample_neon
|
| .unreq WIDTH
|
| .unreq TMP
|
|
|
| -
|
| .purgem upsample16
|
| .purgem upsample32
|
| .purgem upsample_row
|
| +
|
| +
|
| +/*****************************************************************************/
|
| +
|
| +/*
|
| + * GLOBAL(JOCTET*)
|
| + * jsimd_huff_encode_one_block (working_state *state, JOCTET *buffer,
|
| + * JCOEFPTR block, int last_dc_val,
|
| + * c_derived_tbl *dctbl, c_derived_tbl *actbl)
|
| + *
|
| + */
|
| +
|
| +.macro emit_byte BUFFER, PUT_BUFFER, PUT_BITS, ZERO, TMP
|
| + sub \PUT_BITS, \PUT_BITS, #0x8
|
| + lsr \TMP, \PUT_BUFFER, \PUT_BITS
|
| + uxtb \TMP, \TMP
|
| + strb \TMP, [\BUFFER, #1]!
|
| + cmp \TMP, #0xff
|
| + /*it eq*/
|
| + streqb \ZERO, [\BUFFER, #1]!
|
| +.endm
|
| +
|
| +.macro put_bits PUT_BUFFER, PUT_BITS, CODE, SIZE
|
| + /*lsl \PUT_BUFFER, \PUT_BUFFER, \SIZE*/
|
| + add \PUT_BITS, \SIZE
|
| + /*orr \PUT_BUFFER, \PUT_BUFFER, \CODE*/
|
| + orr \PUT_BUFFER, \CODE, \PUT_BUFFER, lsl \SIZE
|
| +.endm
|
| +
|
| +.macro checkbuf15 BUFFER, PUT_BUFFER, PUT_BITS, ZERO, TMP
|
| + cmp \PUT_BITS, #0x10
|
| + blt 15f
|
| + eor \ZERO, \ZERO, \ZERO
|
| + emit_byte \BUFFER, \PUT_BUFFER, \PUT_BITS, \ZERO, \TMP
|
| + emit_byte \BUFFER, \PUT_BUFFER, \PUT_BITS, \ZERO, \TMP
|
| +15:
|
| +.endm
|
| +
|
| +.balign 16
|
| +jsimd_huff_encode_one_block_neon_consts:
|
| + .byte 0x01
|
| + .byte 0x02
|
| + .byte 0x04
|
| + .byte 0x08
|
| + .byte 0x10
|
| + .byte 0x20
|
| + .byte 0x40
|
| + .byte 0x80
|
| +
|
| +asm_function jsimd_huff_encode_one_block_neon
|
| + push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
| + add r7, sp, #0x1c
|
| + sub r4, sp, #0x40
|
| + bfc r4, #0, #5
|
| + mov sp, r4 /* align sp on 32 bytes */
|
| + vst1.64 {d8, d9, d10, d11}, [r4, :128]!
|
| + vst1.64 {d12, d13, d14, d15}, [r4, :128]
|
| + sub sp, #0x140 /* reserve 320 bytes */
|
| + str r0, [sp, #0x18] /* working state > sp + Ox18 */
|
| + add r4, sp, #0x20 /* r4 = t1 */
|
| + ldr lr, [r7, #0x8] /* lr = dctbl */
|
| + sub r10, r1, #0x1 /* r10=buffer-- */
|
| + ldrsh r1, [r2]
|
| + mov r9, #0x10
|
| + mov r8, #0x1
|
| + adr r5, jsimd_huff_encode_one_block_neon_consts
|
| + /* prepare data */
|
| + vld1.8 {d26}, [r5, :64]
|
| + veor q8, q8, q8
|
| + veor q9, q9, q9
|
| + vdup.16 q14, r9
|
| + vdup.16 q15, r8
|
| + veor q10, q10, q10
|
| + veor q11, q11, q11
|
| + sub r1, r1, r3
|
| + add r9, r2, #0x22
|
| + add r8, r2, #0x18
|
| + add r3, r2, #0x36
|
| + vmov.16 d0[0], r1
|
| + vld1.16 {d2[0]}, [r9, :16]
|
| + vld1.16 {d4[0]}, [r8, :16]
|
| + vld1.16 {d6[0]}, [r3, :16]
|
| + add r1, r2, #0x2
|
| + add r9, r2, #0x30
|
| + add r8, r2, #0x26
|
| + add r3, r2, #0x28
|
| + vld1.16 {d0[1]}, [r1, :16]
|
| + vld1.16 {d2[1]}, [r9, :16]
|
| + vld1.16 {d4[1]}, [r8, :16]
|
| + vld1.16 {d6[1]}, [r3, :16]
|
| + add r1, r2, #0x10
|
| + add r9, r2, #0x40
|
| + add r8, r2, #0x34
|
| + add r3, r2, #0x1a
|
| + vld1.16 {d0[2]}, [r1, :16]
|
| + vld1.16 {d2[2]}, [r9, :16]
|
| + vld1.16 {d4[2]}, [r8, :16]
|
| + vld1.16 {d6[2]}, [r3, :16]
|
| + add r1, r2, #0x20
|
| + add r9, r2, #0x32
|
| + add r8, r2, #0x42
|
| + add r3, r2, #0xc
|
| + vld1.16 {d0[3]}, [r1, :16]
|
| + vld1.16 {d2[3]}, [r9, :16]
|
| + vld1.16 {d4[3]}, [r8, :16]
|
| + vld1.16 {d6[3]}, [r3, :16]
|
| + add r1, r2, #0x12
|
| + add r9, r2, #0x24
|
| + add r8, r2, #0x50
|
| + add r3, r2, #0xe
|
| + vld1.16 {d1[0]}, [r1, :16]
|
| + vld1.16 {d3[0]}, [r9, :16]
|
| + vld1.16 {d5[0]}, [r8, :16]
|
| + vld1.16 {d7[0]}, [r3, :16]
|
| + add r1, r2, #0x4
|
| + add r9, r2, #0x16
|
| + add r8, r2, #0x60
|
| + add r3, r2, #0x1c
|
| + vld1.16 {d1[1]}, [r1, :16]
|
| + vld1.16 {d3[1]}, [r9, :16]
|
| + vld1.16 {d5[1]}, [r8, :16]
|
| + vld1.16 {d7[1]}, [r3, :16]
|
| + add r1, r2, #0x6
|
| + add r9, r2, #0x8
|
| + add r8, r2, #0x52
|
| + add r3, r2, #0x2a
|
| + vld1.16 {d1[2]}, [r1, :16]
|
| + vld1.16 {d3[2]}, [r9, :16]
|
| + vld1.16 {d5[2]}, [r8, :16]
|
| + vld1.16 {d7[2]}, [r3, :16]
|
| + add r1, r2, #0x14
|
| + add r9, r2, #0xa
|
| + add r8, r2, #0x44
|
| + add r3, r2, #0x38
|
| + vld1.16 {d1[3]}, [r1, :16]
|
| + vld1.16 {d3[3]}, [r9, :16]
|
| + vld1.16 {d5[3]}, [r8, :16]
|
| + vld1.16 {d7[3]}, [r3, :16]
|
| + vcgt.s16 q8, q8, q0
|
| + vcgt.s16 q9, q9, q1
|
| + vcgt.s16 q10, q10, q2
|
| + vcgt.s16 q11, q11, q3
|
| + vabs.s16 q0, q0
|
| + vabs.s16 q1, q1
|
| + vabs.s16 q2, q2
|
| + vabs.s16 q3, q3
|
| + veor q8, q8, q0
|
| + veor q9, q9, q1
|
| + veor q10, q10, q2
|
| + veor q11, q11, q3
|
| + add r9, r4, #0x20
|
| + add r8, r4, #0x80
|
| + add r3, r4, #0xa0
|
| + vclz.i16 q0, q0
|
| + vclz.i16 q1, q1
|
| + vclz.i16 q2, q2
|
| + vclz.i16 q3, q3
|
| + vsub.i16 q0, q14, q0
|
| + vsub.i16 q1, q14, q1
|
| + vsub.i16 q2, q14, q2
|
| + vsub.i16 q3, q14, q3
|
| + vst1.16 {d0, d1, d2, d3}, [r4, :256]
|
| + vst1.16 {d4, d5, d6, d7}, [r9, :256]
|
| + vshl.s16 q0, q15, q0
|
| + vshl.s16 q1, q15, q1
|
| + vshl.s16 q2, q15, q2
|
| + vshl.s16 q3, q15, q3
|
| + vsub.i16 q0, q0, q15
|
| + vsub.i16 q1, q1, q15
|
| + vsub.i16 q2, q2, q15
|
| + vsub.i16 q3, q3, q15
|
| + vand q8, q8, q0
|
| + vand q9, q9, q1
|
| + vand q10, q10, q2
|
| + vand q11, q11, q3
|
| + vst1.16 {d16, d17, d18, d19}, [r8, :256]
|
| + vst1.16 {d20, d21, d22, d23}, [r3, :256]
|
| + add r1, r2, #0x46
|
| + add r9, r2, #0x3a
|
| + add r8, r2, #0x74
|
| + add r3, r2, #0x6a
|
| + vld1.16 {d8[0]}, [r1, :16]
|
| + vld1.16 {d10[0]}, [r9, :16]
|
| + vld1.16 {d12[0]}, [r8, :16]
|
| + vld1.16 {d14[0]}, [r3, :16]
|
| + veor q8, q8, q8
|
| + veor q9, q9, q9
|
| + veor q10, q10, q10
|
| + veor q11, q11, q11
|
| + add r1, r2, #0x54
|
| + add r9, r2, #0x2c
|
| + add r8, r2, #0x76
|
| + add r3, r2, #0x78
|
| + vld1.16 {d8[1]}, [r1, :16]
|
| + vld1.16 {d10[1]}, [r9, :16]
|
| + vld1.16 {d12[1]}, [r8, :16]
|
| + vld1.16 {d14[1]}, [r3, :16]
|
| + add r1, r2, #0x62
|
| + add r9, r2, #0x1e
|
| + add r8, r2, #0x68
|
| + add r3, r2, #0x7a
|
| + vld1.16 {d8[2]}, [r1, :16]
|
| + vld1.16 {d10[2]}, [r9, :16]
|
| + vld1.16 {d12[2]}, [r8, :16]
|
| + vld1.16 {d14[2]}, [r3, :16]
|
| + add r1, r2, #0x70
|
| + add r9, r2, #0x2e
|
| + add r8, r2, #0x5a
|
| + add r3, r2, #0x6c
|
| + vld1.16 {d8[3]}, [r1, :16]
|
| + vld1.16 {d10[3]}, [r9, :16]
|
| + vld1.16 {d12[3]}, [r8, :16]
|
| + vld1.16 {d14[3]}, [r3, :16]
|
| + add r1, r2, #0x72
|
| + add r9, r2, #0x3c
|
| + add r8, r2, #0x4c
|
| + add r3, r2, #0x5e
|
| + vld1.16 {d9[0]}, [r1, :16]
|
| + vld1.16 {d11[0]}, [r9, :16]
|
| + vld1.16 {d13[0]}, [r8, :16]
|
| + vld1.16 {d15[0]}, [r3, :16]
|
| + add r1, r2, #0x64
|
| + add r9, r2, #0x4a
|
| + add r8, r2, #0x3e
|
| + add r3, r2, #0x6e
|
| + vld1.16 {d9[1]}, [r1, :16]
|
| + vld1.16 {d11[1]}, [r9, :16]
|
| + vld1.16 {d13[1]}, [r8, :16]
|
| + vld1.16 {d15[1]}, [r3, :16]
|
| + add r1, r2, #0x56
|
| + add r9, r2, #0x58
|
| + add r8, r2, #0x4e
|
| + add r3, r2, #0x7c
|
| + vld1.16 {d9[2]}, [r1, :16]
|
| + vld1.16 {d11[2]}, [r9, :16]
|
| + vld1.16 {d13[2]}, [r8, :16]
|
| + vld1.16 {d15[2]}, [r3, :16]
|
| + add r1, r2, #0x48
|
| + add r9, r2, #0x66
|
| + add r8, r2, #0x5c
|
| + add r3, r2, #0x7e
|
| + vld1.16 {d9[3]}, [r1, :16]
|
| + vld1.16 {d11[3]}, [r9, :16]
|
| + vld1.16 {d13[3]}, [r8, :16]
|
| + vld1.16 {d15[3]}, [r3, :16]
|
| + vcgt.s16 q8, q8, q4
|
| + vcgt.s16 q9, q9, q5
|
| + vcgt.s16 q10, q10, q6
|
| + vcgt.s16 q11, q11, q7
|
| + vabs.s16 q4, q4
|
| + vabs.s16 q5, q5
|
| + vabs.s16 q6, q6
|
| + vabs.s16 q7, q7
|
| + veor q8, q8, q4
|
| + veor q9, q9, q5
|
| + veor q10, q10, q6
|
| + veor q11, q11, q7
|
| + add r1, r4, #0x40
|
| + add r9, r4, #0x60
|
| + add r8, r4, #0xc0
|
| + add r3, r4, #0xe0
|
| + vclz.i16 q4, q4
|
| + vclz.i16 q5, q5
|
| + vclz.i16 q6, q6
|
| + vclz.i16 q7, q7
|
| + vsub.i16 q4, q14, q4
|
| + vsub.i16 q5, q14, q5
|
| + vsub.i16 q6, q14, q6
|
| + vsub.i16 q7, q14, q7
|
| + vst1.16 {d8, d9, d10, d11}, [r1, :256]
|
| + vst1.16 {d12, d13, d14, d15}, [r9, :256]
|
| + vshl.s16 q4, q15, q4
|
| + vshl.s16 q5, q15, q5
|
| + vshl.s16 q6, q15, q6
|
| + vshl.s16 q7, q15, q7
|
| + vsub.i16 q4, q4, q15
|
| + vsub.i16 q5, q5, q15
|
| + vsub.i16 q6, q6, q15
|
| + vsub.i16 q7, q7, q15
|
| + vand q8, q8, q4
|
| + vand q9, q9, q5
|
| + vand q10, q10, q6
|
| + vand q11, q11, q7
|
| + vst1.16 {d16, d17, d18, d19}, [r8, :256]
|
| + vst1.16 {d20, d21, d22, d23}, [r3, :256]
|
| + ldr r12, [r7, #0xc] /* r12 = actbl */
|
| + add r1, lr, #0x400 /* r1 = dctbl->ehufsi */
|
| + mov r9, r12 /* r9 = actbl */
|
| + add r6, r4, #0x80 /* r6 = t2 */
|
| + ldr r11, [r0, #0x8] /* r11 = put_buffer */
|
| + ldr r4, [r0, #0xc] /* r4 = put_bits */
|
| + ldrh r2, [r6, #-128] /* r2 = nbits */
|
| + ldrh r3, [r6] /* r3 = temp2 & (((JLONG) 1)<<nbits) - 1; */
|
| + ldr r0, [lr, r2, lsl #2]
|
| + ldrb r5, [r1, r2]
|
| + put_bits r11, r4, r0, r5
|
| + checkbuf15 r10, r11, r4, r5, r0
|
| + put_bits r11, r4, r3, r2
|
| + checkbuf15 r10, r11, r4, r5, r0
|
| + mov lr, r6 /* lr = t2 */
|
| + add r5, r9, #0x400 /* r5 = actbl->ehufsi */
|
| + ldrsb r6, [r5, #0xf0] /* r6 = actbl->ehufsi[0xf0] */
|
| + veor q8, q8, q8
|
| + vceq.i16 q0, q0, q8
|
| + vceq.i16 q1, q1, q8
|
| + vceq.i16 q2, q2, q8
|
| + vceq.i16 q3, q3, q8
|
| + vceq.i16 q4, q4, q8
|
| + vceq.i16 q5, q5, q8
|
| + vceq.i16 q6, q6, q8
|
| + vceq.i16 q7, q7, q8
|
| + vmovn.i16 d0, q0
|
| + vmovn.i16 d2, q1
|
| + vmovn.i16 d4, q2
|
| + vmovn.i16 d6, q3
|
| + vmovn.i16 d8, q4
|
| + vmovn.i16 d10, q5
|
| + vmovn.i16 d12, q6
|
| + vmovn.i16 d14, q7
|
| + vand d0, d0, d26
|
| + vand d2, d2, d26
|
| + vand d4, d4, d26
|
| + vand d6, d6, d26
|
| + vand d8, d8, d26
|
| + vand d10, d10, d26
|
| + vand d12, d12, d26
|
| + vand d14, d14, d26
|
| + vpadd.i8 d0, d0, d2
|
| + vpadd.i8 d4, d4, d6
|
| + vpadd.i8 d8, d8, d10
|
| + vpadd.i8 d12, d12, d14
|
| + vpadd.i8 d0, d0, d4
|
| + vpadd.i8 d8, d8, d12
|
| + vpadd.i8 d0, d0, d8
|
| + vmov.32 r1, d0[1]
|
| + vmov.32 r8, d0[0]
|
| + mvn r1, r1
|
| + mvn r8, r8
|
| + lsrs r1, r1, #0x1
|
| + rrx r8, r8 /* shift in last r1 bit while shifting out DC bit */
|
| + rbit r1, r1 /* r1 = index1 */
|
| + rbit r8, r8 /* r8 = index0 */
|
| + ldr r0, [r9, #0x3c0] /* r0 = actbl->ehufco[0xf0] */
|
| + str r1, [sp, #0x14] /* index1 > sp + 0x14 */
|
| + cmp r8, #0x0
|
| + beq 6f
|
| +1:
|
| + clz r2, r8
|
| + add lr, lr, r2, lsl #1
|
| + lsl r8, r8, r2
|
| + ldrh r1, [lr, #-126]
|
| +2:
|
| + cmp r2, #0x10
|
| + blt 3f
|
| + sub r2, r2, #0x10
|
| + put_bits r11, r4, r0, r6
|
| + cmp r4, #0x10
|
| + blt 2b
|
| + eor r3, r3, r3
|
| + emit_byte r10, r11, r4, r3, r12
|
| + emit_byte r10, r11, r4, r3, r12
|
| + b 2b
|
| +3:
|
| + add r2, r1, r2, lsl #4
|
| + ldrh r3, [lr, #2]!
|
| + ldr r12, [r9, r2, lsl #2]
|
| + ldrb r2, [r5, r2]
|
| + put_bits r11, r4, r12, r2
|
| + checkbuf15 r10, r11, r4, r2, r12
|
| + put_bits r11, r4, r3, r1
|
| + checkbuf15 r10, r11, r4, r2, r12
|
| + lsls r8, r8, #0x1
|
| + bne 1b
|
| +6:
|
| + add r12, sp, #0x20 /* r12 = t1 */
|
| + ldr r8, [sp, #0x14] /* r8 = index1 */
|
| + adds r12, #0xc0 /* r12 = t2 + (DCTSIZE2/2) */
|
| + cmp r8, #0x0
|
| + beq 6f
|
| + clz r2, r8
|
| + sub r12, r12, lr
|
| + lsl r8, r8, r2
|
| + add r2, r2, r12, lsr #1
|
| + add lr, lr, r2, lsl #1
|
| + b 7f
|
| +1:
|
| + clz r2, r8
|
| + add lr, lr, r2, lsl #1
|
| + lsl r8, r8, r2
|
| +7:
|
| + ldrh r1, [lr, #-126]
|
| +2:
|
| + cmp r2, #0x10
|
| + blt 3f
|
| + sub r2, r2, #0x10
|
| + put_bits r11, r4, r0, r6
|
| + cmp r4, #0x10
|
| + blt 2b
|
| + eor r3, r3, r3
|
| + emit_byte r10, r11, r4, r3, r12
|
| + emit_byte r10, r11, r4, r3, r12
|
| + b 2b
|
| +3:
|
| + add r2, r1, r2, lsl #4
|
| + ldrh r3, [lr, #2]!
|
| + ldr r12, [r9, r2, lsl #2]
|
| + ldrb r2, [r5, r2]
|
| + put_bits r11, r4, r12, r2
|
| + checkbuf15 r10, r11, r4, r2, r12
|
| + put_bits r11, r4, r3, r1
|
| + checkbuf15 r10, r11, r4, r2, r12
|
| + lsls r8, r8, #0x1
|
| + bne 1b
|
| +6:
|
| + add r0, sp, #0x20
|
| + add r0, #0xfe
|
| + cmp lr, r0
|
| + bhs 1f
|
| + ldr r1, [r9]
|
| + ldrb r0, [r5]
|
| + put_bits r11, r4, r1, r0
|
| + checkbuf15 r10, r11, r4, r0, r1
|
| +1:
|
| + ldr r12, [sp, #0x18]
|
| + str r11, [r12, #0x8]
|
| + str r4, [r12, #0xc]
|
| + add r0, r10, #0x1
|
| + add r4, sp, #0x140
|
| + vld1.64 {d8, d9, d10, d11}, [r4, :128]!
|
| + vld1.64 {d12, d13, d14, d15}, [r4, :128]
|
| + sub r4, r7, #0x1c
|
| + mov sp, r4
|
| + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
|
| +
|
| +.purgem emit_byte
|
| +.purgem put_bits
|
| +.purgem checkbuf15
|
|
|