Home | History | Annotate | Download | only in neon
      1 ;
      2 ;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3 ;
      4 ;  Use of this source code is governed by a BSD-style license
      5 ;  that can be found in the LICENSE file in the root of the source
      6 ;  tree. An additional intellectual property rights grant can be found
      7 ;  in the file PATENTS.  All contributing project authors may
      8 ;  be found in the AUTHORS file in the root of the source tree.
      9 ;
     10 
     11 
     12     EXPORT  |vp8_recon16x16mb_neon|
     13     ARM
     14     REQUIRE8
     15     PRESERVE8
     16 
     17     AREA ||.text||, CODE, READONLY, ALIGN=2
     18 
     19 ; r0    unsigned char  *pred_ptr,
     20 ; r1    short *diff_ptr,
     21 ; r2    unsigned char *dst_ptr,
     22 ; r3    int ystride,
     23 ; stack unsigned char *udst_ptr,
     24 ; stack unsigned char *vdst_ptr
     25 
     26 |vp8_recon16x16mb_neon| PROC
     27     mov             r12, #4             ;loop counter for Y loop
     28 
     29 recon16x16mb_loop_y
     30     vld1.u8         {q12, q13}, [r0]!   ;load data from pred_ptr
     31     vld1.16         {q8, q9}, [r1]!     ;load data from diff_ptr
     32     vld1.u8         {q14, q15}, [r0]!
     33     vld1.16         {q10, q11}, [r1]!
     34 
     35     vmovl.u8        q0, d24             ;modify Pred data from 8 bits to 16 bits
     36     vmovl.u8        q1, d25
     37     vmovl.u8        q2, d26
     38     vmovl.u8        q3, d27
     39     vmovl.u8        q4, d28
     40     vmovl.u8        q5, d29
     41     vmovl.u8        q6, d30
     42     vld1.16         {q12, q13}, [r1]!
     43     vmovl.u8        q7, d31
     44     vld1.16         {q14, q15}, [r1]!
     45 
     46     pld             [r0]
     47     pld             [r1]
     48     pld             [r1, #64]
     49 
     50     vadd.s16        q0, q0, q8          ;add Diff data and Pred data together
     51     vadd.s16        q1, q1, q9
     52     vadd.s16        q2, q2, q10
     53     vadd.s16        q3, q3, q11
     54     vadd.s16        q4, q4, q12
     55     vadd.s16        q5, q5, q13
     56     vadd.s16        q6, q6, q14
     57     vadd.s16        q7, q7, q15
     58 
     59     vqmovun.s16     d0, q0              ;CLAMP() saturation
     60     vqmovun.s16     d1, q1
     61     vqmovun.s16     d2, q2
     62     vqmovun.s16     d3, q3
     63     vqmovun.s16     d4, q4
     64     vqmovun.s16     d5, q5
     65     vst1.u8         {q0}, [r2], r3      ;store result
     66     vqmovun.s16     d6, q6
     67     vst1.u8         {q1}, [r2], r3
     68     vqmovun.s16     d7, q7
     69     vst1.u8         {q2}, [r2], r3
     70     subs            r12, r12, #1
     71 
     72     moveq           r12, #2             ;loop counter for UV loop
     73 
     74     vst1.u8         {q3}, [r2], r3
     75     bne             recon16x16mb_loop_y
     76 
     77     mov             r3, r3, lsr #1      ;uv_stride = ystride>>1
     78     ldr             r2, [sp]            ;load upred_ptr
     79 
     80 recon16x16mb_loop_uv
     81     vld1.u8         {q12, q13}, [r0]!   ;load data from pred_ptr
     82     vld1.16         {q8, q9}, [r1]!     ;load data from diff_ptr
     83     vld1.u8         {q14, q15}, [r0]!
     84     vld1.16         {q10, q11}, [r1]!
     85 
     86     vmovl.u8        q0, d24             ;modify Pred data from 8 bits to 16 bits
     87     vmovl.u8        q1, d25
     88     vmovl.u8        q2, d26
     89     vmovl.u8        q3, d27
     90     vmovl.u8        q4, d28
     91     vmovl.u8        q5, d29
     92     vmovl.u8        q6, d30
     93     vld1.16         {q12, q13}, [r1]!
     94     vmovl.u8        q7, d31
     95     vld1.16         {q14, q15}, [r1]!
     96 
     97     vadd.s16        q0, q0, q8          ;add Diff data and Pred data together
     98     vadd.s16        q1, q1, q9
     99     vadd.s16        q2, q2, q10
    100     vadd.s16        q3, q3, q11
    101     vadd.s16        q4, q4, q12
    102     vadd.s16        q5, q5, q13
    103     vadd.s16        q6, q6, q14
    104 
    105     vqmovun.s16     d0, q0              ;CLAMP() saturation
    106     vadd.s16        q7, q7, q15
    107     vqmovun.s16     d1, q1
    108     vqmovun.s16     d2, q2
    109     vqmovun.s16     d3, q3
    110     vst1.u8         {d0}, [r2], r3      ;store result
    111     vqmovun.s16     d4, q4
    112     vst1.u8         {d1}, [r2], r3
    113     vqmovun.s16     d5, q5
    114     vst1.u8         {d2}, [r2], r3
    115     vqmovun.s16     d6, q6
    116     vst1.u8         {d3}, [r2], r3
    117     vqmovun.s16     d7, q7
    118     vst1.u8         {d4}, [r2], r3
    119     subs            r12, r12, #1
    120 
    121     vst1.u8         {d5}, [r2], r3
    122     vst1.u8         {d6}, [r2], r3
    123     vst1.u8         {d7}, [r2], r3
    124 
    125     ldrne           r2, [sp, #4]        ;load vpred_ptr
    126     bne             recon16x16mb_loop_uv
    127 
    128     bx             lr
    129 
    130     ENDP
    131     END
    132