1@/*****************************************************************************
2@*
3@* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
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@/**
19@*******************************************************************************
20@* @file
21@*  ihevc_intra_pred_filters_vert.s
22@*
23@* @brief
24@*  contains function definitions for intra prediction dc filtering.
25@* functions are coded using neon  intrinsics and can be compiled using
26
27@* rvct
28@*
29@* @author
30@*  akshaya mukund
31@*
32@* @par list of functions:
33@*
34@*
35@* @remarks
36@*  none
37@*
38@*******************************************************************************
39@*/
40@/**
41@*******************************************************************************
42@*
43@* @brief
44@*    luma intraprediction filter for dc input
45@*
46@* @par description:
47@*
48@* @param[in] pu1_ref
49@*  uword8 pointer to the source
50@*
51@* @param[out] pu1_dst
52@*  uword8 pointer to the destination
53@*
54@* @param[in] src_strd
55@*  integer source stride
56@*
57@* @param[in] dst_strd
58@*  integer destination stride
59@*
60@* @param[in] nt
61@*  size of tranform block
62@*
63@* @param[in] mode
64@*  type of filtering
65@*
66@* @returns
67@*
68@* @remarks
69@*  none
70@*
71@*******************************************************************************
72@*/
73
74@void ihevc_intra_pred_luma_ver(uword8* pu1_ref,
75@                               word32 src_strd,
76@                               uword8* pu1_dst,
77@                               word32 dst_strd,
78@                               word32 nt,
79@                               word32 mode)
80@
81@**************variables vs registers*****************************************
82@r0 => *pu1_ref
83@r1 => src_strd
84@r2 => *pu1_dst
85@r3 => dst_strd
86
87@stack contents from #40
88@   nt
89@   mode
90
91.text
92.align 4
93
94
95
96
97.globl ihevc_intra_pred_luma_ver_a9q
98
99.type ihevc_intra_pred_luma_ver_a9q, %function
100
101ihevc_intra_pred_luma_ver_a9q:
102
103    stmfd       sp!, {r4-r12, r14}          @stack stores the values of the arguments
104
105    ldr         r4,[sp,#40]                 @loads nt
106
107    lsl         r5, r4, #1                  @2nt
108
109    cmp         r4, #16
110    beq         blk_16
111    blt         blk_4_8
112
113    add         r5, r5, #1                  @2nt+1
114    add         r6, r0, r5                  @&src[2nt+1]
115
116copy_32:
117    add         r5, r2, r3
118    vld1.8      {d20,d21}, [r6]!            @16 loads (col 0:15)
119    add         r8, r5, r3
120
121    add         r10, r8, r3
122    vld1.8      {d22,d23}, [r6]             @16 loads (col 16:31)
123    lsl         r11, r3, #2
124
125    add         r11, r11, #0xfffffff0
126    vst1.8      {d20,d21}, [r2]!
127    vst1.8      {d20,d21}, [r5]!
128    vst1.8      {d20,d21}, [r8]!
129    vst1.8      {d20,d21}, [r10]!
130
131    vst1.8      {d22,d23}, [r2], r11
132    vst1.8      {d22,d23}, [r5], r11
133    vst1.8      {d22,d23}, [r8], r11
134    vst1.8      {d22,d23}, [r10], r11
135
136    subs        r4, r4, #8
137
138kernel_copy_32:
139    vst1.8      {d20,d21}, [r2]!
140    vst1.8      {d20,d21}, [r5]!
141    vst1.8      {d20,d21}, [r8]!
142    vst1.8      {d20,d21}, [r10]!
143
144    vst1.8      {d22,d23}, [r2], r11
145    vst1.8      {d22,d23}, [r5], r11
146    vst1.8      {d22,d23}, [r8], r11
147    vst1.8      {d22,d23}, [r10], r11
148
149    subs        r4, r4, #8
150
151    vst1.8      {d20,d21}, [r2]!
152    vst1.8      {d20,d21}, [r5]!
153    vst1.8      {d20,d21}, [r8]!
154    vst1.8      {d20,d21}, [r10]!
155
156    vst1.8      {d22,d23}, [r2], r11
157    vst1.8      {d22,d23}, [r5], r11
158    vst1.8      {d22,d23}, [r8], r11
159    vst1.8      {d22,d23}, [r10], r11
160
161    bne         kernel_copy_32
162
163    vst1.8      {d20,d21}, [r2]!
164    vst1.8      {d20,d21}, [r5]!
165    vst1.8      {d20,d21}, [r8]!
166    vst1.8      {d20,d21}, [r10]!
167
168    vst1.8      {d22,d23}, [r2], r11
169    vst1.8      {d22,d23}, [r5], r11
170    vst1.8      {d22,d23}, [r8], r11
171    vst1.8      {d22,d23}, [r10], r11
172
173    b           end_func
174
175blk_16:
176    add         r6, r0, r5                  @&src[2nt]
177
178    ldrb        r11, [r6], #1               @src[2nt]
179
180    vdup.8      q11, r11                    @src[2nt]
181    ldrb        r12, [r6]                   @src[2nt+1]
182
183    vld1.8      {d16,d17}, [r6]             @ld for repl to cols src[2nt+1+col(0:15)] (0 ignored for stores)
184    add         r6, r6, #0xffffffef         @subtract -9 to take it to src[2nt-1-row(15)]
185
186    vdup.8      q12, r12                    @src[2nt+1]
187    vdup.16     q15, r12
188    lsl         r5, r3, #3                  @8*stride
189
190    vld1.8      {d26,d27}, [r6]!            @load src[2nt-1-row](rows 0:15)
191    add         r5, r2, r5                  @r5 ->
192
193    vmov.i64    d18, #0x00000000000000ff
194    vhsub.u8    q13, q13, q11               @(src[2nt-1-row] - src[2nt])>>1
195    @vsubl.u8   q0, d26, d22
196    @vsubl.u8   q14, d27, d22
197
198    @vshr.s16   q0, q0, #1
199    @vshr.s16   q14, q14, #1
200
201    vmov.i64    d19, d17
202    @vaddl.s8   q0, d24, d26
203    vmovl.s8    q0, d26
204    vmovl.s8    q14, d27
205    vqadd.s16   q0, q0, q15
206    vqadd.s16   q14, q14, q15
207
208    vmov.i64    d10, #0x00000000000000ff
209    @vaddl.s8   q1, d25, d27
210
211    vqmovun.s16 d25, q0
212    vqmovun.s16 d24, q14
213    @vmovn.u16  d25, q0
214    @vmovn.u16  d24, q1
215
216
217    vrev64.8    q12, q12
218
219    vmov.i64    d11, d17
220
221    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
222    vbsl        d10, d25, d16
223
224    vmov.i64    d8, #0x00000000000000ff
225    vmov.i64    d9, d17
226
227    vmov.i64    d6, #0x00000000000000ff
228    vmov.i64    d7, d17
229
230    vst1.8      {d18,d19}, [r2], r3
231    vshr.s64    d24, d24, #8
232
233    vst1.8      {d10,d11}, [r5], r3
234    vshr.s64    d25, d25, #8
235
236
237    vbsl        d8, d24, d16
238    vbsl        d6, d25, d16
239
240    vst1.8      {d8,d9}, [r2], r3
241    vshr.s64    d24, d24, #8
242
243    vst1.8      {d6,d7}, [r5], r3
244    vshr.s64    d25, d25, #8
245
246    subs        r4, #8
247
248    vmov.i64    d18, #0x00000000000000ff
249    @vmov.i64   d19, d17
250
251    vmov.i64    d10, #0x00000000000000ff
252    @vmov.i64   d11, d17
253
254
255loop_16:
256
257
258    vmov.i64    d8, #0x00000000000000ff
259
260    vmov.i64    d6, #0x00000000000000ff
261
262    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
263    vbsl        d10, d25, d16
264
265    vst1.8      {d18,d19}, [r2], r3
266    vshr.s64    d24, d24, #8
267
268    vst1.8      {d10,d11}, [r5], r3
269    vshr.s64    d25, d25, #8
270
271    vmov.i64    d18, #0x00000000000000ff
272
273    vmov.i64    d10, #0x00000000000000ff
274
275    vbsl        d8, d24, d16
276    vbsl        d6, d25, d16
277
278    vst1.8      {d8,d9}, [r2], r3
279    vshr.s64    d24, d24, #8
280
281    vst1.8      {d6,d7}, [r5], r3
282    vshr.s64    d25, d25, #8
283
284    subs        r4, r4, #4
285
286    bne         loop_16
287
288    vmov.i64    d8, #0x00000000000000ff
289
290    vmov.i64    d6, #0x00000000000000ff
291
292    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
293    vbsl        d10, d25, d16
294
295    vst1.8      {d18,d19}, [r2], r3
296    vshr.s64    d24, d24, #8
297
298    vst1.8      {d10,d11}, [r5], r3
299    vshr.s64    d25, d25, #8
300
301    vbsl        d8, d24, d16
302    vbsl        d6, d25, d16
303
304    vst1.8      {d8,d9}, [r2], r3
305
306    vst1.8      {d6,d7}, [r5], r3
307
308    b           end_func
309
310
311blk_4_8:
312    vmov.i64    d11, #0x00000000000000ff
313    add         r6, r0, r5                  @&src[2nt]
314
315    vmov.i64    d10, #0x00000000000000ff
316    ldrb        r11, [r6], #1               @src[2nt]
317
318    vdup.8      d22, r11                    @src[2nt]
319    ldrb        r12, [r6]                   @src[2nt+1]
320
321    vld1.8      d16, [r6]                   @ld for repl to cols src[2nt+1+col(0:3 or 0:7)](0 ignored for st)
322    add         r6, r6, #0xfffffff7         @subtract -9 to take it to src[2nt-1-row(15)]
323
324    vdup.8      d24, r12                    @src[2nt+1]
325    vdup.16     q15, r12
326
327    vld1.8      d26, [r6]!                  @load src[2nt-1-row](rows 0:15)
328
329    vmov.i64    d18, #0x00000000000000ff
330    vhsub.u8    d26, d26, d22               @(src[2nt-1-row] - src[2nt])>>1
331    @vsubl.u8   q13, d26, d22
332
333    @vshr.s16   q13, q13, #1
334
335    vmov.i64    d19, #0x00000000000000ff
336    vmovl.s8    q13, d26
337    @vaddl.s8   q0, d24, d26
338    vqadd.s16   q0, q13, q15
339
340    vqmovun.s16 d24, q0
341    @vmovn.s16  d24, q0
342
343    vrev64.8    d24, d24
344
345    cmp         r4, #4
346    beq         blk_4
347
348    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
349
350    vst1.8      d18, [r2], r3
351    vshr.s64    d24, d24, #8
352
353    vmov.i64    d18, #0x00000000000000ff
354
355    vbsl        d19, d24, d16
356
357    vst1.8      d19, [r2], r3
358    vshr.s64    d24, d24, #8
359
360    vmov.i64    d19, #0x00000000000000ff
361
362    vbsl        d10, d24, d16
363
364    vst1.8      d10, [r2], r3
365    vshr.s64    d24, d24, #8
366
367    vmov.i64    d10, #0x00000000000000ff
368
369    vbsl        d11, d24, d16
370
371    vst1.8      d11, [r2], r3
372    vshr.s64    d24, d24, #8
373
374    vmov.i64    d11, #0x00000000000000ff
375
376    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
377
378    vst1.8      d18, [r2], r3
379    vshr.s64    d24, d24, #8
380
381    vbsl        d19, d24, d16
382
383    vst1.8      d19, [r2], r3
384    vshr.s64    d24, d24, #8
385
386    vbsl        d10, d24, d16
387
388    vst1.8      d10, [r2], r3
389    vshr.s64    d24, d24, #8
390
391    vbsl        d11, d24, d16
392
393    vst1.8      d11, [r2], r3
394    vshr.s64    d24, d24, #8
395
396    b           end_func
397
398
399blk_4:
400    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
401
402    vst1.32     d18[0], [r2], r3
403    vshr.s64    d24, d24, #8
404
405    vbsl        d19, d24, d16
406
407    vst1.32     d19[0], [r2], r3
408    vshr.s64    d24, d24, #8
409
410    vbsl        d10, d24, d16
411
412    vst1.32     d10[0], [r2], r3
413    vshr.s64    d24, d24, #8
414
415    vbsl        d11, d24, d16
416    vst1.32     d11[0], [r2], r3
417
418
419end_func:
420    ldmfd       sp!,{r4-r12,r15}            @reload the registers from sp
421
422