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