https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77756

--- Comment #6 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to H.J. Lu from comment #5)
> For level >= 7, ECX may have other input values.  It is incorrect to
> assume that ECX only takes 0 or 1.  We should get another macro for
> level >= 7 with input for ECX:

We can extend __get_cpuid to assume subleaf = 0 and introduce new
__get_cpuid_subleaf, in effect:

--cut here--
static __inline int
__get_cpuid (unsigned int __level,
             unsigned int *__eax, unsigned int *__ebx,
             unsigned int *__ecx, unsigned int *__edx)
{
  unsigned int __ext = __level & 0x80000000;

  if (__get_cpuid_max (__ext, 0) < __level)
    return 0;

  if (__ext)
    __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
  else if (__level >= 7)
    __cpuid_count (__level, 0, *__eax, *__ebx, *__ecx, *__edx);
  else
    __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);

  return 1;
}

static __inline int
__get_cpuid_subleaf (unsigned int __level, unsigned int __subleaf,
                     unsigned int *__eax, unsigned int *__ebx,
                     unsigned int *__ecx, unsigned int *__edx)
{
  unsigned int __ext = __level & 0x80000000;

  if (__get_cpuid_max (__ext, 0) < __level)
    return 0;

  if (__ext)
    __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
  else if (__level >= 7)
    {
      __cpuid_count (__level, 0, *__eax, *__ebx, *__ecx, *__edx);
      if (__subleaf > *__eax)
        return 0;
      if (__subleaf)
        __cpuid_count (__level, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
    }
  else
    __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);

  return 1;
}
--cut here--

Please note that the above __get_cpuid_subleaf also checks return value from
subleaf = 0 and fails if requested subleaf is out of allowed range.

Reply via email to