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