Commit 4adf63f9 by Eric Botcazou Committed by Eric Botcazou

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

From-SVN: r210856
parent 0aadce73
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.
......
...@@ -5082,18 +5082,21 @@ output_constructor_bitfield (oc_local_state *local, unsigned int bit_offset) ...@@ -5082,18 +5082,21 @@ 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);
...@@ -5107,19 +5110,18 @@ output_constructor_bitfield (oc_local_state *local, unsigned int bit_offset) ...@@ -5107,19 +5110,18 @@ 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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment