//===-- 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)))>;