* varasm.c (output_constructor) Solved problem with long long
bitfields. Corrected calculating this_time and shift. Also corrected calculating mask when BITS_PER_UNIT == 32 (c4x). From-SVN: r30571
This commit is contained in:
parent
ee7602056e
commit
dfb2c079b1
|
@ -1,3 +1,9 @@
|
|||
1999-11-18 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
|
||||
|
||||
* varasm.c (output_constructor) Solved problem with long long
|
||||
bitfields. Corrected calculating this_time and shift. Also
|
||||
corrected calculating mask when BITS_PER_UNIT == 32 (c4x).
|
||||
|
||||
Wed Nov 17 23:46:14 1999 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* flow.c (split_edge): Take looping structure into account when
|
||||
|
|
22
gcc/varasm.c
22
gcc/varasm.c
|
@ -4530,12 +4530,13 @@ output_constructor (exp, size)
|
|||
and put them into bytes from the most significant end. */
|
||||
shift = end_offset - next_offset - this_time;
|
||||
/* Don't try to take a bunch of bits that cross
|
||||
the word boundary in the INTEGER_CST. */
|
||||
the word boundary in the INTEGER_CST. We can
|
||||
only select bits from the LOW or HIGH part
|
||||
not from both. */
|
||||
if (shift < HOST_BITS_PER_WIDE_INT
|
||||
&& shift + this_time > HOST_BITS_PER_WIDE_INT)
|
||||
{
|
||||
this_time -= (HOST_BITS_PER_WIDE_INT - shift);
|
||||
shift = HOST_BITS_PER_WIDE_INT;
|
||||
this_time = (HOST_BITS_PER_WIDE_INT - shift);
|
||||
}
|
||||
|
||||
/* Now get the bits from the appropriate constant word. */
|
||||
|
@ -4550,8 +4551,10 @@ output_constructor (exp, size)
|
|||
}
|
||||
else
|
||||
abort ();
|
||||
/* Get the result. This works only when:
|
||||
1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
|
||||
byte |= (((value >> shift)
|
||||
& (((HOST_WIDE_INT) 1 << this_time) - 1))
|
||||
& (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
|
||||
<< (BITS_PER_UNIT - this_time - next_bit));
|
||||
}
|
||||
else
|
||||
|
@ -4563,12 +4566,13 @@ output_constructor (exp, size)
|
|||
shift = (next_offset
|
||||
- TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)));
|
||||
/* Don't try to take a bunch of bits that cross
|
||||
the word boundary in the INTEGER_CST. */
|
||||
the word boundary in the INTEGER_CST. We can
|
||||
only select bits from the LOW or HIGH part
|
||||
not from both. */
|
||||
if (shift < HOST_BITS_PER_WIDE_INT
|
||||
&& shift + this_time > HOST_BITS_PER_WIDE_INT)
|
||||
{
|
||||
this_time -= (HOST_BITS_PER_WIDE_INT - shift);
|
||||
shift = HOST_BITS_PER_WIDE_INT;
|
||||
this_time = (HOST_BITS_PER_WIDE_INT - shift);
|
||||
}
|
||||
|
||||
/* Now get the bits from the appropriate constant word. */
|
||||
|
@ -4581,8 +4585,10 @@ output_constructor (exp, size)
|
|||
}
|
||||
else
|
||||
abort ();
|
||||
/* Get the result. This works only when:
|
||||
1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
|
||||
byte |= (((value >> shift)
|
||||
& (((HOST_WIDE_INT) 1 << this_time) - 1))
|
||||
& (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
|
||||
<< next_bit);
|
||||
}
|
||||
next_offset += this_time;
|
||||
|
|
Loading…
Reference in New Issue