expmed.c (extract_bit_field_1): Also use a temporary and convert_extracted_bit_field when...

* expmed.c (extract_bit_field_1): Also use a temporary and
	convert_extracted_bit_field when the conversion from ext_mode to
	the target mode requires explicit truncation.

testsuite/
	* gcc.c-torture/execute/20081117-1.c: New test.

From-SVN: r141960
This commit is contained in:
Adam Nemet 2008-11-18 02:08:24 +00:00 committed by Adam Nemet
parent da8f5862ce
commit a990abffbf
4 changed files with 41 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2008-11-17 Adam Nemet <anemet@caviumnetworks.com>
* expmed.c (extract_bit_field_1): Also use a temporary and
convert_extracted_bit_field when the conversion from ext_mode to
the target mode requires explicit truncation.
2008-11-17 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.h (REG_ALLOC_ORDER): Put accumulators first.

View File

@ -1533,7 +1533,13 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
if (GET_MODE (xtarget) != ext_mode)
{
if (REG_P (xtarget))
/* Don't use LHS paradoxical subreg if explicit truncation is needed
between the mode of the extraction (word_mode) and the target
mode. Instead, create a temporary and use convert_move to set
the target. */
if (REG_P (xtarget)
&& TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (xtarget)),
GET_MODE_BITSIZE (ext_mode)))
{
xtarget = gen_lowpart (ext_mode, xtarget);
if (GET_MODE_SIZE (ext_mode)

View File

@ -1,3 +1,7 @@
2008-11-17 Adam Nemet <anemet@caviumnetworks.com>
* gcc.c-torture/execute/20081117-1.c: New test.
2008-11-17 Richard Sandiford <rdsandiford@googlemail.com>
* gcc.target/mips/dspr2-MULT.c: Just check for $ac1 and $ac2.

View File

@ -0,0 +1,24 @@
extern void abort (void);
struct s
{
unsigned long long a:16;
unsigned long long b:32;
unsigned long long c:16;
};
__attribute__ ((noinline)) unsigned
f (struct s s, unsigned i)
{
return s.b == i;
}
struct s s = { 1, 0x87654321u, 2};
int
main ()
{
if (!f (s, 0x87654321u))
abort ();
return 0;
}