* varasm.c (output_constructor_bitfield): Fix thinkos in latest change.

From-SVN: r210856
This commit is contained in:
Eric Botcazou 2014-05-23 11:33:42 +00:00 committed by Eric Botcazou
parent 0aadce7331
commit 4adf63f9c7
2 changed files with 24 additions and 18 deletions

View File

@ -1,3 +1,7 @@
2014-05-23 Eric Botcazou <ebotcazou@adacore.com>
* varasm.c (output_constructor_bitfield): Fix thinkos in latest change.
2014-05-23 Thomas Schwinge <thomas@codesourcery.com> 2014-05-23 Thomas Schwinge <thomas@codesourcery.com>
* gimple.h (enum gf_mask): Add and use GF_OMP_FOR_SIMD. * gimple.h (enum gf_mask): Add and use GF_OMP_FOR_SIMD.

View File

@ -5082,24 +5082,27 @@ output_constructor_bitfield (oc_local_state *local, unsigned int bit_offset)
this_time = MIN (end_offset - next_offset, BITS_PER_UNIT - next_bit); this_time = MIN (end_offset - next_offset, BITS_PER_UNIT - next_bit);
if (BYTES_BIG_ENDIAN) if (BYTES_BIG_ENDIAN)
{ {
/* On big-endian machine, take the most significant bits /* On big-endian machine, take the most significant bits (of the
first (of the bits that are significant) bits that are significant) first and put them into bytes from
and put them into bytes from the most significant end. */ the most significant end. */
shift = end_offset - next_offset - this_time; shift = end_offset - next_offset - this_time;
/* Don't try to take a bunch of bits that cross /* Don't try to take a bunch of bits that cross
the word boundary in the INTEGER_CST. We can the word boundary in the INTEGER_CST. We can
only select bits from the LOW or HIGH part only select bits from one element. */
not from both. */
if ((shift / HOST_BITS_PER_WIDE_INT) if ((shift / HOST_BITS_PER_WIDE_INT)
!= ((shift + this_time) / HOST_BITS_PER_WIDE_INT)) != ((shift + this_time - 1) / HOST_BITS_PER_WIDE_INT))
this_time = (shift + this_time) & (HOST_BITS_PER_WIDE_INT - 1); {
const int end = shift + this_time - 1;
shift = end & -HOST_BITS_PER_WIDE_INT;
this_time = end - shift + 1;
}
/* Now get the bits from the appropriate constant word. */ /* Now get the bits from the appropriate constant word. */
value = TREE_INT_CST_ELT (local->val, shift / HOST_BITS_PER_WIDE_INT); value = TREE_INT_CST_ELT (local->val, shift / HOST_BITS_PER_WIDE_INT);
shift = shift & (HOST_BITS_PER_WIDE_INT - 1); shift = shift & (HOST_BITS_PER_WIDE_INT - 1);
/* Get the result. This works only when: /* Get the result. This works only when:
1 <= this_time <= HOST_BITS_PER_WIDE_INT. */ 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
local->byte |= (((value >> shift) local->byte |= (((value >> shift)
& (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1)) & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
@ -5107,25 +5110,24 @@ output_constructor_bitfield (oc_local_state *local, unsigned int bit_offset)
} }
else else
{ {
/* On little-endian machines, /* On little-endian machines, take the least significant bits of
take first the least significant bits of the value the value first and pack them starting at the least significant
and pack them starting at the least significant
bits of the bytes. */ bits of the bytes. */
shift = next_offset - byte_relative_ebitpos; shift = next_offset - byte_relative_ebitpos;
/* Don't try to take a bunch of bits that cross /* Don't try to take a bunch of bits that cross
the word boundary in the INTEGER_CST. We can the word boundary in the INTEGER_CST. We can
only select bits from the LOW or HIGH part only select bits from one element. */
not from both. */
if ((shift / HOST_BITS_PER_WIDE_INT) if ((shift / HOST_BITS_PER_WIDE_INT)
!= ((shift + this_time) / HOST_BITS_PER_WIDE_INT)) != ((shift + this_time - 1) / HOST_BITS_PER_WIDE_INT))
this_time = (HOST_BITS_PER_WIDE_INT - shift); this_time
= HOST_BITS_PER_WIDE_INT - (shift & (HOST_BITS_PER_WIDE_INT - 1));
/* Now get the bits from the appropriate constant word. */ /* Now get the bits from the appropriate constant word. */
value = TREE_INT_CST_ELT (local->val, shift / HOST_BITS_PER_WIDE_INT); value = TREE_INT_CST_ELT (local->val, shift / HOST_BITS_PER_WIDE_INT);
shift = shift & (HOST_BITS_PER_WIDE_INT - 1); shift = shift & (HOST_BITS_PER_WIDE_INT - 1);
/* Get the result. This works only when: /* Get the result. This works only when:
1 <= this_time <= HOST_BITS_PER_WIDE_INT. */ 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
local->byte |= (((value >> shift) local->byte |= (((value >> shift)
& (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1)) & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))