diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f6418d1603..a851ef292be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-07-16 Rodney Brown + + * config/i386/i386.c (ix86_expand_int_movcc): In the case where + the comparison directly gives a mask suppress addition when cf is + zero by complementing the mask. + 2002-07-16 Nathanael Nerode * Makefile.in: Delete references to enquire. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6e19b5cd887..6c2a2b5c77e 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -8666,7 +8666,6 @@ ix86_expand_int_movcc (operands) if ((compare_code == LTU || compare_code == GEU) && !second_test && !bypass_test) { - /* Detect overlap between destination and compare sources. */ rtx tmp = out; @@ -8723,7 +8722,7 @@ ix86_expand_int_movcc (operands) /* * cmpl op0,op1 * sbbl dest,dest - * xorl $-1, dest + * notl dest * [addl dest, cf] * * Size 8 - 11. @@ -8739,11 +8738,20 @@ ix86_expand_int_movcc (operands) /* * cmpl op0,op1 * sbbl dest,dest + * [notl dest] * andl cf - ct, dest * [addl dest, ct] * * Size 8 - 11. */ + + if (cf == 0) + { + cf = ct; + ct = 0; + tmp = expand_simple_unop (mode, NOT, tmp, tmp, 1); + } + tmp = expand_simple_binop (mode, AND, tmp, gen_int_mode (cf - ct, mode),