Home | History | Annotate | Download | only in Hexagon
      1 //===-- HexagoSelectCCInfo.td - Selectcc mappings ----------*- tablegen -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 
     11 //
     12 // selectcc mappings.
     13 //
     14 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     15                           IntRegs:$fval, SETEQ)),
     16       (i32 (MUX_rr (i1 (CMPEQrr IntRegs:$lhs, IntRegs:$rhs)),
     17                    IntRegs:$tval, IntRegs:$fval))>;
     18 
     19 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     20                           IntRegs:$fval, SETNE)),
     21       (i32 (MUX_rr (i1 (NOT_p (CMPEQrr IntRegs:$lhs, IntRegs:$rhs))),
     22                    IntRegs:$tval, IntRegs:$fval))>;
     23 
     24 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     25                           IntRegs:$fval, SETGT)),
     26       (i32 (MUX_rr (i1 (CMPGTrr IntRegs:$lhs, IntRegs:$rhs)),
     27                    IntRegs:$tval, IntRegs:$fval))>;
     28 
     29 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     30                           IntRegs:$fval, SETUGT)),
     31       (i32 (MUX_rr (i1 (CMPGTUrr IntRegs:$lhs, IntRegs:$rhs)),
     32                    IntRegs:$tval, IntRegs:$fval))>;
     33 
     34 
     35 
     36 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     37                           IntRegs:$fval, SETULT)),
     38       (i32 (MUX_rr (i1 (NOT_p (CMPGTUrr IntRegs:$lhs,
     39                                          (ADD_ri IntRegs:$rhs, -1)))),
     40                    IntRegs:$tval, IntRegs:$fval))>;
     41 
     42 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     43                           IntRegs:$fval, SETLT)),
     44       (i32 (MUX_rr (i1 (NOT_p (CMPGTrr IntRegs:$lhs,
     45                                         (ADD_ri IntRegs:$rhs, -1)))),
     46                    IntRegs:$tval, IntRegs:$fval))>;
     47 
     48 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     49                           IntRegs:$fval, SETLE)),
     50       (i32 (MUX_rr (i1 (NOT_p (CMPGTrr IntRegs:$lhs, IntRegs:$rhs))),
     51                    IntRegs:$tval, IntRegs:$fval))>;
     52 
     53 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     54                           IntRegs:$fval, SETULE)),
     55       (i32 (MUX_rr (i1 (NOT_p (CMPGTUrr IntRegs:$lhs, IntRegs:$rhs))),
     56                    IntRegs:$tval, IntRegs:$fval))>;
     57 
     58 
     59 //
     60 // selectcc mappings for greater-equal-to Rs => greater-than Rs-1.
     61 //
     62 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     63                           IntRegs:$fval, SETGE)),
     64       (i32 (MUX_rr (i1 (CMPGTrr IntRegs:$lhs, (ADD_ri IntRegs:$rhs, -1))),
     65                    IntRegs:$tval, IntRegs:$fval))>;
     66 
     67 def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval,
     68                           IntRegs:$fval, SETUGE)),
     69       (i32 (MUX_rr (i1 (CMPGTUrr IntRegs:$lhs, (ADD_ri IntRegs:$rhs, -1))),
     70                    IntRegs:$tval, IntRegs:$fval))>;
     71 
     72 
     73 
     74 //
     75 // selectcc mappings for predicate comparisons.
     76 //
     77 // Convert Rd = selectcc(p0, p1, true_val, false_val, SETEQ) into:
     78 //  pt = not(p1 xor p2)
     79 //  Rd = mux(pt, true_val, false_val)
     80 // and similarly for SETNE
     81 //
     82 def : Pat <(i32 (selectcc PredRegs:$lhs, PredRegs:$rhs, IntRegs:$tval,
     83                           IntRegs:$fval, SETNE)),
     84       (i32 (MUX_rr (i1 (XOR_pp PredRegs:$lhs, PredRegs:$rhs)), IntRegs:$tval,
     85                    IntRegs:$fval))>;
     86 
     87 def : Pat <(i32 (selectcc PredRegs:$lhs, PredRegs:$rhs, IntRegs:$tval,
     88                           IntRegs:$fval, SETEQ)),
     89       (i32 (MUX_rr (i1 (NOT_p (XOR_pp PredRegs:$lhs, PredRegs:$rhs))),
     90                    IntRegs:$tval, IntRegs:$fval))>;
     91 
     92 
     93 //
     94 // selectcc mappings for 64-bit operands are messy. Hexagon does not have a
     95 // MUX64 o, use this:
     96 // selectcc(Rss, Rdd, tval, fval, cond) ->
     97 //   combine(mux(cmp_cond(Rss, Rdd), tval.hi, fval.hi),
     98 //           mux(cmp_cond(Rss, Rdd), tval.lo, fval.lo))
     99 
    100 // setgt-64.
    101 def : Pat<(i64 (selectcc DoubleRegs:$lhs, DoubleRegs:$rhs, DoubleRegs:$tval,
    102                          DoubleRegs:$fval, SETGT)),
    103       (COMBINE_rr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, DoubleRegs:$rhs),
    104                            (EXTRACT_SUBREG DoubleRegs:$tval, subreg_hireg),
    105                            (EXTRACT_SUBREG DoubleRegs:$fval, subreg_hireg)),
    106                    (MUX_rr (CMPGT64rr DoubleRegs:$lhs, DoubleRegs:$rhs),
    107                            (EXTRACT_SUBREG DoubleRegs:$tval, subreg_loreg),
    108                            (EXTRACT_SUBREG DoubleRegs:$fval, subreg_loreg)))>;
    109 
    110 
    111 // setlt-64 -> setgt-64.
    112 def : Pat<(i64 (selectcc DoubleRegs:$lhs, DoubleRegs:$rhs, DoubleRegs:$tval,
    113                          DoubleRegs:$fval, SETLT)),
    114       (COMBINE_rr (MUX_rr (CMPGT64rr DoubleRegs:$lhs,
    115                                      (ADD64_rr DoubleRegs:$rhs, (TFRI64 -1))),
    116                            (EXTRACT_SUBREG DoubleRegs:$tval, subreg_hireg),
    117                            (EXTRACT_SUBREG DoubleRegs:$fval, subreg_hireg)),
    118                    (MUX_rr (CMPGT64rr DoubleRegs:$lhs,
    119                                       (ADD64_rr DoubleRegs:$rhs, (TFRI64 -1))),
    120                            (EXTRACT_SUBREG DoubleRegs:$tval, subreg_loreg),
    121                            (EXTRACT_SUBREG DoubleRegs:$fval, subreg_loreg)))>;
    122