From 5756eff74e6746100631da64ab91d0ba39ebb0cb Mon Sep 17 00:00:00 2001 From: Uros Bizjak <uros@gcc.gnu.org> Date: Fri, 16 Nov 2012 08:42:19 +0100 Subject: [PATCH] i386-protos.h (ix86_emit_mode_set): Add third argument. * config/i386/i386-protos.h (ix86_emit_mode_set): Add third argument. * config/i386/i386.h (EMIT_MODE_SET): Update. * config/i386/i386.c (ix86_avx_emit_vzeroupper): New function. (ix86_emit_mode_set) <AVX_U128>: Call ix86_avx_emit_vzeroupper. From-SVN: r193550 --- gcc/ChangeLog | 28 ++++++++++++++++------------ gcc/config/i386/i386-protos.h | 5 ++++- gcc/config/i386/i386.c | 26 ++++++++++++++++++++++++-- gcc/config/i386/i386.h | 2 +- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4eb3039f1142..c784188a2672 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-11-16 Uros Bizjak <ubizjak@gmail.com> + + * config/i386/i386-protos.h (ix86_emit_mode_set): Add third argument. + * config/i386/i386.h (EMIT_MODE_SET): Update. + * config/i386/i386.c (ix86_avx_emit_vzeroupper): New function. + (ix86_emit_mode_set) <AVX_U128>: Call ix86_avx_emit_vzeroupper. + 2012-11-16 Ganesh Gopalasubramanian <Ganesh.Gopalasubramanian@amd.com> bdver3 Enablement @@ -7,11 +14,11 @@ (case ${target}): Add bdver3. * config/i386/i386.h (TARGET_BDVER3): New definition. * config/i386/i386.md (define_attr "cpu"): Add bdver3. - * config/i386/sse.md (sseshuf): New type attribute. - * config/i386/athlon.md (sseshuf):Likewise. - * config/i386/atom.md (sseshuf):Likewise. - * config/i386/ppro.md (sseshuf):Likewise. - * config/i386/bdver1.md (sseshuf):Likewise. + * config/i386/sse.md (sseshuf, sseshuf1): New type attributes. + * config/i386/athlon.md: Handle sseshuf attribute. + * config/i386/atom.md: Likewise. + * config/i386/ppro.md: Likewise. + * config/i386/bdver1.md: Likewise. * config/i386/i386.opt (flag_dispatch_scheduler): Add bdver3. * config/i386/i386-c.c (ix86_target_macros_internal): Add bdver3 def_and_undef @@ -25,8 +32,7 @@ (static const char *const cpu_names): Add bdver3 entry. (software_prefetching_beneficial_p): Add bdver3. (ix86_option_override_internal): Add bdver3 instruction sets. - (ix86_option_override_internal): Remove XSAVEOPT for bdver1 - and bdver2. + (ix86_option_override_internal): Remove XSAVEOPT for bdver1 and bdver2. (ix86_issue_rate): Add bdver3. (ix86_adjust_cost): Add bdver3. (enum target_cpu_default): Add TARGET_CPU_DEFAULT_bdver3. @@ -37,8 +43,7 @@ * expmed.c (expand_shift_1): Don't strip non-integral SUBREGs. - * configure.ac: Add check for assembler SPARC4 instruction - support. + * configure.ac: Add check for assembler SPARC4 instruction support. * configure: Rebuild. * config.in: Add HAVE_AS_SPARC4 section. * config/sparc/sparc.opt (mcbcond): New option. @@ -92,9 +97,8 @@ * asan.c (report_error_func): Set DECL_IGNORED_P, don't touch DECL_ASSEMBLER_NAME. (asan_init_func): Likewise. - (asan_finish_file): Use void * instead of __asan_global * as - type of __asan_{,un}register_globals. Set DECL_IGNORED_P on - the decls. + (asan_finish_file): Use void * instead of __asan_global * as type of + __asan_{,un}register_globals. Set DECL_IGNORED_P on the decls. 2012-11-15 Matthias Klose <doko@ubuntu.com> diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 0d643b139d68..4c23f5758fa2 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -172,7 +172,10 @@ extern int ix86_mode_needed (int, rtx); extern int ix86_mode_after (int, int, rtx); extern int ix86_mode_entry (int); extern int ix86_mode_exit (int); -extern void ix86_emit_mode_set (int, int); + +#ifdef HARD_CONST +extern void ix86_emit_mode_set (int, int, HARD_REG_SET); +#endif extern void x86_order_regs_for_local_alloc (void); extern void x86_function_profiler (FILE *, int); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index eb1025f30331..b4e4e72f8fca 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -15477,16 +15477,38 @@ emit_i387_cw_initialization (int mode) emit_move_insn (new_mode, reg); } +/* Emit vzeroupper. */ + +void +ix86_avx_emit_vzeroupper (HARD_REG_SET regs_live) +{ + int i; + + /* Cancel automatic vzeroupper insertion if there are + live call-saved SSE registers at the insertion point. */ + + for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++) + if (TEST_HARD_REG_BIT (regs_live, i) && !call_used_regs[i]) + return; + + if (TARGET_64BIT) + for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++) + if (TEST_HARD_REG_BIT (regs_live, i) && !call_used_regs[i]) + return; + + emit_insn (gen_avx_vzeroupper ()); +} + /* Generate one or more insns to set ENTITY to MODE. */ void -ix86_emit_mode_set (int entity, int mode) +ix86_emit_mode_set (int entity, int mode, HARD_REG_SET regs_live) { switch (entity) { case AVX_U128: if (mode == AVX_U128_CLEAN) - emit_insn (gen_avx_vzeroupper ()); + ix86_avx_emit_vzeroupper (regs_live); break; case I387_TRUNC: case I387_FLOOR: diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index d34cfa436bf1..0cdbee1e8626 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2226,7 +2226,7 @@ enum avx_u128_state are to be inserted. */ #define EMIT_MODE_SET(ENTITY, MODE, HARD_REGS_LIVE) \ - ix86_emit_mode_set ((ENTITY), (MODE)) + ix86_emit_mode_set ((ENTITY), (MODE), (HARD_REGS_LIVE)) /* Avoid renaming of stack registers, as doing so in combination with scheduling just increases amount of live registers at time and in -- GitLab