omxVCM4P10_PredictIntra_4x4_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
15armVCM4P10_pSwitchTable4x4:
16    .word OMX_VC_4x4_VERT-(P0+8),     OMX_VC_4x4_HOR-(P0+8)
17    .word OMX_VC_4x4_DC-(P0+8),       OMX_VC_4x4_DIAG_DL-(P0+8)
18    .word OMX_VC_4x4_DIAG_DR-(P0+8),  OMX_VC_4x4_VR-(P0+8)
19    .word OMX_VC_4x4_HD-(P0+8),       OMX_VC_4x4_VL-(P0+8)
20    .word OMX_VC_4x4_HU-(P0+8)
21
22    .global omxVCM4P10_PredictIntra_4x4
23    .func   omxVCM4P10_PredictIntra_4x4
24omxVCM4P10_PredictIntra_4x4:
25    PUSH     {r4-r12,lr}
26    VPUSH    {d8-d12}
27    ADR      r8, armVCM4P10_pSwitchTable4x4
28    LDRD     r6,r7,[sp,#0x58]
29    LDRD     r4,r5,[sp,#0x50]
30    LDR      r8,[r8,r6,LSL #2]
31P0: ADD      pc, r8
32
33OMX_VC_4x4_HOR:
34    ADD      r9,r0,r4
35    ADD      r10,r4,r4
36    VLD1.8   {d0[]},[r0],r10
37    VLD1.8   {d1[]},[r9],r10
38    VLD1.8   {d2[]},[r0]
39    VLD1.8   {d3[]},[r9]
40    ADD      r11,r3,r5
41    ADD      r12,r5,r5
42    VST1.32  {d0[0]},[r3],r12
43    VST1.32  {d1[0]},[r11],r12
44    VST1.32  {d2[0]},[r3]
45    VST1.32  {d3[0]},[r11]
46    B        L0x348
47OMX_VC_4x4_VERT:
48    VLD1.32  {d0[0]},[r1]
49    ADD      r11,r3,r5
50    ADD      r12,r5,r5
51L0x58:
52    VST1.32  {d0[0]},[r3],r12
53    VST1.32  {d0[0]},[r11],r12
54    VST1.32  {d0[0]},[r3]
55    VST1.32  {d0[0]},[r11]
56    B        L0x348
57OMX_VC_4x4_DC:
58    TST      r7,#2
59    BEQ      L0xdc
60    ADD      r9,r0,r4
61    ADD      r10,r4,r4
62    VLD1.8   {d0[0]},[r0],r10
63    VLD1.8   {d0[1]},[r9],r10
64    VLD1.8   {d0[2]},[r0]
65    VLD1.8   {d0[3]},[r9]
66    TST      r7,#1
67    BEQ      L0xbc
68    VLD1.32  {d0[1]},[r1]
69    MOV      r0,#0
70    VPADDL.U8 d1,d0
71    VPADDL.U16 d1,d1
72    VPADDL.U32 d1,d1
73    VRSHR.U64 d1,d1,#3
74    ADD      r11,r3,r5
75    ADD      r12,r5,r5
76    VDUP.8   d0,d1[0]
77    B        L0x58
78L0xbc:
79    MOV      r0,#0
80    VPADDL.U8 d1,d0
81    VPADDL.U16 d1,d1
82    VRSHR.U32 d1,d1,#2
83    ADD      r11,r3,r5
84    ADD      r12,r5,r5
85    VDUP.8   d0,d1[0]
86    B        L0x58
87L0xdc:
88    TST      r7,#1
89    BEQ      L0x108
90    VLD1.32  {d0[0]},[r1]
91    MOV      r0,#0
92    VPADDL.U8 d1,d0
93    VPADDL.U16 d1,d1
94    VRSHR.U32 d1,d1,#2
95    ADD      r11,r3,r5
96    ADD      r12,r5,r5
97    VDUP.8   d0,d1[0]
98    B        L0x58
99L0x108:
100    VMOV.I8  d0,#0x80
101    MOV      r0,#0
102    ADD      r11,r3,r5
103    ADD      r12,r5,r5
104    B        L0x58
105OMX_VC_4x4_DIAG_DL:
106    TST      r7,#0x40
107    BEQ      L0x138
108    VLD1.8   {d3},[r1]
109    VDUP.8   d2,d3[7]
110    VEXT.8   d4,d3,d2,#1
111    VEXT.8   d5,d3,d2,#2
112    B        L0x14c
113L0x138:
114    VLD1.32  {d0[1]},[r1]
115    VDUP.8   d2,d0[7]
116    VEXT.8   d3,d0,d2,#4
117    VEXT.8   d4,d0,d2,#5
118    VEXT.8   d5,d0,d2,#6
119L0x14c:
120    VHADD.U8 d6,d3,d5
121    VRHADD.U8 d6,d6,d4
122    VST1.32  {d6[0]},[r3],r5
123    VEXT.8   d6,d6,d6,#1
124    VST1.32  {d6[0]},[r3],r5
125    VEXT.8   d6,d6,d6,#1
126    VST1.32  {d6[0]},[r3],r5
127    VEXT.8   d6,d6,d6,#1
128    VST1.32  {d6[0]},[r3]
129    B        L0x348
130OMX_VC_4x4_DIAG_DR:
131    VLD1.32  {d0[0]},[r1]
132    VLD1.8   {d1[7]},[r2]
133    ADD      r9,r0,r4
134    ADD      r10,r4,r4
135    ADD      r1,r3,r5
136    VLD1.8   {d1[6]},[r0],r10
137    VLD1.8   {d1[5]},[r9],r10
138    VLD1.8   {d1[4]},[r0]
139    VLD1.8   {d1[3]},[r9]
140    VEXT.8   d3,d1,d0,#3
141    ADD      r4,r1,r5
142    VEXT.8   d4,d1,d0,#4
143    ADD      r6,r4,r5
144    VEXT.8   d5,d1,d0,#5
145    VHADD.U8 d6,d3,d5
146    VRHADD.U8 d6,d6,d4
147    VST1.32  {d6[0]},[r6]
148    VEXT.8   d6,d6,d6,#1
149    VST1.32  {d6[0]},[r4]
150    VEXT.8   d6,d6,d6,#1
151    VST1.32  {d6[0]},[r1]
152    VEXT.8   d6,d6,d6,#1
153    VST1.32  {d6[0]},[r3]
154    B        L0x348
155OMX_VC_4x4_VR:
156    VLD1.32  {d0[0]},[r1]
157    VLD1.8   {d0[7]},[r2]
158    VLD1.8   {d1[7]},[r0],r4
159    VLD1.8   {d2[7]},[r0],r4
160    VLD1.8   {d1[6]},[r0]
161    VEXT.8   d12,d0,d0,#7
162    VEXT.8   d3,d1,d12,#6
163    VEXT.8   d4,d2,d12,#7
164    VEXT.8   d5,d1,d0,#7
165    VEXT.8   d6,d2,d0,#7
166    VEXT.8   d11,d1,d12,#7
167    VHADD.U8 d8,d6,d12
168    VRHADD.U8 d8,d8,d11
169    VHADD.U8 d7,d3,d5
170    VRHADD.U8 d7,d7,d4
171    VEXT.8   d10,d8,d8,#1
172    ADD      r11,r3,r5
173    ADD      r12,r5,r5
174    VEXT.8   d9,d7,d7,#1
175    VST1.32  {d10[0]},[r3],r12
176    VST1.32  {d9[0]},[r11],r12
177    VST1.32  {d8[0]},[r3],r12
178    VST1.32  {d7[0]},[r11]
179    B        L0x348
180OMX_VC_4x4_HD:
181    VLD1.8   {d0},[r1]
182    VLD1.8   {d1[7]},[r2]
183    ADD      r9,r0,r4
184    ADD      r10,r4,r4
185    VLD1.8   {d1[6]},[r0],r10
186    VLD1.8   {d1[5]},[r9],r10
187    VLD1.8   {d1[4]},[r0]
188    VLD1.8   {d1[3]},[r9]
189    VEXT.8   d3,d1,d0,#3
190    VEXT.8   d4,d1,d0,#2
191    VEXT.8   d5,d1,d0,#1
192    VHADD.U8 d7,d3,d5
193    VRHADD.U8 d7,d7,d4
194    VRHADD.U8 d8,d4,d3
195    VSHL.I64 d8,d8,#24
196    VSHL.I64 d6,d7,#16
197    VZIP.8   d8,d6
198    VEXT.8   d7,d7,d7,#6
199    VEXT.8   d8,d6,d7,#2
200    ADD      r11,r3,r5
201    ADD      r12,r5,r5
202    VST1.32  {d8[1]},[r3],r12
203    VST1.32  {d6[1]},[r11],r12
204    VST1.32  {d8[0]},[r3]
205    VST1.32  {d6[0]},[r11]
206    B        L0x348
207OMX_VC_4x4_VL:
208    TST      r7,#0x40
209    BEQ      L0x2b4
210    VLD1.8   {d3},[r1]
211    VEXT.8   d4,d3,d3,#1
212    VEXT.8   d5,d4,d4,#1
213    B        L0x2c8
214L0x2b4:
215    VLD1.32  {d0[1]},[r1]
216    VDUP.8   d2,d0[7]
217    VEXT.8   d3,d0,d2,#4
218    VEXT.8   d4,d0,d2,#5
219    VEXT.8   d5,d0,d2,#6
220L0x2c8:
221    VRHADD.U8 d7,d4,d3
222    VHADD.U8 d10,d3,d5
223    VRHADD.U8 d10,d10,d4
224    VEXT.8   d8,d7,d7,#1
225    ADD      r11,r3,r5
226    ADD      r12,r5,r5
227    VEXT.8   d9,d10,d8,#1
228    VST1.32  {d7[0]},[r3],r12
229    VST1.32  {d10[0]},[r11],r12
230    VST1.32  {d8[0]},[r3]
231    VST1.32  {d9[0]},[r11]
232    B        L0x348
233OMX_VC_4x4_HU:
234    ADD      r9,r0,r4
235    ADD      r10,r4,r4
236    VLD1.8   {d1[4]},[r0],r10
237    VLD1.8   {d1[5]},[r9],r10
238    VLD1.8   {d1[6]},[r0]
239    VLD1.8   {d1[7]},[r9]
240    VDUP.8   d2,d1[7]
241    VEXT.8   d3,d1,d2,#4
242    VEXT.8   d4,d1,d2,#5
243    VEXT.8   d5,d1,d2,#6
244    VHADD.U8 d7,d3,d5
245    VRHADD.U8 d7,d7,d4
246    VRHADD.U8 d8,d4,d3
247    VZIP.8   d8,d7
248    VST1.32  {d8[0]},[r3],r5
249    VEXT.8   d8,d8,d8,#2
250    VST1.32  {d8[0]},[r3],r5
251    VEXT.8   d8,d8,d8,#2
252    VST1.32  {d8[0]},[r3],r5
253    VST1.32  {d7[0]},[r3]
254L0x348:
255    MOV      r0,#0
256    VPOP     {d8-d12}
257    POP      {r4-r12,pc}
258    .endfunc
259
260    .end
261