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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * cpu-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. .align
  25. // done in gas because .fpu neon overrides the refusal to assemble
  26. // instructions the selected -march/-mcpu doesn't support
  27. function x264_cpu_neon_test, export=1
  28.     vadd.i16    q0, q0, q0
  29.     bx          lr
  30. .endfunc
  31. // return: 0 on success
  32. //         1 if counters were already enabled
  33. //         9 if lo-res counters were already enabled
  34. function x264_cpu_enable_armv7_counter
  35.     mrc         p15, 0, r2, c9, c12, 0      // read PMNC
  36.     ands        r0, r2, #1
  37.     andne       r0, r2, #9
  38.     orr         r2, r2, #1                  // enable counters
  39.     bic         r2, r2, #8                  // full resolution
  40.     mcreq       p15, 0, r2, c9, c12, 0      // write PMNC
  41.     mov         r2, #1 << 31                // enable cycle counter
  42.     mcr         p15, 0, r2, c9, c12, 1      // write CNTENS
  43.     bx          lr
  44. .endfunc
  45. function x264_cpu_disable_armv7_counter
  46.     mrc         p15, 0, r0, c9, c12, 0      // read PMNC
  47.     bic         r0, r0, #1                  // disable counters
  48.     mcr         p15, 0, r0, c9, c12, 0      // write PMNC
  49.     bx          lr
  50. .endfunc
  51. .macro READ_TIME r
  52.     mrc         p15, 0, r, c9, c13, 0
  53. .endm
  54. // return: 0 if transfers neon -> arm transfers take more than 10 cycles
  55. //         nonzero otherwise
  56. function x264_cpu_fast_neon_mrc_test, export=1
  57.     // check for user access to performance counters
  58.     mrc         p15, 0, r0, c9, c14, 0
  59.     cmp         r0, #0
  60.     bxeq        lr
  61.     push        {r4-r6,lr}
  62.     bl          x264_cpu_enable_armv7_counter
  63.     ands        r1, r0, #8
  64.     mov         r3, #0
  65.     mov         ip, #4
  66.     mov         r6, #4
  67.     moveq       r5, #1
  68.     movne       r5, #64
  69. average_loop:
  70.     mov         r4, r5
  71.     READ_TIME   r1
  72. 1:  subs        r4, r4, #1
  73. .rept 8
  74.     vmov.u32    lr, d0[0]
  75.     add         lr, lr, lr
  76. .endr
  77.     bgt         1b
  78.     READ_TIME   r2
  79.     subs        r6, r6, #1
  80.     sub         r2, r2, r1
  81.     cmpgt       r2, #30 << 3    // assume context switch if it took over 30 cycles
  82.     addle       r3, r3, r2
  83.     subles      ip, ip, #1
  84.     bgt         average_loop
  85.     // disable counters if we enabled them
  86.     ands        r0, r0, #1
  87.     bleq        x264_cpu_disable_armv7_counter
  88.     lsr         r0, r3, #5
  89.     cmp         r0, #10
  90.     movgt       r0, #0
  91.     pop         {r4-r6,pc}
  92. .endfunc