xref: /aosp_15_r20/external/libvpx/vpx_ports/loongarch_cpudetect.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  * Copyright (c) 2021 Loongson Technology Corporation Limited
3*fb1b10abSAndroid Build Coastguard Worker  * Contributed by Jin Bo  <[email protected]>
4*fb1b10abSAndroid Build Coastguard Worker  * Contributed by Lu Wang <[email protected]>
5*fb1b10abSAndroid Build Coastguard Worker  *
6*fb1b10abSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license
7*fb1b10abSAndroid Build Coastguard Worker  * that can be found in the LICENSE file in the root of the source
8*fb1b10abSAndroid Build Coastguard Worker  * tree. An additional intellectual property rights grant can be found
9*fb1b10abSAndroid Build Coastguard Worker  * in the file PATENTS.  All contributing project authors may
10*fb1b10abSAndroid Build Coastguard Worker  * be found in the AUTHORS file in the root of the source tree.
11*fb1b10abSAndroid Build Coastguard Worker  */
12*fb1b10abSAndroid Build Coastguard Worker 
13*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/loongarch.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #define LOONGARCH_CFG2 0x02
17*fb1b10abSAndroid Build Coastguard Worker #define LOONGARCH_CFG2_LSX (1 << 6)
18*fb1b10abSAndroid Build Coastguard Worker #define LOONGARCH_CFG2_LASX (1 << 7)
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_RUNTIME_CPU_DETECT
21*fb1b10abSAndroid Build Coastguard Worker #if defined(__loongarch__) && defined(__linux__)
loongarch_cpu_caps(void)22*fb1b10abSAndroid Build Coastguard Worker int loongarch_cpu_caps(void) {
23*fb1b10abSAndroid Build Coastguard Worker   int reg = 0;
24*fb1b10abSAndroid Build Coastguard Worker   int flag = 0;
25*fb1b10abSAndroid Build Coastguard Worker 
26*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile("cpucfg %0, %1 \n\t" : "+&r"(reg) : "r"(LOONGARCH_CFG2));
27*fb1b10abSAndroid Build Coastguard Worker   if (reg & LOONGARCH_CFG2_LSX) flag |= HAS_LSX;
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker   if (reg & LOONGARCH_CFG2_LASX) flag |= HAS_LASX;
30*fb1b10abSAndroid Build Coastguard Worker 
31*fb1b10abSAndroid Build Coastguard Worker   return flag;
32*fb1b10abSAndroid Build Coastguard Worker }
33*fb1b10abSAndroid Build Coastguard Worker #else /* end __loongarch__ && __linux__ */
34*fb1b10abSAndroid Build Coastguard Worker #error \
35*fb1b10abSAndroid Build Coastguard Worker     "--enable-runtime-cpu-detect selected, but no CPU detection method " \
36*fb1b10abSAndroid Build Coastguard Worker "available for your platform. Reconfigure with --disable-runtime-cpu-detect."
37*fb1b10abSAndroid Build Coastguard Worker #endif
38*fb1b10abSAndroid Build Coastguard Worker #else /* end CONFIG_RUNTIME_CPU_DETECT */
loongarch_cpu_caps(void)39*fb1b10abSAndroid Build Coastguard Worker int loongarch_cpu_caps(void) { return 0; }
40*fb1b10abSAndroid Build Coastguard Worker #endif
41