libavcodec/aarch64/h264pred_neon.S
f56d8d8d
 /*
  * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
  *
5d5f8b29
  * This file is part of FFmpeg.
f56d8d8d
  *
5d5f8b29
  * FFmpeg is free software; you can redistribute it and/or
f56d8d8d
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
5d5f8b29
  * FFmpeg is distributed in the hope that it will be useful,
f56d8d8d
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
5d5f8b29
  * License along with FFmpeg; if not, write to the Free Software
f56d8d8d
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include "libavutil/aarch64/asm.S"
 
 .macro ldcol.8  rd,  rs,  rt,  n=8,  hi=0
 .if \n >= 8 || \hi == 0
         ld1             {\rd\().b}[0],  [\rs], \rt
         ld1             {\rd\().b}[1],  [\rs], \rt
         ld1             {\rd\().b}[2],  [\rs], \rt
         ld1             {\rd\().b}[3],  [\rs], \rt
 .endif
 .if \n >= 8 || \hi == 1
         ld1             {\rd\().b}[4],  [\rs], \rt
         ld1             {\rd\().b}[5],  [\rs], \rt
         ld1             {\rd\().b}[6],  [\rs], \rt
         ld1             {\rd\().b}[7],  [\rs], \rt
 .endif
 .if \n == 16
         ld1             {\rd\().b}[8],  [\rs], \rt
         ld1             {\rd\().b}[9],  [\rs], \rt
         ld1             {\rd\().b}[10], [\rs], \rt
         ld1             {\rd\().b}[11], [\rs], \rt
         ld1             {\rd\().b}[12], [\rs], \rt
         ld1             {\rd\().b}[13], [\rs], \rt
         ld1             {\rd\().b}[14], [\rs], \rt
         ld1             {\rd\().b}[15], [\rs], \rt
 .endif
 .endm
 
 function ff_pred16x16_128_dc_neon, export=1
         movi            v0.16b,  #128
         b               .L_pred16x16_dc_end
 endfunc
 
 function ff_pred16x16_top_dc_neon, export=1
         sub             x2,  x0,  x1
         ld1             {v0.16b},  [x2]
         uaddlv          h0,  v0.16b
         rshrn           v0.8b,  v0.8h,  #4
         dup             v0.16b, v0.b[0]
         b               .L_pred16x16_dc_end
 endfunc
 
 function ff_pred16x16_left_dc_neon, export=1
         sub             x2,  x0,  #1
         ldcol.8         v0,  x2,  x1, 16
         uaddlv          h0,  v0.16b
         rshrn           v0.8b,  v0.8h,  #4
         dup             v0.16b, v0.b[0]
         b               .L_pred16x16_dc_end
 endfunc
 
 function ff_pred16x16_dc_neon, export=1
         sub             x2,  x0,  x1
         sub             x3,  x0,  #1
         ld1             {v0.16b}, [x2]
         ldcol.8         v1,  x3,  x1, 16
         uaddlv          h0,  v0.16b
         uaddlv          h1,  v1.16b
         add             v0.4h,  v0.4h,  v1.4h
         rshrn           v0.8b,  v0.8h,  #5
         dup             v0.16b, v0.b[0]
 .L_pred16x16_dc_end:
         mov             w3,  #8
 6:      st1             {v0.16b}, [x0], x1
         st1             {v0.16b}, [x0], x1
         subs            w3,  w3,  #1
         b.ne            6b
         ret
 endfunc
 
 function ff_pred16x16_hor_neon, export=1
         sub             x2,  x0,  #1
         mov             w3,  #16
 1:      ld1r            {v0.16b}, [x2], x1
         st1             {v0.16b}, [x0], x1
         subs            w3,  w3,  #1
         b.ne            1b
         ret
 endfunc
 
 function ff_pred16x16_vert_neon, export=1
         sub             x2,  x0,  x1
         add             x1,  x1,  x1
         ld1             {v0.16b}, [x2], x1
         mov             w3,  #8
 1:      st1             {v0.16b}, [x0], x1
         st1             {v0.16b}, [x2], x1
         subs            w3,  w3,  #1
         b.ne            1b
         ret
 endfunc
 
 function ff_pred16x16_plane_neon, export=1
         sub             x3,  x0,  x1
         movrel          x4,  p16weight
         add             x2,  x3,  #8
         sub             x3,  x3,  #1
         ld1             {v0.8b},  [x3]
         ld1             {v2.8b},  [x2], x1
         ldcol.8         v1,  x3,  x1
         add             x3,  x3,  x1
         ldcol.8         v3,  x3,  x1
         rev64           v0.8b,  v0.8b
         rev64           v1.8b,  v1.8b
         uaddl           v7.8h,  v2.8b,  v3.8b
         usubl           v2.8h,  v2.8b,  v0.8b
         usubl           v3.8h,  v3.8b,  v1.8b
         ld1             {v0.8h},     [x4]
         mul             v2.8h,  v2.8h,  v0.8h
         mul             v3.8h,  v3.8h,  v0.8h
         addp            v2.8h,  v2.8h,  v3.8h
         addp            v2.8h,  v2.8h,  v2.8h
         addp            v2.4h,  v2.4h,  v2.4h
         sshll           v3.4s,  v2.4h,  #2
         saddw           v2.4s,  v3.4s,  v2.4h
         rshrn           v4.4h,  v2.4s,  #6
         trn2            v5.4h,  v4.4h,  v4.4h
         add             v2.4h,  v4.4h,  v5.4h
         shl             v3.4h,  v2.4h,  #3
         ext             v7.16b, v7.16b, v7.16b, #14
         sub             v3.4h,  v3.4h,  v2.4h   // 7 * (b + c)
         add             v7.4h,  v7.4h,  v0.4h
         shl             v2.4h,  v7.4h,  #4
         sub             v2.4h,  v2.4h,  v3.4h
         shl             v3.4h,  v4.4h,  #4
         ext             v0.16b, v0.16b, v0.16b, #14
         sub             v6.4h,  v5.4h,  v3.4h
         mov             v0.h[0],  wzr
         mul             v0.8h,  v0.8h,  v4.h[0]
         dup             v1.8h,  v2.h[0]
         dup             v2.8h,  v4.h[0]
         dup             v3.8h,  v6.h[0]
         shl             v2.8h,  v2.8h,  #3
         add             v1.8h,  v1.8h,  v0.8h
         add             v3.8h,  v3.8h,  v2.8h
         mov             w3,  #16
 1:
         sqshrun         v0.8b,  v1.8h,  #5
         add             v1.8h,  v1.8h,  v2.8h
         sqshrun2        v0.16b, v1.8h,  #5
         add             v1.8h,  v1.8h,  v3.8h
         st1             {v0.16b}, [x0], x1
         subs            w3,  w3,  #1
         b.ne            1b
         ret
 endfunc
 
 const   p16weight, align=4
         .short          1,2,3,4,5,6,7,8
 endconst
 const   p8weight, align=4
         .short          1,2,3,4,1,2,3,4
 endconst
 
 function ff_pred8x8_hor_neon, export=1
         sub             x2,  x0,  #1
         mov             w3,  #8
 1:      ld1r            {v0.8b},  [x2], x1
         st1             {v0.8b},  [x0], x1
         subs            w3,  w3,  #1
         b.ne            1b
         ret
 endfunc
 
 function ff_pred8x8_vert_neon, export=1
         sub             x2,  x0,  x1
         lsl             x1,  x1,  #1
         ld1             {v0.8b},  [x2], x1
         mov             w3,  #4
 1:      st1             {v0.8b},  [x0], x1
         st1             {v0.8b},  [x2], x1
         subs            w3,  w3,  #1
         b.ne            1b
         ret
 endfunc
 
 function ff_pred8x8_plane_neon, export=1
         sub             x3,  x0,  x1
         movrel          x4,  p8weight
         movrel          x5,  p16weight
         add             x2,  x3,  #4
         sub             x3,  x3,  #1
         ld1             {v0.s}[0],  [x3]
         ld1             {v2.s}[0],  [x2], x1
         ldcol.8         v0,  x3,  x1,  4,  hi=1
         add             x3,  x3,  x1
         ldcol.8         v3,  x3,  x1,  4
         uaddl           v7.8h,  v2.8b,  v3.8b
         rev32           v0.8b,  v0.8b
         trn1            v2.2s,  v2.2s,  v3.2s
         usubl           v2.8h,  v2.8b,  v0.8b
         ld1             {v6.8h},  [x4]
         mul             v2.8h,  v2.8h,  v6.8h
         ld1             {v0.8h},  [x5]
         saddlp          v2.4s,  v2.8h
         addp            v2.4s,  v2.4s,  v2.4s
         shl             v3.4s,  v2.4s,  #4
         add             v2.4s,  v3.4s,  v2.4s
         rshrn           v5.4h,  v2.4s,  #5
         addp            v2.4h,  v5.4h,  v5.4h
         shl             v3.4h,  v2.4h,  #1
         add             v3.4h,  v3.4h,  v2.4h
         rev64           v7.4h,  v7.4h
         add             v7.4h,  v7.4h,  v0.4h
         shl             v2.4h,  v7.4h,  #4
         sub             v2.4h,  v2.4h,  v3.4h
         ext             v0.16b, v0.16b, v0.16b, #14
         mov             v0.h[0],  wzr
         mul             v0.8h,  v0.8h,  v5.h[0]
         dup             v1.8h,  v2.h[0]
         dup             v2.8h,  v5.h[1]
         add             v1.8h,  v1.8h,  v0.8h
         mov             w3,  #8
 1:
         sqshrun         v0.8b,  v1.8h,  #5
         add             v1.8h,  v1.8h,  v2.8h
         st1             {v0.8b},  [x0], x1
         subs            w3,  w3,  #1
         b.ne            1b
         ret
 endfunc
 
 function ff_pred8x8_128_dc_neon, export=1
         movi            v0.8b,  #128
         movi            v1.8b,  #128
         b               .L_pred8x8_dc_end
 endfunc
 
 function ff_pred8x8_top_dc_neon, export=1
         sub             x2,  x0,  x1
         ld1             {v0.8b},  [x2]
         uaddlp          v0.4h,  v0.8b
         addp            v0.4h,  v0.4h,  v0.4h
         zip1            v0.8h,  v0.8h,  v0.8h
         rshrn           v2.8b,  v0.8h,  #2
         zip1            v0.8b,  v2.8b,  v2.8b
         zip1            v1.8b,  v2.8b,  v2.8b
         b               .L_pred8x8_dc_end
 endfunc
 
 function ff_pred8x8_left_dc_neon, export=1
         sub             x2,  x0,  #1
         ldcol.8         v0,  x2,  x1
         uaddlp          v0.4h,  v0.8b
         addp            v0.4h,  v0.4h,  v0.4h
         rshrn           v2.8b,  v0.8h,  #2
         dup             v1.8b,  v2.b[1]
         dup             v0.8b,  v2.b[0]
         b               .L_pred8x8_dc_end
 endfunc
 
 function ff_pred8x8_dc_neon, export=1
         sub             x2,  x0,  x1
         sub             x3,  x0,  #1
         ld1             {v0.8b}, [x2]
         ldcol.8         v1,  x3,  x1
         uaddlp          v0.4h,  v0.8b
         uaddlp          v1.4h,  v1.8b
         trn1            v2.2s,  v0.2s,  v1.2s
         trn2            v3.2s,  v0.2s,  v1.2s
         addp            v4.4h,  v2.4h,  v3.4h
         addp            v5.4h,  v4.4h,  v4.4h
         rshrn           v6.8b,  v5.8h,  #3
         rshrn           v7.8b,  v4.8h,  #2
         dup             v0.8b,  v6.b[0]
         dup             v2.8b,  v7.b[2]
         dup             v1.8b,  v7.b[3]
         dup             v3.8b,  v6.b[1]
         zip1            v0.2s,  v0.2s,  v2.2s
         zip1            v1.2s,  v1.2s,  v3.2s
 .L_pred8x8_dc_end:
         mov             w3,  #4
         add             x2,  x0,  x1,  lsl #2
 6:      st1             {v0.8b},  [x0], x1
         st1             {v1.8b},  [x2], x1
         subs            w3,  w3,  #1
         b.ne            6b
         ret
 endfunc
 
 function ff_pred8x8_l0t_dc_neon, export=1
         sub             x2,  x0,  x1
         sub             x3,  x0,  #1
         ld1             {v0.8b},  [x2]
         ldcol.8         v1,  x3,  x1,  4
         zip1            v0.4s,  v0.4s,  v1.4s
         uaddlp          v0.8h,  v0.16b
         addp            v0.8h,  v0.8h,  v0.8h
         addp            v1.4h,  v0.4h,  v0.4h
         rshrn           v2.8b,  v0.8h,  #2
         rshrn           v3.8b,  v1.8h,  #3
         dup             v4.8b,  v3.b[0]
         dup             v6.8b,  v2.b[2]
         dup             v5.8b,  v2.b[0]
         zip1            v0.2s,  v4.2s,  v6.2s
         zip1            v1.2s,  v5.2s,  v6.2s
         b               .L_pred8x8_dc_end
 endfunc
 
 function ff_pred8x8_l00_dc_neon, export=1
         sub             x2,  x0,  #1
         ldcol.8         v0,  x2,  x1,  4
         uaddlp          v0.4h,  v0.8b
         addp            v0.4h,  v0.4h,  v0.4h
         rshrn           v0.8b,  v0.8h,  #2
         movi            v1.8b,  #128
         dup             v0.8b,  v0.b[0]
         b               .L_pred8x8_dc_end
 endfunc
 
 function ff_pred8x8_0lt_dc_neon, export=1
         add             x3,  x0,  x1,  lsl #2
         sub             x2,  x0,  x1
         sub             x3,  x3,  #1
         ld1             {v0.8b},  [x2]
         ldcol.8         v1,  x3,  x1,  4,  hi=1
         zip1            v0.4s,  v0.4s,  v1.4s
         uaddlp          v0.8h,  v0.16b
         addp            v0.8h,  v0.8h,  v0.8h
         addp            v1.4h,  v0.4h,  v0.4h
         rshrn           v2.8b,  v0.8h,  #2
         rshrn           v3.8b,  v1.8h,  #3
         dup             v4.8b,  v2.b[0]
         dup             v5.8b,  v2.b[3]
         dup             v6.8b,  v2.b[2]
         dup             v7.8b,  v3.b[1]
         zip1            v0.2s,  v4.2s,  v6.2s
         zip1            v1.2s,  v5.2s,  v7.2s
         b               .L_pred8x8_dc_end
 endfunc
 
 function ff_pred8x8_0l0_dc_neon, export=1
         add             x2,  x0,  x1,  lsl #2
         sub             x2,  x2,  #1
         ldcol.8         v1,  x2,  x1,  4
         uaddlp          v2.4h,  v1.8b
         addp            v2.4h,  v2.4h,  v2.4h
         rshrn           v1.8b,  v2.8h,  #2
         movi            v0.8b,  #128
         dup             v1.8b,  v1.b[0]
         b               .L_pred8x8_dc_end
 endfunc