------- Comment #1 from bonzini at gnu dot org 2006-12-06 10:10 ------- You might have to add a post-reload splitter for something like
(set (match_operand:SI 0 "register_operand" "+r") (plus (match_dup 0) (lt:SI (match_operand:SF 1 "register_operand" "x") (match_operand:SF 2 "register_operand" "xm"))) to [(set (reg:CCFP FLAGS_REG) (compare:CCFPU (match_dup 1) (match_dup 2))) (parallel [(set (match_dup 0) (plus (match_dup 0) (ltu:SI (reg:CC FLAGS_REG) (const_int 0)))) (clobber (reg:CC FLAGS_REG))])] and likewise (set (match_operand:SI 0 "register_operand" "+r") (minus (match_dup 0) (lt:SI (match_operand:SF 1 "register_operand" "x") (match_operand:SF 2 "register_operand" "xm"))) to [(set (reg:CCFP FLAGS_REG) (compare:CCFPU (match_dup 2) (match_dup 1))) (parallel [(set (match_dup 0) (minus:SI (match_dup 0) (ltu:SI (reg:CC FLAGS_REG) (const_int 0)))) (clobber (reg:CC FLAGS_REG))])] The pattern for the adc and sbb are already there, but they don't match if the immediate is zero because it gets simplified, so you need also something like this: (define_insn "adc_carry_si" [(set (match_operand:SI 0 "nonimmediate_operand" "=rm") (plus:SI (match_operand:SI 1 "nonimmediate_operand" "0") (match_operand:SI 2 "ix86_carry_flag_operator" ""))) (clobber (reg:CC FLAGS_REG))] "ix86_binary_operator_ok (PLUS, SImode, operands)" "adc{l}\t{$0, %0|%0, 0}" [(set_attr "type" "alu") (set_attr "pent_pair" "pu") (set_attr "mode" "SI")]) (define_insn "sub_carry_si" [(set (match_operand:SI 0 "nonimmediate_operand" "=rm") (minus:SI (match_operand:SI 1 "nonimmediate_operand" "0") (match_operand:SI 2 "ix86_carry_flag_operator" ""))) (clobber (reg:CC FLAGS_REG))] "ix86_binary_operator_ok (MINUS, SImode, operands)" "sbb{l}\t{$0, %0|%0, 0}" [(set_attr "type" "alu") (set_attr "pent_pair" "pu") (set_attr "mode" "SI")]) Of course in both 32-bit and 64-bit modes. Which explains why I only did the theory, and stopped before the practice. -- bonzini at gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bonzini at gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30082