------- Comment #3 from ubizjak at gmail dot com 2008-05-06 12:55 ------- This is due to this code snippet from i386.c, ix86_expand_binop_builtin ():
--cut here-- /* ??? Using ix86_fixup_binary_operands is problematic when we've got mismatched modes. Fake it. */ xops[0] = target; xops[1] = op0; xops[2] = op1; if (tmode == mode0 && tmode == mode1) { target = ix86_fixup_binary_operands (UNKNOWN, tmode, xops); op0 = xops[1]; op1 = xops[2]; } else if (optimize || !ix86_binary_operator_ok (UNKNOWN, tmode, xops)) { op0 = force_reg (mode0, op0); op1 = force_reg (mode1, op1); target = gen_reg_rtx (tmode); } --cut here-- Since UNKNOWN is not commutative operator, this code disables many optimizations that can be performed by treating builtins individually using ix86_fixup_binary_operands_no_copy (). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35714