On s390x it produces this insn: (insn 8 7 9 3 323444.c:15 (set (mem/s:DI (reg:DI 46) [0 S8 A64]) (mem/s:DI (reg/v/f:DI 45 [ tp ]) [0 S8 A64])) -1 (nil))
Note that the alignments are 64 bit again, despite the field being packed. mep-elf has similar results. void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n); struct timeval { long tv_sec; }; struct outdata { long align; char seq; struct timeval tv __attribute__((packed)); }; void send_probe(struct outdata *outdata, struct timeval *tp) { memcpy(&(outdata->tv), tp, sizeof outdata->tv); } send_probe (struct outdata * outdata, struct timeval * tp) { struct timeval * D.1971; # BLOCK 2 freq:10000 # PRED: ENTRY [100.0%] (fallthru,exec) D.1971_2 = &outdata_1(D)->tv; memcpy (D.1971_2, tp_3(D), 8); [tail call] return; # SUCC: EXIT [100.0%] }