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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * dct-a.S: h264 encoder library
  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. scan4x4_frame:
  27. .byte    0,1,   8,9,   2,3,   4,5
  28. .byte    2,3,   8,9,  16,17, 10,11
  29. .byte   12,13,  6,7,  14,15, 20,21
  30. .byte   10,11, 12,13,  6,7,  14,15
  31. .text
  32. // sum = a + (b>>shift)   sub = (a>>shift) - b
  33. .macro SUMSUB_SHR shift sum sub a b t0 t1
  34.     vshr.s16    t0,  b, #shift
  35.     vshr.s16    t1,  a, #shift
  36.     vadd.s16    sum, a, t0
  37.     vsub.s16    sub, t1, b
  38. .endm
  39. // sum = (a>>shift) + b   sub = a - (b>>shift)
  40. .macro SUMSUB_SHR2 shift sum sub a b t0 t1
  41.     vshr.s16    t0,  a, #shift
  42.     vshr.s16    t1,  b, #shift
  43.     vadd.s16    sum, t0, b
  44.     vsub.s16    sub, a, t1
  45. .endm
  46. // a += 1.5*ma   b -= 1.5*mb
  47. .macro SUMSUB_15 a b ma mb t0 t1
  48.     vshr.s16    t0, ma, #1
  49.     vshr.s16    t1, mb, #1
  50.     vadd.s16    t0, t0, ma
  51.     vadd.s16    t1, t1, mb
  52.     vadd.s16    a,  a,  t0
  53.     vsub.s16    b,  b,  t1
  54. .endm
  55. function x264_dct4x4dc_neon, export=1
  56.     vld1.64         {d0-d3}, [r0,:128]
  57.     SUMSUB_ABCD     d4, d5, d6, d7, d0, d1, d2, d3
  58.     SUMSUB_ABCD     d0, d2, d3, d1, d4, d6, d5, d7
  59.     vmov.s16        d31, #1
  60.     HADAMARD        1, sumsub, q2, q3, q0, q1
  61.     vtrn.32         d4,  d5
  62.     vadd.s16        d16, d4,  d31
  63.     vtrn.32         d6,  d7
  64.     vadd.s16        d17, d6,  d31
  65.     vrhadd.s16      d0,  d4,  d5
  66.     vhsub.s16       d1,  d16, d5
  67.     vhsub.s16       d2,  d17, d7
  68.     vrhadd.s16      d3,  d6,  d7
  69.     vst1.64         {d0-d3}, [r0,:128]
  70.     bx              lr
  71. .endfunc
  72. function x264_idct4x4dc_neon, export=1
  73.     vld1.64         {d0-d3}, [r0,:128]
  74.     SUMSUB_ABCD     d4, d5, d6, d7, d0, d1, d2, d3
  75.     SUMSUB_ABCD     d0, d2, d3, d1, d4, d6, d5, d7
  76.     HADAMARD        1, sumsub, q2, q3, q0, q1
  77.     HADAMARD        2, sumsub, d0, d1, d4, d5
  78.     HADAMARD        2, sumsub, d3, d2, d6, d7
  79.     vst1.64         {d0-d3}, [r0,:128]
  80.     bx              lr
  81. .endfunc
  82. .macro DCT_1D d0 d1 d2 d3  d4 d5 d6 d7
  83.     SUMSUB_AB       d1, d6, d5, d6
  84.     SUMSUB_AB       d3, d7, d4, d7
  85.     vadd.s16        d0, d3, d1
  86.     vadd.s16        d4, d7, d7
  87.     vadd.s16        d5, d6, d6
  88.     vsub.s16        d2, d3, d1
  89.     vadd.s16        d1, d4, d6
  90.     vsub.s16        d3, d7, d5
  91. .endm
  92. function x264_sub4x4_dct_neon, export=1
  93.     mov             r3, #FENC_STRIDE
  94.     mov             ip, #FDEC_STRIDE
  95.     vld1.32         {d0[]}, [r1,:32], r3
  96.     vld1.32         {d1[]}, [r2,:32], ip
  97.     vld1.32         {d2[]}, [r1,:32], r3
  98.     vsubl.u8        q8,  d0,  d1
  99.     vld1.32         {d3[]}, [r2,:32], ip
  100.     vld1.32         {d4[]}, [r1,:32], r3
  101.     vsubl.u8        q9,  d2,  d3
  102.     vld1.32         {d5[]}, [r2,:32], ip
  103.     vld1.32         {d6[]}, [r1,:32], r3
  104.     vsubl.u8        q10, d4,  d5
  105.     vld1.32         {d7[]}, [r2,:32], ip
  106.     vsubl.u8        q11, d6,  d7
  107.     DCT_1D          d0, d1, d2, d3, d16, d18, d20, d22
  108.     TRANSPOSE4x4_16 d0, d1, d2, d3
  109.     DCT_1D          d4, d5, d6, d7, d0, d1, d2, d3
  110.     vst1.64         {d4-d7}, [r0,:128]
  111.     bx              lr
  112. .endfunc
  113. function x264_sub8x4_dct_neon, export=1
  114.     vld1.64         {d0}, [r1,:64], r3
  115.     vld1.64         {d1}, [r2,:64], ip
  116.     vsubl.u8        q8,  d0,  d1
  117.     vld1.64         {d2}, [r1,:64], r3
  118.     vld1.64         {d3}, [r2,:64], ip
  119.     vsubl.u8        q9,  d2,  d3
  120.     vld1.64         {d4}, [r1,:64], r3
  121.     vld1.64         {d5}, [r2,:64], ip
  122.     vsubl.u8        q10, d4,  d5
  123.     vld1.64         {d6}, [r1,:64], r3
  124.     vld1.64         {d7}, [r2,:64], ip
  125.     vsubl.u8        q11, d6,  d7
  126.     DCT_1D          q0, q1, q2, q3,  q8, q9, q10, q11
  127.     TRANSPOSE4x4_16 q0, q1, q2, q3
  128.     SUMSUB_AB       q8,  q12, q0,  q3
  129.     SUMSUB_AB       q9,  q10, q1,  q2
  130.     vadd.i16        q13, q12, q12
  131.     vadd.i16        q11, q10, q10
  132.     vadd.i16        d0,  d16, d18
  133.     vadd.i16        d1,  d26, d20
  134.     vsub.i16        d2,  d16, d18
  135.     vsub.i16        d3,  d24, d22
  136.     vst1.64         {d0-d1}, [r0,:128]!
  137.     vadd.i16        d4,  d17, d19
  138.     vadd.i16        d5,  d27, d21
  139.     vst1.64         {d2-d3}, [r0,:128]!
  140.     vsub.i16        d6,  d17, d19
  141.     vsub.i16        d7,  d25, d23
  142.     vst1.64         {d4-d5}, [r0,:128]!
  143.     vst1.64         {d6-d7}, [r0,:128]!
  144.     bx              lr
  145. .endfunc
  146. function x264_sub8x8_dct_neon, export=1
  147.     push            {lr}
  148.     mov             r3, #FENC_STRIDE
  149.     mov             ip, #FDEC_STRIDE
  150.     bl              x264_sub8x4_dct_neon
  151.     pop             {lr}
  152.     b               x264_sub8x4_dct_neon
  153. .endfunc
  154. function x264_sub16x16_dct_neon, export=1
  155.     push            {lr}
  156.     mov             r3, #FENC_STRIDE
  157.     mov             ip, #FDEC_STRIDE
  158.     bl              x264_sub8x4_dct_neon
  159.     bl              x264_sub8x4_dct_neon
  160.     sub             r1, r1, #8*FENC_STRIDE-8
  161.     sub             r2, r2, #8*FDEC_STRIDE-8
  162.     bl              x264_sub8x4_dct_neon
  163.     bl              x264_sub8x4_dct_neon
  164.     sub             r1, r1, #8
  165.     sub             r2, r2, #8
  166.     bl              x264_sub8x4_dct_neon
  167.     bl              x264_sub8x4_dct_neon
  168.     sub             r1, r1, #8*FENC_STRIDE-8
  169.     sub             r2, r2, #8*FDEC_STRIDE-8
  170.     bl              x264_sub8x4_dct_neon
  171.     pop             {lr}
  172.     b               x264_sub8x4_dct_neon
  173. .endfunc
  174. .macro DCT8_1D type
  175.     SUMSUB_AB       q2,  q1,  q11, q12  // s34/d34
  176.     SUMSUB_AB       q3,  q11, q10, q13  // s25/d25
  177.     SUMSUB_AB       q13, q10, q9,  q14  // s16/d16
  178.     SUMSUB_AB       q14, q8,  q8,  q15  // s07/d07
  179.     SUMSUB_AB       q9,  q2,  q14, q2   // a0/a2
  180.     SUMSUB_AB       q12, q14, q13, q3   // a1/a3
  181.     SUMSUB_AB       q3,  q13, q8,  q1   // a6/a5
  182.     vshr.s16        q0,  q10, #1
  183.     vshr.s16        q15, q11, #1
  184.     vadd.s16        q0,  q0,  q10
  185.     vadd.s16        q15, q15, q11
  186.     vsub.s16        q3,  q3,  q0
  187.     vsub.s16        q13, q13, q15
  188.     SUMSUB_AB       q0,  q15, q10, q11  // a4/a7
  189.     vshr.s16        q10, q8,  #1
  190.     vshr.s16        q11, q1,  #1
  191.     vadd.s16        q10, q10, q8
  192.     vadd.s16        q11, q11, q1
  193.     vadd.s16        q10, q0,  q10
  194.     vadd.s16        q15, q15, q11
  195.     SUMSUB_AB       q8,  q12, q9,  q12
  196.     SUMSUB_SHR   2, q9,  q15, q10, q15,  q0, q1
  197.     SUMSUB_SHR   1, q10, q14, q2,  q14,  q0, q1
  198.     SUMSUB_SHR2  2, q11, q13, q3,  q13,  q0, q1
  199. .endm
  200. function x264_sub8x8_dct8_neon, export=1
  201.     mov             r3, #FENC_STRIDE
  202.     mov             ip, #FDEC_STRIDE
  203.     vld1.64         {d16}, [r1,:64], r3
  204.     vld1.64         {d17}, [r2,:64], ip
  205.     vsubl.u8        q8,  d16, d17
  206.     vld1.64         {d18}, [r1,:64], r3
  207.     vld1.64         {d19}, [r2,:64], ip
  208.     vsubl.u8        q9,  d18, d19
  209.     vld1.64         {d20}, [r1,:64], r3
  210.     vld1.64         {d21}, [r2,:64], ip
  211.     vsubl.u8        q10, d20, d21
  212.     vld1.64         {d22}, [r1,:64], r3
  213.     vld1.64         {d23}, [r2,:64], ip
  214.     vsubl.u8        q11, d22, d23
  215.     vld1.64         {d24}, [r1,:64], r3
  216.     vld1.64         {d25}, [r2,:64], ip
  217.     vsubl.u8        q12, d24, d25
  218.     vld1.64         {d26}, [r1,:64], r3
  219.     vld1.64         {d27}, [r2,:64], ip
  220.     vsubl.u8        q13, d26, d27
  221.     vld1.64         {d28}, [r1,:64], r3
  222.     vld1.64         {d29}, [r2,:64], ip
  223.     vsubl.u8        q14, d28, d29
  224.     vld1.64         {d30}, [r1,:64], r3
  225.     vld1.64         {d31}, [r2,:64], ip
  226.     vsubl.u8        q15, d30, d31
  227.     DCT8_1D row
  228.     vswp            d17, d24    // 8, 12
  229.     vswp            d21, d28    // 10,14
  230.     vtrn.32         q8,  q10
  231.     vtrn.32         q12, q14
  232.     vswp            d19, d26    // 9, 13
  233.     vswp            d23, d30    // 11,15
  234.     vtrn.32         q9,  q11
  235.     vtrn.32         q13, q15
  236.     vtrn.16         q10, q11
  237.     vtrn.16         q12, q13
  238.     vtrn.16         q8,  q9
  239.     vtrn.16         q14, q15
  240.     DCT8_1D col
  241.     vst1.64         {d16-d19}, [r0,:128]!
  242.     vst1.64         {d20-d23}, [r0,:128]!
  243.     vst1.64         {d24-d27}, [r0,:128]!
  244.     vst1.64         {d28-d31}, [r0,:128]!
  245.     bx              lr
  246. .endfunc
  247. function x264_sub16x16_dct8_neon, export=1
  248.     push            {lr}
  249.     bl              x264_sub8x8_dct8_neon
  250.     sub             r1,  r1,  #FENC_STRIDE*8 - 8
  251.     sub             r2,  r2,  #FDEC_STRIDE*8 - 8
  252.     bl              x264_sub8x8_dct8_neon
  253.     sub             r1,  r1,  #8
  254.     sub             r2,  r2,  #8
  255.     bl              x264_sub8x8_dct8_neon
  256.     pop             {lr}
  257.     sub             r1,  r1,  #FENC_STRIDE*8 - 8
  258.     sub             r2,  r2,  #FDEC_STRIDE*8 - 8
  259.     b               x264_sub8x8_dct8_neon
  260. .endfunc
  261. // First part of IDCT (minus final SUMSUB_BA)
  262. .macro IDCT_1D d4 d5 d6 d7 d0 d1 d2 d3
  263.     SUMSUB_AB       d4, d5, d0, d2
  264.     vshr.s16        d7, d1, #1
  265.     vshr.s16        d6, d3, #1
  266.     vsub.s16        d7, d7, d3
  267.     vadd.s16        d6, d6, d1
  268. .endm
  269. function x264_add4x4_idct_neon, export=1
  270.     mov             r2, #FDEC_STRIDE
  271.     vld1.64         {d0-d3}, [r1,:128]
  272.     IDCT_1D         d4, d5, d6, d7, d0, d1, d2, d3
  273.     vld1.32         {d30[0]}, [r0,:32], r2
  274.     SUMSUB_AB       q0, q1, q2, q3
  275.     TRANSPOSE4x4_16 d0, d1, d3, d2
  276.     IDCT_1D         d4, d5, d6, d7, d0, d1, d3, d2
  277.     vld1.32         {d30[1]}, [r0,:32], r2
  278.     SUMSUB_AB       q0, q1, q2, q3
  279.     vrshr.s16       q0, q0, #6
  280.     vld1.32         {d31[1]}, [r0,:32], r2
  281.     vrshr.s16       q1, q1, #6
  282.     vld1.32         {d31[0]}, [r0,:32], r2
  283.     sub             r0, r0, r2, lsl #2
  284.     vaddw.u8        q0, q0, d30
  285.     vaddw.u8        q1, q1, d31
  286.     vqmovun.s16     d0, q0
  287.     vqmovun.s16     d2, q1
  288.     vst1.32         {d0[0]}, [r0,:32], r2
  289.     vst1.32         {d0[1]}, [r0,:32], r2
  290.     vst1.32         {d2[1]}, [r0,:32], r2
  291.     vst1.32         {d2[0]}, [r0,:32], r2
  292.     bx              lr
  293. .endfunc
  294. function x264_add8x4_idct_neon, export=1
  295.     vld1.64         {d0-d3}, [r1,:128]!
  296.     IDCT_1D         d16, d18, d20, d22, d0, d1, d2, d3
  297.     vld1.64         {d4-d7}, [r1,:128]!
  298.     IDCT_1D         d17, d19, d21, d23, d4, d5, d6, d7
  299.     SUMSUB_AB       q0,  q3,  q8,  q10
  300.     SUMSUB_AB       q1,  q2,  q9,  q11
  301.     TRANSPOSE4x4_16 q0,  q1,  q2,  q3
  302.     IDCT_1D         q8,  q9,  q10, q11, q0, q1, q2, q3
  303.     SUMSUB_AB       q0,  q3,  q8,  q10
  304.     SUMSUB_AB       q1,  q2,  q9,  q11
  305.     vrshr.s16       q0,  q0,  #6
  306.     vld1.32         {d28}, [r0,:64], r2
  307.     vrshr.s16       q1,  q1,  #6
  308.     vld1.32         {d29}, [r0,:64], r2
  309.     vrshr.s16       q2,  q2,  #6
  310.     vld1.32         {d30}, [r0,:64], r2
  311.     vrshr.s16       q3,  q3,  #6
  312.     vld1.32         {d31}, [r0,:64], r2
  313.     sub             r0,  r0,  r2,  lsl #2
  314.     vaddw.u8        q0,  q0,  d28
  315.     vaddw.u8        q1,  q1,  d29
  316.     vaddw.u8        q2,  q2,  d30
  317.     vaddw.u8        q3,  q3,  d31
  318.     vqmovun.s16     d0,  q0
  319.     vqmovun.s16     d1,  q1
  320.     vst1.32         {d0}, [r0,:64], r2
  321.     vqmovun.s16     d2,  q2
  322.     vst1.32         {d1}, [r0,:64], r2
  323.     vqmovun.s16     d3,  q3
  324.     vst1.32         {d2}, [r0,:64], r2
  325.     vst1.32         {d3}, [r0,:64], r2
  326.     bx              lr
  327. .endfunc
  328. function x264_add8x8_idct_neon, export=1
  329.     mov             r2, #FDEC_STRIDE
  330.     mov             ip, lr
  331.     bl              x264_add8x4_idct_neon
  332.     mov             lr, ip
  333.     b               x264_add8x4_idct_neon
  334. .endfunc
  335. function x264_add16x16_idct_neon, export=1
  336.     mov             r2, #FDEC_STRIDE
  337.     mov             ip, lr
  338.     bl              x264_add8x4_idct_neon
  339.     bl              x264_add8x4_idct_neon
  340.     sub             r0, r0, #8*FDEC_STRIDE-8
  341.     bl              x264_add8x4_idct_neon
  342.     bl              x264_add8x4_idct_neon
  343.     sub             r0, r0, #8
  344.     bl              x264_add8x4_idct_neon
  345.     bl              x264_add8x4_idct_neon
  346.     sub             r0, r0, #8*FDEC_STRIDE-8
  347.     bl              x264_add8x4_idct_neon
  348.     mov             lr, ip
  349.     b               x264_add8x4_idct_neon
  350. .endfunc
  351. .macro IDCT8_1D type
  352. .ifc type, col
  353.     vswp            d21, d28
  354. .endif
  355.     SUMSUB_AB       q0,  q1,  q8,  q12              // a0/a2
  356. .ifc type, row
  357.     vld1.64         {d28-d31}, [r1,:128]!
  358. .else
  359.     vswp            d19, d26
  360. .endif
  361.     SUMSUB_SHR   1, q2,  q3,  q10, q14,  q8, q12    // a6/a4
  362. .ifc type, col
  363.     vswp            d23, d30
  364. .endif
  365.     SUMSUB_AB       q8,  q10, q13, q11
  366.     SUMSUB_15       q8,  q10, q9,  q15,  q12, q14   // a7/a1
  367.     SUMSUB_AB       q14, q15, q15, q9
  368.     SUMSUB_15       q15, q14, q13, q11,  q12, q9    // a5/a3
  369.     SUMSUB_SHR   2, q13, q14, q14, q15,  q11, q9    // b3/b5
  370.     SUMSUB_SHR2  2, q12, q15, q8,  q10,  q11, q9    // b1/b7
  371.     SUMSUB_AB       q10, q2,  q0,  q2               // b0/b6
  372.     SUMSUB_AB       q11, q3,  q1,  q3               // b2/b4
  373.     SUMSUB_AB       q8,  q15, q10, q15
  374.     SUMSUB_AB       q9,  q14, q11, q14
  375.     SUMSUB_AB       q10, q13, q3,  q13
  376. .ifc type, row
  377.     vtrn.16         q8,  q9
  378. .endif
  379.     SUMSUB_AB       q11, q12, q2,  q12
  380. .endm
  381. function x264_add8x8_idct8_neon, export=1
  382.     mov             r2,  #FDEC_STRIDE
  383.     vld1.64         {d16-d19}, [r1,:128]!
  384.     vld1.64         {d20-d23}, [r1,:128]!
  385.     vld1.64         {d24-d27}, [r1,:128]!
  386.     IDCT8_1D row
  387.     vtrn.16         q10, q11
  388.     vtrn.16         q12, q13
  389.     vtrn.16         q14, q15
  390.     vtrn.32         q8,  q10
  391.     vtrn.32         q9,  q11
  392.     vtrn.32         q12, q14
  393.     vtrn.32         q13, q15
  394.     vswp            d17, d24
  395.     IDCT8_1D col
  396.     vld1.64         {d0}, [r0,:64], r2
  397.     vrshr.s16       q8,  q8,  #6
  398.     vld1.64         {d1}, [r0,:64], r2
  399.     vrshr.s16       q9,  q9,  #6
  400.     vld1.64         {d2}, [r0,:64], r2
  401.     vrshr.s16       q10, q10, #6
  402.     vld1.64         {d3}, [r0,:64], r2
  403.     vrshr.s16       q11, q11, #6
  404.     vld1.64         {d4}, [r0,:64], r2
  405.     vrshr.s16       q12, q12, #6
  406.     vld1.64         {d5}, [r0,:64], r2
  407.     vrshr.s16       q13, q13, #6
  408.     vld1.64         {d6}, [r0,:64], r2
  409.     vrshr.s16       q14, q14, #6
  410.     vld1.64         {d7}, [r0,:64], r2
  411.     vrshr.s16       q15, q15, #6
  412.     sub             r0,  r0,  r2,  lsl #3
  413.     vaddw.u8        q8,  q8,  d0
  414.     vaddw.u8        q9,  q9,  d1
  415.     vaddw.u8        q10, q10, d2
  416.     vqmovun.s16     d0,  q8
  417.     vqmovun.s16     d1,  q9
  418.     vqmovun.s16     d2,  q10
  419.     vaddw.u8        q11, q11, d3
  420.     vst1.64         {d0}, [r0,:64], r2
  421.     vaddw.u8        q12, q12, d4
  422.     vst1.64         {d1}, [r0,:64], r2
  423.     vaddw.u8        q13, q13, d5
  424.     vst1.64         {d2}, [r0,:64], r2
  425.     vqmovun.s16     d3,  q11
  426.     vqmovun.s16     d4,  q12
  427.     vaddw.u8        q14, q14, d6
  428.     vaddw.u8        q15, q15, d7
  429.     vst1.64         {d3}, [r0,:64], r2
  430.     vqmovun.s16     d5,  q13
  431.     vst1.64         {d4}, [r0,:64], r2
  432.     vqmovun.s16     d6,  q14
  433.     vqmovun.s16     d7,  q15
  434.     vst1.64         {d5}, [r0,:64], r2
  435.     vst1.64         {d6}, [r0,:64], r2
  436.     vst1.64         {d7}, [r0,:64], r2
  437.     bx              lr
  438. .endfunc
  439. function x264_add16x16_idct8_neon, export=1
  440.     mov             ip,  lr
  441.     bl              x264_add8x8_idct8_neon
  442.     sub             r0,  r0,  #8*FDEC_STRIDE-8
  443.     bl              x264_add8x8_idct8_neon
  444.     sub             r0,  r0,  #8
  445.     bl              x264_add8x8_idct8_neon
  446.     sub             r0,  r0,  #8*FDEC_STRIDE-8
  447.     mov             lr,  ip
  448.     b               x264_add8x8_idct8_neon
  449. .endfunc
  450. function x264_add8x8_idct_dc_neon, export=1
  451.     mov             r2,  #FDEC_STRIDE
  452.     vld1.64         {d16}, [r1,:64]
  453.     vrshr.s16       d16, d16, #6
  454.     vld1.64         {d0}, [r0,:64], r2
  455.     vmov.i16        q15, #0
  456.     vld1.64         {d1}, [r0,:64], r2
  457.     vld1.64         {d2}, [r0,:64], r2
  458.     vdup.16         d20, d16[0]
  459.     vld1.64         {d3}, [r0,:64], r2
  460.     vdup.16         d21, d16[1]
  461.     vld1.64         {d4}, [r0,:64], r2
  462.     vdup.16         d22, d16[2]
  463.     vld1.64         {d5}, [r0,:64], r2
  464.     vdup.16         d23, d16[3]
  465.     vld1.64         {d6}, [r0,:64], r2
  466.     vsub.s16        q12, q15, q10
  467.     vld1.64         {d7}, [r0,:64], r2
  468.     vsub.s16        q13, q15, q11
  469.     sub             r0,  r0,  #8*FDEC_STRIDE
  470.     vqmovun.s16     d20, q10
  471.     vqmovun.s16     d22, q11
  472.     vqmovun.s16     d24, q12
  473.     vqmovun.s16     d26, q13
  474.     vmov            d21, d20
  475.     vqadd.u8        q0,  q0,  q10
  476.     vmov            d23, d22
  477.     vqadd.u8        q1,  q1,  q10
  478.     vmov            d25, d24
  479.     vqadd.u8        q2,  q2,  q11
  480.     vmov            d27, d26
  481.     vqadd.u8        q3,  q3,  q11
  482.     vqsub.u8        q0,  q0,  q12
  483.     vqsub.u8        q1,  q1,  q12
  484.     vqsub.u8        q2,  q2,  q13
  485.     vst1.64         {d0}, [r0,:64], r2
  486.     vqsub.u8        q3,  q3,  q13
  487.     vst1.64         {d1}, [r0,:64], r2
  488.     vst1.64         {d2}, [r0,:64], r2
  489.     vst1.64         {d3}, [r0,:64], r2
  490.     vst1.64         {d4}, [r0,:64], r2
  491.     vst1.64         {d5}, [r0,:64], r2
  492.     vst1.64         {d6}, [r0,:64], r2
  493.     vst1.64         {d7}, [r0,:64], r2
  494.     bx              lr
  495. .endfunc
  496. .macro ADD16x4_IDCT_DC dc
  497.     vld1.64         {d16-d17}, [r0,:128], r3
  498.     vld1.64         {d18-d19}, [r0,:128], r3
  499.     vdup.16         d4,  dc[0]
  500.     vdup.16         d5,  dc[1]
  501.     vld1.64         {d20-d21}, [r0,:128], r3
  502.     vdup.16         d6,  dc[2]
  503.     vdup.16         d7,  dc[3]
  504.     vld1.64         {d22-d23}, [r0,:128], r3
  505.     vsub.s16        q12, q15, q2
  506.     vsub.s16        q13, q15, q3
  507.     vqmovun.s16     d4,  q2
  508.     vqmovun.s16     d5,  q3
  509.     vqmovun.s16     d6,  q12
  510.     vqmovun.s16     d7,  q13
  511.     vqadd.u8        q8,  q8,  q2
  512.     vqadd.u8        q9,  q9,  q2
  513.     vqadd.u8        q10, q10, q2
  514.     vqadd.u8        q11, q11, q2
  515.     vqsub.u8        q8,  q8,  q3
  516.     vqsub.u8        q9,  q9,  q3
  517.     vqsub.u8        q10, q10, q3
  518.     vst1.64         {d16-d17}, [r2,:128], r3
  519.     vqsub.u8        q11, q11, q3
  520.     vst1.64         {d18-d19}, [r2,:128], r3
  521.     vst1.64         {d20-d21}, [r2,:128], r3
  522.     vst1.64         {d22-d23}, [r2,:128], r3
  523. .endm
  524. function x264_add16x16_idct_dc_neon, export=1
  525.     mov             r2,  r0
  526.     mov             r3,  #FDEC_STRIDE
  527.     vmov.i16        q15, #0
  528.     vld1.64         {d0-d3}, [r1,:64]
  529.     vrshr.s16       q0, #6
  530.     vrshr.s16       q1, #6
  531.     ADD16x4_IDCT_DC d0
  532.     ADD16x4_IDCT_DC d1
  533.     ADD16x4_IDCT_DC d2
  534.     ADD16x4_IDCT_DC d3
  535.     bx              lr
  536. .endfunc
  537. function x264_sub8x8_dct_dc_neon, export=1
  538.     mov             r3,  #FENC_STRIDE
  539.     mov             ip,  #FDEC_STRIDE
  540.     vld1.64         {d16}, [r1,:64], r3
  541.     vld1.64         {d17}, [r2,:64], ip
  542.     vsubl.u8        q8,  d16, d17
  543.     vld1.64         {d18}, [r1,:64], r3
  544.     vld1.64         {d19}, [r2,:64], ip
  545.     vsubl.u8        q9,  d18, d19
  546.     vld1.64         {d20}, [r1,:64], r3
  547.     vld1.64         {d21}, [r2,:64], ip
  548.     vsubl.u8        q10, d20, d21
  549.     vld1.64         {d22}, [r1,:64], r3
  550.     vadd.s16        q0,  q8,  q9
  551.     vld1.64         {d23}, [r2,:64], ip
  552.     vsubl.u8        q11, d22, d23
  553.     vld1.64         {d24}, [r1,:64], r3
  554.     vadd.s16        q0,  q0,  q10
  555.     vld1.64         {d25}, [r2,:64], ip
  556.     vsubl.u8        q12, d24, d25
  557.     vld1.64         {d26}, [r1,:64], r3
  558.     vadd.s16        q0,  q0,  q11
  559.     vld1.64         {d27}, [r2,:64], ip
  560.     vsubl.u8        q13, d26, d27
  561.     vld1.64         {d28}, [r1,:64], r3
  562.     vld1.64         {d29}, [r2,:64], ip
  563.     vsubl.u8        q14, d28, d29
  564.     vld1.64         {d30}, [r1,:64], r3
  565.     vadd.s16        q1,  q12, q13
  566.     vld1.64         {d31}, [r2,:64], ip
  567.     vpadd.s16       d0,  d0,  d1
  568.     vadd.s16        q1,  q1,  q14
  569.     vsubl.u8        q15, d30, d31
  570.     vadd.s16        q1,  q1,  q15
  571.     vpadd.s16       d2,  d2,  d3
  572.     vpadd.s16       d0,  d0,  d2
  573.     vst1.64         {d0}, [r0,:64]
  574.     bx              lr
  575. .endfunc
  576. function x264_zigzag_scan_4x4_frame_neon, export=1
  577.     movrel      r2, scan4x4_frame
  578.     vld1.64     {d0-d3},   [r1,:128]
  579.     vld1.64     {d16-d19}, [r2,:128]
  580.     vtbl.8      d4, {d0-d1}, d16
  581.     vtbl.8      d5, {d1-d3}, d17
  582.     vtbl.8      d6, {d0-d2}, d18
  583.     vtbl.8      d7, {d2-d3}, d19
  584.     vst1.64     {d4-d7},   [r0,:128]
  585.     bx          lr
  586. .endfunc