HexagonSelectCCInfo.td revision 235633
1178825Sdfr//===-- HexagoSelectCCInfo.td - Selectcc mappings ----------*- tablegen -*-===// 2178825Sdfr// 3178825Sdfr// The LLVM Compiler Infrastructure 4178825Sdfr// 5178825Sdfr// This file is distributed under the University of Illinois Open Source 6178825Sdfr// License. See LICENSE.TXT for details. 7178825Sdfr// 8178825Sdfr//===----------------------------------------------------------------------===// 9178825Sdfr 10178825Sdfr 11178825Sdfr// 12178825Sdfr// selectcc mappings. 13178825Sdfr// 14178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 15178825Sdfr IntRegs:$fval, SETEQ)), 16178825Sdfr (i32 (MUX_rr (i1 (CMPEQrr IntRegs:$lhs, IntRegs:$rhs)), 17178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 18178825Sdfr 19178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 20178825Sdfr IntRegs:$fval, SETNE)), 21178825Sdfr (i32 (MUX_rr (i1 (NOT_p (CMPEQrr IntRegs:$lhs, IntRegs:$rhs))), 22178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 23178825Sdfr 24178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 25178825Sdfr IntRegs:$fval, SETGT)), 26178825Sdfr (i32 (MUX_rr (i1 (CMPGTrr IntRegs:$lhs, IntRegs:$rhs)), 27178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 28178825Sdfr 29178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 30178825Sdfr IntRegs:$fval, SETUGT)), 31178825Sdfr (i32 (MUX_rr (i1 (CMPGTUrr IntRegs:$lhs, IntRegs:$rhs)), 32178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 33178825Sdfr 34178825Sdfr 35178825Sdfr 36178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 37178825Sdfr IntRegs:$fval, SETULT)), 38178825Sdfr (i32 (MUX_rr (i1 (NOT_p (CMPGTUrr IntRegs:$lhs, 39178825Sdfr (ADD_ri IntRegs:$rhs, -1)))), 40178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 41178825Sdfr 42178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 43178825Sdfr IntRegs:$fval, SETLT)), 44178825Sdfr (i32 (MUX_rr (i1 (NOT_p (CMPGTrr IntRegs:$lhs, 45178825Sdfr (ADD_ri IntRegs:$rhs, -1)))), 46178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 47178825Sdfr 48178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 49178825Sdfr IntRegs:$fval, SETLE)), 50178825Sdfr (i32 (MUX_rr (i1 (NOT_p (CMPGTrr IntRegs:$lhs, IntRegs:$rhs))), 51178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 52178825Sdfr 53178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 54178825Sdfr IntRegs:$fval, SETULE)), 55178825Sdfr (i32 (MUX_rr (i1 (NOT_p (CMPGTUrr IntRegs:$lhs, IntRegs:$rhs))), 56178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 57178825Sdfr 58178825Sdfr 59178825Sdfr// 60178825Sdfr// selectcc mappings for greater-equal-to Rs => greater-than Rs-1. 61178825Sdfr// 62178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 63178825Sdfr IntRegs:$fval, SETGE)), 64178825Sdfr (i32 (MUX_rr (i1 (CMPGTrr IntRegs:$lhs, (ADD_ri IntRegs:$rhs, -1))), 65178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 66178825Sdfr 67178825Sdfrdef : Pat <(i32 (selectcc IntRegs:$lhs, IntRegs:$rhs, IntRegs:$tval, 68178825Sdfr IntRegs:$fval, SETUGE)), 69178825Sdfr (i32 (MUX_rr (i1 (CMPGTUrr IntRegs:$lhs, (ADD_ri IntRegs:$rhs, -1))), 70178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 71178825Sdfr 72178825Sdfr 73178825Sdfr 74178825Sdfr// 75178825Sdfr// selectcc mappings for predicate comparisons. 76178825Sdfr// 77178825Sdfr// Convert Rd = selectcc(p0, p1, true_val, false_val, SETEQ) into: 78178825Sdfr// pt = not(p1 xor p2) 79178825Sdfr// Rd = mux(pt, true_val, false_val) 80178825Sdfr// and similarly for SETNE 81178825Sdfr// 82178825Sdfrdef : Pat <(i32 (selectcc PredRegs:$lhs, PredRegs:$rhs, IntRegs:$tval, 83178825Sdfr IntRegs:$fval, SETNE)), 84178825Sdfr (i32 (MUX_rr (i1 (XOR_pp PredRegs:$lhs, PredRegs:$rhs)), IntRegs:$tval, 85178825Sdfr IntRegs:$fval))>; 86178825Sdfr 87178825Sdfrdef : Pat <(i32 (selectcc PredRegs:$lhs, PredRegs:$rhs, IntRegs:$tval, 88178825Sdfr IntRegs:$fval, SETEQ)), 89178825Sdfr (i32 (MUX_rr (i1 (NOT_p (XOR_pp PredRegs:$lhs, PredRegs:$rhs))), 90178825Sdfr IntRegs:$tval, IntRegs:$fval))>; 91178825Sdfr 92178825Sdfr 93178825Sdfr// 94178825Sdfr// selectcc mappings for 64-bit operands are messy. Hexagon does not have a 95178825Sdfr// MUX64 o, use this: 96178825Sdfr// selectcc(Rss, Rdd, tval, fval, cond) -> 97178825Sdfr// combine(mux(cmp_cond(Rss, Rdd), tval.hi, fval.hi), 98178825Sdfr// mux(cmp_cond(Rss, Rdd), tval.lo, fval.lo)) 99178825Sdfr 100178825Sdfr// setgt-64. 101178825Sdfrdef : Pat<(i64 (selectcc DoubleRegs:$lhs, DoubleRegs:$rhs, DoubleRegs:$tval, 102178825Sdfr DoubleRegs:$fval, SETGT)), 103178825Sdfr (COMBINE_rr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, DoubleRegs:$rhs), 104178825Sdfr (EXTRACT_SUBREG DoubleRegs:$tval, subreg_hireg), 105178825Sdfr (EXTRACT_SUBREG DoubleRegs:$fval, subreg_hireg)), 106178825Sdfr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, DoubleRegs:$rhs), 107178825Sdfr (EXTRACT_SUBREG DoubleRegs:$tval, subreg_loreg), 108178825Sdfr (EXTRACT_SUBREG DoubleRegs:$fval, subreg_loreg)))>; 109178825Sdfr 110178825Sdfr 111178825Sdfr// setlt-64 -> setgt-64. 112178825Sdfrdef : Pat<(i64 (selectcc DoubleRegs:$lhs, DoubleRegs:$rhs, DoubleRegs:$tval, 113178825Sdfr DoubleRegs:$fval, SETLT)), 114178825Sdfr (COMBINE_rr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, 115178825Sdfr (ADD64_rr DoubleRegs:$rhs, (TFRI64 -1))), 116178825Sdfr (EXTRACT_SUBREG DoubleRegs:$tval, subreg_hireg), 117178825Sdfr (EXTRACT_SUBREG DoubleRegs:$fval, subreg_hireg)), 118178825Sdfr (MUX_rr (CMPGT64rr DoubleRegs:$lhs, 119178825Sdfr (ADD64_rr DoubleRegs:$rhs, (TFRI64 -1))), 120178825Sdfr (EXTRACT_SUBREG DoubleRegs:$tval, subreg_loreg), 121178825Sdfr (EXTRACT_SUBREG DoubleRegs:$fval, subreg_loreg)))>; 122178825Sdfr