SelectionDAGCompat.td revision 360784
1142140Snjl//===- TargetGlobalISel.td - Common code for GlobalISel ----*- tablegen -*-===//
2142140Snjl//
3142140Snjl// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4142140Snjl// See https://llvm.org/LICENSE.txt for license information.
5142140Snjl// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6142140Snjl//
7142140Snjl//===----------------------------------------------------------------------===//
8142140Snjl//
9142140Snjl// This file defines the target-independent interfaces used to support
10142140Snjl// SelectionDAG instruction selection patterns (specified in
11142140Snjl// TargetSelectionDAG.td) when generating GlobalISel instruction selectors.
12142140Snjl//
13142140Snjl// This is intended as a compatibility layer, to enable reuse of target
14142140Snjl// descriptions written for SelectionDAG without requiring explicit GlobalISel
15142140Snjl// support.  It will eventually supersede SelectionDAG patterns.
16142140Snjl//
17142140Snjl//===----------------------------------------------------------------------===//
18142140Snjl
19142140Snjl// Declare that a generic Instruction is 'equivalent' to an SDNode, that is,
20142140Snjl// SelectionDAG patterns involving the SDNode can be transformed to match the
21142140Snjl// Instruction instead.
22142140Snjlclass GINodeEquiv<Instruction i, SDNode node> {
23142140Snjl  Instruction I = i;
24142140Snjl  SDNode Node = node;
25142140Snjl
26142140Snjl  // SelectionDAG has separate nodes for atomic and non-atomic memory operations
27142140Snjl  // (ISD::LOAD, ISD::ATOMIC_LOAD, ISD::STORE, ISD::ATOMIC_STORE) but GlobalISel
28142140Snjl  // stores this information in the MachineMemoryOperand.
29142140Snjl  bit CheckMMOIsNonAtomic = 0;
30142140Snjl  bit CheckMMOIsAtomic = 0;
31142140Snjl
32142140Snjl  // SelectionDAG has one node for all loads and uses predicates to
33142140Snjl  // differentiate them. GlobalISel on the other hand uses separate opcodes.
34142140Snjl  // When this is true, the resulting opcode is G_LOAD/G_SEXTLOAD/G_ZEXTLOAD
35143902Snjl  // depending on the predicates on the node.
36142140Snjl  Instruction IfSignExtend = ?;
37142140Snjl  Instruction IfZeroExtend = ?;
38142140Snjl
39142140Snjl  // SelectionDAG has one setcc for all compares. This differentiates
40142140Snjl  // for G_ICMP and G_FCMP.
41182048Sjhb  Instruction IfFloatingPoint = ?;
42142140Snjl}
43177040Sjhb
44142140Snjl// These are defined in the same order as the G_* instructions.
45144630Snjldef : GINodeEquiv<G_ANYEXT, anyext>;
46144630Snjldef : GINodeEquiv<G_SEXT, sext>;
47144630Snjldef : GINodeEquiv<G_ZEXT, zext>;
48144630Snjldef : GINodeEquiv<G_TRUNC, trunc>;
49142140Snjldef : GINodeEquiv<G_BITCAST, bitconvert>;
50142140Snjl// G_INTTOPTR - SelectionDAG has no equivalent.
51142140Snjl// G_PTRTOINT - SelectionDAG has no equivalent.
52142140Snjldef : GINodeEquiv<G_CONSTANT, imm>;
53142140Snjldef : GINodeEquiv<G_FCONSTANT, fpimm>;
54142140Snjldef : GINodeEquiv<G_IMPLICIT_DEF, undef>;
55142140Snjldef : GINodeEquiv<G_ADD, add>;
56142140Snjldef : GINodeEquiv<G_SUB, sub>;
57142140Snjldef : GINodeEquiv<G_MUL, mul>;
58142140Snjldef : GINodeEquiv<G_UMULH, mulhu>;
59142140Snjldef : GINodeEquiv<G_SMULH, mulhs>;
60142140Snjldef : GINodeEquiv<G_SDIV, sdiv>;
61142140Snjldef : GINodeEquiv<G_UDIV, udiv>;
62143902Snjldef : GINodeEquiv<G_SREM, srem>;
63142140Snjldef : GINodeEquiv<G_UREM, urem>;
64142140Snjldef : GINodeEquiv<G_AND, and>;
65142140Snjldef : GINodeEquiv<G_OR, or>;
66142140Snjldef : GINodeEquiv<G_XOR, xor>;
67142140Snjldef : GINodeEquiv<G_SHL, shl>;
68142140Snjldef : GINodeEquiv<G_LSHR, srl>;
69143902Snjldef : GINodeEquiv<G_ASHR, sra>;
70142140Snjldef : GINodeEquiv<G_SELECT, select>;
71142140Snjldef : GINodeEquiv<G_FNEG, fneg>;
72142140Snjldef : GINodeEquiv<G_FPEXT, fpextend>;
73143902Snjldef : GINodeEquiv<G_FPTRUNC, fpround>;
74143902Snjldef : GINodeEquiv<G_FPTOSI, fp_to_sint>;
75182048Sjhbdef : GINodeEquiv<G_FPTOUI, fp_to_uint>;
76143902Snjldef : GINodeEquiv<G_SITOFP, sint_to_fp>;
77142140Snjldef : GINodeEquiv<G_UITOFP, uint_to_fp>;
78142140Snjldef : GINodeEquiv<G_FADD, fadd>;
79142140Snjldef : GINodeEquiv<G_FSUB, fsub>;
80142140Snjldef : GINodeEquiv<G_FMA, fma>;
81142140Snjldef : GINodeEquiv<G_FMAD, fmad>;
82142140Snjldef : GINodeEquiv<G_FMUL, fmul>;
83142140Snjldef : GINodeEquiv<G_FDIV, fdiv>;
84142140Snjldef : GINodeEquiv<G_FREM, frem>;
85142140Snjldef : GINodeEquiv<G_FPOW, fpow>;
86158446Snjldef : GINodeEquiv<G_FEXP2, fexp2>;
87158446Snjldef : GINodeEquiv<G_FLOG2, flog2>;
88142140Snjldef : GINodeEquiv<G_FCANONICALIZE, fcanonicalize>;
89158446Snjldef : GINodeEquiv<G_INTRINSIC, intrinsic_wo_chain>;
90142140Snjl// ISD::INTRINSIC_VOID can also be handled with G_INTRINSIC_W_SIDE_EFFECTS.
91158446Snjldef : GINodeEquiv<G_INTRINSIC_W_SIDE_EFFECTS, intrinsic_void>;
92158446Snjldef : GINodeEquiv<G_INTRINSIC_W_SIDE_EFFECTS, intrinsic_w_chain>;
93158446Snjldef : GINodeEquiv<G_BR, br>;
94142140Snjldef : GINodeEquiv<G_BSWAP, bswap>;
95158446Snjldef : GINodeEquiv<G_BITREVERSE, bitreverse>;
96158446Snjldef : GINodeEquiv<G_CTLZ, ctlz>;
97142140Snjldef : GINodeEquiv<G_CTTZ, cttz>;
98142140Snjldef : GINodeEquiv<G_CTLZ_ZERO_UNDEF, ctlz_zero_undef>;
99142140Snjldef : GINodeEquiv<G_CTTZ_ZERO_UNDEF, cttz_zero_undef>;
100142140Snjldef : GINodeEquiv<G_CTPOP, ctpop>;
101142140Snjldef : GINodeEquiv<G_EXTRACT_VECTOR_ELT, vector_extract>;
102142140Snjldef : GINodeEquiv<G_CONCAT_VECTORS, concat_vectors>;
103142140Snjldef : GINodeEquiv<G_BUILD_VECTOR, build_vector>;
104142140Snjldef : GINodeEquiv<G_FCEIL, fceil>;
105142140Snjldef : GINodeEquiv<G_FCOS, fcos>;
106177296Sphkdef : GINodeEquiv<G_FSIN, fsin>;
107142140Snjldef : GINodeEquiv<G_FABS, fabs>;
108142140Snjldef : GINodeEquiv<G_FSQRT, fsqrt>;
109142140Snjldef : GINodeEquiv<G_FFLOOR, ffloor>;
110142140Snjldef : GINodeEquiv<G_FRINT, frint>;
111142140Snjldef : GINodeEquiv<G_FNEARBYINT, fnearbyint>;
112143902Snjldef : GINodeEquiv<G_INTRINSIC_TRUNC, ftrunc>;
113143902Snjldef : GINodeEquiv<G_INTRINSIC_ROUND, fround>;
114142140Snjldef : GINodeEquiv<G_FCOPYSIGN, fcopysign>;
115142140Snjldef : GINodeEquiv<G_SMIN, smin>;
116143902Snjldef : GINodeEquiv<G_SMAX, smax>;
117142140Snjldef : GINodeEquiv<G_UMIN, umin>;
118143902Snjldef : GINodeEquiv<G_UMAX, umax>;
119142140Snjldef : GINodeEquiv<G_FMINNUM, fminnum>;
120142140Snjldef : GINodeEquiv<G_FMAXNUM, fmaxnum>;
121142140Snjldef : GINodeEquiv<G_FMINNUM_IEEE, fminnum_ieee>;
122142140Snjldef : GINodeEquiv<G_FMAXNUM_IEEE, fmaxnum_ieee>;
123142140Snjldef : GINodeEquiv<G_READCYCLECOUNTER, readcyclecounter>;
124142140Snjl
125142140Snjl// Broadly speaking G_LOAD is equivalent to ISD::LOAD but there are some
126142140Snjl// complications that tablegen must take care of. For example, Predicates such
127142140Snjl// as isSignExtLoad require that this is not a perfect 1:1 mapping since a
128143902Snjl// sign-extending load is (G_SEXTLOAD x) in GlobalISel. Additionally,
129142140Snjl// G_LOAD handles both atomic and non-atomic loads where as SelectionDAG had
130142140Snjl// separate nodes for them. This GINodeEquiv maps the non-atomic loads to
131142140Snjl// G_LOAD with a non-atomic MachineMemOperand.
132142140Snjldef : GINodeEquiv<G_LOAD, ld> {
133142140Snjl  let CheckMMOIsNonAtomic = 1;
134142140Snjl  let IfSignExtend = G_SEXTLOAD;
135142140Snjl  let IfZeroExtend = G_ZEXTLOAD;
136142140Snjl}
137142140Snjl
138143902Snjldef : GINodeEquiv<G_ICMP, setcc> {
139142140Snjl  let IfFloatingPoint = G_FCMP;
140142140Snjl}
141142140Snjl
142142140Snjl// Broadly speaking G_STORE is equivalent to ISD::STORE but there are some
143142140Snjl// complications that tablegen must take care of. For example, predicates such
144142140Snjl// as isTruncStore require that this is not a perfect 1:1 mapping since a
145142140Snjl// truncating store is (G_STORE (G_TRUNCATE x)) in GlobalISel. Additionally,
146142140Snjl// G_STORE handles both atomic and non-atomic stores where as SelectionDAG had
147142140Snjl// separate nodes for them. This GINodeEquiv maps the non-atomic stores to
148143902Snjl// G_STORE with a non-atomic MachineMemOperand.
149142140Snjldef : GINodeEquiv<G_STORE, st> { let CheckMMOIsNonAtomic = 1; }
150142140Snjl
151142140Snjldef : GINodeEquiv<G_LOAD, atomic_load> {
152142140Snjl  let CheckMMOIsNonAtomic = 0;
153142140Snjl  let CheckMMOIsAtomic = 1;
154142140Snjl}
155142140Snjl
156142140Snjldef : GINodeEquiv<G_ATOMIC_CMPXCHG, atomic_cmp_swap>;
157143902Snjldef : GINodeEquiv<G_ATOMICRMW_XCHG, atomic_swap>;
158142140Snjldef : GINodeEquiv<G_ATOMICRMW_ADD, atomic_load_add>;
159142140Snjldef : GINodeEquiv<G_ATOMICRMW_SUB, atomic_load_sub>;
160142140Snjldef : GINodeEquiv<G_ATOMICRMW_AND, atomic_load_and>;
161142140Snjldef : GINodeEquiv<G_ATOMICRMW_NAND, atomic_load_nand>;
162142140Snjldef : GINodeEquiv<G_ATOMICRMW_OR, atomic_load_or>;
163142140Snjldef : GINodeEquiv<G_ATOMICRMW_XOR, atomic_load_xor>;
164142140Snjldef : GINodeEquiv<G_ATOMICRMW_MIN, atomic_load_min>;
165142140Snjldef : GINodeEquiv<G_ATOMICRMW_MAX, atomic_load_max>;
166143902Snjldef : GINodeEquiv<G_ATOMICRMW_UMIN, atomic_load_umin>;
167142140Snjldef : GINodeEquiv<G_ATOMICRMW_UMAX, atomic_load_umax>;
168142140Snjldef : GINodeEquiv<G_ATOMICRMW_FADD, atomic_load_fadd>;
169142140Snjldef : GINodeEquiv<G_ATOMICRMW_FSUB, atomic_load_fsub>;
170142140Snjldef : GINodeEquiv<G_FENCE, atomic_fence>;
171142140Snjl
172142140Snjl// Specifies the GlobalISel equivalents for SelectionDAG's ComplexPattern.
173142140Snjl// Should be used on defs that subclass GIComplexOperandMatcher<>.
174142140Snjlclass GIComplexPatternEquiv<ComplexPattern seldag> {
175142140Snjl  ComplexPattern SelDAGEquivalent = seldag;
176142140Snjl}
177143902Snjl
178142140Snjl// Specifies the GlobalISel equivalents for SelectionDAG's SDNodeXForm.
179142140Snjl// Should be used on defs that subclass GICustomOperandRenderer<>.
180142140Snjlclass GISDNodeXFormEquiv<SDNodeXForm seldag> {
181142140Snjl  SDNodeXForm SelDAGEquivalent = seldag;
182142140Snjl}
183142140Snjl