Commit 0be8bd1a by Richard Earnshaw Committed by Richard Earnshaw

arm.h (TARGET_CPU_CPP_BUILTINS): Remove Maverick support.

	* arm.h (TARGET_CPU_CPP_BUILTINS): Remove Maverick support.
	(TARGET_FPA): Delete definition.
	(TARGET_MAVERICK): Likewise.
	(TARGET_FPA_EMU2): Likewise.
	(arm_fp_model): Remove FPA and Maverick models.
	(arm_arch_cirrus): Delete declaration.
	(FLOAT_WORDS_BIG_ENDIAN): Delete definition.
	(FIXED_REGISTERS): Remove FPA and Maverick support.  Reorganize.
	(CALL_USED_REGISTERS): Likewise.
	(FIRST_FPA_REGNUM, LAST_FPA_REGNUM): Delete definition.
	(FIRST_VFP_REGNUM): Renumbered.
	(D7_VFP_REGNUM): Chain definition.
	(LAST_LO_VFP_REGNUM): Likewise.
	(FIRST_HI_VFP_REGNUM): Likewise.
	(LAST_HI_VFP_REGNUM): Likewise.
	(FIRST_IWMMXT_GR_REGNUM): Likewise.
	(LAST_IWMMXT_GR_REGNUM): Likewise.
	(FIRST_IWMMXT_REGNUM): Likewise.
	(LAST_IWMMXT_REGNUM): Likewise.
	(FRAME_POINTER_REGNUM): Renumbered.
	(ARG_POINTER_REGNUM): Renumbered.
	(FIRST_PSEUDO_REGISTER): Remove FPA and Maverick registers.
	(FIRST_CIRRUS_FP_REGNUM, LAST_CIRRUS_FP_REGNUM): Delete definitions.
	(HARD_REGNO_REGNUM): Remove FPA support.
	(REG_ALLOC_ORDER): Remove FPA and Maverick registers.  Reorganize.
	(reg_class): Likewise.
	(REG_CLASS_NAMES): Likewise.
	(REG_CLASS_CONTENTS): Likewise.
	(CANNOT_CHANGE_MODE_CLASS): Never true.  Update comment.
	(SECONDARY_INPUT_RELOAD_CLASS): Remove Maverick support.
	(CLASS_MAX_NREGS): Remove FPA and Maverick support.
	* aout.h (REGISTER_NAMES): Remove FPA and Maverick registers.
	Reorganize.  Use AAPCS preferred names.
	(ADDITIONAL_REGISTER_NAMES): Remove aliases for Maverick.  Update
	comments.
	(OVERLAPPING_REGISTER_NAMES): Update register numbering.
	* arm.c (FL_CIRRUS): Delete definition.
	(arm_arch_cirrus): Delete variable.
	(arm_float_words_big_endian): Delete function.
	(cirrus_memory_offset): Delete function.
	(output_mov_long_double_fpa_from_arm): Delete function.
	(output_mov_long_double_arm_from_fpa): Delete function.
	(output_mov_double_fpa_from_arm): Delete function.
	(output_mov_double_arm_from_fpa): Delete function.
	(emit_sfm): Delete function.
	(maybe_get_arm_condition_code): Update comment.
	(arm_file_start): Always use softvfp for softfloat systems.
	(thumb_core_reg_alloc_order): Adjust for updated register allocation.
	(arm_option_override): Remove FPA and Maverick support.  Always
	default to vfp as the fallback FPU format.
	(use_return_insn): Remove FPA support.
	(arm_get_frame_offsets): Likewise.
	(arm_save_coproc_regs): Likewise.
	(arm_canonicalize_comparison): Remove Maverick support.
	(arm_select_cc_mode): Likewise.
	(arm_gen_compare_reg): Likewise.
	(arm_print_operand): Likewise.
	(arm_libcall_value_1): Remove FPA and Maverick support.
	(arm_function_value_regno_p): Likewise.
	(arm_apply_result_size): Likewise.
	(arm_legitimate_index_p): Likewise.
	(thumb2_legitimate_index_p): Likewise.
	(legitimize_reload_address): Likewise.
	(arm_register_move_cost): Likewise.
	(arm_hard_regno_mode_ok): Likewise.
	(arm_regno_class): Likewise.
	(arm_dbx_register_number): Likewise.
	(arm_emit_unwind_sequence): Likewise.
	(arm_conditional_register_usage): Likewise.
	* arm-protos.h (neg_const_double_rtx_ok_for_fpa): Remove declaration.
	(cirrus_memory_offset): Likewise.
	(output_move_long_double_fpa_from_arm): Likewise.
	(output_move_long_double_arm_from_fpa): Likewise.
	(output_move_double_fpa_from_arm): Likewise.
	(output_move_double_arm_from_fpa): Likewise.
	(arm_float_words_big_endian): Likewise.
	* arm.md (CC_REGNUM): Renumbered.
	(VFPCC_REGNUM): Moved here.  Renumbered.
	(FPA_F0_REGNUM, FPA_F7_REGNUM): Delete.
	(attr fpu): Remove FPA and Maverick support.
	* vfp.md (VFPCC_REGNUM): Delete.  Moved to arm.md.
	* arm-cores.def (ep9312): Remove Maverick support.
	* arm-arches.def (ep9312): Delete architecture.
	* arm-tables.opt: Regenerated.

	* arm/linux-elf.h (FPUTYPE_DEFAULT): Set to vfp.

