aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChristian Bruel <christian.bruel@st.com>2009-04-02 15:21:56 +0200
committerChristian Bruel <chrbr@gcc.gnu.org>2009-04-02 15:21:56 +0200
commit63a9de54d8563bef63ea02d32f1d16a59e266e9a (patch)
treea5e07ae4d2722bdefe956efd4c4239a659ab163d /gcc
parent2f0fa28e1f7c64c4e0f352dfd97b02de06c6e94b (diff)
downloadgcc-63a9de54d8563bef63ea02d32f1d16a59e266e9a.zip
gcc-63a9de54d8563bef63ea02d32f1d16a59e266e9a.tar.gz
gcc-63a9de54d8563bef63ea02d32f1d16a59e266e9a.tar.bz2
[SH] double precision floating point dwarf fix
2009-04-02 Christian Bruel <christian.bruel@st.com> * config/sh/sh.c (sh_dwarf_register_span): New function. (TARGET_DWARF_REGISTER_SPAN): Define. * config/sh/sh-protos.h (sh_dwarf_register_span): Declare. From-SVN: r145448
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sh/sh-protos.h1
-rw-r--r--gcc/config/sh/sh.c23
3 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3081e26..7664e11 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-04-02 Christian Bruel <christian.bruel@st.com>
+
+ * config/sh/sh.c (sh_dwarf_register_span): New function.
+ (TARGET_DWARF_REGISTER_SPAN): Define.
+ * config/sh/sh-protos.h (sh_dwarf_register_span): Declare.
+
2009-04-02 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/39595
diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h
index 5b97196..afc4c94 100644
--- a/gcc/config/sh/sh-protos.h
+++ b/gcc/config/sh/sh-protos.h
@@ -160,6 +160,7 @@ extern void sh_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree,
extern int sh_pass_in_reg_p (CUMULATIVE_ARGS *, enum machine_mode, tree);
extern void sh_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, signed int, enum machine_mode);
extern bool sh_promote_prototypes (const_tree);
+extern rtx sh_dwarf_register_span (rtx);
extern rtx replace_n_hard_rtx (rtx, rtx *, int , int);
extern int shmedia_cleanup_truncate (rtx *, void *);
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index c8f4c85..603ddec 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -405,6 +405,9 @@ static int sh2a_function_vector_p (tree);
#undef TARGET_MACHINE_DEPENDENT_REORG
#define TARGET_MACHINE_DEPENDENT_REORG sh_reorg
+#undef TARGET_DWARF_REGISTER_SPAN
+#define TARGET_DWARF_REGISTER_SPAN sh_dwarf_register_span
+
#ifdef HAVE_AS_TLS
#undef TARGET_HAVE_TLS
#define TARGET_HAVE_TLS true
@@ -7426,6 +7429,26 @@ sh_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
return result;
}
+/* 64 bit floating points memory transfers are paired single precision loads
+ or store. So DWARF information needs fixing in little endian (unless
+ PR=SZ=1 in FPSCR). */
+rtx
+sh_dwarf_register_span (rtx reg)
+{
+ unsigned regno = REGNO (reg);
+
+ if (WORDS_BIG_ENDIAN || GET_MODE (reg) != DFmode)
+ return NULL_RTX;
+
+ return
+ gen_rtx_PARALLEL (VOIDmode,
+ gen_rtvec (2,
+ gen_rtx_REG (SFmode,
+ DBX_REGISTER_NUMBER (regno+1)),
+ gen_rtx_REG (SFmode,
+ DBX_REGISTER_NUMBER (regno))));
+}
+
bool
sh_promote_prototypes (const_tree type)
{