[RFA][2/5] New port: Cell BE SPU (valops.c fix)

Ulrich Weigand
2006-11-11T18:38:28Z

Hello,

this fixes another problem for the SPU port. In value_assign,
when assigning to a register that is marked as CONVERT_REGISTER_P,
the front end always calls VALUE_TO_REGISTER, which always cleans
out the full previous contents of the register.

This happens even if the value is a bitfield that occupies only
part of the register, and the remaining contents should *not* be
changed. The back end's VALUE_TO_REGISTER has no real chance to
do this right since it doesn't even get the value object as input,
and thus doesn't know that value_bitsize is nonzero.

This probably rarely triggers on other architectures, as those
registers that require CONVERT_REGISTER_P tend to be special
registers that usually don't hold bitfield values. On the SPU
however, every general-purpose register needs CONVERT_REGISTER_P
(since they are really 16-byte vector registers, and loading/
storing scalar values required a special conversion).

The patch below 'fixes' this for SPU by at least not calling
VALUE_TO_REGISTER for bitfield assignments, but falling back
to the default code. This happens to work for SPU; other
platforms with special conversion needs might need to get a
chance for the back-end to get involved even then. I guess
when this happens we can think of an extended interface that
would pass the bitsize information through to the back-end ...

Tested on SPU (where it fixes about a dozen test cases).
Also tested without regressions on s390-ibm-linux and
s390x-ibm-linux.

OK?

Bye,
Ulrich

ChangeLog:

* valops.c (value_assign): Do not call VALUE_TO_REGISTER
for bitfield assignments.

diff -urN gdb-orig/gdb/valops.c gdb-head/gdb/valops.c
--- gdb-orig/gdb/valops.c 2006-10-09 21:28:14.000000000 +0200
+++ gdb-head/gdb/valops.c 2006-10-30 19:39:02.972619008 +0100
@@ -643,6 +643,7 @@
error (_("Value being assigned to is no longer active."));

if (VALUE_LVAL (toval) == lval_register
+ && value_bitsize (toval) == 0
&& CONVERT_REGISTER_P (VALUE_REGNUM (toval), type))
{
/* If TOVAL is a special machine register requiring
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com