PowerPC64 little-endian fixes: 32-bit DFP parameters
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 4 Feb 2014 17:33:04 +0000 (18:33 +0100)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 4 Feb 2014 17:36:47 +0000 (18:36 +0100)
Passing a 32-bit DFP in register needs to use the least-significant part
of the register.  Like with a previous patch that addressed the same
issue for small structs, this patch makes sure the appropriate offset
is used on little-endian systems.

gdb/ChangeLog:

* ppc-sysv-tdep.c (ppc64_sysv_abi_push_freg): Use correct
offset on little-endian when passing _Decimal32.
(ppc64_sysv_abi_return_value_base): Likewise for return values.

gdb/ChangeLog
gdb/ppc-sysv-tdep.c

index 169b027791a488f9aba2e9e9ccbe4e06a50fb93c..e4a913bff7c632d4c703473104cd9d390a5b5010 100644 (file)
@@ -1,3 +1,9 @@
+2014-02-04  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * ppc-sysv-tdep.c (ppc64_sysv_abi_push_freg): Use correct
+       offset on little-endian when passing _Decimal32.
+       (ppc64_sysv_abi_return_value_base): Likewise for return values.
+
 2014-02-04  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * rs6000-tdep.c (efpr_pseudo_register_read): Use correct offset
index 62e9cbdaccb75b5c72d08e6feb2e339ea5803187..de5a6631d1d2afffde49f4dd7d7937b90a4d0491 100644 (file)
@@ -1232,7 +1232,10 @@ ppc64_sysv_abi_push_freg (struct gdbarch *gdbarch,
       if (argpos->regcache && argpos->freg <= 13)
        {
          int regnum = tdep->ppc_fp0_regnum + argpos->freg;
-         int offset = 8 - TYPE_LENGTH (type);
+         int offset = 0;
+
+         if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
+           offset = 8 - TYPE_LENGTH (type);
 
          regcache_cooked_write_part (argpos->regcache, regnum,
                                      offset, TYPE_LENGTH (type), val);
@@ -1641,7 +1644,10 @@ ppc64_sysv_abi_return_value_base (struct gdbarch *gdbarch, struct type *valtype,
       && TYPE_CODE (valtype) == TYPE_CODE_DECFLOAT)
     {
       int regnum = tdep->ppc_fp0_regnum + 1 + index;
-      int offset = 8 - TYPE_LENGTH (valtype);
+      int offset = 0;
+
+      if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
+       offset = 8 - TYPE_LENGTH (valtype);
 
       if (writebuf != NULL)
        regcache_cooked_write_part (regcache, regnum,