This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

S/390 backend improvements

I've checked in an update to the S/390 backend that implements
a number of major improvements.  Most important are:

- Emit prolog and epilog as RTL.  This allows for better scheduling.

- Do not force all illegal constants to the pool immediately, 
  but wait until reload.  This causes many middle-end algorithms
  to perform better optimizations on the constants.

- No longer use the s390-special prediates r_or_s_operand etc.;
  use the generic predicates instead, and rely on reload to fix
  everything up.  This generates better code in many cases.

- Implement a virtual frame pointer register.  This helps to better
  determine when to use a LOAD ADDRESS instruction.

- Allow SImode and DImode values in floating-point registers.

- Use splitters for move insns that generate more than a single
  assembly instruction.  Again, better scheduling.

- Completly reworked the sign_extend and zero_extend insns, the new
  ones better cooperate with some middle-end algorithms, and also
  allow for better scheduling. 

- Try to make better use of the s390 memory-to-memory instructions.

- Add support for the 64-bit 'immediate long' instructions;
  in particular, use the test-under-mask instructions where appropriate.
  Also includes other improvements to the 'logical' instructions.

- Reworked the integer multiply/divide insns to allow for better
  optimizations.  In particular, provide divmod insns.

- Implement square root insns.

In addition, some other bugfixes and cleanups are included; detailed
change log is appended below.

