* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Handle passing

decimal floating-point values in GPRs for soft-float.
	(do_ppc_sysv_return_value): Handle returning decimal
	floating-point values in GPRs for soft-float.
This commit is contained in:
Joseph Myers
2008-06-26 15:38:39 +00:00
parent d50867903f
commit 00fbcec4ab
2 changed files with 38 additions and 19 deletions

View File

@ -1,3 +1,10 @@
2008-06-26 Joseph Myers <joseph@codesourcery.com>
* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Handle passing
decimal floating-point values in GPRs for soft-float.
(do_ppc_sysv_return_value): Handle returning decimal
floating-point values in GPRs for soft-float.
2008-06-26 Vladimir Prus <vladimir@codesourcery.com> 2008-06-26 Vladimir Prus <vladimir@codesourcery.com>
* target.c (target_read_until_error): New. * target.c (target_read_until_error): New.

View File

@ -177,13 +177,16 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
} }
else if (len == 8 else if (len == 8
&& (TYPE_CODE (type) == TYPE_CODE_INT /* long long */ && (TYPE_CODE (type) == TYPE_CODE_INT /* long long */
|| TYPE_CODE (type) == TYPE_CODE_FLT)) /* double */ || TYPE_CODE (type) == TYPE_CODE_FLT /* double */
|| (TYPE_CODE (type) == TYPE_CODE_DECFLOAT
&& tdep->soft_float)))
{ {
/* "long long" or soft-float "double" passed in an odd/even /* "long long" or soft-float "double" or "_Decimal64"
register pair with the low addressed word in the odd passed in an odd/even register pair with the low
register and the high addressed word in the even addressed word in the odd register and the high
register, or when the registers run out an 8 byte addressed word in the even register, or when the
aligned stack location. */ registers run out an 8 byte aligned stack
location. */
if (greg > 9) if (greg > 9)
{ {
/* Just in case GREG was 10. */ /* Just in case GREG was 10. */
@ -210,13 +213,16 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
greg += 2; greg += 2;
} }
} }
else if (len == 16 && TYPE_CODE (type) == TYPE_CODE_FLT else if (len == 16
&& (gdbarch_long_double_format (gdbarch) && ((TYPE_CODE (type) == TYPE_CODE_FLT
== floatformats_ibm_long_double)) && (gdbarch_long_double_format (gdbarch)
== floatformats_ibm_long_double))
|| (TYPE_CODE (type) == TYPE_CODE_DECFLOAT
&& tdep->soft_float)))
{ {
/* Soft-float IBM long double passed in four consecutive /* Soft-float IBM long double or _Decimal128 passed in
registers, or on the stack. The registers are not four consecutive registers, or on the stack. The
necessarily odd/even pairs. */ registers are not necessarily odd/even pairs. */
if (greg > 7) if (greg > 7)
{ {
greg = 11; greg = 11;
@ -596,11 +602,13 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *type,
} }
return RETURN_VALUE_REGISTER_CONVENTION; return RETURN_VALUE_REGISTER_CONVENTION;
} }
if (TYPE_CODE (type) == TYPE_CODE_FLT if (TYPE_LENGTH (type) == 16
&& TYPE_LENGTH (type) == 16 && ((TYPE_CODE (type) == TYPE_CODE_FLT
&& (gdbarch_long_double_format (gdbarch) == floatformats_ibm_long_double)) && (gdbarch_long_double_format (gdbarch) == floatformats_ibm_long_double))
|| (TYPE_CODE (type) == TYPE_CODE_DECFLOAT && tdep->soft_float)))
{ {
/* Soft-float IBM long double stored in r3, r4, r5, r6. */ /* Soft-float IBM long double or _Decimal128 stored in r3, r4,
r5, r6. */
if (readbuf) if (readbuf)
{ {
regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3, readbuf); regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3, readbuf);
@ -624,11 +632,14 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *type,
return RETURN_VALUE_REGISTER_CONVENTION; return RETURN_VALUE_REGISTER_CONVENTION;
} }
if ((TYPE_CODE (type) == TYPE_CODE_INT && TYPE_LENGTH (type) == 8) if ((TYPE_CODE (type) == TYPE_CODE_INT && TYPE_LENGTH (type) == 8)
|| (TYPE_CODE (type) == TYPE_CODE_FLT && TYPE_LENGTH (type) == 8)) || (TYPE_CODE (type) == TYPE_CODE_FLT && TYPE_LENGTH (type) == 8)
|| (TYPE_CODE (type) == TYPE_CODE_DECFLOAT && TYPE_LENGTH (type) == 8
&& tdep->soft_float))
{ {
if (readbuf) if (readbuf)
{ {
/* A long long, or a double stored in the 32 bit r3/r4. */ /* A long long, double or _Decimal64 stored in the 32 bit
r3/r4. */
regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3, regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3,
readbuf + 0); readbuf + 0);
regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 4, regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 4,
@ -636,7 +647,8 @@ do_ppc_sysv_return_value (struct gdbarch *gdbarch, struct type *type,
} }
if (writebuf) if (writebuf)
{ {
/* A long long, or a double stored in the 32 bit r3/r4. */ /* A long long, double or _Decimal64 stored in the 32 bit
r3/r4. */
regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3, regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3,
writebuf + 0); writebuf + 0);
regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 4, regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 4,