OLD | NEW |
1 /* Copyright (c) 2010 Xiph.Org Foundation | 1 /* Copyright (c) 2010 Xiph.Org Foundation |
2 * Copyright (c) 2013 Parrot */ | 2 * Copyright (c) 2013 Parrot */ |
3 /* | 3 /* |
4 Redistribution and use in source and binary forms, with or without | 4 Redistribution and use in source and binary forms, with or without |
5 modification, are permitted provided that the following conditions | 5 modification, are permitted provided that the following conditions |
6 are met: | 6 are met: |
7 | 7 |
8 - Redistributions of source code must retain the above copyright | 8 - Redistributions of source code must retain the above copyright |
9 notice, this list of conditions and the following disclaimer. | 9 notice, this list of conditions and the following disclaimer. |
10 | 10 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #define OPUS_CPU_ARM_EDSP (1<<1) | 42 #define OPUS_CPU_ARM_EDSP (1<<1) |
43 #define OPUS_CPU_ARM_MEDIA (1<<2) | 43 #define OPUS_CPU_ARM_MEDIA (1<<2) |
44 #define OPUS_CPU_ARM_NEON (1<<3) | 44 #define OPUS_CPU_ARM_NEON (1<<3) |
45 | 45 |
46 #if defined(_MSC_VER) | 46 #if defined(_MSC_VER) |
47 /*For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.*/ | 47 /*For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.*/ |
48 # define WIN32_LEAN_AND_MEAN | 48 # define WIN32_LEAN_AND_MEAN |
49 # define WIN32_EXTRA_LEAN | 49 # define WIN32_EXTRA_LEAN |
50 # include <windows.h> | 50 # include <windows.h> |
51 | 51 |
52 static inline opus_uint32 opus_cpu_capabilities(void){ | 52 static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){ |
53 opus_uint32 flags; | 53 opus_uint32 flags; |
54 flags=0; | 54 flags=0; |
55 /* MSVC has no inline __asm support for ARM, but it does let you __emit | 55 /* MSVC has no OPUS_INLINE __asm support for ARM, but it does let you __emit |
56 * instructions via their assembled hex code. | 56 * instructions via their assembled hex code. |
57 * All of these instructions should be essentially nops. */ | 57 * All of these instructions should be essentially nops. */ |
58 # if defined(ARMv5E_ASM) | 58 # if defined(OPUS_ARM_MAY_HAVE_EDSP) |
59 __try{ | 59 __try{ |
60 /*PLD [r13]*/ | 60 /*PLD [r13]*/ |
61 __emit(0xF5DDF000); | 61 __emit(0xF5DDF000); |
62 flags|=OPUS_CPU_ARM_EDSP; | 62 flags|=OPUS_CPU_ARM_EDSP; |
63 } | 63 } |
64 __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ | 64 __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ |
65 /*Ignore exception.*/ | 65 /*Ignore exception.*/ |
66 } | 66 } |
67 # if defined(ARMv6E_ASM) | 67 # if defined(OPUS_ARM_MAY_HAVE_MEDIA) |
68 __try{ | 68 __try{ |
69 /*SHADD8 r3,r3,r3*/ | 69 /*SHADD8 r3,r3,r3*/ |
70 __emit(0xE6333F93); | 70 __emit(0xE6333F93); |
71 flags|=OPUS_CPU_ARM_MEDIA; | 71 flags|=OPUS_CPU_ARM_MEDIA; |
72 } | 72 } |
73 __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ | 73 __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ |
74 /*Ignore exception.*/ | 74 /*Ignore exception.*/ |
75 } | 75 } |
76 # if defined(ARM_HAVE_NEON) | 76 # if defined(OPUS_ARM_MAY_HAVE_NEON) |
77 __try{ | 77 __try{ |
78 /*VORR q0,q0,q0*/ | 78 /*VORR q0,q0,q0*/ |
79 __emit(0xF2200150); | 79 __emit(0xF2200150); |
80 flags|=OPUS_CPU_ARM_NEON; | 80 flags|=OPUS_CPU_ARM_NEON; |
81 } | 81 } |
82 __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ | 82 __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ |
83 /*Ignore exception.*/ | 83 /*Ignore exception.*/ |
84 } | 84 } |
85 # endif | 85 # endif |
86 # endif | 86 # endif |
(...skipping 13 matching lines...) Expand all Loading... |
100 cpuinfo = fopen("/proc/cpuinfo", "r"); | 100 cpuinfo = fopen("/proc/cpuinfo", "r"); |
101 | 101 |
102 if(cpuinfo != NULL) | 102 if(cpuinfo != NULL) |
103 { | 103 { |
104 /* 512 should be enough for anybody (it's even enough for all the flags that | 104 /* 512 should be enough for anybody (it's even enough for all the flags that |
105 * x86 has accumulated... so far). */ | 105 * x86 has accumulated... so far). */ |
106 char buf[512]; | 106 char buf[512]; |
107 | 107 |
108 while(fgets(buf, 512, cpuinfo) != NULL) | 108 while(fgets(buf, 512, cpuinfo) != NULL) |
109 { | 109 { |
| 110 # if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_NEON) |
110 /* Search for edsp and neon flag */ | 111 /* Search for edsp and neon flag */ |
111 if(memcmp(buf, "Features", 8) == 0) | 112 if(memcmp(buf, "Features", 8) == 0) |
112 { | 113 { |
113 char *p; | 114 char *p; |
| 115 # if defined(OPUS_ARM_MAY_HAVE_EDSP) |
114 p = strstr(buf, " edsp"); | 116 p = strstr(buf, " edsp"); |
115 if(p != NULL && (p[5] == ' ' || p[5] == '\n')) | 117 if(p != NULL && (p[5] == ' ' || p[5] == '\n')) |
116 flags |= OPUS_CPU_ARM_EDSP; | 118 flags |= OPUS_CPU_ARM_EDSP; |
| 119 # endif |
117 | 120 |
| 121 # if defined(OPUS_ARM_MAY_HAVE_NEON) |
118 p = strstr(buf, " neon"); | 122 p = strstr(buf, " neon"); |
119 if(p != NULL && (p[5] == ' ' || p[5] == '\n')) | 123 if(p != NULL && (p[5] == ' ' || p[5] == '\n')) |
120 flags |= OPUS_CPU_ARM_NEON; | 124 flags |= OPUS_CPU_ARM_NEON; |
| 125 # endif |
121 } | 126 } |
| 127 # endif |
122 | 128 |
| 129 # if defined(OPUS_ARM_MAY_HAVE_MEDIA) |
123 /* Search for media capabilities (>= ARMv6) */ | 130 /* Search for media capabilities (>= ARMv6) */ |
124 if(memcmp(buf, "CPU architecture:", 17) == 0) | 131 if(memcmp(buf, "CPU architecture:", 17) == 0) |
125 { | 132 { |
126 int version; | 133 int version; |
127 version = atoi(buf+17); | 134 version = atoi(buf+17); |
128 | 135 |
129 if(version >= 6) | 136 if(version >= 6) |
130 flags |= OPUS_CPU_ARM_MEDIA; | 137 flags |= OPUS_CPU_ARM_MEDIA; |
131 } | 138 } |
| 139 # endif |
132 } | 140 } |
133 | 141 |
134 fclose(cpuinfo); | 142 fclose(cpuinfo); |
135 } | 143 } |
136 return flags; | 144 return flags; |
137 } | 145 } |
138 #else | 146 #else |
139 /* The feature registers which can tell us what the processor supports are | 147 /* The feature registers which can tell us what the processor supports are |
140 * accessible in priveleged modes only, so we can't have a general user-space | 148 * accessible in priveleged modes only, so we can't have a general user-space |
141 * detection method like on x86.*/ | 149 * detection method like on x86.*/ |
(...skipping 15 matching lines...) Expand all Loading... |
157 arch++; | 165 arch++; |
158 | 166 |
159 if(!(flags & OPUS_CPU_ARM_NEON)) | 167 if(!(flags & OPUS_CPU_ARM_NEON)) |
160 return arch; | 168 return arch; |
161 arch++; | 169 arch++; |
162 | 170 |
163 return arch; | 171 return arch; |
164 } | 172 } |
165 | 173 |
166 #endif | 174 #endif |
OLD | NEW |