1@/******************************************************************************
2@ *
3@ * Copyright (C) 2015 The Android Open Source Project
4@ *
5@ * Licensed under the Apache License, Version 2.0 (the "License");
6@ * you may not use this file except in compliance with the License.
7@ * You may obtain a copy of the License at:
8@ *
9@ * http://www.apache.org/licenses/LICENSE-2.0
10@ *
11@ * Unless required by applicable law or agreed to in writing, software
12@ * distributed under the License is distributed on an "AS IS" BASIS,
13@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14@ * See the License for the specific language governing permissions and
15@ * limitations under the License.
16@ *
17@ *****************************************************************************
18@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19@*/
20
21
22.data
23.p2align 2
24
25scratch_intrapred_luma_4x4_prediction:
26    .long ver, hor, d_c, dia_dl
27    .long dia_dr, ver_r, hor_d, ver_l
28    .long hor_u
29
30
31.text
32.p2align 2
33
34scratch_intrapred_luma_4x4_prediction_addr1:
35    .long scratch_intrapred_luma_4x4_prediction - scrintra_4x4 - 8
36
37
38
39@/**
40@******************************************************************************
41@*
42@* @brief :Evaluate best intra 4x4 mode
43@*                and do the prediction.
44@*
45@* @par Description
46@*   This function evaluates  4x4 modes and compute corresponding sad
47@*   and return the buffer predicted with best mode.
48@*
49@* @param[in] pu1_src
50@*  UWORD8 pointer to the source
51@*
52@** @param[in] pu1_ngbr_pels
53@*  UWORD8 pointer to neighbouring pels
54@*
55@* @param[out] pu1_dst
56@*  UWORD8 pointer to the destination
57@*
58@* @param[in] src_strd
59@*  integer source stride
60@*
61@* @param[in] dst_strd
62@*  integer destination stride
63@*
64@* @param[in] u4_n_avblty
65@* availability of neighbouring pixels
66@*
67@* @param[in] u4_intra_mode
68@* Pointer to the variable in which best mode is returned
69@*
70@* @param[in] pu4_sadmin
71@* Pointer to the variable in which minimum cost is returned
72@*
73@* @param[in] u4_valid_intra_modes
74@* Says what all modes are valid
75@*
76@* * @param[in] u4_lambda
77@* Lamda value for computing cost from SAD
78@*
79@* @param[in] u4_predictd_mode
80@* Predicted mode for cost computation
81@*
82@*
83@*
84@* @return      none
85@*
86@******************************************************************************
87@*/
88@void ih264e_evaluate_intra_4x4_modes(UWORD8 *pu1_src,
89@                                     UWORD8 *pu1_ngbr_pels,
90@                                     UWORD8 *pu1_dst,
91@                                     UWORD32 src_strd,
92@                                    UWORD32 dst_strd,
93@                                     WORD32 u4_n_avblty,
94@                                     UWORD32 *u4_intra_mode,
95@                                     WORD32 *pu4_sadmin,
96@                                     UWORD32 u4_valid_intra_modes,
97@                                     UWORD32  u4_lambda,
98@                                     UWORD32 u4_predictd_mode)
99
100
101
102    .global ih264e_evaluate_intra_4x4_modes_a9q
103
104ih264e_evaluate_intra_4x4_modes_a9q:
105
106@r0 = pu1_src,
107@r1 = pu1_ngbr_pels_i16,
108@r2 = pu1_dst,
109@r3 = src_strd,
110@r4 = dst_strd,
111@r5 = u4_n_avblty,
112@r6 = u4_intra_mode,
113@r7 = pu4_sadmin
114@r8 = u4_valid_intra_modes
115@r0 =u4_lambda
116@r1 = u4_predictd_mode
117
118
119    stmfd         sp!, {r4-r12, r14}    @store register values to stack
120
121@--------------------
122    ldr           r5, [sp, #44]         @r5 = u4_n_avblty,
123@----------------------
124    vpush         {d8-d15}
125@Loading neighbours
126    vld1.32       {q0}, [r1]
127    add           r4, r1, #12
128    vld1.8        d1[5], [r4]
129    vld1.8        d1[7], [r1]
130    @--------------------------------
131    ldr           r8, [sp, #120]        @u4_valid_intra_modes
132@----------------------------------------------
133
134
135
136@ LOADING pu1_src
137    vld1.32       {d20[0]}, [r0], r3
138    vext.8        q1, q0, q0, #1
139    vld1.32       {d20[1]}, [r0], r3
140    mov           r11, #1
141    vld1.32       {d21[0]}, [r0], r3
142    lsl           r11, r11, #30
143    vld1.32       {d21[1]}, [r0], r3
144
145
146
147@--------------------------------
148    ldr           r0, [sp, #124]        @r0 =u4_lambda
149    ldr           r1, [sp, #128]        @r1 = u4_predictd_mode
150@------
151
152
153vert:
154    ands          r10, r8, #01          @VERT sad ??
155    beq           horz
156    vdup.32       q2, d2[1]
157    vabdl.u8      q14, d4, d20
158    vabal.u8      q14, d4, d21
159    vadd.i16      d28, d29, d28
160    subs          r6, r1, #0
161    vpaddl.u16    d28, d28              @
162    lslne         r6, r0, #2
163    vpaddl.u32    d28, d28              @/
164    moveq         r6, r0                @
165    vmov.u32      r9, d28[0]            @ vert
166    add           r9, r6, r9
167
168    subs          r6, r11, r9
169    movgt         r11, r9
170    movgt         r12, #0
171
172horz:
173    ands          r10, r8, #02          @HORZ sad ??
174    beq           dc
175    vdup.32       q3, d0[0]
176    vmov.32       q4, q3
177    vtrn.8        q3, q4
178    vtrn.16       d7, d6
179    vtrn.16       d9, d8
180    vtrn.32       d9, d7
181    vtrn.32       d8, d6
182    vabdl.u8      q14, d6, d20
183    subs          r6, r1, #1
184    vabal.u8      q14, d7, d21
185    vadd.i16      d28, d29, d28
186    lslne         r6, r0, #2
187    vpaddl.u16    d28, d28              @
188    vpaddl.u32    d28, d28              @/
189    vmov.u32      r9, d28[0]            @
190    moveq         r6, r0                @
191    add           r9, r6, r9
192
193    subs          r6, r11, r9
194    movgt         r11, r9
195    movgt         r12, #1
196
197dc:
198    ands          r10, r8, #04          @DC sad ??
199    beq           diags
200    vext.8        q4, q0, q0, #5
201    vaddl.u8      q4, d0, d8
202    vpaddl.u16    d8, d8                @
203    vpaddl.u32    d8, d8                @/
204    vmov.u32      r4, d8[0]             @
205    mov           r14, #1
206    ands          r10, r5, #1
207    addne         r4, r4, #2
208    addne         r14, r14, #1
209    ands          r10, r5, #4
210    addne         r4, r4, #2
211    addne         r14, r14, #1
212    ands          r10, r5, #5
213    moveq         r4, #128
214    moveq         r14, #0
215    subs          r6, r1, #2
216    lsr           r4, r4, r14
217    vdup.8        q4, r4
218    lslne         r6, r0, #2
219    vabdl.u8      q14, d8, d20
220    vabal.u8      q14, d9, d21
221    vadd.i16      d28, d29, d28
222    vpaddl.u16    d28, d28              @
223    vpaddl.u32    d28, d28              @/
224    vmov.u32      r9, d28[0]            @
225
226    moveq         r6, r0                @
227    add           r9, r6, r9
228
229    subs          r6, r11, r9
230    movgt         r11, r9
231    movgt         r12, #2
232
233diags:
234    ands          r10, r8, #504         @/* if modes other than VERT, HORZ and DC are  valid ????*/
235    beq           pred
236    @/* Performing FILT11 and FILT121 operation for all neighbour values*/
237    vext.8        q5, q0, q0, #2
238    vaddl.u8      q6, d0, d2
239    vaddl.u8      q7, d1, d3
240    vaddl.u8      q8, d10, d2
241    vaddl.u8      q9, d11, d3
242    vadd.u16      q12, q10, q11
243    vqrshrun.s16  d10, q6, #1
244    vqrshrun.s16  d11, q7, #1
245    vadd.u16      q11, q6, q8
246    vadd.u16      q12, q7, q9
247    vqrshrun.s16  d12, q11, #2
248    vqrshrun.s16  d13, q12, #2
249    mov           r14, #0
250    vdup.32       q13 , r14
251    mov           r14, #-1
252    vmov.i32      d26[0], r14
253
254diag_dl:
255    ands          r10, r8, #0x08        @DIAG_DL sad ??
256    beq           diag_dr
257
258    vext.8        q15, q6, q6, #5
259    vbit.32       d14, d30, d26
260    vext.8        q15, q6, q6, #15
261    vbit.32       d15, d31, d26
262    vext.8        q15, q6, q6, #2
263    vext.32       q14, q13, q13, #3
264    vbit.32       d14, d30, d28
265    vext.8        q15, q6, q6, #4
266    vbit.32       d15, d30, d28
267    vabdl.u8      q14, d14, d20
268    subs          r6, r1, #3
269    vabal.u8      q14, d15, d21
270    vadd.i16      d28, d29, d28
271    vpaddl.u16    d28, d28              @
272    lslne         r6, r0, #2
273    vpaddl.u32    d28, d28              @/
274    vmov.u32      r9, d28[0]            @
275
276    moveq         r6, r0                @
277    add           r9, r6, r9
278
279    subs          r6, r11, r9
280    movgt         r11, r9
281    movgt         r12, #3
282
283diag_dr:
284    ands          r10, r8, #16          @DIAG_DR sad ??
285    beq           vert_r
286
287    vext.8        q15, q6, q6, #3
288    vbit.32       d16, d30, d26
289    vext.8        q15, q6, q6, #1
290    vbit.32       d17, d30, d26
291    vext.8        q15, q6, q6, #4
292    vext.32       q14, q13, q13, #3
293    vbit.32       d17, d31, d28
294    vext.8        q15, q6, q6, #6
295    vbit.32       d16, d31, d28
296    vabdl.u8      q14, d16, d20
297    subs          r6, r1, #4
298    vabal.u8      q14, d17, d21
299    vadd.i16      d28, d29, d28
300    vpaddl.u16    d28, d28              @
301    lslne         r6, r0, #2
302    vpaddl.u32    d28, d28              @/
303    vmov.u32      r9, d28[0]            @
304
305    moveq         r6, r0                @
306    add           r9, r6, r9
307
308    subs          r6, r11, r9
309    movgt         r11, r9
310    movgt         r12, #4
311
312vert_r:
313    ands          r10, r8, #32          @VERT_R sad ??
314    beq           horz_d
315    vext.8        q15, q5, q5, #4
316    vbit.32       d18, d30, d26
317    vext.8        q15, q5, q5, #3
318    vbit.32       d19, d30, d26
319    vext.32       q14, q13, q13, #3
320    vext.8        q15, q6, q6, #15
321    vbit.32       d18, d30, d28
322    vext.8        q15, q6, q6, #14
323    vbit.32       d19, d30, d28
324    mov           r14, #0
325    vdup.32       q14 , r14
326    mov           r14, #0xff
327    vmov.i8       d28[0], r14
328    vext.8        q15, q6, q6, #2
329    vbit.32       d19, d30, d28
330    vext.32       q14, q14, q14, #3
331    subs          r6, r1, #5
332    vext.8        q15, q6, q6, #13
333    vbit.32       d19, d30, d28
334    lslne         r6, r0, #2
335    vabdl.u8      q14, d18, d20
336    vabal.u8      q14, d19, d21
337    vadd.i16      d28, d29, d28
338    vpaddl.u16    d28, d28              @
339    vpaddl.u32    d28, d28              @/
340    vmov.u32      r9, d28[0]            @
341
342
343    moveq         r6, r0                @
344    add           r9, r6, r9
345
346    subs          r6, r11, r9
347    movgt         r11, r9
348    movgt         r12, #5
349
350horz_d:
351    vmov.8        q1, q5
352    vmov.8        q15, q6
353    vzip.8        q1, q15
354
355    ands          r10, r8, #64          @HORZ_D sad ??
356    beq           vert_l
357    vext.8        q15, q6, q6, #2
358    vbit.32       d8, d30, d26
359    mov           r14, #0
360    vdup.32       q14 , r14
361    mov           r14, #0xff
362    vmov.i8       d28[0], r14
363    vext.8        q15, q5, q5, #3
364    vbit.32       d8, d30, d28
365    vext.8        q15, q1, q1, #2
366    vbit.32       d9, d30, d26
367    vext.32       q14, q13, q13, #3
368    vbit.32       d8, d2, d28
369    subs          r6, r1, #6
370    vext.8        q15, q1, q1, #12
371    vbit.32       d9, d30, d28
372    vabdl.u8      q14, d8, d20
373    vabal.u8      q14, d9, d21
374    vadd.i16      d28, d29, d28
375    vpaddl.u16    d28, d28              @
376    lslne         r6, r0, #2
377    vpaddl.u32    d28, d28              @/
378    vmov.u32      r9, d28[0]            @
379
380
381    moveq         r6, r0                @
382    add           r9, r6, r9
383
384    subs          r6, r11, r9
385    movgt         r11, r9
386    movgt         r12, #6
387vert_l:
388    ands          r10, r8, #128         @VERT_L sad ??
389    beq           horz_u
390    vext.8        q15, q5, q5, #5
391    vbit.32       d24, d30, d26
392    vext.8        q15, q15, q15, #1
393    vbit.32       d25, d30, d26
394    vext.8        q15, q6, q6, #1
395    vext.32       q14, q13, q13, #3
396    vbit.32       d24, d30, d28
397    vext.8        q15, q15, q15, #1
398    subs          r6, r1, #7
399    vbit.32       d25, d30, d28
400    vabdl.u8      q14, d24, d20
401    vabal.u8      q14, d25, d21
402    vadd.i16      d28, d29, d28
403    vpaddl.u16    d28, d28              @
404    lslne         r6, r0, #2
405    vpaddl.u32    d28, d28              @/
406    vmov.u32      r9, d28[0]            @
407
408    moveq         r6, r0                @
409    add           r9, r6, r9
410
411    subs          r6, r11, r9
412    movgt         r11, r9
413    movgt         r12, #7
414
415horz_u:
416    ands          r10, r8, #256         @HORZ_U sad ??
417    beq           pred
418    vrev64.8      q5, q1
419    vdup.8        q1, d0[0]
420    vext.8        q6, q6, #7
421    mov           r14, #0
422    vdup.32       q14 , r14
423    mov           r14, #0xff
424    vmov.i8       d28[0], r14
425    vbit.32       d11, d13, d28
426    movw          r14, #0xffff
427    vmov.i16      d28[0], r14
428    vext.8        q6, q5, q5, #7
429    subs          r6, r1, #8
430    vbit.32       d3, d12, d28
431    vext.8        q6, q5, q5, #3
432    vbit.32       d2, d12, d26
433    vext.32       q14, q13, q13, #3
434    vext.8        q6, q5, q5, #1
435    vbit.32       d2, d12, d28
436    vabdl.u8      q14, d2, d20
437    vabal.u8      q14, d3, d21
438    vadd.i16      d28, d29, d28
439    vpaddl.u16    d28, d28              @
440    lslne         r6, r0, #2
441    vpaddl.u32    d28, d28              @/
442    vmov.u32      r9, d28[0]            @
443
444
445    moveq         r6, r0                @
446    add           r9, r6, r9
447
448    subs          r6, r11, r9
449    movgt         r11, r9
450    movgt         r12, #8
451
452pred: @/*dOING FINAL PREDICTION*/
453@---------------------------
454    ldr           r7, [sp, #116]        @r7 = pu4_sadmin
455    ldr           r6, [sp, #112]        @ R6 =MODE
456@--------------------------
457    str           r11, [r7]             @/STORING MIN SAD*/
458    str           r12, [r6]             @/FINAL MODE*/
459
460
461    ldr           r3, scratch_intrapred_luma_4x4_prediction_addr1
462scrintra_4x4:
463    add           r3, r3, pc
464    lsl           r12, r12, #2
465    add           r3, r3, r12
466
467    ldr           r5, [r3]
468    and           r5, r5, #0xfffffffe
469
470    bx            r5
471
472
473ver:
474    vext.8        q0, q0, q0, #1
475    vdup.32       q15, d0[1]
476    b             store
477
478hor:
479    vmov.32       q15, q3
480    b             store
481
482d_c:
483    vdup.8        q15, r4
484    b             store
485
486dia_dl:
487    vmov.32       q15, q7
488    b             store
489
490dia_dr:
491    vmov.32       q15, q8
492    b             store
493
494ver_r:
495    vmov.32       q15, q9
496    b             store
497
498hor_d:
499    vmov.32       q15, q4
500    b             store
501
502ver_l:
503    vmov.32       q15, q12
504    b             store
505
506hor_u:
507    vmov.32       q15, q1
508
509store: @/* storing to pu1_dst*/
510
511    ldr           r4, [sp, #104]        @r4 = dst_strd,
512
513    vst1.32       {d30[0]}, [r2], r4
514    vst1.32       {d30[1]}, [r2], r4
515    vst1.32       {d31[0]}, [r2], r4
516    vst1.32       {d31[1]}, [r2], r4
517
518
519end_func:
520    vpop          {d8-d15}
521    ldmfd         sp!, {r4-r12, pc}     @Restoring registers from stack
522
523
524
525
526
527