Hello all,

I am porting GCC 4.4.0 for a 32bit target. The target has 40bit data
registers and 32bit address register. Both can be used as general
purpose registers. All load and store operations are 32bit. If 40bit
data register is involved in load/sore the register gets sign
extended. Whenever there is a move from address register to data
register sign extension is automatically performed. Currently GCC
generates code for 32bit register target. Since the data register is
40bit after/before some operations sign/zero extension has to be
performed for the result to be proper. So at present for the port the
results are not proper. I would need a solution to fix this.

I had mailed about this previously. You can see about this here
http://www.mail-archive.com/gcc@gcc.gnu.org/msg47224.html

I tried implementing the suggestion given by Richard, but got into
issues. The GCC frame work is written assuming that there are no modes
with HOST_BITS_PER_WIDE_INT < GET_MODE_BITSIZE (mode) < 2 *
HOST_BITS_PER_WIDE_INT. Moreover i am getting ICEs when there is an
optimization/operation related to subreg. (GCC tries to split RImode
values).RImode is 5byte and uses SImode load/store instructions. So
GCC generates offsets/addresses that are not 32bit aligned. Currently
i am hacking the complier all the way to get an executable (though i
have not tested the output of the obtained executables) Even if i
somehow manage to get proper output there is the issue of using 32bit
registers in RImode instructions. RImode values is meant for 40bit
register, i.e data register. That means i will not be able to use
address registers(32bit registers) in RImode patterns even though the
instructions accept them. This will definitely hamper efficiency.

So i was wondering if anybody has any alternative solution that i can
try. All i can think is to flag an insn for unsigned operation so that
i will be able to insert sign/zero extension during say reorg pass.
Can this be implemented? How feasible is this?

Regards,
Shafi

Reply via email to