On 12/07/2015 06:53 AM, Chen Gang wrote: > -(define_insn "insn_cmpne_<I48MODE:mode><I48MODE2:mode>" > - [(set (match_operand:I48MODE2 0 "register_operand" "=r") > - (ne:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO") > - (match_operand:I48MODE 2 "reg_or_cint_operand" "rO")))] > +(define_insn "insn_cmpne_di<I48MODE:mode>" > + [(set (match_operand:I48MODE 0 "register_operand" "=r") > + (ne:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO") > + (match_operand:DI 2 "reg_or_cint_operand" "rO")))] > "" > "cmpne\t%0, %r1, %r2") > > -(define_insn "insn_cmpeq_<I48MODE:mode><I48MODE2:mode>" > - [(set (match_operand:I48MODE2 0 "register_operand" "=r,r") > - (eq:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO") > - (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))] > +(define_insn "insn_cmpne_si<I48MODE:mode>" > + [(set (match_operand:I48MODE 0 "register_operand" "=r") > + (ne:I48MODE (match_operand:SI 1 "reg_or_0_operand" "rO") > + (match_operand:SI 2 "reg_or_cint_operand" "rO")))] > + "" > + "xor\t%0, %r1, %r2; bfextu\t%0, %0, 0, 31; cmpne\t%0, %0, zero" > + [(set_attr "type" "cannot_bundle")]) > +
The preferred solution is to remove SImode comparisons entirely, so that the middle-end extends the data itself. In addition, you might experiment with removing the SImode result of the comparisons here. We don't have them for Alpha (only DImode result), and we don't miss them; when SImode results are required they are created via subregs. r~