(root)/
glibc-2.38/
sysdeps/
x86/
tst-ifunc-isa.h
       1  /* IFUNC resolver with CPU_FEATURE_ACTIVE.
       2     Copyright (C) 2021-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <sys/platform/x86.h>
      20  
      21  enum isa
      22  {
      23    none,
      24    sse2,
      25    sse4_2,
      26    avx,
      27    avx2,
      28    avx512f
      29  };
      30  
      31  enum isa
      32  __attribute__ ((__optimize__ ("-fno-stack-protector")))
      33  get_isa (void)
      34  {
      35    if (CPU_FEATURE_ACTIVE (AVX512F))
      36      return avx512f;
      37    if (CPU_FEATURE_ACTIVE (AVX2))
      38      return avx2;
      39    if (CPU_FEATURE_ACTIVE (AVX))
      40      return avx;
      41    if (CPU_FEATURE_ACTIVE (SSE4_2))
      42      return sse4_2;
      43    if (CPU_FEATURE_ACTIVE (SSE2))
      44      return sse2;
      45    return none;
      46  }
      47  
      48  static int
      49  isa_sse2 (void)
      50  {
      51    return sse2;
      52  }
      53  
      54  static int
      55  isa_sse4_2 (void)
      56  {
      57    return sse4_2;
      58  }
      59  
      60  static int
      61  isa_avx (void)
      62  {
      63    return avx;
      64  }
      65  
      66  static int
      67  isa_avx2 (void)
      68  {
      69    return avx2;
      70  }
      71  
      72  static int
      73  isa_avx512f (void)
      74  {
      75    return avx512f;
      76  }
      77  
      78  static int
      79  isa_none (void)
      80  {
      81    return none;
      82  }
      83  
      84  int foo (void) __attribute__ ((ifunc ("foo_ifunc")));
      85  
      86  void *
      87  __attribute__ ((__optimize__ ("-fno-stack-protector")))
      88  foo_ifunc (void)
      89  {
      90    switch (get_isa ())
      91      {
      92      case avx512f:
      93        return isa_avx512f;
      94      case avx2:
      95        return isa_avx2;
      96      case avx:
      97        return isa_avx;
      98      case sse4_2:
      99        return isa_sse4_2;
     100      case sse2:
     101        return isa_sse2;
     102      default:
     103        break;
     104      }
     105    return isa_none;
     106  }