[go: nahoru, domu]

1;//
2;// Copyright (C) 2007-2008 ARM Limited
3;//
4;// Licensed under the Apache License, Version 2.0 (the "License");
5;// you may not use this file except in compliance with the License.
6;// You may obtain a copy of the License at
7;//
8;//      http://www.apache.org/licenses/LICENSE-2.0
9;//
10;// Unless required by applicable law or agreed to in writing, software
11;// distributed under the License is distributed on an "AS IS" BASIS,
12;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13;// See the License for the specific language governing permissions and
14;// limitations under the License.
15;//
16/*
17 *
18 */
19
20    .eabi_attribute 24, 1
21    .eabi_attribute 25, 1
22
23    .arm
24    .fpu neon
25
26    .text
27    .align 4
28;//-------------------------------------------------------
29;// This table for implementing switch case of C in asm by
30;// the mehtod of two levels of indexing.
31;//-------------------------------------------------------
32
33armVCM4P10_pIndexTable16x16:
34    .word  OMX_VC_16X16_VERT-(P0+8), OMX_VC_16X16_HOR-(P0+8)
35    .word  OMX_VC_16X16_DC-(P0+8),   OMX_VC_16X16_PLANE-(P0+8)
36
37
38armVCM4P10_MultiplierTable16x16:
39    .hword   7,  6,  5,  4,  3,  2,  1,  8
40    .hword   0,  1,  2,  3,  4,  5,  6,  7
41    .hword   8,  9, 10, 11, 12, 13, 14, 15
42
43
44    .global omxVCM4P10_PredictIntra_16x16
45omxVCM4P10_PredictIntra_16x16:
46    PUSH     {r4-r12,lr}
47    VPUSH    {d8-d15}
48    ADR      r9, armVCM4P10_pIndexTable16x16
49    LDR      r6,[sp,#0x70]
50    LDR      r4,[sp,#0x68]
51    LDR      r5,[sp,#0x6c]
52    LDR      r7,[sp,#0x74]
53    MOV      r12,#0x10
54    LDR      r9,[r9,r6,LSL #2]
55P0: ADD      pc,r9
56OMX_VC_16X16_VERT:
57    VLD1.8   {d0,d1},[r1]
58    ADD      r8,r3,r5
59    ADD      r10,r5,r5
60    VST1.8   {d0,d1},[r3],r10
61    VST1.8   {d0,d1},[r8],r10
62    VST1.8   {d0,d1},[r3],r10
63    VST1.8   {d0,d1},[r8],r10
64    VST1.8   {d0,d1},[r3],r10
65    VST1.8   {d0,d1},[r8],r10
66    VST1.8   {d0,d1},[r3],r10
67    VST1.8   {d0,d1},[r8],r10
68    VST1.8   {d0,d1},[r3],r10
69    VST1.8   {d0,d1},[r8],r10
70    VST1.8   {d0,d1},[r3],r10
71    VST1.8   {d0,d1},[r8],r10
72    VST1.8   {d0,d1},[r3],r10
73    VST1.8   {d0,d1},[r8],r10
74    VST1.8   {d0,d1},[r3]
75    VST1.8   {d0,d1},[r8]
76    MOV      r0,#0
77    VPOP     {d8-d15}
78    POP      {r4-r12,pc}
79OMX_VC_16X16_HOR:
80    ADD      r8,r0,r4
81    ADD      r4,r4,r4
82    ADD      r11,r3,r5
83    ADD      r5,r5,r5
84L0x8c:
85    VLD1.8   {d2[],d3[]},[r0],r4
86    VLD1.8   {d0[],d1[]},[r8],r4
87    SUBS     r12,r12,#8
88    VST1.8   {d2,d3},[r3],r5
89    VST1.8   {d0,d1},[r11],r5
90    VLD1.8   {d2[],d3[]},[r0],r4
91    VLD1.8   {d0[],d1[]},[r8],r4
92    VST1.8   {d2,d3},[r3],r5
93    VST1.8   {d0,d1},[r11],r5
94    VLD1.8   {d2[],d3[]},[r0],r4
95    VLD1.8   {d0[],d1[]},[r8],r4
96    VST1.8   {d2,d3},[r3],r5
97    VST1.8   {d0,d1},[r11],r5
98    VLD1.8   {d2[],d3[]},[r0],r4
99    VLD1.8   {d0[],d1[]},[r8],r4
100    VST1.8   {d2,d3},[r3],r5
101    VST1.8   {d0,d1},[r11],r5
102    BNE      L0x8c
103    MOV      r0,#0
104    VPOP     {d8-d15}
105    POP      {r4-r12,pc}
106OMX_VC_16X16_DC:
107    MOV      r11,#0
108    TST      r7,#2
109    BEQ      L0x14c
110    ADD      r8,r0,r4
111    ADD      r10,r4,r4
112    VLD1.8   {d2[0]},[r0],r10
113    VLD1.8   {d2[1]},[r8],r10
114    VLD1.8   {d2[2]},[r0],r10
115    VLD1.8   {d2[3]},[r8],r10
116    VLD1.8   {d2[4]},[r0],r10
117    VLD1.8   {d2[5]},[r8],r10
118    VLD1.8   {d2[6]},[r0],r10
119    VLD1.8   {d2[7]},[r8],r10
120    VLD1.8   {d3[0]},[r0],r10
121    VLD1.8   {d3[1]},[r8],r10
122    VLD1.8   {d3[2]},[r0],r10
123    VLD1.8   {d3[3]},[r8],r10
124    VLD1.8   {d3[4]},[r0],r10
125    VLD1.8   {d3[5]},[r8],r10
126    VLD1.8   {d3[6]},[r0],r10
127    VLD1.8   {d3[7]},[r8]
128    VPADDL.U8 q0,q1
129    ADD      r11,r11,#1
130    VPADD.I16 d0,d0,d1
131    VPADDL.U16 d0,d0
132    VPADDL.U32 d6,d0
133    VRSHR.U64 d8,d6,#4
134L0x14c:
135    TST      r7,#1
136    BEQ      L0x170
137    VLD1.8   {d0,d1},[r1]
138    ADD      r11,r11,#1
139    VPADDL.U8 q0,q0
140    VPADD.I16 d0,d0,d1
141    VPADDL.U16 d0,d0
142    VPADDL.U32 d7,d0
143    VRSHR.U64 d8,d7,#4
144L0x170:
145    CMP      r11,#2
146    BNE      L0x180
147    VADD.I64 d8,d7,d6
148    VRSHR.U64 d8,d8,#5
149L0x180:
150    VDUP.8   q3,d8[0]
151    CMP      r11,#0
152    ADD      r8,r3,r5
153    ADD      r10,r5,r5
154    BNE      L0x198
155    VMOV.I8  q3,#0x80
156L0x198:
157    VST1.8   {d6,d7},[r3],r10
158    VST1.8   {d6,d7},[r8],r10
159    VST1.8   {d6,d7},[r3],r10
160    VST1.8   {d6,d7},[r8],r10
161    VST1.8   {d6,d7},[r3],r10
162    VST1.8   {d6,d7},[r8],r10
163    VST1.8   {d6,d7},[r3],r10
164    VST1.8   {d6,d7},[r8],r10
165    VST1.8   {d6,d7},[r3],r10
166    VST1.8   {d6,d7},[r8],r10
167    VST1.8   {d6,d7},[r3],r10
168    VST1.8   {d6,d7},[r8],r10
169    VST1.8   {d6,d7},[r3],r10
170    VST1.8   {d6,d7},[r8],r10
171    VST1.8   {d6,d7},[r3],r10
172    VST1.8   {d6,d7},[r8],r10
173    MOV      r0,#0
174    VPOP     {d8-d15}
175    POP      {r4-r12,pc}
176OMX_VC_16X16_PLANE:
177    ADR      r9, armVCM4P10_MultiplierTable16x16
178    VLD1.8   {d0,d1},[r1]
179    VLD1.8   {d4[0]},[r2]
180    ADD      r8,r0,r4
181    ADD      r10,r4,r4
182    VLD1.8   {d2[0]},[r0],r10
183    VLD1.8   {d2[1]},[r8],r10
184    VLD1.8   {d2[2]},[r0],r10
185    VLD1.8   {d2[3]},[r8],r10
186    VLD1.8   {d2[4]},[r0],r10
187    VLD1.8   {d2[5]},[r8],r10
188    VLD1.8   {d2[6]},[r0],r10
189    VLD1.8   {d2[7]},[r8],r10
190    VLD1.8   {d3[0]},[r0],r10
191    VLD1.8   {d3[1]},[r8],r10
192    VLD1.8   {d3[2]},[r0],r10
193    VLD1.8   {d3[3]},[r8],r10
194    VLD1.8   {d3[4]},[r0],r10
195    VLD1.8   {d3[5]},[r8],r10
196    VLD1.8   {d3[6]},[r0],r10
197    VLD1.8   {d3[7]},[r8]
198    VREV64.8 d5,d1
199    VSUBL.U8 q3,d5,d4
200    VSHR.U64 d5,d5,#8
201    VSUBL.U8 q4,d5,d0
202    VSHL.I64 d9,d9,#16
203    VEXT.8   d9,d9,d6,#2
204    VREV64.8 d12,d3
205    VSUBL.U8 q7,d12,d4
206    VSHR.U64 d12,d12,#8
207    VSUBL.U8 q8,d12,d2
208    VLD1.16  {d20,d21},[r9]!
209    VSHL.I64 d17,d17,#16
210    VEXT.8   d17,d17,d14,#2
211    VMULL.S16 q11,d8,d20
212    VMULL.S16 q12,d16,d20
213    VMLAL.S16 q11,d9,d21
214    VMLAL.S16 q12,d17,d21
215    VPADD.I32 d22,d23,d22
216    VPADD.I32 d23,d25,d24
217    VPADDL.S32 q11,q11
218    VSHL.I64 q12,q11,#2
219    VADD.I64 q11,q11,q12
220    VRSHR.S64 q11,q11,#6
221    VSHL.I64 q12,q11,#3
222    VSUB.I64 q12,q12,q11
223    VLD1.16  {d20,d21},[r9]!
224    VDUP.16  q6,d22[0]
225    VDUP.16  q7,d23[0]
226    VADDL.U8 q11,d1,d3
227    VSHL.I16 q11,q11,#4
228    VDUP.16  q11,d23[3]
229    VADD.I64 d1,d24,d25
230    VLD1.16  {d24,d25},[r9]
231    VDUP.16  q13,d1[0]
232    VSUB.I16 q13,q11,q13
233    VMUL.I16 q5,q6,q10
234    VMUL.I16 q6,q6,q12
235    VADD.I16 q0,q5,q13
236    VADD.I16 q1,q6,q13
237L0x2d4:
238    VQRSHRUN.S16 d6,q0,#5
239    VQRSHRUN.S16 d7,q1,#5
240    SUBS     r12,r12,#1
241    VST1.8   {d6,d7},[r3],r5
242    VADD.I16 q0,q0,q7
243    VADD.I16 q1,q1,q7
244    BNE      L0x2d4
245    MOV      r0,#0
246    VPOP     {d8-d15}
247    POP      {r4-r12,pc}
248
249    .end
250
251