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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20. #include "config.h"
  21.         .macro require8, val=1
  22.         .eabi_attribute 24, val
  23.         .endm
  24.         .macro preserve8, val=1
  25.         .eabi_attribute 25, val
  26.         .endm
  27.         .macro function name, export=0
  28. .if export
  29.         .global name
  30. .endif
  31.         .type   name, %function
  32.         .func   name
  33. name:
  34.         .endm
  35.         .macro movrel rd, val
  36. #if defined(HAVE_ARMV6T2) && !defined(PIC)
  37.         movw            rd, #:lower16:val
  38.         movt            rd, #:upper16:val
  39. #else
  40.         ldr             rd, =val
  41. #endif
  42.         .endm
  43. .macro movconst rd, val
  44. #ifdef HAVE_ARMV6T2
  45.     movw        rd, #:lower16:val
  46. .if val >> 16
  47.     movt        rd, #:upper16:val
  48. .endif
  49. #else
  50.     ldr         rd, =val
  51. #endif
  52. .endm
  53. #define FENC_STRIDE 16
  54. #define FDEC_STRIDE 32
  55. .macro HORIZ_ADD dest, a, b
  56. .ifnb b
  57.     vadd.u16    a, a, b
  58. .endif
  59.     vpaddl.u16  a, a
  60.     vpaddl.u32  dest, a
  61. .endm
  62. .macro SUMSUB_AB sum, diff, a, b
  63.     vadd.s16    sum,  a, b
  64.     vsub.s16    diff, a, b
  65. .endm
  66. .macro SUMSUB_ABCD s1, d1, s2, d2, a, b, c, d
  67.     SUMSUB_AB   s1, d1, a, b
  68.     SUMSUB_AB   s2, d2, c, d
  69. .endm
  70. .macro ABS2 a b
  71.     vabs.s16 a, a
  72.     vabs.s16 b, b
  73. .endm
  74. // dist = distance in elements (0 for vertical pass, 1/2 for horizontal passes)
  75. // op = sumsub/amax (sum and diff / maximum of absolutes)
  76. // d1/2 = destination registers
  77. // s1/2 = source registers
  78. .macro HADAMARD dist, op, d1, d2, s1, s2
  79. .if dist == 1
  80.     vtrn.16     s1, s2
  81. .else
  82.     vtrn.32     s1, s2
  83. .endif
  84. .ifc op, sumsub
  85.     SUMSUB_AB   d1, d2, s1, s2
  86. .else
  87.     vabs.s16    s1, s1
  88.     vabs.s16    s2, s2
  89.     vmax.s16    d1, s1, s2
  90. .endif
  91. .endm
  92. .macro TRANSPOSE8x8 r0 r1 r2 r3 r4 r5 r6 r7
  93.     vtrn.32         r0, r4
  94.     vtrn.32         r1, r5
  95.     vtrn.32         r2, r6
  96.     vtrn.32         r3, r7
  97.     vtrn.16         r0, r2
  98.     vtrn.16         r1, r3
  99.     vtrn.16         r4, r6
  100.     vtrn.16         r5, r7
  101.     vtrn.8          r0, r1
  102.     vtrn.8          r2, r3
  103.     vtrn.8          r4, r5
  104.     vtrn.8          r6, r7
  105. .endm
  106. .macro TRANSPOSE4x4 r0 r1 r2 r3
  107.     vtrn.16         r0, r2
  108.     vtrn.16         r1, r3
  109.     vtrn.8          r0, r1
  110.     vtrn.8          r2, r3
  111. .endm
  112. .macro TRANSPOSE4x4_16  d0 d1 d2 d3
  113.     vtrn.32     d0, d2
  114.     vtrn.32     d1, d3
  115.     vtrn.16     d0, d1
  116.     vtrn.16     d2, d3
  117. .endm