Home | History | Annotate | Download | only in util
      1 /**************************************************************************
      2  *
      3  * Copyright 2008 Dennis Smit
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * on the rights to use, copy, modify, merge, publish, distribute, sub
     10  * license, and/or sell copies of the Software, and to permit persons to whom
     11  * the Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the next
     14  * paragraph) shall be included in all copies or substantial portions of the
     15  * Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
     20  * AUTHORS, COPYRIGHT HOLDERS, AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     21  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     22  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     23  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  ***************************************************************************/
     26 
     27 /**
     28  * @file
     29  * CPU feature detection.
     30  *
     31  * @author Dennis Smit
     32  * @author Based on the work of Eric Anholt <anholt (at) FreeBSD.org>
     33  */
     34 
     35 #ifndef _UTIL_CPU_DETECT_H
     36 #define _UTIL_CPU_DETECT_H
     37 
     38 
     39 #include "pipe/p_compiler.h"
     40 #include "pipe/p_config.h"
     41 
     42 
     43 #ifdef	__cplusplus
     44 extern "C" {
     45 #endif
     46 
     47 
     48 struct util_cpu_caps {
     49    unsigned nr_cpus;
     50 
     51    /* Feature flags */
     52    int x86_cpu_type;
     53    unsigned cacheline;
     54 
     55    unsigned has_intel:1;
     56    unsigned has_tsc:1;
     57    unsigned has_mmx:1;
     58    unsigned has_mmx2:1;
     59    unsigned has_sse:1;
     60    unsigned has_sse2:1;
     61    unsigned has_sse3:1;
     62    unsigned has_ssse3:1;
     63    unsigned has_sse4_1:1;
     64    unsigned has_sse4_2:1;
     65    unsigned has_popcnt:1;
     66    unsigned has_avx:1;
     67    unsigned has_avx2:1;
     68    unsigned has_f16c:1;
     69    unsigned has_fma:1;
     70    unsigned has_3dnow:1;
     71    unsigned has_3dnow_ext:1;
     72    unsigned has_xop:1;
     73    unsigned has_altivec:1;
     74    unsigned has_daz:1;
     75 
     76    unsigned has_avx512f:1;
     77    unsigned has_avx512dq:1;
     78    unsigned has_avx512ifma:1;
     79    unsigned has_avx512pf:1;
     80    unsigned has_avx512er:1;
     81    unsigned has_avx512cd:1;
     82    unsigned has_avx512bw:1;
     83    unsigned has_avx512vl:1;
     84    unsigned has_avx512vbmi:1;
     85 };
     86 
     87 extern struct util_cpu_caps
     88 util_cpu_caps;
     89 
     90 void util_cpu_detect(void);
     91 
     92 
     93 #ifdef	__cplusplus
     94 }
     95 #endif
     96 
     97 
     98 #endif /* _UTIL_CPU_DETECT_H */
     99