+2010-01-18 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/42774
+ * config/alpha/predicates.md (aligned_memory_operand): Return 0 for
+ memory references with unaligned offsets. Remove CQImode handling.
+ (unaligned_memory_operand): Return 1 for memory references with
+ unaligned offsets. Remove CQImode handling.
+
2010-01-18 Richard Guenther <rguenther@suse.de>
PR middle-end/39954
(match_code "mem"))
{
rtx base;
+ int offset;
if (MEM_ALIGN (op) >= 32)
return 1;
- if (mode == CQImode)
- return 0;
-
op = XEXP (op, 0);
/* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)
if (reload_in_progress
&& GET_CODE (op) == PLUS
&& GET_CODE (XEXP (op, 0)) == PLUS)
- base = XEXP (XEXP (op, 0), 0);
+ {
+ base = XEXP (XEXP (op, 0), 0);
+ offset = INTVAL (XEXP (op, 1));
+ }
else
{
if (! memory_address_p (mode, op))
return 0;
- base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op);
+ if (GET_CODE (op) == PLUS)
+ {
+ base = XEXP (op, 0);
+ offset = INTVAL (XEXP (op, 1));
+ }
+ else
+ {
+ base = op;
+ offset = 0;
+ }
}
+ if (offset % GET_MODE_SIZE (mode))
+ return 0;
+
return (REG_P (base) && REGNO_POINTER_ALIGN (REGNO (base)) >= 32);
})
(match_code "mem"))
{
rtx base;
+ int offset;
if (MEM_ALIGN (op) >= 32)
return 0;
- if (mode == CQImode)
- return 1;
-
op = XEXP (op, 0);
/* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo)
if (reload_in_progress
&& GET_CODE (op) == PLUS
&& GET_CODE (XEXP (op, 0)) == PLUS)
- base = XEXP (XEXP (op, 0), 0);
+ {
+ base = XEXP (XEXP (op, 0), 0);
+ offset = INTVAL (XEXP (op, 1));
+ }
else
{
if (! memory_address_p (mode, op))
return 0;
- base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op);
+ if (GET_CODE (op) == PLUS)
+ {
+ base = XEXP (op, 0);
+ offset = INTVAL (XEXP (op, 1));
+ }
+ else
+ {
+ base = op;
+ offset = 0;
+ }
}
+ if (offset % GET_MODE_SIZE (mode))
+ return 1;
+
return (REG_P (base) && REGNO_POINTER_ALIGN (REGNO (base)) < 32);
})