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