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