123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795 |
- /*****************************************************************************
- * deblock.S: arm deblocking
- *****************************************************************************
- * Copyright (C) 2009-2018 x264 project
- *
- * Authors: Mans Rullgard <mans@mansr.com>
- * Martin Storsjo <martin@martin.st>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
- *
- * This program is also available under a commercial proprietary license.
- * For more information, contact us at licensing@x264.com.
- *****************************************************************************/
- #include "asm.S"
- .macro h264_loop_filter_start
- ldr ip, [sp]
- ldr ip, [ip]
- vdup.32 d24, ip
- and ip, ip, ip, lsl #16
- ands ip, ip, ip, lsl #8
- bxlt lr
- .endm
- .macro align_push_regs
- and ip, sp, #15
- add ip, ip, #32
- sub sp, sp, ip
- vst1.64 {d12-d15}, [sp,:128]
- sub sp, sp, #32
- vst1.64 {d8-d11}, [sp,:128]
- .endm
- .macro align_pop_regs
- vld1.64 {d8-d11}, [sp,:128]!
- vld1.64 {d12-d15}, [sp,:128], ip
- .endm
- .macro h264_loop_filter_luma
- vdup.8 q11, r2 @ alpha
- vmovl.u8 q12, d24
- vabd.u8 q6, q8, q0 @ abs(p0 - q0)
- vmovl.u16 q12, d24
- vabd.u8 q14, q9, q8 @ abs(p1 - p0)
- vsli.16 q12, q12, #8
- vabd.u8 q15, q1, q0 @ abs(q1 - q0)
- vsli.32 q12, q12, #16
- vclt.u8 q6, q6, q11 @ < alpha
- vdup.8 q11, r3 @ beta
- vclt.s8 q7, q12, #0
- vclt.u8 q14, q14, q11 @ < beta
- vclt.u8 q15, q15, q11 @ < beta
- vbic q6, q6, q7
- vabd.u8 q4, q10, q8 @ abs(p2 - p0)
- vand q6, q6, q14
- vabd.u8 q5, q2, q0 @ abs(q2 - q0)
- vclt.u8 q4, q4, q11 @ < beta
- vand q6, q6, q15
- vclt.u8 q5, q5, q11 @ < beta
- vand q4, q4, q6
- vand q5, q5, q6
- vand q12, q12, q6
- vrhadd.u8 q14, q8, q0
- vsub.i8 q6, q12, q4
- vqadd.u8 q7, q9, q12
- vhadd.u8 q10, q10, q14
- vsub.i8 q6, q6, q5
- vhadd.u8 q14, q2, q14
- vmin.u8 q7, q7, q10
- vqsub.u8 q11, q9, q12
- vqadd.u8 q2, q1, q12
- vmax.u8 q7, q7, q11
- vqsub.u8 q11, q1, q12
- vmin.u8 q14, q2, q14
- vmovl.u8 q2, d0
- vmax.u8 q14, q14, q11
- vmovl.u8 q10, d1
- vsubw.u8 q2, q2, d16
- vsubw.u8 q10, q10, d17
- vshl.i16 q2, q2, #2
- vshl.i16 q10, q10, #2
- vaddw.u8 q2, q2, d18
- vaddw.u8 q10, q10, d19
- vsubw.u8 q2, q2, d2
- vsubw.u8 q10, q10, d3
- vrshrn.i16 d4, q2, #3
- vrshrn.i16 d5, q10, #3
- vbsl q4, q7, q9
- vbsl q5, q14, q1
- vneg.s8 q7, q6
- vmovl.u8 q14, d16
- vmin.s8 q2, q2, q6
- vmovl.u8 q6, d17
- vmax.s8 q2, q2, q7
- vmovl.u8 q11, d0
- vmovl.u8 q12, d1
- vaddw.s8 q14, q14, d4
- vaddw.s8 q6, q6, d5
- vsubw.s8 q11, q11, d4
- vsubw.s8 q12, q12, d5
- vqmovun.s16 d16, q14
- vqmovun.s16 d17, q6
- vqmovun.s16 d0, q11
- vqmovun.s16 d1, q12
- .endm
- function deblock_v_luma_neon
- h264_loop_filter_start
- vld1.64 {d0, d1}, [r0,:128], r1
- vld1.64 {d2, d3}, [r0,:128], r1
- vld1.64 {d4, d5}, [r0,:128], r1
- sub r0, r0, r1, lsl #2
- sub r0, r0, r1, lsl #1
- vld1.64 {d20,d21}, [r0,:128], r1
- vld1.64 {d18,d19}, [r0,:128], r1
- vld1.64 {d16,d17}, [r0,:128], r1
- align_push_regs
- h264_loop_filter_luma
- sub r0, r0, r1, lsl #1
- vst1.64 {d8, d9}, [r0,:128], r1
- vst1.64 {d16,d17}, [r0,:128], r1
- vst1.64 {d0, d1}, [r0,:128], r1
- vst1.64 {d10,d11}, [r0,:128]
- align_pop_regs
- bx lr
- endfunc
- function deblock_h_luma_neon
- h264_loop_filter_start
- sub r0, r0, #4
- vld1.64 {d6}, [r0], r1
- vld1.64 {d20}, [r0], r1
- vld1.64 {d18}, [r0], r1
- vld1.64 {d16}, [r0], r1
- vld1.64 {d0}, [r0], r1
- vld1.64 {d2}, [r0], r1
- vld1.64 {d4}, [r0], r1
- vld1.64 {d26}, [r0], r1
- vld1.64 {d7}, [r0], r1
- vld1.64 {d21}, [r0], r1
- vld1.64 {d19}, [r0], r1
- vld1.64 {d17}, [r0], r1
- vld1.64 {d1}, [r0], r1
- vld1.64 {d3}, [r0], r1
- vld1.64 {d5}, [r0], r1
- vld1.64 {d27}, [r0], r1
- TRANSPOSE8x8 q3, q10, q9, q8, q0, q1, q2, q13
- align_push_regs
- h264_loop_filter_luma
- TRANSPOSE4x4 q4, q8, q0, q5
- sub r0, r0, r1, lsl #4
- add r0, r0, #2
- vst1.32 {d8[0]}, [r0], r1
- vst1.32 {d16[0]}, [r0], r1
- vst1.32 {d0[0]}, [r0], r1
- vst1.32 {d10[0]}, [r0], r1
- vst1.32 {d8[1]}, [r0], r1
- vst1.32 {d16[1]}, [r0], r1
- vst1.32 {d0[1]}, [r0], r1
- vst1.32 {d10[1]}, [r0], r1
- vst1.32 {d9[0]}, [r0], r1
- vst1.32 {d17[0]}, [r0], r1
- vst1.32 {d1[0]}, [r0], r1
- vst1.32 {d11[0]}, [r0], r1
- vst1.32 {d9[1]}, [r0], r1
- vst1.32 {d17[1]}, [r0], r1
- vst1.32 {d1[1]}, [r0], r1
- vst1.32 {d11[1]}, [r0], r1
- align_pop_regs
- bx lr
- endfunc
- .macro h264_loop_filter_luma_intra
- vdup.8 q14, r2 @ alpha
- vabd.u8 q4, q8, q0 @ abs(p0 - q0)
- vabd.u8 q5, q9, q8 @ abs(p1 - p0)
- vabd.u8 q6, q1, q0 @ abs(q1 - q0)
- vdup.8 q15, r3 @ beta
- vmov.u8 q13, #2
- vclt.u8 q7, q4, q14 @ < alpha
- vshr.u8 q14, q14, #2 @ alpha >> 2
- vclt.u8 q5, q5, q15 @ < beta
- vadd.u8 q14, q14, q13 @ (alpha >> 2) + 2
- vand q7, q7, q5
- vclt.u8 q6, q6, q15 @ < beta
- vclt.u8 q13, q4, q14 @ < (alpha >> 2) + 2 if_2
- vand q12, q7, q6 @ if_1
- vshrn.u16 d28, q12, #4
- vmov r2, lr, d28
- orrs r2, r2, lr
- beq 9f
- sub sp, sp, #32
- vst1.8 {q12-q13}, [sp,:128]
- vshll.u8 q4, d18, #1 @ 2*p1
- vshll.u8 q5, d19, #1
- vaddw.u8 q4, q4, d16 @ 2*p1 + p0
- vaddw.u8 q5, q5, d17
- vaddw.u8 q4, q4, d2 @ 2*p1 + p0 + q1
- vaddw.u8 q5, q5, d3
- vrshrn.u16 d24, q4, #2
- vrshrn.u16 d25, q5, #2
- vaddl.u8 q6, d20, d16 @ p2 + p0
- vaddl.u8 q7, d21, d17
- vaddw.u8 q6, q6, d0 @ p2 + p0 + q0
- vaddw.u8 q7, q7, d1
- vadd.u16 q4, q4, q6 @ p2 + 2*p1 + 2*p0 + q0 + q1
- vadd.u16 q5, q5, q7
- vaddw.u8 q4, q4, d0 @ p2 + 2*p1 + 2*p0 + 2*q0 + q1
- vaddw.u8 q5, q5, d1
- vrshrn.u16 d26, q4, #3 @ p0'_2
- vrshrn.u16 d27, q5, #3
- vaddw.u8 q6, q6, d18 @ p2 + p1 + p0 + q0
- vaddw.u8 q7, q7, d19
- vrshrn.u16 d28, q6, #2 @ p1'_2
- vrshrn.u16 d29, q7, #2
- vaddl.u8 q4, d22, d20 @ p3 + p2
- vaddl.u8 q5, d23, d21
- vshl.u16 q4, q4, #1 @ 2*p3 + 2*p2
- vshl.u16 q5, q5, #1
- vadd.u16 q4, q4, q6 @ 2*p3 + 3*p2 + p1 + p0 + q0
- vadd.u16 q5, q5, q7
- vrshrn.u16 d30, q4, #3 @ p2'_2
- vrshrn.u16 d31, q5, #3
- vdup.8 q4, r3 @ beta
- vabd.u8 q5, q10, q8 @ abs(p2 - p0)
- vld1.8 {q6-q7}, [sp,:128] @ if_1, if_2
- vclt.u8 q5, q5, q4 @ < beta if_3
- vand q7, q7, q5 @ if_2 && if_3
- vmvn q4, q7
- vand q7, q7, q6 @ if_1 && if_2 && if_3
- vand q6, q4, q6 @ if_1 && !(if_2 && if_3)
- @ copy p0 to q15 so it can be clobbered
- vbit q10, q15, q7
- vmov q15, q8
- vbit q8, q12, q6
- @ wait for q9 to clobber
- vshll.u8 q4, d2, #1 @ 2*q1
- vshll.u8 q5, d3, #1
- vbit q8, q12, q6
- vaddw.u8 q4, q4, d0 @ 2*q1 + q0
- vaddw.u8 q5, q5, d1
- vbit q8, q13, q7
- vaddw.u8 q4, q4, d18 @ 2*q1 + q0 + p1
- vaddw.u8 q5, q5, d19
- vbit q9, q14, q7
- vrshrn.u16 d24, q4, #2
- vrshrn.u16 d25, q5, #2
- vaddl.u8 q6, d4, d0 @ q2 + q0
- vaddl.u8 q7, d5, d1
- vaddw.u8 q6, q6, d30 @ q2 + q0 + p0
- vaddw.u8 q7, q7, d31
- vadd.u16 q4, q4, q6 @ q2 + 2*q1 + 2*q0 + p0 + p1
- vadd.u16 q5, q5, q7
- vaddw.u8 q4, q4, d30 @ q2 + 2*q1 + 2*q0 + 2*p0 + p1
- vaddw.u8 q5, q5, d31
- vrshrn.u16 d26, q4, #3 @ q0'_2
- vrshrn.u16 d27, q5, #3
- vaddw.u8 q6, q6, d2 @ q2 + q1 + q0 + p0
- vaddw.u8 q7, q7, d3
- vrshrn.u16 d28, q6, #2 @ q1'_2
- vrshrn.u16 d29, q7, #2
- vaddl.u8 q4, d6, d4 @ q3 + q2
- vaddl.u8 q5, d7, d5
- vshl.u16 q4, q4, #1 @ 2*q3 + 2*q2
- vshl.u16 q5, q5, #1
- vadd.u16 q4, q4, q6 @ 2*q3 + 3*q2 + q1 + q0 + p0
- vadd.u16 q5, q5, q7
- vrshrn.u16 d30, q4, #3 @ q2'_2
- vrshrn.u16 d31, q5, #3
- vdup.8 q4, r3 @ beta
- vabd.u8 q5, q2, q0 @ abs(q2 - q0)
- vld1.8 {q6-q7}, [sp,:128]! @ if_1, if_2
- vclt.u8 q5, q5, q4 @ < beta if_4
- vand q7, q7, q5 @ if_2 && if_4
- vmvn q4, q7
- vand q7, q6, q7 @ if_1 && if_2 && if_4
- vand q6, q6, q4 @ if_1 && !(if_2 && if_4)
- vbit q0, q12, q6
- vbit q1, q14, q7
- vbit q0, q13, q7
- vbit q2, q15, q7
- .endm
- function deblock_v_luma_intra_neon
- push {lr}
- vld1.64 {d0, d1}, [r0,:128], r1
- vld1.64 {d2, d3}, [r0,:128], r1
- vld1.64 {d4, d5}, [r0,:128], r1
- vld1.64 {d6, d7}, [r0,:128], r1
- sub r0, r0, r1, lsl #3
- vld1.64 {d22,d23}, [r0,:128], r1
- vld1.64 {d20,d21}, [r0,:128], r1
- vld1.64 {d18,d19}, [r0,:128], r1
- vld1.64 {d16,d17}, [r0,:128]
- align_push_regs
- h264_loop_filter_luma_intra
- sub r0, r0, r1, lsl #1
- vst1.64 {d20,d21}, [r0,:128], r1
- vst1.64 {d18,d19}, [r0,:128], r1
- vst1.64 {d16,d17}, [r0,:128], r1
- vst1.64 {d0, d1}, [r0,:128], r1
- vst1.64 {d2, d3}, [r0,:128], r1
- vst1.64 {d4, d5}, [r0,:128]
- 9:
- align_pop_regs
- pop {pc}
- endfunc
- function deblock_h_luma_intra_neon
- push {lr}
- sub r0, r0, #4
- vld1.64 {d22}, [r0], r1
- vld1.64 {d20}, [r0], r1
- vld1.64 {d18}, [r0], r1
- vld1.64 {d16}, [r0], r1
- vld1.64 {d0}, [r0], r1
- vld1.64 {d2}, [r0], r1
- vld1.64 {d4}, [r0], r1
- vld1.64 {d6}, [r0], r1
- vld1.64 {d23}, [r0], r1
- vld1.64 {d21}, [r0], r1
- vld1.64 {d19}, [r0], r1
- vld1.64 {d17}, [r0], r1
- vld1.64 {d1}, [r0], r1
- vld1.64 {d3}, [r0], r1
- vld1.64 {d5}, [r0], r1
- vld1.64 {d7}, [r0], r1
- TRANSPOSE8x8 q11, q10, q9, q8, q0, q1, q2, q3
- align_push_regs
- h264_loop_filter_luma_intra
- TRANSPOSE8x8 q11, q10, q9, q8, q0, q1, q2, q3
- sub r0, r0, r1, lsl #4
- vst1.64 {d22}, [r0], r1
- vst1.64 {d20}, [r0], r1
- vst1.64 {d18}, [r0], r1
- vst1.64 {d16}, [r0], r1
- vst1.64 {d0}, [r0], r1
- vst1.64 {d2}, [r0], r1
- vst1.64 {d4}, [r0], r1
- vst1.64 {d6}, [r0], r1
- vst1.64 {d23}, [r0], r1
- vst1.64 {d21}, [r0], r1
- vst1.64 {d19}, [r0], r1
- vst1.64 {d17}, [r0], r1
- vst1.64 {d1}, [r0], r1
- vst1.64 {d3}, [r0], r1
- vst1.64 {d5}, [r0], r1
- vst1.64 {d7}, [r0], r1
- 9:
- align_pop_regs
- pop {pc}
- endfunc
- .macro h264_loop_filter_chroma
- vdup.8 q11, r2 // alpha
- vmovl.u8 q12, d24
- vabd.u8 q13, q8, q0 // abs(p0 - q0)
- vabd.u8 q14, q9, q8 // abs(p1 - p0)
- vsubl.u8 q2, d0, d16
- vsubl.u8 q3, d1, d17
- vsli.16 q12, q12, #8
- vshl.i16 q2, q2, #2
- vshl.i16 q3, q3, #2
- vabd.u8 q15, q1, q0 // abs(q1 - q0)
- vmovl.u8 q12, d24
- vaddw.u8 q2, q2, d18
- vaddw.u8 q3, q3, d19
- vclt.u8 q13, q13, q11 // < alpha
- vsubw.u8 q2, q2, d2
- vsubw.u8 q3, q3, d3
- vsli.16 q12, q12, #8
- vdup.8 q11, r3 // beta
- vclt.s8 q10, q12, #0
- vrshrn.i16 d4, q2, #3
- vrshrn.i16 d5, q3, #3
- vclt.u8 q14, q14, q11 // < beta
- vbic q13, q13, q10
- vclt.u8 q15, q15, q11 // < beta
- vand q13, q13, q14
- vneg.s8 q10, q12
- vand q13, q13, q15
- vmin.s8 q2, q2, q12
- vmovl.u8 q14, d16
- vand q2, q2, q13
- vmovl.u8 q15, d17
- vmax.s8 q2, q2, q10
- vmovl.u8 q11, d0
- vmovl.u8 q12, d1
- vaddw.s8 q14, q14, d4
- vaddw.s8 q15, q15, d5
- vsubw.s8 q11, q11, d4
- vsubw.s8 q12, q12, d5
- vqmovun.s16 d16, q14
- vqmovun.s16 d17, q15
- vqmovun.s16 d0, q11
- vqmovun.s16 d1, q12
- .endm
- function deblock_v_chroma_neon
- h264_loop_filter_start
- sub r0, r0, r1, lsl #1
- vld1.8 {d18,d19}, [r0,:128], r1
- vld1.8 {d16,d17}, [r0,:128], r1
- vld1.8 {d0, d1}, [r0,:128], r1
- vld1.8 {d2, d3}, [r0,:128]
- h264_loop_filter_chroma
- sub r0, r0, r1, lsl #1
- vst1.8 {d16,d17}, [r0,:128], r1
- vst1.8 {d0, d1}, [r0,:128], r1
- bx lr
- endfunc
- function deblock_h_chroma_neon
- h264_loop_filter_start
- sub r0, r0, #4
- deblock_h_chroma:
- vld1.8 {d18}, [r0], r1
- vld1.8 {d16}, [r0], r1
- vld1.8 {d0}, [r0], r1
- vld1.8 {d2}, [r0], r1
- vld1.8 {d19}, [r0], r1
- vld1.8 {d17}, [r0], r1
- vld1.8 {d1}, [r0], r1
- vld1.8 {d3}, [r0], r1
- TRANSPOSE4x4_16 q9, q8, q0, q1
- h264_loop_filter_chroma
- vtrn.16 q8, q0
- sub r0, r0, r1, lsl #3
- add r0, r0, #2
- vst1.32 {d16[0]}, [r0], r1
- vst1.32 {d0[0]}, [r0], r1
- vst1.32 {d16[1]}, [r0], r1
- vst1.32 {d0[1]}, [r0], r1
- vst1.32 {d17[0]}, [r0], r1
- vst1.32 {d1[0]}, [r0], r1
- vst1.32 {d17[1]}, [r0], r1
- vst1.32 {d1[1]}, [r0], r1
- bx lr
- endfunc
- function deblock_h_chroma_422_neon
- h264_loop_filter_start
- push {lr}
- sub r0, r0, #4
- add r1, r1, r1
- bl deblock_h_chroma
- ldr ip, [sp, #4]
- ldr ip, [ip]
- vdup.32 d24, ip
- sub r0, r0, r1, lsl #3
- add r0, r0, r1, lsr #1
- sub r0, r0, #2
- pop {lr}
- b deblock_h_chroma
- endfunc
- .macro h264_loop_filter_chroma8
- vdup.8 d22, r2 @ alpha
- vmovl.u8 q12, d24
- vabd.u8 d26, d16, d0 @ abs(p0 - q0)
- vabd.u8 d28, d18, d16 @ abs(p1 - p0)
- vsubl.u8 q2, d0, d16
- vsli.16 d24, d24, #8
- vshl.i16 q2, q2, #2
- vabd.u8 d30, d2, d0 @ abs(q1 - q0)
- vaddw.u8 q2, q2, d18
- vclt.u8 d26, d26, d22 @ < alpha
- vsubw.u8 q2, q2, d2
- vdup.8 d22, r3 @ beta
- vclt.s8 d20, d24, #0
- vrshrn.i16 d4, q2, #3
- vclt.u8 d28, d28, d22 @ < beta
- vbic d26, d26, d20
- vclt.u8 d30, d30, d22 @ < beta
- vand d26, d26, d28
- vneg.s8 d20, d24
- vand d26, d26, d30
- vmin.s8 d4, d4, d24
- vmovl.u8 q14, d16
- vand d4, d4, d26
- vmax.s8 d4, d4, d20
- vmovl.u8 q11, d0
- vaddw.s8 q14, q14, d4
- vsubw.s8 q11, q11, d4
- vqmovun.s16 d16, q14
- vqmovun.s16 d0, q11
- .endm
- function deblock_h_chroma_mbaff_neon
- h264_loop_filter_start
- sub r0, r0, #4
- vld1.8 {d18}, [r0], r1
- vld1.8 {d16}, [r0], r1
- vld1.8 {d0}, [r0], r1
- vld1.8 {d2}, [r0], r1
- TRANSPOSE4x4_16 d18, d16, d0, d2
- h264_loop_filter_chroma8
- vtrn.16 d16, d0
- sub r0, r0, r1, lsl #2
- add r0, r0, #2
- vst1.32 {d16[0]}, [r0], r1
- vst1.32 {d0[0]}, [r0], r1
- vst1.32 {d16[1]}, [r0], r1
- vst1.32 {d0[1]}, [r0]
- bx lr
- endfunc
- .macro h264_loop_filter_chroma_intra, width=16
- vdup.8 q11, r2 @ alpha
- vabd.u8 q13, q8, q0 @ abs(p0 - q0)
- vabd.u8 q14, q9, q8 @ abs(p1 - p0)
- vabd.u8 q15, q1, q0 @ abs(q1 - q0)
- vclt.u8 q13, q13, q11 @ < alpha
- vdup.8 q11, r3 @ beta
- vclt.u8 q14, q14, q11 @ < beta
- vclt.u8 q15, q15, q11 @ < beta
- vand q13, q13, q14
- vand q13, q13, q15
- vshll.u8 q14, d18, #1
- vshll.u8 q2, d2, #1
- .ifc \width, 16
- vshll.u8 q15, d19, #1
- vshll.u8 q3, d3, #1
- vaddl.u8 q12, d17, d3
- vaddl.u8 q10, d1, d19
- .endif
- vaddl.u8 q11, d16, d2
- vaddl.u8 q1, d18, d0 @ or vaddw q2, to not clobber q1
- vadd.u16 q14, q14, q11
- vadd.u16 q2, q2, q1
- .ifc \width, 16
- vadd.u16 q15, q15, q12
- vadd.u16 q3, q3, q10
- .endif
- vqrshrn.u16 d28, q14, #2
- vqrshrn.u16 d4, q2, #2
- .ifc \width, 16
- vqrshrn.u16 d29, q15, #2
- vqrshrn.u16 d5, q3, #2
- .endif
- vbit q8, q14, q13
- vbit q0, q2, q13
- .endm
- function deblock_v_chroma_intra_neon
- sub r0, r0, r1, lsl #1
- vld2.8 {d18,d19}, [r0,:128], r1
- vld2.8 {d16,d17}, [r0,:128], r1
- vld2.8 {d0, d1}, [r0,:128], r1
- vld2.8 {d2, d3}, [r0,:128]
- h264_loop_filter_chroma_intra
- sub r0, r0, r1, lsl #1
- vst2.8 {d16,d17}, [r0,:128], r1
- vst2.8 {d0, d1}, [r0,:128], r1
- bx lr
- endfunc
- function deblock_h_chroma_intra_neon
- sub r0, r0, #4
- vld1.8 {d18}, [r0], r1
- vld1.8 {d16}, [r0], r1
- vld1.8 {d0}, [r0], r1
- vld1.8 {d2}, [r0], r1
- vld1.8 {d19}, [r0], r1
- vld1.8 {d17}, [r0], r1
- vld1.8 {d1}, [r0], r1
- vld1.8 {d3}, [r0], r1
- TRANSPOSE4x4_16 q9, q8, q0, q1
- h264_loop_filter_chroma_intra
- vtrn.16 q8, q0
- sub r0, r0, r1, lsl #3
- add r0, r0, #2
- vst1.32 {d16[0]}, [r0], r1
- vst1.32 {d0[0]}, [r0], r1
- vst1.32 {d16[1]}, [r0], r1
- vst1.32 {d0[1]}, [r0], r1
- vst1.32 {d17[0]}, [r0], r1
- vst1.32 {d1[0]}, [r0], r1
- vst1.32 {d17[1]}, [r0], r1
- vst1.32 {d1[1]}, [r0], r1
- bx lr
- endfunc
- function deblock_h_chroma_422_intra_neon
- push {lr}
- bl X(deblock_h_chroma_intra_neon)
- add r0, r0, #2
- pop {lr}
- b X(deblock_h_chroma_intra_neon)
- endfunc
- function deblock_h_chroma_intra_mbaff_neon
- sub r0, r0, #4
- vld1.8 {d18}, [r0], r1
- vld1.8 {d16}, [r0], r1
- vld1.8 {d0}, [r0], r1
- vld1.8 {d2}, [r0], r1
- TRANSPOSE4x4_16 d18, d16, d0, d2
- h264_loop_filter_chroma_intra width=8
- vtrn.16 d16, d0
- sub r0, r0, r1, lsl #2
- add r0, r0, #2
- vst1.32 {d16[0]}, [r0], r1
- vst1.32 {d0[0]}, [r0], r1
- vst1.32 {d16[1]}, [r0], r1
- vst1.32 {d0[1]}, [r0]
- bx lr
- endfunc
- function deblock_strength_neon
- ldr ip, [sp]
- vmov.i8 q8, #0
- lsl ip, ip, #8
- add r3, r3, #32
- sub ip, ip, #(1<<8)-3
- vmov.i8 q9, #0
- vdup.16 q10, ip
- ldr ip, [sp, #4]
- lists:
- @ load bytes ref
- vld1.8 {d31}, [r1]!
- add r2, r2, #16
- vld1.8 {q1}, [r1]!
- vmov.i8 q0, #0
- vld1.8 {q2}, [r1]!
- vext.8 q3, q0, q1, #15
- vext.8 q0, q0, q2, #15
- vuzp.32 q1, q2
- vuzp.32 q3, q0
- vext.8 q1, q15, q2, #12
- veor q0, q0, q2
- veor q1, q1, q2
- vorr q8, q8, q0
- vorr q9, q9, q1
- vld1.16 {q11}, [r2,:128]! @ mv + 0x10
- vld1.16 {q3}, [r2,:128]! @ mv + 0x20
- vld1.16 {q12}, [r2,:128]! @ mv + 0x30
- vld1.16 {q2}, [r2,:128]! @ mv + 0x40
- vld1.16 {q13}, [r2,:128]! @ mv + 0x50
- vext.8 q3, q3, q12, #12
- vext.8 q2, q2, q13, #12
- vabd.s16 q0, q12, q3
- vld1.16 {q3}, [r2,:128]! @ mv + 0x60
- vabd.s16 q1, q13, q2
- vld1.16 {q14}, [r2,:128]! @ mv + 0x70
- vqmovn.u16 d0, q0
- vld1.16 {q2}, [r2,:128]! @ mv + 0x80
- vld1.16 {q15}, [r2,:128]! @ mv + 0x90
- vqmovn.u16 d1, q1
- vext.8 q3, q3, q14, #12
- vext.8 q2, q2, q15, #12
- vabd.s16 q3, q14, q3
- vabd.s16 q2, q15, q2
- vqmovn.u16 d2, q3
- vqmovn.u16 d3, q2
- vqsub.u8 q0, q0, q10
- vqsub.u8 q1, q1, q10
- vqmovn.u16 d0, q0
- vqmovn.u16 d1, q1
- vabd.s16 q1, q12, q13
- vorr q8, q8, q0
- vabd.s16 q0, q11, q12
- vabd.s16 q2, q13, q14
- vabd.s16 q3, q14, q15
- vqmovn.u16 d0, q0
- vqmovn.u16 d1, q1
- vqmovn.u16 d2, q2
- vqmovn.u16 d3, q3
- vqsub.u8 q0, q0, q10
- vqsub.u8 q1, q1, q10
- vqmovn.u16 d0, q0
- vqmovn.u16 d1, q1
- subs ip, ip, #1
- vorr q9, q9, q0
- beq lists
- mov ip, #-32
- @ load bytes nnz
- vld1.8 {d31}, [r0]!
- vld1.8 {q1}, [r0]!
- vmov.i8 q0, #0
- vld1.8 {q2}, [r0]
- vext.8 q3, q0, q1, #15
- vext.8 q0, q0, q2, #15
- vuzp.32 q1, q2
- vuzp.32 q3, q0
- vext.8 q1, q15, q2, #12
- vorr q0, q0, q2
- vorr q1, q1, q2
- vmov.u8 q10, #1
- vmin.u8 q0, q0, q10
- vmin.u8 q1, q1, q10
- vmin.u8 q8, q8, q10 @ mv ? 1 : 0
- vmin.u8 q9, q9, q10
- vadd.u8 q0, q0, q0 @ nnz ? 2 : 0
- vadd.u8 q1, q1, q1
- vmax.u8 q8, q8, q0
- vmax.u8 q9, q9, q1
- vzip.16 d16, d17
- vst1.8 {q9}, [r3,:128], ip @ bs[1]
- vtrn.8 d16, d17
- vtrn.32 d16, d17
- vst1.8 {q8}, [r3,:128] @ bs[0]
- bx lr
- endfunc
|