Due to size restrictions, the patch is attached in gzipped form.



	* (prologue, epilogue, *return_si, *return_di): New.
	s390.c (find_unused_clobbered_reg, s390_frame_info, 
	save_fpr, restore_fpr, s390_emit_prologue, s390_emit_epilogue): New.
	s390-protos.h (s390_emit_prologue, s390_emit_epilogue): Declare.
	s390.c (s390_arg_frame_offset): Use s390_frame_info.
	(leaf_function_flag, cur_is_leaf_function,
	save_fprs, restore_fprs, force_const_mem_late): Remove.
	(s390_function_prologue, s390_function_epilogue): Mostly remove. (lit): New.  Uses ...
	s390.c (s390_output_constant_pool): ... this, so adapt and make global.
	s390-protos.h (s390_output_constant_pool): Declare. (load_multiple, store_multiple): Allow use after reload.
	s390.c (load_multiple_operation, store_multiple_operation): Likewise.
	config/s390/linux64.h (CALL_USED_REGISTERS): Remove, now handled ...
	s390.c (s390_sr_alias_set): New global variable, initialized ...
	(override_options): ... here.  New.
	s390-protos.h (override_options): Declare.
	s390.h (OVERRIDE_OPTIONS): Call it.
	s390.c (s390_function_profiler): New.
	s390-protos.h (s390_function_profiler): Declare.
	s390.h (FUNCTION_PROFILER): Call it.
	s390.c (s390_profile): Remove.

	* s390.c (reg_used_in_mem_p): PC reload counts as memory access.
	(addr_generation_dependency_p): Consider literal pool register loads.
	(s390_adjust_priority): Do not schedule load_multiple. (attribute "type"): Define some additional types.
	(function_unit "integer"): Adapt.
	(many insns): Adapt "type" attribute setting.

	* s390.c (general_s_operand, s_imm_operand): New.
	(s_operand): Remove old definition, call general_s_operand instead.
	s390-protos.h (s_imm_operand): Declare.
	s390.c (base_n_index_p, r_or_s_operand, r_or_s_or_im8_operand, 
	r_or_x_or_im16_operand, r_or_im8_operand): Remove.
	s390-protos.h (r_or_s_operand, r_or_s_or_im8_operand,
	r_or_x_or_im16_operand, r_or_im8_operand): Likewise.
	s390.h (PREDICATE_CODES): Add s_imm_operand, remove r_or_s*_operand. (many insns): Rework insn predicates.

	* s390.c (legitimate_pic_operand_p, legitimate_constant_p): Accept all
	non-symbolic constants.  Reload will force them because of ...
	(s390_preferred_reload_class): ... this.  New.
	s390-protos.h (s390_preferred_reload_class): Declare.
	s390.h (PREFERRED_RELOAD_CLASS): Call it. (movdi, movsi, movdf, movsf, *reload_la_64 splitters,
	*reload_la_31 splitters): Handle constants after reload.
	(many insns): no longer force all constants immediately.
	s390.c (legitimate_reload_constant_p): New helper routine.
	s390-protos.h (legitimate_reload_constant_p): Declare.
	s390.c (print_operand): Clean up CONST_INT case, add CONST_DOUBLE case.

	s390.c (regclass_map): Add virtual frame pointer.
	(legitimate_la_operand_p): Allow use of virtual frame pointer. (*la_ccclobber, *addaddr_ccclobber): New.
	(addaddr, addsi_64): Delete.

	* s390.h (HARD_REGNO_MODE_OK): Allow SImode and DImode values in 
	floating point registers.
	(ADDR_FP_REGS, GENERAL_FP_REGS): New register classes.

	* (movti): Replace multi-insn output with splitters.
	(movdi_31, movdf_31): Likewise.
	(movti_ss, movdi_ss, movsi_ss, movdf_ss, movsf_ss): New.
	(movdi_lhi, movdi_lli, movdi_larl, movsi_lhi, movsi_lli): New.
	(movdi_64, movdi_31, movsi, movdf_64, movdf_31): Adapt.
	(movdf_soft_64, movdf_soft_31, movsf_soft): Remove.
	(movsf_64, movsf_31): Remove, replace by ...
	(movsf): ... this.
	(movqi_64): Use lhi instead of llill.
	(*movstrictqi, *movstricthi): Don't use (strict_low_part (mem)).

	* (extendsidi2, *extendsidi2, extendhidi2, *extendhidi2,
	extendqidi2, extendhisi2, *extendhisi2, extendqisi2,
	extendqihi2 and associated splitters): Reworked.
	(zero_extendsidi2, zero_extendsidi2, *zero_extendsidi2,
	zero_extendhidi2, *zero_extendhidi2, zero_extendqidi2,
	zero_extendqidi2, *zero_extendqidi2, zero_extendhisi2,
	*zero_extendhisi2_64, zero_extendhisi2_31, zero_extendqisi2,
	*zero_extendqisi2_64, *zero_extendqisi2_mem_31,
	zero_extendqisi2_reg_31, zero_extendqihi2, *zero_extendqisi2_64,
	zero_extendqihi2, zero_extendqihi2_64, zero_extendqihi2_31,
	and associated splitters): Likewise.
	(*sethighqisi, *sethighhisi, *sethighqidi_64, *sethighqidi_31 
	and associated splitters): New.
	(truncdisi2, truncdihi2, truncdiqi2, truncsihi2, do_truncsihi2, 
	*truncsihi2_64, truncsiqi2, trunchiqi2): Remove.
	(ashlhi3, ashrhi3, lshrhi3, abshi3): Remove.
	s390.h (PROMOTE_PROTOTYPES): Remove.
	config/s390/linux64.h (PROMOTE_PROTOTYPES): Likewise.

	* (muldi3): Delete, use instead ...
	(mulsidi3): ... this.
	(*muldi3_64): Rename to muldi3.
	(mulsi_6432): Fix template.
	(divdi3, moddi3): Delete, replace by ...
	(divmoddi4): ... this.
	(divmodtidi3): Fix template.
	(divmodtisi3): New.
	(udivdi3, umoddi3): Delete, replace by ...
	(udivmoddi4): ... this.
	(udivmodtidi3): Fix template.
	(divsi3, modsi3): Delete, replace by ...
	(divmodsi4): ... this.
	(divmoddisi3): Fix template.
	(udivsi3, umodsi3): Adapt.

	* (anddi3): Remove SS alternative, use instead ...
	(anddi3_ss, anddi3_ss_inv): ... these.
	(anddi3_ni): New.
	(andsi3*, andhi3*, andqi3*): Likewise.
	(iordi3): Remove SS alternative, use instead ...
	(iordi3_ss, iordi3_ss_inv): ... these.
	(iordi3_oi): New.
	(iorsi3*, iorhi3*, iorqi3*): Likewise.
	(iordi3_cc, iordi3_cconly, iorsi3_cc, iorsi3_cconly): New.
	(xordi3): Remove SS alternative, use instead ...
	(xordi3_ss, xordi3_ss_inv): ... these.
	(xordi3_oi): New.
	(xorsi3*, xorhi3*, xorqi3*): Likewise.
	(xordi3_cc, xordi3_cconly, xorsi3_cc, xorsi3_cconly): New.
	(one_cmpldi2, one_cmplsi2, one_cmplhi2, one_cmplqi2):
	Expand to XOR with -1.
	(*one_cmpldi2, *one_cmplsi2, *one_cmplhi2): Remove.
	(cmpdi_tm): Delete, replace by ...
	(cmpdi_tm_reg, cmpdi_tm_mem): ... these.
	(cmpsi_cct): Delete, replace by ...
	(cmpsi_tm_reg, cmpsi_tm_mem): ... these.
	(cmpdi_tm2, cmpsi_tm2): Improve.
	(cmphi_tm_sub, cmpqi_tm_sub, cmpqi_tm2, cmpqi_tm): New.
	s390.c (s390_single_hi, s390_extract_hi, 
	s390_single_qi, s390_extract_qi): New helper routines.
	s390-protos.h (s390_single_hi, s390_extract_hi, 
	s390_single_qi, s390_extract_qi): Declare.
	s390.c (tmxx_operand, const1_operand): Remove.
	s390-protos.h (tmxx_operand, const1_operand): Likewise.
	s390.h (PREDICATE_CODES): Likewise.

	* (sqrtdf2, sqrtsf2): New.

	* s390.h (CRT_CALL_STATIC_FUNCTION): Define.
	(check_and_change_labels): Remove section-change special case.

	* s390.h (RETURN_ADDR_RTX): Fix use of __builtin_return_address 
	in leaf functions.  Needs ...
	(DYNAMIC_CHAIN_RTX):  ... this.  New.

	* s390.c (emit_pic_move): Don't generate pseudos if no_new_pseudos.

	* (movstrdix_64, movstrsix_31, movstrdi_64, movstrsi_31,
	clrstrsi_64, clrstrsi_31, cmpstr_64, cmpstr_31): Do not clobber 
	input operands using a match_dup clause.
	(movstrdi, movstrsi, clrstrdi, clrstrsi, cmpstrdi, cmpstrsi): Adapt.

	* (floatdidf2, floatdisf2, floatsidf2, floatsidf2_ieee,
	floatsisf2, floatsisf2_ieee): Add missing CC clobber.

	* (floatsidf2_ibm): Use correct operand.

	* (fixuns_truncdfdi2, fixuns_truncdfsi2, fix_truncdfsi2,
	fixuns_truncsfdi2, fixuns_truncsfsi2, floatsidf2): Remove use of
	non-portable constants.
	s390.c (s390_gen_rtx_const_DI): New helper routine.
	s390-protos.h (s390_gen_rtx_const_DI): Declare.

	* s390.h (ASM_OUTPUT_SPECIAL_POOL_ENTRY): Fix alignment.

	* config/s390/linux.h (ASM_OUTPUT_SHORT, ASM_OUTPUT_CHAR,
	ASM_OUTPUT_BYTE): Clean up assembly output.
	(ASM_OUTPUT_SKIP, ASM_OUTPUT_ALIGN): Remove duplicate definitions.

	* config/s390/t-linux (CRTSTUFF_T_CFLAGS_S): Define.

  Dr. Ulrich Weigand

Attachment: s390-diff.gz
Description: gzip compressed data, deflated, original filename, last modified: Sun Dec 16 03:44:10 2001, max compression, os: Unix

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]