http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56028
--- Comment #11 from Uros Bizjak <ubizjak at gmail dot com> 2013-01-22 08:46:48 UTC --- I was thinking of removing (!o,n) alternative from movdi (together with corresponding splitters). Splitter/peephole2 actually always generates movabs $N,%reg; mov $reg,(mem) unless it can't get a register. In the later case, the move is split into two separate moves. The problem is, that other move patterns assume (i.e. *mov{df,xf,ti}_internal_rex64) that they can move all immediates to memory. When moving FP immediate to volatile DFmode location, gcc tries to use DImode move with immediate operand, so this would fail with removed (!o,n) alternative. Also, split_double_mode, split_to_parts and ix86_split_long_move will have to be reviewed. Please see the comment inside split_double_mode, how simplify_subreg refuses to split volatile memory address, but gcc manages to get around this "limitation".