[atom] Atom support and optimization

Ye, Joey joey.ye@intel.com
Thu Feb 5 06:42:00 GMT 2009


Commited branch revision: 143950

This is the first step optimization for Atom, based on optimization guide
http://download.intel.com/design/processor/manuals/248966.pdf

Changes are mainly in following aspects:
- Atom instruction selection. For example, using lea or add for add/sub
operation.
- Atom pipeline description, mostly in atom.md
- X86_TUNE flags tuning for Atom

32-bits performance experiment on Atom box showed following ATOM_OPT/BASE_OPT 
speedup:
CPU2000 INT: 1.03 (which means ATOM_OPT is 3% faster than BASE_OPT)
CPU2000 FP: 1.06
EEMBC 1.1: 1.06
EEMBC 2.0 Consumer: 1.09

BASE_OPT=-m32 -O2 -mfpmath=sse -ffast-math -mssse3
ATOM_OPT=-m32 -O2 -mfpmath=sse -ffast-math -march=atom
Passed all test. Based on trunk revision: 143853

There are two approaches to enable Atom specific optimizations. One is 
to use command line option -march=atom or -mtune=atom. Another is
to use config option --with-arch=atom --with-cpu=atom to enable Atom
as default.

Thanks - Joey

2009-02-05  Joey Ye  <joey.ye@intel.com>
			Xuepeng Guo <xuepeng.guo@intel.com>
			H.J. Lu  <hongjiu.lu@intel.com>

	Atom pipeline model, tuning and insn selection.
	* rtlanal.c (reg_mentioned_by_mem_p_1): New function.
	(reg_mentioned_by_mem_p): New function.
	(reg_dep_by_addr_p): New function.

	* rtl.h (reg_mentioned_by_mem_p): Declare new function.
	(reg_dep_by_addr_p): Likewise.

	* config.gcc (atom): Add atom config options and target.

	* config/i386/i386.h (TARGET_ATOM): New target macro.
	(X86_TUNE_OPT_AGU): New tuning flag.
	(TARGET_OPT_AGU): New target option.
	(TARGET_CPU_DEFAULT_atom): New CPU default.
	(PROCESSOR_ATOM): New processor.

	* config/i386/i386-c.c (ix86_target_macros_internal): New case
	PROCESSOR_ATOM.
	(ix86_target_macros_internal): Likewise.

	* config/i386/i386-protos.h (ix86_lea_for_add_ok): Declare new
	function.
	(ix86_dep_by_shift_count): Likewise.
	(ix86_agi_dependent): Likewise.

	* config/i386/i386.c (atom_cost): New cost.
	(m_ATOM): New macro flag.
	(initial_ix86_tune_fe): Set m_ATOM.
	(x86_accumulate_outgoing_args): Likewise.
	(x86_arch_always_fancy_math_387): Likewise.
	(processor_target): Add Atom cost.
	(cpu_names): Add Atom cpu name.
	(override_options): Set Atom ISA.
	(LEA_SEARCH_THRESHOLD): New macro.
	(distance_non_agu_define): New function.
	(distance_agu_use): Likewise.
	(ix86_lea_for_add_ok): Likewise.
	(ix86_dep_by_shift_count): Likewise.
	(ix86_issue_rate): New case PROCESSOR_ATOM.
	(ix86_adjust_cost): Likewise.
	(ix86_agi_dependent): Discard attr_type argument.

	* config/i386/i386.md (cpu): Add new value "atom".
	(atom.md): Include atom.md.
	(use_carry, movu): New attr.
	(adddi3_carry_rex64): Set attr "use_carry".
	(addqi3_carry): Likewise.
	(addhi3_carry): Likewise.
	(addsi3_carry): Likewise.
	(*addsi3_carry_zext): Likewise.
	(subdi3_carry_rex64): Likewise.
	(subqi3_carry): Likewise.
	(subhi3_carry): Likewise.
	(subsi3_carry): Likewise.
	(x86_movdicc_0_m1_rex64): Likewise.
	(*x86_movdicc_0_m1_se): Likewise.
	(x86_movsicc_0_m1): Likewise.
	(*x86_movsicc_0_m1_se): Likewise.
	(*adddi_1_rex64): Emit add insn as much as possible.
	(*addsi_1): Likewise.
	(return_internal): Set atom_unit.
	(return_internal_long): Likewise.
	(return_pop_internal): Likewise.
	(*rcpsf2_sse): Set atom_sse_attr attr.
	(*qrt<mode>2_sse): Likewise.
	(*prefetch_sse): Likewise.

	* config/i386/sse.md (cpu): Set attr "atom_sse_attr".
	(*prefetch_sse_rex): Likewise.
	(sse_rcpv4sf2): Likewise.
	(sse_vmrcpv4sf2): Likewise.
	(sse_sqrtv4sf2): Likewise.
	(<sse>_vmsqrt<mode>2): Likewise.
	(sse_ldmxcsr): Likewise.
	(sse_stmxcsr): Likewise.
	(*sse_sfence): Likewise.
	(sse2_clflush): Likewise.
	(*sse2_mfence): Likewise.
	(*sse2_lfence): Likewise.
	(avx_movup<avxmodesuffixf2c><avxmodesuffix>): Set attr "movu".
	(<sse>_movup<ssemodesuffixf2c>): Likewise.
	(avx_movdqu<avxmodesuffix>): Likewise.
	(avx_lddqu<avxmodesuffix>): Likewise.
	(sse2_movntv2di): Change attr "type" to "ssemov".
	(sse2_movntsi): Likewise.
	(rsqrtv8sf2): Change attr "type" to "sseadd".
	(sse3_addsubv2df3): Set attr "atom_unit".
	(sse3_h<plusminus_insn>v4sf3): Likewise.
	(*sse2_pmaddwd): Likewise.
	(*vec_extractv2di_1_rex64): Likewise.
	(*vec_extractv2di_1_avx): Likewise.
	(sse2_psadbw): Likewise.
	(ssse3_phaddwv8hi3): Likewise.
	(ssse3_phaddwv4hi3): Likewise.
	(ssse3_phadddv4si3): Likewise.
	(ssse3_phadddv2si3): Likewise.
	(ssse3_phaddswv8hi3): Likewise.
	(ssse3_phaddswv4hi3): Likewise.
	(ssse3_phsubwv8hi3): Likewise.
	(ssse3_phsubwv4hi3): Likewise.
	(ssse3_phsubdv4si3): Likewise.
	(ssse3_phsubdv2si3): Likewise.
	(ssse3_phsubswv8hi3): Likewise.
	(ssse3_phsubswv4hi3): Likewise.
	(ssse3_pmaddubsw128): Likewise.
	(sse3_pmaddubsw: Likewise.
	(ssse3_palignrti): Likewise.
	(ssse3_palignrdi): Likewise.

	* config/i386/atom.md: New machine description for Atom.
	(atom_other): New insn reservation.
	(atom_other_2): Likewise.
	(atom_multi): Likewise.
	(atom_alu): Likewise.
	(atom_alu_mem): Likewise.
	(atom_alu_carry): Likewise.
	(atom_alu_carry_mem): Likewise.
	(atom_alu1): Likewise.
	(atom_alu1_mem): Likewise.
	(atom_negnot): Likewise.
	(atom_negnot_mem): Likewise.
	(atom_imov): Likewise.
	(atom_imov_mem): Likewise.
	(atom_imovx): Likewise.
	(atom_imovx_2): Likewise.
	(atom_imovx_3): Likewise.
	(atom_imovx_mem): Likewise.
	(atom_imovx_2_mem): Likewise.
	(atom_lea): Likewise.
	(atom_lea_2): Likewise.
	(atom_incdec): Likewise.
	(atom_incdec_mem): Likewise.
	(atom_ishift): Likewise.
	(atom_ishift_mem): Likewise.
	(atom_ishift_3): Likewise.
	(atom_ishift1): Likewise.
	(atom_ishift1_mem): Likewise.
	(atom_rotate): Likewise.
	(atom_rotate_mem): Likewise.
	(atom_rotate1): Likewise.
	(atom_rotate1_mem): Likewise.
	(atom_imul): Likewise.
	(atom_imul_mem): Likewise.
	(atom_imul_3): Likewise.
	(atom_idiv): Likewise.
	(atom_icmp): Likewise.
	(atom_icmp_mem): Likewise.
	(atom_test): Likewise.
	(atom_test_mem): Likewise.
	(atom_ibr): Likewise.
	(atom_ibr_2): Likewise.
	(atom_setcc): Likewise.
	(atom_setcc_2): Likewise.
	(atom_icmov): Likewise.
	(atom_icmov_mem): Likewise.
	(atom_push): Likewise.
	(atom_pop): Likewise.
	(atom_pop_2): Likewise.
	(atom_call): Likewise.
	(atom_callv): Likewise.
	(atom_leave): Likewise.
	(atom_str): Likewise.
	(atom_sselog): Likewise.
	(atom_sselog_mem): Likewise.
	(atom_sselog1): Likewise.
	(atom_sselog1_mem): Likewise.
	(atom_sseiadd): Likewise.
	(atom_sseiadd_2): Likewise.
	(atom_sseiadd_3): Likewise.
	(atom_sseiadd_4): Likewise.
	(atom_sseishft): Likewise.
	(atom_sseishft_2): Likewise.
	(atom_sseishft_3): Likewise.
	(atom_sseimul): Likewise.
	(atom_sse): Likewise.
	(atom_sse_2): Likewise.
	(atom_sse_3): Likewise.
	(atom_sse_4): Likewise.
	(atom_sse_5): Likewise.
	(atom_ssemov): Likewise.
	(atom_ssemov_2): Likewise.
	(atom_ssemov_3): Likewise.
	(atom_ssemov_4): Likewise.
	(atom_ssemov_5): Likewise.
	(atom_sseadd): Likewise.
	(atom_sseadd_mem): Likewise.
	(atom_sseadd_3): Likewise.
	(atom_ssemul): Likewise.
	(atom_ssemul_2): Likewise.
	(atom_ssecmp): Likewise.
	(atom_ssecomi): Likewise.
	(atom_ssecvt): Likewise.
	(atom_ssecvt_2): Likewise.
	(atom_ssecvt_3): Likewise.
	(atom_sseicvt): Likewise.
	(atom_sseicvt_2): Likewise.
	(atom_ssediv): Likewise.
	(atom_fmov): Likewise.
	(atom_fmov_mem): Likewise.

 
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: perf.txt
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20090205/1ce6291d/attachment.txt>


More information about the Gcc-patches mailing list