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