summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DecodeCoeffsToPair_s.S
blob: 8e0db37fcca6d2a3a392009ddd843bb839db202f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/*
 * Copyright (C) 2007-2008 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
/*
 *
 */

    .eabi_attribute 24, 1
    .eabi_attribute 25, 1

    .arm
    .fpu neon
    .text

    .extern   armVCM4P10_CAVLCCoeffTokenTables
    .extern   armVCM4P10_SuffixToLevel
    .extern   armVCM4P10_CAVLCTotalZeros2x2Tables
    .extern   armVCM4P10_CAVLCTotalZeroTables
    .extern   armVCM4P10_CAVLCRunBeforeTables
    .extern   armVCM4P10_ZigZag_2x2
    .extern   armVCM4P10_ZigZag_4x4

    .hidden   armVCM4P10_CAVLCCoeffTokenTables
    .hidden   armVCM4P10_SuffixToLevel
    .hidden   armVCM4P10_CAVLCTotalZeros2x2Tables
    .hidden   armVCM4P10_CAVLCTotalZeroTables
    .hidden   armVCM4P10_CAVLCRunBeforeTables
    .hidden   armVCM4P10_ZigZag_2x2
    .hidden   armVCM4P10_ZigZag_4x4

    .global armVCM4P10_DecodeCoeffsToPair
    .func   armVCM4P10_DecodeCoeffsToPair
