]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* config/i386/driver-i386.c (detect_caches_cpuid2): Use array
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Oct 2008 18:43:50 +0000 (18:43 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Oct 2008 18:43:50 +0000 (18:43 +0000)
of registers instead of eax, ebx, ecx and edx.  Use for loop
and check register for non-zero value before the call
to decode_caches_intel.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141075 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/driver-i386.c

index 64068cafc5875e898813282ac32c3e4e2a937e46..5a206cf932d7126e2ef5d1053fb51e6ee52eeb2e 100644 (file)
@@ -1,3 +1,10 @@
+2008-10-12  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/driver-i386.c (detect_caches_cpuid2): Use array
+       of registers instead of eax, ebx, ecx and edx.  Use for loop
+       and check register for non-zero value before the call
+       to decode_caches_intel.
+
 2008-10-11  Kenneth Zadeck <zadeck@naturalbridge.com>
 
        PR rtl-optimization/37448
        df_bb_regno_last_def_find, df_find_def, df_find_use,
        df_refs_chain_dump, df_regs_chain_dump, df_ref_debug,
        debug_df_ref): Replaced struct df_ref * with df_ref.
-       (df_mws_dump, df_ref_debug): Use macros to hide references to
-       df_refs.
+       (df_mws_dump, df_ref_debug): Use macros to hide references to df_refs.
        * cse.c (cse_extended_basic_block): Replaced struct df_ref * with
        df_ref.
        * web.c (union_defs, entry_register, replace_ref, web_main):
        Replaced struct df_ref * with df_ref.
-       (union_defs, replace_ref): Use macros to hide references to
-       df_refs.
+       (union_defs, replace_ref): Use macros to hide references to df_refs.
        * global.c (compute_regs_asm_clobbered, build_insn_chain):
        Replaced struct df_ref * with df_ref.
-       * ifcvt.c (dead_or_predicable): Replaced struct df_ref * with
-       df_ref.
+       * ifcvt.c (dead_or_predicable): Replaced struct df_ref * with df_ref.
        * sel-sched-ir.c (maybe_downgrade_id_to_use, setup_id_reg_sets, ):
        Replaced struct df_ref * with df_ref.
        * ira-lives.c (mark_ref_live, def_conflicts_with_inputs_p,
        mark_ref_dead, process_bb_node_lives): Replaced struct df_ref *
        with df_ref.
-       * local-alloc.c (block_alloc): Replaced struct df_ref * with
-       df_ref.
+       * local-alloc.c (block_alloc): Replaced struct df_ref * with df_ref.
        * df-byte-scan.c (df_compute_accessed_bytes_extract,
        df_compute_accessed_bytes_strict_low_part,
        df_compute_accessed_bytes_subreg, df_compute_accessed_bytes):
        Replaced struct df_ref * with df_ref.
-       (df_compute_accessed_bytes): Use macros to hide references to
-       df_refs.
+       (df_compute_accessed_bytes): Use macros to hide references to df_refs.
        * init-regs.c (initialize_uninitialized_regs): Replaced struct
        df_ref * with df_ref.
        * loop-invariant.c (invariant_for_use, hash_invariant_expr_1,
        iv_analyze, biv_p): Replaced struct df_ref * with df_ref.
        (iv_analysis_loop_init, iv_get_reaching_def): Use macros to hide
        references to df_refs.
-       * ira.c (compute_regs_asm_clobbered): Replaced struct df_ref * with df_ref.
+       * ira.c (compute_regs_asm_clobbered): Replaced struct df_ref *
+       with df_ref.
        * combine.c (create_log_links): Replaced struct df_ref * with df_ref.
        * df-problems.c (df_rd_bb_local_compute_process_def,
        df_lr_bb_local_compute, df_live_bb_local_compute, df_chain_create,
        df_byte_lr_simulate_artificial_refs_at_end, df_create_unused_note,
        df_note_bb_compute, df_note_add_problem, df_simulate_defs,
        df_simulate_uses, df_simulate_artificial_refs_at_end,
-       df_simulate_artificial_refs_at_top): Replaced struct df_ref * with df_ref.
-       (df_chain_dump): Use macros to hide
-       references to df_refs.
+       df_simulate_artificial_refs_at_top): Replaced struct df_ref * with
+       df_ref.
+       (df_chain_dump): Use macros to hide references to df_refs.
        * config/mips/mips.c (r10k_simplify_address): Replaced struct
        df_ref * with df_ref.
        * dce.c (mark_nonreg_stores, delete_corresponding_reg_eq_notes,
index 72e2c48d385b459f9d957fb4071f50eac9f611fd..29b040598c51fdcdbc117b4e92a5063925170977 100644 (file)
@@ -230,27 +230,22 @@ static void
 detect_caches_cpuid2 (bool xeon_mp, 
                      struct cache_desc *level1, struct cache_desc *level2)
 {
-  unsigned eax, ebx, ecx, edx;
-  int nreps;
+  unsigned regs[4];
+  int nreps, i;
 
-  __cpuid (2, eax, ebx, ecx, edx);
+  __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
 
-  nreps = eax & 0x0f;
-  eax &= ~0x0f;
+  nreps = regs[0] & 0x0f;
+  regs[0] &= ~0x0f;
 
   while (--nreps >= 0)
     {
-      if (!((eax >> 31) & 1))
-       decode_caches_intel (eax, xeon_mp, level1, level2);
-      if (!((ebx >> 31) & 1))
-       decode_caches_intel (ebx, xeon_mp, level1, level2);
-      if (!((ecx >> 31) & 1))
-       decode_caches_intel (ecx, xeon_mp, level1, level2);
-      if (!((edx >> 31) & 1))
-       decode_caches_intel (edx, xeon_mp, level1, level2);
+      for (i = 0; i < 4; i++)
+       if (regs[i] && !((regs[i] >> 31) & 1))
+         decode_caches_intel (regs[i], xeon_mp, level1, level2);
 
       if (nreps)
-       __cpuid (2, eax, ebx, ecx, edx);
+       __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
     }
 }
 
@@ -298,15 +293,10 @@ detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2)
            if (cache)
              {
                unsigned sets = ecx + 1;
-               unsigned part;
+               unsigned part = ((ebx >> 12) & 0x03ff) + 1;
 
+               cache->assoc = ((ebx >> 22) & 0x03ff) + 1;
                cache->line = (ebx & 0x0fff) + 1;
-               ebx >>= 12;
-
-               part = (ebx & 0x03ff) + 1;
-               ebx >>= 10;
-
-               cache->assoc = (ebx & 0x03ff) + 1;
 
                cache->sizekb = (cache->assoc * part
                                 * cache->line * sets) / 1024;