1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2010 Mans Rullgard
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "libavutil/arm/asm.S"
22cabdff1aSopenharmony_ci#include "asm-offsets.h"
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_cifunction ff_dct_unquantize_h263_inter_neon, export=1
25cabdff1aSopenharmony_ci        add             r12, r0,  #BLOCK_LAST_INDEX
26cabdff1aSopenharmony_ci        ldr             r12, [r12, r2, lsl #2]
27cabdff1aSopenharmony_ci        add             r0,  r0,  #INTER_SCANTAB_RASTER_END
28cabdff1aSopenharmony_ci        ldrb            r12, [r0, r12]
29cabdff1aSopenharmony_ci        sub             r2,  r3,  #1
30cabdff1aSopenharmony_ci        lsl             r0,  r3,  #1
31cabdff1aSopenharmony_ci        orr             r2,  r2,  #1
32cabdff1aSopenharmony_ci        add             r3,  r12, #1
33cabdff1aSopenharmony_ciendfunc
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_cifunction ff_dct_unquantize_h263_neon, export=1
36cabdff1aSopenharmony_ci        vdup.16         q15, r0                 @ qmul
37cabdff1aSopenharmony_ci        vdup.16         q14, r2                 @ qadd
38cabdff1aSopenharmony_ci        vneg.s16        q13, q14
39cabdff1aSopenharmony_ci        cmp             r3,  #4
40cabdff1aSopenharmony_ci        mov             r0,  r1
41cabdff1aSopenharmony_ci        ble             2f
42cabdff1aSopenharmony_ci1:
43cabdff1aSopenharmony_ci        vld1.16         {q0},     [r0,:128]!
44cabdff1aSopenharmony_ci        vclt.s16        q3,  q0,  #0
45cabdff1aSopenharmony_ci        vld1.16         {q8},     [r0,:128]!
46cabdff1aSopenharmony_ci        vceq.s16        q1,  q0,  #0
47cabdff1aSopenharmony_ci        vmul.s16        q2,  q0,  q15
48cabdff1aSopenharmony_ci        vclt.s16        q11, q8,  #0
49cabdff1aSopenharmony_ci        vmul.s16        q10, q8,  q15
50cabdff1aSopenharmony_ci        vbsl            q3,  q13, q14
51cabdff1aSopenharmony_ci        vbsl            q11, q13, q14
52cabdff1aSopenharmony_ci        vadd.s16        q2,  q2,  q3
53cabdff1aSopenharmony_ci        vceq.s16        q9,  q8,  #0
54cabdff1aSopenharmony_ci        vadd.s16        q10, q10, q11
55cabdff1aSopenharmony_ci        vbif            q0,  q2,  q1
56cabdff1aSopenharmony_ci        vbif            q8,  q10, q9
57cabdff1aSopenharmony_ci        subs            r3,  r3,  #16
58cabdff1aSopenharmony_ci        vst1.16         {q0},     [r1,:128]!
59cabdff1aSopenharmony_ci        vst1.16         {q8},     [r1,:128]!
60cabdff1aSopenharmony_ci        it              le
61cabdff1aSopenharmony_ci        bxle            lr
62cabdff1aSopenharmony_ci        cmp             r3,  #8
63cabdff1aSopenharmony_ci        bgt             1b
64cabdff1aSopenharmony_ci2:
65cabdff1aSopenharmony_ci        vld1.16         {d0},     [r0,:64]
66cabdff1aSopenharmony_ci        vclt.s16        d3,  d0,  #0
67cabdff1aSopenharmony_ci        vceq.s16        d1,  d0,  #0
68cabdff1aSopenharmony_ci        vmul.s16        d2,  d0,  d30
69cabdff1aSopenharmony_ci        vbsl            d3,  d26, d28
70cabdff1aSopenharmony_ci        vadd.s16        d2,  d2,  d3
71cabdff1aSopenharmony_ci        vbif            d0,  d2,  d1
72cabdff1aSopenharmony_ci        vst1.16         {d0},     [r1,:64]
73cabdff1aSopenharmony_ci        bx              lr
74cabdff1aSopenharmony_ciendfunc
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_cifunction ff_dct_unquantize_h263_intra_neon, export=1
77cabdff1aSopenharmony_ci        push            {r4-r6,lr}
78cabdff1aSopenharmony_ci        add             r12, r0,  #BLOCK_LAST_INDEX
79cabdff1aSopenharmony_ci        ldr             r6,  [r0, #AC_PRED]
80cabdff1aSopenharmony_ci        add             lr,  r0,  #INTER_SCANTAB_RASTER_END
81cabdff1aSopenharmony_ci        cmp             r6,  #0
82cabdff1aSopenharmony_ci        it              ne
83cabdff1aSopenharmony_ci        movne           r12, #63
84cabdff1aSopenharmony_ci        bne             1f
85cabdff1aSopenharmony_ci        ldr             r12, [r12, r2, lsl #2]
86cabdff1aSopenharmony_ci        ldrb            r12, [lr, r12]
87cabdff1aSopenharmony_ci1:      ldr             r5,  [r0, #H263_AIC]
88cabdff1aSopenharmony_ci        ldrsh           r4,  [r1]
89cabdff1aSopenharmony_ci        cmp             r5,  #0
90cabdff1aSopenharmony_ci        mov             r5,  r1
91cabdff1aSopenharmony_ci        it              ne
92cabdff1aSopenharmony_ci        movne           r2,  #0
93cabdff1aSopenharmony_ci        bne             2f
94cabdff1aSopenharmony_ci        cmp             r2,  #4
95cabdff1aSopenharmony_ci        it              ge
96cabdff1aSopenharmony_ci        addge           r0,  r0,  #4
97cabdff1aSopenharmony_ci        sub             r2,  r3,  #1
98cabdff1aSopenharmony_ci        ldr             r6,  [r0, #Y_DC_SCALE]
99cabdff1aSopenharmony_ci        orr             r2,  r2,  #1
100cabdff1aSopenharmony_ci        smulbb          r4,  r4,  r6
101cabdff1aSopenharmony_ci2:      lsl             r0,  r3,  #1
102cabdff1aSopenharmony_ci        add             r3,  r12, #1
103cabdff1aSopenharmony_ci        bl              X(ff_dct_unquantize_h263_neon)
104cabdff1aSopenharmony_ci        vmov.16         d0[0], r4
105cabdff1aSopenharmony_ci        vst1.16         {d0[0]},  [r5]
106cabdff1aSopenharmony_ci        pop             {r4-r6,pc}
107cabdff1aSopenharmony_ciendfunc
108