armVCM4P10_DecodeCoeffsToPair:
    PUSH     {r4-r12,lr}
    SUB      sp,sp,#0x40
    LDR      r10,[r0,#0]
    LDR      r12,[r1,#0]
    LDR      r6, .LarmVCM4P10_CAVLCCoeffTokenTables
P0: ADD      r6, pc
    LDR      r4,[sp,#0x68]
    LDRB     r9,[r10,#2]
    LDRB     r8,[r10,#1]
    LDRB     r11,[r10],#3
    ADD      r12,r12,#8
    LDR      r6,[r6,r4,LSL #2]
    ORR      r9,r9,r8,LSL #8
    ORR      r11,r9,r11,LSL #16
    LSLS     r8,r11,r12
    MOVS     r7,#0x1e
    AND      r7,r7,r8,LSR #27
    SUBS     r12,r12,#8
L0x44:
    BCC      L1
    LDRB     r8,[r10],#1
L1:
    LDRH     r7,[r6,r7]
    ADDCC    r12,r12,#8
    ADD      r12,r12,#4
    ORRCS    r11,r8,r11,LSL #8
    LSRS     r8,r7,#1
    BCS      L0x74
    LSLS     r8,r11,r12
    SUBS     r12,r12,#0xa
    ADD      r7,r7,r8,LSR #29
    BIC      r7,r7,#1
    B        L0x44
L0x74:
    SUB      r12,r12,r7,LSR #13
    BIC      r7,r8,#0xf000
    LSRS     r5,r7,#2
    STRB     r5,[r2,#0]
    BEQ      L0x344
    CMP      r7,#0x44
    BGE      L0x33c
    STR      r0,[sp,#0]
    STR      r1,[sp,#4]
    STR      r3,[sp,#8]
    ANDS     r1,r7,#3
    ADD      r2,sp,#0xc
    BEQ      L0xd8
    MOV      r0,r1
L0xac:
    LSLS     r7,r11,r12
    SUBS     r12,r12,#7
    BCC      L2
    LDRB     r8,[r10],#1
L2:
    ADDCC    r12,r12,#8
    LSR      r7,r7,#31
    ORRCS    r11,r8,r11,LSL #8
    SUBS     r0,r0,#1
    MOV      r8,#1
    SUB      r8,r8,r7,LSL #1
    STRH     r8,[r2],#2
    BGT      L0xac
L0xd8:
    SUBS     r0,r5,r1
    BEQ      L0x1b8
    MOV      r4,#1
    CMP      r5,#0xa
    MOVLE    r4,#0
    CMP      r1,#3
    MOVLT    r1,#4
    MOVGE    r1,#2
    MOVGE    r4,#0
L0xfc:
    LSLS     r7,r11,r12
    CLZ      r7,r7
    ADD      r12,r12,r7
    SUBS     r12,r12,#7
    BCC      L3
    LDRB     r8,[r10],#1
    ORR      r11,r8,r11,LSL #8
    SUBS     r12,r12,#8
    BCC      L3
    LDRB     r8,[r10],#1
L3:
    ADDCC    r12,r12,#8
    ORRCS    r11,r8,r11,LSL #8
    CMP      r7,#0x10
    BGE      L0x33c
    MOVS     lr,r4
    TEQEQ    r7,#0xe
    MOVEQ    lr,#4
    TEQ      r7,#0xf
    MOVEQ    lr,#0xc
    TEQEQ    r4,#0
    ADDEQ    r7,r7,#0xf
    TEQ      lr,#0
    BEQ      L0x184
    LSL      r3,r11,r12
    ADD      r12,r12,lr
    SUBS     r12,r12,#8
    RSB      r9,lr,#0x20
    BCC      L4
    LDRB     r8,[r10],#1
    ORR      r11,r8,r11,LSL #8
    SUBS     r12,r12,#8
    BCC      L4
    LDRB     r8,[r10],#1
L4:
    ADDCC    r12,r12,#8
    LSR      r3,r3,r9
    ORRCS    r11,r8,r11,LSL #8
    LSL      r7,r7,r4
    ADD      r7,r3,r7
L0x184:
    ADD      r7,r7,r1
    MOV      r1,#2
    LSRS     r8,r7,#1
    RSBCS    r8,r8,#0
    STRH     r8,[r2],#2
    LDR      r9, .LarmVCM4P10_SuffixToLevel
P1: ADD      r9, pc
    LDRSB    r8,[r9,r4]
    TEQ      r4,#0
    MOVEQ    r4,#1
    CMP      r7,r8
    ADDCS    r4,r4,#1
    SUBS     r0,r0,#1
    BGT      L0xfc
L0x1b8:
    LDR      r8,[sp,#0x6c]
    SUB      r0,r5,#1
    SUBS     r1,r8,r5
    ADD      r4,sp,#0x2c
    MOV      lr,r5
    SUB      lr,lr,#1
    BEQ      L0x2b0
    TEQ      r8,#4
    LDREQ    r6, .LarmVCM4P10_CAVLCTotalZeros2x2Tables
    LDRNE    r6, .LarmVCM4P10_CAVLCTotalZeroTables
P2: ADD      r6, pc
    LDR      r6,[r6,r5,LSL #2]
    LSLS     r8,r11,r12
    MOVS     r7,#0x1e
    AND      r7,r7,r8,LSR #27
    SUBS     r12,r12,#8
L0x1f4:
    BCC      L5
    LDRB     r8,[r10],#1
L5:
    LDRH     r7,[r6,r7]
    ADDCC    r12,r12,#8
    ADD      r12,r12,#4
    ORRCS    r11,r8,r11,LSL #8
    LSRS     r8,r7,#1
    BCS      L0x224
    LSLS     r8,r11,r12
    SUBS     r12,r12,#0xa
    ADD      r7,r7,r8,LSR #29
    BIC      r7,r7,#1
    B        L0x1f4
L0x224:
    SUB      r12,r12,r7,LSR #13
    BIC      r7,r8,#0xf000
    CMP      r7,#0x10
    BGE      L0x33c
    LDR      r3, .LarmVCM4P10_CAVLCRunBeforeTables
P3: ADD      r3, pc
    ADD      r4,sp,#0x2c
    MOVS     r1,r7
    ADD      lr,lr,r1
    BEQ      L0x2b0
L0x248:
    SUBS     r0,r0,#1
    LDR      r6,[r3,r1,LSL #2]
    BLT      L0x2bc
    LSLS     r8,r11,r12
    MOVS     r7,#0xe
    AND      r7,r7,r8,LSR #28
    SUBS     r12,r12,#8
L0x264:
    BCC      L6
    LDRB     r8,[r10],#1
L6:
    LDRH     r7,[r6,r7]
    ADDCC    r12,r12,#8
    ADD      r12,r12,#3
    ORRCS    r11,r8,r11,LSL #8
    LSRS     r8,r7,#1
    BCS      L0x294
    LSLS     r8,r11,r12
    SUBS     r12,r12,#9
    ADD      r7,r7,r8,LSR #29
    BIC      r7,r7,#1
    B        L0x264
L0x294:
    SUB      r12,r12,r7,LSR #13
    BIC      r7,r8,#0xf000
    CMP      r7,#0xf
    BGE      L0x33c
    SUBS     r1,r1,r7
    STRB     r7,[r4],#1
    BGT      L0x248
L0x2b0:
    SUBS     r0,r0,#1
    BLT      L7
    STRB     r1,[r4],#1
L7:
    BGT      L0x2b0
L0x2bc:
    STRB     r1,[r4],#1
    LDR      r8,[sp,#0x6c]
    TEQ      r8,#0xf
    ADDEQ    lr,lr,#1
    SUB      r4,r4,r5
    SUB      r2,r2,r5
    SUB      r2,r2,r5
    LDR      r3,[sp,#8]
    LDR      r0,[r3,#0]
    TEQ      r8,#4
    LDREQ    r6, .LarmVCM4P10_ZigZag_2x2
    LDRNE    r6, .LarmVCM4P10_ZigZag_4x4
P4: ADD      r6, pc
L0x2ec:
    LDRB     r9,[r4],#1
    LDRB     r8,[r6,lr]
    SUB      lr,lr,#1
    SUB      lr,lr,r9
    LDRSH    r9,[r2],#2
    SUBS     r5,r5,#1
    ORREQ    r8,r8,#0x20
    ADD      r1,r9,#0x80
    CMP      r1,#0x100
    ORRCS    r8,r8,#0x10
    TEQ      r5,#0
    STRB     r8,[r0],#1
    STRB     r9,[r0],#1
    LSR      r9,r9,#8
    BCC      L8
    STRB     r9,[r0],#1
L8:
    BNE      L0x2ec
    STR      r0,[r3,#0]
    LDR      r0,[sp,#0]
    LDR      r1,[sp,#4]
    B        L0x344
L0x33c:
    MVN      r0,#1
    B        L0x35c
L0x344:
    ADD      r10,r10,r12,LSR #3
    AND      r12,r12,#7
    SUB      r10,r10,#4
    STR      r12,[r1,#0]
    STR      r10,[r0,#0]
    MOV      r0,#0
L0x35c:
    ADD      sp,sp,#0x40
    POP      {r4-r12,pc}
    .endfunc

.LarmVCM4P10_CAVLCCoeffTokenTables:
    .word   armVCM4P10_CAVLCCoeffTokenTables-(P0+8)
.LarmVCM4P10_SuffixToLevel:
    .word   armVCM4P10_SuffixToLevel-(P1+8)
.LarmVCM4P10_CAVLCTotalZeros2x2Tables:
    .word   (armVCM4P10_CAVLCTotalZeros2x2Tables - 4)-(P2+8)
.LarmVCM4P10_CAVLCTotalZeroTables:
    .word   (armVCM4P10_CAVLCTotalZeroTables - 4)-(P2+8)
.LarmVCM4P10_CAVLCRunBeforeTables:
    .word   (armVCM4P10_CAVLCRunBeforeTables - 4)-(P3+8)
.LarmVCM4P10_ZigZag_2x2:
    .word   armVCM4P10_ZigZag_2x2-(P4+8)
.LarmVCM4P10_ZigZag_4x4:
    .word   armVCM4P10_ZigZag_4x4-(P4+8)

    .end