]> git.sesse.net Git - x264/blob - common/arm/cpu-a.S
arm: check if the assembler supports the '.func' directive
[x264] / common / arm / cpu-a.S
1 /*****************************************************************************
2  * cpu-a.S: arm cpu detection
3  *****************************************************************************
4  * Copyright (C) 2009-2014 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  * This program is also available under a commercial proprietary license.
23  * For more information, contact us at licensing@x264.com.
24  *****************************************************************************/
25
26 #include "asm.S"
27
28 .align 2
29
30 // done in gas because .fpu neon overrides the refusal to assemble
31 // instructions the selected -march/-mcpu doesn't support
32 function x264_cpu_neon_test
33     vadd.i16    q0, q0, q0
34     bx          lr
35 endfunc
36
37 // return: 0 on success
38 //         1 if counters were already enabled
39 //         9 if lo-res counters were already enabled
40 function x264_cpu_enable_armv7_counter, export=0
41     mrc         p15, 0, r2, c9, c12, 0      // read PMNC
42     ands        r0, r2, #1
43     andne       r0, r2, #9
44
45     orr         r2, r2, #1                  // enable counters
46     bic         r2, r2, #8                  // full resolution
47     mcreq       p15, 0, r2, c9, c12, 0      // write PMNC
48     mov         r2, #1 << 31                // enable cycle counter
49     mcr         p15, 0, r2, c9, c12, 1      // write CNTENS
50     bx          lr
51 endfunc
52
53 function x264_cpu_disable_armv7_counter, export=0
54     mrc         p15, 0, r0, c9, c12, 0      // read PMNC
55     bic         r0, r0, #1                  // disable counters
56     mcr         p15, 0, r0, c9, c12, 0      // write PMNC
57     bx          lr
58 endfunc
59
60
61 .macro READ_TIME r
62     mrc         p15, 0, \r, c9, c13, 0
63 .endm
64
65 // return: 0 if transfers neon -> arm transfers take more than 10 cycles
66 //         nonzero otherwise
67 function x264_cpu_fast_neon_mrc_test
68     // check for user access to performance counters
69     mrc         p15, 0, r0, c9, c14, 0
70     cmp         r0, #0
71     bxeq        lr
72
73     push        {r4-r6,lr}
74     bl          x264_cpu_enable_armv7_counter
75     ands        r1, r0, #8
76     mov         r3, #0
77     mov         ip, #4
78     mov         r6, #4
79     moveq       r5, #1
80     movne       r5, #64
81
82 average_loop:
83     mov         r4, r5
84     READ_TIME   r1
85 1:  subs        r4, r4, #1
86 .rept 8
87     vmov.u32    lr, d0[0]
88     add         lr, lr, lr
89 .endr
90     bgt         1b
91     READ_TIME   r2
92
93     subs        r6, r6, #1
94     sub         r2, r2, r1
95     cmpgt       r2, #30 << 3    // assume context switch if it took over 30 cycles
96     addle       r3, r3, r2
97     subsle      ip, ip, #1
98     bgt         average_loop
99
100     // disable counters if we enabled them
101     ands        r0, r0, #1
102     bleq        x264_cpu_disable_armv7_counter
103
104     lsr         r0, r3, #5
105     cmp         r0, #10
106     movgt       r0, #0
107     pop         {r4-r6,pc}
108 endfunc