+2002-05-30 Richard Henderson <rth@redhat.com>
+ Eric Botcazou <ebotcazou@multimania.com>
+
+ PR optimization/6822
+ * config/i386/i386.c (ix86_expand_int_movcc): Don't cast INTVAL
+ to unsigned int for op1 comparisons. Use gen_int_mode.
+
2002-05-30 Eric Botcazou <ebotcazou@multimania.com>
* expmed.c (const_mult_add_overflow_p): New.
if ((code == LEU || code == GTU)
&& GET_CODE (ix86_compare_op1) == CONST_INT
&& mode != HImode
- && (unsigned int) INTVAL (ix86_compare_op1) != 0xffffffff
- /* The operand still must be representable as sign extended value. */
+ && INTVAL (ix86_compare_op1) != -1
+ /* For x86-64, the immediate field in the instruction is 32-bit
+ signed, so we can't increment a DImode value above 0x7fffffff. */
&& (!TARGET_64BIT
|| GET_MODE (ix86_compare_op0) != DImode
- || (unsigned int) INTVAL (ix86_compare_op1) != 0x7fffffff)
+ || INTVAL (ix86_compare_op1) != 0x7fffffff)
&& GET_CODE (operands[2]) == CONST_INT
&& GET_CODE (operands[3]) == CONST_INT)
{
code = LTU;
else
code = GEU;
- ix86_compare_op1
- = gen_int_mode (INTVAL (ix86_compare_op1) + 1,
- GET_MODE (ix86_compare_op0));
+ ix86_compare_op1 = gen_int_mode (INTVAL (ix86_compare_op1) + 1,
+ GET_MODE (ix86_compare_op0));
}
start_sequence ();
--- /dev/null
+/* PR optimization/6822 */
+
+extern unsigned char foo1 (void);
+extern unsigned short foo2 (void);
+
+int bar1 (void)
+{
+ unsigned char q = foo1 ();
+ return (q < 0x80) ? 64 : 0;
+}
+
+int bar2 (void)
+{
+ unsigned short h = foo2 ();
+ return (h < 0x8000) ? 64 : 0;
+}