diff options
author | Jakub Jelinek <jakub@redhat.com> | 2000-01-03 09:53:13 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2000-01-03 09:53:13 +0100 |
commit | 7b1ac7981e49e0a3cf91f07b12cba6863cd6e01d (patch) | |
tree | d5794ba8a174476619e791a75af73622dce6e28e /gcc | |
parent | 3fda1f48b59d02c63ffba289a00042549243f592 (diff) | |
download | gcc-7b1ac7981e49e0a3cf91f07b12cba6863cd6e01d.zip gcc-7b1ac7981e49e0a3cf91f07b12cba6863cd6e01d.tar.gz gcc-7b1ac7981e49e0a3cf91f07b12cba6863cd6e01d.tar.bz2 |
sparc.c (gen_df_reg): New function.
* config/sparc/sparc.c (gen_df_reg): New function.
* config/sparc/sparc-protos.h (gen_df_reg): Add prototype.
* config/sparc/sparc.md (movtf_no_e_insn_sp64+1,
movtf_no_e_insn_sp64+2, movtf_no_e_insn_sp64+3, movtf_cc_sp64+1,
movtf_cc_reg_sp64+1): Use it.
From-SVN: r31177
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/sparc/sparc-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 16 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.md | 64 |
4 files changed, 46 insertions, 43 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d223f01..0b55ce0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2000-01-03 Jakub Jelinek <jakub@redhat.com> + + * config/sparc/sparc.c (gen_df_reg): New function. + * config/sparc/sparc-protos.h (gen_df_reg): Add prototype. + * config/sparc/sparc.md (movtf_no_e_insn_sp64+1, + movtf_no_e_insn_sp64+2, movtf_no_e_insn_sp64+3, movtf_cc_sp64+1, + movtf_cc_reg_sp64+1): Use it. + 2000-01-02 Mark Mitchell <mark@codesourcery.com> * integrate.c (copy_decl_for_inlining): Clear TREE_ADDRESSABLE on diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h index 8c5b1b1..1e78a73 100644 --- a/gcc/config/sparc/sparc-protos.h +++ b/gcc/config/sparc/sparc-protos.h @@ -162,6 +162,7 @@ extern int eq_or_neq PARAMS ((rtx, enum machine_mode)); extern int normal_comp_operator PARAMS ((rtx, enum machine_mode)); extern int uns_arith_operand PARAMS ((rtx, enum machine_mode)); extern int clobbered_register PARAMS ((rtx, enum machine_mode)); +extern rtx gen_df_reg PARAMS ((rtx, int)); #endif /* RTX_CODE */ #endif /* __SPARC_PROTOS_H__ */ diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 5af17e2..cc24f28 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -2264,6 +2264,22 @@ emit_v9_brxx_insn (code, op0, label) gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx))); } + +/* Generate a DFmode part of a hard TFmode register. + REG is the TFmode hard register, LOW is 1 for the + low 64bit of the register and 0 otherwise. + */ +rtx +gen_df_reg (reg, low) + rtx reg; + int low; +{ + int regno = REGNO (reg); + + if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0)) + regno += (regno < 32) ? 1 : 2; + return gen_rtx_REG (DFmode, regno); +} /* Return nonzero if a return peephole merging return with setting of output register is ok. */ diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index f09d083..4c6a541 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -3643,14 +3643,10 @@ if (GET_CODE (set_src) == SUBREG) set_src = alter_subreg (set_src); - dest1 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 0 : 2)); - dest2 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 2 : 0)); - src1 = gen_rtx_REG (DFmode, - REGNO (set_src) + (WORDS_BIG_ENDIAN ? 0 : 2)); - src2 = gen_rtx_REG (DFmode, - REGNO (set_src) + (WORDS_BIG_ENDIAN ? 2 : 0)); + dest1 = gen_df_reg (set_dest, 0); + dest2 = gen_df_reg (set_dest, 1); + src1 = gen_df_reg (set_src, 0); + src2 = gen_df_reg (set_src, 1); /* Now emit using the real source and destination we found, swapping the order if we detect overlap. */ @@ -3684,10 +3680,8 @@ if (GET_CODE (set_dest) == SUBREG) set_dest = alter_subreg (set_dest); - dest1 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 0 : 2)); - dest2 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 2 : 0)); + dest1 = gen_df_reg (set_dest, 0); + dest2 = gen_df_reg (set_dest, 1); /* Now output, ordering such that we don't clobber any registers mentioned in the address. */ @@ -3716,18 +3710,14 @@ rtx word1 = change_address (operands[0], DFmode, NULL_RTX); rtx word2 = change_address (operands[0], DFmode, plus_constant_for_output (XEXP (word1, 0), 8)); - rtx set_src, src1, src2; + rtx set_src; set_src = operands[1]; if (GET_CODE (set_src) == SUBREG) set_src = alter_subreg (set_src); - src1 = gen_rtx_REG (DFmode, - REGNO (set_src) + (WORDS_BIG_ENDIAN ? 0 : 2)); - src2 = gen_rtx_REG (DFmode, - REGNO (set_src) + (WORDS_BIG_ENDIAN ? 2 : 0)); - emit_insn (gen_movdf (word1, src1)); - emit_insn (gen_movdf (word2, src2)); + emit_insn (gen_movdf (word1, gen_df_reg (set_src, 0))); + emit_insn (gen_movdf (word2, gen_df_reg (set_src, 1))); DONE; }") @@ -4095,18 +4085,12 @@ if (GET_CODE (set_srcb) == SUBREG) set_srcb = alter_subreg (set_srcb); - dest1 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 0 : 2)); - dest2 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 2 : 0)); - srca1 = gen_rtx_REG (DFmode, - REGNO (set_srca) + (WORDS_BIG_ENDIAN ? 0 : 2)); - srca2 = gen_rtx_REG (DFmode, - REGNO (set_srca) + (WORDS_BIG_ENDIAN ? 2 : 0)); - srcb1 = gen_rtx_REG (DFmode, - REGNO (set_srcb) + (WORDS_BIG_ENDIAN ? 0 : 2)); - srcb2 = gen_rtx_REG (DFmode, - REGNO (set_srcb) + (WORDS_BIG_ENDIAN ? 2 : 0)); + dest1 = gen_df_reg (set_dest, 0); + dest2 = gen_df_reg (set_dest, 1); + srca1 = gen_df_reg (set_srca, 0); + srca2 = gen_df_reg (set_srca, 1); + srcb1 = gen_df_reg (set_srcb, 0); + srcb2 = gen_df_reg (set_srcb, 1); /* Now emit using the real source and destination we found, swapping the order if we detect overlap. */ @@ -4274,18 +4258,12 @@ if (GET_CODE (set_srcb) == SUBREG) set_srcb = alter_subreg (set_srcb); - dest1 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 0 : 2)); - dest2 = gen_rtx_REG (DFmode, - REGNO (set_dest) + (WORDS_BIG_ENDIAN ? 2 : 0)); - srca1 = gen_rtx_REG (DFmode, - REGNO (set_srca) + (WORDS_BIG_ENDIAN ? 0 : 2)); - srca2 = gen_rtx_REG (DFmode, - REGNO (set_srca) + (WORDS_BIG_ENDIAN ? 2 : 0)); - srcb1 = gen_rtx_REG (DFmode, - REGNO (set_srcb) + (WORDS_BIG_ENDIAN ? 0 : 2)); - srcb2 = gen_rtx_REG (DFmode, - REGNO (set_srcb) + (WORDS_BIG_ENDIAN ? 2 : 0)); + dest1 = gen_df_reg (set_dest, 0); + dest2 = gen_df_reg (set_dest, 1); + srca1 = gen_df_reg (set_srca, 0); + srca2 = gen_df_reg (set_srca, 1); + srcb1 = gen_df_reg (set_srcb, 0); + srcb2 = gen_df_reg (set_srcb, 1); /* Now emit using the real source and destination we found, swapping the order if we detect overlap. */ |