• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #104
88@   nt
89@   mode
90
91.equ    nt_offset,      104
92
93.text
94.align 4
95
96
97
98
99.globl ihevc_intra_pred_luma_ver_a9q
100
101.type ihevc_intra_pred_luma_ver_a9q, %function
102
103ihevc_intra_pred_luma_ver_a9q:
104
105    stmfd       sp!, {r4-r12, r14}          @stack stores the values of the arguments
106    vpush       {d8 - d15}
107    ldr         r4,[sp,#nt_offset]          @loads nt
108
109    lsl         r5, r4, #1                  @2nt
110
111    cmp         r4, #16
112    beq         blk_16
113    blt         blk_4_8
114
115    add         r5, r5, #1                  @2nt+1
116    add         r6, r0, r5                  @&src[2nt+1]
117
118copy_32:
119    add         r5, r2, r3
120    vld1.8      {d20,d21}, [r6]!            @16 loads (col 0:15)
121    add         r8, r5, r3
122
123    add         r10, r8, r3
124    vld1.8      {d22,d23}, [r6]             @16 loads (col 16:31)
125    lsl         r11, r3, #2
126
127    add         r11, r11, #0xfffffff0
128    vst1.8      {d20,d21}, [r2]!
129    vst1.8      {d20,d21}, [r5]!
130    vst1.8      {d20,d21}, [r8]!
131    vst1.8      {d20,d21}, [r10]!
132
133    vst1.8      {d22,d23}, [r2], r11
134    vst1.8      {d22,d23}, [r5], r11
135    vst1.8      {d22,d23}, [r8], r11
136    vst1.8      {d22,d23}, [r10], r11
137
138    subs        r4, r4, #8
139
140kernel_copy_32:
141    vst1.8      {d20,d21}, [r2]!
142    vst1.8      {d20,d21}, [r5]!
143    vst1.8      {d20,d21}, [r8]!
144    vst1.8      {d20,d21}, [r10]!
145
146    vst1.8      {d22,d23}, [r2], r11
147    vst1.8      {d22,d23}, [r5], r11
148    vst1.8      {d22,d23}, [r8], r11
149    vst1.8      {d22,d23}, [r10], r11
150
151    subs        r4, r4, #8
152
153    vst1.8      {d20,d21}, [r2]!
154    vst1.8      {d20,d21}, [r5]!
155    vst1.8      {d20,d21}, [r8]!
156    vst1.8      {d20,d21}, [r10]!
157
158    vst1.8      {d22,d23}, [r2], r11
159    vst1.8      {d22,d23}, [r5], r11
160    vst1.8      {d22,d23}, [r8], r11
161    vst1.8      {d22,d23}, [r10], r11
162
163    bne         kernel_copy_32
164
165    vst1.8      {d20,d21}, [r2]!
166    vst1.8      {d20,d21}, [r5]!
167    vst1.8      {d20,d21}, [r8]!
168    vst1.8      {d20,d21}, [r10]!
169
170    vst1.8      {d22,d23}, [r2], r11
171    vst1.8      {d22,d23}, [r5], r11
172    vst1.8      {d22,d23}, [r8], r11
173    vst1.8      {d22,d23}, [r10], r11
174
175    b           end_func
176
177blk_16:
178    add         r6, r0, r5                  @&src[2nt]
179
180    ldrb        r11, [r6], #1               @src[2nt]
181
182    vdup.8      q11, r11                    @src[2nt]
183    ldrb        r12, [r6]                   @src[2nt+1]
184
185    vld1.8      {d16,d17}, [r6]             @ld for repl to cols src[2nt+1+col(0:15)] (0 ignored for stores)
186    add         r6, r6, #0xffffffef         @subtract -9 to take it to src[2nt-1-row(15)]
187
188    vdup.8      q12, r12                    @src[2nt+1]
189    vdup.16     q15, r12
190    lsl         r5, r3, #3                  @8*stride
191
192    vld1.8      {d26,d27}, [r6]!            @load src[2nt-1-row](rows 0:15)
193    add         r5, r2, r5                  @r5 ->
194
195    vmov.i64    d18, #0x00000000000000ff
196    vhsub.u8    q13, q13, q11               @(src[2nt-1-row] - src[2nt])>>1
197    @vsubl.u8   q0, d26, d22
198    @vsubl.u8   q14, d27, d22
199
200    @vshr.s16   q0, q0, #1
201    @vshr.s16   q14, q14, #1
202
203    vmov.i64    d19, d17
204    @vaddl.s8   q0, d24, d26
205    vmovl.s8    q0, d26
206    vmovl.s8    q14, d27
207    vqadd.s16   q0, q0, q15
208    vqadd.s16   q14, q14, q15
209
210    vmov.i64    d10, #0x00000000000000ff
211    @vaddl.s8   q1, d25, d27
212
213    vqmovun.s16 d25, q0
214    vqmovun.s16 d24, q14
215    @vmovn.u16  d25, q0
216    @vmovn.u16  d24, q1
217
218
219    vrev64.8    q12, q12
220
221    vmov.i64    d11, d17
222
223    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
224    vbsl        d10, d25, d16
225
226    vmov.i64    d8, #0x00000000000000ff
227    vmov.i64    d9, d17
228
229    vmov.i64    d6, #0x00000000000000ff
230    vmov.i64    d7, d17
231
232    vst1.8      {d18,d19}, [r2], r3
233    vshr.s64    d24, d24, #8
234
235    vst1.8      {d10,d11}, [r5], r3
236    vshr.s64    d25, d25, #8
237
238
239    vbsl        d8, d24, d16
240    vbsl        d6, d25, d16
241
242    vst1.8      {d8,d9}, [r2], r3
243    vshr.s64    d24, d24, #8
244
245    vst1.8      {d6,d7}, [r5], r3
246    vshr.s64    d25, d25, #8
247
248    subs        r4, #8
249
250    vmov.i64    d18, #0x00000000000000ff
251    @vmov.i64   d19, d17
252
253    vmov.i64    d10, #0x00000000000000ff
254    @vmov.i64   d11, d17
255
256
257loop_16:
258
259
260    vmov.i64    d8, #0x00000000000000ff
261
262    vmov.i64    d6, #0x00000000000000ff
263
264    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
265    vbsl        d10, d25, d16
266
267    vst1.8      {d18,d19}, [r2], r3
268    vshr.s64    d24, d24, #8
269
270    vst1.8      {d10,d11}, [r5], r3
271    vshr.s64    d25, d25, #8
272
273    vmov.i64    d18, #0x00000000000000ff
274
275    vmov.i64    d10, #0x00000000000000ff
276
277    vbsl        d8, d24, d16
278    vbsl        d6, d25, d16
279
280    vst1.8      {d8,d9}, [r2], r3
281    vshr.s64    d24, d24, #8
282
283    vst1.8      {d6,d7}, [r5], r3
284    vshr.s64    d25, d25, #8
285
286    subs        r4, r4, #4
287
288    bne         loop_16
289
290    vmov.i64    d8, #0x00000000000000ff
291
292    vmov.i64    d6, #0x00000000000000ff
293
294    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
295    vbsl        d10, d25, d16
296
297    vst1.8      {d18,d19}, [r2], r3
298    vshr.s64    d24, d24, #8
299
300    vst1.8      {d10,d11}, [r5], r3
301    vshr.s64    d25, d25, #8
302
303    vbsl        d8, d24, d16
304    vbsl        d6, d25, d16
305
306    vst1.8      {d8,d9}, [r2], r3
307
308    vst1.8      {d6,d7}, [r5], r3
309
310    b           end_func
311
312
313blk_4_8:
314    vmov.i64    d11, #0x00000000000000ff
315    add         r6, r0, r5                  @&src[2nt]
316
317    vmov.i64    d10, #0x00000000000000ff
318    ldrb        r11, [r6], #1               @src[2nt]
319
320    vdup.8      d22, r11                    @src[2nt]
321    ldrb        r12, [r6]                   @src[2nt+1]
322
323    vld1.8      d16, [r6]                   @ld for repl to cols src[2nt+1+col(0:3 or 0:7)](0 ignored for st)
324    add         r6, r6, #0xfffffff7         @subtract -9 to take it to src[2nt-1-row(15)]
325
326    vdup.8      d24, r12                    @src[2nt+1]
327    vdup.16     q15, r12
328
329    vld1.8      d26, [r6]!                  @load src[2nt-1-row](rows 0:15)
330
331    vmov.i64    d18, #0x00000000000000ff
332    vhsub.u8    d26, d26, d22               @(src[2nt-1-row] - src[2nt])>>1
333    @vsubl.u8   q13, d26, d22
334
335    @vshr.s16   q13, q13, #1
336
337    vmov.i64    d19, #0x00000000000000ff
338    vmovl.s8    q13, d26
339    @vaddl.s8   q0, d24, d26
340    vqadd.s16   q0, q13, q15
341
342    vqmovun.s16 d24, q0
343    @vmovn.s16  d24, q0
344
345    vrev64.8    d24, d24
346
347    cmp         r4, #4
348    beq         blk_4
349
350    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
351
352    vst1.8      d18, [r2], r3
353    vshr.s64    d24, d24, #8
354
355    vmov.i64    d18, #0x00000000000000ff
356
357    vbsl        d19, d24, d16
358
359    vst1.8      d19, [r2], r3
360    vshr.s64    d24, d24, #8
361
362    vmov.i64    d19, #0x00000000000000ff
363
364    vbsl        d10, d24, d16
365
366    vst1.8      d10, [r2], r3
367    vshr.s64    d24, d24, #8
368
369    vmov.i64    d10, #0x00000000000000ff
370
371    vbsl        d11, d24, d16
372
373    vst1.8      d11, [r2], r3
374    vshr.s64    d24, d24, #8
375
376    vmov.i64    d11, #0x00000000000000ff
377
378    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
379
380    vst1.8      d18, [r2], r3
381    vshr.s64    d24, d24, #8
382
383    vbsl        d19, d24, d16
384
385    vst1.8      d19, [r2], r3
386    vshr.s64    d24, d24, #8
387
388    vbsl        d10, d24, d16
389
390    vst1.8      d10, [r2], r3
391    vshr.s64    d24, d24, #8
392
393    vbsl        d11, d24, d16
394
395    vst1.8      d11, [r2], r3
396    vshr.s64    d24, d24, #8
397
398    b           end_func
399
400
401blk_4:
402    vbsl        d18, d24, d16               @only select row values from q12(predpixel)
403
404    vst1.32     d18[0], [r2], r3
405    vshr.s64    d24, d24, #8
406
407    vbsl        d19, d24, d16
408
409    vst1.32     d19[0], [r2], r3
410    vshr.s64    d24, d24, #8
411
412    vbsl        d10, d24, d16
413
414    vst1.32     d10[0], [r2], r3
415    vshr.s64    d24, d24, #8
416
417    vbsl        d11, d24, d16
418    vst1.32     d11[0], [r2], r3
419
420
421end_func:
422    vpop        {d8 - d15}
423    ldmfd       sp!,{r4-r12,r15}            @reload the registers from sp
424
425