From-SVN: r189350
parent 8166ff4d
2012-07-07 Richard Earnshaw <rearnsha@arm.com>
* arm.h (TARGET_CPU_CPP_BUILTINS): Remove Maverick support.
(TARGET_FPA): Delete definition.
(TARGET_MAVERICK): Likewise.
(TARGET_FPA_EMU2): Likewise.
(arm_fp_model): Remove FPA and Maverick models.
(arm_arch_cirrus): Delete declaration.
(FLOAT_WORDS_BIG_ENDIAN): Delete definition.
(FIXED_REGISTERS): Remove FPA and Maverick support. Reorganize.
(CALL_USED_REGISTERS): Likewise.
(FIRST_FPA_REGNUM, LAST_FPA_REGNUM): Delete definition.
(FIRST_VFP_REGNUM): Renumbered.
(D7_VFP_REGNUM): Chain definition.
(LAST_LO_VFP_REGNUM): Likewise.
(FIRST_HI_VFP_REGNUM): Likewise.
(LAST_HI_VFP_REGNUM): Likewise.
(FIRST_IWMMXT_GR_REGNUM): Likewise.
(LAST_IWMMXT_GR_REGNUM): Likewise.
(FIRST_IWMMXT_REGNUM): Likewise.
(LAST_IWMMXT_REGNUM): Likewise.
(FRAME_POINTER_REGNUM): Renumbered.
(ARG_POINTER_REGNUM): Renumbered.
(FIRST_PSEUDO_REGISTER): Remove FPA and Maverick registers.
(FIRST_CIRRUS_FP_REGNUM, LAST_CIRRUS_FP_REGNUM): Delete definitions.
(HARD_REGNO_REGNUM): Remove FPA support.
(REG_ALLOC_ORDER): Remove FPA and Maverick registers. Reorganize.
(reg_class): Likewise.
(REG_CLASS_NAMES): Likewise.
(REG_CLASS_CONTENTS): Likewise.
(CANNOT_CHANGE_MODE_CLASS): Never true. Update comment.
(SECONDARY_INPUT_RELOAD_CLASS): Remove Maverick support.
(CLASS_MAX_NREGS): Remove FPA and Maverick support.
* aout.h (REGISTER_NAMES): Remove FPA and Maverick registers.
Reorganize. Use AAPCS preferred names.
(ADDITIONAL_REGISTER_NAMES): Remove aliases for Maverick. Update
comments.
(OVERLAPPING_REGISTER_NAMES): Update register numbering.
* arm.c (FL_CIRRUS): Delete definition.
(arm_arch_cirrus): Delete variable.
(arm_float_words_big_endian): Delete function.
(cirrus_memory_offset): Delete function.
(output_mov_long_double_fpa_from_arm): Delete function.
(output_mov_long_double_arm_from_fpa): Delete function.
(output_mov_double_fpa_from_arm): Delete function.
(output_mov_double_arm_from_fpa): Delete function.
(emit_sfm): Delete function.
(maybe_get_arm_condition_code): Update comment.
(arm_file_start): Always use softvfp for softfloat systems.
(thumb_core_reg_alloc_order): Adjust for updated register allocation.
(arm_option_override): Remove FPA and Maverick support. Always
default to vfp as the fallback FPU format.
(use_return_insn): Remove FPA support.
(arm_get_frame_offsets): Likewise.
(arm_save_coproc_regs): Likewise.
(arm_canonicalize_comparison): Remove Maverick support.
(arm_select_cc_mode): Likewise.
(arm_gen_compare_reg): Likewise.
(arm_print_operand): Likewise.
(arm_libcall_value_1): Remove FPA and Maverick support.
(arm_function_value_regno_p): Likewise.
(arm_apply_result_size): Likewise.
(arm_legitimate_index_p): Likewise.
(thumb2_legitimate_index_p): Likewise.
(legitimize_reload_address): Likewise.
(arm_register_move_cost): Likewise.
(arm_hard_regno_mode_ok): Likewise.
(arm_regno_class): Likewise.
(arm_dbx_register_number): Likewise.
(arm_emit_unwind_sequence): Likewise.
(arm_conditional_register_usage): Likewise.
* arm-protos.h (neg_const_double_rtx_ok_for_fpa): Remove declaration.
(cirrus_memory_offset): Likewise.
(output_move_long_double_fpa_from_arm): Likewise.
(output_move_long_double_arm_from_fpa): Likewise.
(output_move_double_fpa_from_arm): Likewise.
(output_move_double_arm_from_fpa): Likewise.
(arm_float_words_big_endian): Likewise.
* arm.md (CC_REGNUM): Renumbered.
(VFPCC_REGNUM): Moved here. Renumbered.
(FPA_F0_REGNUM, FPA_F7_REGNUM): Delete.
(attr fpu): Remove FPA and Maverick support.
* vfp.md (VFPCC_REGNUM): Delete. Moved to arm.md.
* arm-cores.def (ep9312): Remove Maverick support.
* arm-arches.def (ep9312): Delete architecture.
* arm-tables.opt: Regenerated.
* arm/linux-elf.h (FPUTYPE_DEFAULT): Set to vfp.
2012-07-07 Steven Bosscher <steven@gcc.gnu.org> 2012-07-07 Steven Bosscher <steven@gcc.gnu.org>
PR tree-optimization/53881 PR tree-optimization/53881
......
...@@ -54,18 +54,7 @@ ...@@ -54,18 +54,7 @@
#define REGISTER_NAMES \ #define REGISTER_NAMES \
{ \ { \
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
"r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc", \ "r8", "r9", "r10", "fp", "ip", "sp", "lr", "pc", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"cc", "sfp", "afp", \
"mv0", "mv1", "mv2", "mv3", \
"mv4", "mv5", "mv6", "mv7", \
"mv8", "mv9", "mv10", "mv11", \
"mv12", "mv13", "mv14", "mv15", \
"wcgr0", "wcgr1", "wcgr2", "wcgr3", \
"wr0", "wr1", "wr2", "wr3", \
"wr4", "wr5", "wr6", "wr7", \
"wr8", "wr9", "wr10", "wr11", \
"wr12", "wr13", "wr14", "wr15", \
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \
"s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", \ "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", \
"s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", \ "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", \
...@@ -74,7 +63,12 @@ ...@@ -74,7 +63,12 @@
"d20", "?20", "d21", "?21", "d22", "?22", "d23", "?23", \ "d20", "?20", "d21", "?21", "d22", "?22", "d23", "?23", \
"d24", "?24", "d25", "?25", "d26", "?26", "d27", "?27", \ "d24", "?24", "d25", "?25", "d26", "?26", "d27", "?27", \
"d28", "?28", "d29", "?29", "d30", "?30", "d31", "?31", \ "d28", "?28", "d29", "?29", "d30", "?30", "d31", "?31", \
"vfpcc" \ "wr0", "wr1", "wr2", "wr3", \
"wr4", "wr5", "wr6", "wr7", \
"wr8", "wr9", "wr10", "wr11", \
"wr12", "wr13", "wr14", "wr15", \
"wcgr0", "wcgr1", "wcgr2", "wcgr3", \
"cc", "vfpcc", "sfp", "afp" \
} }
#endif #endif
...@@ -91,117 +85,53 @@ ...@@ -91,117 +85,53 @@
{"v4", 7}, \ {"v4", 7}, \
{"v5", 8}, \ {"v5", 8}, \
{"v6", 9}, \ {"v6", 9}, \
{"rfp", 9}, /* Gcc used to call it this */ \ {"rfp", 9}, /* Historical. */ \
{"sb", 9}, \ {"sb", 9}, /* Historical. */ \
{"v7", 10}, \ {"v7", 10}, \
{"r10", 10}, /* sl */ \ {"sl", 10}, /* Historical. */ \
{"r11", 11}, /* fp */ \ {"r11", 11}, /* fp */ \
{"r12", 12}, /* ip */ \ {"r12", 12}, /* ip */ \
{"r13", 13}, /* sp */ \ {"r13", 13}, /* sp */ \
{"r14", 14}, /* lr */ \ {"r14", 14}, /* lr */ \
{"r15", 15}, /* pc */ \ {"r15", 15} /* pc */ \
{"mvf0", 27}, \
{"mvf1", 28}, \
{"mvf2", 29}, \
{"mvf3", 30}, \
{"mvf4", 31}, \
{"mvf5", 32}, \
{"mvf6", 33}, \
{"mvf7", 34}, \
{"mvf8", 35}, \
{"mvf9", 36}, \
{"mvf10", 37}, \
{"mvf11", 38}, \
{"mvf12", 39}, \
{"mvf13", 40}, \
{"mvf14", 41}, \
{"mvf15", 42}, \
{"mvd0", 27}, \
{"mvd1", 28}, \
{"mvd2", 29}, \
{"mvd3", 30}, \
{"mvd4", 31}, \
{"mvd5", 32}, \
{"mvd6", 33}, \
{"mvd7", 34}, \
{"mvd8", 35}, \
{"mvd9", 36}, \
{"mvd10", 37}, \
{"mvd11", 38}, \
{"mvd12", 39}, \
{"mvd13", 40}, \
{"mvd14", 41}, \
{"mvd15", 42}, \
{"mvfx0", 27}, \
{"mvfx1", 28}, \
{"mvfx2", 29}, \
{"mvfx3", 30}, \
{"mvfx4", 31}, \
{"mvfx5", 32}, \
{"mvfx6", 33}, \
{"mvfx7", 34}, \
{"mvfx8", 35}, \
{"mvfx9", 36}, \
{"mvfx10", 37}, \
{"mvfx11", 38}, \
{"mvfx12", 39}, \
{"mvfx13", 40}, \
{"mvfx14", 41}, \
{"mvfx15", 42}, \
{"mvdx0", 27}, \
{"mvdx1", 28}, \
{"mvdx2", 29}, \
{"mvdx3", 30}, \
{"mvdx4", 31}, \
{"mvdx5", 32}, \
{"mvdx6", 33}, \
{"mvdx7", 34}, \
{"mvdx8", 35}, \
{"mvdx9", 36}, \
{"mvdx10", 37}, \
{"mvdx11", 38}, \
{"mvdx12", 39}, \
{"mvdx13", 40}, \
{"mvdx14", 41}, \
{"mvdx15", 42} \
} }
#endif #endif
#ifndef OVERLAPPING_REGISTER_NAMES #ifndef OVERLAPPING_REGISTER_NAMES
#define OVERLAPPING_REGISTER_NAMES \ #define OVERLAPPING_REGISTER_NAMES \
{ \ { \
{"d0", 63, 2}, \ {"d0", FIRST_VFP_REGNUM + 0, 2}, \
{"d1", 65, 2}, \ {"d1", FIRST_VFP_REGNUM + 2, 2}, \
{"d2", 67, 2}, \ {"d2", FIRST_VFP_REGNUM + 4, 2}, \
{"d3", 69, 2}, \ {"d3", FIRST_VFP_REGNUM + 6, 2}, \
{"d4", 71, 2}, \ {"d4", FIRST_VFP_REGNUM + 8, 2}, \
{"d5", 73, 2}, \ {"d5", FIRST_VFP_REGNUM + 10, 2}, \
{"d6", 75, 2}, \ {"d6", FIRST_VFP_REGNUM + 12, 2}, \
{"d7", 77, 2}, \ {"d7", FIRST_VFP_REGNUM + 14, 2}, \
{"d8", 79, 2}, \ {"d8", FIRST_VFP_REGNUM + 16, 2}, \
{"d9", 81, 2}, \ {"d9", FIRST_VFP_REGNUM + 18, 2}, \
{"d10", 83, 2}, \ {"d10", FIRST_VFP_REGNUM + 20, 2}, \
{"d11", 85, 2}, \ {"d11", FIRST_VFP_REGNUM + 22, 2}, \
{"d12", 87, 2}, \ {"d12", FIRST_VFP_REGNUM + 24, 2}, \
{"d13", 89, 2}, \ {"d13", FIRST_VFP_REGNUM + 26, 2}, \
{"d14", 91, 2}, \ {"d14", FIRST_VFP_REGNUM + 28, 2}, \
{"d15", 93, 2}, \ {"d15", FIRST_VFP_REGNUM + 30, 2}, \
{"q0", 63, 4}, \ {"q0", FIRST_VFP_REGNUM + 0, 4}, \
{"q1", 67, 4}, \ {"q1", FIRST_VFP_REGNUM + 4, 4}, \
{"q2", 71, 4}, \ {"q2", FIRST_VFP_REGNUM + 8, 4}, \
{"q3", 75, 4}, \ {"q3", FIRST_VFP_REGNUM + 12, 4}, \
{"q4", 79, 4}, \ {"q4", FIRST_VFP_REGNUM + 16, 4}, \
{"q5", 83, 4}, \ {"q5", FIRST_VFP_REGNUM + 20, 4}, \
{"q6", 87, 4}, \ {"q6", FIRST_VFP_REGNUM + 24, 4}, \
{"q7", 91, 4}, \ {"q7", FIRST_VFP_REGNUM + 28, 4}, \
{"q8", 95, 4}, \ {"q8", FIRST_VFP_REGNUM + 32, 4}, \
{"q9", 99, 4}, \ {"q9", FIRST_VFP_REGNUM + 36, 4}, \
{"q10", 103, 4}, \ {"q10", FIRST_VFP_REGNUM + 40, 4}, \
{"q11", 107, 4}, \ {"q11", FIRST_VFP_REGNUM + 44, 4}, \
{"q12", 111, 4}, \ {"q12", FIRST_VFP_REGNUM + 48, 4}, \
{"q13", 115, 4}, \ {"q13", FIRST_VFP_REGNUM + 52, 4}, \
{"q14", 119, 4}, \ {"q14", FIRST_VFP_REGNUM + 56, 4}, \
{"q15", 123, 4} \ {"q15", FIRST_VFP_REGNUM + 60, 4} \
} }
#endif #endif
......
...@@ -55,6 +55,5 @@ ARM_ARCH("armv7-a", cortexa8, 7A, FL_CO_PROC | FL_FOR_ARCH7A) ...@@ -55,6 +55,5 @@ ARM_ARCH("armv7-a", cortexa8, 7A, FL_CO_PROC | FL_FOR_ARCH7A)
ARM_ARCH("armv7-r", cortexr4, 7R, FL_CO_PROC | FL_FOR_ARCH7R) ARM_ARCH("armv7-r", cortexr4, 7R, FL_CO_PROC | FL_FOR_ARCH7R)
ARM_ARCH("armv7-m", cortexm3, 7M, FL_CO_PROC | FL_FOR_ARCH7M) ARM_ARCH("armv7-m", cortexm3, 7M, FL_CO_PROC | FL_FOR_ARCH7M)
ARM_ARCH("armv7e-m", cortexm4, 7EM, FL_CO_PROC | FL_FOR_ARCH7EM) ARM_ARCH("armv7e-m", cortexm4, 7EM, FL_CO_PROC | FL_FOR_ARCH7EM)
ARM_ARCH("ep9312", ep9312, 4T, FL_LDSCHED | FL_CIRRUS | FL_FOR_ARCH4)
ARM_ARCH("iwmmxt", iwmmxt, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT) ARM_ARCH("iwmmxt", iwmmxt, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT)
ARM_ARCH("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2) ARM_ARCH("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2)
...@@ -89,7 +89,7 @@ ARM_CORE("arm920", arm920, 4T, FL_LDSCHED, fastm ...@@ -89,7 +89,7 @@ ARM_CORE("arm920", arm920, 4T, FL_LDSCHED, fastm
ARM_CORE("arm920t", arm920t, 4T, FL_LDSCHED, fastmul) ARM_CORE("arm920t", arm920t, 4T, FL_LDSCHED, fastmul)
ARM_CORE("arm922t", arm922t, 4T, FL_LDSCHED, fastmul) ARM_CORE("arm922t", arm922t, 4T, FL_LDSCHED, fastmul)
ARM_CORE("arm940t", arm940t, 4T, FL_LDSCHED, fastmul) ARM_CORE("arm940t", arm940t, 4T, FL_LDSCHED, fastmul)
ARM_CORE("ep9312", ep9312, 4T, FL_LDSCHED | FL_CIRRUS, fastmul) ARM_CORE("ep9312", ep9312, 4T, FL_LDSCHED, fastmul)
/* V5T Architecture Processors */ /* V5T Architecture Processors */
ARM_CORE("arm10tdmi", arm10tdmi, 5T, FL_LDSCHED, fastmul) ARM_CORE("arm10tdmi", arm10tdmi, 5T, FL_LDSCHED, fastmul)
......
...@@ -67,7 +67,6 @@ extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int); ...@@ -67,7 +67,6 @@ extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int);
extern bool ldm_stm_operation_p (rtx, bool, enum machine_mode mode, extern bool ldm_stm_operation_p (rtx, bool, enum machine_mode mode,
bool, bool); bool, bool);
extern int arm_const_double_rtx (rtx); extern int arm_const_double_rtx (rtx);
extern int neg_const_double_rtx_ok_for_fpa (rtx);
extern int vfp3_const_double_rtx (rtx); extern int vfp3_const_double_rtx (rtx);
extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *); extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *);
extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *, extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *,
...@@ -95,7 +94,6 @@ extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx, ...@@ -95,7 +94,6 @@ extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx,
bool); bool);
extern bool arm_tls_referenced_p (rtx); extern bool arm_tls_referenced_p (rtx);
extern int cirrus_memory_offset (rtx);
extern int arm_coproc_mem_operand (rtx, bool); extern int arm_coproc_mem_operand (rtx, bool);
extern int neon_vector_mem_operand (rtx, int); extern int neon_vector_mem_operand (rtx, int);
extern int neon_struct_mem_operand (rtx); extern int neon_struct_mem_operand (rtx);
...@@ -134,11 +132,7 @@ extern void arm_emit_call_insn (rtx, rtx); ...@@ -134,11 +132,7 @@ extern void arm_emit_call_insn (rtx, rtx);
extern const char *output_call (rtx *); extern const char *output_call (rtx *);
extern const char *output_call_mem (rtx *); extern const char *output_call_mem (rtx *);
void arm_emit_movpair (rtx, rtx); void arm_emit_movpair (rtx, rtx);
extern const char *output_mov_long_double_fpa_from_arm (rtx *);
extern const char *output_mov_long_double_arm_from_fpa (rtx *);
extern const char *output_mov_long_double_arm_from_arm (rtx *); extern const char *output_mov_long_double_arm_from_arm (rtx *);
extern const char *output_mov_double_fpa_from_arm (rtx *);
extern const char *output_mov_double_arm_from_fpa (rtx *);
extern const char *output_move_double (rtx *, bool, int *count); extern const char *output_move_double (rtx *, bool, int *count);
extern const char *output_move_quad (rtx *); extern const char *output_move_quad (rtx *);
extern int arm_count_output_move_double_insns (rtx *); extern int arm_count_output_move_double_insns (rtx *);
...@@ -179,8 +173,6 @@ extern int arm_apply_result_size (void); ...@@ -179,8 +173,6 @@ extern int arm_apply_result_size (void);
#endif /* RTX_CODE */ #endif /* RTX_CODE */
extern int arm_float_words_big_endian (void);
/* Thumb functions. */ /* Thumb functions. */
extern void arm_init_expanders (void); extern void arm_init_expanders (void);
extern const char *thumb1_unexpanded_epilogue (void); extern const char *thumb1_unexpanded_epilogue (void);
......
...@@ -347,13 +347,10 @@ EnumValue ...@@ -347,13 +347,10 @@ EnumValue
Enum(arm_arch) String(armv7e-m) Value(22) Enum(arm_arch) String(armv7e-m) Value(22)
EnumValue EnumValue
Enum(arm_arch) String(ep9312) Value(23) Enum(arm_arch) String(iwmmxt) Value(23)
EnumValue EnumValue
Enum(arm_arch) String(iwmmxt) Value(24) Enum(arm_arch) String(iwmmxt2) Value(24)
EnumValue
Enum(arm_arch) String(iwmmxt2) Value(25)
Enum Enum
Name(arm_fpu) Type(int) Name(arm_fpu) Type(int)
......
...@@ -86,7 +86,6 @@ inline static int thumb1_index_register_rtx_p (rtx, int); ...@@ -86,7 +86,6 @@ inline static int thumb1_index_register_rtx_p (rtx, int);
static bool arm_legitimate_address_p (enum machine_mode, rtx, bool); static bool arm_legitimate_address_p (enum machine_mode, rtx, bool);
static int thumb_far_jump_used_p (void); static int thumb_far_jump_used_p (void);
static bool thumb_force_lr_save (void); static bool thumb_force_lr_save (void);
static rtx emit_sfm (int, int);
static unsigned arm_size_return_regs (void); static unsigned arm_size_return_regs (void);
static bool arm_assemble_integer (rtx, unsigned int, int); static bool arm_assemble_integer (rtx, unsigned int, int);
static void arm_print_operand (FILE *, rtx, int); static void arm_print_operand (FILE *, rtx, int);
...@@ -661,7 +660,7 @@ static int thumb_call_reg_needed; ...@@ -661,7 +660,7 @@ static int thumb_call_reg_needed;
#define FL_STRONG (1 << 8) /* StrongARM */ #define FL_STRONG (1 << 8) /* StrongARM */
#define FL_ARCH5E (1 << 9) /* DSP extensions to v5 */ #define FL_ARCH5E (1 << 9) /* DSP extensions to v5 */
#define FL_XSCALE (1 << 10) /* XScale */ #define FL_XSCALE (1 << 10) /* XScale */
#define FL_CIRRUS (1 << 11) /* Cirrus/DSP. */ /* spare (1 << 11) */
#define FL_ARCH6 (1 << 12) /* Architecture rel 6. Adds #define FL_ARCH6 (1 << 12) /* Architecture rel 6. Adds
media instructions. */ media instructions. */
#define FL_VFPV2 (1 << 13) /* Vector Floating Point V2. */ #define FL_VFPV2 (1 << 13) /* Vector Floating Point V2. */
...@@ -760,9 +759,6 @@ int arm_ld_sched = 0; ...@@ -760,9 +759,6 @@ int arm_ld_sched = 0;
/* Nonzero if this chip is a StrongARM. */ /* Nonzero if this chip is a StrongARM. */
int arm_tune_strongarm = 0; int arm_tune_strongarm = 0;
/* Nonzero if this chip is a Cirrus variant. */
int arm_arch_cirrus = 0;
/* Nonzero if this chip supports Intel Wireless MMX technology. */ /* Nonzero if this chip supports Intel Wireless MMX technology. */
int arm_arch_iwmmxt = 0; int arm_arch_iwmmxt = 0;
...@@ -1714,7 +1710,6 @@ arm_option_override (void) ...@@ -1714,7 +1710,6 @@ arm_option_override (void)
arm_arch7em = (insn_flags & FL_ARCH7EM) != 0; arm_arch7em = (insn_flags & FL_ARCH7EM) != 0;
arm_arch_thumb2 = (insn_flags & FL_THUMB2) != 0; arm_arch_thumb2 = (insn_flags & FL_THUMB2) != 0;
arm_arch_xscale = (insn_flags & FL_XSCALE) != 0; arm_arch_xscale = (insn_flags & FL_XSCALE) != 0;
arm_arch_cirrus = (insn_flags & FL_CIRRUS) != 0;
arm_ld_sched = (tune_flags & FL_LDSCHED) != 0; arm_ld_sched = (tune_flags & FL_LDSCHED) != 0;
arm_tune_strongarm = (tune_flags & FL_STRONG) != 0; arm_tune_strongarm = (tune_flags & FL_STRONG) != 0;
...@@ -1774,10 +1769,7 @@ arm_option_override (void) ...@@ -1774,10 +1769,7 @@ arm_option_override (void)
#ifdef FPUTYPE_DEFAULT #ifdef FPUTYPE_DEFAULT
target_fpu_name = FPUTYPE_DEFAULT; target_fpu_name = FPUTYPE_DEFAULT;
#else #else
if (arm_arch_cirrus) target_fpu_name = "vfp";
target_fpu_name = "maverick";
else
target_fpu_name = "fpe2";
#endif #endif
ok = opt_enum_arg_to_value (OPT_mfpu_, target_fpu_name, &arm_fpu_index, ok = opt_enum_arg_to_value (OPT_mfpu_, target_fpu_name, &arm_fpu_index,
...@@ -1789,19 +1781,6 @@ arm_option_override (void) ...@@ -1789,19 +1781,6 @@ arm_option_override (void)
switch (arm_fpu_desc->model) switch (arm_fpu_desc->model)
{ {
case ARM_FP_MODEL_FPA:
if (arm_fpu_desc->rev == 2)
arm_fpu_attr = FPU_FPE2;
else if (arm_fpu_desc->rev == 3)
arm_fpu_attr = FPU_FPE3;
else
arm_fpu_attr = FPU_FPA;
break;
case ARM_FP_MODEL_MAVERICK:
arm_fpu_attr = FPU_MAVERICK;
break;
case ARM_FP_MODEL_VFP: case ARM_FP_MODEL_VFP:
arm_fpu_attr = FPU_VFP; arm_fpu_attr = FPU_VFP;
break; break;
...@@ -1810,10 +1789,6 @@ arm_option_override (void) ...@@ -1810,10 +1789,6 @@ arm_option_override (void)
gcc_unreachable(); gcc_unreachable();
} }
if (TARGET_AAPCS_BASED
&& (arm_fpu_desc->model == ARM_FP_MODEL_FPA))
error ("FPA is unsupported in the AAPCS");
if (TARGET_AAPCS_BASED) if (TARGET_AAPCS_BASED)
{ {
if (TARGET_CALLER_INTERWORKING) if (TARGET_CALLER_INTERWORKING)
...@@ -1823,11 +1798,6 @@ arm_option_override (void) ...@@ -1823,11 +1798,6 @@ arm_option_override (void)
error ("AAPCS does not support -mcallee-super-interworking"); error ("AAPCS does not support -mcallee-super-interworking");
} }
/* FPA and iWMMXt are incompatible because the insn encodings overlap.
VFP and iWMMXt however can coexist. */
if (TARGET_IWMMXT && TARGET_HARD_FLOAT && !TARGET_VFP)
error ("iWMMXt and non-VFP floating point unit are incompatible");
/* iWMMXt and NEON are incompatible. */ /* iWMMXt and NEON are incompatible. */
if (TARGET_IWMMXT && TARGET_NEON) if (TARGET_IWMMXT && TARGET_NEON)
error ("iWMMXt and NEON are incompatible"); error ("iWMMXt and NEON are incompatible");
...@@ -1866,11 +1836,9 @@ arm_option_override (void) ...@@ -1866,11 +1836,9 @@ arm_option_override (void)
arm_pcs_default = ARM_PCS_ATPCS; arm_pcs_default = ARM_PCS_ATPCS;
} }
/* For arm2/3 there is no need to do any scheduling if there is only /* For arm2/3 there is no need to do any scheduling if we are doing
a floating point emulator, or we are doing software floating-point. */ software floating-point. */
if ((TARGET_SOFT_FLOAT if (TARGET_SOFT_FLOAT && (tune_flags & FL_MODE32) == 0)
|| (TARGET_FPA && arm_fpu_desc->rev))
&& (tune_flags & FL_MODE32) == 0)
flag_schedule_insns = flag_schedule_insns_after_reload = 0; flag_schedule_insns = flag_schedule_insns_after_reload = 0;
/* Use the cp15 method if it is available. */ /* Use the cp15 method if it is available. */
...@@ -2362,14 +2330,8 @@ use_return_insn (int iscond, rtx sibling) ...@@ -2362,14 +2330,8 @@ use_return_insn (int iscond, rtx sibling)
if (saved_int_regs && !(saved_int_regs & (1 << LR_REGNUM))) if (saved_int_regs && !(saved_int_regs & (1 << LR_REGNUM)))
return 0; return 0;
/* Can't be done if any of the FPA regs are pushed, /* Can't be done if any of the VFP regs are pushed,
since this also requires an insn. */ since this also requires an insn. */
if (TARGET_HARD_FLOAT && TARGET_FPA)
for (regno = FIRST_FPA_REGNUM; regno <= LAST_FPA_REGNUM; regno++)
if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
return 0;
/* Likewise VFP regs. */
if (TARGET_HARD_FLOAT && TARGET_VFP) if (TARGET_HARD_FLOAT && TARGET_VFP)
for (regno = FIRST_VFP_REGNUM; regno <= LAST_VFP_REGNUM; regno++) for (regno = FIRST_VFP_REGNUM; regno <= LAST_VFP_REGNUM; regno++)
if (df_regs_ever_live_p (regno) && !call_used_regs[regno]) if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
...@@ -3494,11 +3456,6 @@ arm_canonicalize_comparison (enum rtx_code code, rtx *op0, rtx *op1) ...@@ -3494,11 +3456,6 @@ arm_canonicalize_comparison (enum rtx_code code, rtx *op0, rtx *op1)
{ {
rtx tem; rtx tem;
/* To keep things simple, always use the Cirrus cfcmp64 if it is
available. */
if (TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK)
return code;
if (code == GT || code == LE if (code == GT || code == LE
|| (!TARGET_ARM && (code == GTU || code == LEU))) || (!TARGET_ARM && (code == GTU || code == LEU)))
{ {
...@@ -3748,16 +3705,6 @@ arm_libcall_value_1 (enum machine_mode mode) ...@@ -3748,16 +3705,6 @@ arm_libcall_value_1 (enum machine_mode mode)
{ {
if (TARGET_AAPCS_BASED) if (TARGET_AAPCS_BASED)
return aapcs_libcall_value (mode); return aapcs_libcall_value (mode);
else if (TARGET_32BIT
&& TARGET_HARD_FLOAT_ABI
&& TARGET_FPA
&& GET_MODE_CLASS (mode) == MODE_FLOAT)
return gen_rtx_REG (mode, FIRST_FPA_REGNUM);
else if (TARGET_32BIT
&& TARGET_HARD_FLOAT_ABI
&& TARGET_MAVERICK
&& GET_MODE_CLASS (mode) == MODE_FLOAT)
return gen_rtx_REG (mode, FIRST_CIRRUS_FP_REGNUM);
else if (TARGET_IWMMXT_ABI else if (TARGET_IWMMXT_ABI
&& arm_vector_mode_supported_p (mode)) && arm_vector_mode_supported_p (mode))
return gen_rtx_REG (mode, FIRST_IWMMXT_REGNUM); return gen_rtx_REG (mode, FIRST_IWMMXT_REGNUM);
...@@ -3795,16 +3742,8 @@ arm_function_value_regno_p (const unsigned int regno) ...@@ -3795,16 +3742,8 @@ arm_function_value_regno_p (const unsigned int regno)
&& TARGET_VFP && TARGET_VFP
&& TARGET_HARD_FLOAT && TARGET_HARD_FLOAT
&& regno == FIRST_VFP_REGNUM) && regno == FIRST_VFP_REGNUM)
|| (TARGET_32BIT
&& TARGET_HARD_FLOAT_ABI
&& TARGET_MAVERICK
&& regno == FIRST_CIRRUS_FP_REGNUM)
|| (TARGET_IWMMXT_ABI || (TARGET_IWMMXT_ABI
&& regno == FIRST_IWMMXT_REGNUM) && regno == FIRST_IWMMXT_REGNUM))
|| (TARGET_32BIT
&& TARGET_HARD_FLOAT_ABI
&& TARGET_FPA
&& regno == FIRST_FPA_REGNUM))
return true; return true;
return false; return false;
...@@ -3819,15 +3758,8 @@ arm_apply_result_size (void) ...@@ -3819,15 +3758,8 @@ arm_apply_result_size (void)
if (TARGET_32BIT) if (TARGET_32BIT)
{ {
if (TARGET_HARD_FLOAT_ABI) if (TARGET_HARD_FLOAT_ABI && TARGET_VFP)
{
if (TARGET_VFP)
size += 32; size += 32;
if (TARGET_FPA)
size += 12;
if (TARGET_MAVERICK)
size += 8;
}
if (TARGET_IWMMXT_ABI) if (TARGET_IWMMXT_ABI)
size += 8; size += 8;
} }
...@@ -3978,28 +3910,6 @@ arm_return_in_memory (const_tree type, const_tree fntype) ...@@ -3978,28 +3910,6 @@ arm_return_in_memory (const_tree type, const_tree fntype)
return true; return true;
} }
/* Indicate whether or not words of a double are in big-endian order. */
int
arm_float_words_big_endian (void)
{
if (TARGET_MAVERICK)
return 0;
/* For FPA, float words are always big-endian. For VFP, floats words
follow the memory system mode. */
if (TARGET_FPA)
{
return 1;
}
if (TARGET_VFP)
return (TARGET_BIG_END ? 1 : 0);
return 1;
}
const struct pcs_attribute_arg const struct pcs_attribute_arg
{ {
const char *arg; const char *arg;
...@@ -5879,9 +5789,8 @@ arm_legitimate_index_p (enum machine_mode mode, rtx index, RTX_CODE outer, ...@@ -5879,9 +5789,8 @@ arm_legitimate_index_p (enum machine_mode mode, rtx index, RTX_CODE outer,
/* Standard coprocessor addressing modes. */ /* Standard coprocessor addressing modes. */
if (TARGET_HARD_FLOAT if (TARGET_HARD_FLOAT
&& (TARGET_VFP || TARGET_FPA || TARGET_MAVERICK) && TARGET_VFP
&& (mode == SFmode || mode == DFmode && (mode == SFmode || mode == DFmode))
|| (TARGET_MAVERICK && mode == DImode)))
return (code == CONST_INT && INTVAL (index) < 1024 return (code == CONST_INT && INTVAL (index) < 1024
&& INTVAL (index) > -1024 && INTVAL (index) > -1024
&& (INTVAL (index) & 3) == 0); && (INTVAL (index) & 3) == 0);
...@@ -6000,9 +5909,8 @@ thumb2_legitimate_index_p (enum machine_mode mode, rtx index, int strict_p) ...@@ -6000,9 +5909,8 @@ thumb2_legitimate_index_p (enum machine_mode mode, rtx index, int strict_p)
/* ??? Combine arm and thumb2 coprocessor addressing modes. */ /* ??? Combine arm and thumb2 coprocessor addressing modes. */
/* Standard coprocessor addressing modes. */ /* Standard coprocessor addressing modes. */
if (TARGET_HARD_FLOAT if (TARGET_HARD_FLOAT
&& (TARGET_VFP || TARGET_FPA || TARGET_MAVERICK) && TARGET_VFP
&& (mode == SFmode || mode == DFmode && (mode == SFmode || mode == DFmode))
|| (TARGET_MAVERICK && mode == DImode)))
return (code == CONST_INT && INTVAL (index) < 1024 return (code == CONST_INT && INTVAL (index) < 1024
/* Thumb-2 allows only > -256 index range for it's core register /* Thumb-2 allows only > -256 index range for it's core register
load/stores. Since we allow SF/DF in core registers, we have load/stores. Since we allow SF/DF in core registers, we have
...@@ -6715,9 +6623,8 @@ arm_legitimize_reload_address (rtx *p, ...@@ -6715,9 +6623,8 @@ arm_legitimize_reload_address (rtx *p,
/* Detect coprocessor load/stores. */ /* Detect coprocessor load/stores. */
bool coproc_p = ((TARGET_HARD_FLOAT bool coproc_p = ((TARGET_HARD_FLOAT
&& (TARGET_VFP || TARGET_FPA || TARGET_MAVERICK) && TARGET_VFP
&& (mode == SFmode || mode == DFmode && (mode == SFmode || mode == DFmode))
|| (mode == DImode && TARGET_MAVERICK)))
|| (TARGET_REALLY_IWMMXT || (TARGET_REALLY_IWMMXT
&& VALID_IWMMXT_REG_MODE (mode)) && VALID_IWMMXT_REG_MODE (mode))
|| (TARGET_NEON || (TARGET_NEON
...@@ -8573,7 +8480,6 @@ fa726te_sched_adjust_cost (rtx insn, rtx link, rtx dep, int * cost) ...@@ -8573,7 +8480,6 @@ fa726te_sched_adjust_cost (rtx insn, rtx link, rtx dep, int * cost)
/* Implement TARGET_REGISTER_MOVE_COST. /* Implement TARGET_REGISTER_MOVE_COST.
Moves between FPA_REGS and GENERAL_REGS are two memory insns.
Moves between VFP_REGS and GENERAL_REGS are a single insn, but Moves between VFP_REGS and GENERAL_REGS are a single insn, but
it is typically more expensive than a single memory access. We set it is typically more expensive than a single memory access. We set
the cost to less than two memory accesses so that floating the cost to less than two memory accesses so that floating
...@@ -8585,10 +8491,7 @@ arm_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, ...@@ -8585,10 +8491,7 @@ arm_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
{ {
if (TARGET_32BIT) if (TARGET_32BIT)
{ {
if ((from == FPA_REGS && to != FPA_REGS) if ((IS_VFP_CLASS (from) && !IS_VFP_CLASS (to))
|| (from != FPA_REGS && to == FPA_REGS))
return 20;
else if ((IS_VFP_CLASS (from) && !IS_VFP_CLASS (to))
|| (!IS_VFP_CLASS (from) && IS_VFP_CLASS (to))) || (!IS_VFP_CLASS (from) && IS_VFP_CLASS (to)))
return 15; return 15;
else if ((from == IWMMXT_REGS && to != IWMMXT_REGS) else if ((from == IWMMXT_REGS && to != IWMMXT_REGS)
...@@ -8596,9 +8499,6 @@ arm_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, ...@@ -8596,9 +8499,6 @@ arm_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
return 4; return 4;
else if (from == IWMMXT_GR_REGS || to == IWMMXT_GR_REGS) else if (from == IWMMXT_GR_REGS || to == IWMMXT_GR_REGS)
return 20; return 20;
else if ((from == CIRRUS_REGS && to != CIRRUS_REGS)
|| (from != CIRRUS_REGS && to == CIRRUS_REGS))
return 20;
else else
return 2; return 2;
} }
...@@ -8656,7 +8556,7 @@ arm_adjust_cost (rtx insn, rtx link, rtx dep, int cost) ...@@ -8656,7 +8556,7 @@ arm_adjust_cost (rtx insn, rtx link, rtx dep, int cost)
return cost; return cost;
} }
/* XXX This is not strictly true for the FPA. */ /* XXX Is this strictly true? */
if (REG_NOTE_KIND (link) == REG_DEP_ANTI if (REG_NOTE_KIND (link) == REG_DEP_ANTI
|| REG_NOTE_KIND (link) == REG_DEP_OUTPUT) || REG_NOTE_KIND (link) == REG_DEP_OUTPUT)
return 0; return 0;
...@@ -9505,43 +9405,6 @@ neon_element_bits (enum machine_mode mode) ...@@ -9505,43 +9405,6 @@ neon_element_bits (enum machine_mode mode)
/* Predicates for `match_operand' and `match_operator'. */ /* Predicates for `match_operand' and `match_operator'. */
/* Return nonzero if OP is a valid Cirrus memory address pattern. */
int
cirrus_memory_offset (rtx op)
{
/* Reject eliminable registers. */
if (! (reload_in_progress || reload_completed)
&& ( reg_mentioned_p (frame_pointer_rtx, op)
|| reg_mentioned_p (arg_pointer_rtx, op)
|| reg_mentioned_p (virtual_incoming_args_rtx, op)
|| reg_mentioned_p (virtual_outgoing_args_rtx, op)
|| reg_mentioned_p (virtual_stack_dynamic_rtx, op)
|| reg_mentioned_p (virtual_stack_vars_rtx, op)))
return 0;
if (GET_CODE (op) == MEM)
{
rtx ind;
ind = XEXP (op, 0);
/* Match: (mem (reg)). */
if (GET_CODE (ind) == REG)
return 1;
/* Match:
(mem (plus (reg)
(const))). */
if (GET_CODE (ind) == PLUS
&& GET_CODE (XEXP (ind, 0)) == REG
&& REG_MODE_OK_FOR_BASE_P (XEXP (ind, 0), VOIDmode)
&& GET_CODE (XEXP (ind, 1)) == CONST_INT)
return 1;
}
return 0;
}
/* Return TRUE if OP is a valid coprocessor memory address pattern. /* Return TRUE if OP is a valid coprocessor memory address pattern.
WB is true if full writeback address modes are allowed and is false WB is true if full writeback address modes are allowed and is false
if limited writeback address modes (POST_INC and PRE_DEC) are if limited writeback address modes (POST_INC and PRE_DEC) are
...@@ -11641,8 +11504,6 @@ arm_select_cc_mode (enum rtx_code op, rtx x, rtx y) ...@@ -11641,8 +11504,6 @@ arm_select_cc_mode (enum rtx_code op, rtx x, rtx y)
case LE: case LE:
case GT: case GT:
case GE: case GE:
if (TARGET_HARD_FLOAT && TARGET_MAVERICK)
return CCFPmode;
return CCFPEmode; return CCFPEmode;
default: default:
...@@ -11747,11 +11608,6 @@ arm_select_cc_mode (enum rtx_code op, rtx x, rtx y) ...@@ -11747,11 +11608,6 @@ arm_select_cc_mode (enum rtx_code op, rtx x, rtx y)
if (GET_MODE (x) == DImode || GET_MODE (y) == DImode) if (GET_MODE (x) == DImode || GET_MODE (y) == DImode)
{ {
/* To keep things simple, always use the Cirrus cfcmp64 if it is
available. */
if (TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK)
return CCmode;
switch (op) switch (op)
{ {
case EQ: case EQ:
...@@ -11819,7 +11675,6 @@ arm_gen_compare_reg (enum rtx_code code, rtx x, rtx y, rtx scratch) ...@@ -11819,7 +11675,6 @@ arm_gen_compare_reg (enum rtx_code code, rtx x, rtx y, rtx scratch)
cc_reg = gen_rtx_REG (mode, CC_REGNUM); cc_reg = gen_rtx_REG (mode, CC_REGNUM);
if (dimode_comparison if (dimode_comparison
&& !(TARGET_HARD_FLOAT && TARGET_MAVERICK)
&& mode != CC_CZmode) && mode != CC_CZmode)
{ {
rtx clobber, set; rtx clobber, set;
...@@ -13962,47 +13817,6 @@ output_call_mem (rtx *operands) ...@@ -13962,47 +13817,6 @@ output_call_mem (rtx *operands)
} }
/* Output a move from arm registers to an fpa registers.
OPERANDS[0] is an fpa register.
OPERANDS[1] is the first registers of an arm register pair. */
const char *
output_mov_long_double_fpa_from_arm (rtx *operands)
{
int arm_reg0 = REGNO (operands[1]);
rtx ops[3];
gcc_assert (arm_reg0 != IP_REGNUM);
ops[0] = gen_rtx_REG (SImode, arm_reg0);
ops[1] = gen_rtx_REG (SImode, 1 + arm_reg0);
ops[2] = gen_rtx_REG (SImode, 2 + arm_reg0);
output_asm_insn ("stm%(fd%)\t%|sp!, {%0, %1, %2}", ops);
output_asm_insn ("ldf%?e\t%0, [%|sp], #12", operands);
return "";
}
/* Output a move from an fpa register to arm registers.
OPERANDS[0] is the first registers of an arm register pair.
OPERANDS[1] is an fpa register. */
const char *
output_mov_long_double_arm_from_fpa (rtx *operands)
{
int arm_reg0 = REGNO (operands[0]);
rtx ops[3];
gcc_assert (arm_reg0 != IP_REGNUM);
ops[0] = gen_rtx_REG (SImode, arm_reg0);
ops[1] = gen_rtx_REG (SImode, 1 + arm_reg0);
ops[2] = gen_rtx_REG (SImode, 2 + arm_reg0);
output_asm_insn ("stf%?e\t%1, [%|sp, #-12]!", operands);
output_asm_insn ("ldm%(fd%)\t%|sp!, {%0, %1, %2}", ops);
return "";
}
/* Output a move from arm registers to arm registers of a long double /* Output a move from arm registers to arm registers of a long double
OPERANDS[0] is the destination. OPERANDS[0] is the destination.
OPERANDS[1] is the source. */ OPERANDS[1] is the source. */
...@@ -14055,42 +13869,6 @@ arm_emit_movpair (rtx dest, rtx src) ...@@ -14055,42 +13869,6 @@ arm_emit_movpair (rtx dest, rtx src)
emit_set_insn (dest, gen_rtx_LO_SUM (SImode, dest, src)); emit_set_insn (dest, gen_rtx_LO_SUM (SImode, dest, src));
} }
/* Output a move from arm registers to an fpa registers.
OPERANDS[0] is an fpa register.
OPERANDS[1] is the first registers of an arm register pair. */
const char *
output_mov_double_fpa_from_arm (rtx *operands)
{
int arm_reg0 = REGNO (operands[1]);
rtx ops[2];
gcc_assert (arm_reg0 != IP_REGNUM);
ops[0] = gen_rtx_REG (SImode, arm_reg0);
ops[1] = gen_rtx_REG (SImode, 1 + arm_reg0);
output_asm_insn ("stm%(fd%)\t%|sp!, {%0, %1}", ops);
output_asm_insn ("ldf%?d\t%0, [%|sp], #8", operands);
return "";
}
/* Output a move from an fpa register to arm registers.
OPERANDS[0] is the first registers of an arm register pair.
OPERANDS[1] is an fpa register. */
const char *
output_mov_double_arm_from_fpa (rtx *operands)
{
int arm_reg0 = REGNO (operands[0]);
rtx ops[2];
gcc_assert (arm_reg0 != IP_REGNUM);
ops[0] = gen_rtx_REG (SImode, arm_reg0);
ops[1] = gen_rtx_REG (SImode, 1 + arm_reg0);
output_asm_insn ("stf%?d\t%1, [%|sp, #-8]!", operands);
output_asm_insn ("ldm%(fd%)\t%|sp!, {%0, %1}", ops);
return "";
}
/* Output a move between double words. It must be REG<-MEM /* Output a move between double words. It must be REG<-MEM
or MEM<-REG. */ or MEM<-REG. */
const char * const char *
...@@ -16133,68 +15911,7 @@ arm_size_return_regs (void) ...@@ -16133,68 +15911,7 @@ arm_size_return_regs (void)
return GET_MODE_SIZE (mode); return GET_MODE_SIZE (mode);
} }
static rtx
emit_sfm (int base_reg, int count)
{
rtx par;
rtx dwarf;
rtx tmp, reg;
int i;
par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1));
reg = gen_rtx_REG (XFmode, base_reg++);
XVECEXP (par, 0, 0)
= gen_rtx_SET (VOIDmode,
gen_frame_mem
(BLKmode,
gen_rtx_PRE_MODIFY (Pmode,
stack_pointer_rtx,
plus_constant
(Pmode, stack_pointer_rtx,
-12 * count))
),
gen_rtx_UNSPEC (BLKmode,
gen_rtvec (1, reg),
UNSPEC_PUSH_MULT));
tmp = gen_rtx_SET (VOIDmode,
gen_frame_mem (XFmode, stack_pointer_rtx), reg);
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 1) = tmp;
for (i = 1; i < count; i++)
{
reg = gen_rtx_REG (XFmode, base_reg++);
XVECEXP (par, 0, i) = gen_rtx_USE (VOIDmode, reg);
tmp = gen_rtx_SET (VOIDmode,
gen_frame_mem (XFmode,
plus_constant (Pmode,
stack_pointer_rtx,
i * 12)),
reg);
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, i + 1) = tmp;
}
tmp = gen_rtx_SET (VOIDmode,
stack_pointer_rtx,
plus_constant (Pmode, stack_pointer_rtx, -12 * count));
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
par = emit_insn (par);
add_reg_note (par, REG_FRAME_RELATED_EXPR, dwarf);
return par;
}
/* Return true if the current function needs to save/restore LR. */ /* Return true if the current function needs to save/restore LR. */
static bool static bool
thumb_force_lr_save (void) thumb_force_lr_save (void)
{ {
...@@ -16207,7 +15924,6 @@ thumb_force_lr_save (void) ...@@ -16207,7 +15924,6 @@ thumb_force_lr_save (void)
/* Return true if r3 is used by any of the tail call insns in the /* Return true if r3 is used by any of the tail call insns in the
current function. */ current function. */
static bool static bool
any_sibcall_uses_r3 (void) any_sibcall_uses_r3 (void)
{ {
...@@ -16345,18 +16061,11 @@ arm_get_frame_offsets (void) ...@@ -16345,18 +16061,11 @@ arm_get_frame_offsets (void)
} }
func_type = arm_current_func_type (); func_type = arm_current_func_type ();
if (! IS_VOLATILE (func_type))
{
/* Space for saved FPA registers. */
for (regno = FIRST_FPA_REGNUM; regno <= LAST_FPA_REGNUM; regno++)
if (df_regs_ever_live_p (regno) && ! call_used_regs[regno])
saved += 12;
/* Space for saved VFP registers. */ /* Space for saved VFP registers. */
if (TARGET_HARD_FLOAT && TARGET_VFP) if (! IS_VOLATILE (func_type)
&& TARGET_HARD_FLOAT && TARGET_VFP)
saved += arm_get_vfp_saved_size (); saved += arm_get_vfp_saved_size ();
} }
}
else /* TARGET_THUMB1 */ else /* TARGET_THUMB1 */
{ {
offsets->saved_regs_mask = thumb1_compute_save_reg_mask (); offsets->saved_regs_mask = thumb1_compute_save_reg_mask ();
...@@ -16551,55 +16260,6 @@ arm_save_coproc_regs(void) ...@@ -16551,55 +16260,6 @@ arm_save_coproc_regs(void)
saved_size += 8; saved_size += 8;
} }
/* Save any floating point call-saved registers used by this
function. */
if (TARGET_FPA_EMU2)
{
for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
{
insn = gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx);
insn = gen_rtx_MEM (XFmode, insn);
insn = emit_set_insn (insn, gen_rtx_REG (XFmode, reg));
RTX_FRAME_RELATED_P (insn) = 1;
saved_size += 12;
}
}
else
{
start_reg = LAST_FPA_REGNUM;
for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
{
if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
{
if (start_reg - reg == 3)
{
insn = emit_sfm (reg, 4);
RTX_FRAME_RELATED_P (insn) = 1;
saved_size += 48;
start_reg = reg - 1;
}
}
else
{
if (start_reg != reg)
{
insn = emit_sfm (reg + 1, start_reg - reg);
RTX_FRAME_RELATED_P (insn) = 1;
saved_size += (start_reg - reg) * 12;
}
start_reg = reg - 1;
}
}
if (start_reg != reg)
{
insn = emit_sfm (reg + 1, start_reg - reg);
saved_size += (start_reg - reg) * 12;
RTX_FRAME_RELATED_P (insn) = 1;
}
}
if (TARGET_HARD_FLOAT && TARGET_VFP) if (TARGET_HARD_FLOAT && TARGET_VFP)
{ {
start_reg = FIRST_VFP_REGNUM; start_reg = FIRST_VFP_REGNUM;
...@@ -17156,16 +16816,6 @@ arm_print_operand (FILE *stream, rtx x, int code) ...@@ -17156,16 +16816,6 @@ arm_print_operand (FILE *stream, rtx x, int code)
fprintf (stream, "%s", arithmetic_instr (x, 1)); fprintf (stream, "%s", arithmetic_instr (x, 1));
return; return;
/* Truncate Cirrus shift counts. */
case 's':
if (GET_CODE (x) == CONST_INT)
{
fprintf (stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 0x3f);
return;
}
arm_print_operand (stream, x, 0);
return;
case 'I': case 'I':
fprintf (stream, "%s", arithmetic_instr (x, 0)); fprintf (stream, "%s", arithmetic_instr (x, 0));
return; return;
...@@ -17352,44 +17002,15 @@ arm_print_operand (FILE *stream, rtx x, int code) ...@@ -17352,44 +17002,15 @@ arm_print_operand (FILE *stream, rtx x, int code)
stream); stream);
return; return;
/* Cirrus registers can be accessed in a variety of ways: case 's':
single floating point (f)
double floating point (d)
32bit integer (fx)
64bit integer (dx). */
case 'W': /* Cirrus register in F mode. */
case 'X': /* Cirrus register in D mode. */
case 'Y': /* Cirrus register in FX mode. */
case 'Z': /* Cirrus register in DX mode. */
gcc_assert (GET_CODE (x) == REG
&& REGNO_REG_CLASS (REGNO (x)) == CIRRUS_REGS);
fprintf (stream, "mv%s%s",
code == 'W' ? "f"
: code == 'X' ? "d"
: code == 'Y' ? "fx" : "dx", reg_names[REGNO (x)] + 2);
return;
/* Print cirrus register in the mode specified by the register's mode. */
case 'V': case 'V':
{ case 'W':
int mode = GET_MODE (x); case 'X':
case 'Y':
if (GET_CODE (x) != REG || REGNO_REG_CLASS (REGNO (x)) != CIRRUS_REGS) case 'Z':
{ /* Former Maverick support, removed after GCC-4.7. */
output_operand_lossage ("invalid operand for code '%c'", code); output_operand_lossage ("obsolete Maverick format code '%c'", code);
return; return;
}
fprintf (stream, "mv%s%s",
mode == DFmode ? "d"
: mode == SImode ? "fx"
: mode == DImode ? "dx"
: "f", reg_names[REGNO (x)] + 2);
return;
}
case 'U': case 'U':
if (GET_CODE (x) != REG if (GET_CODE (x) != REG
...@@ -18074,9 +17695,7 @@ maybe_get_arm_condition_code (rtx comparison) ...@@ -18074,9 +17695,7 @@ maybe_get_arm_condition_code (rtx comparison)
case CCFPEmode: case CCFPEmode:
case CCFPmode: case CCFPmode:
/* These encodings assume that AC=1 in the FPA system control /* We can handle all cases except UNEQ and LTGT. */
byte. This allows us to handle all cases except UNEQ and
LTGT. */
switch (comp_code) switch (comp_code)
{ {
case GE: return ARM_GE; case GE: return ARM_GE;
...@@ -18576,15 +18195,6 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode) ...@@ -18576,15 +18195,6 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
start of an even numbered register pair. */ start of an even numbered register pair. */
return (ARM_NUM_REGS (mode) < 2) || (regno < LAST_LO_REGNUM); return (ARM_NUM_REGS (mode) < 2) || (regno < LAST_LO_REGNUM);
if (TARGET_HARD_FLOAT && TARGET_MAVERICK
&& IS_CIRRUS_REGNUM (regno))
/* We have outlawed SI values in Cirrus registers because they
reside in the lower 32 bits, but SF values reside in the
upper 32 bits. This causes gcc all sorts of grief. We can't
even split the registers into pairs because Cirrus SI values
get sign extended to 64bits-- aldyh. */
return (GET_MODE_CLASS (mode) == MODE_FLOAT) || (mode == DImode);
if (TARGET_HARD_FLOAT && TARGET_VFP if (TARGET_HARD_FLOAT && TARGET_VFP
&& IS_VFP_REGNUM (regno)) && IS_VFP_REGNUM (regno))
{ {
...@@ -18634,12 +18244,7 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode) ...@@ -18634,12 +18244,7 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
/* We only allow integers in the fake hard registers. */ /* We only allow integers in the fake hard registers. */
return GET_MODE_CLASS (mode) == MODE_INT; return GET_MODE_CLASS (mode) == MODE_INT;
/* The only registers left are the FPA registers return FALSE;
which we only allow to hold FP values. */
return (TARGET_HARD_FLOAT && TARGET_FPA
&& GET_MODE_CLASS (mode) == MODE_FLOAT
&& regno >= FIRST_FPA_REGNUM
&& regno <= LAST_FPA_REGNUM);
} }
/* Implement MODES_TIEABLE_P. */ /* Implement MODES_TIEABLE_P. */
...@@ -18693,9 +18298,6 @@ arm_regno_class (int regno) ...@@ -18693,9 +18298,6 @@ arm_regno_class (int regno)
if (regno == CC_REGNUM || regno == VFPCC_REGNUM) if (regno == CC_REGNUM || regno == VFPCC_REGNUM)
return TARGET_THUMB2 ? CC_REG : NO_REGS; return TARGET_THUMB2 ? CC_REG : NO_REGS;
if (IS_CIRRUS_REGNUM (regno))
return CIRRUS_REGS;
if (IS_VFP_REGNUM (regno)) if (IS_VFP_REGNUM (regno))
{ {
if (regno <= D7_VFP_REGNUM) if (regno <= D7_VFP_REGNUM)
...@@ -18712,7 +18314,7 @@ arm_regno_class (int regno) ...@@ -18712,7 +18314,7 @@ arm_regno_class (int regno)
if (IS_IWMMXT_GR_REGNUM (regno)) if (IS_IWMMXT_GR_REGNUM (regno))
return IWMMXT_GR_REGS; return IWMMXT_GR_REGS;
return FPA_REGS; return NO_REGS;
} }
/* Handle a special case when computing the offset /* Handle a special case when computing the offset
...@@ -23645,10 +23247,7 @@ arm_file_start (void) ...@@ -23645,10 +23247,7 @@ arm_file_start (void)
if (TARGET_SOFT_FLOAT) if (TARGET_SOFT_FLOAT)
{ {
if (TARGET_VFP)
fpu_name = "softvfp"; fpu_name = "softvfp";
else
fpu_name = "softfpa";
} }
else else
{ {
...@@ -24550,11 +24149,6 @@ arm_dbx_register_number (unsigned int regno) ...@@ -24550,11 +24149,6 @@ arm_dbx_register_number (unsigned int regno)
if (regno < 16) if (regno < 16)
return regno; return regno;
/* TODO: Legacy targets output FPA regs as registers 16-23 for backwards
compatibility. The EABI defines them as registers 96-103. */
if (IS_FPA_REGNUM (regno))
return (TARGET_AAPCS_BASED ? 96 : 16) + regno - FIRST_FPA_REGNUM;
if (IS_VFP_REGNUM (regno)) if (IS_VFP_REGNUM (regno))
{ {
/* See comment in arm_dwarf_register_span. */ /* See comment in arm_dwarf_register_span. */
...@@ -24656,12 +24250,6 @@ arm_unwind_emit_sequence (FILE * asm_out_file, rtx p) ...@@ -24656,12 +24250,6 @@ arm_unwind_emit_sequence (FILE * asm_out_file, rtx p)
reg_size = 8; reg_size = 8;
fprintf (asm_out_file, "\t.vsave {"); fprintf (asm_out_file, "\t.vsave {");
} }
else if (reg >= FIRST_FPA_REGNUM && reg <= LAST_FPA_REGNUM)
{
/* FPA registers are done differently. */
asm_fprintf (asm_out_file, "\t.save %r, %wd\n", reg, nregs);
return;
}
else else
/* Unknown register type. */ /* Unknown register type. */
abort (); abort ();
...@@ -25358,7 +24946,7 @@ arm_mangle_type (const_tree type) ...@@ -25358,7 +24946,7 @@ arm_mangle_type (const_tree type)
static const int thumb_core_reg_alloc_order[] = static const int thumb_core_reg_alloc_order[] =
{ {
3, 2, 1, 0, 4, 5, 6, 7, 3, 2, 1, 0, 4, 5, 6, 7,
14, 12, 8, 9, 10, 11, 13, 15 14, 12, 8, 9, 10, 11
}; };
/* Adjust register allocation order when compiling for Thumb. */ /* Adjust register allocation order when compiling for Thumb. */
...@@ -25441,13 +25029,6 @@ arm_conditional_register_usage (void) ...@@ -25441,13 +25029,6 @@ arm_conditional_register_usage (void)
{ {
int regno; int regno;
if (TARGET_SOFT_FLOAT || TARGET_THUMB1 || !TARGET_FPA)
{
for (regno = FIRST_FPA_REGNUM;
regno <= LAST_FPA_REGNUM; ++regno)
fixed_regs[regno] = call_used_regs[regno] = 1;
}
if (TARGET_THUMB1 && optimize_size) if (TARGET_THUMB1 && optimize_size)
{ {
/* When optimizing for size on Thumb-1, it's better not /* When optimizing for size on Thumb-1, it's better not
...@@ -25464,21 +25045,7 @@ arm_conditional_register_usage (void) ...@@ -25464,21 +25045,7 @@ arm_conditional_register_usage (void)
if (TARGET_THUMB1) if (TARGET_THUMB1)
fixed_regs[LR_REGNUM] = call_used_regs[LR_REGNUM] = 1; fixed_regs[LR_REGNUM] = call_used_regs[LR_REGNUM] = 1;
if (TARGET_32BIT && TARGET_HARD_FLOAT) if (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP)
{
if (TARGET_MAVERICK)
{
for (regno = FIRST_FPA_REGNUM;
regno <= LAST_FPA_REGNUM; ++ regno)
fixed_regs[regno] = call_used_regs[regno] = 1;
for (regno = FIRST_CIRRUS_FP_REGNUM;
regno <= LAST_CIRRUS_FP_REGNUM; ++ regno)
{
fixed_regs[regno] = 0;
call_used_regs[regno] = regno < FIRST_CIRRUS_FP_REGNUM + 4;
}
}
if (TARGET_VFP)
{ {
/* VFPv3 registers are disabled when earlier VFP /* VFPv3 registers are disabled when earlier VFP
versions are selected due to the definition of versions are selected due to the definition of
...@@ -25491,7 +25058,6 @@ arm_conditional_register_usage (void) ...@@ -25491,7 +25058,6 @@ arm_conditional_register_usage (void)
|| regno >= FIRST_VFP_REGNUM + 32; || regno >= FIRST_VFP_REGNUM + 32;
} }
} }
}
if (TARGET_REALLY_IWMMXT) if (TARGET_REALLY_IWMMXT)
{ {
......
...@@ -139,8 +139,6 @@ extern char arm_arch_name[]; ...@@ -139,8 +139,6 @@ extern char arm_arch_name[];
builtin_assert ("machine=arm"); \ builtin_assert ("machine=arm"); \
\ \
builtin_define (arm_arch_name); \ builtin_define (arm_arch_name); \
if (arm_arch_cirrus) \
builtin_define ("__MAVERICK__"); \
if (arm_arch_xscale) \ if (arm_arch_xscale) \
builtin_define ("__XSCALE__"); \ builtin_define ("__XSCALE__"); \
if (arm_arch_iwmmxt) \ if (arm_arch_iwmmxt) \
...@@ -243,8 +241,6 @@ extern void (*arm_lang_output_object_attributes_hook)(void); ...@@ -243,8 +241,6 @@ extern void (*arm_lang_output_object_attributes_hook)(void);
#define TARGET_HARD_FLOAT (arm_float_abi != ARM_FLOAT_ABI_SOFT) #define TARGET_HARD_FLOAT (arm_float_abi != ARM_FLOAT_ABI_SOFT)
/* Use hardware floating point calling convention. */ /* Use hardware floating point calling convention. */
#define TARGET_HARD_FLOAT_ABI (arm_float_abi == ARM_FLOAT_ABI_HARD) #define TARGET_HARD_FLOAT_ABI (arm_float_abi == ARM_FLOAT_ABI_HARD)
#define TARGET_FPA (arm_fpu_desc->model == ARM_FP_MODEL_FPA)
#define TARGET_MAVERICK (arm_fpu_desc->model == ARM_FP_MODEL_MAVERICK)
#define TARGET_VFP (arm_fpu_desc->model == ARM_FP_MODEL_VFP) #define TARGET_VFP (arm_fpu_desc->model == ARM_FP_MODEL_VFP)
#define TARGET_IWMMXT (arm_arch_iwmmxt) #define TARGET_IWMMXT (arm_arch_iwmmxt)
#define TARGET_IWMMXT2 (arm_arch_iwmmxt2) #define TARGET_IWMMXT2 (arm_arch_iwmmxt2)
...@@ -272,8 +268,6 @@ extern void (*arm_lang_output_object_attributes_hook)(void); ...@@ -272,8 +268,6 @@ extern void (*arm_lang_output_object_attributes_hook)(void);
#define TARGET_THUMB2 (TARGET_THUMB && arm_arch_thumb2) #define TARGET_THUMB2 (TARGET_THUMB && arm_arch_thumb2)
/* Thumb-1 only. */ /* Thumb-1 only. */
#define TARGET_THUMB1_ONLY (TARGET_THUMB1 && !arm_arch_notm) #define TARGET_THUMB1_ONLY (TARGET_THUMB1 && !arm_arch_notm)
/* FPA emulator without LFM. */
#define TARGET_FPA_EMU2 (TARGET_FPA && arm_fpu_desc->rev == 2)
/* The following two macros concern the ability to execute coprocessor /* The following two macros concern the ability to execute coprocessor
instructions for VFPv3 or NEON. TARGET_VFP3/TARGET_VFPD32 are currently instructions for VFPv3 or NEON. TARGET_VFP3/TARGET_VFPD32 are currently
...@@ -386,10 +380,6 @@ extern void (*arm_lang_output_object_attributes_hook)(void); ...@@ -386,10 +380,6 @@ extern void (*arm_lang_output_object_attributes_hook)(void);
enum arm_fp_model enum arm_fp_model
{ {
ARM_FP_MODEL_UNKNOWN, ARM_FP_MODEL_UNKNOWN,
/* FPA model (Hardware or software). */
ARM_FP_MODEL_FPA,
/* Cirrus Maverick floating point model. */
ARM_FP_MODEL_MAVERICK,
/* VFP floating point model. */ /* VFP floating point model. */
ARM_FP_MODEL_VFP ARM_FP_MODEL_VFP
}; };
...@@ -501,9 +491,6 @@ extern int thumb1_code; ...@@ -501,9 +491,6 @@ extern int thumb1_code;
/* Nonzero if this chip is a StrongARM. */ /* Nonzero if this chip is a StrongARM. */
extern int arm_tune_strongarm; extern int arm_tune_strongarm;
/* Nonzero if this chip is a Cirrus variant. */
extern int arm_arch_cirrus;
/* Nonzero if this chip supports Intel XScale with Wireless MMX technology. */ /* Nonzero if this chip supports Intel XScale with Wireless MMX technology. */
extern int arm_arch_iwmmxt; extern int arm_arch_iwmmxt;
...@@ -604,11 +591,6 @@ extern int arm_arch_thumb_hwdiv; ...@@ -604,11 +591,6 @@ extern int arm_arch_thumb_hwdiv;
This is always false, even when in big-endian mode. */ This is always false, even when in big-endian mode. */
#define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN && ! TARGET_LITTLE_WORDS) #define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN && ! TARGET_LITTLE_WORDS)
/* Define this if most significant word of doubles is the lowest numbered.
The rules are different based on whether or not we use FPA-format,
VFP-format or some other floating point co-processor's format doubles. */
#define FLOAT_WORDS_BIG_ENDIAN (arm_float_words_big_endian ())
#define UNITS_PER_WORD 4 #define UNITS_PER_WORD 4
/* True if natural alignment is used for doubleword types. */ /* True if natural alignment is used for doubleword types. */
...@@ -727,7 +709,7 @@ extern int arm_arch_thumb_hwdiv; ...@@ -727,7 +709,7 @@ extern int arm_arch_thumb_hwdiv;
/* Standard register usage. */ /* Standard register usage. */
/* Register allocation in ARM Procedure Call Standard (as used on RISCiX): /* Register allocation in ARM Procedure Call Standard
(S - saved over call). (S - saved over call).
r0 * argument word/integer result r0 * argument word/integer result
...@@ -743,11 +725,6 @@ extern int arm_arch_thumb_hwdiv; ...@@ -743,11 +725,6 @@ extern int arm_arch_thumb_hwdiv;
r14 (lr) link address/workspace r14 (lr) link address/workspace
r15 F (pc) program counter r15 F (pc) program counter
f0 floating point result
f1-f3 floating point scratch
f4-f7 S floating point variable
cc This is NOT a real register, but is used internally cc This is NOT a real register, but is used internally
to represent things that use or set the condition to represent things that use or set the condition
codes. codes.
...@@ -761,11 +738,6 @@ extern int arm_arch_thumb_hwdiv; ...@@ -761,11 +738,6 @@ extern int arm_arch_thumb_hwdiv;
*: See TARGET_CONDITIONAL_REGISTER_USAGE */ *: See TARGET_CONDITIONAL_REGISTER_USAGE */
/*
mvf0 Cirrus floating point result
mvf1-mvf3 Cirrus floating point scratch
mvf4-mvf15 S Cirrus floating point variable. */
/* s0-s15 VFP scratch (aka d0-d7). /* s0-s15 VFP scratch (aka d0-d7).
s16-s31 S VFP variable (aka d8-d15). s16-s31 S VFP variable (aka d8-d15).
vfpcc Not a real register. Represents the VFP condition vfpcc Not a real register. Represents the VFP condition
...@@ -787,34 +759,30 @@ extern int arm_arch_thumb_hwdiv; ...@@ -787,34 +759,30 @@ extern int arm_arch_thumb_hwdiv;
[| saved r2 value |] [| saved r2 value |]
[| saved r1 value |] [| saved r1 value |]
[| saved r0 value |] [| saved r0 value |]
[| saved f7 value |] three words
[| saved f6 value |] three words
[| saved f5 value |] three words
[| saved f4 value |] three words
r0-r3 are not normally saved in a C function. */ r0-r3 are not normally saved in a C function. */
/* 1 for registers that have pervasive standard uses /* 1 for registers that have pervasive standard uses
and are not available for the register allocator. */ and are not available for the register allocator. */
#define FIXED_REGISTERS \ #define FIXED_REGISTERS \
{ \ { \
/* Core regs. */ \
0,0,0,0,0,0,0,0, \ 0,0,0,0,0,0,0,0, \
0,0,0,0,0,1,0,1, \ 0,0,0,0,0,1,0,1, \
0,0,0,0,0,0,0,0, \ /* VFP regs. */ \
1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1, \
1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
/* IWMMXT regs. */ \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1 \ 1,1,1,1, \
/* Specials. */ \
1,1,1,1 \
} }
/* 1 for registers not available across function calls. /* 1 for registers not available across function calls.
...@@ -827,24 +795,24 @@ extern int arm_arch_thumb_hwdiv; ...@@ -827,24 +795,24 @@ extern int arm_arch_thumb_hwdiv;
easier to assume this for all. SFP is preserved, since FP is. */ easier to assume this for all. SFP is preserved, since FP is. */
#define CALL_USED_REGISTERS \ #define CALL_USED_REGISTERS \
{ \ { \
/* Core regs. */ \
1,1,1,1,0,0,0,0, \ 1,1,1,1,0,0,0,0, \
0,0,0,0,1,1,1,1, \ 0,0,0,0,1,1,1,1, \
1,1,1,1,0,0,0,0, \ /* VFP Regs. */ \
1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
/* IWMMXT regs. */ \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1,1,1,1,1, \
1,1,1,1,1,1,1,1, \ 1,1,1,1, \
1,1,1,1,1,1,1,1, \ /* Specials. */ \
1 \ 1,1,1,1 \
} }
#ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE #ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE
...@@ -961,34 +929,24 @@ extern int arm_arch_thumb_hwdiv; ...@@ -961,34 +929,24 @@ extern int arm_arch_thumb_hwdiv;
/* Register to use for pushing function arguments. */ /* Register to use for pushing function arguments. */
#define STACK_POINTER_REGNUM SP_REGNUM #define STACK_POINTER_REGNUM SP_REGNUM
/* ARM floating pointer registers. */ #define FIRST_IWMMXT_REGNUM (LAST_HI_VFP_REGNUM + 1)
#define FIRST_FPA_REGNUM 16 #define LAST_IWMMXT_REGNUM (FIRST_IWMMXT_REGNUM + 15)
#define LAST_FPA_REGNUM 23 #define FIRST_IWMMXT_GR_REGNUM (LAST_IWMMXT_REGNUM + 1)
#define IS_FPA_REGNUM(REGNUM) \ #define LAST_IWMMXT_GR_REGNUM (FIRST_IWMMXT_GR_REGNUM + 3)
(((REGNUM) >= FIRST_FPA_REGNUM) && ((REGNUM) <= LAST_FPA_REGNUM))
#define FIRST_IWMMXT_GR_REGNUM 43
#define LAST_IWMMXT_GR_REGNUM 46
#define FIRST_IWMMXT_REGNUM 47
#define LAST_IWMMXT_REGNUM 62
#define IS_IWMMXT_REGNUM(REGNUM) \ #define IS_IWMMXT_REGNUM(REGNUM) \
(((REGNUM) >= FIRST_IWMMXT_REGNUM) && ((REGNUM) <= LAST_IWMMXT_REGNUM)) (((REGNUM) >= FIRST_IWMMXT_REGNUM) && ((REGNUM) <= LAST_IWMMXT_REGNUM))
#define IS_IWMMXT_GR_REGNUM(REGNUM) \ #define IS_IWMMXT_GR_REGNUM(REGNUM) \
(((REGNUM) >= FIRST_IWMMXT_GR_REGNUM) && ((REGNUM) <= LAST_IWMMXT_GR_REGNUM)) (((REGNUM) >= FIRST_IWMMXT_GR_REGNUM) && ((REGNUM) <= LAST_IWMMXT_GR_REGNUM))
/* Base register for access to local variables of the function. */ /* Base register for access to local variables of the function. */
#define FRAME_POINTER_REGNUM 25 #define FRAME_POINTER_REGNUM 102
/* Base register for access to arguments of the function. */ /* Base register for access to arguments of the function. */
#define ARG_POINTER_REGNUM 26 #define ARG_POINTER_REGNUM 103
#define FIRST_CIRRUS_FP_REGNUM 27 #define FIRST_VFP_REGNUM 16
#define LAST_CIRRUS_FP_REGNUM 42 #define D7_VFP_REGNUM (FIRST_VFP_REGNUM + 15)
#define IS_CIRRUS_REGNUM(REGNUM) \
(((REGNUM) >= FIRST_CIRRUS_FP_REGNUM) && ((REGNUM) <= LAST_CIRRUS_FP_REGNUM))
#define FIRST_VFP_REGNUM 63
#define D7_VFP_REGNUM 78 /* Registers 77 and 78 == VFP reg D7. */
#define LAST_VFP_REGNUM \ #define LAST_VFP_REGNUM \
(TARGET_VFPD32 ? LAST_HI_VFP_REGNUM : LAST_LO_VFP_REGNUM) (TARGET_VFPD32 ? LAST_HI_VFP_REGNUM : LAST_LO_VFP_REGNUM)
...@@ -1001,9 +959,9 @@ extern int arm_arch_thumb_hwdiv; ...@@ -1001,9 +959,9 @@ extern int arm_arch_thumb_hwdiv;
in various parts of the backend, we implement as "fake" single-precision in various parts of the backend, we implement as "fake" single-precision
registers (which would be S32-S63, but cannot be used in that way). The registers (which would be S32-S63, but cannot be used in that way). The
following macros define these ranges of registers. */ following macros define these ranges of registers. */
#define LAST_LO_VFP_REGNUM 94 #define LAST_LO_VFP_REGNUM (FIRST_VFP_REGNUM + 31)
#define FIRST_HI_VFP_REGNUM 95 #define FIRST_HI_VFP_REGNUM (LAST_LO_VFP_REGNUM + 1)
#define LAST_HI_VFP_REGNUM 126 #define LAST_HI_VFP_REGNUM (FIRST_HI_VFP_REGNUM + 31)
#define VFP_REGNO_OK_FOR_SINGLE(REGNUM) \ #define VFP_REGNO_OK_FOR_SINGLE(REGNUM) \
((REGNUM) <= LAST_LO_VFP_REGNUM) ((REGNUM) <= LAST_LO_VFP_REGNUM)
...@@ -1024,11 +982,10 @@ extern int arm_arch_thumb_hwdiv; ...@@ -1024,11 +982,10 @@ extern int arm_arch_thumb_hwdiv;
((((REGNUM) - FIRST_VFP_REGNUM) & 3) == 0 \ ((((REGNUM) - FIRST_VFP_REGNUM) & 3) == 0 \
&& (LAST_VFP_REGNUM - (REGNUM) >= 2 * (N) - 1)) && (LAST_VFP_REGNUM - (REGNUM) >= 2 * (N) - 1))
/* The number of hard registers is 16 ARM + 8 FPA + 1 CC + 1 SFP + 1 AFP. */ /* The number of hard registers is 16 ARM + 1 CC + 1 SFP + 1 AFP. */
/* + 16 Cirrus registers take us up to 43. */
/* Intel Wireless MMX Technology registers add 16 + 4 more. */ /* Intel Wireless MMX Technology registers add 16 + 4 more. */
/* VFP (VFP3) adds 32 (64) + 1 more. */ /* VFP (VFP3) adds 32 (64) + 1 VFPCC. */
#define FIRST_PSEUDO_REGISTER 128 #define FIRST_PSEUDO_REGISTER 104
#define DBX_REGISTER_NUMBER(REGNO) arm_dbx_register_number (REGNO) #define DBX_REGISTER_NUMBER(REGNO) arm_dbx_register_number (REGNO)
...@@ -1048,11 +1005,10 @@ extern int arm_arch_thumb_hwdiv; ...@@ -1048,11 +1005,10 @@ extern int arm_arch_thumb_hwdiv;
This is ordinarily the length in words of a value of mode MODE This is ordinarily the length in words of a value of mode MODE
but can be less for certain modes in special long registers. but can be less for certain modes in special long registers.
On the ARM regs are UNITS_PER_WORD bits wide; FPA regs can hold any FP On the ARM core regs are UNITS_PER_WORD bits wide. */
mode. */
#define HARD_REGNO_NREGS(REGNO, MODE) \ #define HARD_REGNO_NREGS(REGNO, MODE) \
((TARGET_32BIT \ ((TARGET_32BIT \
&& REGNO >= FIRST_FPA_REGNUM \ && REGNO > PC_REGNUM \
&& REGNO != FRAME_POINTER_REGNUM \ && REGNO != FRAME_POINTER_REGNUM \
&& REGNO != ARG_POINTER_REGNUM) \ && REGNO != ARG_POINTER_REGNUM) \
&& !IS_VFP_REGNUM (REGNO) \ && !IS_VFP_REGNUM (REGNO) \
...@@ -1096,26 +1052,44 @@ extern int arm_regs_in_sequence[]; ...@@ -1096,26 +1052,44 @@ extern int arm_regs_in_sequence[];
pressure when both single- and double-precision registers are used in a pressure when both single- and double-precision registers are used in a
function. */ function. */
#define VREG(X) (FIRST_VFP_REGNUM + (X))
#define WREG(X) (FIRST_IWMMXT_REGNUM + (X))
#define WGREG(X) (FIRST_IWMMXT_GR_REGNUM + (X))
#define REG_ALLOC_ORDER \ #define REG_ALLOC_ORDER \
{ \ { \
/* General registers. */ \
3, 2, 1, 0, 12, 14, 4, 5, \ 3, 2, 1, 0, 12, 14, 4, 5, \
6, 7, 8, 10, 9, 11, 13, 15, \ 6, 7, 8, 9, 10, 11, \
16, 17, 18, 19, 20, 21, 22, 23, \ /* High VFP registers. */ \
27, 28, 29, 30, 31, 32, 33, 34, \ VREG(32), VREG(33), VREG(34), VREG(35), \
35, 36, 37, 38, 39, 40, 41, 42, \ VREG(36), VREG(37), VREG(38), VREG(39), \
43, 44, 45, 46, 47, 48, 49, 50, \ VREG(40), VREG(41), VREG(42), VREG(43), \
51, 52, 53, 54, 55, 56, 57, 58, \ VREG(44), VREG(45), VREG(46), VREG(47), \
59, 60, 61, 62, \ VREG(48), VREG(49), VREG(50), VREG(51), \
24, 25, 26, \ VREG(52), VREG(53), VREG(54), VREG(55), \
95, 96, 97, 98, 99, 100, 101, 102, \ VREG(56), VREG(57), VREG(58), VREG(59), \
103, 104, 105, 106, 107, 108, 109, 110, \ VREG(60), VREG(61), VREG(62), VREG(63), \
111, 112, 113, 114, 115, 116, 117, 118, \ /* VFP argument registers. */ \
119, 120, 121, 122, 123, 124, 125, 126, \ VREG(15), VREG(14), VREG(13), VREG(12), \
78, 77, 76, 75, 74, 73, 72, 71, \ VREG(11), VREG(10), VREG(9), VREG(8), \
70, 69, 68, 67, 66, 65, 64, 63, \ VREG(7), VREG(6), VREG(5), VREG(4), \
79, 80, 81, 82, 83, 84, 85, 86, \ VREG(3), VREG(2), VREG(1), VREG(0), \
87, 88, 89, 90, 91, 92, 93, 94, \ /* VFP call-saved registers. */ \
127 \ VREG(16), VREG(17), VREG(18), VREG(19), \
VREG(20), VREG(21), VREG(22), VREG(23), \
VREG(24), VREG(25), VREG(26), VREG(27), \
VREG(28), VREG(29), VREG(30), VREG(31), \
/* IWMMX registers. */ \
WREG(0), WREG(1), WREG(2), WREG(3), \
WREG(4), WREG(5), WREG(6), WREG(7), \
WREG(8), WREG(9), WREG(10), WREG(11), \
WREG(12), WREG(13), WREG(14), WREG(15), \
WGREG(0), WGREG(1), WGREG(2), WGREG(3), \
/* Registers not for general use. */ \
CC_REGNUM, VFPCC_REGNUM, \
FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, \
SP_REGNUM, PC_REGNUM \
} }
/* Use different register alloc ordering for Thumb. */ /* Use different register alloc ordering for Thumb. */
...@@ -1134,27 +1108,26 @@ extern int arm_regs_in_sequence[]; ...@@ -1134,27 +1108,26 @@ extern int arm_regs_in_sequence[];
/* Register and constant classes. */ /* Register and constant classes. */
/* Register classes: used to be simple, just all ARM regs or all FPA regs /* Register classes. */
Now that the Thumb is involved it has become more complicated. */
enum reg_class enum reg_class
{ {
NO_REGS, NO_REGS,
FPA_REGS, LO_REGS,
CIRRUS_REGS, STACK_REG,
BASE_REGS,
HI_REGS,
GENERAL_REGS,
CORE_REGS,
VFP_D0_D7_REGS, VFP_D0_D7_REGS,
VFP_LO_REGS, VFP_LO_REGS,
VFP_HI_REGS, VFP_HI_REGS,
VFP_REGS, VFP_REGS,
IWMMXT_GR_REGS,
IWMMXT_REGS, IWMMXT_REGS,
LO_REGS, IWMMXT_GR_REGS,
STACK_REG,
BASE_REGS,
HI_REGS,
CC_REG, CC_REG,
VFPCC_REG, VFPCC_REG,
GENERAL_REGS, SFP_REG,
CORE_REGS, AFP_REG,
ALL_REGS, ALL_REGS,
LIM_REG_CLASSES LIM_REG_CLASSES
}; };
...@@ -1165,22 +1138,20 @@ enum reg_class ...@@ -1165,22 +1138,20 @@ enum reg_class
#define REG_CLASS_NAMES \ #define REG_CLASS_NAMES \
{ \ { \
"NO_REGS", \ "NO_REGS", \
"FPA_REGS", \ "LO_REGS", \
"CIRRUS_REGS", \ "STACK_REG", \
"BASE_REGS", \
"HI_REGS", \
"GENERAL_REGS", \
"CORE_REGS", \
"VFP_D0_D7_REGS", \ "VFP_D0_D7_REGS", \
"VFP_LO_REGS", \ "VFP_LO_REGS", \
"VFP_HI_REGS", \ "VFP_HI_REGS", \
"VFP_REGS", \ "VFP_REGS", \
"IWMMXT_GR_REGS", \
"IWMMXT_REGS", \ "IWMMXT_REGS", \
"LO_REGS", \ "IWMMXT_GR_REGS", \
"STACK_REG", \
"BASE_REGS", \
"HI_REGS", \
"CC_REG", \ "CC_REG", \
"VFPCC_REG", \ "VFPCC_REG", \
"GENERAL_REGS", \
"CORE_REGS", \
"ALL_REGS", \ "ALL_REGS", \
} }
...@@ -1190,23 +1161,23 @@ enum reg_class ...@@ -1190,23 +1161,23 @@ enum reg_class
#define REG_CLASS_CONTENTS \ #define REG_CLASS_CONTENTS \
{ \ { \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \
{ 0x00FF0000, 0x00000000, 0x00000000, 0x00000000 }, /* FPA_REGS */ \
{ 0xF8000000, 0x000007FF, 0x00000000, 0x00000000 }, /* CIRRUS_REGS */ \
{ 0x00000000, 0x80000000, 0x00007FFF, 0x00000000 }, /* VFP_D0_D7_REGS */ \
{ 0x00000000, 0x80000000, 0x7FFFFFFF, 0x00000000 }, /* VFP_LO_REGS */ \
{ 0x00000000, 0x00000000, 0x80000000, 0x7FFFFFFF }, /* VFP_HI_REGS */ \
{ 0x00000000, 0x80000000, 0xFFFFFFFF, 0x7FFFFFFF }, /* VFP_REGS */ \
{ 0x00000000, 0x00007800, 0x00000000, 0x00000000 }, /* IWMMXT_GR_REGS */ \
{ 0x00000000, 0x7FFF8000, 0x00000000, 0x00000000 }, /* IWMMXT_REGS */ \
{ 0x000000FF, 0x00000000, 0x00000000, 0x00000000 }, /* LO_REGS */ \ { 0x000000FF, 0x00000000, 0x00000000, 0x00000000 }, /* LO_REGS */ \
{ 0x00002000, 0x00000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \ { 0x00002000, 0x00000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \
{ 0x000020FF, 0x00000000, 0x00000000, 0x00000000 }, /* BASE_REGS */ \ { 0x000020FF, 0x00000000, 0x00000000, 0x00000000 }, /* BASE_REGS */ \
{ 0x0000DF00, 0x00000000, 0x00000000, 0x00000000 }, /* HI_REGS */ \ { 0x00005F00, 0x00000000, 0x00000000, 0x00000000 }, /* HI_REGS */ \
{ 0x01000000, 0x00000000, 0x00000000, 0x00000000 }, /* CC_REG */ \ { 0x00005FFF, 0x00000000, 0x00000000, 0x00000000 }, /* GENERAL_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x80000000 }, /* VFPCC_REG */ \ { 0x00007FFF, 0x00000000, 0x00000000, 0x00000000 }, /* CORE_REGS */ \
{ 0x0000DFFF, 0x00000000, 0x00000000, 0x00000000 }, /* GENERAL_REGS */ \ { 0xFFFF0000, 0x00000000, 0x00000000, 0x00000000 }, /* VFP_D0_D7_REGS */ \
{ 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000 }, /* CORE_REGS */ \ { 0xFFFF0000, 0x0000FFFF, 0x00000000, 0x00000000 }, /* VFP_LO_REGS */ \
{ 0xFAFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF } /* ALL_REGS */ \ { 0x00000000, 0xFFFF0000, 0x0000FFFF, 0x00000000 }, /* VFP_HI_REGS */ \
{ 0xFFFF0000, 0xFFFFFFFF, 0x0000FFFF, 0x00000000 }, /* VFP_REGS */ \
{ 0x00000000, 0x00000000, 0xFFFF0000, 0x00000000 }, /* IWMMXT_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x0000000F }, /* IWMMXT_GR_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000010 }, /* CC_REG */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000020 }, /* VFPCC_REG */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000040 }, /* SFP_REG */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000080 }, /* AFP_REG */ \
{ 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 } /* ALL_REGS */ \
} }
/* Any of the VFP register classes. */ /* Any of the VFP register classes. */
...@@ -1220,14 +1191,11 @@ enum reg_class ...@@ -1220,14 +1191,11 @@ enum reg_class
or could index an array. */ or could index an array. */
#define REGNO_REG_CLASS(REGNO) arm_regno_class (REGNO) #define REGNO_REG_CLASS(REGNO) arm_regno_class (REGNO)
/* FPA registers can't do subreg as all values are reformatted to internal /* In VFPv1, VFP registers could only be accessed in the mode they
precision. In VFPv1, VFP registers could only be accessed in the mode were set, so subregs would be invalid there. However, we don't
they were set, so subregs would be invalid there too. However, we don't support VFPv1 at the moment, and the restriction was lifted in
support VFPv1 at the moment, and the restriction was lifted in VFPv2. */ VFPv2. */
#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) 0
(GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
? reg_classes_intersect_p (FPA_REGS, (CLASS)) \
: 0)
/* The class value for index registers, and the one for base regs. */ /* The class value for index registers, and the one for base regs. */
#define INDEX_REG_CLASS (TARGET_THUMB1 ? LO_REGS : GENERAL_REGS) #define INDEX_REG_CLASS (TARGET_THUMB1 ? LO_REGS : GENERAL_REGS)
...@@ -1289,11 +1257,6 @@ enum reg_class ...@@ -1289,11 +1257,6 @@ enum reg_class
? coproc_secondary_reload_class (MODE, X, FALSE) : \ ? coproc_secondary_reload_class (MODE, X, FALSE) : \
(TARGET_IWMMXT && (CLASS) == IWMMXT_REGS) ? \ (TARGET_IWMMXT && (CLASS) == IWMMXT_REGS) ? \
coproc_secondary_reload_class (MODE, X, TRUE) : \ coproc_secondary_reload_class (MODE, X, TRUE) : \
/* Cannot load constants into Cirrus registers. */ \
(TARGET_MAVERICK && TARGET_HARD_FLOAT \
&& (CLASS) == CIRRUS_REGS \
&& (CONSTANT_P (X) || GET_CODE (X) == SYMBOL_REF)) \
? GENERAL_REGS : \
(TARGET_32BIT ? \ (TARGET_32BIT ? \
(((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS) \ (((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS) \
&& CONSTANT_P (X)) \ && CONSTANT_P (X)) \
...@@ -1347,9 +1310,10 @@ do { \ ...@@ -1347,9 +1310,10 @@ do { \
/* Return the maximum number of consecutive registers /* Return the maximum number of consecutive registers
needed to represent mode MODE in a register of class CLASS. needed to represent mode MODE in a register of class CLASS.
ARM regs are UNITS_PER_WORD bits while FPA regs can hold any FP mode */ ARM regs are UNITS_PER_WORD bits.
FIXME: Is this true for iWMMX? */
#define CLASS_MAX_NREGS(CLASS, MODE) \ #define CLASS_MAX_NREGS(CLASS, MODE) \
(((CLASS) == FPA_REGS || (CLASS) == CIRRUS_REGS) ? 1 : ARM_NUM_REGS (MODE)) (ARM_NUM_REGS (MODE))
/* If defined, gives a class of registers that cannot be used as the /* If defined, gives a class of registers that cannot be used as the
operand of a SUBREG that changes the mode of the object illegally. */ operand of a SUBREG that changes the mode of the object illegally. */
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
;;--------------------------------------------------------------------------- ;;---------------------------------------------------------------------------
;; Constants ;; Constants
;; Register numbers ;; Register numbers -- All machine registers should be defined here
(define_constants (define_constants
[(R0_REGNUM 0) ; First CORE register [(R0_REGNUM 0) ; First CORE register
(R1_REGNUM 1) ; Second CORE register (R1_REGNUM 1) ; Second CORE register
...@@ -36,10 +36,9 @@ ...@@ -36,10 +36,9 @@
(SP_REGNUM 13) ; Stack pointer (SP_REGNUM 13) ; Stack pointer
(LR_REGNUM 14) ; Return address register (LR_REGNUM 14) ; Return address register
(PC_REGNUM 15) ; Program counter (PC_REGNUM 15) ; Program counter
(CC_REGNUM 24) ; Condition code pseudo register
(LAST_ARM_REGNUM 15) ; (LAST_ARM_REGNUM 15) ;
(FPA_F0_REGNUM 16) ; FIRST_FPA_REGNUM (CC_REGNUM 100) ; Condition code pseudo register
(FPA_F7_REGNUM 23) ; LAST_FPA_REGNUM (VFPCC_REGNUM 101) ; VFP Condition code pseudo register
] ]
) )
;; 3rd operand to select_dominance_cc_mode ;; 3rd operand to select_dominance_cc_mode
...@@ -178,7 +177,7 @@ ...@@ -178,7 +177,7 @@
; Floating Point Unit. If we only have floating point emulation, then there ; Floating Point Unit. If we only have floating point emulation, then there
; is no point in scheduling the floating point insns. (Well, for best ; is no point in scheduling the floating point insns. (Well, for best
; performance we should try and group them together). ; performance we should try and group them together).
(define_attr "fpu" "none,fpa,fpe2,fpe3,maverick,vfp" (define_attr "fpu" "none,vfp"
(const (symbol_ref "arm_fpu_attr"))) (const (symbol_ref "arm_fpu_attr")))
; LENGTH of an instruction (in bytes) ; LENGTH of an instruction (in bytes)
......
...@@ -92,9 +92,8 @@ ...@@ -92,9 +92,8 @@
} \ } \
while (0) while (0)
/* NWFPE always understands FPA instructions. */
#undef FPUTYPE_DEFAULT #undef FPUTYPE_DEFAULT
#define FPUTYPE_DEFAULT "fpe3" #define FPUTYPE_DEFAULT "vfp"
/* Call the function profiler with a given profile label. */ /* Call the function profiler with a given profile label. */
#undef ARM_FUNCTION_PROFILER #undef ARM_FUNCTION_PROFILER
......
...@@ -19,11 +19,6 @@ ...@@ -19,11 +19,6 @@
;; along with GCC; see the file COPYING3. If not see ;; along with GCC; see the file COPYING3. If not see
;; <http://www.gnu.org/licenses/>. */ ;; <http://www.gnu.org/licenses/>. */
;; Additional register numbers
(define_constants
[(VFPCC_REGNUM 127)]
)
;; The VFP "type" attributes differ from those used in the FPA model. ;; The VFP "type" attributes differ from those used in the FPA model.
;; fcpys Single precision cpy. ;; fcpys Single precision cpy.
;; ffariths Single precision abs, neg. ;; ffariths Single precision abs, neg.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment