predict-a.S
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * predict_armv6.S: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2009 x264 project
  5.  *
  6.  * Authors: David Conrad <lessen42@gmail.com>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  21.  *****************************************************************************/
  22. #include "asm.S"
  23. .fpu neon
  24. .section .rodata
  25. .align 4
  26. pw_76543210: .short 7,6,5,4,3,2,1,0
  27. .text
  28. // because gcc doesn't believe in using the free shift in add
  29. function x264_predict_4x4_h_armv6, export=1
  30.     ldrb    r1, [r0, #0*FDEC_STRIDE-1]
  31.     ldrb    r2, [r0, #1*FDEC_STRIDE-1]
  32.     ldrb    r3, [r0, #2*FDEC_STRIDE-1]
  33.     ldrb    ip, [r0, #3*FDEC_STRIDE-1]
  34.     add     r1, r1, r1, lsl #8
  35.     add     r2, r2, r2, lsl #8
  36.     add     r3, r3, r3, lsl #8
  37.     add     ip, ip, ip, lsl #8
  38.     add     r1, r1, r1, lsl #16
  39.     str     r1, [r0, #0*FDEC_STRIDE]
  40.     add     r2, r2, r2, lsl #16
  41.     str     r2, [r0, #1*FDEC_STRIDE]
  42.     add     r3, r3, r3, lsl #16
  43.     str     r3, [r0, #2*FDEC_STRIDE]
  44.     add     ip, ip, ip, lsl #16
  45.     str     ip, [r0, #3*FDEC_STRIDE]
  46.     bx      lr
  47. .endfunc
  48. function x264_predict_4x4_dc_armv6, export=1
  49.     mov     ip, #0
  50.     ldr     r1, [r0, #-FDEC_STRIDE]
  51.     ldrb    r2, [r0, #0*FDEC_STRIDE-1]
  52.     ldrb    r3, [r0, #1*FDEC_STRIDE-1]
  53.     usad8   r1, r1, ip
  54.     add     r2, r2, #4
  55.     ldrb    ip, [r0, #2*FDEC_STRIDE-1]
  56.     add     r2, r2, r3
  57.     ldrb    r3, [r0, #3*FDEC_STRIDE-1]
  58.     add     r2, r2, ip
  59.     add     r2, r2, r3
  60.     add     r1, r1, r2
  61.     lsr     r1, r1, #3
  62.     add     r1, r1, r1, lsl #8
  63.     add     r1, r1, r1, lsl #16
  64.     str     r1, [r0, #0*FDEC_STRIDE]
  65.     str     r1, [r0, #1*FDEC_STRIDE]
  66.     str     r1, [r0, #2*FDEC_STRIDE]
  67.     str     r1, [r0, #3*FDEC_STRIDE]
  68.     bx      lr
  69. .endfunc
  70. // return a1 = (a1+2*b1+c1+2)>>2  a2 = (a2+2*b2+c2+2)>>2
  71. .macro PRED4x4_LOWPASS a1 b1 c1 a2 b2 c2 pb_1
  72.     uhadd8  a1, a1, c1
  73.     uhadd8  a2, a2, c2
  74.     uhadd8  c1, a1, b1
  75.     uhadd8  c2, a2, b2
  76.     eor     a1, a1, b1
  77.     eor     a2, a2, b2
  78.     and     a1, a1, pb_1
  79.     and     a2, a2, pb_1
  80.     uadd8   a1, a1, c1
  81.     uadd8   a2, a2, c2
  82. .endm
  83. function x264_predict_4x4_ddr_armv6, export=1
  84.     ldr     r1, [r0, # -FDEC_STRIDE]
  85.     ldrb    r2, [r0, # -FDEC_STRIDE-1]
  86.     ldrb    r3, [r0, #0*FDEC_STRIDE-1]
  87.     push    {r4-r6,lr}
  88.     add     r2, r2, r1, lsl #8
  89.     ldrb    r4, [r0, #1*FDEC_STRIDE-1]
  90.     add     r3, r3, r2, lsl #8
  91.     ldrb    r5, [r0, #2*FDEC_STRIDE-1]
  92.     ldrb    r6, [r0, #3*FDEC_STRIDE-1]
  93.     add     r4, r4, r3, lsl #8
  94.     add     r5, r5, r4, lsl #8
  95.     add     r6, r6, r5, lsl #8
  96.     ldr     ip, =0x01010101
  97.     PRED4x4_LOWPASS r1, r2, r3, r4, r5, r6, ip
  98.     str     r1, [r0, #0*FDEC_STRIDE]
  99.     lsl     r2, r1, #8
  100.     lsl     r3, r1, #16
  101.     lsl     r4, r4, #8
  102.     lsl     r5, r1, #24
  103.     add     r2, r2, r4, lsr #24
  104.     str     r2, [r0, #1*FDEC_STRIDE]
  105.     add     r3, r3, r4, lsr #16
  106.     str     r3, [r0, #2*FDEC_STRIDE]
  107.     add     r5, r5, r4, lsr #8
  108.     str     r5, [r0, #3*FDEC_STRIDE]
  109.     pop     {r4-r6,pc}
  110. .endfunc
  111. function x264_predict_4x4_ddl_neon, export=1
  112.     sub         r0, #FDEC_STRIDE
  113.     mov         ip, #FDEC_STRIDE
  114.     vld1.64     {d0}, [r0], ip
  115.     vdup.8      d3, d0[7]
  116.     vext.8      d1, d0, d0, #1
  117.     vext.8      d2, d0, d3, #2
  118.     vhadd.u8    d0, d0, d2
  119.     vrhadd.u8   d0, d0, d1
  120.     vst1.32     {d0[0]}, [r0,:32], ip
  121.     vext.8      d1, d0, d0, #1
  122.     vext.8      d2, d0, d0, #2
  123.     vst1.32     {d1[0]}, [r0,:32], ip
  124.     vext.8      d3, d0, d0, #3
  125.     vst1.32     {d2[0]}, [r0,:32], ip
  126.     vst1.32     {d3[0]}, [r0,:32], ip
  127.     bx          lr
  128. .endfunc
  129. function x264_predict_8x8_dc_neon, export=1
  130.     mov     ip, #0
  131.     ldrd    r2, [r1, #8]
  132.     push    {r4-r5,lr}
  133.     ldrd    r4, [r1, #16]
  134.     lsl     r3, r3, #8
  135.     ldrb    lr, [r1, #7]
  136.     usad8   r2, r2, ip
  137.     usad8   r3, r3, ip
  138.     usada8  r2, r4, ip, r2
  139.     add     lr, lr, #8
  140.     usada8  r3, r5, ip, r3
  141.     add     r2, r2, lr
  142.     mov     ip, #FDEC_STRIDE
  143.     add     r2, r2, r3
  144.     lsr     r2, r2, #4
  145.     vdup.8   d0, r2
  146. .rept 8
  147.     vst1.64 {d0}, [r0,:64], ip
  148. .endr
  149.     pop    {r4-r5,pc}
  150. .endfunc
  151. function x264_predict_8x8_h_neon, export=1
  152.     add         r1, r1, #7
  153.     mov         ip, #FDEC_STRIDE
  154.     vld1.64     {d16}, [r1]
  155.     vdup.8      d0, d16[7]
  156.     vdup.8      d1, d16[6]
  157.     vst1.64     {d0}, [r0,:64], ip
  158.     vdup.8      d2, d16[5]
  159.     vst1.64     {d1}, [r0,:64], ip
  160.     vdup.8      d3, d16[4]
  161.     vst1.64     {d2}, [r0,:64], ip
  162.     vdup.8      d4, d16[3]
  163.     vst1.64     {d3}, [r0,:64], ip
  164.     vdup.8      d5, d16[2]
  165.     vst1.64     {d4}, [r0,:64], ip
  166.     vdup.8      d6, d16[1]
  167.     vst1.64     {d5}, [r0,:64], ip
  168.     vdup.8      d7, d16[0]
  169.     vst1.64     {d6}, [r0,:64], ip
  170.     vst1.64     {d7}, [r0,:64], ip
  171.     bx          lr
  172. .endfunc
  173. function x264_predict_8x8c_h_neon, export=1
  174.     sub         r1, r0, #1
  175.     mov         ip, #FDEC_STRIDE
  176. .rept 4
  177.     vld1.8      {d0[]}, [r1], ip
  178.     vld1.8      {d2[]}, [r1], ip
  179.     vst1.64     {d0}, [r0,:64], ip
  180.     vst1.64     {d2}, [r0,:64], ip
  181. .endr
  182.     bx          lr
  183. .endfunc
  184. function x264_predict_8x8c_v_neon, export=1
  185.     sub         r0, r0, #FDEC_STRIDE
  186.     mov         ip, #FDEC_STRIDE
  187.     vld1.64     {d0}, [r0,:64], ip
  188. .rept 8
  189.     vst1.64     {d0}, [r0,:64], ip
  190. .endr
  191.     bx          lr
  192. .endfunc
  193. function x264_predict_16x16_dc_neon, export=1
  194.     sub         r3, r0, #FDEC_STRIDE
  195.     sub         r0, r0, #1
  196.     vld1.64     {d0-d1}, [r3,:128]
  197.     ldrb        ip, [r0], #FDEC_STRIDE
  198.     vaddl.u8    q0, d0, d1
  199.     ldrb        r1, [r0], #FDEC_STRIDE
  200.     vadd.u16    d0, d0, d1
  201.     vpadd.u16   d0, d0, d0
  202.     vpadd.u16   d0, d0, d0
  203. .rept 4
  204.     ldrb        r2, [r0], #FDEC_STRIDE
  205.     add         ip, ip, r1
  206.     ldrb        r3, [r0], #FDEC_STRIDE
  207.     add         ip, ip, r2
  208.     ldrb        r1, [r0], #FDEC_STRIDE
  209.     add         ip, ip, r3
  210. .endr
  211.     ldrb        r2, [r0], #FDEC_STRIDE
  212.     add         ip, ip, r1
  213.     ldrb        r3, [r0], #FDEC_STRIDE
  214.     add         ip, ip, r2
  215.     sub         r0, r0, #FDEC_STRIDE*16
  216.     add         ip, ip, r3
  217.     vdup.16     d1, ip
  218.     vadd.u16    d0, d0, d1
  219.     mov         ip, #FDEC_STRIDE
  220.     add         r0, r0, #1
  221.     vrshr.u16   d0, d0, #5
  222.     vdup.8      q0, d0[0]
  223. .rept 16
  224.     vst1.64     {d0-d1}, [r0,:64], ip
  225. .endr
  226.     bx          lr
  227. .endfunc
  228. function x264_predict_16x16_h_neon, export=1
  229.     sub         r1, r0, #1
  230.     mov         ip, #FDEC_STRIDE
  231. .rept 8
  232.     vld1.8      {d0[]}, [r1], ip
  233.     vmov        d1, d0
  234.     vld1.8      {d2[]}, [r1], ip
  235.     vmov        d3, d2
  236.     vst1.64     {d0-d1}, [r0,:128], ip
  237.     vst1.64     {d2-d3}, [r0,:128], ip
  238. .endr
  239.     bx          lr
  240. .endfunc
  241. function x264_predict_16x16_v_neon, export=1
  242.     sub         r0, r0, #FDEC_STRIDE
  243.     mov         ip, #FDEC_STRIDE
  244.     vld1.64     {d0-d1}, [r0,:128], ip
  245. .rept 16
  246.     vst1.64     {d0-d1}, [r0,:128], ip
  247. .endr
  248.     bx          lr
  249. .endfunc