| //===-- HexagoSelectCCInfo.td - Selectcc mappings ----------*- tablegen -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| |
| // |
| // selectcc mappings. |
| // |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETEQ)), |
| (i32 (MUX_rr (i1 (CMPEQrr IntRegs:$lhs, IntRegs:$rhs)), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETNE)), |
| (i32 (MUX_rr (i1 (NOT_p (CMPEQrr IntRegs:$lhs, IntRegs:$rhs))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETGT)), |
| (i32 (MUX_rr (i1 (CMPGTrr IntRegs:$lhs, IntRegs:$rhs)), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETUGT)), |
| (i32 (MUX_rr (i1 (CMPGTUrr IntRegs:$lhs, IntRegs:$rhs)), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETULT)), |
| (i32 (MUX_rr (i1 (NOT_p (CMPGTUrr IntRegs:$lhs, |
| (ADD_ri IntRegs:$rhs, -1)))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETLT)), |
| (i32 (MUX_rr (i1 (NOT_p (CMPGTrr IntRegs:$lhs, |
| (ADD_ri IntRegs:$rhs, -1)))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETLE)), |
| (i32 (MUX_rr (i1 (NOT_p (CMPGTrr IntRegs:$lhs, IntRegs:$rhs))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETULE)), |
| (i32 (MUX_rr (i1 (NOT_p (CMPGTUrr IntRegs:$lhs, IntRegs:$rhs))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| |
| // |
| // selectcc mappings for greater-equal-to Rs => greater-than Rs-1. |
| // |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETGE)), |
| (i32 (MUX_rr (i1 (CMPGTrr IntRegs:$lhs, (ADD_ri IntRegs:$rhs, -1))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETUGE)), |
| (i32 (MUX_rr (i1 (CMPGTUrr IntRegs:$lhs, (ADD_ri IntRegs:$rhs, -1))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| |
| |
| // |
| // selectcc mappings for predicate comparisons. |
| // |
| // Convert Rd = selectcc(p0, p1, true_val, false_val, SETEQ) into: |
| // pt = not(p1 xor p2) |
| // Rd = mux(pt, true_val, false_val) |
| // and similarly for SETNE |
| // |
| def : Pat <(i32 (selectcc PredRegs:$lhs, PredRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETNE)), |
| (i32 (MUX_rr (i1 (XOR_pp PredRegs:$lhs, PredRegs:$rhs)), IntRegs:$tval, |
| IntRegs:$fval))>; |
| |
| def : Pat <(i32 (selectcc PredRegs:$lhs, PredRegs:$rhs, IntRegs:$tval, |
| IntRegs:$fval, SETEQ)), |
| (i32 (MUX_rr (i1 (NOT_p (XOR_pp PredRegs:$lhs, PredRegs:$rhs))), |
| IntRegs:$tval, IntRegs:$fval))>; |
| |
| |
| // |
| // selectcc mappings for 64-bit operands are messy. Hexagon does not have a |
| // MUX64 o, use this: |
| // selectcc(Rss, Rdd, tval, fval, cond) -> |
| // combine(mux(cmp_cond(Rss, Rdd), tval.hi, fval.hi), |
| // mux(cmp_cond(Rss, Rdd), tval.lo, fval.lo)) |
| |
| // setgt-64. |
| def : Pat<(i64 (selectcc DoubleRegs:$lhs, DoubleRegs:$rhs, DoubleRegs:$tval, |
| DoubleRegs:$fval, SETGT)), |
| (COMBINE_rr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, DoubleRegs:$rhs), |
| (EXTRACT_SUBREG DoubleRegs:$tval, subreg_hireg), |
| (EXTRACT_SUBREG DoubleRegs:$fval, subreg_hireg)), |
| (MUX_rr (CMPGT64rr DoubleRegs:$lhs, DoubleRegs:$rhs), |
| (EXTRACT_SUBREG DoubleRegs:$tval, subreg_loreg), |
| (EXTRACT_SUBREG DoubleRegs:$fval, subreg_loreg)))>; |
| |
| |
| // setlt-64 -> setgt-64. |
| def : Pat<(i64 (selectcc DoubleRegs:$lhs, DoubleRegs:$rhs, DoubleRegs:$tval, |
| DoubleRegs:$fval, SETLT)), |
| (COMBINE_rr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, |
| (ADD64_rr DoubleRegs:$rhs, (TFRI64 -1))), |
| (EXTRACT_SUBREG DoubleRegs:$tval, subreg_hireg), |
| (EXTRACT_SUBREG DoubleRegs:$fval, subreg_hireg)), |
| (MUX_rr (CMPGT64rr DoubleRegs:$lhs, |
| (ADD64_rr DoubleRegs:$rhs, (TFRI64 -1))), |
| (EXTRACT_SUBREG DoubleRegs:$tval, subreg_loreg), |
| (EXTRACT_SUBREG DoubleRegs:$fval, subreg_loreg)))>; |