OSDN Git Service

[SH] double precision floating point dwarf fix
authorchrbr <chrbr@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Apr 2009 13:21:56 +0000 (13:21 +0000)
committerchrbr <chrbr@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Apr 2009 13:21:56 +0000 (13:21 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145448 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh-protos.h
gcc/config/sh/sh.c

index 3081e26..7664e11 100644 (file)
@@ -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
index 5b97196..afc4c94 100644 (file)
@@ -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 *);
index c8f4c85..603ddec 100644 (file)
@@ -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)
 {