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