public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Storing 16bit values in upper part of 32bit registers
@ 2009-10-15 15:33 Markus L
  2009-10-15 15:43 ` sumanth
  2009-10-15 16:25 ` Richard Henderson
  0 siblings, 2 replies; 5+ messages in thread
From: Markus L @ 2009-10-15 15:33 UTC (permalink / raw)
  To: gcc

Hi,

I am working with an architecture where the 32bit registers (rN) are
divided into high (rNh) and low (rNl) 16bit sub registers that can in
principle be individually accessed by the instructions in the IS.
However the IS is designed so that it is beneficial to to store 16bit
values in the high part of the registers (rNh) and also the calling
conventions that we want follow require 16bit values to be passed and
returned in rNh.

What would be the "proper way" make the compiler use the upper parts
of these registers for the 16bit operands?

Currently this is done by having the registers in two register classes
('full' and 'high_only') and printing the 'h' in the output template
when the constraint matches the 'high_only' class. This however causes
problems when converting between 16 and 32bit operands. One annoying
example is returning scalar values. E.g. assume that a 32bit variable
(long) is assigned to a 16bit variable (int) like in

int foo(void)
{
  long sum;
  ...
  return (int)sum;
}

then we want the low part of sum to be moved to the high part of the
return register r0h. However TARGET_FUNCTION_VALUE only seem to allow
me to return the RTX for register r0 but not the subreg for r0h so the
compiler will not emit the necessary RTL to move the value from the
low part of sum to r0h before the return. This (and probably many
other issues that I am about to discover) makes me think that maybe
this is not the ideal way to do this. I have searched the available
ports but have not been able to find any which seem to use its
registers in a similar way. Any advice or pointers to code to look
into would be much appreciated.

Thanks in advance.

/Markus

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-11-06 14:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-10-15 15:33 Storing 16bit values in upper part of 32bit registers Markus L
2009-10-15 15:43 ` sumanth
2009-10-15 16:25 ` Richard Henderson
2009-11-06  2:09   ` H. Peter Anvin
2009-11-06 14:29     ` Markus L

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).