Commit 14c8e213 by Richard Henderson Committed by Richard Henderson

expmed.c (extract_force_align_mem_bit_field): Correct handling at the end of a page.

        * expmed.c (extract_force_align_mem_bit_field): Correct handling at
        the end of a page.

From-SVN: r90288
parent c66a4368
2004-11-08 Richard Henderson <rth@redhat.com>
* expmed.c (extract_force_align_mem_bit_field): Correct handling at
the end of a page.
2004-11-08 Kazu Hirata <kazu@cs.umass.edu> 2004-11-08 Kazu Hirata <kazu@cs.umass.edu>
* sched-deps.c (add_insn_mem_dependence): Make it static. * sched-deps.c (add_insn_mem_dependence): Make it static.
......
...@@ -1891,11 +1891,16 @@ extract_force_align_mem_bit_field (rtx op0, unsigned HOST_WIDE_INT bitsize, ...@@ -1891,11 +1891,16 @@ extract_force_align_mem_bit_field (rtx op0, unsigned HOST_WIDE_INT bitsize,
if (STRICT_ALIGNMENT) if (STRICT_ALIGNMENT)
{ {
base = plus_constant (XEXP (op0, 0), bitpos / BITS_PER_UNIT); base = plus_constant (XEXP (op0, 0), bitpos / BITS_PER_UNIT);
base = force_operand (base, NULL);
bitpos %= BITS_PER_UNIT; bitpos %= BITS_PER_UNIT;
/* Force alignment of the address; load two sequential values. */ /* We load two values to be concatenate. There's an edge condition
a1 = expand_simple_binop (Pmode, AND, base, that bears notice -- an aligned value at the end of a page can
only load one value lest we segfault. So the two values we load
are at "base & -size" and "(base + size - 1) & -size". If base
is unaligned, the addresses will be aligned and sequential; if
base is aligned, the addresses will both be equal to base. */
a1 = expand_simple_binop (Pmode, AND, force_operand (base, NULL),
GEN_INT (-(HOST_WIDE_INT)m_size), GEN_INT (-(HOST_WIDE_INT)m_size),
NULL, true, OPTAB_LIB_WIDEN); NULL, true, OPTAB_LIB_WIDEN);
mark_reg_pointer (a1, m_bitsize); mark_reg_pointer (a1, m_bitsize);
...@@ -1903,7 +1908,10 @@ extract_force_align_mem_bit_field (rtx op0, unsigned HOST_WIDE_INT bitsize, ...@@ -1903,7 +1908,10 @@ extract_force_align_mem_bit_field (rtx op0, unsigned HOST_WIDE_INT bitsize,
set_mem_align (v1, m_bitsize); set_mem_align (v1, m_bitsize);
v1 = force_reg (mode, validize_mem (v1)); v1 = force_reg (mode, validize_mem (v1));
a2 = plus_constant (a1, GET_MODE_SIZE (mode)); a2 = plus_constant (base, GET_MODE_SIZE (mode) - 1);
a2 = expand_simple_binop (Pmode, AND, force_operand (a2, NULL),
GEN_INT (-(HOST_WIDE_INT)m_size),
NULL, true, OPTAB_LIB_WIDEN);
v2 = gen_rtx_MEM (mode, a2); v2 = gen_rtx_MEM (mode, a2);
set_mem_align (v2, m_bitsize); set_mem_align (v2, m_bitsize);
v2 = force_reg (mode, validize_mem (v2)); v2 = force_reg (mode, validize_mem (v2));
......
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