]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* config/arm/arm.c (arm_dwarf_register_span): Take into account the
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Nov 2013 13:58:12 +0000 (13:58 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Nov 2013 13:58:12 +0000 (13:58 +0000)
endianness of the D registers for the legacy encodings.

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

gcc/ChangeLog
gcc/config/arm/arm.c

index 1064cfe0601b270f652cd27aa4ba250c5af87b0d..02b9cf54b45f1e8e68bf07b1fb13c1773900769f 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-20  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/arm/arm.c (arm_dwarf_register_span): Take into account the
+       endianness of the D registers for the legacy encodings.
+
 2013-11-20  Richard Earnshaw  <rearnsha@arm.com>
 
        PR rtl-optimization/54300
index e8b5f8376ec9c55975570cc1fc043bf82abc5185..0d68f018f4d9122a1e5b56ab5e26470a70c80af3 100644 (file)
@@ -27992,10 +27992,11 @@ arm_dbx_register_number (unsigned int regno)
 static rtx
 arm_dwarf_register_span (rtx rtl)
 {
+  enum machine_mode mode;
   unsigned regno;
+  rtx parts[8];
   int nregs;
   int i;
-  rtx p;
 
   regno = REGNO (rtl);
   if (!IS_VFP_REGNUM (regno))
@@ -28008,15 +28009,33 @@ arm_dwarf_register_span (rtx rtl)
      corresponding D register.  Until GDB supports this, we shall use the
      legacy encodings.  We also use these encodings for D0-D15 for
      compatibility with older debuggers.  */
-  if (VFP_REGNO_OK_FOR_SINGLE (regno))
+  mode = GET_MODE (rtl);
+  if (GET_MODE_SIZE (mode) < 8)
     return NULL_RTX;
 
-  nregs = GET_MODE_SIZE (GET_MODE (rtl)) / 8;
-  p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs));
-  for (i = 0; i < nregs; i++)
-    XVECEXP (p, 0, i) = gen_rtx_REG (DImode, regno + i);
+  if (VFP_REGNO_OK_FOR_SINGLE (regno))
+    {
+      nregs = GET_MODE_SIZE (mode) / 4;
+      for (i = 0; i < nregs; i += 2)
+       if (TARGET_BIG_END)
+         {
+           parts[i] = gen_rtx_REG (SImode, regno + i + 1);
+           parts[i + 1] = gen_rtx_REG (SImode, regno + i);
+         }
+       else
+         {
+           parts[i] = gen_rtx_REG (SImode, regno + i);
+           parts[i + 1] = gen_rtx_REG (SImode, regno + i + 1);
+         }
+    }
+  else
+    {
+      nregs = GET_MODE_SIZE (mode) / 8;
+      for (i = 0; i < nregs; i++)
+       parts[i] = gen_rtx_REG (DImode, regno + i);
+    }
 
-  return p;
+  return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nregs , parts));
 }
 
 #if ARM_UNWIND_INFO