re PR target/68491 (libgcc calls __get_cpuid with 0 level breaks on early 486)
authorUros Bizjak <uros@gcc.gnu.org>
Mon, 1 May 2017 15:38:14 +0000 (17:38 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 1 May 2017 15:38:14 +0000 (17:38 +0200)
PR target/68491
* config/i386/cpuid.h (__get_cpuid): Always return 0 when
__get_cpuid_max returns 0.
(__get_cpuid_count): Ditto.

From-SVN: r247439

gcc/ChangeLog
gcc/config/i386/cpuid.h

index 07b205c..c58e417 100644 (file)
@@ -1,3 +1,10 @@
+2017-05-01  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/68491
+       * config/i386/cpuid.h (__get_cpuid): Always return 0 when
+       __get_cpuid_max returns 0.
+       (__get_cpuid_count): Ditto.
+
 2017-05-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * tree.c (substitute_in_expr) <tcc_vl_exp>: Also inline a call if the
@@ -79,7 +86,7 @@
        (init_target_to_host_charmap, target_to_host, target_strtol10): New
        functions.
        (maybe_warn, format_directive, parse_directive): Use new functions.
-       (pass_sprintf_length::execute): Call init_target_to_host_charmap.       
+       (pass_sprintf_length::execute): Call init_target_to_host_charmap.
 
 2017-04-28  Marc Glisse  <marc.glisse@inria.fr>
 
        * ipa-inline-analysis.c (estimate_node_size_and_time,
        estimate_ipcp_clone_size_and_time, do_estimate_edge_time): Likewise.
        (estimate_time_after_inlining): Remove.
-       
+
 2017-04-28  Martin Liska  <mliska@suse.cz>
 
        * doc/gcov.texi: Enhance documentation of gcov.
index d451e97..f915d2d 100644 (file)
@@ -246,8 +246,9 @@ __get_cpuid (unsigned int __leaf,
             unsigned int *__ecx, unsigned int *__edx)
 {
   unsigned int __ext = __leaf & 0x80000000;
+  unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
 
-  if (__get_cpuid_max (__ext, 0) < __leaf)
+  if (__maxlevel == 0 || __maxlevel < __leaf)
     return 0;
 
   __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
@@ -262,8 +263,9 @@ __get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
                   unsigned int *__ecx, unsigned int *__edx)
 {
   unsigned int __ext = __leaf & 0x80000000;
+  unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
 
-  if (__get_cpuid_max (__ext, 0) < __leaf)
+  if (__maxlevel == 0 || __maxlevel < __leaf)
     return 0;
 
   __cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);