Hello! Attached patch prevents partial memory stalls for XFmode and DFmode (32bit) immediate->memory moves by penalizing memory target in case of immediate move. The patch also cleans move splitters that handle immediate operands (most notably, there are no FP subregs after the reload pass; ix86_split_long_move splitters can be simplified and merged into one pattern). 2011-05-30 Uros Bizjak * config/i386/i386.md (*movxf_internal): Penalize FYx*r->o alternative to prevent partial memory stalls. Do not move CONST_DOUBLEs directly to memory for !TARGET_MEMORY_MISMATCH_STALL. (*movdf_internal_rex64): Do not penalize F->r alternative. (*movdf_internal): Penalize FYd*r->o alternative to prevent partial memory stalls. Generate SSE and x87 CONST_DOUBLE immediates only when optimizing function for size. Do not move CONST_DOUBLEs directly to memory for !TARGET_MEMORY_MISMATCH_STALL. (FP move splitters): Merge {TF,XF,DF}mode move splitters. Do not handle SUBREGs. Do not check for MEM_P operands in the insn condition, check for ANY_FP_REGNO_P instead. * config/i386/constraints.md (Yd): Enable GENERAL_REGS for TARGET_64BIT and for TARGET_INTEGER_DFMODE_MOVES when optimizing function for speed. * config/i386/i386.c (ix86_option_override_internal): Do not set TARGET_INTEGER_DFMODE_MOVES here. Patch was bootstrapped and regression tested on x86_64-pc-linux-gnu {,-m32}, committed to mainline SVN. Uros.