+2010-01-02 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/42448
+ * config/alpha/predicates.md (aligned_memory_operand): Return false
+ for CQImode.
+ (unaligned_memory_operand): Return true for CQImode.
+ * config/alpha/alpha.c (get_aligned_mem): Assert that location
+ doesn not cross aligned SImode word boundary.
+
2009-12-30 Ian Lance Taylor <iant@google.com>
PR middle-end/42099
else
offset = disp & 3;
+ /* The location should not cross aligned word boundary. */
+ gcc_assert (offset + GET_MODE_SIZE (GET_MODE (ref))
+ <= GET_MODE_SIZE (SImode));
+
/* Access the entire aligned word. */
*paligned_mem = widen_memory_access (ref, SImode, -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 (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)
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-mcpu=21064 -O0" } */
+
+extern void abort (void);
+
+struct S2180
+{
+ char t;
+ _Complex char u[2];
+};
+
+struct S2180 s2180;
+
+int
+main (void)
+{
+ volatile struct S2180 x;
+
+ s2180.u[1] = 3 + 4i;
+
+ x.u[1] = s2180.u[1];
+
+ if (x.u[1] != s2180.u[1])
+ abort ();
+
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-mcpu=21064 -O0" } */
+
+extern void abort (void);
+
+struct S2180
+{
+ char t;
+ _Complex char u[4];
+};
+
+struct S2180 s2180;
+
+int
+main (void)
+{
+ volatile struct S2180 x;
+
+ s2180.u[3] = 3 + 4i;
+
+ x.u[3] = s2180.u[3];
+
+ if (x.u[3] != s2180.u[3])
+ abort ();
+
+ return 0;
+}